arXiv探訪

興味の赴くままに数学するだけ

フィボナッチ数はやばい~Zeckendorfの定理とKnuth積~

フィボナッチ数はやばい。とにかくやばい。

一応定義を述べておくと、フィボナッチ数とは

{ \begin{alignedat}{3} F_{0}&=0, &\quad F_{1}&=1, &\quad F_{n}&=F_{n-1}+F_{n-2}\,( n\ge 2 ) \end{alignedat} }

という再帰方程式で定義される自然数の列である。最初の数個を挙げると

{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, \dotsc }

と続いていく。これらの数が非常に多くの性質を持つことは、数学に造詣が深い人ならご存知かと思う。自分はあまり詳しい方ではないのでWikipediaの力を借りると、

フィボナッチ数 - Wikipedia

英語版の方がより詳しいが、どの性質も一記事書けそうなネタになる。ここで更にスクロールしていくと次の一行がしれっと書かれている。

任意の正の整数は、1つ以上の連続しない相異なるフィボナッチ数の和として一意に表すことができる(ゼッケンドルフの定理)。

もう少し精確に書き直すと次のようになる。

定理(Zeckendorf, 1939) 任意の正の整数{ n\in\mathbb{Z}_{\gt 0} }について、ある連続しない整数の増大列{ 2\le c_{0}\ll c_{1}\ll\dotsb\ll c_{k}\,( k\ge 0 ) }が存在して

{ \displaystyle n=\sum_{i=0}^{k}F_{c_{i}} }

を満たす。(ここで{ x\ll y }{ y-x\ge 2 }を意味する。)このような{ c_{i} }の組は一意的である。

右辺の形をZeckendorf和と呼ぶことにする。定理は任意の正の整数がZeckendorf和を一意的に持つことを主張している。

証明は容易で、Wikipediaに乗っている方法でも良いが、Kuo-Jye Chenによる証明を紹介しよう。まず注意として以下は帰納法で簡単に示せる。

  • { n\ge 2 }のとき{ n\le F_{n+1} }が成り立つ。
  • { n\ge 2 }のとき{ F_{n}\lt F_{n+1} }が成り立つ。
  • { n\ge 2 }のとき{ F_{3}+F_{5}+\dotsb+F_{2n-1}=F_{2n}-1 }が成り立つ。
  • { n\ge 1 }のとき{ F_{2}+F_{4}+\dotsb+F_{2n}=F_{2n+1}-1 }が成り立つ。

(証明){ R( n ) }{ n }をZeckendorf和で表す組の個数とする。{ 1=F_{2} }なので{ R( 1 )=1 }は明らかだろう。{ n }のZeckendorf和

{ n=F_{c_{0}}+\dotsb+F_{c_{k}} }

が存在したとする。このとき

{ n-1=( F_{c_{0}}-1 )+F_{c_{1}}+\dotsb+F_{c_{k}} }

となるが、{ c_{0}=2 }のときは

{ n-1=F_{c_{1}}+\dotsb+F_{c_{k}} }

を得る。{ c_{0}\gt 2 }が偶数のときは先の注意より

{ n-1=( F_{3}+\dotsb+F_{c_{0}-1} )+F_{c_{1}}+\dotsb+F_{c_{k}} }

を得る。{ c_{0}\gt 2 }が奇数のときも同様に

{ n-1=( F_{2}+\dotsb+F_{c_{0}-1} )+F_{c_{1}}+\dotsb+F_{c_{k}} }

を得る。どの場合でも右辺は{ n-1 }のZeckendorf和を与えている。従って{ R( n )\le R( n-1 ) }{ n\ge 2 }で成り立つことが分かる。ここで{ n\le F_{n+1} }であり、フィボナッチ数自身はZeckendorf和を与えているから

{ 1\le R( F_{n+1} )\le\dotsb\le R( n )\le\dotsb\le R( 1 )=1 }

が従う。{ \square }

これで正の整数をフィボナッチ数でコード化することができる。Fibonacci codingと呼ばれるそうだが、あまり使われてはいないらしい。これだけでも十分面白いのだが、Knuthは次のようなものを考えた。

定義 正の整数{ n, m }について、Zeckendorf和を

{ \displaystyle \begin{alignedat}{2} n&=\sum_{i=0}^{k}F_{c_{i}}, &\quad m&=\sum_{j=0}^{l}F_{d_{j}} \end{alignedat} }

とする。このときKnuthのcircle積を

{ \displaystyle n\circ m:=\sum_{i=0}^{k}\sum_{j=0}^{l}F_{c_{i}+d_{j}} }

で定める。

この積が可換であることはすぐ分かる。が、Knuthは更に次を示した。

定理 circle積は結合的である。すなわち

{ ( n\circ m )\circ l=n\circ( m\circ l ) }

が成り立つ。

やばい(語彙喪失)

Knuthの証明は直接的だが、個人的にやや難解だと感じる。一般にcircle積の右辺はZeckendorf和になっていない。これをZeckendorf和に直すためにDigit表示してから簡約をするのだが、その終結評価や結合性を示す過程にもやもや感が残る。Knuth的には自明なのだろうが。もっと分かり易い証明は無い物かと探したところ、ありました。以下Pierre Arnouxによる証明を紹介しよう。

