Метод Лемана

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


Метод Лемана

Метод Лемана розвиває ідеї, що закладені в алгоритмі Ферма і знаходить дільники числа , використовуючи рівність для деякого цілого числа . Він базується на наступній теоремі.[2]

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

Нехай  — додатне непарне ціле число, а  — ціле число таке, що . Якщо , де і прості, а також

, то тоді існують такі невід'ємні цілі числа , , , що
,
,
, якщо непарне,

і

.

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


Модифікованй метод Лемана

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

Нехай можна записати як добуток двох непарних взаємно простих чисел, що задовольняють нерівностям . Тоді знайдуться такі натуральні числа і , що

1. Виконується рівність при ,
2. Виконується нерівність .[2] Для доведення даної теореми нам потрібна наступна лема. Лема
Нехай виконані умови теореми. Тоді можна знайти такі натуральні числа , що і .[3]


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

Припустимо, що і  — непарні дільники числа і нехай і , де і задовольняють твердження леми, тоді виконується рівність
,
де . В силу леми, ціле число задовольняє нерівності . Отже, виконано перше твердження теореми. Для доведення другого твердження покладемо , так як , то і . Використовуючи оцінку зверху для , отримуємо
.
З цього випливає, що . Теорема доведена. [4]

Алгоритм (модифікований)

Нехай - непарне і .

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

Крок 2. Якщо на кроці 1 дільник не знайдено і - складене число, то , де - прості числа, і . Тоді для всіх і всіх перевірити чи є число квадратом натурального числа. Якщо це так, то для і виконується взяття по модулю:

чи .

В цьому випадку для перевіряється нерівність і якщо ця нерівність виконується, то — розклад на два множники. Якщо ж алгоритм не знайшов розкладу на два множники, то - просте число.[5]

Цей алгоритм спочатку перевіряє чи має прості дільники, які не перевищують , а потім починає перебір значень і для перевірки виконання теореми. У випадку коли шукані значення і не знайдені, ми отримуємо, що число - просте. Таким чином ми можемо розглядати даний алгоритм як тест числа на простоту.[6]

Швидкість

Обчислення залежності від величини числа, що факторизується

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

Швидкість другого кроку оцінюється в операціях тестування числа , на те, чи є воно повним квадратом. Швидкість другого етапу оцінюється зверху величиною .
Таким чином швидкість всього алгоритму - .[6]

Залежність від розрядності числа, що факторизується

В більшості випадків більш важливу роль грає залежність часу виконання від розрядності числа, що досліджується. Маючи поліноміальну залежність для величини отримуємо експоненціальну залежність часу виконання методу від розрядності числа, що факторизується.[7]

, де - розрядність.


Деякі частинні випадки

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

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

Псевдокод

for to do
if then
return
end if

end for for to do

for to do
if then
if then
return
else if then
return
end if
end if
end for

end for

Пояснення:

означає, що націло ділиться на .

Функція повертає , якщо є повним квадратом і в іншому випадку.

Функція повертає НСД чисел і .[7]

Можливості паралельної реалізації методу

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

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

Крок 1:

Кожному обчислювальному процесу, що бере участь у факторизації, видається свій набір потенційних дільників з множини . Обчислювальний процес почергово перевіряє на кратність числам зі свого набору дільників. Через деякі проміжки часу головний процес-координатор "опитує" обчислювальні процеси на предмет виявлення дільника. У випадку коли достатньо перевірити на простоту, процес-координатор, отримавши інформацію про знаходження дільника, надсилає іншим процесам сигнал про завершення роботи. Якщо ж дільник не знайдено, чи потрібно знайти всі дільники, пошук продовжується. Крок 2:
Кожному обчислювальному процесу аналогічно з кроком 1 видається свій набір чисел з множини . Обчислювальний процес по черзі перевіряє всі умови, описані в алгоритмі, визначаючи чи знайдений нетривіальний множник. Аналогічно з кроком 1 процес-координатор періодично "опитує" процеси на момент знаходження дільника і приймає рішення про припинення чи продовження обчислень. Застосування даного підходу дозволяє отримати лінійне прискорення при збільшенні кількості процесів на комп'ютері з розділеною пам'яттю.[7]

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

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

1. Для кожної операції алгоритму вирішити де варто її виконувати, на ЦП чи на графічному процесорі.
2. Визначити число ядер графічного процесора, що використовуються. Описаний вище підхід можна використовувати для розбиття задачі.[8] Крок 2: Всі операції цього кроку слід виконувати на графічному процесорі. Нехай - число доступних ядер графічного процесора, - число елементів множини . Розглянемо два випадки:
1. : Використаємо ядер графічного процесора.
2. : Виконаємо ітерацій. На кожній ітераціїї виконуємо операцій ділення на ядрах. В кінці кожної ітерації визначаємо завершити процес чи ні. Крок 2: Розподілити між ядрами графічного процесора так же як і в кроці 1. На кожному ядрі виконати 1-3:
1. Перевірити чи є число квадратом натурального числа.
2. У випадку отримання позитивного результату на попередньому пункті, обчислити і .
3. Для значень і перевірити умову .
4. Для значень і , що пройшли останню перевірку, перевірити виконання умови . Останній пункт краще виконувати на ЦП, так як ймовірність виконання даних операцій досить мала, а така перевірка на графічному процесорі відбувається достатньо повільно.<ref name=CUDA>

Приклад

Розглянемо приклад з , тоді для , де , перевіряємо чи є число дільником числа . Не важко переконатись, що таких немає. Переходимо до наступного пункту.

Для всіх і всіх перевіряємо чи є число квадратом натурального числа. В нашому випадку існують такі і , що вираз є повним квадратом і дорівнює . Відповідно, и . Тоді , задовольняє нерівності і є дільником числа . В результаті, ми розклали число на два множники: і .


Примітки

  1. Lehman, R. Sherman. Factoring Large Integers. — Mathematics of Computation, 1974. Т. 28, № 126. С. 637-646. DOI:10.2307/2005940.
  2. Нестеренко, 2011, с. 140.
  3. Василенко, 2003, с. 65—66.
  4. Нестеренко, 2011, с. 142.
  5. Василенко, 2003, с. 65.
  6. Нестеренко, 2011, с. 143.
  7. Макаренко А.В.,Пыхтеев А. В., Ефимов С. С. ИССЛЕДОВАНИЕ ПАРАЛЛЕЛЬНЫХ АЛГОРИТМОВ ФАКТОРИЗАЦИИ ЦЕЛЫХ ЧИСЕЛ В ВЫЧИСЛИТЕЛЬНЫХ КЛАСТЕРНЫХ СИСТЕМАХ // Омский государственный университет им. Ф.М. Достоевского (Омск).  2012. Т. 4, № 66. С. 149—158.
  8. Желтов С. А. АДАПТАЦИЯ МЕТОДА ШЕРМАНА–ЛЕМАНА РЕШЕНИЯ ЗАДАЧИ ФАКТОРИЗАЦИИ К ВЫЧИСЛИТЕЛЬНОЙ АРХИТЕКТУРЕ CUDA // Российский государственный гуманитарный университет (Москва).  2012. Т. 14, № 94. С. 84-91.

Література

  1. Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М. : МЦНМО, 2003. — 328 с. — ISBN 5-94057-103-4.
  2. Алексей Нестеренко. Введение в современную криптографию. МЦНМО, 2011. — 190 с.
  3. Richard Crandall, Carl Pomerance. A Computational Perspectives. — 2nd. — Springer, 2011. — 597 с. — ISBN 0-387-25282-7.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.