⍝ 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

Back to: code

Back to: Workspaces