Факторизация квадратных форм Шанкса - Википедия - Shankss square forms factorization

Факторизация квадратных форм Шанкса это метод для целочисленная факторизация разработан Дэниел Шэнкс как улучшение Метод факторизации Ферма.

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

Практический алгоритм поиска пар которые удовлетворяют был разработан Шанксом, который назвал его «Факторизация квадратной формы» или SQUFOF. Алгоритм может быть выражен в виде непрерывных дробей или квадратичных форм. Хотя сейчас доступны гораздо более эффективные методы факторизации, преимущество SQUFOF состоит в том, что он достаточно мал, чтобы быть реализованным на программируемом калькуляторе.

В 1858 г. чешский математик Вацлав Шимерка использовал метод, аналогичный SQUFOF, чтобы фактор .[1]

Алгоритм

Вход: , целое число, подлежащее факторизации, которое не должно быть простое число ни идеальный квадрат, и небольшой множитель .

Выход: нетривиальный фактор .

Алгоритм:

Инициализировать

Повторение

до того как идеальный квадрат в некоторых даже .

Инициализировать

Повторение

до того как

Тогда если не равно и не равно , тогда является нетривиальным фактором . В противном случае попробуйте другое значение .

Метод Шанкса имеет временную сложность .

Стивен С. Макмат написал более подробное обсуждение математики метода Шанкса вместе с доказательством его правильности.[2]

Пример

Позволять

Цикл вперед

Здесь идеальный квадрат.

Обратный цикл

Здесь .

, что является фактором .

Таким образом,

Примеры реализации

Ниже приведен пример функции C для выполнения SQUFOF факторизации целого числа без знака, не превышающего 64 бит, без переполнения переходных операций.[нужна цитата ]

#включают <inttypes.h>#define nelems (x) (sizeof (x) / sizeof ((x) [0]))const int множитель[] = {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 СКФОФ( uint64_t N ){    uint64_t D, По, п, Pprev, Q, Qprev, q, б, р, s;    uint32_t L, B, я;    s = (uint64_t)(sqrtl(N)+0.5);    если (s*s == N) возвращаться s;    за (int k = 0; k < Nelems(множитель) && N <= UINT64_MAX/множитель[k]; k++) {        D = множитель[k]*N;        По = Pprev = п = sqrtl(D);        Qprev = 1;        Q = D - По*По;        L = 2 * sqrtl( 2*s );        B = 3 * L;        за (я = 2 ; я < B ; я++) {            б = (uint64_t)((По + п)/Q);            п = б*Q - п;            q = Q;            Q = Qprev + б*(Pprev - п);            р = (uint64_t)(sqrtl(Q)+0.5);            если (!(я & 1) && р*р == Q) перемена;            Qprev = q;            Pprev = п;        };        если (я >= B) Продолжить;        б = (uint64_t)((По - п)/р);        Pprev = п = б*р + п;        Qprev = р;        Q = (D - Pprev*Pprev)/Qprev;        я = 0;        делать {            б = (uint64_t)((По + п)/Q);            Pprev = п;            п = б*Q - п;            q = Q;            Q = Qprev + б*(Pprev - п);            Qprev = q;            я++;        } пока (п != Pprev);        р = gcd(N, Qprev);        если (р != 1 && р != N) возвращаться р;    }    возвращаться 0;}

Рекомендации

  1. ^ Леммермейер, Ф. (2013). "Вацлав Шимерка: квадратичные формы и факторизация". Журнал вычислений и математики LMS. 16: 118–129. Дои:10.1112 / S1461157013000065.
  2. ^ "Факторизация квадратных форм Дэниела Шанкса". CiteSeerX  10.1.1.107.9984. Цитировать журнал требует | журнал = (помощь)

внешняя ссылка