public static PointMontgomery Addition(PointMontgomery P, PointMontgomery Q, PointMontgomery P0)//4M + 2S + 6add { BigInteger t1 = (P.x - P.z) * (Q.x + Q.z); BigInteger t2 = (P.x + P.z) * (Q.x - Q.z); BigInteger a = t1 + t2; BigInteger b = t1 - t2; BigInteger x = (P0.z * a * a) % P.E.n; BigInteger z = (P0.x * b * b) % P.E.n; return(new PointMontgomery(x, 0, z, P.E)); }
public static PointMontgomery Double(PointMontgomery P)//2M + 2S + 1*a24 + 4add { BigInteger a = P.x + P.z; BigInteger b = P.x - P.z; BigInteger t1 = a * a; BigInteger t2 = b * b; BigInteger t = t1 - t2; BigInteger x = (t1 * t2) % P.E.n; BigInteger z = (t * (t2 + t * P.E.b)) % P.E.n; return(new PointMontgomery(x, 0, z, P.E)); }
public static BigInteger GetFactorProjective(BigInteger n, int B1, int B2, TorsionType type) { BigInteger x; BigInteger y; var E = GenerateCurve(n, out x, out y, type); var P = new PointMontgomery(x, y, E); //STEP 1 var P1 = P as IPoint; var result = StageOneProjective(ref P1, n, B1); if (result > 1 || result == 0) { return(result); } //STEP 2 result = StageTwoProjective2(ref P1, n, B1, B2); return(result); }//Montgomery
public static PointMontgomery operator *(BigInteger k, PointMontgomery P) { if (k == 0) { return(new PointMontgomery(0, 1, 0, P.E)); } else if (k == 1) { return(P); } PointMontgomery U = P; PointMontgomery T = Double(P); if (k == 2) { return(T); } var binary = new List <BigInteger>(); while (k >= 2) { binary.Add(k % 2); k /= 2; } PointMontgomery R = P; for (int i = binary.Count - 1; i >= 0; i--) { if (binary[i] == 1) { U = Addition(T, U, P); T = Double(T); } else { T = Addition(T, U, P); U = Double(U); } } return(U); }