Генерация 2 случайных простых чисел в C#
Хотелось бы спросить, как мне сгенерировать 2 случайных числа, а затем проверить, является ли оно простым числом? Я хотел бы сгенерировать и то, и другое и проверить их все в один клик. Я попытался написать код на C#, но там есть несколько недопустимых аргументов. Вот мой код.
protected void btnstart_Click(object sender, EventArgs e) { BigInteger p = RandomInteger(); //generate a random number while (CheckIfPrime(p)==false) // number generated will be check if is prime,if false regenerate another random number { BigInteger p = RandomInteger(); } txtP.Text = p.ToString(); // output the prime number lblresult.Text = "true"; // result true to confirm that it is the prime BigInteger q = RandomInteger(); txtQ.Text = q.ToString(); lblresult2.Text = "true"; } public BigInteger RandomInteger() // to generate a random number { var rng = new RNGCryptoServiceProvider(); var n = 10000000000; byte[] bytes = new byte[n/8]; rng.GetBytes(bytes); var msb = bytes[n / 8 - 1]; var mask = 0; while (mask < msb) mask = (mask << 1) + 1; bytes[n - 1] &= Convert.ToByte(mask); BigInteger i = new BigInteger(bytes); return i; } public bool CheckIfPrime(int n) //to check if the random number generated is prime { var isPrime = true; var sqrt = Math.Sqrt(n); for (var i = 2; i <= sqrt; i++) if ((n % i) == 0) isPrime = false; return isPrime; }
Спасибо!
Sergey Alexandrovich Kryukov
Если вы генерируете простое число, нет необходимости проверять, является ли оно простым. :-)
—СА
F-ES Sitecore
В дополнение к советам, которые вы уже получили, вы можете повысить эффективность вашего CheckIfPrime, сделав это
public bool CheckIfPrime(int n) //чтобы проверить, является ли сгенерированное случайное число простым
{
ВАР корень = математика.Sqrt(п.);
for (var i = 2; i <= sqrt; i++)
if ((n % i) == 0) возвращает false;
вернуть true;
}
Member 12696135
А вы пробовали?..
// Сгенерируйте два простых числа известного размера в одной строке кода
RSACryptoServiceProvider tempRsa = новый RSACryptoServiceProvider(size_in_bits);
Где 'size_in_bits' - это число от 384 (48 байт) до 16 384 (2048 байт)
DotNet создает эти два простых числа как часть нового закрытого ключа RSA, из которого затем можно украсть P и Q (два уникальных простых числа одинаковой длины), прежде чем выбросить ключ.
Я опубликовал решение (решение 5), которое, надеюсь, вы найдете полезным. Их можно массировать в систему.Численные данные.BigInteger довольно легко - и я добавил пример этого, так как вы должны убедиться, что BigInteger не рассматривает их как отрицательные числа (расширяя массив байтов дополнительным 0x00)
Вы, вероятно, больше не нуждаетесь в этом, но кто-то другой может извлечь из этого выгоду. Это аккуратный ярлык и экономит много времени/хлопот.