public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz) { int c = Nat.Sub(12, xx, yy, zz); if (c != 0) { if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0) { Nat.DecAt(12, zz, PExtInv.Length); } } }
private static int Legendre(BigInteger a, BigInteger b) { //int r = 0, bits = b.IntValue; //for (;;) //{ // int lowestSetBit = a.GetLowestSetBit(); // a = a.ShiftRight(lowestSetBit); // r ^= (bits ^ (bits >> 1)) & (lowestSetBit << 1); // int cmp = a.CompareTo(b); // if (cmp == 0) // break; // if (cmp < 0) // { // BigInteger t = a; a = b; b = t; // int oldBits = bits; // bits = b.IntValue; // r ^= oldBits & bits; // } // a = a.Subtract(b); //} //return BigInteger.One.Equals(b) ? (1 - (r & 2)) : 0; int bitLength = b.BitLength; uint[] A = Nat.FromBigInteger(bitLength, a); uint[] B = Nat.FromBigInteger(bitLength, b); int r = 0; int len = B.Length; for (;;) { while (A[0] == 0) { Nat.ShiftDownWord(len, A, 0); } int shift = Integers.NumberOfTrailingZeros((int)A[0]); if (shift > 0) { Nat.ShiftDownBits(len, A, shift, 0); int bits = (int)B[0]; r ^= (bits ^ (bits >> 1)) & (shift << 1); } int cmp = Nat.Compare(len, A, B); if (cmp == 0) { break; } if (cmp < 0) { r ^= (int)(A[0] & B[0]); uint[] t = A; A = B; B = t; } while (A[len - 1] == 0) { len = len - 1; } Nat.Sub(len, A, B, A); } return(Nat.IsOne(len, B) ? (1 - (r & 2)) : 0); }