public override bool Equals(object o) { if (o == null) { return(false); } ECElement e = o as ECElement; if ((System.Object)e == null) { return(false); } return(point.Equals(e.point)); }
// Miller "function" private static BigInteger MLF(FpPoint P, FpPoint R, FpPoint Q) { if (!P.Equals(R)) { if (P.X.Equals(R.X)) { return(Q.X.Subtract(P.X).ToBigInteger()); } else { BigInteger l = R.Y.Subtract(P.Y).Divide((R.X.Subtract(P.X))).ToBigInteger(); return(Q.Y.Subtract(P.Y).ToBigInteger().Subtract(l.Multiply((Q.X.Subtract(P.X).ToBigInteger())))); } } else { // z*y^2=d*x^3+a*x+b -> derivacija po x -> 3*x^2+a BigInteger brojnik = new BigInteger("3", 10).Multiply(P.X.ToBigInteger().Pow(2)); // z*y^2=d*x^3+a*x+b -> derivacija po y -> 2*y BigInteger nazivnik = new BigInteger("2", 10).Multiply(P.Y.ToBigInteger()); if (nazivnik.ToString(10) == "0") { return(Q.X.ToBigInteger().Subtract(P.X.ToBigInteger())); } else { double koef = (double)(brojnik.IntValue / nazivnik.IntValue); double rez = Q.Y.Subtract(P.Y).ToBigInteger().IntValue - koef * (Q.X.Subtract(P.X).ToBigInteger().IntValue); return(new BigInteger(rez.ToString(), 10)); } } }