Todd Waugh Ambridge, January 2024 # Ternary signed-digit encodings \begin{code} {-# OPTIONS --without-K --safe #-} open import MLTT.Spartan open import UF.DiscreteAndSeparated open import UF.Equiv open import Fin.Type open import Fin.Bishop open import UF.Sets open import TWA.Thesis.Chapter2.Finite open import TWA.Thesis.Chapter2.Sequences module TWA.Thesis.Chapter5.SignedDigit where \end{code} ## Definition \begin{code} data ๐ : ๐คโ ฬ where โ1 O +1 : ๐ ๐-is-finite : finite-linear-order ๐ ๐-is-finite = 3 , qinveq g (h , ฮท , ฮผ) where g : ๐ โ Fin 3 g โ1 = ๐ g O = ๐ g +1 = ๐ h : Fin 3 โ ๐ h ๐ = โ1 h ๐ = O h ๐ = +1 ฮท : h โ g โผ id ฮท โ1 = refl ฮท O = refl ฮท +1 = refl ฮผ : g โ h โผ id ฮผ ๐ = refl ฮผ ๐ = refl ฮผ ๐ = refl ๐-is-discrete : is-discrete ๐ ๐-is-discrete = finite-is-discrete ๐-is-finite ๐-is-set : is-set ๐ ๐-is-set = finite-is-set ๐-is-finite ๐แดบ : ๐คโ ฬ ๐แดบ = โ โ ๐ \end{code} ## Negation \begin{code} flip : ๐ โ ๐ flip โ1 = +1 flip O = O flip +1 = โ1 neg : ๐แดบ โ ๐แดบ neg = map flip \end{code} ## Binary midpoint \begin{code} data ๐ : ๐คโ ฬ where โ2 โ1 O +1 +2 : ๐ ๐แดบ : ๐คโ ฬ ๐แดบ = โ โ ๐ _+๐_ : ๐ โ ๐ โ ๐ (โ1 +๐ โ1) = โ2 (โ1 +๐ O) = โ1 (โ1 +๐ +1) = O ( O +๐ โ1) = โ1 ( O +๐ O) = O ( O +๐ +1) = +1 (+1 +๐ โ1) = O (+1 +๐ O) = +1 (+1 +๐ +1) = +2 add2 : ๐แดบ โ ๐แดบ โ ๐แดบ add2 = zipWith _+๐_ div2-aux : ๐ โ ๐ โ ๐ ร ๐ div2-aux โ2 b = โ1 , b div2-aux O b = O , b div2-aux +2 b = +1 , b div2-aux โ1 โ2 = โ1 , O div2-aux โ1 โ1 = โ1 , +1 div2-aux โ1 O = O , โ2 div2-aux โ1 +1 = O , โ1 div2-aux โ1 +2 = O , O div2-aux +1 โ2 = O , O div2-aux +1 โ1 = O , +1 div2-aux +1 O = O , +2 div2-aux +1 +1 = +1 , โ1 div2-aux +1 +2 = +1 , O div2 : ๐แดบ โ ๐แดบ div2 ฮฑ 0 = a where a = prโ (div2-aux (ฮฑ 0) (ฮฑ 1)) div2 ฮฑ (succ n) = div2 (b โท x) n where b = prโ (div2-aux (ฮฑ 0) (ฮฑ 1)) x = tail (tail ฮฑ) mid : ๐แดบ โ ๐แดบ โ ๐แดบ mid ฮฑ ฮฒ = div2 (add2 ฮฑ ฮฒ) \end{code} ## Infinitary midpoint \begin{code} data ๐ก : ๐คโ ฬ where โ4 โ3 โ2 โ1 O +1 +2 +3 +4 : ๐ก ๐กแดบ : ๐คโ ฬ ๐กแดบ = โ โ ๐ก _+๐_ : ๐ โ ๐ โ ๐ก (โ2 +๐ โ2) = โ4 (โ2 +๐ โ1) = โ3 (โ2 +๐ O) = โ2 (โ2 +๐ +1) = โ1 (โ2 +๐ +2) = O (โ1 +๐ โ2) = โ3 (โ1 +๐ โ1) = โ2 (โ1 +๐ O) = โ1 (โ1 +๐ +1) = O (โ1 +๐ +2) = +1 ( O +๐ โ2) = โ2 ( O +๐ โ1) = โ1 ( O +๐ O) = O ( O +๐ +1) = +1 ( O +๐ +2) = +2 (+1 +๐ โ2) = โ1 (+1 +๐ โ1) = O (+1 +๐ O) = +1 (+1 +๐ +1) = +2 (+1 +๐ +2) = +3 (+2 +๐ โ2) = O (+2 +๐ โ1) = +1 (+2 +๐ O) = +2 (+2 +๐ +1) = +3 (+2 +๐ +2) = +4 div4-aux : ๐ก โ ๐ก โ ๐ ร ๐ก div4-aux โ4 = โ1 ,_ div4-aux O = O ,_ div4-aux +4 = +1 ,_ div4-aux โ3 โ4 = โ1 , โ2 div4-aux โ3 โ3 = โ1 , โ1 div4-aux โ3 โ2 = โ1 , O div4-aux โ3 โ1 = โ1 , +1 div4-aux โ3 O = โ1 , +2 div4-aux โ3 +1 = โ1 , +3 div4-aux โ3 +2 = O , โ4 div4-aux โ3 +3 = O , โ3 div4-aux โ3 +4 = O , โ2 div4-aux โ2 โ4 = โ1 , O div4-aux โ2 โ3 = โ1 , +1 div4-aux โ2 โ2 = โ1 , +2 div4-aux โ2 โ1 = โ1 , +3 div4-aux โ2 O = O , โ4 div4-aux โ2 +1 = O , โ3 div4-aux โ2 +2 = O , โ2 div4-aux โ2 +3 = O , โ1 div4-aux โ2 +4 = O , O div4-aux โ1 โ4 = โ1 , +2 div4-aux โ1 โ3 = โ1 , +3 div4-aux โ1 โ2 = O , โ4 div4-aux โ1 โ1 = O , โ3 div4-aux โ1 O = O , โ2 div4-aux โ1 +1 = O , โ1 div4-aux โ1 +2 = O , O div4-aux โ1 +3 = O , +1 div4-aux โ1 +4 = O , +2 div4-aux +1 โ4 = O , โ2 div4-aux +1 โ3 = O , โ1 div4-aux +1 โ2 = O , O div4-aux +1 โ1 = O , +1 div4-aux +1 O = O , +2 div4-aux +1 +1 = O , +3 div4-aux +1 +2 = O , +4 div4-aux +1 +3 = +1 , โ3 div4-aux +1 +4 = +1 , โ2 div4-aux +2 โ4 = O , O div4-aux +2 โ3 = O , +1 div4-aux +2 โ2 = O , +2 div4-aux +2 โ1 = O , +3 div4-aux +2 O = O , +4 div4-aux +2 +1 = +1 , โ3 div4-aux +2 +2 = +1 , โ2 div4-aux +2 +3 = +1 , โ1 div4-aux +2 +4 = +1 , O div4-aux +3 โ4 = O , +2 div4-aux +3 โ3 = O , +3 div4-aux +3 โ2 = O , +4 div4-aux +3 โ1 = +1 , โ3 div4-aux +3 O = +1 , โ2 div4-aux +3 +1 = +1 , โ1 div4-aux +3 +2 = +1 , O div4-aux +3 +3 = +1 , +1 div4-aux +3 +4 = +1 , +2 div4 : ๐กแดบ โ ๐แดบ div4 ฮฑ 0 = a where a = prโ (div4-aux (ฮฑ 0) (ฮฑ 1)) div4 ฮฑ (succ n) = div4 (b โท x) n where b = prโ (div4-aux (ฮฑ 0) (ฮฑ 1)) x = tail (tail ฮฑ) bigMid' : (โ โ ๐แดบ) โ ๐กแดบ bigMid' zs 0 = (x 0 +๐ x 0) +๐ (x 1 +๐ y 0) where x = zs 0 y = zs 1 bigMid' zs (succ n) = bigMid' (mid (tail (tail x)) (tail y) โท tail (tail zs)) n where x = zs 0 y = zs 1 bigMid : (โ โ ๐แดบ) โ ๐แดบ bigMid = div4 โ bigMid' \end{code} ## Multiplication \begin{code} _*๐_ : ๐ โ ๐ โ ๐ (โ1 *๐ x) = flip x ( O *๐ x) = O (+1 *๐ x) = x digitMul : ๐ โ ๐แดบ โ ๐แดบ digitMul a = map (a *๐_) mul : ๐แดบ โ ๐แดบ โ ๐แดบ mul x y = bigMid (zipWith digitMul x (repeat y)) \end{code}