You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动