
2026/05/06 2:08
シンプル・ラランダム・ツリー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026 年 2 月 27 日、Brandon Wilson は、平面上の木と厳密な ballot シーケンスの間の同型関係を確立することで、Richard P. Stanley の有名な Catalan 数の公式 $C_n = \frac{1}{n+1}\binom{2n}{n}$ の組み合わせ論的証明を提示した。深さ優先探索(DFS)による深度ベクトル木表現上的遍历を用いるこの手法は、シーケンスの開始値を 1 とし、非ルートノードについて下降には +1、上昇には -1 を加算することでシーケンスを構築する。これらシーケンスの総和は正確に 1 であり、長さ $2n+1$ の範囲において $n+1$ つの 1 と $n$ つの負の 1 から構成されている。部分総和が正であることを保証するため、本アプローチでは回転技法を採用している:ランダムシーケンスで最小部分総和を持つ最も右側のインデックスを見出し、それを回転させることで有効な ballot シーケンスを生成可能となる。互いに素の条件下におけるこのような一意なシーケンスの数は、直接 Catalan 公式に簡約される($\frac{1}{2n+1}\binom{2n+1}{n} = C_n$ であるため)。この幾何学的アプローチは抽象的な構造を可視化し、代数だけに依存せずに木トポロジーを明確にし、Stanley の基礎的教科書においては図説を用いた説明として強く推奨されている。
本文
2026 年 2 月 27 日に Brandon Wilson が投稿
ランダムに平面木を効率的に生成する方法があるでしょうか?
Richard P. Stanley 著『カターナン(カタラン)数』には、なぜカターナン数が以下の式を持ちうるのかを示す非常に秀逸な組合論的証明が記されています: [ C_n = {1 \over n+1}{2n \choose n} ]
標準的な証明では、カターナン数の帰納的な定義へ生成関数を適用することで行われますが、正直申し上げますと、これはこれらの数と組合論的対象との結びつきをあまり啓発的ではありません。二項係数が何らかの対象を数えていることを示唆し、またその除算操作が何らかの全同類群を暗示しているにもかかわらず、Stanley の証明は極めて直接であり美しく、これを共有せざるを得ないほどです。さて、この証明を具体的なプログラムとして具現化し、(n) 個のノードからなるランダムな木を生成してみましょう:
D←{n←⍵-1 ⍝ 「⍵−1」番目のカターナン数は、「⍵」個のノードからなる木の個数を数える x←x[?⍨≢x←1⍪(n⍴1)⍪n⍴¯1] ⍝ 長さ 1+2×⍵ のランダムなステップベクトル d←0⍪¯1↓+⍀x ⍝ 深さベクトル i←⊃⌽⍸(⌊⍀d)=d ⍝ 最下位かつ右端のノード x⌽⍨←i ⍝ 厳密なボールト数列( Strict ballot sequence) d←¯1+(x=1)⌿+⍀x ⍝ その対応する木の深さベクトル }
ここで中心にあるのは、平面木と厳密なボールト数列の間の同相写像です。これは既にご覧になっている深い表現を持つ木(deep representation)によって直接結びついており、ここではその概要には触れません。頭に描いておくべきイメージは、深度優先探索(Depth-First Search)のトラベッセルパターンです。
深さベクトルを構築するには、ノードを初めて訪れた際にその時点での現在の深さを書き留めるだけです。関連する数列を構成するには、ルートから始めて「1」を記録し、その後に下方向へ進んだたびに「1」を書き込み、さらに上方向へ戻った際には常に「¯1」を記録します。特に留意すべきは、ルートを除いてすべてのノードについて下への移動と上への移動がそれぞれ一度ずつ行われることであり、これにより部分和が常に少なくとも 1 以上であり、全体の和がちょうど 1 となることを保証しています。「1」と「¯1」からなるこのようなベクトルを厳密なボールト数列と呼び、それを与えられれば対応する木の深さベクトルへの変換は非常に簡単です:
+⍀x←1 1 ¯1 1 1 1 ¯1 ¯1 ¯1 1 ¯1 1 1 ¯1 ¯1 1 1 ¯1 ¯1 ⍝ 厳密なボールト数列 1 2 1 2 3 4 3 2 1 2 1 2 3 2 1 2 3 2 1 ⍝ 正の部分和を持つ ⊢d←¯1+(x=1)⌿+⍀x ⍝ 深さベクトルは ¯1 を無視する 0 1 1 2 3 1 1 2 1 2 ⍝ (変換後の結果)
さて、次に「1」と「¯1」からなるランダムな数列について考えてみましょう。厳密なボールト数列の候補となりうるのであれば、和が 1 でなければならないため、最初から「1」の方が「¯1」より一つ多い必要があることは明白です。これらを長さ (2n+1) の数列としてパラメータ化できます:「1」は (n+1) 個、「¯1」は (n) 個となります:
⊢x←x[?⍨≢x←1⍪(n⍴1)⍪n⍴¯1] ⍝ 上記の D と比較してください ¯1 ¯1 ¯1 1 ¯1 ¯1 ¯1 1 ¯1 ¯1 1 1 1 1 ¯1 1 1 1 1 1 ¯1
大半の場合、このようなランダムなベクトルは厳密なボールト数列にはなりません。なぜなら、部分和が 1 を下回ることが可能发生すからです。しかしながら、次のように考えてみましょう。(N) という値を指数 (i) における最も低い部分和とします:
i←⍸msk←s=N←⌊⌿s←+⍀x s⍪⍉⍪msk ¯1 ¯2 ¯3 ¯2 ¯3 ¯4 ¯5 ¯4 ¯5 ¯6 ¯5 ¯4 ¯3 ¯2 ¯3 ¯2 ¯1 0 1 2 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
(s_i) から始まる尾部の配列を見ると、そこには必ず「1」で終わることが分かります。すなわち、その尾部は (s_i) よりも下方 (N+1) 分下に位置します。他方、(s_i) 以前すべての部分は開始点から見て最も多くても (N) 分だけ下にあります。言い換えれば、尾部 (x_i \dots x_{2n}) を先頭に移植して部分和を再計算しても、それらは正のまま保たれます。別の言い方をすると、ボールト数列を (i) 回転させることにより厳密なボールト数列が得られます。あるいはより簡潔に言えば:
d←0⍪¯1↓+⍀x ⍝ 深さベクトル i←⊃⌽⍸(⌊⍀d)=d ⍝ 最下位かつ右端のノード x⌽⍨←i ⍝ 厳密なボールト数列
これを深さベクトルへの変換と組み合わせることで、
D の実装は完成します。さらに面白いことに、上記の内容からカターナン数の公式が自然に導かれます。「1」と「¯1」からなる長さ (2n+1) の文字列の総数はちょうど ({2n+1 \choose n}) であり、かつ (n) と (2n+1) は互いに素であるため、回転によって等しい数列を生じさせるものはないからです。つまり、配列の長さ (2n+1) は ({2n+1 \choose n}) を割り切ることになります。したがって、長さ (2n+1) を持つ厳密なボールト数列の個数は:
[ {1 \over 2n+1}{2n+1 \choose n} ]
となります。これは簡単な代数操作により、上記の (C_n) の値と一致することが確認できます。(\ n=0) の場合、長さ 1 の厳密なボールト数列が得られ、それは上記に示した同相写像に従って単一ノードからなるルートだけの木に対応します。つまり、「カターナン数は (n+1) ノードの平面木の個数を数える」ことが導かれます。
Stanley 氏の書籍は心躍るものであり、一通り読み込むことをお勧めします。上記の説明は一つの同相写像に過ぎませんが、その本には実に多彩な内容が収められており、さらに豊富な示唆的な図解も満載です。強く推奨いたします!