Python / Numpy 内置 LCM

计算科学 Python scipy 麻木的
2021-12-12 10:16:09

我可以编写一个函数来查找整数数组的 LCM(最小公倍数),但我认为它一定是在 numpy 或 scipy 中实现的,并且期待这样numpy.lcm()做。我很惊讶地发现没有这样的事情。也许我在错误的地方寻找。因此,如果您知道定义了这个简单函数的任何其他库,请遵守。

4个回答

为什么不自己定义它,正如罗塞塔代码示例中所建议的那样:http: //rosettacode.org/wiki/Least_common_multiple#Python

例如,您可以在此基础上构建(通过此库):

import fractions
def lcm(a,b): return abs(a * b) / fractions.gcd(a,b) if a and b else 0

在 Numpy v1.17(在撰写本文时,它是非发布开发版本)中,有一个lcm函数可以用于两个数字,例如:

import numpy as np
np.lcm(12, 20)

或用于多个数字,例如:

np.lcm.reduce([40, 12, 20])

还有一个gcd功能。

我一点也不惊讶它不在 Numpy 中。Numpy 专注于浮点和数组/矩阵计算,而不是数论函数和整数运算。我可以理解它在内部需要一个gcd函数来进行一些奇特的数组/步幅计算,但这真的不是图书馆的重点。Sage将是我首先要看的地方,而不是 numpy。

确实有这个功能,而且看起来很快:

sage: %timeit lcm(range(1,1000))
100 loops, best of 3: 820 µs per loop

如果您正在进行数论计算,我建议您使用 Sage 而不是纯 Python。您会发现通常它已经实现了更多您需要的东西。

如果速度是一个问题,你应该看看这个线程:https ://stackoverflow.com/questions/15569429/numpy-gcd-function它解释了你如何实际上可以轻松地编写一个更快的版本gcd(比fractions模块中的 gcd)在 python 中,然后当然是它的一个lcm函数,就像 blochwave 的答案一样。