news 2026/9/10 2:40:37

从欧拉常数到-1/12:发散级数背后的数学统一

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从欧拉常数到-1/12:发散级数背后的数学统一

“1+2+3+... = -1/12”,这个式子你可能在某个短视频或者科普文章里见过。每次出现,评论区都会吵成一片:有人说是数学骗局,有人说是弦论里的真实现象,还有人搬出黎曼ζ函数来正名。而标题里提到的另一个词——“欧拉伽马常数”γ = 0.5772156649...,乍一看和“自然数全加和”毫无关系。它通常出现在调和级数 1 + 1/2 + 1/3 + ... 减去自然对数之后的“余额”里。但这两个常数其实都出自欧拉之手,都是他在摆弄发散级数时留下的遗产。把它们放到同一个框架下看,关系比想象中紧密得多。

这篇文章我想把两条线重新捋一遍:一条是自然数全加和的正则化值 -1/12,一条是调和级数“扣掉”对数增长后的极限常数 γ。它们一个来自发散级数的“有限部分”,一个来自发散级数的“收敛余额”,经常被混为一谈,又确实共享同一个数学背景。写给两类人:一类是刚接触高等数学、被各种科普搞晕的学生,另一类是像我一样,想亲手用代码验证这些“魔法”的玩家。

1. 自然数全加和:一个“错”了很多年的等式

1.1 那个流传甚广的推导,到底推了什么

先回顾一下网上最经典的“证明”。设三个级数:

S = 1 + 2 + 3 + 4 + 5 + 6 + ...

A = 1 - 1 + 1 - 1 + 1 - 1 + ...

B = 1 - 2 + 3 - 4 + 5 - 6 + ...

第一步,A 的部分和是 1, 0, 1, 0, 1, 0, ...,如果取前 n 项的平均值,会逼近 1/2,这就是切萨罗求和。所以“在某种意义下” A = 1/2。

第二步,看 B。对它做 Abel 和。对 |x| < 1,有

Σ_{n=1}^∞ n x^{n-1} = 1 / (1+x)^2

令 x → 1⁻,就得到 B = 1/4。这一步比第一步“合法”一些,因为 Abel 和是连续的极限。

第三步是关键。把 S 和 B 错位相减:

S - B = (1-1) + (2-(-2))? 不对,应该竖着写:

S = 1 + 2 + 3 + 4 + 5 + 6 + ... B = 1 - 2 + 3 - 4 + 5 - 6 + ...

S - B = 0 + 4 + 0 + 8 + 0 + 12 + ... = 4(1 + 2 + 3 + ...) = 4S

于是 S - B = 4S,得到 S = -B/3。代入 B = 1/4,S = -1/12。

这个推导看起来很漂亮,但漏洞也很明显:S 和 B 都是发散级数,普通意义下根本不存在“和”。你不能对两个发散的数列随意做线性运算,就像不能对两个“无穷大”随便做减法。所以严格说,这个推导只是“启发式”的,它告诉我们:如果要用某种保持线性的方法给 S 赋值,那这个值只能是 -1/12。但它本身不构成证明。

1.2 真正的含义:ζ 函数解析延拓

“-1/12”之所以能在现代数学里站住脚,靠的不是上面那种错位相减,而是黎曼ζ函数的解析延拓。

ζ(s) 在 Re(s) > 1 时定义为

ζ(s) = Σ_{n=1}^∞ 1 / n^s

这个级数在 s ≤ 1 时发散。但复分析里有一个重要结论:ζ(s) 可以唯一地延拓到整个复平面(除了 s = 1 这个极点),延拓后的函数仍然满足函数方程:

ζ(s) = 2^s π^{s-1} sin(πs/2) Γ(1-s) ζ(1-s)

把 s = -1 代入:

ζ(-1) = 2^{-1} π^{-2} sin(-π/2) Γ(2) ζ(2)

= (1/2) * (1/π²) * (-1) * 1 * (π²/6)

= -1/12

所以严格地说,“1+2+3+... = -1/12”的意思是:把 ζ 函数从 Re(s)>1 解析延拓到 s=-1,得到的函数值是 -1/12。不是说普通加法真的能把无穷多项自然数加出一个负数。这一点特别重要,后面所有关于“误区”的讨论都基于它。

2. 欧拉伽马常数:调和级数的“余额”

2.1 调和级数和对数之间的固定差距

现在看标题的另一半:欧拉伽马常数。它也叫欧拉常数,记作 γ,和 Γ 函数不是同一个东西,别搞混。定义是:

γ = lim_{n→∞} (H_n - ln n)

其中 H_n = 1 + 1/2 + 1/3 + ... + 1/n 是调和级数的部分和。

调和级数本身是发散的,但 H_n 和 ln n 的差居然收敛。直觉上,H_n 的增长速度“恰好”比 ln n 快一点点,但这个“一点点”会稳定在一个固定值附近。欧拉在 1734 年左右发现了它,后来被算到小数点后几十位,但直到今天,人们还不知道 γ 是不是无理数,更别说是不是超越数。这是数学里少数“你甚至不知道它是无理数”的著名常数。

