Python Sympy如何修改已构造Poly多项式的定义域(多项式环)
Sympy中已构造Poly对象的定义域修改实现
问题描述
在基于Python实现通用数域筛法的过程中,核心依赖Sympy完成多项式相关运算,开发中遇到实际问题:
- 直接通过函数返回的浮点数列表构造多项式时,示例代码如下:
该方式构造的Poly对象默认归属实数域RR,需要将其切换为自定义域D(最终落地为from sympy import Poly from sympy.abc import x # gpc(N,m) 返回浮点数列表 g = Poly(gpc(N,m), x)ZZ[x]整数多项式环,同时需要支持通用的域切换能力) - 已知构造Poly时可通过传入
domain=D参数直接指定目标域,对应修改方式为:
但该方案无法覆盖全部使用场景:代码其他模块中存在大量已提前构造完成的Poly对象,无法通过重新构造Poly的方式完成域修改g = Poly(gpc(N,m), x, domain = D) - 尝试使用代数结构通用的
change_ring方法执行域切换时,直接抛出报错:
确认'Poly' object has no attribute 'change_ring'change_ring方法不适用于Sympy的Poly类对象,需要找到可对已构造Poly实例完成域切换的可行方案
实现方案
Sympy的Poly类提供了内置域转换接口per_domain(),可直接对已构造完成的Poly实例执行域切换,无需重新通过系数列表构造对象,完全满足通用域切换的需求,使用方式如下:
- 基础调用逻辑
该接口的效果和构造Poly时传入# 针对已提前构造完成的原Poly对象,直接传入目标域D f = g.per_domain(D)domain=D完全一致,会保留原多项式的所有系数结构,仅修改所属的环/域 - 整数多项式域
ZZ[x]的场景适配
由于gpc(N,m)返回浮点数系数,执行域切换时per_domain()会自动完成系数到目标域的映射:若浮点数系数可精确转化为整数,会自动完成系数格式转换,不会破坏原有多项式结构 - 注意事项
- 该接口完全对齐其他代数结构中
change_ring的功能逻辑,不存在Poly类的兼容性问题 - 若原多项式的系数无法映射到目标域(例如RR域上含非整无理系数的多项式尝试切换到ZZ域),会直接抛出明确的域不匹配报错,方便排查问题
- 该接口完全对齐其他代数结构中
内容的提问来源于stack exchange,提问作者Cp1n.n3m0
相关产品推荐
相关产品推荐

