итак. скрестил алгоритм миллера-рабина с ntl. ну как скрестил... нашёл) с помощью всего этого дела можно определить, является ли число простым с достаточно высокой вероятностью. метод итерационный. чем больше итераций, тем выше точность. идеально для распределенной обработки.
вот, собственно сам код:
вот, собственно сам код:
#include <NTL/ZZ.h>
NTL_CLIENT
long witness(const ZZ& n, const ZZ& x)
{
ZZ m, y, z;
long j, k;
if (x == 0) return 0;
k = 1;
m = n/2;
while (m % 2 == 0) {
k++;
m /= 2;
}
z = PowerMod(x, m, n); // z = x^m % n
if (z == 1) return 0;
j = 0;
do {
y = z;
z = (y*y) % n;
j++;
} while (j < k && z != 1);
return z != 1 || y != n-1;
}
long PrimeTest(const ZZ& n, long t)
{
if (n <= 1) return 0;
PrimeSeq s;
long p;
p = s.next();
while (p && p < 2000) {
if ((n % p) == 0) return (n == p);
p = s.next();
}
ZZ x;
long i;
for (i = 0; i < t; i++) {
x = RandomBnd(n);
if (witness(n, x))
return 0;
}
return 1;
}всё просто кроме самого алгоритма) он тоже не сложный, но надо вникать)
Комментариев нет:
Отправить комментарий