Наука умеет раскладывать целые числа на множители за
Пусть
Попытаемся оценить
Из формулы более-менее понятно, что вероятность
Следствие. В мультимножество нужно добавить
Итак, мы хотим факторизовать число
Возьмём произвольную «достаточно случайную» с точки зрения теории чисел функцию. Например
Граф, в котором из каждой вершины есть единственное ребро
Рассмотрим траекторию какого-нибудь элемента
Утверждение. Ожидаемая длина цикла в этой последовательности
Доказательство: так как
Если мы найдём цикл в такой последовательности — то есть такие
Алгоритм по сути находит цикл в этой последовательности, используя для этого стандартный алгоритм («черепаха и заяц»): будем поддерживать два удаляющихся друг от друга указателя
typedef long long ll;
inline ll f(ll x) { return (x+1)*(x+1); }
(ll n, ll seed = 1) {
ll find_divisor= seed, y = seed;
ll x = 1;
ll divisor while (divisor == 1 || divisor == n) {
// двигаем первый указатель на шаг
= f(y) % n;
y // а второй -- на два
= f(f(x) % n) % n;
x // пытаемся найти общий делитель
= __gcd(abs(x-y), n);
divisor }
return divisor;
}
Так как алгоритм рандомизированный, при полной реализации нужно учитывать разные детали. Например, что иногда делитель не находится (нужно запускать несколько раз), или что при попытке факторизовать простое число он будет работать за
Формально, мы показали, что алгоритм работает за
Факторизация больших чисел интересна в контексте криптографии — на предположение невозможности факторизации за линейное время опирается, например, алгоритм RSA.
Существуют также субэкспоненциальные, но не полиномиальные алгоритмы факторизации. Человечество умеет факторизовывать числа порядка
Алгоритм Шора позволяет факторизовывать числа за полиномиальное время на квантовом компьютере. Но на 2019 год все квантовые вычисления проще симулировать на обычном компьютере. Самое большое число, факторизованное на реальном квантовом компьютере — 4088459.