среда, 26 октября 2011 г.

Проверка больших чисел на простоту

итак. скрестил алгоритм миллера-рабина с 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;

}
всё просто кроме самого алгоритма) он тоже не сложный, но надо вникать)

Комментариев нет:

Отправить комментарий