L'algorithme d'Euclide (calcule gcd) est très rapide. Lorsque les deux nombres sont tirés uniformément au hasard dans [1, n], le nombre moyen d'étapes pour calculer leur gcd est O(log n). La moyenne du temps de calcul requis pour chaque étape est quadratique en le nombre de chiffres.
Il existe des alternatives qui effectuent un peu mieux (c'est à dire, chaque étape est subquadratic dans le nombre de chiffres), mais ils ne sont efficaces que sur de très grands nombres entiers. Voir, par exemple, Sur l'algorithme de Schönhage et subquadratic entier pgcd de calcul.
Je voudrais commenter que c'est un peu grossier à la mesure de la complexité des algorithmes de calcul sans prise de coûts d'opérations arithmétiques en compte. Le pire scénario # de pas est O(log n) ainsi, lorsque les deux nombres sont entrées successives dans la séquence de Fibonacci. Shved: j'ai fait prendre le coût en considération. cf. la phrase "La moyenne du temps de calcul requis pour chaque étape est quadratique en le nombre de chiffres." merci.
si vous êtes en cours d'exécution sur une machine pour laquelle la division/le reste est sensiblement plus cher que les quarts de travail, envisager PGCD binaire.
Merci, intéressant à lire oui, un très bon article là. Juste mis en œuvre cette en f#, et ses plus de 2x plus rapide que les traditionnels Euclide du PGCD, ne peut pas donner de chiffres exacts, comme il y a un autre code poluting mes mesures, mais son > 2x plus rapide. Bonne trouvaille de Jason. Mise à jour: Avez de meilleurs chiffres dans l'isolement: Itérations: 100000, Euclide a Pris: 27 ms est observée, PGCD Binaire Outil: 11 ms (cela fait donc environ 40% d'Euclide). Génial! Soin de faire un gist de votre F# ?
L'algorithme d'Euclide (calcule
gcd
) est très rapide. Lorsque les deux nombres sont tirés uniformément au hasard dans[1, n]
, le nombre moyen d'étapes pour calculer leurgcd
estO(log n)
. La moyenne du temps de calcul requis pour chaque étape est quadratique en le nombre de chiffres.Il existe des alternatives qui effectuent un peu mieux (c'est à dire, chaque étape est subquadratic dans le nombre de chiffres), mais ils ne sont efficaces que sur de très grands nombres entiers. Voir, par exemple, Sur l'algorithme de Schönhage et subquadratic entier pgcd de calcul.
Le pire scénario # de pas est O(log n) ainsi, lorsque les deux nombres sont entrées successives dans la séquence de Fibonacci.
Shved: j'ai fait prendre le coût en considération. cf. la phrase "La moyenne du temps de calcul requis pour chaque étape est quadratique en le nombre de chiffres."
merci.
OriginalL'auteur jason
si vous êtes en cours d'exécution sur une machine pour laquelle la division/le reste est sensiblement plus cher que les quarts de travail, envisager PGCD binaire.
oui, un très bon article là.
Juste mis en œuvre cette en f#, et ses plus de 2x plus rapide que les traditionnels Euclide du PGCD, ne peut pas donner de chiffres exacts, comme il y a un autre code poluting mes mesures, mais son > 2x plus rapide. Bonne trouvaille de Jason.
Mise à jour: Avez de meilleurs chiffres dans l'isolement: Itérations: 100000, Euclide a Pris: 27 ms est observée, PGCD Binaire Outil: 11 ms (cela fait donc environ 40% d'Euclide). Génial!
Soin de faire un
gist
de votre F# ?OriginalL'auteur Jason S