Факторизация форм квадрата Шанкса
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Март 2015 г. ) |
Факторизация квадратных форм Шэнкса — это метод факторизации целых чисел, разработанный Дэниелом Шэнксом как усовершенствование метода факторизации Ферма .
Успех метода Ферма зависит от нахождения целых чисел и такой, что , где целое число, которое нужно факторизовать. Улучшение (замеченное Kraitchik ) — поиск целых чисел и такой, что . Находим подходящую пару не гарантирует факторизацию , но это подразумевает, что является фактором , и есть большая вероятность, что простые делители распределены между этими двумя факторами, так что вычисление наибольшего общего делителя и даст нетривиальный коэффициент .
Практический алгоритм поиска пар которые удовлетворяют был разработан Шанксом, который назвал его факторизацией квадратных форм или SQUFOF. Алгоритм может быть выражен через цепные дроби или через квадратичные формы. Хотя сейчас доступны гораздо более эффективные методы факторизации, SQUFOF имеет то преимущество, что он достаточно мал, чтобы его можно было реализовать на программируемом калькуляторе. Шанкс запрограммировал его на HP-65 , выпущенном в 1974 году, который имеет память только для девятизначных чисел и позволяет программировать только 100 шагов/нажатий клавиш. Существуют версии алгоритма, использующие мало памяти, и версии, хранящие список значений, которые выполняются быстрее.
В 1858 году чешский математик Вацлав Шимерка использовал метод, аналогичный SQUFOF, для факторинга. . [1]
Алгоритм
[ редактировать ]Примечание. Эта версия алгоритма работает в некоторых примерах, но часто зацикливается.
В этой версии список не используется.
Вход : , целое число, подлежащее факторизации, которое не должно быть ни простым числом , ни полным квадратом , а также небольшим положительным целым числом, .
Выход : нетривиальный фактор .
Алгоритм:
Инициализировать
Повторить
до является идеальным квадратом при некотором нечетном значении .
Начните вторую фазу (обратный цикл).
Инициализировать , , и , где , и относятся к предыдущему этапу. используется при расчете это недавно вычисленное значение .
Набор и , где это недавно вычисленное значение .
Повторить
до [ нужна ссылка ]
Тогда, если не равен и не равен , затем является нетривиальным фактором . В противном случае попробуйте другое значение . [ нужна ссылка ]
Метод Шанкса имеет временную сложность . [2]
Стивен С. Макмат написал более подробное обсуждение математики метода Шанкса, вместе с доказательством его правильности. [3]
Пример
[ редактировать ]Позволять
Цикл вперед | |||
---|---|---|---|
Здесь — идеальный квадрат, поэтому первая фаза заканчивается.
Для второго этапа установите . Затем:
Обратный цикл | |||
---|---|---|---|
Здесь , так что вторая фаза заканчивается. Теперь посчитаем , что является фактором .
Таким образом, .
Пример реализации
[ редактировать ]Ниже приведен пример функции C для выполнения факторизации SQUFOF целого числа без знака длиной не более 64 бит без переполнения переходных операций. [ нужна ссылка ]
#include <inttypes.h>
#define nelems(x) (sizeof(x) / sizeof((x)[0]))
const int multiplier[] = {1, 3, 5, 7, 11, 3*5, 3*7, 3*11, 5*7, 5*11, 7*11, 3*5*7, 3*5*11, 3*7*11, 5*7*11, 3*5*7*11};
uint64_t SQUFOF( uint64_t N )
{
uint64_t D, Po, P, Pprev, Q, Qprev, q, b, r, s;
uint32_t L, B, i;
s = (uint64_t)(sqrtl(N)+0.5);
if (s*s == N) return s;
for (int k = 0; k < nelems(multiplier) && N <= UINT64_MAX/multiplier[k]; k++) {
D = multiplier[k]*N;
Po = Pprev = P = sqrtl(D);
Qprev = 1;
Q = D - Po*Po;
L = 2 * sqrtl( 2*s );
B = 3 * L;
for (i = 2 ; i < B ; i++) {
b = (uint64_t)((Po + P)/Q);
P = b*Q - P;
q = Q;
Q = Qprev + b*(Pprev - P);
r = (uint64_t)(sqrtl(Q)+0.5);
if (!(i & 1) && r*r == Q) break;
Qprev = q;
Pprev = P;
};
if (i >= B) continue;
b = (uint64_t)((Po - P)/r);
Pprev = P = b*r + P;
Qprev = r;
Q = (D - Pprev*Pprev)/Qprev;
i = 0;
do {
b = (uint64_t)((Po + P)/Q);
Pprev = P;
P = b*Q - P;
q = Q;
Q = Qprev + b*(Pprev - P);
Qprev = q;
i++;
} while (P != Pprev);
r = gcd(N, Qprev);
if (r != 1 && r != N) return r;
}
return 0;
}
Ссылки
[ редактировать ]- ^ Леммермейер, Ф. (2013). «Вацлав Шимерка: квадратичные формы и факторизация» . LMS Журнал вычислений и математики . 16 : 118–129. дои : 10.1112/S1461157013000065 .
- ^ ( Ризель 1994 : 189)
- ^ «Факторизация квадратных форм Дэниела Шэнкса». 2004. CiteSeerX 10.1.1.107.9984 .
- Д.А. Бьюэлл (1989). Бинарные квадратичные формы . Спрингер-Верлаг. ISBN 0-387-97037-1 .
- Д. М. Брессу (1989). Факторизация и тестирование на простоту . Спрингер-Верлаг. ISBN 0-387-97040-1 .
- Ризель, Ганс (1994). Простые числа и компьютерные методы факторизации (2-е изд.). Биркгаузер. ISBN 0-8176-3743-5 .
- Сэмюэл С. Вагстафф-младший (2013). Радость факторинга . Провиденс, Род-Айленд: Американское математическое общество. стр. 163–168. ISBN 978-1-4704-1048-3 .
Внешние ссылки
[ редактировать ]- Дэниел Шэнкс: Анализ и улучшение метода факторизации цепной дроби (расшифровка С. МакМата, 2004 г.)
- Дэниел Шэнкс: Заметки SQUFOF (расшифровка С. МакМата, 2004 г.)
- Стивен С. МакМат: Параллельная факторизация целых чисел с использованием квадратичных форм , 2005 г.
- С. МакМэт, Ф. Крэбб, Д. Джойнер: Цепные дроби и параллельные SQUFOF , 2005 г.
- Джейсон Гауэр, Сэмюэл Вагстафф: Факторизация квадратной формы (опубликовано)
- Алгоритм факторинга SQUFOF Шанкса
- Java-математическая библиотека