フィボナッチ数
ニューヨークのエンパイア・ステート・ビルのレゴブロックを作ってみました。
最新2020年-令和2年 灘中&開成中 算数全解説PDFを無料公開!!過去9年分がダウンロード可能です!
【2020年】算数オリンピック・ジュニアの解説を更新!!!算数星人の思い入れのある問題も登場
おすすめ書籍の紹介がかなり溜まってきましたので順に記事におこしていきたいと思います。(上の画像はWikiより)
見る人から見るとややクセのあるイラストが特徴的です。
もちろん生涯をつづった伝記の絵本なので内容自体はしっかりしていますが,大人が読むと思っている以上に情報量が少なく感じるかもしれません。
フィボナッチってどんな人?
レオナルド・フィボナッチ
中世イタリアの数学者
本名はまた別に存在し,フィボナッチは「ボナッチの息子」を意味する愛称をあらわします。
貿易の仕事で北アフリカ方面を巡り,そこで学んだアラビア数字をヨーロッパ・ローマで広めたことで有名になりました。当時のヨーロッパはローマ数字が使われていました。
フィボナッチの残した「算盤の書」ではアラビア数字だけでなく,エジプト式のわり算方法や単位のこと,利子のことなど幅広く数学の意見がまとめられているそうです。
わかりやすい例を挙げると分数の横線はフィボナッチが広めたそうです。
この算盤の書では,うさぎのつがい(オスとメス)に関する記述があり,これがみなさんのご存知のフィボナッチ数列につながります。
美しいフィボナッチ数列
フィボナッチ数列とは
直前の2つの数を足すと次の数になる数列です。
中学受験では有名すぎる数列ですね。
6番目までの2乗の数の和は
1+1+4+9+25+64=104となり,これは8×13=104になります。
数が大きくなっても同じことがいえます。
上の図がその性質を証明できると思います。
この図の場合は
1×1+1×1+2×2+…+13×13+21×21=21×34 フィボナッチ数 フィボナッチ数
がいえます。
フィボナッチ数と黄金比
黄金比
およそ 1:1.618
視覚的に美しく感じる比率で,ピラミッドや神殿,美術品など黄金比を意識したものが過去から数々残る。 フィボナッチ数
身近なものとして名刺やディスプレイの長方形の比率などがある。
ヒマワリ・稲妻…自然界を司る神秘的な「数式」 美・自然のなかの数学(2)
性質1:直前の2数を足した数になっている
性質2:隣り合う数の比が限りなく黄金比に近づく
ひまわりの種(小花)が隙間なく密集しているのも、フィボナッチ数列に沿った種の配列がなされているため。生物は生き残るために数学を用いている
1、1、2、3、5、……とフィボナッチ数列の各数を一辺とする正方形の頂点に沿って曲線を引くと「対数らせん」の一種が描かれる
銀河系の巨大な渦巻きは、フィボナッチ数列を基にした対数らせんの形状によく似ている
最速のフィボナッチ数計算を考える
さらに、フィボナッチ数列の漸化式が \(F_=F_n+F_\) だったことを思い出せば、\begin
F_&=F_mF_+F_F_n-F_mF_n,フィボナッチ数 \\
F_&=F_mF_n+F_F_
\endという2本の式が得られる。つまり、行列の乗算の代わりに\[(F_m,F_)\cdot(F_n,F_)\mapsto(F_mF_+F_F_n-F_mF_n,F_mF_n+F_F_)\]という演算を使って計算できる。
\((F_n,F_)\) の形の組を FibPair と呼ぶことにすれば、 FibPair には\[(a,b)\cdot(a’,b’)\mapsto(a b’+ba’-aa’,aa’+bb’)\]によるモノイド演算(単位元は \((F_0,F_1)=(フィボナッチ数 0,1)\))が定まる(結合法則の確認は読者の演習問題とする)。Haskellでの実装例は次のようになる:
ここで、 stimesMonoid は、モノイドの \(n\) 乗を \(n\) の二進展開を利用して高速に(O(log n)フィボナッチ数 で)計算してくれる関数である(同様のアルゴリズムは、行列の \(n\) 乗の計算にも利用していた)。
このFibPairを使って 123456789 ( およそいちおく フィボナッチ数 ) 番目のフィボナッチ数を計算した場合と、一般の2×2行列の方法 (MatFib) での計算時間を比較してみる。
整数 n に対して n 番目(および n+1 番目)のフィボナッチ数 \((F_n,F_)\) を対応させる写像は、整数の加法に関するモノイドから、FibPairへのモノイド準同型だとみなせる。
Fast doubling
Haskellのべき乗 (^) やモノイドのn倍 stimesMonoid では、nを二進展開したものを「右から左に」辿って計算する、ということをやっている。
例えば、 フィボナッチ数 フィボナッチ数 a の19乗(二進法で10011)を計算したいというときは、アルゴリズム的には次のようなことを行なっている:
- Y := 1, Z := a とおく。
- n=19 の最下位ビット(1の位)は 1 なので、Y に Z をかける(Y := Y * Z)。
- Z を自乗する(Z := Z * Z)。
- n=19 の下から2番目のビット(2の位)は 1 なので、 Y に Z をかける(Y := Y * Z)。
- Z を自乗する(Z := Z * Z)。
- n=19 の下から3番目のビット(4の位)は 0 なので、 フィボナッチ数 Y には何もしない。
- Z を自乗する(Z := Z * Z)。
- n=19 の下から4番目のビット(8の位)は 0 なので、 Y には何もしない。 フィボナッチ数
- Z を自乗する(Z := Z * Z)。
- n=19 の下から5番目のビット(16の位)は 1 なので、 Y に Z をかける(Y := Y * Z)。
- n は二進法で5桁なので、これでアルゴリズムを終了する。 Y は a の19乗である。
一つの式で書けば、\[a^=a\cdot a^2\cdot (((a^2)^2)^2)^2\]と計算していることになるだろう。
- Y := 1 とおく。
- n=19 の最上位ビット(16の位)は 1 なので、 Y に a をかける(Y := Y * a)。
- Y を自乗する(Y := Y * Y)。
- n=19 の上から2番目のビット(8の位)は 0 なので、 フィボナッチ数 Y には何もしない。
- Y を自乗する(Y := Y * Y)。
- n=19 の上から3番目のビット(4の位)は 0 なので、 Y には何もしない。
- Y を自乗する(Y := Y * Y)。
- n=19 の上から4番目のビット(2の位)は 1 なので、 Y に a をかける(Y := Y * a)。
- Y を自乗する(Y :フィボナッチ数 = Y * Y)。
- n=19 の上から5番目のビット(2の位)は 1 なので、 Y に a をかける(Y := Y * a)。
- n は二進法で5桁なので、これでアルゴリズムを終了する。 Y は a の19乗である。
一つの式で書けば、\[a^=(((a^2)^2)^2\cdot a)^2\cdot a\]と計算していることになるだろう。
「右から左」と「左から右」の比較だが、計算機上では整数の二進表記を「右から左」に辿る方が実装しやすい(ひたすら2で割って、あまりを見れば良い)。そのため、「右から左」が使われることが多い。実際、Haskellのべき乗 (^) や stimesMonoid もそうなっている。
(二進表記の「右から左」と「左から右」のアルゴリズムについては、The Art of Computer Programming Vol. 2 に記載がある)
さて、「左から右」には、「右から左」にはない特徴がある。それは、アルゴリズム中で使う乗算が「自乗」と「a をかける」の2種類だけ、ということだ。この特徴と、フィボナッチ数計算 (FibPair) フィボナッチ数 の事情を組み合わせるとどうなるか。
n乗のアルゴリズムをフィボナッチ数計算に使う場合、 a としては組 \(\operatorname(1)=(F_1,F_2)=(1,1)\) を用いる。そして、「a をかける」という操作は、「次のフィボナッチ数を計算する」ということであり、足し算1回でできてしまう:\[(F_n,F_)\cdot (1,1)=(F_,F_n+F_)\]「右から左」の場合は(自乗のほかに) FibPair の演算が3回必要だったところ、「左から右」なら多倍長整数の加算3回で済んでしまうのだから、「左から右」の方が有利である。
この「左から右」に辿る方法をフィボナッチ数に適用したものは、fast doubling と呼ばれているようだ。二進表記を「左から右」に辿るため、実装の際に末尾ではない再帰呼び出しを使うことになる。
Fast doubling をHaskellで実装すると次のようになる:
この時点ですでに FibPair + stimesMonoid よりも早くなっているが、いくつかの小細工を加えるとさらに早くなる。
まず、ここまできたらもはや FibPair フィボナッチ数 の汎用的なモノイド演算は必要ない。モノイドとしての自乗 p <> p さえ計算できれば十分で、これは\[(a,フィボナッチ数 b)\cdot(a,b)=(2ab-a^2,a^2+b^2)フィボナッチ数 フィボナッチ数 =(a(2b-a),a^2+b^2)\]で計算できる。モノイド演算では多倍長整数の乗算が4回、加減算が3回だったのが、自乗であれば多倍長整数の乗算が4回、加減算が2回となる。
そして、「FibPair を自乗してから次のフィボナッチ数を計算する」部分はひとまとめにできる。つまり、コード上は p <> p と FibPair b (a + b) に分かれていたのを、
実験(実行時間の計測)
筆者の環境(MacBook Pro (Late 2013), GHC 8.6.3)では、行列を使った版で123456789番目のフィボナッチ数を計算したところ11秒程度、FibPairとstimesMonoidを使った版で同じ計算をしたところ5秒程度、fast doublingを使った版(最後に載せた、タプルを使ったコード)では1.7秒程度かかった。
なお、記事の最初の方で書いた、一般項を \(\mathbf(\sqrt)\) で計算するやつ(\(\left(\frac<1+\sqrt>\right)^n\) の計算だけで済ませる)は、5秒程度だった。こちらは有理数計算を伴うため、整数演算のみのFastDoublingには勝てないのだろう(推測)。
結論として、この記事で触れたアルゴリズムの中では fast doubling が一番早い。
おまけ:多倍長計算の特性を考慮する
演算回数でいうと、A, B どちらも乗算が4回、加減算が3回ずつである。では、どちらを使っても同じなのだろうか。この辺の話は、演算対象となる型によって変わってくる。
仮に、変数 a , a' , b , b' のいずれもn桁の整数だとしよう。すると、Aの方は
- n桁の整数同士の乗算が4回
- 2n桁の整数同士の加減算が3回
- n桁の整数同士の乗算が4回
- 2n桁の整数同士の加減算が2回 フィボナッチ数
- n桁の整数同士の加減算が1回
余談:HaskellのSemigroup/Monoidには自乗するためのメソッドがない
モノイドの元のn乗を計算する際、「左から右」「右から左」のいずれも、モノイドの元の自乗 \(x^2\) の計算を利用した。Data.SemigroupやData.Monoidには積を計算するメソッド <> はあるが、自乗に特化されたメソッドはないので、自乗の計算には積演算 <> が使われることになる。
自乗に特化されたメソッドがあると何が嬉しいかというと、インスタンスによっては一般の積演算 <> よりも高速な実装を提供できる可能性があり、 stimesMonoid のような関数がそれを利用できるようになることである。 sconcat や stimes がクラス外の関数ではなくて Semigroup クラスの中で定義されているのと同じ理由である。もちろん「自乗するメソッド」のデフォルト実装は \x -> x <> x とする。
コードで書けば、 Semigroup クラスがこういう風に定義されていてほしい:
FibPairの場合に、この「自乗する」 twice メソッドがあるとどの程度嬉しいか。FibPairのモノイド演算は次のように定義されていた:
(fast doublingの説明で同じことを書いたが)こちらは多倍長整数の乗算が4回、多倍長整数の加減算が2回で、加減算が1回減った上に乗算1回分が定数 2 の掛け算に変わっている。
先ほどリンクを貼った実験プログラムでは、 FibPair の自乗で特化したコードを使うようにしたものを FibPairX という名前(名付けが雑だ)で実装しており、それぞれ234567890番目のフィボナッチ数を計算させてみると
という風に FibPairX の方が若干早い。
(このことから、GHCの最適化器は \x -> x <> x というコードを式変形して上記の twice の実装に変えるようなことは行わない、ということがわかる。数学的に同値な式でも多倍長整数のコストを考えると優劣があるのは「おまけ:多倍長計算の特性を考慮する」で見た通りなので、コンパイラーが勝手にそういう式変形を行わないことはプログラマーにとっては生成コードを予測できるということであり、良いことなのだが。)
フィボナッチ数列とは、ソリティアである
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, .
これらはすべてをずらして書いただけですべて正しい式なので、両辺をそれぞれ足すことができる。
上記の同じ色の部分がすべて打ち消し合うため、結局とだけが残る。
ソリティア
フィボナッチ数
クロンダイク
そして、このマス目の上でソリティアとして可能な方法で駒を動かしても、全体の合計を変化させません。
何が嬉しいのか
このソリティアによる表現は「動かす前の値」と「動かした後の値」とが一致している、ということを言っているわけで、つまりこれが上記の関係式の証明にも使えるのです。うひょー! うれしい!
ワコム Research Memo(7):「テクノロジーソリューション事業」がここ数年の業績の伸びをけん引
株式 11 時間前 (2022年06月08日 フィボナッチ数 フィボナッチ数 16:16)
© Reuters.
■ワコム (TYO: 6727 )のこれまでの業績推移
コロナ禍以前の2020年3月期までの売上高推移を見ると、2017年3月期にいったん大きく落ち込んだのは、円高に加え、過度な社内ITインフラ投資、製品サイクルの移行等の影響が重なったことが理由である。
その後は、「テクノロジーソリューション事業」の伸びとともに回復したものの、「ブランド製品事業」については縮小傾向をたどり、「ブランド製品事業」のマイナスを「テクノロジーソリューション事業」のプラスでカバーする構造が続いてきた。
もっとも、2021年3月期はコロナ禍をきっかけとしてオンライン教育向けなどを中心に「ブランド製品事業」が急拡大すると、巣ごもり需要が一巡した2022年3月期もプロ向けディスプレイ製品や「テクノロジーソリューション事業」の伸びにより、2期連続で過去最高売上高を更新した。
[ブリュッセル 8日 ロイター] - 欧州議会は8日、欧州連合(EU)の炭素市場改革法案を否決し、議会の委員会に差し戻して再策定させることを決めた。EUにとって最大規模の気候変動.
[ミラノ 8日 ロイター] - 米ステート・ストリートがスイス金融大手クレディ・スイスの買収を計画しているとスイスのニュースサイト、インサイド・パラデプラッツが報じたことを受け、.
[ロンドン 8日 ロイター] - イングランド銀行(英中央銀行)は8日、保険会社が気候変動による事業への影響により良く対応するためデータとのギャップを埋める必要があり、保有すべき.
- 会話を豊かにしようとする。
- 集中し、主題から外れない。 論じられたトピックに関することだけを書きこむ。
- 敬意を示す。 否定的な意見も、前向きに相手を思いやった表現に言い換える。
- 句読点や大文字小文字などは、標準のライティングスタイルを使う。
- 注意: スパムやコメント内の宣伝のメッセージやリンクは省かれます。
- 著者や他のユーザーを冒涜、中傷する個人的攻撃は禁じます。
- 日本語での コメントのみ許されています。
日経平均株価 | 28,234.29 | +290.34 | +1.04% |
日経225先物 (F) | 28,103.0 | +93.0 | +0.33% |
韓国総合株価指数 | 2,626.15 | -0.19 | -0.01% | フィボナッチ数
NYダウ | 32,902.77 | -277.37 | -0.84% |
独DAX | 14,445.99 | -110.63 | -0.76% |
S&P/ASX 200 | 7,121.10 | +25.40 | +0.36% |
米ドル指数 | 102.505 | +0.180 | +0.18% |
金 | 1,857.60 | +5.50 | +0.30% |
原油 WTI | 123.02 | +3.61 | +3.02% |
銀 | 22.102 | -0.076 | -0.34% |
米国綿花2番 | 140.52 | +3.57 | +2.61% |
排出権 | 80.24 | -1.07 | -1.32% |
米国シカゴコーン | 764.60 | +7.60 | +1.00% |
米国コーヒー | 230.55 | -1.60 | -0.69% | フィボナッチ数
ドル/円 | 134.10 | +1.51 | +1.14% |
ドル/ウォン | 1,フィボナッチ数 257.37 | +2.57 | +0.20% |
ユーロ/ドル | 1.0719 | +0.0020 | +0.19% |
ユーロ/円 | 143.74 | +1.88 | +1.33% |
トルコリラ/円 | 7.8246 | -0.0750 | -0.95% |
豪ドル/円 | 96.51 | +0.69 | +0.73% |
ポンド/円 | 168.21 | +1.32 | +0.79% |
大塚ホールディングス | 4,429.0 | +75.0 | +1.72% | フィボナッチ数
ソフトバンクグループ | 5,563.0 | +133.0 | +2.45% | フィボナッチ数
トヨタ自動車 | 2,230.0 | +39.5 | +1.80% |
三菱UFJフィナンシャル・グループ | 742.5 | -6.9 | -0.92% |
ブイ・テクノロジー | 3,075.0 | +60.0 | +1.99% |
東芝 | 5,785.0 | +80.0 | +1.40% |
みずほフィナンシャルグループ | 1,523.0 | -22.5 | -1.46% |
リスク開示書: 金融商品や仮想通貨の取引は投資金額を失う高いリスクがあります。仮想通貨の価格は非常にボラティリティーが高く、金融、規制、政治など、外的な要因に影響を受けることがあります。また信用取引はリスクが高いことを十分に理解してください。
金融商品または仮想通貨の取引をする前に、金融市場での取引に関わるリスクやコストについて十分に理解し、専門家の助言を求めたり、ご自身の投資目的や経験値、リスク選好等を注意深く検討することを推奨いたします。
Fusion Media によるこのウェブサイトのデータが、必ずしもリアルタイムおよび正確ではないということをご了承ください。またデータや価格が、必ずしも市場や取引所からではなく、マーケットメーカーにより提供されている場合があります。その為、価格は気配値であり、実際の市場価格とは異なる可能性があります。Fusion Media および当ウェブサイトへのデータの提供者は、当ウェブサイトに含まれる情報を利用したすべての損失に対して一切の責任を負わないものとします。
Fusion Media およびデータ提供者による事前の書面の許可なしに、当ウェブサイト上のデータを使用、保存、複製、表示、変更、送信、配信することを禁じます。すべての知的財産権は当ウェブサイト上のデータの提供者、または取引所が有します。
Fusion Media は当ウェブサイトに表示される広告により報酬を得ることがあります。 上記内容は英語版を翻訳したものであり、英語版と日本語版の間に不一致がある時は英語版が優先されます。
コメント