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}