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}