```⍝ Balanced Ternary Arithmetic:

cmp←{                           ⍝ operand function comparison.
rarg←⊤bt ⍵                  ⍝ BT argument.
rslt←⍵⍵ bt rarg             ⍝ BT result.
(3⊥rslt)≡⍺⍺ ⍵               ⍝ comparison with integer result.
}
∧/⍺⍺ cmp ⍵⍵¨⍵                   ⍝ outer-product comparison.
}

+cmps+ ¯9 to 9                      ⍝ identity
1
-cmps- ¯9 to 9                      ⍝ negative
1
×cmps× ¯9 to 9                      ⍝ signum
1
|cmps| ¯9 to 9                      ⍝ absolute value
1
⊤bt +/3* 0 to 9                     ⍝ int to BT encode
1 1 1 1 1 1 1 1 1 1

⊤bt 1++/3* 0 to 9                   ⍝ int to BT encode
1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

⊥bt¨,\10↑1                          ⍝ BT to int decodes
1 3 9 27 81 243 729 2187 6561 19683

cmp←{                           ⍝ operand function comparison.
larg rarg←⊤bt¨⍺ ⍵           ⍝ BT arguments.
rslt←larg ⍵⍵ bt rarg        ⍝ BT result.
(3⊥rslt)≡⍺ ⍺⍺ ⍵             ⍝ comparison with integer result.
}
∧/,⍺∘.(⍺⍺ cmp ⍵⍵)⍵              ⍝ outer-product comparison.
}

(¯9 to 9) +cmps+ ¯9 to 9            ⍝ + sum
1
(¯9 to 9) -cmps- ¯9 to 9            ⍝ - difference
1
(¯9 to 9) ×cmps× ¯9 to 9            ⍝ × product
1
(¯9 to 9) (⌊÷)cmps÷(¯9 to 9)~0      ⍝ ÷ integer-quotient
1
(¯9 to 9) |cmps| ¯9 to 9            ⍝ | residue
1
(¯9 to 9) *cmps* 0 to 9             ⍝ * power
1
(¯9 to 9) ∨cmps∨ ¯9 to 9            ⍝ ∨ gcd
1
(¯9 to 9) ∧cmps∧ ¯9 to 9            ⍝ ∧ lcm
1
(¯9 to 9) ⌊cmps⌊ ¯9 to 9            ⍝ ⌊ min
1
(¯9 to 9) ⌈cmps⌈ ¯9 to 9            ⍝ ⌈ max
1
rel←{⍺ (⍎⍵)cmps(⍎⍵) ⍺}              ⍝ relational function ⍵

∧/(¯9 to 9)∘rel¨'<≤=≥>≠'            ⍝ test relational functions.
1

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ errors

1÷bt 0                              ⍝ div-by-zero.
11::Divide by zero

1*bt ¯1                             ⍝ negative power.
11::Negative power

⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ LeRoy Eide's method.

fast_div←{                      ⍝ Fast division by ⍵⍵ - LeRoy Eide.

scan←{(enc-⍺-+/2↑⍵),1↓⍵}    ⍝ pair-wise deduction of digits.
nlz←{(-1⌈+/∨\0≠⍵)↑⍵}        ⍝ without superfluous leading zeros.
enc←⍺⍺                      ⍝ 2-digit encode.

rslt←1↓↑scan/0,⍵,0          ⍝ remainder, quotient.
rem←⍵⍵|⍵⍵-1↑rslt            ⍝ remainder.
rem=0:(nlz rslt)rem         ⍝ exact divide: quotient and 0-remainder.

norm←{(⍺ 0+enc ⍬⍴⍵),1↓⍵}    ⍝ pair-wise overflow resolution.
rslt←1↓↑norm/0,rem+rslt     ⍝ vector-sum of rem with each digit.
(nlz rslt)rem               ⍝ integer quotient and remainder.
}

enc_dec ← 0 10∘⊤                ⍝ 2-digit decimal encode.
dec_div_9 ← enc_dec fast_div 9  ⍝ decimal divide-by-9.
⍝
dec_div_9 1 2 3 4 5             ⍝ decimal 12345÷9 → 1371r6
┌───────┬─┐
│1 3 7 1│6│
└───────┴─┘

enc_bt ← ¯1+ 0 3⊤ 3⊥ 1+ 0 3⊤ ⊢  ⍝ 2-digit balanced ternary encode.
bt_div_2  ← enc_bt fast_div 2   ⍝ bt divide-by-2.
⍝                    __       _
bt_div_2  1 0 ¯1 ¯1             ⍝ balanced ternary 1011÷2 → 111r1
┌──────┬─┐
│1 1 ¯1│1│
└──────┴─┘

∧/{(⌊⍵÷9)(9|⍵)≡10⊥¨dec_div_9 ⍎¨⍕⍵}¨0 to 100         ⍝ dec_div_by_9s.
1
∧/{(⌊⍵÷2)(2|⍵)≡⊥bt¨bt_div_2 ⊤bt ⍵}¨¯100 to 100      ⍝ bt_div_by_2.
1
ternac ← 1 ¯1∘(∘.=)             ⍝ BT to binary

ternac 1 0 ¯1 1 ¯1
1 0 0 1 0
0 0 1 0 1
canret ← 1 ¯1∘(+.×)             ⍝ binary to BT

canret ↑(1 0 0 1 0)(0 0 1 0 1)
1 0 ¯1 1 ¯1

Back to: code

Back to: Workspaces
```