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

如何用Python高效计算初等对称多项式(ESPs)?

高效计算初等对称多项式的Python实现(基于牛顿恒等式)

需求说明

需要实现一个计算初等对称多项式(ESPs)的Python函数,满足:

  • 输入:非空数值列表x
  • 输出:包含所有对应ESPs结果的列表,按约定第0项恒为1。例如输入[x1, x2, x3],输出为[1, x1+x2+x3, x1x2+x1x3+x2x3, x1x2x3]

初始方案的局限性

最初使用itertools.combinations遍历所有k元组(k从1到列表长度)计算,时间复杂度为O(n·2ⁿ)(n为列表长度),属于指数级,面对较大规模输入时性能极差,扩展性不足。

优化方案:基于牛顿恒等式的O(n²)实现

牛顿恒等式建立了初等对称多项式与幂和之间的关联,能将计算复杂度降至二次方,完全满足性能需求。

实现代码

def evaluate_all_ESPs(x: list) -> list:
    """
    计算给定数值列表对应的所有初等对称多项式(ESPs),返回包含len(x)+1个结果的列表

    若将结果记为e[k](0 ≤ k ≤ len(x)),则:
        • e[0] = 1(约定)
        • 对于1 ≤ k ≤ len(x),e[k]是所有k个元素乘积的和:
            - e[1] = x[0] + x[1] + ... + x[-1](所有元素的和)
            - e[2] = x[0]*x[1] + x[0]*x[2] + ... + x[-2]*x[-1](所有二元乘积的和)
            - ...
            - e[len(x)] = x[0]*x[1]*...*x[-1](所有元素的乘积)

    注意:本函数使用牛顿恒等式计算,比遍历所有k元组的方法高效得多,算法复杂度为O(len(x)²)
    """
    # 输入检查
    if not isinstance(x, list):
        raise TypeError(f"\n\n预期输入为列表,但实际收到类型 '{type(x).__name__}' : '{x}'\n")
    if len(x) == 0:
        raise ValueError("\n\n输入不能为空列表!\n")

    # 初始化变量
    nb_elements = len(x)
    evaluations = [1] + [0] * nb_elements  # 对应文档中的e列表
    powers_of_x = [1] * nb_elements        # 存储每个元素的i次幂
    sums_of_powers_of_x = [0] * nb_elements# 存储所有元素i次幂的和

    for i in range(nb_elements):
        # 更新元素的幂次及幂和
        powers_of_x = [x_k * prev_pow for x_k, prev_pow in zip(x, powers_of_x)]
        sums_of_powers_of_x[i] = sum(powers_of_x)

        # 应用牛顿恒等式计算当前对称多项式
        current_eval = 0
        sign = 1
        for j in range(i, -1, -1):
            current_eval += sign * evaluations[j] * sums_of_powers_of_x[i - j]
            sign *= -1
        # 根据结果类型选择整数或浮点数除法
        current_eval = current_eval // (i + 1) if isinstance(current_eval, int) else current_eval / (i + 1)

        # 更新结果列表
        evaluations[i + 1] = current_eval

    return evaluations

调研情况说明

在寻找解决方案时,未在Stack Overflow找到直接可用的代码(仅Math Stack Exchange有相关算法提及),同时调研了以下资源:

  • pySymmPol包:仅支持多项式符号运算,无法处理数值求值需求
  • 一篇浮点输入下快速ESPs计算的论文:作者未提供代码,且算法实现难度高(作者采用C语言实现)

目前网上缺乏基于牛顿恒等式计算ESPs的明确Python实现,希望这个代码能为有相同需求的开发者节省时间。

内容的提问来源于stack exchange,提问作者bghost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:35:10