sympy中binomial(n,m)不同代入顺序结果不同的原因是什么
问题原因分析
核心差异来自Sympy的subs方法执行逻辑,以及二项式系数不同化简路径的规则差异:
subs传入替换规则列表时,是按列表顺序逐个执行替换,上一步替换的结果会作为下一步的输入,并非一次性完成所有替换。
第一种替换顺序(先换m=0,再换n=-1)
- 初始式子为
binomial(n, m),第一步替换m=0后得到binomial(n, 0) - Sympy内置了二项式基础恒等式化简规则:对任意
n,C(n, 0) = 1,因此这一步式子直接被化简为常数1 - 第二步替换
n=-1时,常数1中不存在符号n,替换无效果,最终输出1
第二种替换顺序(先换n=-1,再换m=0)
- 初始式子为
binomial(n, m),第一步替换n=-1后得到binomial(-1, m) - 此时第二个参数
m是无定义域约束的通用符号,Sympy无法套用整数场景的二项式恒等式,会 fallback 到通用Gamma函数定义展开:binomial(a, b) = Gamma(a+1) / (Gamma(b+1) * Gamma(a - b + 1))
代入a=-1后分子为Gamma(0),是发散到无穷的量,此时式子已经包含无穷项 - 第二步替换
m=0时,分母变为Gamma(0+1) * Gamma(-1 -0 +1) = 1 * Gamma(0),最终得到无穷/无穷的不定式,Sympy会用zoo(复无穷大)表示这类未定义结果。
规避方法
如果要避免分步替换的中间化简偏差,可以给subs添加simultaneous=True参数,强制所有替换同时完成:
print(binomial(n,m).subs([(n,-1),(m,0)], simultaneous=True)) # 输出结果为 1
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

