Square roots mod p in ARIBAS

Since version 1.44 ARIBAS has a builtin function
    gfp_sqrt(p,a: integer): integer;
which calculates the square root of an integer a modulo a prime number p. The number a must be a quadratic residue modulo p, i.e. its Legendre (Jacobi) symbol mod p must be 1 or 0.
Example:
    ==> p := next_prime(10**9).
    -: 1000000007

    ==> a := 6.
    -: 6

    ==> jacobi(a,p).
    -: 1

    ==> x := gfp_sqrt(p,a).
    -: 959647287

    ==> x**2 mod p.
    -: 6
As an application, we can write a function that constructs a point on an elliptic curve
    Y**2 = X**3 + a*X + b
over the finite field GF(p) = Z/p. This function chooses first an x-coordinate and tests whether x**3 + a*x + b is a square mod p. If this is the case, the y-coordinate is determined by calculating the square root. The last argument x0 of the function serves as a start value for the x-coordinate of the point. If this argument is < 0, or is not given, a random value is used instead.
==> function ecp_findpoint(p,a,b: integer; x0 := -1): array[2];
    var
        x, y, y2: integer;
    begin
        if x0 < 0 then
            x := random(p);
        else
            x := x0;
        end;
        while true do
            y2 := (x**3 + a*x + b) mod p;
            if jacobi(y2,p) = -1 then
                inc(x);
            else
                y := gfp_sqrt(p,y2);
                break;
            end;
        end;
        if x >= p then x := x mod p; end;
        return (x,y);
    end.
-: ecp_findpoint
With the same prime p = 1000000007 as above and parameters
    ==> a := 1.
    -: 1

    ==> b := random(p).
    -: 435846878
we get for example
    ==> ecp_findpoint(p,a,b,0).
    -: (0, 353710864)

    ==> ecp_findpoint(p,a,b,4).
    -: (6, 605147815)

    ==> ecp_findpoint(p,a,b).
    -: (918115695, 463220581)


Homepage of ARIBAS


Otto Forster 2004-08-16