Flag ;//за допомогою цього циклі ми представляємо число Ch-1 = 2 ^ pow_2 * coef
{/ = 2; _2 + = 1;
} while (! (coef & 1)); (int i = 0; i <100; i + +)// для достатньої точності вибрак параметр до = 100, тоді ймовірність помилки = (1/4 ) ^ 100
{//тупо за алгоритмом:
{= ((rand () <<16) | rand ())% (Ch-1);// вибираємо випадкове а
} while (! a); (a, coef, rez, Ch);// зводимо в ступінь, отриману раніше ((rez == 1) | | (rez == Ch-1) )// і якщо результат порівнянний з 1 або -1, то число ймовірно просте, йдемо на слід ітерацію; = 1; (int j = 0; j <(pow_2-1); j + +)// інакше має знайтися хоча б одне таке i Є (1, pow +2-1), що a ^ (2 ^ i) == 1 по модулю Р.
{(rez, 2, rez, Ch); (rez == 1) 1; (rez == (Ch-1))
{= 0;;
}
} (Flag)// якщо таке i жодного разу не зустрілося, то число составное1;
} 0;
} InversElem (unsigned int Fn, unsigned int E, unsigned int & D)// ф-ція обчислює зворотний ел-т (D) для (E) методом ланцюгових дробів
{int r, s, a = Fn, b = E, ai [3] = {0,1}; M (-1);// кількість ітерацій
{= a/b; = a% b; [2] = r * ai [1] + ai [0];// знаходимо поточне а [0] = ai [1];//записуємо попереднє а в пре-попереднє [1] = ai [2]; = b;// записуємо чисельник = s;// записуємо знаменаткль
+ + M;// нарощуємо ітерації
} while (s);// до тих пір, поки є залишок (a! = 1)// якщо останній знаменник НЕ 1 (тобто НСД (Fn, D)! = 1 ) 1; (M% 2 == 0) = ai [0]; = Fn-ai [0]; 0;
}
unsigned int NOD (unsigned int m, unsigned int n, int temp = 1)// # "justify"> {(! m && m) n * temp; if (m & ; &! n) m * temp; if (m == n) m * temp; if ((m == 1) && n) 1 * temp; if (m && (n == 1)) 1 * temp; if (! (m & 1) &&! (n & 1))
{* = 2 ;/ = 2; n/= 2; (m, n, temp);
} if (! (m & 1) && (n & 1))
{/ = 2; (m, n, temp);
} if ((m & 1) &&! (n & 1))
{/ = 2; (m, n, temp);
} if ((m & 1) && (n & 1))
{(n> m)
{= m;
}
{= n;
} (m, n, temp);
}
}
unsigned int Sravn (unsigned int x, unsigned int c, unsigned int Mod)// y = x ^ 2 + c (mod Mod)
{//це порівняння потрібно для оригінального методу факторизації р-Поллардаint y; __int64 temp; = x * x;% = Mod; + = c;% = Mod; = temp; y; p>
}
bool Factor (unsigned int Mod, unsigned int & P, unsigned int & Q)// якщо помилка, повертає 1, інакше 0