---------------------------------------------------------------- -- Plus Minus Algorithm, second version (plus_minus_algorithm_2.adb) -- -- compute: Z = X/Y mod P -- ---------------------------------------------------------------- with Gnat.Io; use Gnat.Io; with finite_fields; use finite_fields; procedure plus_minus_algorithm_2 is X, Y, p, Z, A, B, C, D, Old_b, Old_d, dif, min: Integer; begin loop Put("p = "); Get(p); New_Line; Put("x = "); Get(x); New_Line; Put("y = "); Get(y); New_Line; --------------------------------------------------------------------- a := p; b := y; c := 0; d := x; dif := 0; min := k; while min > 0 loop if b mod 4 = 0 then b := b/4; d := divide_by_4(d, p); if dif <= 0 then min := min - 2; elsif dif = 1 then min := min - 1; end if; dif := dif - 2; elsif b mod 2 = 0 then b := b/2; d := divide_by_2(d, p); if dif <= 0 then min := min - 1; end if; dif := dif - 1; else old_b := b; old_d := d; if (a+b) mod 4 = 0 then b := (b+a)/4; d := divide_by_4(d+c, p); else b := (b-a)/4; d := divide_by_4(d-c, p); end if; if dif < 0 then a := old_b; c := old_d; dif := -dif - 1; elsif dif = 0 then dif := dif - 1; min := min - 1; else dif := dif - 1; end if; end if; end loop; --put("a = "); put(a); New_Line; New_Line; if c < 0 then c := c + p; end if; if a = 1 then z := c; else z := p-c; end if; ---------------------------------------------------------------------- Put(X);Put("/"); Put(Y); Put(" mod "); Put(P); Put(" = "); Put(Z); New_Line; New_Line; end loop; end plus_minus_algorithm_2;