⍝ Natural number arithmetic:
999 +nats 1
1000
1000 -nats 1
999
999 ×nats 999
998001
(1234 ×nats 5678) ÷nats 1234
5678
{↑÷nats⍨/(⍵⍴⊂⎕d),⊂⎕d*nats ⍵+1}10
123456789
3×nats '33333333333'
99999999999
↑×nats/⍳100 ⍝ !100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
0+nats 0
0
1-nats 1
0
0×nats 0
0
123 ×nats 0
0
table←{⍵∘.((⍎⍺)nats)⍵}
⍕¨'+×*'table¨⊂0,⍳5
┌───────────────────┬──────────────────────┬──────────────────────────┐
│ 0 1 2 3 4 5 │ 0 0 0 0 0 0 │ 1 0 0 0 0 0 │
│ 1 2 3 4 5 6 │ 0 1 2 3 4 5 │ 1 1 1 1 1 1 │
│ 2 3 4 5 6 7 │ 0 2 4 6 8 10 │ 1 2 4 8 16 32 │
│ 3 4 5 6 7 8 │ 0 3 6 9 12 15 │ 1 3 9 27 81 243 │
│ 4 5 6 7 8 9 │ 0 4 8 12 16 20 │ 1 4 16 64 256 1024 │
│ 5 6 7 8 9 10 │ 0 5 10 15 20 25 │ 1 5 25 125 625 3125 │
└───────────────────┴──────────────────────┴──────────────────────────┘
⍕¨'<≤=≥>≠'table¨⊂0 1 2 ⍝ relational fns.
┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ 0 1 1 │ 1 1 1 │ 1 0 0 │ 1 0 0 │ 0 0 0 │ 0 1 1 │
│ 0 0 1 │ 0 1 1 │ 0 1 0 │ 1 1 0 │ 1 0 0 │ 1 0 1 │
│ 0 0 0 │ 0 0 1 │ 0 0 1 │ 1 1 1 │ 1 1 0 │ 1 1 0 │
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
⍕¨'⌈⌊'table¨⊂0,⍳9
┌──────────────────────────────┬──────────────────────────────┐
│ 0 1 2 3 4 5 6 7 8 9 │ 0 0 0 0 0 0 0 0 0 0 │
│ 1 1 2 3 4 5 6 7 8 9 │ 0 1 1 1 1 1 1 1 1 1 │
│ 2 2 2 3 4 5 6 7 8 9 │ 0 1 2 2 2 2 2 2 2 2 │
│ 3 3 3 3 4 5 6 7 8 9 │ 0 1 2 3 3 3 3 3 3 3 │
│ 4 4 4 4 4 5 6 7 8 9 │ 0 1 2 3 4 4 4 4 4 4 │
│ 5 5 5 5 5 5 6 7 8 9 │ 0 1 2 3 4 5 5 5 5 5 │
│ 6 6 6 6 6 6 6 7 8 9 │ 0 1 2 3 4 5 6 6 6 6 │
│ 7 7 7 7 7 7 7 7 8 9 │ 0 1 2 3 4 5 6 7 7 7 │
│ 8 8 8 8 8 8 8 8 8 9 │ 0 1 2 3 4 5 6 7 8 8 │
│ 9 9 9 9 9 9 9 9 9 9 │ 0 1 2 3 4 5 6 7 8 9 │
└──────────────────────────────┴──────────────────────────────┘
⍕¨'÷|'table¨⊂⍳9
┌───────────────────────────┬───────────────────────────┐
│ 1 0 0 0 0 0 0 0 0 │ 0 0 0 0 0 0 0 0 0 │
│ 2 1 0 0 0 0 0 0 0 │ 1 0 1 0 1 0 1 0 1 │
│ 3 1 1 0 0 0 0 0 0 │ 1 2 0 1 2 0 1 2 0 │
│ 4 2 1 1 0 0 0 0 0 │ 1 2 3 0 1 2 3 0 1 │
│ 5 2 1 1 1 0 0 0 0 │ 1 2 3 4 0 1 2 3 4 │
│ 6 3 2 1 1 1 0 0 0 │ 1 2 3 4 5 0 1 2 3 │
│ 7 3 2 1 1 1 1 0 0 │ 1 2 3 4 5 6 0 1 2 │
│ 8 4 2 2 1 1 1 1 0 │ 1 2 3 4 5 6 7 0 1 │
│ 9 4 3 2 1 1 1 1 1 │ 1 2 3 4 5 6 7 8 0 │
└───────────────────────────┴───────────────────────────┘
⍕¨'∨∧'table¨⊂0,⍳9
┌──────────────────────────────┬──────────────────────────────────────┐
│ 0 1 2 3 4 5 6 7 8 9 │ 0 0 0 0 0 0 0 0 0 0 │
│ 1 1 1 1 1 1 1 1 1 1 │ 0 1 2 3 4 5 6 7 8 9 │
│ 2 1 2 1 2 1 2 1 2 1 │ 0 2 2 6 4 10 6 14 8 18 │
│ 3 1 1 3 1 1 3 1 1 3 │ 0 3 6 3 12 15 6 21 24 9 │
│ 4 1 2 1 4 1 2 1 4 1 │ 0 4 4 12 4 20 12 28 8 36 │
│ 5 1 1 1 1 5 1 1 1 1 │ 0 5 10 15 20 5 30 35 40 45 │
│ 6 1 2 3 2 1 6 1 2 3 │ 0 6 6 6 12 30 6 42 24 18 │
│ 7 1 1 1 1 1 1 7 1 1 │ 0 7 14 21 28 35 42 7 56 63 │
│ 8 1 2 1 4 1 2 1 8 1 │ 0 8 8 24 8 40 24 56 8 72 │
│ 9 1 1 3 1 1 3 1 1 9 │ 0 9 18 9 36 45 18 63 72 9 │
└──────────────────────────────┴──────────────────────────────────────┘
99999999999÷nats 3 ⍝ raw argument too big.
11::Bad number: 1E11
2⍟nats 3 ⍝ unexpected operand function.
11::Can't do: ⍟
2-nats 3 ⍝ subtract larger from smaller.
0
1÷nats 0 ⍝ 1÷0 → error
11::Div by 0
0÷nats 0 ⍝ 0÷0 → 1
1
0÷nats 1 ⍝ 0÷1 → 0
0
↑÷nats/⎕d ⎕d *nats¨ 101 100 ⍝ accuracy test.
123456789
hint←{(⍺↑⍵),'···',(-⍺)↑⍵} ⍝ first and last ⍺ digits. ···
10 hint (↑*nats/5/2)-nats 3 ⍝ Ackermann(4, 2)
2003529930···5719156733
0 1{⍵=0:⊃⍺ ⋄ (1↓⍺,+nats/⍺)∇ ⍵-1}1000 ⍝ 1000th Fibonacci number (JRC).
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
⍝ Handy prefixes for the first few 2*10×⍵:
⍝
prefs ← 'kilo' 'mega' 'giga' 'tera' 'peta' 'exa' 'zetta' 'yotta' '...'
⍕⍉↑prefs{⍺ ⍵}2*nats¨ 10 20 to 200
kilo 1024
mega 1048576
giga 1073741824
tera 1099511627776
peta 1125899906842624
exa 1152921504606846976
zetta 1180591620717411303424
yotta 1208925819614629174706176
... 1237940039285380274899124224
1267650600228229401496703205376
1298074214633706907132624082305024
1329227995784915872903807060280344576
1361129467683753853853498429727072845824
1393796574908163946345982392040522594123776
1427247692705959881058285969449495136382746624
1461501637330902918203684832716283019655932542976
1496577676626844588240573268701473812127674924007424
1532495540865888858358347027150309183618739122183602176
1569275433846670190958947355801916604025588861116008628224
1606938044258990275541962092341162602522202993782792835301376
⍝ regression tests:
0|nats 3 ⍝ James Moore's case.
3
try←{ ⍝ test 999...s squared.
exp←(⍵ 2 ⍵ 2-1)/'9801' ⍝ expected result
act←×nats⍨⍵/'9' ⍝ actual result
act≡exp ⍝ actual matches expected.
}
try 10 ⍝ 9999999999*2 → 99999999980000000001
1
∧/try¨ 100 200 to 1000
1
⍝ try 6e4 ⍝ Roger Hui's case (takes about a minute)
⍝ 1
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
⍝ The following line edits test's copy of nats: ⍝
⍝ s/2*53/2*10/ ⍝ split at 2*10 ⍝
⍝ s/px←6/px←1/ ⍝ use a radix of 10*1 ⍝
⍝ to exercise inner function 'mul's split case. ⍝
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
⎕fx '2*53' '2*10' subs 'px←6' 'px←1' subs ⎕cr'nats'
×nats⍨16/'9' ⍝ check nats with mul-splitting.
99999999999999980000000000000001
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
⍝ Some other interesting squares: ⍝
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
pyramid ← {(⌊¯0.5×+/⍵=' ')⌽⍵} ⍝ rotation of rows to centre number
sq ← ×nats⍨ ⍝ ⍵*2
sqs ← {sq ⍵/⍺} ⍝ ⍺⍺..⍺ * 2
⍝ └─⍵─┘
pyramid ↑'9'sqs¨ 1 to 10 ⍝ 99..9 * 2 (as above)
81
9801
998001
99980001
9999800001
999998000001
99999980000001
9999999800000001
999999998000000001
99999999980000000001
pyramid ↑'3'sqs¨ 1 to 10 ⍝ 33..3 * 2
9
1089
110889
11108889
1111088889
111110888889
11111108888889
1111111088888889
111111110888888889
11111111108888888889
pyramid ↑'6'sqs¨ 1 to 10 ⍝ 66..6 * 2
36
4356
443556
44435556
4444355556
444443555556
44444435555556
4444444355555556
444444443555555556
44444444435555555556
pyramid ↑'1'sqs¨ 1 to 40 ⍝ 11..1 * 2
1
121
12321
1234321
123454321
12345654321
1234567654321
123456787654321
12345678987654321
1234567900987654321
123456790120987654321
12345679012320987654321
1234567901234320987654321
123456790123454320987654321
12345679012345654320987654321
1234567901234567654320987654321
123456790123456787654320987654321
12345679012345678987654320987654321
1234567901234567900987654320987654321
123456790123456790120987654320987654321
12345679012345679012320987654320987654321
1234567901234567901234320987654320987654321
123456790123456790123454320987654320987654321
12345679012345679012345654320987654320987654321
1234567901234567901234567654320987654320987654321
123456790123456790123456787654320987654320987654321
12345679012345679012345678987654320987654320987654321
1234567901234567901234567900987654320987654320987654321
123456790123456790123456790120987654320987654320987654321
12345679012345679012345679012320987654320987654320987654321
1234567901234567901234567901234320987654320987654320987654321
123456790123456790123456790123454320987654320987654320987654321
12345679012345679012345679012345654320987654320987654320987654321
1234567901234567901234567901234567654320987654320987654320987654321
123456790123456790123456790123456787654320987654320987654320987654321
12345679012345679012345679012345678987654320987654320987654320987654321
1234567901234567901234567901234567900987654320987654320987654320987654321
123456790123456790123456790123456790120987654320987654320987654320987654321
12345679012345679012345679012345679012320987654320987654320987654320987654321
1234567901234567901234567901234567901234320987654320987654320987654320987654321
⍝ test Gianluigi's input formatting function:
pfmt←{⎕IO ⎕PP←0 16 ⍝ plain format of a numeric scalar.
rep←⍕⍵
⍵≡rep:⍵
~'E'∊rep:rep
exp←⍎(1+rep⍳'E')↓rep
0>exp:'_ '~⍨(⎕PP-exp)⍕⍵
sig←'¯'=⊃rep
man←⎕PP↑'.'~⍨(sig↓(rep⍳'E')↑rep),⎕PP⍴'0' ⍝ mantissa
(sig⍴'¯'),(1+exp)↑man,exp⍴'0'
}
456+nats pfmt 123E20
12300000000000000000456
⍝∇ nats to subs
Back to: code
Back to: Workspaces