Sympy对含负复指数的多项式调用factor_list异常问题咨询
问题原因解答
一、y2报错的具体原因
sym.factor_list处理一元多项式时,会默认将每个含变量的因子整形成首一(最高次项系数为1)的形式,该过程需要提取因子的首项常数系数。- 对于y2这种仅含单个一次因子的多项式:首项系数为
exp(-4*I*pi/7),sympy内部对一次多项式的校验分支存在缺陷,提取首项系数后,错误将整体表达式判定为非多项式,触发PolynomialError异常。 - 正指数版本y1可以正常运行,是因为正指数单位根在内部代数数化简时走了不同的处理分支,没有触发校验失败的逻辑。
- 该问题属于sympy因式分解模块处理代数数系数一次多项式的边缘case缺陷。
二、y3中无变量复指数项未归入常数因子的原因
- y3是二次多项式,不会触发一次多项式的缺陷分支,可正常完成因式分解。
- 要将因子
exp(-4*I*pi/7)*q -1整形成首一形式,需要提取首项系数exp(-4*I*pi/7),平方后得到exp(-8*I*pi/7),利用复指数周期为2*pi的性质化简后等价于exp(6*I*pi/7)。 - sympy当前版本的
factor_list仅会自动合并数值类型的常数到最外层的总常数项,对于代数数类型的复指数常数,不会自动归并到总常数中,就会作为单独的因子项出现在列表里。
临时解决方案
- 针对y2的报错:可以先将表达式转为Poly对象再生成表达式后分解,避开校验缺陷:
print(sym.factor_list(sym.Poly(y2, q).as_expr(), q))
- 针对常数因子未合并的问题:可以手动过滤因子列表,将不含变量q的因子乘入总常数:
const, factors = sym.factor_list(y3, q) merged_factors = [] for fac, pow in factors: if q in fac.free_symbols: merged_factors.append((fac, pow)) else: const *= fac ** pow # const为合并后的总常数,merged_factors为仅含变量的因子列表
内容的提问来源于stack exchange,提问作者Emi
相关产品推荐
相关产品推荐

