Метод Лемана
Алгоритм Лемана (або алгоритм Шермана Лемана) детерміновано розкладає задане натуральне число на множники за арифметичних операцій. Алгоритм запропонував американський математик Шерман Леман в 1974 році[1]. Цей алгоритм став першим алгоритмом факторизації цілих чисел, складність якого менша, ніж . На сьогодні він має суто історичний інтерес і, як правило, не застосовується на практиціШаблон:Sfn.
Опис
Спочатку алгоритм перевіряє чи має прості дільники, які не перевищують .
Далі метод Лемана розвиває ідеї, що закладені в алгоритмі Ферма, і шукає дільники числа , використовуючи рівність для деякого цілого числа . Він базується на наступній теореміШаблон:Sfn.
Формулювання теореми
Нехай — додатне непарне ціле число, а — ціле число таке, що . Якщо , де і прості, а також
- , то тоді існують такі невід'ємні цілі числа , , , що
- ,
- ,
- , якщо непарне,
і
- .
Якщо — просте, то таких чисел , , не знайдеться.[1]
Теоретичне обґрунтування
Формулювання теореми
Нехай можна записати як добуток двох непарних взаємно простих чисел, що задовольняють нерівностям . Тоді знайдуться такі натуральні числа і , що
1. Виконується рівність при ,
2. Виконується нерівність .Шаблон:Sfn
Для доведення цієї теореми потрібна наступна лема.
Лема
Доведення теореми
Припустимо, що і — непарні дільники числа і нехай і , де і задовольняють твердження леми, тоді виконується рівність
,
де . В силу леми, ціле число задовольняє нерівності . Отже, виконано перше твердження теореми.
Для доведення другого твердження покладемо , так як , то і . Використовуючи оцінку зверху для , отримуємо
.
З цього випливає, що . Теорему доведеноШаблон:Sfn.
Алгоритм
Нехай — непарне і .
Крок 1. Для простих перевірити умову . Якщо на цьому кроці не вдалося розкласти на множники, то переходимо до кроку 2.
Крок 2. Якщо на кроці 1 дільник не знайдено і — складене число, то , де - прості числа, і . Тоді для всіх і всіх перевірити чи є число квадратом натурального числа. Якщо це так, то для і виконується взяття по модулю:
- чи .
У цьому випадку для перевіряється нерівність і, якщо ця нерівність виконується, то — розклад на два множники. Якщо ж алгоритм не знайшов розкладу на два множники, то — просте числоШаблон:Sfn.
Цей алгоритм спочатку перевіряє чи має прості дільники, які не перевищують , а потім починає перебір значень і для перевірки виконання теореми. У випадку коли шукані значення і не знайдено, отримуємо, що число — просте. Таким чином можна розглядати цей алгоритм і як тест числа на простоту.Шаблон:Sfn
Псевдокод
for to do
ifthenreturn
end if
end for
for to do
fortodoifthenifthenreturn
else ifthenreturn
end if
end if
end for
end for
Пояснення:
Функція повертає , якщо є повним квадратом і — в іншому випадку.
Функція повертає найбільший спільний дільник чисел і .[2]
Приклад
Розглянемо приклад , .
Для перевіряємо, чи є число дільником числа . Не важко переконатись, що таких немає. Переходимо до наступного кроку.
Для всіх і всіх перевіряємо, чи є число квадратом натурального числа. У нашому випадку для і вираз дорівнює 256, яке є квадратом: . Відповідно, і .
Тоді , задовольняє нерівності і є дільником числа .
У результаті, ми розклали число на два множники: і .
Складність
Кількість операцій
На першому кроці треба зробити операцій для пошуку малих дільників числа .
Складність другого кроку оцінюється в операціях перевірки чи є число повним квадратом. Кількість операцій оцінюється зверху величиною .
Таким чином складність усього алгоритму — операційШаблон:Sfn.
Залежність від розрядності
Для великих чисел існує залежність часу виконання операцій від їх розрядності. Наприклад, складання двох чисел потребує часу, що лінійно залежить від довжини (більшого з них), а час множення й ділення ще більший, тобто, залежить від довжини чисел нелінійно (поліноміально). Отже, метод потребує поліноміальної кількості операцій (), але час кожної операції щонайменше лінійно залежить від довжини (розрядності) числа. Таким чином виникає експоненційна залежність часу виконання алгоритму від розрядності числа, що факторизується — [2].
, де — розрядність.
Порівняння з іншими методами
Як покращення методу Ферма, метод Лемана також істотно залежить від відстані між множниками числа: Шаблон:Джерело?. Однак, якщо різниця між множниками мала, то метод Лемана значно програє методу ФермаШаблон:Джерело?.
Для чисел із невеликим простим дільником ситуація інша — метод Лемана завдяки послідовному діленню на першому кроці досить швидко виділить простий множник[2].
Можливість паралельних обчислень
Загальна ідея
Паралельна реалізація базується на наступному підході:[2]
Крок 1:
Крок 2:
Застосування цього підходу дозволяє отримати лінійне прискорення при збільшенні кількості процесів на комп'ютері з розділеною пам'яттю.[2]
Реалізація із застосуванням технології GPGPU
Для успішної реалізації алгоритму із застосуванням технології GPGPU треба вирішити два питання:[3]
- Для кожної операції алгоритму вирішити, де варто її виконувати: на ЦП чи на графічному процесорі.
- Визначити кількість ядер графічного процесора, що застосовуються.
Описаний вище підхід можна застосовувати для розбиття задачі.[3]
Крок 2: Усі операції цього кроку слід виконувати на графічному процесорі.
Нехай - кількість доступних ядер графічного процесора, - кількість елементів множини . Розглянемо два випадки:
- : Використаємо ядер графічного процесора.
- : Виконаємо ітерацій. На кожній ітерації виконуємо операцій ділення на ядрах. У кінці кожної ітерації визначаємо завершити процес чи ні.
Крок 2: Розподілити між ядрами графічного процесора так же, як і в кроці 1. На кожному ядрі виконати 1-3:
- Перевірити чи є число квадратом натурального числа.
- У випадку отримання позитивного результату на попередньому пункті, обчислити і .
- Для значень і перевірити умову .
- Для значень і , що пройшли останню перевірку, перевірити виконання умови .
Останній пункт краще виконувати на ЦП, оскільки ймовірність виконання цих операцій досить мала, а така перевірка на графічному процесорі відбувається досить повільно[3].
Примітки
Література
- ↑ 1,0 1,1 Шаблон:Стаття
- ↑ 2,0 2,1 2,2 2,3 2,4 Шаблон:Стаття
- ↑ 3,0 3,1 3,2 Шаблон:Стаття