--------------------------------------------------------------------------- -- Mod f(x) division. -- Multiplications over GF(p**m) and inversion over Zp, binomial - 2nd version --------------------------------------------------------------------------- with Gnat.Io; use Gnat.Io; with Galois; use Galois; procedure Algorithm14 is F, G, H, E, A, C, D, Z, Y: Polynomial; B: Natural_Mod_P; L: Natural; begin for I in 0 .. M loop G(I) := 0; H(I) := 0; F(I) := 0; end loop; F(0) := 237; F(17) := 1; G(1) := 1; G(5) := 47; G(9) := 230; G(15) := 117; for I9 in 196 .. 238 loop for I3 in 0 .. 63 loop for I0 in 0 .. 1 loop H(15) := 137; H(11) := 17; H(9) := I9; H(3) := I3; H(0) := I0; ---------------------------------------------------------------------------- E(0) := 1; for I in 1 .. M loop E(I) := 0; end loop; L := (M-1)/2; for I in 1 .. L loop for J in 0 .. M-1 loop D(J) := (H(J)*Frobenius(J,I)) mod P; end loop; E := Product_Mod_F(E, D, F); end loop; for J in 0 .. M-1 loop D(J) := (E(J)*Frobenius(J,M-1-L)) mod P; end loop; E := Product_Mod_F(E, D, F); A := Product_Mod_F(E, H, F); B := Invert(A(0)); C := Product(E, B); Z := Product_Mod_F(C, G, F); ----------------------------------------------------------------------------- Y := Product_Mod_F(Z, H, F); Put("z = "); for I in 0 .. M loop Put(Z(I)); Put(" "); end loop; New_Line; Put("z.h = "); for I in 0 .. M loop Put(Y(I)); Put(" "); end loop; New_Line; if Y /=(0,1,0,0,0,47,0,0,0,230,0,0,0,0,0,117,0,0) then Put("ERROR"); end if; New_Line; end loop; end loop; end loop; end Algorithm14;