Метод квадратичного решета

Метод квадратичного решета (Quadratic sieve algorithm, сокр. QS) — метод факторизации больших чисел, разработанный Померанцем в 1981 году. Долгое время превосходил другие методы факторизации целых чисел общего вида, не имеющих простых делителей, порядок которых значительно меньше (для чисел , имеющих простые делители, много меньшие более быстрым является метод факторизации на эллиптических кривых). Метод квадратичного решета представляет собой разновидность метода факторных баз (обобщение метода факторизации Ферма).Этот метод считается вторым по быстроте (после общего метода решета числового поля). И до сих пор является самым быстрым для целых чисел до 100 десятичных цифр и устроен значительно проще чем общий метод решета числового поля. Это универсальный алгоритм факторизации, так как время его выполнения исключительно зависит от размера факторизуемого числа, а не от его особой структуры и свойств.[1]

Основные цели

Алгоритм пытается найти такие квадраты чисел, которые равны по модулю (факторизуемое число), что часто приводит к факторизации . Алгоритм работает в два этапа: этап сбора данных, где он собирает информацию, которая может привести к равенству квадратов; и этап обработки данных, где он помещает всю собранную информацию в матрицу и обрабатывает её для получения равенства квадратов. Первый этап может быть легко распараллелен на много процессов, но второй этап требует большие объемы памяти и его трудно распараллелить.

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

Метод квадратичного решета является модификацией метода разложения на множители Диксона.

Продолжительность расчёта для квадратичного решета ( - факторизуемое число):

.[2]

Подход

Пусть x mod y обозначает остаток от деления x на y. В методе факторизации Ферма в отдельностиподбираем число a, чтобы a2 mod n являлось квадратом. Но такое число подобратьтяжело. В квадратичном решете мы вычисляем a2 mod n для некоторых a, и затемнаходим такое подмножество, произведение элементов которого является квадратом. Этоприведёт к сравнению квадратов.

Например, 412 mod 1649 = 32, 422 mod 1649 = 115, и 432 mod 1649 = 200. Ни один изполученных результатов не является квадратом, но результат произведения (32)(200) = 6400 = 802. С другой стороны, рассмотрев предыдущее произведение по mod 1649, мыполучим, что (32)(200) = (412)(432) = ((41)(43))2. Так как (41)∙(43) mod 1649 = 114, мыимеем сравнение квадратов: 1142 ≡ 802 (mod 1649).

Но как мы решаем проблему, фиксируя множество чисел и, находя подмножество,произведение элементов, которого является квадратом?Начнём с понятия вектор показателей степеней. Например, у нас есть число 504. Егоразложение на простые множители имеет следующий вид 504 = 23325071. Мы могли быпредставить это разложение в виде вектора показателей степеней (3,2,0,1), которыйфиксирует степени простых чисел 2, 3, 5 и 7, участвующих в разложении. Число 490 поаналогии имело бы вектор (1,0,1,2). Умножение чисел - это то же самое, что ипоэлементное сложение их векторов показателей степеней, то есть произведение 504 ∙490 имеет вектор (4,2,1,3).

Теперь, обратите внимание, что число является квадратом, если каждый элемент вего векторе показателей степеней чётный. К примеру, при сложении векторов (3,0,0,1) и(1,2,0,1) получаем (4,2,0,2). Это говорит нам о том, что произведение чисел 56 ∙ 126является квадратом. На самом деле, мы не заботимся о точных значениях, получаемых ввекторе, до тех пор, пока каждый элемент в результирующем векторе чётный. По этойпричине мы берём каждый элемент по mod 2 и выполняем сложение элементов по mod 2:(1,0,0,1) + (1,0,0,1) = (0,0,0,0).

