Engee 文档
Notebook

贝尔的数字

这个例子讨论了Julia编程语言中贝尔数计算的实现。

导言

钟数是组合学中的一个数字序列,它对于计算将一个集合划分为不相交子集的不同方式的数量很重要。

贝尔的号码 表示分割一组不同方法的数目 元素划分为非空子集。 这些数字用于概率论,统计学和数学的其他领域。

这些数字的例子:

  • (空集只有一个分区)

  • (例如,集 {a,b} 可以分解为 {{a},{b}}{{a,b}})

  • (这三个元素可以用五种不同的方式分解)

功能的实现 bellnum

此函数采用整数 n 并计算相应的值 "贝尔的头号。"如果传递的值小于零,则函数抛出域错误(DomainError).

案件将在以下情况下进一步处理 n >= 2 由于钟形数字的初始值已经知道: .

In [ ]:
"""
    bellnum(n)
Compute the ``n``th Bell number.
"""
function bellnum(n::Integer)
    if n < 0
        throw(DomainError(n)) # Выкидываем ошибку для недопустимых значений
    elseif n < 2
        return 1              # Для n=0 и n=1 значение равно 1
    end
    
    list = Vector{BigInt}(undef, n)   # Создаем вектор размером n
    list[1] = 1                       # Начальное значение

    for i = 2:n             # Для каждой строки от 2 до n
        for j = 1:i - 2     # Обновляем все промежуточные значения
            list[i - j - 1] += list[i - j]
        end
        list[i] = list[1] + list[i - 1]  # Получаем новое число Белла
    end

    return list[n]       # Возвращаем результат
end
Out[0]:
bellnum

接下来,创建类型的向量 Vector{BigInt} 长度 n. 我们使用的类型 BigInt 为了避免溢出,因为钟数字本身迅速增长。 最初,数组的第一个元素设置为一个,因为 .

接下来,主要工作是使用钟形三角形方法计算钟形数的值。 该算法建立一个三角形,其中每行是 i 包含 (i+1) 一个元素,每个元素都是序列中下一个数字的前兆。

周期内的基本步骤:

1. 嵌套循环更新列表中的中间值以获取钟形序列的新成员。

2. 在内循环之后,形成一个新的钟号值,该值存储在列表的最后一个元素中。

在输出处,函数返回 list[n],即最后计算的贝尔数正是序列第n个元素的答案。

使用函数

定义函数后,使用从1到50的简单循环,一次一个地调用我们的函数。 bellnum(i) 对于该范围内的每个i,并通过以下方式将结果输出到控制台 println().

In [ ]:
for i in 1:50          # Проходим по числам от 1 до 50
    println(bellnum(i)) # Выводим значения чисел Белла
end
1
2
5
15
52
203
877
4140
21147
115975
678570
4213597
27644437
190899322
1382958545
10480142147
82864869804
682076806159
5832742205057
51724158235372
474869816156751
4506715738447323
44152005855084346
445958869294805289
4638590332229999353
49631246523618756274
545717047936059989389
6160539404599934652455
71339801938860275191172
846749014511809332450147
10293358946226376485095653
128064670049908713818925644
1629595892846007606764728147
21195039388640360462388656799
281600203019560266563340426570
3819714729894818339975525681317
52868366208550447901945575624941
746289892095625330523099540639146
10738823330774692832768857986425209
157450588391204931289324344702531067
2351152507740617628200694077243788988
35742549198872617291353508656626642567
552950118797165484321714693280737767385
8701963427387055089023600531855797148876
139258505266263669602347053993654079693415
2265418219334494002928484444705392276158355
37450059502461511196505342096431510120174682
628919796303118415420210454071849537746015761
10726137154573358400342215518590002633917247281
185724268771078270438257767181908917499221852770

结论

我们回顾了Julia中计算贝尔数的算法的实现,了解了其逻辑,并通过输出一系列数字将其付诸实践。 这种方法使得在不使用递归的情况下很容易找到大的贝尔数值。 这在离散数学和组合结构分析问题中很有用.

该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/Bell_numbers