首页 > 解决方案 > 用于将具有大系数的多项式相乘的 Python 包

问题描述

我想在 python 中乘以大系数的多项式。我在 numpy 中试过这个。

import numpy as np
p = np.poly1d([1])
for i in range(250):
    p = np.polymul(p, [1, 2])
print ("P : ", p)

但令人惊讶的是,numpy 给出了错误的结果!理想情况下,程序应该扩展多项式 (x+2)^250 并输出它。但它输出以下内容。

P :     250       249             248             247             246
1 x   + 500 x   + 1.245e+05 x   + 2.058e+07 x   + 2.542e+09 x  
              245             244             243             242
 + 2.501e+11 x   + 2.043e+13 x   + 1.424e+15 x   + 8.652e+16 x  
              241             240            239             238
 + 4.653e+18 x   + 2.901e+18 x   + 9.18e+18 x   + 9.015e+18 x  
              237             236             235             234
 - 7.634e+18 x   - 1.988e+17 x   - 8.716e+18 x   + 6.834e+18 x  
              233             232            231            230
 - 3.933e+18 x   + 2.712e+18 x   + 6.03e+18 x   - 4.58e+18 x  
              229             228             227             226
 + 7.714e+18 x   - 5.435e+18 x   + 3.734e+18 x   + 4.537e+18 x  
              225             224             223            222
 - 6.507e+18 x   - 1.937e+18 x   + 6.602e+17 x   + 2.61e+18 x  
              221             220             219             218
 - 3.935e+18 x   + 8.436e+18 x   + 6.076e+18 x   - 5.604e+18 x  
              217             216             215             214
 + 2.542e+18 x   + 3.146e+18 x   + 3.515e+18 x   - 3.458e+16 x  
              213             212             211             210
 - 5.884e+18 x   + 5.881e+18 x   - 3.702e+18 x   + 6.049e+17 x  
              209            208             207             206
 - 9.101e+18 x   - 5.37e+18 x   - 8.623e+18 x   + 5.234e+18 x  
              205             204             203             202
 + 4.466e+18 x   + 8.528e+18 x   - 5.645e+18 x   + 6.822e+18 x  
              201             200             199             198
 + 2.037e+18 x   - 2.809e+18 x   + 5.819e+18 x   + 2.675e+18 x  
              197             196             195             194
 + 7.458e+18 x   + 5.224e+18 x   + 2.018e+18 x   - 9.007e+18 x  
              193             192
 - 1.441e+18 x   - 2.594e+18 x  

该功能似乎存在一些精度问题。python中是否有适合将多项式与大系数相乘的库?

标签: pythonpython-3.x

解决方案


Sympy 将是一个不错的选择。在 sympy 中执行此操作看起来像:

import sympy
x = sympy.var('x')
p = (x+2)**250
p = sympy.expand(p)
print(p)

我没有包括输出,因为它很长,但抽查它看起来是正确的。Sympy 使用任意精度库,因此所有系数都被扩展。您可以使用该coeff方法获得各个系数。例如:

>> p.coeff(x**249)
250

推荐阅读