Come verificare se un numero è un potere perfetto in tempi polinomiali


23

Il primo passo dell'algoritmo di test della primalità di AKS è verificare se il numero di input è una potenza perfetta. Sembra che questo sia un fatto ben noto nella teoria dei numeri poiché il documento non lo ha spiegato nei dettagli. Qualcuno può dirmi come farlo in tempo polinomiale? Grazie.


7
Il primo passo dell'algoritmo AKS è verificare se il numero di input è una potenza perfetta (un numero della forma per alcuni numeri interi c, n> 1), che è diverso dal verificare se il numero è una potenza primaria. Il test per un potere perfetto è l'Esercizio 9.44 del libro citato nel documento ( Modern Computer Algebra di von zur Gathen e Gerhard, 2003). Non ho letto il libro e non conosco la risposta, ma hai consultato il libro? cn
Tsuyoshi Ito,

1
Credo che il primo passo di AKS controlli se il numero è una potenza di un numero intero positivo, non necessariamente un numero primo. Se fosse noto come controllare una potenza primaria in tempo polinomiale prima dell'AKS, ciò avrebbe già fornito un tester di primalità del tempo polinomiale.
Arnab,

@Tsuyoshi Grazie per aver segnalato il mio errore. Non ho consultato il libro.
yzll

2
Se ti interessa la domanda , prova a risolvere il problema prima di pubblicarla.
Tsuyoshi Ito,

Tsuyoshi / arnab, forse dovresti ripubblicare come risposte in modo che questo possa essere accettato?
Suresh Venkat,

Risposte:


31

Dato un numero n, se possibile può essere scritto come (b> 1), quindi . E per ogni fissa , verificare se esiste una con può essere fatto usando la ricerca binaria. Il tempo di esecuzione totale è quindi immagino. b < log ( n ) + 1 b a a b = n O ( log 2 n )abb<log(n)+1baab=nO(log2n)


5
La risposta di Ramprasad lascia fuori il tempo di fare l'espiazione che è . Un altro modo è scegliere b, quindi calcolare la b radice di n che avrebbe un tempo totale di O ( l o g 3 n ) . O(log3n)bbnO(log3n)
David Marquis,

1
Un semplice miglioramento che rimuove ulteriormente un fattore scegliendo solo il primo b . loglognb
Chao Xu,

16

Vedi Bach e Sorenson, algoritmi Sieve per test di potenza perfetti, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507 e DJ Bernstein, Rilevamento di poteri perfetti in un tempo essenzialmente lineare, Math. Comp. 67 (1998), 1253-1283.


C'è anche un documento di follow-up con un tempo di esecuzione asintotico migliorato e un trattamento più semplice: DJ Bernstein, HW Lenstra Jr. e J. Pila, Rilevando poteri perfetti prendendo in considerazione coprimi, matematica. Comp. 76 (2007), 385–388.
Erick Wong,

3

Nel documento ho trovato una soluzione interessante ed elegante: sull'implementazione del test di primalità della classe AKS, di R.Crandall e J.Papadopoulos, 18 marzo 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: tutti i lg sono base 2.

Codice 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.