トップ 塾講師木下 数列
← 前の記事 一覧へ 次の記事 →
ハノイの塔と2進法:どの円盤が、いつ動くか
目次
1. 最適解の再帰構造をもう一度 2. 背景:2 進法と 2 進付値 ν 2 3. 主結果:第 m 手で動く円盤は ν 2 ( m ) + 1 4. 移動回数と総手数を数え直す 5. グレイコード:配置そのものを 2 進で読む 6. 応用:目隠しでも解ける反復アルゴリズム
目次 1. 最適解の再帰構造をもう一度 2. 背景:2 進法と 2 進付値 ν 2 3. 主結果:第 m 手で動く円盤は ν 2 ( m ) + 1 4. 移動回数と総手数を数え直す 5. グレイコード:配置そのものを 2 進で読む 6. 応用:目隠しでも解ける反復アルゴリズム
前の記事「ハノイの塔:漸化式が解けると「世界の寿命」がわかる!? 」では、円盤 n n n 枚を 3 3 3 本の杭 A・B・C の間で動かす最小手数が a n = 2 n − 1 a_n=2^{\,n}-1 a n = 2 n − 1 手であることを、漸化式a n = 2 a n − 1 + 1 a_n=2a_{n-1}+1 a n = 2 a n − 1 + 1 から導いた。その導出の要は再帰 であった。すなわち「n n n 枚を動かす」を「n − 1 n{-}1 n − 1 枚を動かす」に帰着させ、実際の手順を一手ずつ具体的に追うことは一切しなかった。ではその具体的な手順 のほうは、どんな構造をしているのか。じつは最適解は2 進法で完全に符号化されている 。第 m m m 手でどの円盤が動くか、各円盤がどの杭に載っているか、総手数がなぜ 2 n − 1 2^n-1 2 n − 1 になるか。そのすべてが m m m を 2 2 2 進で書くだけで読み取れる。本稿ではこの対応を、背景から順にきちんと示す1 1 以下の命題はすべて、最適解を生成する短いシミュレーションで n = 1 , … , 7 n=1,\dots,7 n = 1 , … , 7 の全 2 n − 1 2^n-1 2 n − 1 手について機械的に照合した(第 m m m 手の円盤 = ν 2 ( m ) + 1 =\nu_2(m)+1 = ν 2 ( m ) + 1 、円盤 k k k の移動回数 = 2 n − k =2^{n-k} = 2 n − k 、グレイコードの 1 1 1 ビット変化 = 1 =1 = 1 円盤の移動、杭位置の閉じた式)。 。
1. 最適解の再帰構造をもう一度
n n n 枚を A から C へ最小手数で移す手順は、次の三段だった:
上の n − 1 n{-}1 n − 1 枚を A から B へ移す(a n − 1 a_{n-1} a n − 1 手)。
最大円盤 n n n を A から C へ移す(1 1 1 手)。
n − 1 n{-}1 n − 1 枚を B から C へ移す(a n − 1 a_{n-1} a n − 1 手)。
いま「第何手でどの円盤の番号が動くか」だけ を、手の順に一列に並べたものを S n S_n S n と書こう(円盤は小さいほうから1 , 2 , … , n 1,2,\dots,n 1 , 2 , … , n と番号を振る)。上の三段は、この列がそっくり自分自身の一回り小さい版を2回くり返す 形をしていることを意味する:
S n = S n − 1 ⏟ ① , n ⏟ ② , S n − 1 ⏟ ③ S_n \;=\; \underbrace{S_{n-1}}_{\text{①}},\;\; \underbrace{n}_{\text{②}},\;\; \underbrace{S_{n-1}}_{\text{③}} S n = ① S n − 1 , ② n , ③ S n − 1
実際、S 1 = ( 1 ) S_1=(1) S 1 = ( 1 ) から始めると
S 2 = 1 , 2 , 1 S 3 = 1 , 2 , 1 , 3 , 1 , 2 , 1 S 4 = 1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , 1 , 2 , 1 \begin{aligned}S_2&=1,2,1\\S_3&=1,2,1,\;3,\;1,2,1\\S_4&=1,2,1,3,1,2,1,\;4,\;1,2,1,3,1,2,1\end{aligned} S 2 S 3 S 4 = 1 , 2 , 1 = 1 , 2 , 1 , 3 , 1 , 2 , 1 = 1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , 1 , 2 , 1
となる。この自己相似な列 こそ、以下すべての土台である。中央の項がちょうど各段の最大番号になり、その両側に一段下の模様がくり返される。
2. 背景:2 進法と 2 進付値 ν 2 \nu_2 ν 2
2 2 2 進法とは、数を 0 , 1 0,1 0 , 1 の並びで、右の桁から順に 2 0 , 2 1 , 2 2 , … 2^0,2^1,2^2,\dots 2 0 , 2 1 , 2 2 , … の重みで位取りする書き方である(例:6 = 4 + 2 = 110 ( 2 ) 6=4+2=110_{(2)} 6 = 4 + 2 = 11 0 ( 2 ) 、11 = 8 + 2 + 1 = 1011 ( 2 ) 11=8+2+1=1011_{(2)} 11 = 8 + 2 + 1 = 101 1 ( 2 ) )。ここで主役になるのは、各正整数 m m m に対して定まる2 2 2 進付値 ν 2 ( m ) \nu_2(m) ν 2 ( m ) である。
ν 2 ( m ) \nu_2(m) ν 2 ( m ) とは
ν 2 ( m ) \nu_2(m) ν 2 ( m ) を、m m m を割り切る 2 2 2 の最大べきの指数と定める。すなわち m = 2 e ⋅ ( 奇数 ) m=2^{\,e}\cdot(\text{奇数}) m = 2 e ⋅ ( 奇数 ) と一意に書いたときのe e e のこと。これは m m m の 2 2 2 進表記で右に並ぶ 0 0 0 の個数 に等しく、言いかえれば最下位の 1 1 1 が右から数えて第 ( ν 2 ( m ) + 1 ) (\nu_2(m)+1) ( ν 2 ( m ) + 1 ) 桁 にある、ということである。
ν 2 ( 1 ) = 0 , ν 2 ( 2 ) = 1 , ν 2 ( 3 ) = 0 , ν 2 ( 4 ) = 2 , ν 2 ( 6 ) = 1 , ν 2 ( 8 ) = 3. \begin{aligned}&\nu_2(1)=0,\quad \nu_2(2)=1,\quad \nu_2(3)=0,\quad \nu_2(4)=2,\quad \nu_2(6)=1,\\&\nu_2(8)=3.\end{aligned} ν 2 ( 1 ) = 0 , ν 2 ( 2 ) = 1 , ν 2 ( 3 ) = 0 , ν 2 ( 4 ) = 2 , ν 2 ( 6 ) = 1 , ν 2 ( 8 ) = 3.
たとえば 6 = 110 ( 2 ) 6=110_{(2)} 6 = 11 0 ( 2 ) は末尾の 0 0 0 が 1 1 1 個で ν 2 ( 6 ) = 1 \nu_2(6)=1 ν 2 ( 6 ) = 1 、最下位の 1 1 1 は右から第 2 2 2 桁。12 = 1100 ( 2 ) 12=1100_{(2)} 12 = 110 0 ( 2 ) ならν 2 ( 12 ) = 2 \nu_2(12)=2 ν 2 ( 12 ) = 2 である。
3. 主結果:第 m m m 手で動く円盤は ν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1
定規数列との一致
n n n 枚のハノイの塔の最適解において、第 m m m 手で動かす円盤の番号は ν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1 に等しい (1 ≤ m ≤ 2 n − 1 1\le m\le 2^n-1 1 ≤ m ≤ 2 n − 1 )。番号の並び S n S_n S n は m = 1 , 2 , 3 , … m=1,2,3,\dots m = 1 , 2 , 3 , … に沿って
1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , … 1,\,2,\,1,\,3,\,1,\,2,\,1,\,4,\,1,\,2,\,1,\,3,\dots 1 , 2 , 1 , 3 , 1 , 2 , 1 , 4 , 1 , 2 , 1 , 3 , …
となり、これは定規数列 (ruler sequence, OEIS A001511)と呼ばれる、ものさしの目盛りの高さと同じ模様である。
証明(n n n に関する帰納法).
n = 1 n=1 n = 1 のときは第 1 1 1 手で円盤 1 1 1 を動かすだけで、ν 2 ( 1 ) + 1 = 1 \nu_2(1)+1=1 ν 2 ( 1 ) + 1 = 1 と合う。次に、n − 1 n{-}1 n − 1 枚で主張が成り立つと仮定する。全体は 2 n − 1 2^n-1 2 n − 1 手で、前半 S n − 1 S_{n-1} S n − 1 は 2 n − 1 − 1 2^{n-1}-1 2 n − 1 − 1 手だから、中央の第 2 n − 1 2^{n-1} 2 n − 1 手 が最大円盤 n n n を動かす手である。2 n − 1 = 1 00 ⋯ 0 ⏟ n − 1 ( 2 ) 2^{n-1}=1\underbrace{00\cdots0}_{n-1}{}_{(2)} 2 n − 1 = 1 n − 1 00 ⋯ 0 ( 2 ) ゆえ ν 2 ( 2 n − 1 ) = n − 1 \nu_2(2^{n-1})=n-1 ν 2 ( 2 n − 1 ) = n − 1 で、ν 2 + 1 = n \nu_2+1=n ν 2 + 1 = n 。中央は合う。
残りは前半(第 1 ∼ 2 n − 1 − 1 1\sim 2^{n-1}{-}1 1 ∼ 2 n − 1 − 1 手)と後半(第 2 n − 1 + 1 ∼ 2 n − 1 2^{n-1}{+}1\sim 2^n{-}1 2 n − 1 + 1 ∼ 2 n − 1 手)で、どちらも中身は S n − 1 S_{n-1} S n − 1 である。前半では手番 m m m がそのまま n − 1 n{-}1 n − 1 枚の問題の手番だから、帰納法の仮定でその円盤は ν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1 。後半では、第( 2 n − 1 + j ) (2^{n-1}{+}j) ( 2 n − 1 + j ) 手(1 ≤ j ≤ 2 n − 1 − 1 1\le j\le 2^{n-1}-1 1 ≤ j ≤ 2 n − 1 − 1 )が S n − 1 S_{n-1} S n − 1 の第 j j j 手と同じ円盤 を動かす。ここで j < 2 n − 1 j<2^{n-1} j < 2 n − 1 だから、2 n − 1 + j 2^{n-1}+j 2 n − 1 + j の 2 2 2 進表記はj j j を n − 1 n{-}1 n − 1 桁で(足りない上の桁は 0 0 0 で埋めて)書いた表記の左に 1 1 1 を一つ足しただけ で、右側の桁、とりわけ末尾の 0 0 0 の個数は、そっくり変わらない。ゆえに ν 2 ( 2 n − 1 + j ) = ν 2 ( j ) \nu_2(2^{n-1}+j)=\nu_2(j) ν 2 ( 2 n − 1 + j ) = ν 2 ( j ) となり、動かす円盤も ν 2 ( j ) + 1 \nu_2(j)+1 ν 2 ( j ) + 1 で一致する。以上で n n n 枚でも主張が成り立つ。■ \blacksquare ■
3 3 3 枚(全 7 7 7 手)で読み取る
最初は 3 3 3 枚すべてが杭 A: 。各手で m m m を 2 2 2 進で書き、枠で囲んだ最下位の 1 1 1 の桁位置が、そのまま動かす円盤の番号になる(配置図は左から A・B・C、円盤は大きいほど幅広で濃い)。
手数 m m m m m m を 2 2 2 進で(最下位の 1 1 1 を□)ν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1 =動かす円盤その手のあとの配置 1 1 1 0 0 1 0\,0\,\boxed{1} 0 0 1 0 + 1 = 0+1= 0 + 1 = 円盤 1 1 1 2 2 2 0 1 0 0\,\boxed{1}\,0 0 1 0 1 + 1 = 1+1= 1 + 1 = 円盤 2 2 2 3 3 3 0 1 1 0\,1\,\boxed{1} 0 1 1 0 + 1 = 0+1= 0 + 1 = 円盤 1 1 1 4 4 4 1 0 0 \boxed{1}\,0\,0 1 0 0 2 + 1 = 2+1= 2 + 1 = 円盤 3 3 3 5 5 5 1 0 1 1\,0\,\boxed{1} 1 0 1 0 + 1 = 0+1= 0 + 1 = 円盤 1 1 1 6 6 6 1 1 0 1\,\boxed{1}\,0 1 1 0 1 + 1 = 1+1= 1 + 1 = 円盤 2 2 2 7 7 7 1 1 1 1\,1\,\boxed{1} 1 1 1 0 + 1 = 0+1= 0 + 1 = 円盤 1 1 1
4. 移動回数と総手数を数え直す
上の対応から、各円盤の働きぶり も見える。円盤 k k k が動くのは ν 2 ( m ) + 1 = k \nu_2(m)+1=k ν 2 ( m ) + 1 = k 、すなわち ν 2 ( m ) = k − 1 \nu_2(m)=k-1 ν 2 ( m ) = k − 1 のとき、つまり m m m が 2 k − 1 2^{k-1} 2 k − 1 の奇数倍 のときである(m = 2 k − 1 , 3 ⋅ 2 k − 1 , 5 ⋅ 2 k − 1 , … m=2^{k-1},\,3\cdot2^{k-1},\,5\cdot2^{k-1},\dots m = 2 k − 1 , 3 ⋅ 2 k − 1 , 5 ⋅ 2 k − 1 , … )。1 ≤ m ≤ 2 n − 1 1\le m\le 2^n-1 1 ≤ m ≤ 2 n − 1 の範囲にこれは
円盤 k の移動回数 = 2 n − k ( 回 ) \text{円盤 $k$ の移動回数}=2^{\,n-k}\quad(\text{回}) 円盤 k の移動回数 = 2 n − k ( 回 )
だけある。番号が 1 1 1 大きいと回数は半分、最大円盤 n n n はちょうど 1 1 1 回。総手数はこれらの和で、初項 1 1 1 ・公比 2 2 2 ・項数 n n n の等比数列の和 として
∑ k = 1 n 2 n − k = 2 n − 1 + 2 n − 2 + ⋯ + 2 + 1 = 2 n − 1 2 − 1 = 2 n − 1. \begin{aligned}\sum_{k=1}^{n} 2^{\,n-k}&=2^{\,n-1}+2^{\,n-2}+\cdots+2+1\\&=\frac{2^{\,n}-1}{2-1}\\&=2^{\,n}-1.\end{aligned} k = 1 ∑ n 2 n − k = 2 n − 1 + 2 n − 2 + ⋯ + 2 + 1 = 2 − 1 2 n − 1 = 2 n − 1.
2 n − 1 2^n-1 2 n − 1 を 2 2 2 進で書けば 11 ⋯ 1 ⏟ n ( 2 ) \underbrace{11\cdots1}_{n}{}_{(2)} n 11 ⋯ 1 ( 2 ) (1 1 1 が n n n 個)で、各円盤がちょうど一つの桁を受け持つ、と読める。前の記事で漸化式から得た 2 n − 1 2^n-1 2 n − 1 が、ここでは一手ごとの数え上げ から再び現れた。
5. グレイコード:配置そのものを 2 2 2 進で読む
「どの円盤が動くか」だけでなく、各時点の配置 も 2 2 2 進と結びつく。鍵は反射 2 2 2 進グレイコード
G ( m ) = m ⊕ ⌊ m / 2 ⌋ ( ⊕ はビットごとの排他的論理和 ) \begin{aligned}G(m)&=m\oplus\lfloor m/2\rfloor\qquad (\oplus\text{ はビットごとの排他的論理和})\end{aligned} G ( m ) = m ⊕ ⌊ m /2 ⌋ ( ⊕ はビットごとの排他的論理和 )
である。G ( 0 ) , G ( 1 ) , G ( 2 ) , ⋯ = 0 , 1 , 3 , 2 , 6 , 7 , 5 , 4 , … G(0),G(1),G(2),\dots=0,1,3,2,6,7,5,4,\dots G ( 0 ) , G ( 1 ) , G ( 2 ) , ⋯ = 0 , 1 , 3 , 2 , 6 , 7 , 5 , 4 , … は、隣り合う 2 2 2 数がちょうど 1 1 1 ビットだけ違う という性質をもつ 0 0 0 以上の整数の並べ替えである。
1 1 1 手 = = = 1 1 1 ビット反転 = = = 1 1 1 円盤の移動
G ( m − 1 ) G(m-1) G ( m − 1 ) と G ( m ) G(m) G ( m ) が異なるただ一つのビットは、右から第 ( ν 2 ( m ) + 1 ) (\nu_2(m)+1) ( ν 2 ( m ) + 1 ) 桁 にある(これはグレイコードの定義からすぐ従う)。一方ハノイの第 m m m 手で動くのは円盤 ν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1 であった。よって、
m を 1 進めて配置を 1 手変える ⟺ G ( m ) の第 ( ν 2 ( m ) + 1 ) 桁が反転する \begin{gathered}m\text{ を }1\text{ 進めて配置を }1\text{ 手変える}\\\Longleftrightarrow\;G(m)\text{ の第 }(\nu_2(m)+1)\text{ 桁が反転する}\end{gathered} m を 1 進めて配置を 1 手変える ⟺ G ( m ) の第 ( ν 2 ( m ) + 1 ) 桁が反転する
が完全に対応する。ハノイの最適解を進めることは、グレイコードで数を数えること にほかならない。第 k k k 桁が円盤 k k k を担い、桁が反転するたびにその円盤が動く。
さらに、各円盤の行き先 にも規則がある。円盤 k k k は動くたびに、三つの杭をつねに同じ向き に巡回する。向きは n − k n-k n − k の偶奇で決まり、
n − k が偶 : A → C → B → A → ⋯ , n − k が奇 : A → B → C → A → ⋯ \begin{aligned}n-k\ \text{が偶}&:\ \text{A}\to\text{C}\to\text{B}\to\text{A}\to\cdots,\\n-k\ \text{が奇}&:\ \text{A}\to\text{B}\to\text{C}\to\text{A}\to\cdots\end{aligned} n − k が偶 n − k が奇 : A → C → B → A → ⋯ , : A → B → C → A → ⋯
である(最大円盤 k = n k=n k = n は n − k = 0 n-k=0 n − k = 0 で偶、一度だけ A → C \text{A}\to\text{C} A → C 。最小円盤 k = 1 k=1 k = 1 は n n n が奇なら A → C \text{A}\to\text{C} A → C から、偶なら A → B \text{A}\to\text{B} A → B から動きだす)。第 m m m 手までに円盤 k k k が動いた回数を t k ( m ) = ⌊ ( ⌊ m / 2 k − 1 ⌋ + 1 ) / 2 ⌋ t_k(m)=\bigl\lfloor(\lfloor
m/2^{k-1}\rfloor+1)/2\bigr\rfloor t k ( m ) = ⌊ (⌊ m / 2 k − 1 ⌋ + 1 ) /2 ⌋ とすれば、円盤 k k k の載る杭は上の巡回を t k ( m ) t_k(m) t k ( m ) 歩進めた先 であり、これで任意の時刻 m m m の全配置 が閉じた式で定まる。
6. 応用:目隠しでも解ける反復アルゴリズム
最小円盤の巡回規則だけを取り出すと、再帰も記憶も使わず に最適解を打てる。次を交互にくり返すだけでよい。
反復解(グレイコード順)
奇数手 (第 1 , 3 , 5 , … 1,3,5,\dots 1 , 3 , 5 , … 手)では、最小円盤 を巡回の向きに 1 1 1 つ進める(n n n が偶なら A → B → C → A \text{A}\to\text{B}\to\text{C}\to\text{A} A → B → C → A 、n n n が奇なら A → C → B → A \text{A}\to\text{C}\to\text{B}\to\text{A} A → C → B → A )。
偶数手 では、最小円盤を含まない 唯一の合法手を打つ(そのような手はつねにちょうど 1 1 1 通り)。
これを 2 n − 1 2^n-1 2 n − 1 手くり返すと、円盤はすべて C に正しく積み上がる。
なぜ偶数手の合法手が一意かというと、最小円盤以外の 2 2 2 本の杭の一番上を比べれば、小さいほうを大きいほうへ載せる手しか許されないからである(一方の杭が空なら、もう一方の一番上をその空の杭へ移す手だけが許される。両方とも空になるのは全円盤が最小円盤と同じ杭にあるとき、すなわち最初と最後の配置だけなので、偶数手では起こらない)。奇数手・偶数手いずれも「次の一手」がその場の状況だけで決まるので、先の手順を覚えておく必要がない。前の記事で見た再帰 は「全体を追わずに済ませる」考え方だったが、こちらは反対に、一手ごとの確定した規則 として同じ最適解を与える。同じ最適解を、上からたたむ再帰と、下から数えるグレイコードという二つのまったく異なる言葉で言い表せる、というのがこの対応の要点である。
まとめ:ハノイの塔と 2 2 2 進法
最適解の円盤番号列は自己相似 S n = S n − 1 , n , S n − 1 S_n=S_{n-1},n,S_{n-1} S n = S n − 1 , n , S n − 1 。第 m m m 手の円盤はν 2 ( m ) + 1 \nu_2(m)+1 ν 2 ( m ) + 1 (定規数列)。
円盤 k k k は 2 n − k 2^{n-k} 2 n − k 回動き、総和は 2 n − 1 2^n-1 2 n − 1 。2 n − 1 = 1 ⋯ 1 ⏟ n ( 2 ) 2^n-1=\underbrace{1\cdots1}_{n}{}_{(2)} 2 n − 1 = n 1 ⋯ 1 ( 2 ) 。
配置の遷移はグレイコード G ( m ) = m ⊕ ⌊ m / 2 ⌋ G(m)=m\oplus\lfloor m/2\rfloor G ( m ) = m ⊕ ⌊ m /2 ⌋ の 1 1 1 ビット反転。各円盤は杭を一方向に巡回し、配置は m m m から閉じた式で定まる。
最小円盤を巡回・残りは唯一手、の反復アルゴリズム で、記憶なしに最適解を打てる。
1 以下の命題はすべて、最適解を生成する短いシミュレーションで n = 1 , … , 7 n=1,\dots,7 n = 1 , … , 7 の全 2 n − 1 2^n-1 2 n − 1 手について機械的に照合した(第 m m m 手の円盤 = ν 2 ( m ) + 1 =\nu_2(m)+1 = ν 2 ( m ) + 1 、円盤 k k k の移動回数 = 2 n − k =2^{n-k} = 2 n − k 、グレイコードの 1 1 1 ビット変化 = 1 =1 = 1 円盤の移動、杭位置の閉じた式)。
塾の授業で配った補足資料をもとに書き直しました。
← 塾講師木下の記事一覧へ