Метод Лемана

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Алгоритм Лемана (або алгоритм Шермана Лемана) детерміновано розкладає задане натуральне число n на множники за O(n1/3) арифметичних операцій. Алгоритм запропонував американський математик Шерман Леман в 1974 році[1]. Цей алгоритм став першим алгоритмом факторизації цілих чисел, складність якого менша, ніж O(n). На сьогодні він має суто історичний інтерес і, як правило, не застосовується на практиціШаблон:Sfn.

Опис

Спочатку алгоритм перевіряє чи має n прості дільники, які не перевищують n1/3.

Далі метод Лемана розвиває ідеї, що закладені в алгоритмі Ферма, і шукає дільники числа n, використовуючи рівність x2y2=4bn для деякого цілого числа b. Він базується на наступній теореміШаблон:Sfn.

Формулювання теореми

Нехай n — додатне непарне ціле число, а r — ціле число таке, що 1r<n1/2. Якщо n=pq, де p і q прості, а також

(nr+1)1/2<pn1/2, то тоді існують такі невід'ємні цілі числа x, y, k, що
x2y2=4kn,1kr,
xk+1(mod2),
xk+1(mod4), якщо k непарне,
0x(4kn)1/214(r+1)(nk)1/2

і

p=min(gcd(x+y,n),gcd(xy,n)).

Якщо n — просте, то таких чисел x, y, k не знайдеться.[1]

Теоретичне обґрунтування

Формулювання теореми

Нехай n=pq можна записати як добуток двох непарних взаємно простих чисел, що задовольняють нерівностям n1/3<p<q<n2/3. Тоді знайдуться такі натуральні числа x,y і k1, що
1. Виконується рівність x2y2=4kn при k<n1/3,
2. Виконується нерівність 0x4kn<n1/64k+1.Шаблон:Sfn

Для доведення цієї теореми потрібна наступна лема.

Лема

Нехай виконано умови теореми. Тоді можна знайти такі натуральні числа r,s, що rs<n1/3 і prqs<n1/3.Шаблон:Sfn

Шаблон:Hider

Доведення теореми

Припустимо, що p і q — непарні дільники числа n і нехай x=pr+qs і y=prqs, де r і s задовольняють твердження леми, тоді виконується рівність
x2y2=(pr+qs)2(prqs)2=4rspq=4kn,
де k=rs. В силу леми, ціле число k задовольняє нерівності k<n1/3. Отже, виконано перше твердження теореми.

Для доведення другого твердження покладемо z=x4bn=pr+qs4bn, так як x2=4kn+y2, то x4kn і z0. Використовуючи оцінку зверху для y, отримуємо
n2/3>y2=x24kn=(pr+qs+4kn)(pr+qs4kn)24kn(pr+qs4kn)24kn(z1).
З цього випливає, що z<n2/324kn+1=n1/64k+1. Теорему доведеноШаблон:Sfn.

Алгоритм

Нехай n — непарне і n>8.

Крок 1. Для простих a=2,3,,n1/3 перевірити умову an. Якщо на цьому кроці не вдалося розкласти n на множники, то переходимо до кроку 2.

Крок 2. Якщо на кроці 1 дільник не знайдено і nскладене число, то n=pq, де p,q - прості числа, і n1/3<pq<n2/3. Тоді для всіх k=1,2,,n1/3 і всіх d=0,,n1/64k+1 перевірити чи є число (4kn+d)24kn квадратом натурального числа. Якщо це так, то для A=4kn+d і B=A24kn виконується взяття по модулю:

A2B2(modn) чи (AB)(A+B)0(modn).

У цьому випадку для d*=gcd(AB,n) перевіряється нерівність 1<d*<n і, якщо ця нерівність виконується, то n=d*(n/d*) — розклад n на два множники. Якщо ж алгоритм не знайшов розкладу n на два множники, то n — просте числоШаблон:Sfn.

Цей алгоритм спочатку перевіряє чи має n прості дільники, які не перевищують n1/3, а потім починає перебір значень k і d для перевірки виконання теореми. У випадку коли шукані значення x і y не знайдено, отримуємо, що число n — просте. Таким чином можна розглядати цей алгоритм і як тест числа n на простоту.Шаблон:Sfn

Псевдокод

for a2 to n1/3 do

if amodn=0 then
return a
end if

end for

for k1 to n1/3 do

for d0 to n1/64k+1 do
if isSquare((4kn+d)24kn) then
A4kn+d
BA24kn
if 1<gcd(A+B,n)<n then
return gcd(A+B,n)
else if 1<gcd(AB,n)<n then
return gcd(AB,n)
end if
end if
end for

end for

Пояснення:


Функція isSquare(a) повертає true, якщо a є повним квадратом і false — в іншому випадку.

Функція gcd(a,b) повертає найбільший спільний дільник чисел a і b.[2]

Приклад

Розглянемо приклад n=1387, n1/3=11.
Для a=2,3,5,7,11 перевіряємо, чи є число a дільником числа n. Не важко переконатись, що таких немає. Переходимо до наступного кроку.

