(24 . 11)(24 . 37)
417
418 pragma Pure;
419
420 -- Comba's multiplier.
421 -- Karatsuba Threshhold - at or below this many words, we use Comba mult.
422 Karatsuba_Thresh : constant Indices := 8;
423
424 -- Multiply. (CAUTION: UNBUFFERED)
425 procedure FZ_Multiply(X : in FZ;
426 Y : in FZ;
427 XY : out FZ);
428 pragma Precondition(X'Length = Y'Length and
429 XY'Length = (X'Length + Y'Length));
430
431 -- Comba's multiplier. (CAUTION: UNBUFFERED)
432 procedure FZ_Mul_Comba(X : in FZ;
433 Y : in FZ;
434 XY_Lo : out FZ;
435 XY_Hi : out FZ);
436 XY : out FZ);
437 pragma Precondition(X'Length = Y'Length and
438 XY'Length = (X'Length + Y'Length));
439
440 -- Karatsuba's Multiplier. (CAUTION: UNBUFFERED)
441 procedure Mul_Karatsuba(X : in FZ;
442 Y : in FZ;
443 XY : out FZ);
444 pragma Precondition(X'Length = Y'Length and
445 XY'Length = (X'Length + Y'Length) and
446 X'Length mod 2 = 0);
447 -- CAUTION: Inlining prohibited for Mul_Karatsuba !
448
449 -- Multiplier. Preserves the inputs.
450 procedure FZ_Mult(X : in FZ;
451 Y : in FZ;
452 XY_Lo : out FZ;
453 XY_Hi : out FZ);
454 pragma Precondition(X'Length = Y'Length and
455 XY_Lo'Length = XY_Hi'Length and
456 XY_Lo'Length = ((X'Length + Y'Length) / 2));