web-dev-qa-db-fra.com

Vérifier efficacement si deux nombres sont co-premiers (relativement premiers)?

Quelle est la façon la plus efficace ("Pythonic") de tester/vérifier si deux nombres sont co-premiers (relativement premiers) en Python.

Pour l'instant j'ai ce code:

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def coprime(a, b):
    return gcd(a, b) == 1

print(coprime(14,15)) #Should be true
print(coprime(14,28)) #Should be false

Le code de vérification/test si deux nombres sont relativement premiers peut-il être considéré comme "Pythonic" ou existe-t-il une meilleure façon?

10
Erba Aitbayev

La seule suggestion d'amélioration pourrait être avec votre fonction gcd. À savoir, vous pouvez utiliser gcd défini dans math (pour Python 3.5) pour un boost de vitesse.

Définition de coprime2 qui utilise la version intégrée de gcd:

from math import gcd as bltin_gcd

def coprime2(a, b):
    return bltin_gcd(a, b) == 1

Vous avez presque réduit de moitié la vitesse d'exécution en raison du fait que math.gcd est implémenté dans C ( voir math_gcd dans mathmodule.c ):

%timeit coprime(14, 15)
1000000 loops, best of 3: 907 ns per loop

%timeit coprime2(14, 15)
1000000 loops, best of 3: 486 ns per loop

Pour Python <= 3.4 vous pouvez utiliser fractions.gcd mais, comme indiqué dans un commentaire de @ user2357112, il n'est pas implémenté dans C. En fait, il n'y a vraiment aucune incitation à l'utiliser réellement, son implémentation est exactement la même que la vôtre.