Python下基于任意精度的多项式乘法实现方案咨询
任意精度多项式乘法可行方案
1. 基于mpmath的卷积实现
多项式乘法本质是系数的卷积运算,mpmath虽无直接的多项式类,但可结合其高精度数值类型实现乘法,逻辑简单且效率足够应对常规规模:
import mpmath as mp # 设置高精度位数,例如100位小数 mp.mp.dps = 100 def poly_mult(p1, p2): # p1、p2为mpf类型的系数列表,索引对应x的幂次(p1[0]是常数项) result_len = len(p1) + len(p2) - 1 result = [mp.mpf(0)] * result_len for i, coeff1 in enumerate(p1): for j, coeff2 in enumerate(p2): result[i+j] += coeff1 * coeff2 # 可选:截断末尾的零系数 while result and result[-1] == mp.mpf(0): result.pop() return result # 示例:计算1 + 2x + 3x²的平方 p = [mp.mpf(1), mp.mpf(2), mp.mpf(3)] p_squared = poly_mult(p, p) print(p_squared) # 输出:[1, 4, 10, 12, 9]
若需更高效率,可替换为mpmath支持的高精度FFT卷积,适合大规模多项式运算。
2. numpy.polynomial结合Decimal类型复用现有功能
numpy的Polynomial支持object dtype存储Decimal系数,手动实现乘法后可直接复用其截断、系数访问等原生功能:
from decimal import Decimal, getcontext from numpy.polynomial import Polynomial # 设置Decimal的精度 getcontext().prec = 100 def decimal_poly_mult(poly1, poly2): coeff1 = poly1.coef coeff2 = poly2.coef result_len = len(coeff1) + len(coeff2) - 1 result_coeff = [Decimal(0)] * result_len for i, c1 in enumerate(coeff1): for j, c2 in enumerate(coeff2): result_coeff[i+j] += c1 * c2 # 可选:截断末尾零系数 while result_coeff and result_coeff[-1] == Decimal(0): result_coeff.pop() return Polynomial(result_coeff) # 示例 p = Polynomial([Decimal(1), Decimal(2), Decimal(3)]) p_squared = decimal_poly_mult(p, p) print(p_squared.coef) # 输出Decimal类型的系数列表
3. sympy Poly类(兼容Decimal/mpmath)
sympy的Poly原生支持任意精度系数,可直接指定Decimal或mpmath的mpf作为系数类型,乘法、截断、系数访问等功能均内置实现:
from decimal import Decimal, getcontext import sympy as sp import mpmath as mp # 设置精度 getcontext().prec = 100 mp.mp.dps = 100 # 基于Decimal的多项式乘法 x = sp.Symbol('x') p = sp.Poly(1 + 2*x + 3*x**2, x, domain='decimal') p_squared = p**2 # sympy的coeffs()返回高次到低次的系数,反转后与numpy格式一致 print(p_squared.coeffs()[::-1]) # 基于mpmath的多项式乘法 p_mp = sp.Poly(mp.mpf(1) + mp.mpf(2)*x + mp.mpf(3)*x**2, x, domain='mpmath') p_mp_squared = p_mp**2 print(p_mp_squared.coeffs()[::-1])
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

