数ならぬ

理学系のこと、特に数学について書きます。雑学的な知識もまとめていく所存。

自然数の分割、あるいは階段の昇降

  今も時たまやることではあるが、幼い頃から階段を一段飛ばしで上るのが楽しかった。今考えるとちょっと滑稽だが、階段を一段飛ばすことで漠然と決められた生活のルールみたいなものを破っている気分になれたからである。

 

 そんな話は、結局は数学の話に帰着される。数学において次のような有名問題がある。

 

階段昇降問題
階段を普通に上る、そして一段飛ばしで上るという二つの選択肢が与えられている。このとき、n段の階段を上るときの場合の数を求めなさい

 

 なかなか面白そうな問題である。例えば4段の階段を上ることを考えてみよう。

4段の階段の図

 下手クソな絵で申し訳ないが、下の人が頑張って階段を上っていく様子を想像してほしい。

まず、素直に1段ずつ着実に上っていく場合があるだろう。

1歩1歩階段を上った人の図

  そのほかに1段飛ばしを入れてみたり、

1段飛ばしてみた人の図

  全部1段飛ばしを使って上る場合もある。

1段飛ばしだけで上る人の図

 とまあ、色々な上り方を合わせて最終的な場合の数は5通り存在する。ただ、これはあくまでnに4を入れてみた場合の具体例にすぎない。これをどうやって一般的に求めるのかが難しいところである。ここで、漸化式を用いて問題を分割する。

 

数列の定義
n段の階段を与えられた方法で上るときの場合の数をa_nとおく

 

 こうして数列を置くことで我々は漸化式という超強力な武器を使うことができるようになるのだった。ここで、a_n再帰的に数えよう。

 

n+2段の階段を与えられた条件で上ることを考える。すると、以下の二つのパターンがあることに気づく。
(i)一段上って踊り場に着く
(ii)一段飛ばしで踊り場に着く
(i)のとき、踊り場に着く前にはn+1段まで上っていたことになるが、この場合の数はa_{n+1}通りある。
(ii)のとき、踊り場に着く前にはn段まで上っていたことになるが、この場合の数はa_n通りある。
これら(i)と(ii)の場合は排反であるので足せばn+2段の場合の数が求められる。よって求めたかった場合の数はa_{n+1}+a_nである。定義より数えていた場合の数はa_{n+2}に一致するので
a_{n+2}=a_{n+1}+a_nが成り立つことがわかる◽︎
 
 漸化式は初期値とセットで初めて数列を定義することができるので、初期値を求める。
 a_1は当然1である。これに異論はないだろう。a_2は地道に一段一段上るのと一気に一段スキップしてしまう上り方の2通りがあるので2である。さあ、定義されたa_nを並べてみよう。
 
 \{1, 2, 3, 5, 8, 13, 21, 34,\cdots\}
 
 おもむろにフィボナッチ数列を下に置いておく。
 
 \{1, 1, 2, 3, 5, 8, 13, 21,\cdots\}
 
 ん?

 

 異国の地で友人に会ったときのような安心感すら覚える。なんやお前、ここにもおったんか

 

 このことは気にせずに一旦一般化した数列を考えてみよう。異国にまさか友人がいるはずはない。きっと幻覚である。

一般化した問題を考える上で断っておきたいことがある。それは一段飛ばしという名称、やめませんか?ということである。一段飛ばしすると階段は二段進んだことになる。これはちょっとわかりづらいだろう。ということでちょっと大人ぶってこの操作を一般的に定義してみよう。

 

階段を上るときの技名
k段一気に階段を上ることをk段上りと定義する

 

 定義から、一段飛ばしは2段上りであり、通常の上り方は1段上りである。名称と実際に上る段数のずれを修正しただけである。

 ここまで考えたことを使うと、一般化した問題を簡潔に言い表すことができる。

 

一般化した階段昇降問題
1\leq kとする。
1,2,3\cdots k段上りを認めてn段の階段を上る場合の数をa_{n,k}と書くとき、a_{n,k}の満たす漸化式と十分な初期値を求めなさい

 

 なかなか面白そうな問題ではないか。初期値を求めるのは明らかに面倒なので、まずは漸化式から求めてみよう。

 

漸化式
\displaystyle a_{{n+k},k}=\sum_{i=0}^{k-1}a_{{n+i},k}

 

