首先声明,此代码并不完善,无法正确判断常数项为0的非零整系数多项式在有理数域上的可约性,实际上,常数项为0的非零整系数多项式显然是可约的,因此我并没有再加以修改(懒癌犯了),如果是完美主义者,只需再加个条件判断语句即可。
import numpy as np
from scipy.linalg import solve
var = locals()
z=np.poly1d([1])/np.poly1d([1])
req=z[1]
n1=int(input('请输入f(x)的次数:'))
coes=[]
for i in range(n1+1):
coe=int(input('请输入f(x){}次项系数:'.format(n1-i)))
coes.append(coe)
f=np.poly1d(coes)
n2=int(n1/2)
def value(n):
a={1,-1}
for i in range(2,n+1):
if n % i ==0:
a.add(i)
a.add(-i)
return list(a)
for i in range(n2 + 1):
n3=f(i)
var['g'+str(i)+'s']=value(n3)
listc=[]
for i in range(n2+1):
listc.append(var['g'+str(i)+'s'])
def zheway(l1,l2):
c=[]
for a in l1:
for b in l2:
d=a+[b]
c.append(d)
return c
i=0
l=[[]]
while i<(n2+1):
l=zheway(l,listc[i])
i+=1
for i in l:
lista=[]
for y in range(n2+1):
var['list'+str(y)]=[]
for z in range(n2+1):
var['list'+str(y)].append(y**(n2-z))
lista.append(var['list'+str(y)])
listb=[]
for x in i:
listb.append(x)
a = np.array(lista)
b = np.array(listb)
re = solve(a, b)
res=list(re)
g=np.poly1d(res)
if len(g.c)==1:
pass
else:
r=f/g
if r[1]==req:
print('该多项式可约。')
break
else:
print('该多项式不可约。')
input('按回车键退出。')
这篇博客讨论了如何使用克罗内克尔判别法来判定整系数多项式在有理数域上的可约性。虽然代码存在一个问题,即无法正确处理常数项为0的情况,但作者指出对于这样的多项式,它们实际上是可约的。对于追求完美的读者,只需添加一个简单的条件判断就能完善这个算法。
1181

被折叠的 条评论
为什么被折叠?



