【问题标题】:Efficiently check if two numbers are co-primes (relatively primes)?有效地检查两个数字是否是互质数(相对质数)?
【发布时间】:2017-02-02 09:20:26
【问题描述】:

在 Python 中测试/检查两个数字是否互质(相对质数)的最有效(“pythonic”)方法是什么。

目前我有这个代码:

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

检查/测试两个数字是否互质的代码可以被认为是“Pythonic”还是有更好的方法?

【问题讨论】:

  • 看起来不错。
  • 你当然可以使用math.gcd,这是一个包含在内的电池,应该更高效。
  • 注意:math.gcd 是 Python3.5 中的新内容,之前是 fractions.gcd
  • 如果这是您认为可以改进的工作代码,请参阅Code Review

标签: python python-3.x algorithm primes


【解决方案1】:

唯一的改进建议可能是您的函数gcd。也就是说,您可以使用在math(对于Python 3.5)中定义的gcd 来提高速度。

定义使用gcd的内置版本的coprime2

from math import gcd as bltin_gcd

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

由于math.gcdC (see math_gcd in 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

对于 Python <= 3.4,您可以使用 fractions.gcd,但正如 @user2357112 的评论中所述,C 中没有实现它。实际上,真的没有实际使用它的动机,its implementation is exactly the same as yours.

【讨论】:

  • 不过,在 pre-3.5 上几乎没有什么好处,因为 fractions.gcd 是用 Python 而不是 C 编写的。
  • 老问题,但 Python 中的数学模块函数通常不适合大数字。它可能会崩溃。我会选择 SymPy 或 PARI/GP 之类的东西
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 2015-04-18
  • 2011-11-19
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
相关资源
最近更新 更多