public static void elligator(int[] u, int[] r) { /* r = input * x = -A/(1+2r^2) # 2 is nonsquare * e = (x^3 + Ax^2 + x)^((q-1)/2) # legendre symbol * if e == 1 (square) or e == 0 (because x == 0 and 2r^2 + 1 == 0) * u = x * if e == -1 (nonsquare) * u = -x - A */ int[] A = new int[10]; int[] one = new int[10]; int[] twor2 = new int[10]; int[] twor2plus1 = new int[10]; int[] twor2plus1inv = new int[10]; int[] x = new int[10]; int[] e = new int[10]; int[] Atemp = new int[10]; int[] uneg = new int[10]; int nonsquare; Fe_1.fe_1(one); Fe_0.fe_0(A); A[0] = 486662; /* A = 486662 */ Fe_sq2.fe_sq2(twor2, r); /* 2r^2 */ Fe_add.fe_add(twor2plus1, twor2, one); /* 1+2r^2 */ Fe_invert.fe_invert(twor2plus1inv, twor2plus1); /* 1/(1+2r^2) */ Fe_mul.fe_mul(x, twor2plus1inv, A); /* A/(1+2r^2) */ Fe_neg.fe_neg(x, x); /* x = -A/(1+2r^2) */ Fe_mont_rhs.fe_mont_rhs(e, x); /* e = x^3 + Ax^2 + x */ nonsquare = legendre_is_nonsquare(e); Fe_0.fe_0(Atemp); Fe_cmov.fe_cmov(Atemp, A, nonsquare); /* 0, or A if nonsquare */ Fe_add.fe_add(u, x, Atemp); /* x, or x+A if nonsquare */ Fe_neg.fe_neg(uneg, u); /* -x, or -x-A if nonsquare */ Fe_cmov.fe_cmov(u, uneg, nonsquare); /* x, or -x-A if nonsquare */ }