
黎曼函数的解析延拓:从级数定义到函数方程
黎曼ζ函数常从一个看起来很简单的级数开始:
ζ(s) = 1 + 1/2s + 1/3s + ··· = ∑n=1∞ n−s。
这里的 s 是复数。这个表达式并非对所有 s 都收敛:它只在 Re(s) > 1 时绝对收敛。可是数论中的许多问题会涉及 Re(s) ≤ 1 的区域,甚至负整数。要在那里谈论 ζ(s),就需要把原先的函数延伸到级数定义的范围之外。这一过程叫作解析延拓。
本文从级数的收敛边界出发,推导两种常用的延拓思路,说明函数方程的含义,并用 Python 做数值核对。重点不只是公式本身,还包括这些公式何时适用、数值结果为何可能不可靠,以及实现时该怎样限制输入。
一、级数定义能用到哪里
当 Re(s) > 1 时,ζ(s) 的定义级数绝对收敛。若 s = σ + it,则 |n−s| = n−σ,因此绝对收敛问题归结为实数级数 ∑n−σ;它在且仅在 σ > 1 时收敛。
不能把“某处数值软件能算 ζ(s)”误解成“原始级数在那里仍然收敛”。例如 s = 1/2 时,∑n−1/2 发散,但 ζ(1/2) 可以通过解析延拓定义。直接截断原级数来近似这个值,不会随着项数增加而收敛到所需结果。
在 Re(s) > 1 内,级数还可以逐项操作,并有欧拉乘积:
ζ(s) = ∏p 为素数 (1 − p−s)−1。
它把 ζ 函数与素数联系起来。但欧拉乘积的通常收敛论证也依赖 Re(s) > 1,不能直接拿这个无穷乘积去计算临界带中的值。
二、解析延拓是什么意思
解析延拓是寻找一个在更大区域内解析(或亚纯)的函数,并要求它在原有定义区域内与原函数相同。对 ζ 函数而言,级数在 Re(s) > 1 定义了一个解析函数;它可以延拓为全复平面上的亚纯函数,唯一的极点是 s = 1 处的简单极点,留数为 1。
“唯一”很重要。若两个亚纯函数在一个连通区域内都解析,并且在某个开集上相等,那么由恒等定理,它们在共同定义的整个区域内相等。因此,解析延拓不是在原定义域外任意挑一个数值函数,而是受原函数约束的唯一延伸。
延拓后的 ζ(s) 不能说在 s = 1 也有有限值:该点是极点。靠近 1 时,主导行为为 ζ(s) ≈ 1/(s−1),所以函数值会变得很大。软件通常会返回无穷、异常或高精度下的巨大数值;这不是一个有限的 ζ(1)。
三、用积分得到第一种延拓
对于 Re(s) > 1,逐项积分几何级数可以得到:
ζ(s) = (1/Γ(s)) ∫0∞ xs−1/(ex−1) dx。
这个积分表示和原级数等价,但积分在 x → 0 时仍需要 Re(s) > 1 才收敛。要延伸到更左侧,可以在零点附近展开:
1/(ex−1) = 1/x − 1/2 + x/12 − x3/720 + ···。
把这些显式的奇异项从积分中减去,再把它们的积分单独计算,就可以扩展积分表达式的适用区域。不断加入更多项,可逐步推进到更大的左半平面。这种做法适合构造解析证明,也能形成数值算法;但实现时要认真处理积分误差、Γ 函数以及不同项之间的抵消。
这类推导揭示一个常见原则:解析延拓往往不是“继续加原级数的项”,而是改写函数,减去已知奇异部分后再计算。
四、用交错级数延拓到 Re(s) > 0
一个更直接的恒等式来自狄利克雷 η 函数:
η(s) = 1 − 1/2s + 1/3s − 1/4s + ···。
在 Re(s) > 0 时,这个交错级数收敛,并满足
η(s) = (1 − 21−s)ζ(s)。
因此,在分母不为零的位置,可以写成
ζ(s) = η(s)/(1 − 21−s)。
这给出了 ζ 在 Re(s) > 0 的延拓表达式,但使用时要看清分母。s = 1 处,η(1) = log 2,而分母为零,因此 ζ 在这里确实有极点。分母还会在 s = 1 + 2πik/log 2(k 为整数)处为零;当 k ≠ 0 时,η 的零点会与之抵消,商应按可去奇点取极限,而不是直接做浮点除法。对于高精度计算,靠近这些点时直接使用这个商可能发生严重的数值抵消。
交错级数并不意味着可以随意取有限项。它在 Re(s) > 0 的收敛通常较慢,特别是靠近 Re(s) = 0 时;复数项的相位也会使误差估计更复杂。若采用截断和,需要使用有可靠误差界的加速方法,而不是仅凭“多加几项”判断结果准确。
五、函数方程:把 s 与 1−s 联系起来
ζ 函数最重要的结构之一是函数方程:
ζ(s) = 2sπs−1 sin(πs/2) Γ(1−s) ζ(1−s)。
这是亚纯函数之间的恒等式,不是只对某个狭窄区域成立的近似公式。它把 s 处的值联系到 1−s 处的值,因此可以将某些左侧区域的计算转移到右侧。公式中的 Γ 函数、正弦因子与 ζ(1−s) 可能分别出现零点或极点;在特殊点必须按解析延拓后的极限理解整体乘积,不能把单个因子的奇异性直接当作 ζ 的奇异性。
函数方程也可以通过“完成后的 ζ 函数”写得更对称。定义
ξ(s) = 1/2 s(s−1) π−s/2 Γ(s/2) ζ(s),
则 ξ(s) = ξ(1−s)。这个对称形式清楚地显示临界线 Re(s) = 1/2 的特殊地位。黎曼猜想讨论的非平凡零点位于 0 < Re(s) < 1,猜想它们都在这条线上;函数方程提供对称性,但本身并不能证明黎曼猜想。
ζ 在负偶整数 −2、−4、−6、……处为零,称为平凡零点。函数方程中的 sin(πs/2) 在这些点为零,与 Γ 因子及其他部分共同给出相应结果。不能只把“正弦项为零”当作所有点上都足够的论证,还要检查其他因子是否有极点以及整体的极限。
六、用 Python 计算并核对函数方程
下面示例使用 mpmath。它提供支持复数和任意精度的 ζ 函数实现,适合做实验与数值核对。安装依赖可运行 python -m pip install mpmath。代码不会把原始 Dirichlet 级数用于其发散区域,而是调用库函数计算解析延拓后的值,并用函数方程做交叉核对。
import mpmath as mp
def zeta_via_functional_equation(s):
"""用函数方程计算;遇到病态点时应改用 mp.zeta。"""
return (
mp.power(2, s)
* mp.power(mp.pi, s - 1)
* mp.sin(mp.pi * s / 2)
* mp.gamma(1 - s)
* mp.zeta(1 - s)
)
def main():
mp.mp.dps = 50 # 十进制有效位数;提高精度会增加计算成本
# 原定义级数绝对收敛的区域
s1 = mp.mpc(2, 0)
print("zeta(2) =", mp.nstr(mp.zeta(s1), 40))
# 临界带中的复数点:此处原始 Dirichlet 级数不收敛
s2 = mp.mpc("0.5", "14")
direct = mp.zeta(s2)
via_fe = zeta_via_functional_equation(s2)
print("zeta(0.5+14i) =", mp.nstr(direct, 35))
print("函数方程结果 =", mp.nstr(via_fe, 35))
print("两种计算之差 =", mp.nstr(abs(direct - via_fe), 8))
# 负整数点:用库函数取值,不直接代入可能含有奇异因子的公式
print("zeta(0) =", mp.nstr(mp.zeta(0), 20))
print("zeta(-2) =", mp.nstr(mp.zeta(-2), 20))
# s=1 是极点,不是有限函数值
print("zeta 在 s=1 处有简单极点,不能把它当作普通有限值计算。")
if __name__ == "__main__":
main()
示例中的函数方程函数只适用于右侧各因子能够稳定计算的普通点。实际数值表现取决于所选精度、参数位置和中间表达式的大小;某些点附近会出现大数相乘、小数相乘,或两个近似量相减造成的有效位数损失。误差打印为很小,只能说明这两条数值路径在当前精度下相互吻合,不能代替严格误差证明。
mpmath 的 mp.zeta 通常比手写函数方程更适合作为一般计算入口,因为库实现可以根据参数选择算法。提高 mp.mp.dps 有助于减轻舍入误差,但不保证所有问题都自动变得稳定:接近极点、零点,或遇到强烈抵消时,仍需改变公式、提升工作精度并检查结果。
七、什么时候用哪种表达式
- Re(s) > 1,且需要解释定义或作理论推导:使用绝对收敛的 Dirichlet 级数;若要讨论素数结构,可在满足条件时使用欧拉乘积。
- 0 < Re(s) 附近的分析:η 函数关系便于推导和展示延拓,但截断求值可能很慢,且要特别处理分母的零点。
- 需要理解全平面的对称性、负整数值或零点结构:使用函数方程与完成后的 ξ 函数。逐点数值计算时,不必强行手算公式中的每个因子。
- 需要在程序中一般性地求值:优先使用经过维护的任意精度数学库,记录库版本、输入精度和工作精度;对关键结果用独立方法核对。
- 要给出严格误差界:浮点软件输出本身不等于证明。应选择有经验证误差估计的算法,或使用区间算术等可控方法。
八、参数边界与常见错误
- 把级数定义域说得过大。原级数绝对收敛的条件是 Re(s) > 1;在 Re(s) ≤ 1 时,不能据此直接计算 ζ(s)。η 级数有更大的收敛范围,但它仍不是原来的 Dirichlet 级数。
- 把解析延拓误称为原级数的和。ζ(1/2) 是延拓后的函数值,不是发散级数 ∑n−1/2 的普通求和结果。若引入某种正则化求和概念,必须说明采用了什么定义,不能与通常收敛混为一谈。
- 忽略极点和可去奇点。s = 1 是 ζ 的真正极点;η 商式在分母为零的其他点则需要检查分子和极限。直接做浮点除法可能得到 NaN、无穷或失真值。
- 在特殊点逐项代入函数方程。Γ(1−s) 有极点,幂函数和三角因子也可能很小或为零。函数方程作为整体成立,不意味着每个中间因子都能在目标点直接计算。
- 把高精度等同于绝对可靠。更多位数能减轻舍入误差,无法修复错误公式、截断偏差、极点处的错误求值或不稳定的相消。应看算法适用范围,也要做独立核对。
- 把函数方程当成黎曼猜想的证明。它给出关于 s 与 1−s 的对称性,却没有排除非平凡零点偏离临界线的可能。
九、参数与安全使用说明
数学上的 s 可以是任意复数,但“函数有定义”不等于“任意计算都经济、稳定”。在 s = 1 处 ζ 有极点;在极点和零点附近,有限精度计算尤其需要谨慎。极大实部、极大虚部、极高精度请求或大量重复计算,也可能消耗显著 CPU 时间和内存。
如果把求值功能暴露给服务或接受外部输入,应校验参数为有限的实数与虚数组成的复数,不要把用户字符串交给 Python 的 eval 或其他通用代码执行器。为精度、输入长度、请求频率和计算时间设置合理上限;异常、超时与非有限结果要有明确处理。对外返回数值时,宜同时说明精度或误差信息。
ζ 函数计算不是加密算法,也不能用来替代随机数生成、密码哈希、签名或认证机制。调用 mpmath 进行数学计算,本身不提供密码学安全保证;若应用需要安全性质,应使用专门设计并经过审查的密码学方案。这些限制和一般的资源管理建议,并不意味着解析延拓公式本身带有特殊安全风险。
结语
黎曼 ζ 函数的级数在 Re(s) > 1 绝对收敛,却不足以描述函数的全部结构。积分减项、交错级数与函数方程从不同角度把它延伸到原级数之外,并揭示它在极点、零点和临界线附近的性质。实践中要牢记:延拓后的数值不是发散级数的普通和;函数方程在特殊点需要按整体极限理解;数值库的结果也必须结合精度、算法和输入边界判断。









