итак. скрестил алгоритм миллера-рабина с 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; }всё просто кроме самого алгоритма) он тоже не сложный, но надо вникать)
Комментариев нет:
Отправить комментарий