Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Факторизация.doc
Скачиваний:
12
Добавлен:
09.11.2019
Размер:
524.29 Кб
Скачать

Метод решета в числовом поле

Квадратичное решето в числовом поле — самый быстрый из из­вестных алгоритмов разложения на множители. Основная его идея состоит в поиске целых чисел х и у, разность квадратов которых делится на N. Как уже было сказано, после этого можно надеяться, что НОД (xу, N) — нетривиальный делитель числа N.

Чтобы объяснить работу этого метода, мы начнем с линейно­го решета и покажем, как оно может быть обобщено до решета в числовом поле. Линейное решето — не очень хороший алгоритм, на котором, однако, демонстрируются основные идеи эффективных алгоритмов.

Линейное решето

Предположим, что мы собираемся разложить на множители В-гладкое число N с некоторой границей В. Для этого надо сформировать факторбазу «малых» простых чисел

F = {р| р < В}.

Идея линейного решета состоит в поиске таких чисел  и , для которых комбинация b =  + N, является В-гладкой. Причем  тоже нужно выбирать среди В-гладких чисел. Тогда будут иметь место разложения

и

из которых получаются следующие соотношения на факторбазе:

Таким образом, основной вопрос линейного решета звучит так: как найти нужные значения  и ? Их поиск осуществляют по следую­щей схеме:

- фиксируют произвольное значение ;

- заводят просеивающий массив с А + 1 нулевыми элементами, пронумерованными от 0 до А:

- для каждого простого числа рF прибавляют log2p к каждому значению ячейки массива, чей номер сравним с –N по модулю р;

- выбирают  как номер ячейки, значение которой превышает определенную пороговую величину, например, является максимальным элементом массива.

Дело в том, что при удачном выборе пороговой величины взятый номер ячейки, будучи сложенным с N, имеет хорошие шансы оказаться B-гладким и, одновременно, делиться на большое количество простых чисел из F.

Разберем пример. Пусть N = 1159 и F = {2,3,5,7,11}. Выберем  = —2. Наша цель — найти гладкое число вида  — N. Вводим массив:

0

1

2

3

4

5

6

7

8

9

0,0

0,0

0,0

0,0

0,0

0,0

0,0

0,0

0,0

0,0

Берем первое простое число из F, а именно, р = 2. и вычисляем -N (mod p) = 0. Прибавляем теперь log22 = 1 к содержимому ячеек с четными номерами.

0

1

2

3

4

5

6

7

8

9

1.0

0,0

1,0

0.0

1,0

0,0

1,0

0,0

1,0

0,0

Переходим к р = 3 и находим ->N (mod3) = 2. Добавляем log2 3 = 1,6 к ячейкам с номерами, равными 2 по модулю 3:

0

1

2

3

4

5

6

7

8

9

1,0

0,0

2,6

0,0

1,0

1.6

1.0

0,0

2,6

0,0

Продолжая процесс для простых р = 5, 7 и 11, заполняем массив полностью:

0

1

2

3

4

5

6

7

8

9

1,0

2,8

2,6

2,3

1,0

1,6

1,0

0,0

11,2

0,0

Содержимое восьмой ячейки максимально. Поэтому мы подозрева­ем, что значению  = 8 соответствует гладкое и подходящее для наших целей число, в чем несложно убедиться, поскольку

b = a – N=8 – 21159 = –2310 = –2  3  5  7  11.

Итак, с помощью линейного решета мы получим большую кол­лекцию чисел а и b, удовлетворяющих соотношениям вида

Имея по крайней мере |B| + 1 таких соотношений, можно сформи­ровать матрицу со строками

(ai,1…ai,t, bi,1,…, bi,t)(mod 2).

Затем найдем аннулирующий эту матрицу вектор Z, который под­скажет, как перемножить соотношения, чтобы получить равенство вида

х22 (mod N).

Используя его, можно попытаться найти делитель числа N. Если попытка окажется неудачной, нужно найти новый аннулирующий вектор и сформировать другую разность квадратов.

Основной вариант линейного решета дает слишком бедный уро­жай соотношений. Существует его разновидность, называемая ва­риацией больших простых чисел, которая ослабляет условия линей­ного решета, позволяя парам a и b быть почти B-гладкими. допус­кая по одному «большому» простому делителю этих чисел. При этом «большие» простые числа комбинируются таким образом, что аппа­рат линейной алгебры, привлекаемый к линейному решету, работает без изменения. Это делается с помощью построения графов и алго­ритмов. вычисляющих базисы в множестве циклов графа. Вариация больших простых чисел появилась в квадратичном решете, но ра­ботает в любых просеивающих алгоритмах, раскладывающих числа на множители.

Ясно, что просеивание можно осуществлять параллельно. По­этому такой алгоритм можно распределить между большим числом компьютеров по всему миру. Подчиненные компьютеры сообщают все найденные ими соотношения на главный сервер, который осуще­ствляет заключительную стадию алгоритма, связанную с линейной алгеброй. Таким образом, интернет можно превратить в «один большой» вычислительный центр, занимающийся задачей факторизации. Заключительный этап с линейной алгеброй часто требует специального оснащения и большого объема памяти. Поэтому последний этап невозможно распределить между дочерними компьютерами.

Линейное решето — простейший, но не слишком хороший метод факторизации больших чисел. И действительно, линейное решето никогда не предлагалось как практический алгоритм разложения на множители. Однако его работа поучительна для восприятия других просеивающих алгоритмов. Решето в числовом поле использует для построения соотношений между элементами факторбазы арифме­тику конечных полей. Собственно, это единственная модификация по сравнению с линейным решетом. Этап линейной алгебры, вариа­ция больших простых чисел и распределение задачи между разными компьютерами, — все остается практически без изменения в алго­ритме решета в числовом поле.