1.辗转相除法求两个整数的最大公约数(log用来记录运算过程,可删除)
import math
def rollDivision(f1,f2,log):
if(isinstance(f1,int) and isinstance(f2,int)):
if f2>f1:
temp=f1
f1=f2
f2=temp
elif f1==f2:
return f2
else:
pass
p=math.floor(f1/f2)
r=f1-f2*p
log.append([f1,f2,p,r])
if r!=0:
result=rollDivision(f2,r,log)
else: #r==
result=f2
return result
else:
return 'input var type error'
跳出循环条件是确定的,也可以不用递归,使用while循环:
def rollDivision(f1,f2,log):
if(isinstance(f1,int) and isinstance(f2,int)):
if f2>f1:
temp=f1
f1=f2
f2=temp
elif f1==f2:
return f2
else:
pass
p=math.floor(f1/f2)
r=f1-f2*p
log.append([f1,f2,p,r])
while r!=0:
f1=f2
f2=r
p=math.floor(f1/f2)
r=f1-f2*p
log.append([f1,f2,p,r])
return f2
else:
return 'input var type error'
2.为了将辗转相除法应用到多项式上,先定义多项式的除法:
用list表示多项式,list[i]=i次的多项式系数;注意要pop最高位的系数0,否则下一步迭代时会产生division zero的错误
import copy
def popZero(f):
checkZero=len(f)
for i in range(checkZero):
if abs(f[-1])<1e-9:
f.pop()
else:
break
def polyDivision(f1,f2):
popZero(f1)
popZero(f2)
degree1=len(f1)-1
degree2=len(f2)-1
if degree1<degree2:
temp=f1
f1=f2
f2=temp
tempd=degree1
degree1=degree2
degree2=tempd
divisend=copy.deepcopy(f1)
divisor=copy.deepcopy(f2)
pdegree=degree1-degree2
p=[0 for i in range(pdegree+1)]
for i in range(pdegree+1):
p[i-1]=divisend[-1]/divisor[-1]
for j in range(len(divisor)):
divisend[-j-1]=divisend[-j-1]-p[i-1]*divisor[-j-1]
divisend.pop()
r=divisend
popZero(r)
return p,r
3.对多项式应用辗转相除法
def polyRollDivision(f1,f2,log):
if(isinstance(f1,list) and isinstance(f2,list)):
if len(f2)>len(f1):
temp=f1
f1=f2
f2=temp
else:
pass
p,r=polyDivision(f1,f2)
log.append([f1,f2,p,r])
if len(r)>1:
result=polyRollDivision(f2,r,log)
else:
result=f2
return result
else:
return 'input var type error'