/** * return a sqrt root - the routine verifies that the calculation returns the right value - if * none exists it returns null. */ public override ECFieldElement Sqrt() { uint[] c = this.x; if (Nat224.IsZero(c) || Nat224.IsOne(c)) { return(this); } uint[] nc = Nat224.Create(); SecP224R1Field.Negate(c, nc); uint[] r = Mod.Random(SecP224R1Field.P); uint[] t = Nat224.Create(); if (!IsSquare(c)) { return(null); } while (!TrySqrt(nc, r, t)) { SecP224R1Field.AddOne(r, r); } SecP224R1Field.Square(t, r); return(Nat224.Eq(c, r) ? new SecP224R1FieldElement(t) : null); }
public override ECFieldElement Sqrt() { uint[] array = this.x; if (Nat224.IsZero(array) || Nat224.IsOne(array)) { return(this); } uint[] array2 = Nat224.Create(); SecP224R1Field.Negate(array, array2); uint[] array3 = Mod.Random(SecP224R1Field.P); uint[] t = Nat224.Create(); if (!SecP224R1FieldElement.IsSquare(array)) { return(null); } while (!SecP224R1FieldElement.TrySqrt(array2, array3, t)) { SecP224R1Field.AddOne(array3, array3); } SecP224R1Field.Square(t, array3); if (!Nat224.Eq(array, array3)) { return(null); } return(new SecP224R1FieldElement(t)); }
/** * return a sqrt root - the routine verifies that the calculation returns the right value - if * none exists it returns null. */ public override ECFieldElement Sqrt() { uint[] c = this.x; if (Nat224.IsZero(c) || Nat224.IsOne(c)) { return(this); } uint[] nc = Nat224.Create(); SecP224R1Field.Negate(c, nc); uint[] r = Mod.Random(SecP224R1Field.P); for (;;) { uint[] d1 = Nat224.Create(); Nat224.Copy(r, d1); uint[] e1 = Nat224.Create(); e1[0] = 1; uint[] f1 = Nat224.Create(); RP(nc, d1, e1, f1); uint[] d0 = Nat224.Create(); uint[] e0 = Nat224.Create(); for (int k = 1; k < 96; ++k) { Nat224.Copy(d1, d0); Nat224.Copy(e1, e0); RS(d1, e1, f1); if (Nat224.IsZero(d1)) { Mod.Invert(SecP224R1Field.P, e0, f1); SecP224R1Field.Multiply(f1, d0, f1); SecP224R1Field.Square(f1, d1); return(Nat224.Eq(c, d1) ? new SecP224R1FieldElement(f1) : null); } } // Avoid any possible infinite loop due to a bad random number generator SecP224R1Field.AddOne(r, r); } }
public override ECFieldElement Sqrt() { uint[] x = this.x; if (Nat224.IsZero(x) || Nat224.IsOne(x)) { return(this); } uint[] z = Nat224.Create(); SecP224R1Field.Negate(x, z); uint[] r = Mod.Random(SecP224R1Field.P); uint[] t = Nat224.Create(); if (!IsSquare(x)) { return(null); } while (!TrySqrt(z, r, t)) { SecP224R1Field.AddOne(r, r); } SecP224R1Field.Square(t, r); return(!Nat224.Eq(x, r) ? null : new SecP224R1FieldElement(t)); }
public override ECFieldElement AddOne() { uint[] z = Nat224.Create(); SecP224R1Field.AddOne(x, z); return(new SecP224R1FieldElement(z)); }