P+1-метод Уильямса

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Заголовок с маленькой буквы p+1-метод Уильямса — метод факторизации чисел N∈ℕ с помощью последовательностей чисел Люка, разработанный Хью Уильямсом в 1982 году. Алгоритм находит простой делитель p числа n. Аналогичен p−1-методу Полларда, но использует разложение на множители числа p+1. Имеет хорошие показатели скорости подсчёта только в случае, когда p+1 легко факторизуется. Как правило, на практике реализуется не часто из-за невысокого процента подобных случаевШаблон:Sfn.

Последовательности чисел Люка

Шаблон:Стиль раздела Для дальнейших выкладок нам понадобится ввести последовательности чисел Люка и перечислить некоторые их свойства.

Пусть P и Q — некоторые фиксированные целые числа. Последовательности чисел Люка определяются какШаблон:Sfn:

U0(P,Q)=0,U1(P,Q)=1,Un+2(P,Q)=P⋅Un+1(P,Q)−Q⋅Un(P,Q),n≥0
V0(P,Q)=2,V1(P,Q)=P,Vn+2(P,Q)=P⋅Vn+1(P,Q)−Q⋅Vn(P,Q),n≥0

Пусть также Δ=P2−4Q.

Последовательности имеют следующие свойства:

{U2n=Vn⋅Un,V2n=Vn2−2Qn(1)
{U2n−1=Un2−Q⋅Un−12,V2n−1=Vn⋅Vn−1−P⋅Qn−1(2)
{ΔUn=P⋅Vn−2Q⋅Vn−1,Vn=P⋅Un−2Q⋅Un−1(3)
{Un+m=Um⋅Un+1−Q⋅Um−1⋅Un,ΔUn+m=Vm⋅Vn+1−Q⋅Vm−1⋅Vn(4)
{Un(Vk(P,Q),Qk)=Unk(P,Q)/Uk(P,Q),Vn(Vk(P,Q),Qk)=Vnk(P,Q)(5)

Для доказательства данных свойств рассмотрим формулы последовательности чисел Люка:

Un(P,Q)=αn−βnα−β

и

Vn(P,Q)=αn+βn,

где α и β — корни характеристического многочлена

x2−P⋅x+Q

Используя явные формулы и теорему Виетта:

P=α+β;Q=α⋅β,

получаем выражения (1),(2),(3),(4) и (5).

Далее выделяем ещё одно свойство:

Если НОД(N,Q)=1 и P′Q≡P2−2QmodN, то: P′≡α/β+β/α и Q′≡1, откуда

U2m(P,Q)≡P⋅Qm−1⋅Um(P′,1)modN(6)

И затем формулируем теорему:

Если p — нечётное простое число, p∣Q и символ Лежандра ϵ=(Δ/p), то:
{U(p−ϵ)m(P,Q)≡0modp,V(p−ϵ)m(P,Q)≡2Qm(1−ϵ)/2modp(T1)

Доказательство данной теоремы трудоёмкое, и его можно найти в книге Д. Г. ЛемераШаблон:Sfn.

Первый шаг алгоритма

Графическое представление первого шага

Пусть p — простой делитель факторизуемого числа N, и выполнено разложение:

p+1=∏i=1kqiαi,

где qi — простые числа.

Пусть B=max⁡{qiαi|∀i:1≤i≤k}.

Введём число R=∏i=1kqiβi, где степени βi выбираются таким образом, что qiβi≤B,qiβi+1>B∀i:1≤i≤k.

Тогда p+1|R.Шаблон:Sfn

Далее, согласно теореме (T1), если НОД(N,Q)=1,(Δ/p)=−1, то p|UR(P,Q).

И, следовательно, p| НОД (UR(P,Q),N), то есть найден делитель искомого числа NШаблон:Sfn.

Стоит обратить внимание, что числа P,Q,p не известны на начальном этапе задачи. Поэтому для упрощения задачи сделаем следующее: так как p|UR(P,Q), то по свойству (2) p|U2R(P,Q). Далее воспользуемся свойством (6) и получим: p|UR(P′,1).

Таким образом, мы без потери общности можем утверждать, что Q=1.Шаблон:Sfn

Далее пользуемся теоремой (T1), из которой делаем вывод, что

V(p−ϵ)m(P,1)≡2modp;

И, следовательно, p|(VR(P,1)−2).Шаблон:Sfn

Теперь выбираем некоторое число P такое, что НОД (P2−4,N)=1;

Обозначаем:

Vn(P)=Vn(P,1),Un(P)=Un(P,1).

Окончательно, нужно найти НОД(VR(P)−2,N).Шаблон:Sfn

Для поиска VR(P) поступаем следующим образомШаблон:Sfn:

1) раскладываем R в двоичный вид: R=∑i=0tbi2t−i, где bi=0,1.

2) вводим последовательность натуральных чисел {fn}:f0=1;fk+1=2fk+bk+1. При этом ft=R;

3) ищем пары значений (Vfk+1,Vfk+1−1) по следующему правилу:

(Vfk+1,Vfk+1−1)={(V2fk,V2fk−1),whenbk+1=0;(V2fk+1,V2fk),whenbk+1=1
при этом V0(P)=2,V1(P)=P

4) значения V2fk−1,V2fk,V2fk+1 ищутся по правилам (которые следуют из свойств (1),(2) и определения последовательности чисел Люка):

{V2f−1≡VfVf−1−PmodN;V2f≡Vf2−2modN;V2f+1≡PVf2−VfVf−1−PmodN.

Для значений, введённых по умолчанию, то есть N=451889,R=2520,P=6 получаем результат:

374468

Делаем проверку этого значения. Для этого считаем НОД(VR(P)−2,N)= НОД(374468−2,451889)=139 и 451889⋮139.

Если мы в первом шаге неудачно выбрали числа R,P, то есть получилось так, что НОД(VR(P)−2,N)=1, то тогда нужно переходить ко второму шагу. Иначе — работа завершенаШаблон:Sfn.

Второй шаг алгоритма

Графическое представление второго шага

Пусть число p+1 имеет некоторый простой делительs, больший чем B, но меньший некоторого B2, то есть:

p=s⋅(∏i=1kqiαi)−1, где B<s≤B2

Вводим последовательность простых чисел {sj:B<sj≤B2∀j=1,2,...,k}.

Вводим ещё одну последовательность: {dj:2dj=sj+1−sj∀j=1,2,...,k−1}

Далее определяем:

T[si]≡ΔUsiR(P)/UR(P)modN.

Используя свойство (5), получаем первые элементы:

{T[s1]≡PV[s1]−2V[s1−1]modN;T[s1−1]≡2V[s1]−PV[s1−1]modN.

Далее используем свойство (4) и получаем:

{T[si+1]≡T[si]U[2di+1]−T[si−1]U[2di]modN,T[si+1−1]≡T[si]U[2di]−T[si−1]U[2di−1]modN.

Таким образом, мы вычисляем T[si],∀i=1,2,…,k

Далее считаем:

Ht= НОД(∏i=1tT[si],N) для t=1,2,…,k

Как только получаем Ht≠1, то прекращаем вычисленияШаблон:Sfn.

Для значений, введённых по умолчанию, то есть N=451889,B=10,B2=50,P=7 получаем результат:

139,

что является верным ответом.

Сравнение скорости работы

Автором данного метода были проведены тесты p−1 и p+1 методов на машине AMDAHL 470-V7 на 497 различных числах, которые показали, что в среднем первый шаг алгоритма p+1 работает примерно в 2 раза медленнее первого шага алгоритма p−1, а второй шаг — примерно в 4 раза медленнееШаблон:Sfn.

Применение

В связи с тем, что p−1-метод факторизации работает быстрее, p+1-метод применяется на практике очень редкоШаблон:Sfn.

Рекорды

На данный момент (01.01.2025) три самых больших простых делителя[1], найденных методом P+1, состоят из 60, 55 и 53 десятичных цифр.

Кол-во цифр p Делитель числа Найден (кем) Найден (когда) B B2
60 725516237739635905037132916171116034279215026146021770250523 L2366 A. Kruppa

P. Montgomery

31.10.2007 1011 1015
55 1273305908528677655311178780176836847652381142062038547 782⋅6782+1 P. Leyland 16.05.2011 109 1013
53 60120920503954047277077441080303862302926649855338567 682⋅5682−1 P. Leyland 26.02.2011 108 1012

Здесь L2366 — 2366-й член последовательности чисел Люка.

Примечания

Шаблон:Примечания

Литература

Ссылки