Пример #1
0
 public static void Add(uint[] x, uint[] y, uint[] z)
 {
     Nat256.Add(x, y, z);
     if (Nat256.Gte(z, P))
     {
         Nat256.AddWord(PInv, z, 0);
         z[7] &= P7;
     }
 }
Пример #2
0
 public static void Twice(uint[] x, uint[] z)
 {
     Nat256.ShiftUpBit(x, 0, z);
     if (Nat256.Gte(z, P))
     {
         Nat256.AddWord(PInv, z, 0);
         z[7] &= P7;
     }
 }
Пример #3
0
 public static uint[] FromBigInteger(BigInteger x)
 {
     uint[] z = Nat256.FromBigInteger(x);
     if (Nat256.Gte(z, P))
     {
         Nat256.AddWord(PInv, z, 0);
         z[7] &= P7;
     }
     return(z);
 }
Пример #4
0
 public static void AddOne(uint[] x, uint[] z)
 {
     Nat256.Copy(x, z);
     Nat256.Inc(z, 0);
     if (Nat256.Gte(z, P))
     {
         Nat256.AddWord(PInv, z, 0);
         z[7] &= P7;
     }
 }
Пример #5
0
        public static void Reduce(uint[] xx, uint[] z)
        {
            Debug.Assert(xx[15] >> 30 == 0);

            uint xx07 = xx[7];

            Nat.ShiftUpBit(8, xx, 8, xx07, z);
            uint c   = Nat256.MulByWordAddTo(PInv, xx, z) << 1;
            uint z07 = z[7];

            z[7] = z07 & P7;
            c   += (z07 >> 31) - (xx07 >> 31);
            Nat256.AddWord(c * PInv, z, 0);
            if (Nat256.Gte(z, P))
            {
                Nat256.AddWord(PInv, z, 0);
                z[7] &= P7;
            }
        }