---------------------------------------------------------------- -- Mastrovito Multiplication for pentanomials -- (mastrovito_multiplication_pentanomials.adb) -- -- X*Y mod F; where F=x^m + x^k3 + x^k2 + x^k1 + 1 -- This implementation is for k1 = k3-k2 and k3 =< m/2 -- -- parameters and functions defined in GF2m.ads -- ---------------------------------------------------------------- with Gnat.Io; use Gnat.Io; with GF2m; use GF2m; with finite_fields_GF2m; use finite_fields_GF2m; procedure mastrovito_multiplication_v2_pentanomials is a,b,c: poly_vector; d: poly_vector; e: poly_vector2; h,e0,e1,e01: poly_vector; -- x: Bit; k1,k2,k3: integer; begin for j in 0 .. m-1 loop c(j) := 0; h(j) := 0; e0(j) := 0; e1(j) := 0; e01(j) := 0; a(j) := 0; b(j) := 0; end loop; -- for i in 0 .. m-1 loop -- Put("A(");Put(i);Put(") = "); Get(x); a(i) := x; -- end loop; New_Line; -- -- for i in 0 .. m-1 loop -- Put("B(");Put(i);Put(") = "); Get(x); b(i) := x; -- end loop; New_Line; -- Put("k1 = "); Get(k1); -- Put("k2 = "); Get(k2); -- Put("k3 = "); Get(k3); A:=(1,0,1,0,1,0,1,0); B:=(1,0,1,0,1,0,1,0); k3 := 4; k2 := 3; k1 := 1; d := vector_D(a,b); e := vector_E(a,b); for j in 0 .. k2-2 loop h(j) := m2xor(e(j+m-k3),e(j+m-k2)); end loop; for j in 0 .. k1-2 loop e0(j) := m2xor(e(j),m2xor(h(j),e(j+m-k1))); end loop; for j in k1-1 .. k2-2 loop e0(j) := m2xor(e(j),h(j)); end loop; for j in k2-1 .. k3-2 loop e0(j) := m2xor(e(j),e(j+m-k3)); end loop; for j in k3-1 .. m-2 loop e0(j) := e(j); end loop; e0(m-1) := 0; for j in 0 .. k1-1 loop e1(j) := 0; end loop; for j in k1 .. m-1 loop e1(j) := e0(j-k1); end loop; for j in 0 .. k1-1 loop e01(j) := e0(j); end loop; for j in k1 .. m-k2-1 loop e01(j) := m2xor(e0(j),e1(j)); end loop; for j in m-k2 .. m-2 loop e01(j) := h(j+k2-m); end loop; e01(m-1) := e1(m-1); for j in 0 .. m-1 loop if j < k2 then c(j) := m2xor(d(j),e01(j)); else c(j) := m2xor(d(j),m2xor(e01(j),e01(j-k2))); end if; end loop; ----------------------------------------------------- -- Put("C = "); -- for i in 0 .. m-1 loop -- if c(i) = 1 then put(i);put("-"); end if; -- end loop; New_Line; Put("C = "); for i in 0 .. m-1 loop Put(c(i)); end loop; New_Line; end mastrovito_multiplication_v2_pentanomials;