如何用Python计算前20个Bernoulli numbers?
如何用Python计算前20个Bernoulli numbers?
嘿,很高兴你对伯努利数和Ada Lovelace的算法感兴趣!既然你已经掌握了函数、循环、列表这些Python基础,咱们完全可以用伯努利数的递归定义来实现计算,这和Ada Lovelace在Note G里描述的算法思路是一致的哦。
先给你明确一下咱们要用的递归规则(这是伯努利数的标准定义):
- 第一个伯努利数 $B_0 = 1$
- 对于任意 $n \geq 1$,满足 $\sum_{k=0}^n \binom{n+1}{k} B_k = 0$,其中 $\binom{n+1}{k}$ 是组合数(也就是从n+1个元素里选k个的数目)
- 额外提一句:除了 $B_1$ 之外,所有下标为奇数(且大于1)的伯努利数都是0,这个特性可以帮咱们验证结果对不对
接下来咱们用Python实现这个逻辑,为了保证结果是精确的有理数(伯努利数都是有理数),咱们用fractions.Fraction来存储数值,避免浮点数的精度误差。代码里的每一步我都加了注释,你应该能轻松看懂:
from fractions import Fraction import math def get_bernoulli_numbers(n_count): # 初始化存储伯努利数的列表,B[0] = 1 bernoulli = [Fraction(1)] for n in range(1, n_count): # 计算当前B_n需要的求和项 total = Fraction(0) for k in range(n): # 计算组合数C(n+1, k),乘以对应的B_k,累加到总和 comb = math.comb(n + 1, k) total += comb * bernoulli[k] # 根据递归公式算出B_n:B_n = -1/(n+1) * 总和 b_n = -total / (n + 1) bernoulli.append(b_n) return bernoulli # 获取前20个伯努利数(从B0到B19) first_20_bernoulli = get_bernoulli_numbers(20) # 逐个打印结果 for idx, b_num in enumerate(first_20_bernoulli): print(f"B_{idx} = {b_num}")
运行这段代码后,你就能得到精确的前20个伯努利数啦。比如你会看到:
B_0 = 1
B_1 = -1/2
B_2 = 1/6
B_3 = 0
B_4 = -1/30
...以此类推到B_19
如果你对组合数的计算好奇,也可以自己实现一个组合数函数(不用math.comb),比如用阶乘的方式,这样更贴合你目前掌握的循环知识:
def comb(n, k): if k < 0 or k > n: return 0 if k == 0 or k == n: return 1 k = min(k, n - k) result = 1 for i in range(1, k + 1): result = result * (n - k + i) // i return result
把这个函数替换代码里的math.comb,效果是完全一样的~
备注:内容来源于stack exchange,提问作者Daylily




