Cómo verificar si un número es una potencia perfecta en tiempo polinómico


23

El primer paso del algoritmo de prueba de primalidad AKS es verificar si el número de entrada es una potencia perfecta. Parece que este es un hecho bien conocido en la teoría de números ya que el documento no lo explicó en detalle. ¿Alguien puede decirme cómo hacer esto en tiempo polinómico? Gracias.


77
El primer paso del algoritmo AKS es probar si el número de entrada es una potencia perfecta (un número de la forma para algunos enteros c, n> 1), que es diferente de probar si el número es una potencia principal. La prueba para un poder perfecto es el ejercicio 9.44 del libro citado en el artículo ( Modern Computer Algebra por von zur Gathen y Gerhard, 2003). No he leído el libro y no sé la respuesta, pero ¿ha consultado el libro? cn
Tsuyoshi Ito

1
Creo que el primer paso de AKS verifica si el número es una potencia de algún número entero positivo, no necesariamente un primo. Si se supiera cómo verificar una potencia principal en tiempo polinómico antes de AKS, eso ya habría dado un probador de primalidad de tiempo polinomial.
arnab

@ Tsuyoshi Gracias por señalar mi error. No he consultado el libro.
yzll

2
Si le preocupa la pregunta , intente resolver el problema antes de publicarla.
Tsuyoshi Ito

Tsuyoshi / arnab, ¿tal vez deberías volver a publicar como respuestas para que esto pueda aceptarse?
Suresh Venkat

Respuestas:


31

Dado un número n, si se puede escribir como (b> 1), entonces b < log ( n ) + 1 . Y para cada b fija , se puede verificar si existe una a con a b = n mediante la búsqueda binaria. El tiempo total de ejecución es, por lo tanto, O ( log 2 n ) , supongo.abb<log(n)+1baab=nO(log2n)


55
La respuesta de Ramprasad deja fuera el tiempo para hacer la exponenciación que es . Otra forma es elegir b y luego calcular la raíz b de n que tendría un tiempo total de O ( l o g 3 n ) . O(log3n)bbnO(log3n)
David Marquis

1
Una mejora simple que elimina aún más un factor de al elegir solo prime b . loglognb
Chao Xu

16

Ver Bach y Sorenson, algoritmos Sieve para pruebas de potencia perfecta, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507, y DJ Bernstein, Detección de potencias perfectas en tiempo esencialmente lineal, Matemáticas. Comp. 67 (1998), 1253-1283.


También hay un documento de seguimiento con un tiempo de ejecución asintótico mejorado y un tratamiento más simple: DJ Bernstein, HW Lenstra Jr. y J. Pila, Detectando poderes perfectos factorizando en coprimes, Math. Comp. 76 (2007), 385–388.
Erick Wong

3

Encontré una solución interesante y elegante en el documento: Sobre la implementación de la prueba de primalidad de clase AKS, por R.Crandall y J.Papadopoulos, 18 de marzo de 2003.


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: Todos los lg son base 2.

Código de 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.