Чому факторинг великих цілих чисел вважається складним?


17

Я прочитав де - то , що найбільш ефективний алгоритм знайдений можна обчислити фактори в час, але код я написав це O ( п ) або можливо, O ( n log n ) залежно від того, наскільки швидкий поділ і модуль. Я впевнений, що десь неправильно зрозумів, але не знаю куди. Ось, що я написав у формі псевдокоду.O(exp((64/9b)1/3(logb)2/3)O(n)O(nlogн)

function factor(number) -> list
    factors = new list
    if number < 0
        factors.append(-1)
        number = -number
    i = 2
    while i <= number
        while number % i == 0
            factors.append(i)
            number /= i
        i++
    return factors

3
Google "псевдополіном".
Рафаель

Цей алгоритм насправді дуже повільний - якщо число є простим числом, цикл, а ітерація (число) разів. Існує дуже простий аргумент, який дозволяє вам відійти від ітерацій sqrt (число).
gnasher729

Відповіді:


26

Ви плутаєте число з кількістю бітів, необхідних для представлення n . Тут b = кількість бітів, необхідних для представлення n (тому b lg n ). Це робить величезну зміну. Про ( п ) -time алгоритм є O ( 2 б ) -time алгоритм - експоненціально залежить від числа бітів. Для порівняння, знайдений вами "ефективний" алгоритм має тривалість роботи, яка є субекспоненціальною в b .ннб=нбlgнО(н)О(2б)б

Приклад: Розглянемо (2 мільйони). Тоді b = 21 біт достатньо, щоб представити число n . Таким чином, алгоритм , який є O ( 2 б 1 / 3 ) буде набагато швидше , ніж алгоритм , який є O ( 2 б ) . O ( п ) алгоритм відноситься до останньої категорії, тобто, дуже повільно.н=2,000,000б=21нО(2б1/3)О(2б)О(н)

Дивіться https://en.wikipedia.org/wiki/Integer_factorization


1
Я знав, що це щось таке просте.
EnderShadow

3
@EnderShadow: Крім того, кількість чисел, факторинг яких вважається важким за допомогою наявного на даний момент апаратного забезпечення та використовується, наприклад, при шифруванні RSA, має (тобто n > 2 000 ) або близько того. Як вправу, якщо припустити, що комп'ютер може запускати свій алгоритм O ( n ) при, скажімо, мільярді ітерацій в секунду, обчисліть, скільки років знадобиться на коефіцієнт n 2 000 . (Якщо ваша початкова реакція - "це не може бути правильним!", Ви, мабуть, обчислили правильно.)б>1000н>21000О(н)н21000
Ілмарі Каронен

1

у вас тут є приблизно два питання, загальне та конкретне щодо вашого коду. конкретний розглядається в іншій відповіді. загальне питання в заголовку про складність факторингу дуже глибоке. на жаль, немає вагомих наукових доказів того, що факторинг знаходиться поза межами Р, окрім (здебільшого побічних) "багато експертів намагались і не вдалося", а деякі експерти припускають, що це всередині P; її розглядали як одну з головних (і її дуже важко вирішити) відкритих проблем теорії складності. після десятиліть "важкої атаки" найкращі алгоритми експоненціальні. Складність факторингу - одна з "небагатьох виняткових проблем", яка, як відомо, лежить в основі "між" P і NP завершеною, але досі не була класифікована як.

як зазначається, складність не була великою проблемою, поки вона не стала використовуватися ("приблизно") в криптосистемах RSA в середині 1980-х, де криптографічна безпека залежить від припущення. (Дві інші "не зовсім заохочуючі" пов'язані точки даних: Алгоритм Шорс для квантового факторингу та первинності тестування первинності P був підтверджений на початку 2000-х у відомому / знаменитому алгоритмі AKS .) Можливим позитивним результатом буде такий його в квазіполіномічний час , який слабший, ніж NP повний (якщо припустимо, що P ≠ NP і NP повний має нижню межу експоненціального часу ), але технічно все ще "важкий".

поки що не знайшли великого опитування на цьому ключовому субєкті. проте також див


Ще один можливий, здавалося б, "кращий випадок" сценарій полягає в тому, що факторинг може бути в P, але досі не існує можливого алгоритму. ака- галактичні алгоритми
vzn

Слід зазначити, що RSA - це факторинг продукту двох великих прайменів (де хтось знає праймери та просто їх множив, а хтось інший отримує продукт і повинен знайти праймери). Цілком можливо, що може існувати алгоритм, який може визначати продукти двох великих прайменів, але не продукти більш ніж двох великих прайменів. Так само як факторингові числа, які є великими праймерами (але невідомі раніше великими праймерами), можна зробити за багаточлен.
gnasher729
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.