Der erste Schritt des AKS-Primalitätstest-Algorithmus besteht darin, zu überprüfen, ob die eingegebene Zahl eine perfekte Potenz ist. Es scheint, dass dies in der Zahlentheorie eine bekannte Tatsache ist, da das Papier es nicht im Detail erklärte. Kann mir jemand sagen, wie man das in polynomialer Zeit macht? Vielen Dank.
23
Antworten:
Bei einer Zahl n, wenn überhaupt kann sie geschrieben werden als (b> 1), dann b < log ( n ) + 1 . Und für jedes feste b kann mit der binären Suche geprüft werden, ob ein a mit a b = n existiert . Die Gesamtlaufzeit ist daher O ( log 2 n ), denke ich.ab b < log( n ) + 1 b ein einb= n O ( log2n )
quelle
Siehe Bach und Sorenson, Sieve algorithms for perfect power testing, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507, und DJ Bernstein, Detecting perfect powers in im Wesentlichen linear time, Math. Comp. 67 (1998), 1253 & ndash; 1283.
quelle
In der Arbeit habe ich eine interessante und elegante Lösung gefunden: Über die Implementierung des AKS-Klassenprimalitätstests von R.Crandall und J.Papadopoulos, 18. März 2003.
quelle
Irgendwie kann ich zeigen, dass der binäre Suchalgorithmus .O(lg n⋅(lg lg n)2)
Erstens ist , es gibt b < l g n . Algorithmus für binäre Suche: Für jedes b verwenden wir die binäre Suche, um a zu finden .ab=n b<lg n
b a
Jedes Mal, wenn die Berechnung von unter Verwendung einer schnellen Exponentiation Operationen mit l g b = l g l g n kostet . Das verbleibende Problem ist daher die Reichweite von a .ab lg b=lg lg n a
Wenn der maximal mögliche Wert von a ist , benötigt die binäre Suche l g A -OperationenA a lg A
ps: Alle lg sind Basis 2.
Python-Code:
quelle