判定整系数多项式在有理数域上的可约性(克罗内克尔判别法)

这篇博客讨论了如何使用克罗内克尔判别法来判定整系数多项式在有理数域上的可约性。虽然代码存在一个问题,即无法正确处理常数项为0的情况,但作者指出对于这样的多项式,它们实际上是可约的。对于追求完美的读者,只需添加一个简单的条件判断就能完善这个算法。

首先声明,此代码并不完善,无法正确判断常数项为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('按回车键退出。')

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值