Для всіх k=1,2,3,,11 і всіх d=0,1,,4 перевіряємо, чи є число (4kn+d)24kn квадратом натурального числа. У нашому випадку для k=3 і d=1 вираз (4kn+d)24kn дорівнює 256, яке є квадратом: 256=162. Відповідно, A=4×3×1387+1=130 і B=16. Тоді d*=(AB;n)=19, задовольняє нерівності 1<d*<n і є дільником числа n.
У результаті, ми розклали число 1387 на два множники: 73 і 19.

Складність

Кількість операцій

На першому кроці треба зробити n1/3 операцій для пошуку малих дільників числа n.

Складність другого кроку оцінюється в операціях перевірки чи є число (4kn+d)24kn повним квадратом. Кількість операцій оцінюється зверху величиною n1/64k=1n1/61k+2(n1/3n1/6)<3n1/3.
Таким чином складність усього алгоритму — O(n1/3) операційШаблон:Sfn.

Залежність від розрядності

Для великих чисел існує залежність часу виконання операцій від їх розрядності. Наприклад, складання двох чисел потребує часу, що лінійно залежить від довжини (більшого з них), а час множення й ділення ще більший, тобто, залежить від довжини чисел нелінійно (поліноміально). Отже, метод потребує поліноміальної кількості операцій (O(n1/3)), але час кожної операції щонайменше лінійно залежить від довжини (розрядності) числа. Таким чином виникає експоненційна залежність часу виконання алгоритму від розрядності числа, що факторизується — O(n(n1/3))[2].

n2l , де l — розрядність.

O(n1/3)=O(2l/3)=O(el/3)

Порівняння з іншими методами

Як покращення методу Ферма, метод Лемана також істотно залежить від відстані між множниками числа: Шаблон:Джерело?. Однак, якщо різниця між множниками мала, то метод Лемана значно програє методу ФермаШаблон:Джерело?.

Для чисел із невеликим простим дільником ситуація інша — метод Лемана завдяки послідовному діленню на першому кроці досить швидко виділить простий множник[2].

Можливість паралельних обчислень

Загальна ідея

Паралельна реалізація базується на наступному підході:[2]

Крок 1:

Кожному обчислювальному процесу, що бере участь у факторизації, видається свій набір потенційних дільників з множини {2,3,4,n1/3}. Обчислювальний процес почергово перевіряє n на кратність числам зі свого набору дільників. Через деякі проміжки часу головний процес-координатор «опитує» обчислювальні процеси на предмет виявлення дільника. У випадку, коли достатньо перевірити n на простоту, процес-координатор, отримавши інформацію про знайдення дільника, надсилає іншим процесам сигнал про завершення роботи. Якщо ж дільник не знайдено, чи потрібно знайти всі дільники, пошук продовжується.

Крок 2:

Кожному обчислювальному процесу аналогічно з кроком 1 видається свій набір чисел k з множини {2,3,4,n1/3}. Обчислювальний процес по черзі перевіряє всі умови, описані в алгоритмі, визначаючи чи знайдений нетривіальний множник. Аналогічно з кроком 1 процес-координатор періодично «опитує» процеси щодо знайдення дільника і приймає рішення про припинення чи продовження обчислень.

Застосування цього підходу дозволяє отримати лінійне прискорення при збільшенні кількості процесів на комп'ютері з розділеною пам'яттю.[2]

Реалізація із застосуванням технології GPGPU

Для успішної реалізації алгоритму із застосуванням технології GPGPU треба вирішити два питання:[3]

  1. Для кожної операції алгоритму вирішити, де варто її виконувати: на ЦП чи на графічному процесорі.
  2. Визначити кількість ядер графічного процесора, що застосовуються.

Описаний вище підхід можна застосовувати для розбиття задачі.[3]

Крок 2: Усі операції цього кроку слід виконувати на графічному процесорі.

Нехай ker - кількість доступних ядер графічного процесора, la - кількість елементів множини {2,3,4,n1/3}. Розглянемо два випадки:

  1. laker: Використаємо la ядер графічного процесора.
  2. la>ker: Виконаємо laker ітерацій. На кожній ітерації виконуємо ker операцій ділення на ker ядрах. У кінці кожної ітерації визначаємо завершити процес чи ні.

Крок 2: Розподілити k між ядрами графічного процесора так же, як і в кроці 1. На кожному ядрі виконати 1-3:

  1. Перевірити чи є число (4kn+d)24kn квадратом натурального числа.
  2. У випадку отримання позитивного результату на попередньому пункті, обчислити A=4kn+d і B=A24kn.
  3. Для значень A і B перевірити умову A2B2(modn).
  4. Для значень A і B, що пройшли останню перевірку, перевірити виконання умови 0<gcd(A±B,n)<n.

Останній пункт краще виконувати на ЦП, оскільки ймовірність виконання цих операцій досить мала, а така перевірка на графічному процесорі відбувається досить повільно[3].

Примітки

Шаблон:Примітки

Література

  1. Шаблон:Книга
  2. Шаблон:Книга
  3. Шаблон:Книга

Шаблон:Алгоритми теорії чисел