public static PointEdwardsExtended Double(PointEdwardsExtended P)//4M + 4S + 1*a + 6add + 1*2 { BigInteger A = P.x * P.x; BigInteger B = P.y * P.y; BigInteger C = 2 * P.z * P.z; BigInteger D = P.E.a * A; BigInteger W = P.x + P.y; BigInteger E = W * W - A - B; BigInteger G = D + B; BigInteger F = G - C; BigInteger H = D - B; BigInteger x = (E * F) % P.E.n; BigInteger y = (G * H) % P.E.n; BigInteger t = (E * H) % P.E.n; BigInteger z = (F * G) % P.E.n; return(new PointEdwardsExtended(x, y, z, t, P.E)); }
public static PointEdwardsExtended operator *(BigInteger k, PointEdwardsExtended P) { var R = new PointEdwardsExtended(0, 1, P.E); if (P.IsInfinite()) { return(R); } while (k > 0) { if (k % 2 == 1) { R += P; } k /= 2; P = Double(P); } return(R); }
}//inverted public static BigInteger GetFactorExtended(BigInteger n, int B1, int B2, TorsionType type) { BigInteger x, y; var E = GenerateCurve(n, out x, out y, type); var P = new PointEdwardsExtended(x, y, E); //STEP 1 var P1 = P as IPoint; var result = StageOneEdwardsProjective(ref P1, n, B1); if (result > 1 || result == 0) { return(result); } //STEP 2 result = StageTwoEdwardsProjective(ref P1, n, B1, B2); return(result); }//extended
public static PointEdwardsExtended Tripple(PointEdwardsExtended P)//4M + 4S + 1*a + 6add + 1*2 { BigInteger YY = P.y * P.y; BigInteger aXX = P.E.a * P.x * P.y; BigInteger Ap = YY + aXX; BigInteger B = 2 * (2 * P.z * P.z - Ap); BigInteger xB = aXX * B; BigInteger yB = YY * B; BigInteger AA = Ap * (YY - aXX); BigInteger F = AA - yB; BigInteger G = AA + xB; BigInteger xE = P.x * (yB + AA); BigInteger yH = P.y * (xB - AA); BigInteger zF = P.z * F; BigInteger zG = P.z * G; BigInteger x = (xE * zF) % P.E.n; BigInteger y = (yH * zG) % P.E.n; BigInteger z = (zF * zG) % P.E.n; BigInteger t = (xE * yH) % P.E.n; return(new PointEdwardsExtended(x, y, z, t, P.E)); }