コード例 #1
0
 public override ECFieldElement Sqrt()
 {
     uint[] y = x;
     if (Nat160.IsZero(y) || Nat160.IsOne(y))
     {
         return(this);
     }
     uint[] array = Nat160.Create();
     SecP160R1Field.Square(y, array);
     SecP160R1Field.Multiply(array, y, array);
     uint[] array2 = Nat160.Create();
     SecP160R1Field.SquareN(array, 2, array2);
     SecP160R1Field.Multiply(array2, array, array2);
     uint[] array3 = array;
     SecP160R1Field.SquareN(array2, 4, array3);
     SecP160R1Field.Multiply(array3, array2, array3);
     uint[] array4 = array2;
     SecP160R1Field.SquareN(array3, 8, array4);
     SecP160R1Field.Multiply(array4, array3, array4);
     uint[] array5 = array3;
     SecP160R1Field.SquareN(array4, 16, array5);
     SecP160R1Field.Multiply(array5, array4, array5);
     uint[] array6 = array4;
     SecP160R1Field.SquareN(array5, 32, array6);
     SecP160R1Field.Multiply(array6, array5, array6);
     uint[] array7 = array5;
     SecP160R1Field.SquareN(array6, 64, array7);
     SecP160R1Field.Multiply(array7, array6, array7);
     uint[] array8 = array6;
     SecP160R1Field.Square(array7, array8);
     SecP160R1Field.Multiply(array8, y, array8);
     uint[] z = array8;
     SecP160R1Field.SquareN(z, 29, z);
     uint[] array9 = array7;
     SecP160R1Field.Square(z, array9);
     if (!Nat160.Eq(y, array9))
     {
         return(null);
     }
     return(new SecP160R1FieldElement(z));
 }