Метод Лемана

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

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

Опис[ред. | ред. код]

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

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

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

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

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

і

.

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

Теоретичне обґрунтування[ред. | ред. код]

Формулювання теореми[ред. | ред. код]

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

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

Лема

Нехай виконано умови теореми. Тоді можна знайти такі натуральні числа , що і .[3]

Доведення теореми[ред. | ред. код]

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

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

Алгоритм[ред. | ред. код]

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

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

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

чи .

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

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

Псевдокод[ред. | ред. код]

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, яке є квадратом: . Відповідно, і . Тоді , задовольняє нерівності і є дільником числа .
У результаті, ми розклали число на два множники: і .

Складність[ред. | ред. код]

Кількість операцій[ред. | ред. код]

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

Складність другого кроку оцінюється в операціях перевірки чи є число повним квадратом. Кількість операцій оцінюється зверху величиною .
Таким чином складність усього алгоритму — операцій[6].

Залежність від розрядності[ред. | ред. код]

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

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

Порівняння з іншими методами[ред. | ред. код]

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

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

Можливість паралельних обчислень[ред. | ред. код]

Загальна ідея[ред. | ред. код]

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

Крок 1:

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

Крок 2:

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

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

Реалізація із застосуванням технології GPGPU[ред. | ред. код]

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

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

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

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

Нехай - кількість доступних ядер графічного процесора, - кількість елементів множини . Розглянемо два випадки:

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

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

  1. Перевірити чи є число квадратом натурального числа.
  2. У випадку отримання позитивного результату на попередньому пункті, обчислити і .
  3. Для значень і перевірити умову .
  4. Для значень і , що пройшли останню перевірку, перевірити виконання умови .

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

Примітки[ред. | ред. код]

  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.