---------------------------------------------------------------- -- Normal Bases Itoh Tsujii inversion (NB_Itoh_Tsujii_inv.adb) -- -- -- ---------------------------------------------------------------- with Gnat.Io; use Gnat.Io; with Gf2m; use Gf2m; with Finite_Fields_Gf2m; use Finite_Fields_Gf2m; procedure Nb_Itoh_Tsujii_Inv is A,P,Q,R,T,L: Poly_Vector; H: H_Array; W: W_Array; V,S,Rint: Integer; -- i,kr,kc: integer; begin -------------------------- for I in 1 .. M/2 loop H(I) := 0; end loop; for I in 1 .. M/2 loop for J in 1 .. M-1 loop W(I,J) := 0; end loop; end loop; V := M/2; for I in 1 .. V loop Put("h(");Put(I);Put(") = "); Get(H(I)); end loop; for I in 1 .. V loop for J in 1 .. H(I) loop Put("W(");Put(I);Put(",");Put(J);Put(") = "); Get(W(I,J)); end loop; end loop; New_Line; -------------------------- loop for I in 0 .. M-1 loop Put("A(");Put(I);Put(") = "); Get(A(I)); end loop; New_Line; -- for i in 0 .. m-1 loop -- r(i) := 0; -- end loop; -- i := 0; -- kc := m-1; -- kr := 0; -- while kc /= 1 loop -- kr := kc rem 2; -- kc := kc/2; -- r(i) := kr; -- i := i + 1; -- end loop; -- r(i) := 1; R := Inttovect(M-1); -- Put(m-1);Put(" "); -- for i in 0 .. m-1 loop -- Put("R(");Put(i);Put(") = "); Put(r(i)); -- end loop; New_Line; Rint := Vectoint(R); -- Put("Rint = ");Put(rint); S := Log(M-1) - 1; P := A; for I in reverse 0 .. S loop for I in 1 .. S loop R := Lshift(R); end loop; Q := P; for I in 1 .. Rint/2 loop Q := Nb_Sq(Q); end loop; T := Nb_Multiplier(P,Q,H,W); if R(0) = 1 then T := Nb_Sq(T); P := Nb_Multiplier(T,A,H,W); else P := T; end if; end loop; P := Nb_Sq(P); L := P; ----------------------------------------------------- Put("Inv = "); for I in 0 .. M-1 loop Put(L(I)); end loop; New_Line; New_Line; end loop; end Nb_Itoh_Tsujii_Inv;