23 lines
853 B
Text
23 lines
853 B
Text
################################################################
|
|
# Finally Define the required INTEGER multiplication OPerator. #
|
|
################################################################
|
|
OP * = (INTEGER a, b)INTEGER:(
|
|
|
|
# initialise out to all zeros #
|
|
[UPB a + UPB b]INT ab; FOR place ab TO UPB ab DO ab[place ab]:=0 OD;
|
|
|
|
FOR place a FROM UPB a BY next digit TO LWB a DO
|
|
DIGIT carry := 0;
|
|
|
|
# calculate each digit (whilst removing the carry) #
|
|
FOR place b FROM UPB b BY next digit TO LWB b DO
|
|
# n.b. result may be 2 digits #
|
|
INT result := ab[place a + place b] + a[place a]*b[place b] + carry;
|
|
carry := result % digit base; # avoid MOD as it doesn't under handle -ve numbers #
|
|
ab[place a + place b] := result - carry * digit base
|
|
OD;
|
|
ab[place a + LWB b + next digit] +:= carry
|
|
|
|
OD;
|
|
NORMALISE ab
|
|
);
|