public static Secp256k1FieldElement GetYCoordinate(Secp256k1FieldElement x, bool yIsEven) { var a = Secp256k1Constants.A; var b = Secp256k1Constants.B; // y^2 == x^3 + a*x + b var left = x.Pow(3) + a * x + b; var leftField = new Secp256k1FieldElement(left.Num); var candidateY = leftField.Sqrt(); Secp256k1FieldElement even; Secp256k1FieldElement odd; if (candidateY.Num % 2 == 0) { even = candidateY; odd = new Secp256k1FieldElement(Secp256k1Constants.P - candidateY.Num); } else { even = new Secp256k1FieldElement(Secp256k1Constants.P - candidateY.Num); odd = candidateY; } if (yIsEven) { return(even); } else { return(odd); } }
public Secp256k1Point(Secp256k1FieldElement x, Secp256k1FieldElement y) : base(Secp256k1Constants.A, Secp256k1Constants.B, x, y) { }