k=2の場合でやったように、最後に何段上りをしたかで場合わけをすれば良い。1\leq i\leq kとして最後にi段上りをしたと仮定しよう。このとき、踊り場に着く前にはn+k-i段目にいたことがわかるので、そこにつく経路の数は定義によってa_{{n+k-i},k}通りである。この場合わけをi=1\to kの範囲で足しあげてしまえば良く、\displaystyle \sum_{i=1}^{k}a_{{n+k-i},k}=\sum_{i=0}^{k-1}a_{{n+i},k}という和が導かれる。これは定義によりa_{{n+k},k}に一致するので、\displaystyle a_{{n+k},k}=\sum_{i=0}^{k-1}a_{{n+i},k}が示された◽︎

 

 なかなか証明していて楽しい定理である。それと同時にやはり数学は具体例を考えることが重要だと身に染みてわかった。

 そして漸化式は求められたので、数列を定義するのに必要な最後のピース、数列の初期値を求める。

初期値を求める前にa_{n,k}組み合わせ論的な性質について考えてみよう。すると次のことに気づける。

 

禁止行動の補題
n\leq kのとき、a_{n,k}=a_{n,n}

 

Proof
正直に言ってあまりいい言い方が思いつかないが、たとえば4段の階段を上るとき5段飛ばしをすることはできないだろう。それと同じで階段の段数nより大きいkk段上りができないので場合の数に含められない◽

 

 初期値を求める。初期値はどこまで定めるべきか考える。kが固定されていることに注目すると、それはa_{1,k},a_{2,k},a_{3,k}\cdots a_{k-1,k},a_{k,k}であることがわかる。

禁止行動の補題を適用すると初期値を求める問題からa_{1,1},a_{2,2},a_{3,3}\cdots a_{k-1,k-1},a_{k,k}を求める問題に早変わりする。

 ここまできてもつかみどころのない問題である。とりあえず新たに数列b_nを定義する。

 

b_nの定義
b_n=a_{n,n}

 

 わからないときはとりあえず具体的に落とし込むのが重要だ。b_1,b_2,b_3,b_4くらいまで値を求めてみよう。

するとb_1=1,b_2=2,b_3=4,b_4=8がわかる。実際に場合の数を数えればわかることである。

ここで、あれっと思った人もいるだろう。次のことが予想できる。

 

b_nの値についての予想
b_n=2^{n-1}が成り立つ

 

 どうにかしてこの予想を証明したい。ということで再び漸化式を立てる。b_{n+1}をうまいこと分解して(1\leq k\leq n)\space b_kを用いて書きたい。

すると次のような変形を思いつく。

 

項番号下げの補題
b_{n+1}=1+a_{{n+1},n}が成立する

 

Proof
b_{n+1}=a_{{n+1},{n+1}}であり、n+1段上りを使って上る場合は1通りしかないことがわかる。そして残りの全ての場合はn+1段上りを使わずに達成されるのでa_{n+1},n通りである。よってa_{{n+1}{n+1}}=1+a_{{n+1},n}◽︎

 

 そして思いつきにくい利用だがa_{n,k}の漸化式を視点を変えて利用する。

 

b_nの漸化式
\displaystyle b_{n+1}=1+\sum_{k=1}^n b_k

 

Proof
\displaystyle a_{{n+k},k}=\sum_{i=0}^{k-1}a_{{n+i},k}が成り立っている。この漸化式を視点を変えて使ってみよう。漸化式にk\mapsto n,n\mapsto 1というふうに代入すると、\displaystyle a_{{1+n},n}=\sum_{i=0}^{n-1}a_{{1+i},n}が得られる。\sumの中の1+iは常にn以下であるので、禁止行動の補題を用いると、\displaystyle \sum_{i=0}^{n-1}a_{{1+i},n}=\sum_{i=0}^{n-1}a_{{1+i},{1+i}}と変形できる。a_{{1+i},{1+i}}\stackrel{\mathrm{定義から}}{=}b_{1+i}であるので、\displaystyle b_{n+1}=1+\sum_{i=0}^{n-1}a_{{1+i},{1+i}}=1+\sum_{i=1}^n a_{{i},{i}}=1+\sum_{i=1}^n b_i◽︎

 

 なかなか見ない形の漸化式である。初期値b_11であるとわかっているので、これでb_nが定義された。こういう解くのが難しそうな漸化式を見た時にやることは決まっている。当然数学的帰納法である。

 

b_nの値
b_nの値についての予想は正しく、b_n=2^{n-1}が成り立つ

 

Proof
累積帰納法を用いて示す。b_1=1=2^{1-1}が成り立つので、n=1のときは命題が成立する。k\leq nを満たす全ての自然数kについて命題が正しいとして、n+1の場合を示す。\displaystyle b_{n+1}=1+\sum_{k=1}^n b_k\stackrel{\mathrm{帰納法の仮定より}}{=}1+\sum_{k=1}^n 2^{k-1}
これを等比級数の和の公式を使って変形すると、1+\sum_{k=1}^n 2^{k-1}=1+\dfrac{2^n -1}{2-1}=2^n=2^{n+1-1}が成り立ち、帰納法によって全ての自然数で命題は成り立つ◽︎

 

 この定理によりa_{n,k}を定義する上で十分な初期値が求められて、考えていた問題は解決した。

 

