вторник, 8 октября 2013 г.

Тест Миллера — Рабина

Тест Миллера — Рабина — вероятностный полиномиальный тест простоты. Тест Миллера — Рабина позволяет эффективно определять, является ли данное число составным.

Алгоритм был разработан Гари Миллером в 1976 году и модифицирован Майклом Рабином в 1980 году.

Исходный код функции Миллера  Рабина на С++

Для быстрого возведения числа в степень по модулю используется функция
pow_on_mod. Её реализацию вы можете найти в интернете.


bool test_Miller_Rabin(long long m) {

       if(m==2 || m==3)
             return true;

       if(m % 2 == 0 || m == 1){
             return false;
       }

       long long s = 0;
       long long t = m-1;
       long long x=0;

       long long r1 = 2;
       long long r2 = m-2;
       long long a;

       long long r = (log(m) / log(2));


       while(t!=0 && t % 2 == 0){
             s++;
             t/=2;
       }

       for(long long  i = 0; i < r; i++) {
             a = r1 + rand()%(r2-r1);

             x = pow_on_mod(a,t,m);
             if(x==1 || x==m-1) {
                    continue;
             }

             for(long long j = 0; j < s-1; j++) {
                    x = pow_on_mod(x,2,m);

                    if(x == 1)
                           return false;
                    if(x == m - 1)
                                  break;
             }

             if(x == m - 1)
                    continue;

             return false;
       }

    return true;
}