public static BigInteger CreateRandomInRange(BigInteger min, BigInteger max, SecureRandom random) { int num = min.CompareTo(max); if (num >= 0) { if (num > 0) { throw new ArgumentException("'min' may not be greater than 'max'"); } return min; } if (min.BitLength > (max.BitLength / 2)) { return CreateRandomInRange(BigInteger.Zero, max.Subtract(min), random).Add(min); } for (int i = 0; i < 0x3e8; i++) { BigInteger integer = new BigInteger(max.BitLength, random); if ((integer.CompareTo(min) >= 0) && (integer.CompareTo(max) <= 0)) { return integer; } } return new BigInteger(max.Subtract(min).BitLength - 1, random).Add(min); }
internal bool RabinMillerTest(int certainty, Random random) { BigInteger integer4; BigInteger m = this; BigInteger integer2 = m.Subtract(One); int lowestSetBit = integer2.GetLowestSetBit(); BigInteger exponent = integer2.ShiftRight(lowestSetBit); Label_001D: integer4 = new BigInteger(m.BitLength, random); if ((integer4.CompareTo(One) <= 0) || (integer4.CompareTo(integer2) >= 0)) { goto Label_001D; } BigInteger integer5 = integer4.ModPow(exponent, m); if (!integer5.Equals(One)) { int num2 = 0; while (!integer5.Equals(integer2)) { if (++num2 == lowestSetBit) { return false; } integer5 = integer5.ModPow(Two, m); if (integer5.Equals(One)) { return false; } } } certainty -= 2; if (certainty > 0) { goto Label_001D; } return true; }