IMPLEMENTATION MODULE gmult; FROM SUPINT IMPORT SuperInteger, Create, Delete, NumDigits; FROM SUPARITH IMPORT Add, Subtract, Multiply, ShiftRight, ShiftLeft, CutLeft; CONST T = 8; (* Les grands entiers crees occupent initialement 256 mots. *) n0 = 32; (* Seuil d'arret de la recursivite. *) PROCEDURE Mult (U, V, C : SuperInteger); VAR s : INTEGER; W, X, Y, Z, P, Q, R : SuperInteger; BEGIN IF NumDigits (U) > NumDigits (V) THEN s := NumDigits (U) DIV 2 ELSE s := NumDigits (V) DIV 2 END; IF s <= n0 THEN Multiply (U, V, C) ELSE Create (W, T); Create (X, T); Create (Y, T); Create (Z, T); Create (P, T); Create (Q, T); Create (R, T); ShiftRight (U, s, W); ShiftRight (V, s, Y); Mult (W, Y, P); CutLeft (U, s, X); CutLeft (V, s, Z); Mult (X, Z, Q); Add (W, X, X); Add (Y, Z, Z); Delete (W); Delete (Y); Mult (X, Z, R); Subtract (R, P, R); Subtract (R, Q, R); ShiftLeft (P, s + s, P); ShiftLeft (R, s, R); Add (P, R, C); Add (C, Q, C); Delete (X); Delete (Z); Delete (P); Delete (Q); Delete (R) END END Mult; END gmult.