具体例
k=3のとき、a_{{n+3},3}=a_{{n+2},3}+a_{{n+1},3}+a_{n,3},a_{1,3}=1,a_{2,3}=2,a_{3,3}=4と定義される
これは\{1,2,4,7,13,24,44,81\cdots\}という数列である

 

 ここでトリボナッチ数列をひとつまみ\cdots\cdots

 

トリボナッチ数列
トリボナッチ数列T_nとはフィボナッチ数列を四項間漸化式に拡張したもので、T_{{n+3},3}=T_{{n+2},3}+T_{{n+1},3}+T_{n,3},T_1=0,T_2=0,T_3=1を満たす数列である

 

 この数列の値を求めてみよう。すると\{0,0,1,1,2,4,7,13,24,44,81\cdots\}となる\cdots\cdots

ん?(deja vu)

 \{0,0,1,1,2,4,7,13,24,44,81\cdots\}

 \{1,2,4,7,13,24,44,81\cdots\}

a_{n,3}=T_{n+3}やんけ!

にわかにk-nacci数列を定義したい気分になってきた。

 

k-nacci数列の定義
k-nacci数列F_n^k\displaystyle F_{n+k}^k=\sum_{i=0}^{k-1}F_{n+i}^k,F_1^k=F_2^k=F_3^k=\cdots=F_{k-1}^k=0,F_k^k=1
と定義する

 

 k=2のときがフィボナッチ、k=3のときがトリボナッチ数列である。

 ここまでの話の流れからして以下の定理が成り立ちそうである。

 

階段の昇降とk-nacci数列の関係
a_{n,k}=F_{n+k}^k

 

Proof
まず初めに初期値を求めてみよう。 1\leq t\leq kとしたとき、F_{t+k}^kの値を求める。k-nacci数列の定義によって、漸化式\displaystyle F_{n+k}^k=\sum_{i=0}^{k-1}F_{n+i}^kが成り立ち、最右辺は\displaystyle \sum_{i=0}^{k-1}F_{t+i}^k=\sum_{i=0}^{k-t}F_{t+i}^k+\sum_{i=k-t+1}^{k-1}F_{t+i}^kと分解することができる。 ただしt=1のとき、\displaystyle \sum_{i=k-t+1}^{k-1}F_{t+i}^k=0とみなす。1\leq t+i\leq kにより\displaystyle \sum_{i=0}^{k-t}F_{t+i}^k=1がわかる。\displaystyle \sum_{i=0}^{k-1}F_{t+i}^k=1+\sum_{i=1}^{t-1}F_{i+k}^kであることから、\displaystyle F_{t+k}^k=1+\sum_{i=1}^{t-1}F_{i+k}^k

 

この漸化式はb_nの時に出てきたものと同一である。

 

g_nの定義
\displaystyle g_1=F_{1+k}^k=1,g_{n+1}=1+\sum_{i=1}^{n}g_i

 

g_tはその定義によりF_{t+k}^kに一致する。そしてg_i=2^{i-1}がわかる。であるのでF_{t+k}^k=2^{t-1}=a_{n,k}が成り立つ。

 さて、数学的帰納法を用いて命題を証明しよう。n=tのケースでは正しいことが上で確認できている。n=s,s+1,s+2,\cdots,s+k-1のとき正しいとして、n=s+kのときを示そう。\displaystyle a_{s+k,k}=\sum_{i=0}^{k-1}a_{{s+i},k}=\sum_{i=0}^{k-1}F_{s+i}^k=F_{s+k}^kであるので題意は示された◽︎

 

 結局、階段の昇降の場合の数にはk-nacci数列が関わっていることがわかった。しかも上の添字だけ下の添え字をずらす、という非常に簡単な方法で、である。ありがとうフィボナッチ数列

 ちなみにこれに入試数学の一般化というタグをつけたのは京都大学で似たような問題が出されていたからである。確か連続して2段上りをしてはいけないというルールのもとで、1,2段上りを使って階段を上るときの場合の数を求める問題だったような気がする。

 

 a_{n,k}n1からkまでの自然数に順序を区別して分割するときの場合の数である。(唐突)ここまで階段の昇降にしか触れていなかったので、ちょっと実験してみよう。

 

4の分割
43以下の自然数に分割するときの場合の数を求める。4\to 3+1=1+3=2+2=2+1+1=1+2+1=1+1+2=1+1+1+17通り存在する。
これはa_{4,3}=a_{3,3}+a_{3,2}+a_{3,1}=4+2+1=7に一致する

 

 階段を上ることは自然数を分割することだったのだ。今度から童心に帰りつつ、理学的に「今、自然数分割してるな〜」と思いながら階段を上ってみるのも良いかもしれない。