Таким образом, наша задача приняла следующий вид: задано множество векторов (0,1),найти такое подмножество, которое дополняется до нулевого вектора, при использованиисложения по mod 2. Это задача линейной алгебры, то есть необходимо найти линейнозависимые вектора. Из теоремы линейной алгебры следует, что, до тех пор, покаколичество векторов больше, чем количество элементов в каждом векторе, такаязависимость должна существовать. Мы можем эффективно находить линейно зависимыевекторы, например, поместив исходные векторы, в качестве столбцов матрицы и затем,использовать метод Гаусса, который легко приспособить для работы с целыми числами поmod 2. Как только мы найдём линейно зависимые векторы, мы просто перемножаемчисла, соответствующие этим векторам и получаем квадрат, который ищем.

Однако, возведение в квадрат множества случайныхчисел по mod n приводит к большому числу различных простых множителей,длиннымвекторам и большой матрице. Чтобы избавиться от этой проблемы, мы специальноищем числа, такие, что a2 mod n имеет только небольшие простые множители (такиечисла называются гладкими числами). Их сложнее найти, но использование такихчисел позволяет избежать больших векторов и матриц.

Основная идея метода

В качестве факторной базы берется множество простых чисел, состоящее из и всех таких нечетных простых чисел , не превосходящих заданной границы (которая выбирается из соображений оптимальности), что  — квадратичный вычет по модулю .

Множество целых чисел, в котором ищутся -числа ( -число — целое число, делящееся только на простые числа из ) выглядит следующим образом:

Далее, вместо того, чтобы брать одно за другим , и делить его на простые числа из , берутся одно за другим каждое и проверяется делимость на (и его степени) одновременно для всех . Для построения списка всех простых , не превосходящих , можно использовать решето Эратосфена.

Алгоритм

1. Выбираются границы и порядка величины (далее обозначается как ), такие что .

2. Для , ,…, по порядку в столбец выписываются целые числа .

3. Для каждого нечетного простого числа вычисляется символ Лежандра - проверяется условие . Если оно не выполняется, удаляется из факторной базы.

4. Предполагая, что  — такое нечетное простое число, что  — квадратичный вычет по модулю , решается уравнение для 1,2,… . Значения берутся в порядке возрастания пока не окажется, что уравнение не имеет решений , сравнимых по модулю с каким-либо из чисел в области .

Пусть  — наибольшее из таких чисел, для которых в указанной области найдется число со свойством .

Пусть и решения и .

5. При том же значении просматривается список значений , полученный в п.2. В столбце, соответствующем , ставится 1 против всех значений , для которых отличается от на некоторое кратное . После этого 1 заменяется на 2 для всех таких значений , что отличается от на кратное и т. д. до . Затем то же самое проделывается с вместо . Наибольшее возможное число в столбце — .

6. При добавлении очередной единицы к числу в столбце в п.5, соответствующее число делится на и полученный результат сохраняется.

7. В столбце под при просто ставится 1 против с нечетным и соответствующее делится на 2. При решается уравнение и решение продолжается в том же ключе, как при нечетном .

8. Когда все указанные действия будут проведены для всех простых чисел, не превосходящих , следует отбросить все числа , кроме обратившихся в 1 после деления на все степени , не превосходящих . В итоге получится таблица, в которой в столбце будут содержаться все такие значения из интервала , что есть -число, а остальные столбцы будут соответствовать тем значениям , для которых  — квадратичный вычет.

9. Далее используется обобщенный метод факторизации Ферма (метод факторных баз).

Как метод квадратичного решета оптимизирует поиск равных квадратов

Метод квадратичного решета пытается найти пары целых чисел x и y(x) (где y(x) - функция от x) удовлетворяющих гораздо более слабым условием чем x2y2 (mod n). Он выбирает множество простых чисел называемых факторной базой, и пытается найти x такой, что самый маленький остаток y(x) = x2 mod n раскладывается на множители факторной базы. Такие y называются гладкими по отношению к факторной базе.

