ベル数計算ツール
B(5)は52です。5個の異なるものを、グループの順番を区別せずに空でないグループに分ける方法は52通りあります。0から20までのnを入力すると、正確なベル数が分かります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 添字 n
- 0
- ベル数
- 1
無料
ベル数が数えているもの
ベル数は、n個の異なるものをいくつかのグループに分ける方法が何通りあるかという、シンプルな数え上げの答えです。空のグループは作らず、グループの順番もグループの中の順番も区別しません。3個なら、全部をまとめる、1個ずつに分ける、3通りある2個の組のどれかを作って残りを別にする、の5通りです。nが0から7のとき、数列は1、1、2、5、15、52、203、877と進み、急速に大きくなります。グループの順番を区別しないので、B(n)はグループ数ごとの第2種スターリング数をすべて足した値にも等しくなります。
計算のしくみと使われる場面
それぞれのベル数は、それより前のベル数から組み立てられます。次の値を出すには、それまでのベル数にそれぞれ二項係数を掛けて足し合わせます。これはベルの三角形と同じ規則で、巨大な階乗を作らないため、どの結果も正確な整数のままです。範囲は0から20までで、集合の分割やスターリング数を学ぶ組合せ論の授業で使う範囲にあたり、小さな場合は手で確かめられます。よくある間違いは順番を数えてしまうことです。グループAとBに分けるのも、BとAに分けるのも同じ分け方で、別々に数えると多くなりすぎます。
用いている漸化式
内部では、静的な参照表ではなくボトムアップの漸化式で値を構築します。B(0)=1 から始め、新しい B(i+1) はそれぞれ k についての C(i,k)·B(k) の総和として累積されます。ここで二項係数 C(i,k) は、乗法的な更新 c = c·(i−k+1)/k によって逐次的に生成されるため、オーバーフローを招きかねない階乗を一度も作りません。
累積和は保存される前に Math.round を通され、除算が混入させ得る微小な浮動小数点誤差を補正するので、保存される各 B(i) は厳密な整数のままとなります。これはベル三角形の基礎をなすのと同じ恒等式であり、O(n²) 回の加算で評価されます。
活用例
組合せ論の授業
集合分割やスターリング数を教える際に分割数 B(0)〜B(20) を確認できます。小さな n なら学生が手計算で検証できる厳密な整数が得られます。
よくある質問
これは何を計算しますか?
ベル数 B(n)、すなわち n 個の要素からなる集合を空でない順序なしのブロックに分割する場合の数です。n をそのまま返し、value を返します。
なぜ n は 20 までなのですか?
B(20) = 51,724,158,235,372 は倍精度数に厳密に収まる最大のベル数であり、20 を超えると結果が厳密でなくなる可能性があるためです。n は 0〜20 の整数でなければなりません。
答えは厳密ですか?
はい。 各項は漸化式の内部で整数へ丸め直されるため、value は浮動小数点の近似ではなく厳密な整数です。
不正な入力では何が返りますか?
たとえば整数でない n、負の n、範囲外の n、あるいは n の欠落などです。
3つのものをグループに分ける方法は何通りですか?
B(3)の5通りです。3つ全部をまとめる、1つずつ分ける、3通りある2つの組のどれかを作って残りの1つを別にする、の5通りになります。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/math/bell-number \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"n":5}'const res = await fetch("https://api.kit.forhosting.com/math/bell-number", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"n": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/bell-number",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"n": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/bell-number", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"n":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"n":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/bell-number", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"n": 5
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.bell_number",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
0 以上 20 以下の整数 n を入力すると、n 個の要素からなる集合を空でない順序なしのブロックに分割する場合の数 B(n) を、厳密な整数として JSON で返します。ブラウザでは無料、API は $0.002 からご利用いただけます。
B(n) が数えるもの
分割はブロックの順序もブロック内の要素の順序も区別しないため、B(n) は取り得るすべてのブロック数にわたる第 2 種スターリング数の総和にも等しくなります。結果は常に厳密な整数であり、浮動小数点数や近似値になることは決してないため、後続のコードで直接比較できます。0 以上の整数 n を与えると、このエンドポイントはベル数 B(n) を返します。これは n 個の相異なる要素からなる集合を、空でない順序なしのブロックに分割する場合の数を表します。B(0) と B(1) はどちらも 1 で、そこから n = 2 から 7 にかけて 2, 5, 15, 52, 203, 877 と増加していきます。リクエストボディには必須フィールド n を一つだけ含め、レスポンスはその n と、計算されたベル数である value を並べて、{"n":5,"value":52} のようなプレーンな JSON として返します。
用いている漸化式
n までのすべての中間値 B(k) は一度だけ計算されて再利用されるため、n=20 の呼び出しでも数百回程度の演算で即座に返り、破綻するような再帰の深さも、リクエスト間で温める必要のあるメモ化キャッシュもありません。
範囲・検証・利用
検証は厳格で、いかなる計算よりも前に行われます。上限を 20 としているのは意図的です。負の n、小数の n、文字列、配列、n の欠落は、いずれも同じように拒否されます。入力は JSON オブジェクトでなければならず、n は整数で、閉区間 0〜20 に収まっていなければなりません。それ以外は、単なる例外ではなく問題のあるフィールド名を示す型付きの invalid_input エラーを送出します。B(20) は 51,724,158,235,372 で、JavaScript の倍精度数に厳密に収まる最大のベル数であり、このエンドポイントが丸められた大きな整数を黙って返すことは決してありません。どちらも同一の決定的なモジュールをインポートしているため、ページ上でプレビューする JSON と、自動処理が受け取る JSON はバイト単位で一致します。
連携の活用例
テスト用フィクスチャ
既知の正しいベル数を golden 値として生成し、自作の分割・クラスタリング・列挙コードのユニットテストに利用できます。
数列ツール
大きな整数のライブラリをクライアントに同梱することなく、API 経由で OEIS A000110 の参照値やスプレッドシートを一括で作成できます。
技術的な質問
無料ですか?
ブラウザでは tier A widget として無料です。API は成功した呼び出し 1 回あたり $0.002 かかり、失敗したタスクは課金されません。