La première étape de l'algorithme de test de primalité AKS consiste à vérifier si le numéro d'entrée est une puissance parfaite. Il semble que ce soit un fait bien connu de la théorie des nombres, car l'article ne l'explique pas en détail. Quelqu'un peut-il me dire comment faire cela en temps polynomial? Merci.
23
Réponses:
Étant donné un nombre n, s'il peut être écrit sous la (b> 1), alors b < log ( n ) + 1 . Et pour chaque b fixe , vérifier s'il existe un a avec un b = n peut être fait en utilisant la recherche binaire. La durée totale de fonctionnement est donc O ( log 2 n ) je suppose.uneb b < log( n ) + 1 b une uneb= n O ( log2n )
la source
Voir Bach et Sorenson, Sieve algorithms for perfect power testing, Algorithmica 9 (1993), 313-328, DOI: 10.1007 / BF01228507, et DJ Bernstein, Detecting perfect pouvoirs in essentiellement linear time, Math. Comp. 67 (1998), 1253 à 1283.
la source
J'ai trouvé une solution intéressante et élégante dans l'article: sur la mise en œuvre du test de primalité de classe AKS, par R.Crandall et J.Papadopoulos, 18 mars 2003.
la source
D'une certaine manière, je peux montrer que l'algorithme de recherche binaire est .O ( l g n ⋅ ( l g l g n )2)
Tout d'abord, , il y a b < l g n . Algorithme de recherche binaire: Pour chaque b , nous utilisons la recherche binaire pour trouver a .uneb= n b < l g n
b une
Chaque fois, le calcul d' coûte l g b = l g l g n opérations en utilisant une exponentiation rapide . Par conséquent, le problème restant est la plage de a .uneb l g b = l g l g n une
Si est la valeur maximale possible de a , alors la recherche binaire a besoin de l g opérations AUNE une l g UNE
Notez que , soit l g A = l g nb l g a = l g n
résumer,
∑lgA=lgn⋅(1
ps: Tous les lg sont en base 2.
Code Python:
la source