Факторизацией значения y(x) над факторной базой вместе со значением x называется зависимостью. Квадратическое решето ускоряет процесс поиска зависимостей путём выбора x близко к квадратному корню из n. Это гарантирует что число y(x) будет меньше, и поэтому имеет больше шансов быть гладким.

Другой способ увеличения вероятности быть гладким числом заключается в увеличении размера факторной базы. Однако, тогда необходимо найти по крайней мере на одну гладкую связь больше чем количество простых чисел в базе, чтобы гарантировать существование линейной зависимости.

Пример

Этот пример демонстрирует стандартное квадратичное решето без логарифмических оптимизаций. Допустим нам нужно факторизовать число N = 15347, следовательно, наименьшее число, квадрат которого больше N, равно 124. Значит y(x) = (x + 124)2 − 15347.

Сбор данных

Так как N мало, то необходимо только 4 простых числа. Первые 4 простых числа p для которых у 15347 есть квадратный корень по модулю p, равны 2, 17, 23, и 29 (Другими словами, 15347 является квадратичным вычетом для этих простых чисел). Эти числа будут базисом для квадратичного решета.

Сейчас мы строим наше решето из и начнем с просеивания процесса для каждого простого числа в базисе, выбирая для просеивания первые Y(X) 0 ≤ X < 100 :

Следующим шагом является выполнение просеивания. Для каждого р в нашей факторной базе решаем уравнение

чтобы найти записи в массиве V которые делятся на p.

Для решаем чтобы получить решение .

Таким образом, начиная с X=1 с шагом 2, каждая запись будет делиться на 2. Деление каждой из записей на 2 дает

Аналогично для оставшихся простых чисел p в равенство решено. Обратите внимание, что для каждого p > 2 будет 2 результирующих линейных уравнения, из-за наличия двух квадратных корней по модулю.

Каждое равенство приводит к тому, что делится на p при x=a, a+p, a+2p, и т.д.. Делением V на p в a, a+p, a+2p, a+3p, и т.д., для каждого простого числа в базисе находим гладкие числа.

Элемент из V который равен 1 соответствует гладкому числу. Так как , , и раняются 1, то:

X + 124Yfactors
1242920 • 170 • 230 • 291
12778221 • 171 • 231 • 290
1952267821 • 171 • 231 • 291

Обработка матрицы

Рассмотрим равенства:

и выпишем показатели простых чисел в виде матрицы и решим систему :

Её решение:

Таким образом, произведение всех 3-х уравнений есть квадрат (mod N).

и

алгоритм находит

Теперь вычисляем GCD(3070860 - 22678, 15347) = 103, нетривиальный делитель 15347, другим является 149.

Рекорды факторизации

До открытия общего метода решета числового поля (NFS) QS был известен как самый быстрый алгоритм факторизации общего назначения. Сейчас у алгоритма факторизации с помощью эллиптических кривых такое же время выполнения, как и в QS (в случае, когда n есть произведение только двух простых чисел), но на практике QS быстрее, т.к. он использует операции одинарной точности вместо операций длинной арифметики, которые используются в методе эллиптических кривых.

2 апреля 1994 года была произведена факторизация RSA-129 методом QS. Это было число длины 129, результат произведения двух простых чисел, одного длиной 64 и другого длиной 65. При этом факторная база состояла из 524339 простых чисел. Этап сбора данных произвел 5000 MIPS. Собранная информация занимала 2GB. Этап обработки матрицы занял 45 часов на Bellcore[англ.]-овском (сейчас Telcordia Technologies[англ.]) суперкомпьютере MasPar. Это было самое большое число, которое в то время могли факторизовать алгоритмом общего назначения. Только 10 апреля 1996 года смогли факторизовать число длины 130 RSA методом NFS.

Литература

  • Koblitz N.A. Course in number theory and cryptography (неопр.). — Springer-Verlag, 1987. — С. 180—182.
  • Gerver J.L. Factoring large numbers with a quadratic sieve (англ.). — Math. Comp., 1983. — Vol. 41. — P. 287—294.

Примечания