InfinitePolynomialRing元素求导仅p_3触发变量非同环错误问题
问题原因
这是SageMath旧版本中InfinitePolynomialRing的已知实现缺陷:当变量索引≥3时,通过.variables()方法取出的变量对象,和直接通过生成元p[i]创建的变量对象,内部的环归属校验标识不一致,才会触发TypeError: provided variable is not in same ring as self报错,索引为1、2的变量刚好避开了这个实现问题,所以能正常运行。
可用解决方案
方案1:直接传入生成元作为求导参数
不需要从variables列表中取变量,直接用环的生成元p[i]作为derivative的入参即可正常运行,示例代码如下:
X.<p> = InfinitePolynomialRing(QQ) f = p[3] # 直接传入p[3]作为求导变量 res = f.derivative(p[3]) print(res) # 输出结果为1
方案2:动态取变量时转成环的生成元实例
如果你的使用场景需要从多项式的变量列表中动态定位求导变量,可以将取出的索引转换成环的生成元再传入,示例代码如下:
X.<p> = InfinitePolynomialRing(QQ) f = p[3] # 先定位变量索引 target_idx = f.variables().index(p[3]) # 从环中取对应索引的生成元 target_var = X.gen(target_idx) res = f.derivative(target_var) print(res) # 输出结果为1
方案3:升级SageMath版本
这个缺陷已经在SageMath 9.6及后续版本中修复,升级到对应版本后你原来的写法就可以正常运行。
内容的提问来源于stack exchange,提问作者jrayers97
相关产品推荐
相关产品推荐