まずKnuthと同様にDigit表示の空間{ \mathscr{D} }を考える。これはまあどんなものでも良いが、今回は非負整数の有限列全体としよう。以下Digit表示を{ d=\lbrack d_{n}\dotsm d_{0} \rbrack }などと表す。ここで{ d\in\mathscr{D} }に対し、自然数

{ \displaystyle d_{F}=( d_{n}\dotsm d_{0} )_{F}:=\sum_{i=0}^{n}d_{i}F_{i} }

を対応させる。この対応で、

{ \begin{alignedat}{3} &d_{i}\in\lbrace 0, 1 \rbrace, &\quad &d_{i}d_{i+1}=0, &\quad &d_{0}=d_{1}=0 \end{alignedat} }

より定まるDigit空間の部分集合{ Z\subset\mathscr{D} }の元がZackendorf和を与える。Zeckendorfの定理より、正の整数と{ Z }の元が一対一に対応することが分かる。正の整数{ n }に対応する{ Z }の元をZeckendorf表示を呼び{ n_{Z} }で表す。

写像{ \circ_{Z}\colon Z\times Z\rightarrow\mathscr{D} }

{ \displaystyle d\circ_{Z} e=\lbrack d_{i} \rbrack_{i}\circ_{Z}\lbrack e_{j} \rbrack_{j}:=\left\lbrack \sum_{i+j=n} d_{i}e_{j} \right\rbrack_{n} }

で定める。これはKnuthのcircle積と可換になる。つまり

{ (n_{Z}\circ_{Z}m_{Z})_{F}=n\circ m }

が成り立つ。

Arnouxのアイディアは{ Z }を代数的に捉えることで幾何学的なモデルを構成したことにある。まず写像{ f\colon\mathscr{D}\rightarrow\mathbb{Z}\lbrack X \rbrack / \langle X^{2}-X-1 \rangle }

{ \displaystyle d=\lbrack d_{n}\dotsm d_{0} \rbrack \mapsto d_{X}=( d_{n}\dotsm d_{0} )_{X}:\equiv\sum_{i=0}^{n}d_{i}X^{i} }

で定める。このとき{ \circ_{Z} }{ \mathbb{Z}\lbrack X \rbrack / \langle X^{2}-X-1 \rangle }の積と可換になる。つまり

{ d_{X}e_{X}=( d\circ_{Z}e )_{X} }

が成り立つ。

次の補題が成り立つ。

補題 { f|_{Z}\colon Z\rightarrow \mathbb{Z}\lbrack X \rbrack / \langle X^{2}-X-1 \rangle }単射である。

(証明)帰納法より{ X^{n}\equiv F_{n-1}+F_{n}X }が分かる。従って

{ \displaystyle d_{X}\equiv\sum d{i}X^{i}\equiv\sum d_{i}( F_{i-1}+F_{i}X )=( \lbrack d_{n}\dotsm d_{1} \rbrack )_{F}+( \lbrack d_{n}\dotsm d_{1}d_{0} \rbrack )_{F}X }

が成り立つ。右辺は一次式なので、{ d_{X}=e_{X} }とすると一次の成分を比較して{ d_{F}=e_{F} }を得る。Zeckendorf表示の一意性より{ d=e }が成り立つ。{ \square }

補題 { f( Z ) }は積で閉じている。

(証明){ \phi=\frac{1+\sqrt{5}}{2} }黄金比{ \alpha=\frac{1-\sqrt{5}}{2} }をその共役とする。このとき環としての同型

{ \mathbb{Z}\lbrack X \rbrack / \langle X^{2}-X-1 \rangle\cong\mathbb{Z}\lbrack \phi \rbrack\cong\mathbb{Z}\lbrack \alpha \rbrack }

が存在する。{ \alpha\lt 0 }かつ{ | \alpha |\lt 1 }が鍵となる。{ d\in Z }について

{ d_{X}\leftrightarrow\sum d_{i}\alpha^{i} }

と同一視できるが、右辺の和を偶数次と奇数次に分けることで({ d_{0}=d_{1}=0 }に注意する)、その上界と下界が

{ \displaystyle \begin{alignedat}{2} \sum_{i=1}^{\infty}\alpha^{2i}&=-\alpha, &\quad \sum_{i=1}^{\infty}\alpha^{2i+1}&=-\alpha^{2} \end{alignedat} }

であることが分かる。つまり{ f( Z ) }{ \mathbb{Z}\lbrack \alpha \rbrack\cap( -\alpha^{2}, -\alpha ) }と同一視できる。これが積で閉じていることは明らかなので、{ f( Z ) }は積で閉じている。{ \square }

Zeckendorf表示の積はZeckendorf表示の枠からはみ出てしまうが、多項式としてみれば積はきちんと収まっており、しかも単射で埋め込めているのでZeckendorf表示に戻すことができる。ところで多項式環の積が結合的なことは明白なので、Knuthのcircle積は結合的である。きちんと書くと、

