You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:55:14