本文使用python语言实现欧几里得算法、连续整数检测算法、质因数求积算法三种方法求最大公约数,并且附加埃拉托色尼筛选法求质数。
有两种思想,就像摆放在天鹅绒上的宝石那样煜煜生辉,一个是微积分,另一个就是算法。微积分以及在微积分基础上建立起来的数学分析体系造就了现代科学,而算法则造就了现代世界。
By:大卫.柏林斯基
个人博客–点木
欢迎点击!!!!
函数方法定义:
# 求解m、n两值的最大公约数
gcd(m,n):
函数调用:
if __name__ == '__main__':
print(gcd1(60,24))
print(gcd2(45,24))
print(gcd3(100,24))
欧几里得算法
- 第一步:如果n=0,返回m的值作为结果,同时过程结束;否则,进入第二步
- 第二步:m除以n,将余数赋给r。
- 第三步:将n的值赋给m,将r的值赋给n,返回第一步。
# 欧几里得算法
# gcd1(60,24)=12
def gcd1(m,n):
if n==0:
return m;
else:
return gcd1(n,m%n);
连续整数检测算法
- 第一步:求出m、n中较小的一个数t
- 第二步:判断t是否能被m、n同时整除,能够则返回t,不能则t=t-1
# 连续整数检测算法
# gcd2(60,24)=12
def gcd2(m,n):
t=n if m>n else m
while not (m%t==0 and n%t==0):
t=t-1
return t
质因数求积算法
- 第一步:分别求出m、n的所有质因数
- 第二步:返回两个质因数组中含有的公共质因数的积
# 质因数求法(我们平时所使用的方法)
# gcd3(60,24)=12
def gcd3(m,n):
# 求解质因数算法
M=primeFactors(m)
N=primeFactors(n)
result=1
for i in range(len(M)):
j=0
while j <len(N):
if N[j]==M[i]:
result=result*M[i]
del N[j]
break
else:
j=j+1
return result
- 因为此算法需要求出正整数的质因数,因此给出一种求解算法
埃拉托色尼筛选法求质数
# input:一个正整数
# output:包含所有小于等于n的质数的数组L
# sieve(20)=[2, 3, 5, 7, 11, 13, 17, 19]
def sieve(num):
A=[]
# A数组本应为2—num的一个数组,为了简化代码,使数字和下标对应。
for i in range(num+1):
A.append(i)
for i in range(2,math.floor(math.sqrt(num))):
if A[i]!=0:
j=i*i
while j<=num:
A[j]=0
j=j+i
L=[]
for i in range(num+1):
if A[i]==1 or A[i]==0:
continue
else:
L.append(A[i])
del A
return L
正整数质因数求解
# input:一个正整数
# output:质因数数组L,从小到大排列
# primeFactors(20)=[2, 3, 7]
def primeFactors(num):
Num=sieve(num);
L=[]
for i in Num:
while num%i==0:
num=num/i
L.append(i)
return L