{ \begin{alignedat}{2} ( n\circ m )\circ l &= ( ( n_{Z}\circ_{Z}m_{Z} )_{F} )\circ l=( f^{-1}( n_{X}m_{X} ) )_{F}\circ l \\ &=( f^{-1}( n_{X}m_{X} )\circ_{Z} l_{Z} = ( f^{-1}( ( n_{X}m_{X} )l_{X} ) )_{F} \\ &=( f^{-1}( n_{X}( m_{X}l_{X} ) ) )_{F} \\ &=\dotsb=n\circ( m\circ l ) \end{alignedat} }

より結合性が従う。(定理の証明終わり)

ちなみに{ n }について{ n_{X}=f( n_{Z} ) }は簡単に計算することができる。というのも{ p_{n}+n\alpha\in( -\alpha^{2}, -\alpha ) }となる{ p_{n} }を見つければよい。これは{ d\in Z }について

{ d_{X}\equiv( \lbrack d_{n}\dotsm d_{1} \rbrack )_{F}+d_{F}X }

が成り立つことから従う。特にZeckendorf和が分かっているなら、現れるフィボナッチ数の添え字を一つ下にずらしたものが{ p_{n} }となる。このとき

{ ( p_{n}+n\alpha )( p_{m}+m\alpha )=p_{n\circ m}+( n\circ m )\alpha }

を計算すれば、

{ n\circ m=nm+np_{m}+mp_{n} }

を得る。例えば

{ \begin{alignedat}{2} 11&=8+3=F_{6}+F_{4}, &\quad 19&=13+5+1=F_{7}+F_{5}+F_{2} \end{alignedat} }

だから、

{ \begin{alignedat}{2} p_{11}&=F_{5}+F_{3}=7, &\quad p_{19}&=F_{6}+F_{4}+F_{1}=12 \end{alignedat} }

である。

{ \begin{alignedat}{1} 11\circ 19 &= F_{13}+F_{11}+F_{8}+F_{11}+F_{9}+F_{6}=474 \\ &= 11\times 19+11\times 12+19\times 7=474 \end{alignedat} }

より確かに両者は一致する。

[1] Kuo-Jye Chen. Andrews's Argument Proves a Theorem of Zeckendorf. Math. Medley. Vol.34, No.1, pp.13-15, 2008.
[2] Donald E.Knuth. Fibonacci Multiplication. Appl. Math. Lett. Vol.1, No.1, pp.57-60, 1988.
[3] Pierre Arnoux. Some Remarks about Fibonacci Multiplication. Appl. Math. Lett. Vol.2, No.4, pp.319-320, 1989.

所感

久しぶりの数学ネタです。今回の内容は一般の線型再帰方程式などに拡張が色々考えられているようです。ちゃんと追えたらまた記事にしようかなと思います。Arnouxの証明は個人的にかなり示唆的で、詳細に検討する価値があると思います。具体的に計算をするアルゴリズムであったり、代数体の整数環における積閉集合であったり、あるいはDigit空間の力学系であったり、Pisot数との関連もありそうだったり、何か深い背景が隠れているような気がして研究意欲が沸きます。

Unityで遊ぶ ジョイスティックの設定

久しぶりにUnityを触りたくなって調べると、いつの間にかバージョンが上がって色々機能が追加されていることに気付きました。RenderPipelineがスクリプトで制御できるようになったらしく、ShaderGraphで手軽に弄れたり何やら楽しそうです。2Dの機能も結構追加されてるので開発の難易度がだいぶ下がったと思います。今回はその話ではなく、ジョイスティックの入力を受け取って画面に反映させてみた、という最初の一歩の報告です。

自分が普段使うのはHORIのEDGE 301というゲーミングパッドです。

hori.jp

使いやすいか・・・は良く分かりません。コンシューマは久しくやってないし、他を使ったこともないので。不満点があるとすればスティックの押し込みが固いくらいですかね。ボタンの並びは箱コンと同じですがスティックが対称に配置されているのが特徴です。これをUnity上にモデル化して、対応するボタンを押すと表示したり動かしたりするスクリプトを作りました。

f:id:mathmathniconico:20181025192447g:plain

これだけでもなかなか楽しい。ところで始めて知ったのですが、LTとRTはトリガーという1つの軸(On/Offではなくて範囲を持つもの)を共用していたみたいです。つまり同時押しだとプラマイゼロで認識していなかったみたいです。てっきり二つのボタンかと思ってました。

さてこれから何を作ろうか。

収束空間のノートについて

収束空間のノートに追記をしました。といっても収束空間の定義まで。openとかclosedといった概念が位相空間のものと同一であることを示しています。

未解決問題(というか未検証の課題)もあるので良かったら考えてみてね。

このノートについて · 収束空間

Gitbookはちょっと残念な仕様であることが分かりました。section程度は大丈夫ですが、相当な長さの文章は処理できずにエラーとなるようです。KaTeXの影響もあるかもしれません。使っているライブラリが古いものらしく、最新のバージョンでは起きないようですが、修正箇所がそれなりに有って自力では解決できなさそうです。開発も鈍っているので解決されるかは微妙です。分割すればいいので問題ないと言えばそうなのですが。