---------------------------------------------------------------- -- Frobenius Point Multiplication -- (frobenius_point_multiplication3.adb) -- -- -- ---------------------------------------------------------------- with Gnat.Io; use Gnat.Io; with Galois; use Galois; procedure Frobenius_Point_Multiplication3 is Xp, Yp, Xr, Yr, F, Xq, Yq, New_Xq, New_Yq: Polynomial; K, A, B, Mu, A_Div_2: Integer; Q_Infinity: Boolean; X_Xp, X_Yp, X_Xr, X_Yr: Hex_Polynomial; function Div_2(X: Integer) return Integer is Y: Integer; begin if X < 0 and (X mod 2) = 1 then Y := X/2 - 1; else Y := X/2; end if; return Y; end Div_2; begin for I in 0 .. M loop F(I) := 0; end loop; F(0) := 1; F(3) := 1; F(6) := 1; F(7) := 1; F(163) := 1; Mu := 1; X_Xp := Hex_Xp; X_Yp := Hex_Yp; K := 100; Xp := Hex_To_Bin(X_Xp); Yp := Hex_To_Bin(X_Yp); ------------------------------------------- Q_Infinity := True; A := K; B := 0; while ((A /= 0) or (B /= 0)) loop --a_div_2 := a/2; --if a < 0 and (a mod 2) = 1 then a_div_2 := a/2 - 1; else a_div_2 := a/2; end if; A_Div_2 := Div_2(A); if A mod 2 = 0 then A := B + A_Div_2; B := -A_Div_2; elsif (A/2) mod 2 = B mod 2 then if Q_Infinity then Xq := Xp; Yq := Yp; Q_Infinity := False; else Point_Addition(Xp, Yp, Xq, Yq, F, New_Xq, New_Yq); Xq := New_Xq; Yq := New_Yq; end if; A := B + A_Div_2; B := -A_Div_2; else if Q_Infinity then Xq := Xp; Yq := Add(Xp, Yp); Q_Infinity := False; else Point_Addition(Xp, Add(Xp, Yp), Xq, Yq, F, New_Xq, New_Yq); Xq := New_Xq; Yq := New_Yq; end if; A := B + A_Div_2 + 1; B := -(A_Div_2 + 1); end if; Xp := Product_Mod_F(Xp, Xp, F); Yp := Product_Mod_F(Yp, Yp, F); end loop; Xr := Xq; Yr := Yq; ------------------------------------------------ X_Xr := Bin_To_Hex(Xr); X_Yr := Bin_To_Hex(Yr); for I in 0 .. Mdiv4/4 -1 loop Put(X_Xr(I)); Put(" "); end loop; New_Line; for I in Mdiv4/4 .. 2*Mdiv4/4 -1 loop Put(X_Xr(I)); Put(" "); end loop; New_Line; for I in 2*Mdiv4/4 .. 3*Mdiv4/4 - 1 loop Put(X_Xr(I)); Put(" "); end loop; New_Line; for I in 3*Mdiv4/4 .. Mdiv4 - 1 loop Put(X_Xr(I)); Put(" "); end loop; New_Line; Put(X_Xr(Mdiv4)); Put(" "); New_Line; New_Line; for I in 0 .. Mdiv4/4 -1 loop Put(X_Yr(I)); Put(" "); end loop; New_Line; for I in Mdiv4/4 .. 2*Mdiv4/4 -1 loop Put(X_Yr(I)); Put(" "); end loop; New_Line; for I in 2*Mdiv4/4 .. 3*Mdiv4/4 - 1 loop Put(X_Yr(I)); Put(" "); end loop; New_Line; for I in 3*Mdiv4/4 .. Mdiv4 - 1 loop Put(X_Yr(I)); Put(" "); end loop; New_Line; Put(X_Yr(Mdiv4)); Put(" "); end Frobenius_Point_Multiplication3;