Алгоритм Лемана (або алгоритм Шермана Лемана) детерміновано розкладає задане натуральне число
на множники за
арифметичних операцій. Алгоритм запропонував американський математик Шерман Леман в 1974 році[1]. Цей алгоритм став першим алгоритмом факторизації цілих чисел, складність якого менша, ніж
. На сьогодні він має суто історичний інтерес і, як правило, не застосовується на практиці.
Опис
Спочатку алгоритм перевіряє чи має
прості дільники, які не перевищують
.
Далі метод Лемана розвиває ідеї, що закладені в алгоритмі Ферма, і шукає дільники числа
, використовуючи рівність
для деякого цілого числа
. Він базується на наступній теоремі.
Формулювання теореми
Нехай
— додатне непарне ціле число, а
— ціле число таке, що
. Якщо
, де
і
прості, а також
, то тоді існують такі невід'ємні цілі числа
,
,
, що
,
,
, якщо
непарне,
![{\displaystyle 0\leqslant x-(4kn)^{1/2}\leqslant {\frac {1}{4(r+1)}}\left({\frac {n}{k}}\right)^{1/2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7bac423fd751f602673639c4d9c438a07533f94b)
і
.
Якщо
— просте, то таких чисел
,
,
не знайдеться.[1]
Теоретичне обґрунтування
Формулювання теореми
Нехай
можна записати як добуток двох непарних взаємно простих чисел, що задовольняють нерівностям
. Тоді знайдуться такі натуральні числа
і
, що
1. Виконується рівність
при
,
2. Виконується нерівність
.
Для доведення цієї теореми потрібна наступна лема.
Лема
Нехай виконано умови теореми. Тоді можна знайти такі натуральні числа
, що
і
.
Доведення леми
Якщо
, тобто
, то твердження теореми виконується для
. Далі будемо вважати
.
Розкладемо
в ланцюговий дріб. Позначимо
-тий наближений дріб до
. Тоді
,
,
,
оскільки
. Оберемо перший номер
такий, що
,
.
Такий номер обов'язково знайдеться, бо в останньому наближеному дробі знаменник
. Доведемо, що
і
задовольняють твердженню леми. Очевидно, що
. Далі,
за властивостями ланцюгового дробу.
Розглянемо спочатку випадок
. В цьому випадку
,
що і потрібно було довести.
Тепер розглянемо випадок
. Нерівності приймуть вигляд
, і тоді
. Відповідно, за властивостями ланцюгових дробів, виконуються нерівності
. І тоді
.
Лему доведено.
Доведення теореми
Припустимо, що
і
— непарні дільники числа
і нехай
і
, де
і
задовольняють твердження леми, тоді виконується рівність
,
де
. В силу леми, ціле число
задовольняє нерівності
. Отже, виконано перше твердження теореми.
Для доведення другого твердження покладемо
, так як
, то
і
. Використовуючи оцінку зверху для
, отримуємо
.
З цього випливає, що
. Теорему доведено.
Алгоритм
Нехай
— непарне і
.
Крок 1. Для простих
перевірити умову
. Якщо на цьому кроці не вдалося розкласти
на множники, то переходимо до кроку 2.
Крок 2. Якщо на кроці 1 дільник не знайдено і
— складене число, то
, де
- прості числа, і
.
Тоді для всіх
і всіх
перевірити чи є число
квадратом натурального числа. Якщо це так, то для
і
виконується взяття по модулю:
чи
.
У цьому випадку для
перевіряється нерівність
і, якщо ця нерівність виконується, то
— розклад
на два множники.
Якщо ж алгоритм не знайшов розкладу
на два множники, то
— просте число.
Цей алгоритм спочатку перевіряє чи має
прості дільники, які не перевищують
, а потім починає перебір значень
і
для перевірки виконання теореми. У випадку коли шукані значення
і
не знайдено, отримуємо, що число
— просте. Таким чином можна розглядати цей алгоритм і як тест числа
на простоту.
Псевдокод
for
to
do
if
then
return
![{\displaystyle a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ffd2487510aa438433a2579450ab2b3d557e5edc)
end if
end for
for
to
do
for
to
do
if
then
![{\displaystyle A\gets \lfloor {\sqrt {4kn}}\rfloor +d}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8585fa4f33f4657d294613b12659876c4bd82a71)
![{\displaystyle B\gets {\sqrt {A^{2}-4kn}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/c9963f570114b387d1108d8c2af63fbd09ddcf34)
if
then
return
![{\displaystyle gcd(A+B,n)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/09b58672bad242c15f6d15cf81a69b065c5a0e4b)
else if
then
return
![{\displaystyle gcd(A-B,n)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4e5fe549266883e5e40475821fde1d7098aaebbc)
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.