首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 sympy 的代数运算入门

基于 sympy 的代数运算入门

原创
作者头像
密码学人CipherHUB
发布2025-05-28 17:00:55
发布2025-05-28 17:00:55
14100
代码可运行
举报
文章被收录于专栏:数理视界数理视界
运行总次数:0
代码可运行

sympy 中的核心函数

sympy 核心函数
sympy 核心函数

本文将以factorexpandequals三个核心函数为切入点,帮助初学者快速掌握SymPy的基本代数操作。

因式分解与展开

factor 函数的用法

代码语言:python
代码运行次数:0
运行
复制
from __future__ import annotations

from sympy import factor , sqrt , symbols

x = symbols('x')

# 因式分解能直接暴露多项式的根
expr = x ** 2 - 5 * x + 6
factored = factor(expr)  # 输出: (x - 3)*(x - 2)
print(f'{expr} ->因式分解后-> {factored}')

# 将复杂多项式转换为更紧凑的乘积形式,便于后续分析(如积分、对称性分析)
expr = x ** 3 + 3 * x ** 2 + 3 * x + 1
factored = factor(expr)  # 输出: (x + 1)**3
print(f'{expr} ->因式分解后-> {factored}')

# 在指定域(如实数域、复数域)或包含代数数
expr = x ** 2 - 2
factored = factor(expr , extension = sqrt(2))  # 输出: (x - sqrt(2))*(x + sqrt(2))
print(f'{expr} ->因式分解后-> {factored}')

# 在模素数 p 的域中分解(如密码学或编码理论中常用)
expr = x ** 2 + 1
factored = factor(expr , modulus = 5)  # 输出: (x - 2)*(x + 2) (模5下 2²=4 ≡ -1)
print(f'{expr} ->因式分解后-> {factored}')
基于 factor 进行 因式分解
基于 factor 进行 因式分解

expand 函数

expand 函数的参数列表
expand 函数的参数列表
代码语言:python
代码运行次数:0
运行
复制
from sympy import I , exp , expand , expand_power_exp , log , sin , symbols

a , b , c = symbols('a b c' , positive = True , real = True)

"""
expand 展开表达式中的括号,合并同类项
factor 将多项式分解为不可约因子的乘积形式
"""

expr = (a + b) * (a + c)
print(f'{expr} ->(mul = True)->展开乘法表达式-> {expand(expr , mul = True)}')

expr = a ** (b + c)
# 需要声明 a 为正数, 严格数学场景,确保展开安全
print(f'{expr} ->(power_exp = True)->展开幂的指数加法-> {expand(expr , power_exp = True)}')
# 快速强制展开,忽略符号假设
print(f'{expr} ->(expand_power_exp)->强制展开幂的指数加法-> {expand_power_exp(expr)}')

expr = (a * b) ** c
print(f'{expr} ->(power_base = True)->展开底数的乘积-> {expand(expr , power_base = True)}')

expr = log(a * b)
print(f'{expr} ->(log = True)->展开对数表达式-> {expand(expr , log = True)}')

expr = sin(a + b)
print(f'{expr} ->(trig = True)->展开三角函数的和角公式-> {expand(expr , trig = True)}')

expr = (a + b) ** 3
print(f'{expr} ->(multinomial = True)->展开多项式的高次幂-> {expand(expr , multinomial = True)}')

expr = (a + I * b) ** 3
print(f'{expr} ->(complex = True)->分离虚数的实部和虚部-> {expand(expr , complex = True)}')
expr = exp(a + I * b)
print(f'{expr} ->(complex = True)->分离虚数的实部和虚部-> {expand(expr , complex = True)}')

expr = (a + b) ** 3
print(f'{expr} ->(modulus = 2)->对展开后的系数取模运算-> {expand(expr , modulus = 2)}')
expand展开括号并合并同类项
expand展开括号并合并同类项

factor与expand的使用场景对比

使用场景对比
使用场景对比

基于 equals 函数进行多项式相等判断

假设有两个表达式,比如(x + 1)^2和x^2 + 2x + 1,这时候用equals()应该返回True,因为它们展开后是一样的,而用==的话可能返回False,因为结构不同。

代码语言:python
代码运行次数:0
运行
复制
from __future__ import annotations

from sympy import cos , sin , sqrt , symbols

x , y = symbols('x y')

"""
验证公式化简是否正确
判断方程解的等价性
测试代码中表达式是否数学等价

返回值可能是 None: 当无法确定等价性时(如涉及未定义符号的复杂条件)
数值验证: equals() 会尝试代入随机数值进行验证,增加结果的可信度
符号假设: 符号的假设(如正数、实数等)可能影响结果
"""

# 示例1:结构不同但数学等价
expr1 = (x + 1) ** 2
expr2 = x ** 2 + 2 * x + 1
print(expr1.equals(expr2))  # 输出 True

# 示例2:三角函数恒等式
expr3 = cos(x) ** 2 + sin(x) ** 2
expr4 = 1
print(expr3.equals(expr4))  # 输出 True

# 示例3:符号假设的影响
a = symbols('a' , positive = True)
expr5 = sqrt(a ** 2)
expr6 = a
print(expr5.equals(expr6))  # 输出 True(因为 a 被定义为正数)

# 示例4:无法确定的情况
expr7 = x + y
expr8 = y + x
print(expr7 == expr8)  # 输出 False(结构顺序不同)
print(expr7.equals(expr8))  # 输出 True(数学等价)

# 示例5:涉及复杂化简
expr9 = x ** 2 - 1
expr10 = (x - 1) * (x + 1)
print(expr9.equals(expr10))  # 输出 True

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sympy 中的核心函数
  • 因式分解与展开
    • factor 函数的用法
    • expand 函数
    • factor与expand的使用场景对比
  • 基于 equals 函数进行多项式相等判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档