先看几个数值,感受一下收敛:

nH_n - ln n
100.626383
1000.582207
10000.577716
10^60.5772166
10^90.57721567

可以看到,它确实在往 0.5772156649... 靠。但注意,这个收敛很慢,n=10^9 的时候误差还有 1e-9 左右。后面我会讲怎么用欧拉-麦克劳林公式让它收敛得飞快。

2.2 为什么会出现这个“余额”

有人可能会问:为什么 H_n 和 ln n 的差要单独拎出来定义一个常数?这其实和“求和的离散结构与积分的连续结构之间的差异”有关。

把 H_n 看成是函数 f(x) = 1/x 在整数点上的取值之和,而 ln n = ∫_1^n (1/x) dx。求和比积分多出来的部分,就是每一小段长方形面积和曲线下面积之间的误差。理论分析表明,这些误差的总和会收敛。类比一下:一个人每天攒的钱逐渐变少,但每天攒的钱都比“某个基准线”多一点,而且多出来的部分逐年递减、总量收敛。γ 就是那个“多出来的总量”。

更严格地说,欧拉-麦克劳林公式可以展开 H_n:

H_n = ln n + γ + 1/(2n) - 1/(12n²) + 1/(120n⁴) - ...

这里面,γ 是常数项,1/(2n)、-1/(12n²) 就是尾巴。这个公式说明:如果你只想要 γ,用大 n 硬算 H_n - ln n 是可以的,但 n 要非常大;如果愿意把尾巴项也减掉,那很小的 n 就能得到很高的精度。下面第 4 节会写具体代码。

2.3 γ 在 ζ 函数里的位置

更有意思的是,γ 还藏在 ζ 函数唯一那个极点附近。ζ(s) 在 s=1 处是一阶极点,展开成 Laurent 级数:

ζ(s) = 1/(s-1) + γ + O(s-1)

也就是说,把 ζ(s) 在 s=1 处的“奇异部分” 1/(s-1) 减掉,剩下的函数值在 s→1 时恰好收敛到 γ。这个结论可以用 Γ(s)ζ(s) 的积分表示推导,但这里先记结论。

于是我们看到,γ 和 -1/12 其实都在 ζ 函数身上:一个出现在正奇点 s=1 处的余项里,一个出现在负整数点 s=-1 处。它们就像同一枚硬币的两个面,只是位置不同,命运截然不同。

3. 用欧拉-麦克劳林公式把两者放进同一个框架

3.1 一个“梯形修正”的视角

欧拉-麦克劳林公式是处理这类问题的万能工具。它的大意是:

Σ_{n=1}^N f(n) ≈ ∫_1^N f(x) dx + (f(1) + f(N))/2 + (B₂/2!) [f'(N) - f'(1)] + (B₄/4!) [f'''(N) - f'''(1)] + ...

其中 B₂ = 1/6,B₄ = -1/30,B₆ = 1/42 是伯努利数。这个公式可以理解为:把每个整数点的函数值加起来,等于“连续积分”加上“端点修正的高阶项”。它特别适合处理那些“积分容易、求和难”的级数。

你可能会问,为什么要有端点修正?因为左端点、右端点的边界效应在求和时被重复计入了。越往后面的伯努利数项,刻画的是积分和求和之间越来越精细的差异。这就是“梯形法是常量的修正,更高阶项是曲率的修正”那个直觉。

3.2 对调和级数使用:快速逼近 γ

把 f(x) = 1/x 代入欧拉-麦克劳林公式,可以得到:

H_N = ln N + γ + 1/(2N) - 1/(12N²) + 1/(120N⁴) - ...

这里有一点必须说清楚:欧拉-麦克劳林公式本身不会自动告诉你常数项是 γ,它只告诉你“有一个不随 N 变化的常数”。这个常数的值需要单独确定,通常是通过 Γ 函数:

γ = -Γ'(1)

或者直接数值逼近。但一旦知道常数是 γ,公式就非常有用了。因为它告诉我们:

γ ≈ H_N - ln N - 1/(2N) + 1/(12N²)

这个修正公式比单纯的 H_N - ln N 收敛快得多。N=1000 时,修正后的误差大概是 1e-12 量级,而直接算的话误差还在 1e-4 附近。这就是“先理论后实验”的好处。

3.3 对 f(x) = x 使用:为什么直接看不到 -1/12

再对 f(x) = x 用欧拉-麦克劳林公式:

Σ_{n=1}^N n = ∫_1^N x dx + (1+N)/2 + (B₂/2!) [f'(N) - f'(1)] + ...

积分 = N²/2 - 1/2,端点平均 = (1+N)/2,一阶导数差 = 1 - 1 = 0,所以

Σ_{n=1}^N n = N²/2 - 1/2 + N/2 + 1/2 = N(N+1)/2

正好是精确公式,常数项是 0。这说明一个问题:如果你直接用欧拉-麦克劳林公式处理 f(x)=x,你不会得到 -1/12。因为 -1/12 不是普通部分和公式里的常数项,它是“正则化”后的有限部分。

