void FermaEntry(long number, long cycles) { try { long a, b; bool prime = true; for (int i = 0; i < cycles; i++) { a = (long)rnd.Next(2, (int)number - 1); b = CryptographyMath.PowerSearch(a, number - 1, number); if (b != 1) { MessageBox.Show("Число " + number.ToString() + " скорее всего составное"); prime = false; break; } } if (prime) { MessageBox.Show("Число " + number.ToString() + " вероятно простое"); } } catch (Exception ex) { MessageBox.Show("Ошибка:" + ex.Message); } }
void PollardPMinusOneEntry(long number, long b) { try { long a = 2, p; for (int j = 2; j <= b; j++) { a = CryptographyMath.PowerSearch(a, j, number); } p = CryptographyMath.ExtendedGCD(a - 1, number)[0]; if (p != 1 || p != number) { MessageBox.Show(p.ToString() + " - делитель " + number.ToString()); } else { MessageBox.Show("Увы, попробуй ещё раз"); } } catch (Exception ex) { MessageBox.Show("Ошибка:" + ex.Message); } }
void RabinMillerEntry(long number) { try { long baseNum = (long)rnd.Next(2, (int)number - 2); long s = 0; // степень двойки long t = 0; // нечетное число, n-1 = 2^s*t bool searchRequired = true; long primeSearchCounter = 0; // если число n чётное или НОД(baseNum, n)!=1, то оно составное if (number % 2 == 0 || CryptographyMath.ExtendedGCD(baseNum, number)[0] != 1) { MessageBox.Show("Число " + number.ToString() + " скорее всего составное"); } else { t = (number - 1); //представляем число n - 1 в таком виде: n-1 = 2^s*t, находим s и t while (searchRequired) { if (t % 2 == 0) { s++; t = (number - 1) / (long)Math.Pow(2, s); } else { searchRequired = false; } } //если baseNum^t = 1 (mod n), или baseNum^((2^r)*t) = -1 (mod n) при 0<=r<s , то n псевдопростое по основанию baseNum for (int i = 0; i < s; i++) { long atn = CryptographyMath.PowerSearch(baseNum, t, number); // возводим а в степень t по модулю n if ((Math.Abs(atn) == 1) || (CryptographyMath.PowerSearch(atn, (long)Math.Pow(2, i), number) == number - 1)) // вместо того, чтобы писать Stepen(atn, (long) Math.Pow(2, i), n) == -1 { MessageBox.Show("Число " + number.ToString() + " вероятно простое"); break; } else { primeSearchCounter += 1; } } //если ни при одном r (0<=r<s) не выполняется baseNum^((2^r)*t) = -1 (mod n), то n составное if (primeSearchCounter == s) { MessageBox.Show(" Число " + number.ToString() + " составное"); } } } catch (Exception ex) { MessageBox.Show("Ошибка:" + ex.Message); } }