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

і
.
Якщо
— просте, то таких чисел
,
,
не знайдеться.[1]
Нехай
можна записати як добуток двох непарних взаємно простих чисел, що задовольняють нерівностям
. Тоді знайдуться такі натуральні числа
і
, що
1. Виконується рівність
при
,
2. Виконується нерівність
.
Для доведення цієї теореми потрібна наступна лема.
Лема
Нехай виконано умови теореми. Тоді можна знайти такі натуральні числа
, що
і
.
Доведення леми
Якщо
, тобто
, то твердження теореми виконується для
. Далі будемо вважати
.
Розкладемо
в ланцюговий дріб. Позначимо
-тий наближений дріб до
. Тоді
,
,
,
оскільки
. Оберемо перший номер
такий, що
,
.
Такий номер обов'язково знайдеться, бо в останньому наближеному дробі знаменник
. Доведемо, що
і
задовольняють твердженню леми. Очевидно, що
. Далі,
за властивостями ланцюгового дробу.
Розглянемо спочатку випадок
. В цьому випадку
,
що і потрібно було довести.
Тепер розглянемо випадок
. Нерівності приймуть вигляд
, і тоді
. Відповідно, за властивостями ланцюгових дробів, виконуються нерівності
. І тоді
.
Лему доведено.
Припустимо, що
і
— непарні дільники числа
і нехай
і
, де
і
задовольняють твердження леми, тоді виконується рівність
,
де
. В силу леми, ціле число
задовольняє нерівності
. Отже, виконано перше твердження теореми.
Для доведення другого твердження покладемо
, так як
, то
і
. Використовуючи оцінку зверху для
, отримуємо
.
З цього випливає, що
. Теорему доведено.
Нехай
— непарне і
.
Крок 1. Для простих
перевірити умову
. Якщо на цьому кроці не вдалося розкласти
на множники, то переходимо до кроку 2.
Крок 2. Якщо на кроці 1 дільник не знайдено і
— складене число, то
, де
- прості числа, і
.
Тоді для всіх
і всіх
перевірити чи є число
квадратом натурального числа. Якщо це так, то для
і
виконується взяття по модулю:
чи
.
У цьому випадку для
перевіряється нерівність
і, якщо ця нерівність виконується, то
— розклад
на два множники.
Якщо ж алгоритм не знайшов розкладу
на два множники, то
— просте число.
Цей алгоритм спочатку перевіряє чи має
прості дільники, які не перевищують
, а потім починає перебір значень
і
для перевірки виконання теореми. У випадку коли шукані значення
і
не знайдено, отримуємо, що число
— просте. Таким чином можна розглядати цей алгоритм і як тест числа
на простоту.
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]
Розглянемо приклад
,
.
Для
перевіряємо, чи є число
дільником числа
. Не важко переконатись, що таких немає. Переходимо до наступного кроку.
Для всіх
і всіх
перевіряємо, чи є число
квадратом натурального числа. У нашому випадку для
і
вираз
дорівнює 256, яке є квадратом:
. Відповідно,
і
.
Тоді
, задовольняє нерівності
і є дільником числа
.
У результаті, ми розклали число
на два множники:
і
.
На першому кроці треба зробити
операцій для пошуку малих дільників числа
.
Складність другого кроку оцінюється в операціях перевірки чи є число
повним квадратом. Кількість операцій оцінюється зверху величиною
.
Таким чином складність усього алгоритму —
операцій.
Для великих чисел існує залежність часу виконання операцій від їх розрядності. Наприклад, складання двох чисел потребує часу, що лінійно залежить від довжини (більшого з них), а час множення й ділення ще більший, тобто, залежить від довжини чисел нелінійно (поліноміально). Отже, метод потребує поліноміальної кількості операцій (
), але час кожної операції щонайменше лінійно залежить від довжини (розрядності) числа. Таким чином виникає експоненційна залежність часу виконання алгоритму від розрядності числа, що факторизується —
[7].
, де
— розрядність.
Як покращення методу Ферма, метод Лемана також істотно залежить від відстані між множниками числа: [джерело?]. Однак, якщо різниця між множниками мала, то метод Лемана значно програє методу Ферма[джерело?].
Для чисел із невеликим простим дільником ситуація інша — метод Лемана завдяки послідовному діленню на першому кроці досить швидко виділить простий множник[7].
Паралельна реалізація базується на наступному підході:[7]
Крок 1:
Кожному обчислювальному процесу, що бере участь у факторизації, видається свій набір потенційних дільників з множини
. Обчислювальний процес почергово перевіряє
на кратність числам зі свого набору дільників. Через деякі проміжки часу головний процес-координатор «опитує» обчислювальні процеси на предмет виявлення дільника. У випадку, коли достатньо перевірити
на простоту, процес-координатор, отримавши інформацію про знайдення дільника, надсилає іншим процесам сигнал про завершення роботи. Якщо ж дільник не знайдено, чи потрібно знайти всі дільники, пошук продовжується.
Крок 2:
Кожному обчислювальному процесу аналогічно з кроком 1 видається свій набір чисел
з множини
. Обчислювальний процес по черзі перевіряє всі умови, описані в алгоритмі, визначаючи чи знайдений нетривіальний множник. Аналогічно з кроком 1 процес-координатор періодично «опитує» процеси щодо знайдення дільника і приймає рішення про припинення чи продовження обчислень.
Застосування цього підходу дозволяє отримати лінійне прискорення при збільшенні кількості процесів на комп'ютері з розділеною пам'яттю.[7]
Реалізація із застосуванням технології GPGPU
[ред. | ред. код]
Для успішної реалізації алгоритму із застосуванням технології GPGPU треба вирішити два питання:[8]
- Для кожної операції алгоритму вирішити, де варто її виконувати: на ЦП чи на графічному процесорі.
- Визначити кількість ядер графічного процесора, що застосовуються.
Описаний вище підхід можна застосовувати для розбиття задачі.[8]
Крок 2:
Усі операції цього кроку слід виконувати на графічному процесорі.
Нехай
- кількість доступних ядер графічного процесора,
- кількість елементів множини
. Розглянемо два випадки:
: Використаємо
ядер графічного процесора.
: Виконаємо
ітерацій. На кожній ітерації виконуємо
операцій ділення на
ядрах. У кінці кожної ітерації визначаємо завершити процес чи ні.
Крок 2:
Розподілити
між ядрами графічного процесора так же, як і в кроці 1. На кожному ядрі виконати 1-3:
- Перевірити чи є число
квадратом натурального числа.
- У випадку отримання позитивного результату на попередньому пункті, обчислити
і
.
- Для значень
і
перевірити умову
.
- Для значень
і
, що пройшли останню перевірку, перевірити виконання умови
.
Останній пункт краще виконувати на ЦП, оскільки ймовірність виконання цих операцій досить мала, а така перевірка на графічному процесорі відбувається досить повільно[8].
- ↑ а б Lehman, R. Sherman. Factoring Large Integers. — Mathematics of Computation, 1974. — Т. 28, № 126. — С. 637-646. — DOI:10.2307/2005940.
- ↑ а б в г д Макаренко А.В.,Пыхтеев А. В., Ефимов С. С. ИССЛЕДОВАНИЕ ПАРАЛЛЕЛЬНЫХ АЛГОРИТМОВ ФАКТОРИЗАЦИИ ЦЕЛЫХ ЧИСЕЛ В ВЫЧИСЛИТЕЛЬНЫХ КЛАСТЕРНЫХ СИСТЕМАХ // Омский государственный университет им. Ф.М. Достоевского (Омск). — 2012. — Т. 4, № 66. — С. 149—158.
- ↑ а б в Желтов С. А. АДАПТАЦИЯ МЕТОДА ШЕРМАНА–ЛЕМАНА РЕШЕНИЯ ЗАДАЧИ ФАКТОРИЗАЦИИ К ВЫЧИСЛИТЕЛЬНОЙ АРХИТЕКТУРЕ CUDA // Российский государственный гуманитарный университет (Москва). — 2012. — Т. 14, № 94. — С. 84-91.
- Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М. : МЦНМО, 2003. — 328 с. — ISBN 5-94057-103-4.
- Алексей Нестеренко. Введение в современную криптографию. — МЦНМО, 2011. — 190 с.
- Richard Crandall, Carl Pomerance. A Computational Perspectives. — 2nd. — Springer, 2011. — 597 с. — ISBN 0-387-25282-7.