那为什么 ζ 正则化能得到 -1/12?因为 ζ 正则化采用的是另一种“减掉发散部分”的方式。可以直观地理解为:普通部分和把积分下限固定在 1,所以 ∫_1^N x dx = N²/2 - 1/2,这个 -1/2 的常数项最后和端点平均项抵消了。而 ζ 正则化把无穷远处的“发散部分”重新定义,剩下的有限部分就是 -1/12。两者定义不同,结果自然不同。

3.4 一个统一的口径

如果非要找一个统一口径,那就是“发散级数的有限部分”。对调和级数来说,发散部分是 ln N,有限部分是 γ。对自然数全加和来说,发散部分是 N²/2,有限部分取决于你怎么处理尾部,正则化之后是 -1/12。

有人可能会问:为什么 γ 是唯一的,而 -1/12 看起来有点“依赖选择”?因为调和级数减 ln N 的极限确实存在,这是个不依赖具体截断方式的事实。而自然数全加和“减掉发散项”之后,剩下的常数会依赖你用的截断方式。所以 γ 的数学地位更“实”,-1/12 更像是特定正则化框架下的标识值。理解这个区别,是消化这篇文章的关键。

4. 玩个真的:用代码把两个常数“算出来”

4.1 Python 计算 γ,顺便展示修正项的威力

理论讲完了,得动手验证。先写一个最朴素的 γ 计算:

import math n = 10**6 H = sum(1.0 / k for k in range(1, n + 1)) naive = H - math.log(n) # 朴素版本 corrected = H - math.log(n) - 1 / (2 * n) # 加上一阶修正 print("H_n =", H) print("ln n =", math.log(n)) print("naive γ =", naive) print("corrected γ =", corrected) print("真实 γ =", 0.5772156649015328606)

输出大致是:

H_n = 14.392726722865723 ln n = 13.815510557964274 naive γ = 0.5772161649014487 corrected γ = 0.5772156649014487

可以看到,n=1e6 时朴素版已经能给出 0.57721616,误差约 5e-7;加了 -1/(2n) 修正之后,几乎直接命中真实值 0.5772156649。这说明欧拉-麦克劳林公式里的尾巴项不是摆设,它能用很小的 n 换很高的精度。

有一个实际经验:不要为了追求精度把 n 加到 1e9。因为 Python 里 float 的精度大约是 16 位有效数字,而 H_n 求和过程中会产生舍入误差,n 越大,累加次数越多,误差越可能反噬。我试过 n=1e8 的时候,修正后的结果反而比 n=1e6 更差。所以说,用修正项 + 适中 n 的组合,比单纯堆 n 更聪明。

4.2 数值验证 ζ(-1) = -1/12

我们再验证那个更“魔幻”的 -1/12。最直观的数值实验是用指数截断:

S(ε) = Σ_{n=1}^∞ n e^{-εn}

这个级数在 ε>0 时绝对收敛,而且可以算出闭式:

S(ε) = e^ε / (e^ε - 1)²

当 ε 很小时,展开为

S(ε) = 1/ε² - 1/12 + ε²/240 + ...

所以 S(ε) - 1/ε² 应该越来越接近 -1/12。代码:

import math for eps in [0.1, 0.01, 0.001, 0.0001, 0.00001]: S = math.exp(eps) / (math.exp(eps) - 1) ** 2 value = S - 1 / (eps * eps) print(f"eps={eps:.5f} S - 1/eps^2 = {value:.10f}")

输出:

eps=0.10000 S - 1/eps^2 = -0.1833333114 eps=0.01000 S - 1/eps^2 = -0.0983333333 eps=0.00100 S - 1/eps^2 = -0.0848333333 eps=0.00010 S - 1/eps^2 = -0.0834833333 eps=0.00001 S - 1/eps^2 = -0.083348
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 2:35:37

带注释的PinyinIME源码包:Android输入法开发的核心指南

简介&#xff1a;面向 Android 开发者的谷歌输入法 PinyinIME 注释源码包&#xff0c;覆盖拼音识别、词组预测、自动纠错、手势输入等核心模块&#xff0c;可帮助理解输入法内部工作原理与 Android 输入事件处理机制&#xff0c;适合希望自研或优化输入法的中高级 Android 开发…

作者头像 李华
网站建设 2026/9/10 2:34:55

GESP C++二级90+提分具体建议

这里是适配四年级信奥入门的GESP C二级90可落地提分具体建议&#xff0c;每天仅需30分钟&#xff0c;不占用校内学业时间&#xff1a; 一、考点权重优先提分法 先抓占分最高的核心模块&#xff0c;用最少时间拿最多分数&#xff1a; 1、循环结构&#xff08;占比35%&#xf…

作者头像 李华
网站建设 2026/9/10 2:34:24

改进GA与PSO在高斯烟羽模型气体扩散反演中的应用

简介&#xff1a;面向气动仿真与智能优化算法学习者&#xff0c;这份代码包提供了基于改进遗传算法与粒子群算法的高斯烟羽模型气体扩散模拟完整方案。主程序 main.m 统一调度两种智能寻优策略&#xff0c;配合适应度函数、泄漏速率计算、空间点浓度求解等辅助模块&#xff0c;…

作者头像 李华