Long multiplication: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Icon}} and {{header|Unicon}}: Regularize non-standard header markup) |
(Added Quackery.) |
||
Line 4,758: | Line 4,758: | ||
longmult(2 ** 64, 2 ** 64) |
longmult(2 ** 64, 2 ** 64) |
||
)</lang> |
)</lang> |
||
=={{header|Quackery}}== |
|||
Long multiplication as it was taught at primary school, using natural numbers (including zero) in the base 10 numeral system, with a slight variation in that it maintains a running total rather than adding up the intermediate results column-wise at the end. Starting point is "learn your tables". Presumptions are an understanding of "equal to" and "not equal to", and the ability to split a one or two digit number into tens and units. |
|||
(This is achieved using <code>/mod</code> to keep the tables compact. Numbers in the addition and multiplication tables could be represented as, for example, <code>[ 8 1 ]</code> instead of <code>81</code> and <code>10 /mod</code> replaced with <code>unpack</code> or, as the nest only contains numbers, <code>do</code>.) |
|||
In addition to the specified task, we were always encouraged to show our workings. |
|||
<lang Quackery> [ [] swap witheach |
|||
[ char 0 - |
|||
swap join ] ] is $->long ( $ --> L ) |
|||
[ number$ $->long ] is long ( n --> L ) |
|||
[ reverse behead |
|||
swap witheach |
|||
[ swap 10 * + ] ] is long->num ( L --> n ) |
|||
[ reverse |
|||
witheach echo ] is echolong ( L --> ) |
|||
[ over size |
|||
over size - |
|||
dup dip |
|||
[ 0 < if swap ] |
|||
abs times |
|||
[ 0 join ] ] is zeropad ( L L --> L L ) |
|||
[ [ table |
|||
[ 0 1 2 3 4 5 6 7 8 9 ] |
|||
[ 1 2 3 4 5 6 7 8 9 10 ] |
|||
[ 2 3 4 5 6 7 8 9 10 11 ] |
|||
[ 3 4 5 6 7 8 9 10 11 12 ] |
|||
[ 4 5 6 7 8 9 10 11 12 13 ] |
|||
[ 5 6 7 8 9 10 11 12 13 14 ] |
|||
[ 6 7 8 9 10 11 12 13 14 15 ] |
|||
[ 7 8 9 10 11 12 13 14 15 16 ] |
|||
[ 8 9 10 11 12 13 14 15 16 17 ] |
|||
[ 9 10 11 12 13 14 15 16 17 18 ] ] |
|||
swap peek 10 /mod ] is add ( n n --> n n ) |
|||
[ dip add add dip [ add nip ] swap ] is addc ( n n c --> n c ) |
|||
[ zeropad |
|||
0 temp put |
|||
[] unrot witheach |
|||
[ dip behead |
|||
temp take |
|||
addc |
|||
temp put |
|||
rot swap join swap ] |
|||
drop |
|||
temp take dup 0 != |
|||
iff join else drop ] is longadd ( L L --> L ) |
|||
[ [ table |
|||
[ 0 0 0 0 0 0 0 0 0 0 ] |
|||
[ 0 1 2 3 4 5 6 7 8 9 ] |
|||
[ 0 2 4 6 8 10 12 14 16 18 ] |
|||
[ 0 3 6 9 12 15 18 21 24 27 ] |
|||
[ 0 4 8 12 16 20 24 28 32 36 ] |
|||
[ 0 5 10 15 20 25 30 35 40 45 ] |
|||
[ 0 6 12 18 24 30 36 42 48 54 ] |
|||
[ 0 7 14 21 28 35 42 49 56 63 ] |
|||
[ 0 8 16 24 32 40 48 56 64 72 ] |
|||
[ 0 9 18 27 36 45 54 63 72 81 ] ] |
|||
swap peek 10 /mod ] is mult ( n n --> n n ) |
|||
[ dip mult add dip [ add nip ] swap ] is multc ( n n c --> n c ) |
|||
[ dup 0 = iff |
|||
[ 2drop 0 long ] done |
|||
0 temp put |
|||
[] unrot swap witheach |
|||
[ over temp take |
|||
multc |
|||
temp put |
|||
swap dip join ] |
|||
drop |
|||
temp take dup 0 != |
|||
iff join else drop ] is shortmult ( L n --> L ) |
|||
[ ' [ 0 ] over != iff |
|||
[ 0 swap join ] ] is timesten ( L --> L ) |
|||
[ dup 0 long = iff |
|||
[ 2drop 0 long ] done |
|||
0 long unrot |
|||
witheach |
|||
[ dip dup shortmult |
|||
rot longadd swap |
|||
timesten ] |
|||
drop ] is longmult ( L L --> L ) |
|||
( ------------------------ additional to task ------------------------ ) |
|||
[ stack ] is linelength ( --> s ) |
|||
[ linelength share times |
|||
[ char - emit ] |
|||
cr ] is separator ( --> ) |
|||
[ linelength share |
|||
over size - times sp |
|||
echolong cr ] is showlong ( --> ) |
|||
[ over size |
|||
over size + linelength put |
|||
over showlong |
|||
dup showlong |
|||
separator |
|||
dup 0 long = iff |
|||
[ 2drop 0 long ] done |
|||
0 long unrot |
|||
witheach |
|||
[ dip dup shortmult |
|||
dup showlong |
|||
rot longadd swap |
|||
timesten ] |
|||
separator |
|||
swap showlong |
|||
separator |
|||
drop linelength release ] is workings ( L L --> ) |
|||
say "Using long multiplication: " |
|||
2 64 ** long dup longmult dup echolong cr |
|||
say "Using built-in arithmetic: " |
|||
2 128 ** dup echo cr cr |
|||
swap long->num = iff |
|||
say "10/10, Gold star!" |
|||
else |
|||
say "0/10, See me after class." |
|||
cr cr |
|||
say "(Show your workings.)" cr cr |
|||
2 64 ** long dup workings cr</lang> |
|||
{{out}} |
|||
<pre>Using long multiplication: 340282366920938463463374607431768211456 |
|||
Using built-in arithmetic: 340282366920938463463374607431768211456 |
|||
10/10, Gold star! |
|||
(Show your workings.) |
|||
18446744073709551616 |
|||
18446744073709551616 |
|||
---------------------------------------- |
|||
110680464442257309696 |
|||
184467440737095516160 |
|||
11068046444225730969600 |
|||
18446744073709551616000 |
|||
922337203685477580800000 |
|||
9223372036854775808000000 |
|||
166020696663385964544000000 |
|||
0 |
|||
12912720851596686131200000000 |
|||
55340232221128654848000000000 |
|||
1291272085159668613120000000000 |
|||
0 |
|||
73786976294838206464000000000000 |
|||
737869762948382064640000000000000 |
|||
12912720851596686131200000000000000 |
|||
110680464442257309696000000000000000 |
|||
737869762948382064640000000000000000 |
|||
7378697629483820646400000000000000000 |
|||
147573952589676412928000000000000000000 |
|||
184467440737095516160000000000000000000 |
|||
---------------------------------------- |
|||
340282366920938463463374607431768211456 |
|||
----------------------------------------</pre> |
|||
=={{header|R}}== |
=={{header|R}}== |