⍝ S i g n e d B i n a r y A r i t h m e t i c ← .() ⍝ binary digit binding, eg: 5 → 1.0.1 -() ⍝ neg (unary minus) → ∧() ⍝ pow ← *() /() %() ⍝ mul div mod (rem) ← +() -() ⍝ add sub ⍝ Pattern matching variables: i j :: 0 1 p q :: r s t :: ⍝ trim 0.j = j ⍝ carry 1 + 1 = 1.0 -1 + -1 = -1.0 p.( 1.j) = (p+1).j p.(-1.j) = (p-1).j p.(-j) = (p-1).j (-p).j = -p.j ⍝ neg --q = q ⍝ add p + 0 = p 0 + q = q p.i + j = p.(i+j) i + q.j = q.(i+j) p.i + q.j = (p+q).(i+j) -p + q = q-p p + -q = p-q -p + -q = -(p+q) ⍝ mul p * 0 = 0 p * 1 = p p * q.j = (p*q).0 + p*j -p * q = -(p*q) p * -q = -(p*q) -p * -q = p*q ⍝ pow p ∧ 0 = 1 p ∧ 1 = p p ∧ q.j = p∧q * p∧q * p∧j ⍝ sub p - 0 = p p - p = 0 0 - q = -q p.i - j = p .(i-j) i - q.j = -q .(j-i) p.i - q.j = (p-q).(i-j) -p - q = -(p+q) ⍝ div -p / -q = (div A1; p; q; p; q) -p / q = -(div A1; p; q; p; q) p / -q = -(div A1; p; q; p; q) p / q = (div A1; p; q; p; q) div q; r = q ⍝ extract quotient ⍝ mod -p % -q = -(mod A1; p; q; p; q) -p % q = -(mod A1; p; q; p; q) p % -q = (mod A1; p; q; p; q) p % q = (mod A1; p; q; p; q) mod q; r = r ⍝ extract remainder ⍝ "long division" algorithm. See →notes.Long_division← A1; p; q; r.i; s.j = A1; p; q; r; s ⍝ A: left align divisor A1; p; q; r ; j = A2; p; q; |; r ⍝ reset shift mechanism A1; p; q; i; s = A2; p; q; |; i A2; p; q; s; r.i = A2; p; q.0; s.<; r ⍝ shift divisor & count A2; p; q; s; i = B1; p; q; s; 0 ⍝ s-shifted divisor q B1; p; q; s; r = B2; p; q; s; r; p-q ⍝ subtract B2; p; q.j; s.<; r; -t = B1; p; q; s; r.0 ⍝ shift right & repeat B2; p; q.j; s.<; r; t = B1; t; q; s; r.1 B2; p; q; |; r; -t = r.0; p ⍝ finished B2; p; q; |; r; t = r.1; t ⍝ (low precedence) auxiliary functions ← ;() ⍝ division state item separator div() mod() ⍝ division result separation ← =() ≡() ⍝ reduction equivalence/trace ⍝ Test cases: ⍝ ⍝ 1.1+1.1 -> 1.1.0 ⍝ 3 + 3 → 6 ⍝ -1.1-1.1 -> -1.1.0 ⍝ 1.1+-1.1.1 -> -1.0.0 ⍝ 0-1-1-1-1 -> -1.0.0 ⍝ -1.1*-1.1 -> 1.0.0.1 ⍝ -1.1∧ 1.1 -> -1.1.0.1.1 ⍝ ¯3 * 3 → ¯27 ⍝ 1.1∧-1 -> 1.1∧-1 ⍝ no fractions ⍝ 1.1.1/1.1 -> 1.0 ⍝ 1.1.1/-1.1 -> -1.0 ⍝ -1.1.1/1.1 -> -1.0 ⍝ -1.1.1/-1.1 -> 1.0 ⍝ 1.1.1%1.1 -> 1 ⍝ 7 |⍨ 3 → 1 ⍝ 1.1.1%-1.1 -> 1 ⍝ -1.1.1%1.1 -> -1 ⍝ -1.1.1%-1.1 -> -1 ⍝ 1.1.1.1.1.0.1.0.0.0/1 -> 1.1.1.1.1.0.1.0.0.0 ⍝ 1.1.1.1.1.1.1.1.1.1/1.1.1.1.1 -> 1.0.0.0.0.1 ⍝ ⍝ Back to: Contents