⍝ Balanced Ternary Arithmetic: ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ monadic cmps←{ ⍝ monadic comparisons. 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 ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ dyadic cmps←{ ⍝ dyadic comparisons. 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 ⍝∇ bt to Back to: code Back to: Workspaces