Як перевірити, чи число є досконалою силою в поліноміальний час


23

Перший крок алгоритму тестування первинності AKS - перевірити, чи є вхідне число ідеальною потужністю. Здається, що це добре відомий факт теорії чисел, оскільки документ не пояснив його детально. Може хтось скаже мені, як це зробити в поліноміальний час? Спасибі.


7
Перший крок алгоритму AKS - перевірити, чи є вхідне число ідеальною потужністю (число форми для деяких цілих чисел c, n> 1), що відрізняється від перевірки, чи є число простий потужністю. Тест на ідеальну потужність - вправа 9.44 книги, цитованої у статті ( Сучасна комп’ютерна алгебра фон Зура Гетхена та Герхарда, 2003). Я не читав книгу і не знаю відповіді, але ви порадилися з книгою? cн
Цуйосі Іто

1
Я вважаю, що перший крок AKS перевіряє, чи число є силою якогось натурального цілого, а не обов'язково простим. Якби було відомо, як перевірити основну потужність у поліноміальний час перед АКС, це вже дало б тестер первинності часу полінома.
arnab

@Tsuyoshi Дякую за вказівку на мою помилку. Я не звертався до книги.
yzll

2
Якщо ви хвилюєте питання , будь ласка, спробуйте вирішити проблему перед тим, як опублікувати її.
Tsuyoshi Ito

Tsuyoshi / arnab, можливо, вам слід переписати як відповіді, щоб це можна було прийняти?
Суреш Венкат

Відповіді:


31

Дано число n, якщо воно взагалі може бути записане у (b> 1), то b < log ( n ) + 1 . І для кожного фіксованого b перевірку, чи існує a з a b = n, можна здійснити за допомогою двійкового пошуку. Тому загальний час роботи - O ( log 2 n ) .abb<log(n)+1baab=nO(log2n)


5
Відповідь Рампрасада залишає час виконати експоненцію, яка є . Інший спосіб - вибрати b, а потім обчислити b- й корінь n, який би мав загальний час O ( l o g 3 n ) . O(log3n)bbnO(log3n)
Девід Маркіз

1
Просте вдосконалення, яке додатково видаляє n- коефіцієнт лише вибраним простим b . loglognb
Чао Сю

16

Див. Бах і Соренсон, алгоритми Сіта для досконалого випробування потужності, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507, і DJ Bernstein, Виявлення досконалих потужностей в принципі лінійного часу, Math. Склад. 67 (1998), 1253-1283.


Існує також подальший документ з покращеним асимптотичним часом роботи та більш простим лікуванням: DJ Bernstein, HW Lenstra Jr. та J. Pila, виявлення досконалих повноважень за допомогою факторингу на coprimes, Math. Склад. 76 (2007), 385–388.
Ерік Вонг

3

Я знайшов цікаве та елегантне рішення у статті: Про впровадження тесту первинності класу AKS, Р.Крандалл та Дж. Пападопулос, 18 березня 2003 року.


2

Якось я можу показати, що алгоритм двійкового пошуку - .O(lg n(lg lg n)2)

По-перше, , є b < l g n . Алгоритм бінарного пошуку: для кожного b ми використовуємо двійковий пошук, щоб знайти a .ab=nb<lg n
ba

Кожен раз, коли обчислення коштувало l g b = l g l g n операцій, використовуючи швидку експоненцію . Тому решта питання - це діапазон a .ablg b=lg lg na

Якщо - максимально можливе значення a , то двійковий пошук потребує l g A операційAalg A

Зауважимо, що , тобто l g A = l g nb lg a=lg n Під час підбиття підсумків

lg A=lg nb
лг А=лг н(11+12+...+1Б)=лг нлг Б=лг нлг лг н

О(лг нлг лг н)

абО(лг н(лг лг н)2)

ps: Всі lg є базовою 2.

Код Python:

#--- a^n ---------------------------------------
def fast_exponentation(a, n):
    ans = 1
    while n:
        if n & 1 : ans = ans * a
        a = a * a
        n >>= 1
    return ans
#------------------------------------------
# Determines whether n is a power a ^ b, O(lg n (lg lg n) ^ 2)
def is_power(n):
    if (- n & n) == n: return True  # 2 ^ k
    lgn = 1 + ( len( bin ( abs ( n ) ) ) - 2)
    for b in range(2,lgn):
        # b lg a = lg n
        lowa = 1L
        higha = 1L << (lgn / b + 1)
        while lowa < higha - 1:
            mida = (lowa + higha) >> 1
            ab = fast_exponentation(mida,b) 
            if ab > n:   higha = mida
            elif ab < n: lowa  = mida
            else:   return True # mida ^ b
    return False
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.