好吧,这只是一个思路,而数学上有更妙的思路,我才看到的,辗转相除法。
所以数学学的不深的诸君,不要再探索数学上的算法了!
至少我现在,开始不求甚解了,先速度的过完一本书,再回头看一些小项目,不再纠结基于数学的算法。例如如何判断一个数是素数,数学大神和it大神已经做到了极致,而随便抽出一个经典数学算法我都看不懂!
python求两个数字的最大公约数(辗转相除法)
240~670 ns
def gcd(a, b): #抄自百度百科
while a != 0:
a, b = b % a, a
return b
lcm(a, b) = (a*b)/gcd(a,b) (证明可以根据数论里的“每个数都可以表示成素因子的乘积”)
可以这么理解,两个数a、b的最大公约数m的关系,a=a’ * m,b=b’ * m,m就是a、b的因子,而a’和b’是素数,于是一眼就看出a、b的公倍数就是a’ * b’ * m,即a*b/m
下面是我的硬求出来的
平均耗时9.09 µs
#求两个数的最大公约数
from random import randint
# a=randint(1,10000)
# b=randint(1,10000)
def 最大公约数(a,b):
if a>b:a,b=b,a
if b/a%1==0:
return a#print("a:%d是b:%b的约数,最大公约数是:%d"%(a,b,a))
# return
z={
}
def 求质数因子组(a):
n=a
while 1:
while 1:
if (t:=n**0.5)%1==0:n=t
else:break
for i in range(2,int(t)):
if n/i%1==0:
z[i]=1
n<