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

如何用SymPy将多项式转换为自由代数下的「单词」形式?

解决方案

可以利用Python的抽象语法树(AST)模块解析表达式,递归展开所有幂运算为重复的变量乘积,以下是具体实现:

代码实现

import ast

def expand_to_word_form(expr_str):
    # 将表达式字符串解析为抽象语法树
    tree = ast.parse(expr_str, mode='eval')
    
    def traverse(node):
        if isinstance(node, ast.BinOp):
            # 处理乘法:拼接左右两边的展开结果
            if isinstance(node.op, ast.Mult):
                return traverse(node.left) + traverse(node.right)
            # 处理幂运算:将底数重复指数次
            elif isinstance(node.op, ast.Pow):
                base_parts = traverse(node.base)
                exponent = ast.literal_eval(node.exp)
                return base_parts * exponent
        # 变量节点:返回单元素列表
        elif isinstance(node, ast.Name):
            return [node.id]
        # 常量节点(可选,若表达式含数字可保留)
        elif isinstance(node, ast.Constant):
            return [str(node.value)]
        # 未知节点类型:返回原始字符串形式容错
        else:
            return [ast.unparse(node)]
    
    # 遍历AST得到展开后的元素列表,用*连接
    expanded_elements = traverse(tree.body)
    return '*'.join(expanded_elements)

测试示例

# 测试单个变量幂
print(expand_to_word_form("x**2"))  # 输出: x*x

# 测试嵌套表达式
print(expand_to_word_form("(x*y**2)**3"))  # 输出: x*y*y*x*y*y*x*y*y

原理说明

  1. AST解析:用ast.parse将输入的表达式字符串拆解成可遍历的语法树结构,精准识别乘法、幂运算等操作。
  2. 递归遍历:通过递归函数处理每个语法节点:
    • 遇到乘法时,将左右两边的展开结果直接拼接;
    • 遇到幂运算时,把底数的展开结果重复指数次(比如y**2会被转成[y,y]);
    • 变量节点直接返回自身的列表形式。
  3. 结果拼接:将最终得到的元素列表用*连接,形成要求的「单词」形式。

关于SymPy的说明

SymPy的expand方法是为代数化简设计的,它会保留幂运算的紧凑形式(因为代数上x**2和x*x等价),所以无法直接满足你展开为重复乘积的需求,需要通过AST手动处理这种结构转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:12:56