I_love_natalia's blog

By I_love_natalia, 13 years ago, In Russian

Родилась интересная идея в рамках "поделки на коленке", которой спешу поделиться.

Есть много алгоритмов факторизации (например, описанные на e-maxx), но, кажется, что всем им можно понаходить нехорошие контрпримеры в данном диапазоне (по крайней мере, они известные стандартные, и можно ждать подобного, хотя в детали не вдавался - может быть, просветят).

Пусть дано N ≤ 1018. Для начала, проверим маленькие делители до 107 (решето Эратосфена и деления должны уложиться в таком диапазоне). Также проверим, что число не точный квадрат.

Теперь, число либо простое, либо имеет два простых делителя не больше 1011. Попробуем найти функцию Эйлера от числа . Очевидно, что она лежит в диапазоне

Зададимся некоторым a. Предпросчитаем an для n ≤ 107. Если у числа окажется маленький порядок, то просто запомним этот порядок. Иначе с шагом 107 пройдем диапазон значений pq - 1011 - 107 ≤ n ≤ pq - 1 + 107 и обнаружим решения an = 1, в которых одно из n будет являться искомым значением функции . Удостовериться, что данное значение является искомым можно просто решив квадратное уравнение и проверив один из получившихся делителей.

Будем проверять a начиная с двух и так далее. Единственной особенной ситуацией может быть то, что много чисел в начале будут иметь маленький порядок. Будем попутно считать НОК всех получившихся порядков, и, как только этот НОК будет больше 107 проведем процедуру проверки на с шагом НОК.

Не реализовывал, хотя выглядит верным. Discuss.

Upd 1. Сортировать 107 чисел после предпросчета может быть долго. Быть может, надо понизить эту константу до 106 (105 проверок нас вполне устроит). Кроме того, можно использовать тот факт, что делится на 4 и наш шаг делится на 4 и сохранить только 107 / 4 шагов предпросчета.

Upd 2. Итого к реализации: gcd, быстрое возведение в степень, решето Эратосфена, решение квадратного уравнения, точное извлечение корня из числа до 10^18. Не так много и совсем стандартно.

  • Vote: I like it
  • +16
  • Vote: I do not like it