Как проверить, является ли число совершенной степенью за полиномиальное время

23

Первым шагом алгоритма тестирования простоты AKS является проверка, является ли входное число идеальной степенью. Похоже, что это хорошо известный факт в теории чисел, поскольку в статье это не объясняется подробно. Может кто-нибудь сказать мне, как сделать это за полиномиальное время? Спасибо.

yzll
источник
7
Первым шагом алгоритма AKS является проверка того, является ли входное число идеальной степенью (число в форме для некоторых целых чисел c, n> 1), что отличается от проверки, является ли число простой степенью. Тест на совершенную силу - упражнение 9.44 книги, процитированной в статье ( Современная компьютерная алгебра фон Гурена и Герхарда, 2003). Я не читал книгу и не знаю ответа, но вы обращались к книге? cn
Цуёси Ито
1
Я считаю, что первый шаг AKS проверяет, является ли число степенью некоторого положительного целого числа, а не обязательно простого числа. Если бы было известно, как проверить простую мощность за полиномиальное время до AKS, это уже дало бы тестер примитивности за полиномиальное время.
Арнаб
@Tsuyoshi Спасибо за указание на мою ошибку. Я не советовался с книгой.
yzll
2
Если вас волнует вопрос , пожалуйста, попробуйте решить проблему, прежде чем опубликовать его.
Цуёси Ито
Tsuyoshi / arnab, может быть, вы должны сделать репост в ответах, чтобы это можно было принять?
Суреш Венкат

Ответы:

31

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

Ramprasad
источник
5
Ответ Рампрасада оставляет время для возведения в степень, которое составляет . Другой способ - выбрать b, а затем вычислить b- й корень из n, который будет иметь общее время O ( l o g 3 n ) . O(log3n)bbnO(log3n)
Дэвид Маркиз
1
Простое улучшение, которое дополнительно удаляет коэффициент выбирая только простое число 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, Обнаружение совершенных способностей путем разложения на простые числа, Math. Комп. 76 (2007), 385–388.
Эрик Вонг
3

Я нашел интересное и элегантное решение в статье: «О выполнении теста на простоту класса AKS», Р. Крэндалл и Дж. Пападопулос, 18 марта 2003 г.

Plomb
источник
2

O(lg n(lg lg n)2)

ab=nb<lg n
ba .

ablg b=lg lg na .

Aalg A операций.

b lg a=lg n

lg A=lg nb
lg A=lg n(11+12+...+1B)=lg nlg B=lg nlg lg n

O(lg nlg lg n)

abO(lg n(lg lg n)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
Kevin
источник