pythonでフィボナッチ数列を求めるプログラムを書いてみた【経営工学を専門にしている大学生の日記】


こんにちは!しゅんです!

今回はフィボナッチ数列について解説していきます!

とても有名な数学用語なので聞いたことがあるかもしれません。


この記事ではフィボナッチ数列がどんなものなのか、そしてなぜ有名なのかについて解説していきたいと思います。またこの記事ではpythonでフィボナッチ数列を求めるプログラムも作っていきます!


それでは解説していきましょう!



普段はNBAのデータ分析をしたりしています。
ぜひこちらの記事も読んでみてください!



このブログの簡単な紹介はこちらに書いてあります。
興味があったら見てみてください。

このブログでは経営工学を勉強している現役理系大学生が、経営工学に関することを色々話していきます!


ぼくが経営工学を勉強している中で感じたことや、興味深かったことを皆さんと共有出来たら良いなと思っています。


そもそも経営工学とは何なのでしょうか。Wikipediaによると

経営工学(けいえいこうがく、英: engineering management)は、人・材料・装置・情報・エネルギーを総合したシステムの設計・改善・確立に関する活動である。そのシステムから得られる結果を明示し、予測し、評価するために、工学的な分析・設計の原理・方法とともに、数学、物理および社会科学の専門知識と経験を利用する。

引用元 : 経営工学 – Wikipedia

長々と書いてありますが、要は経営、経済の課題を理系的な観点から解決する学問です。

フィボナッチ数列ってなに?


フィボナッチ数列は自然界のいろんなところで表れる数列で、1つ前の数字と2つ前の数字を足したものをどんどん追加していく数列です。


最初の数字を0、2番目の数字を1として、それ以降の数字は前と前々の数字を足し算して計算するのがフィボナッチ数列です。(本によって初項を0にしてるのと1にしてるものがあります)


三項間漸化式で書くと下のようになります。三項間漸化式とは高校数学の数列の範囲で勉強する内容で、ザックリ説明するとi番目の数字がi-1番目の数字とi-2のどれかによって決まる場合に作れる漸化式です。

\(F_0 = 0 , \; F_1 = 1,\; F_i = F_{i-1} + F_{i-2}\) for \(i \geq 2 \)


フィボナッチ数列の漸化式は非常に単純で、i番目のフィボナッチ数を求めたかったらi-1番目とi-2番目の数字を足し算すれば計算できるので上のような式になります。


そしてこの三項間漸化式から一般項を求めることができます。詳しいことは高校数学の数列の範囲を勉強すると理解できると思います。

フィボナッチ数列の一般項 : \(F_n = \frac{1}{\sqrt{5}} \left[\left(\frac{1 + \sqrt{5}}{2}\right)^n – \left(\frac{1 – \sqrt{5}}{2}\right)^n\right]\)


この式に登場する\(\frac{1+ \sqrt{5}}{2}\)は黄金数と呼ばれる数でこれを使った黄金比はデザインで美しいとされるようです。


フィボナッチ数列は整数列になりますが一般項には\(\sqrt 2\)が登場するのが不思議ですよね。nにどんな数字を代入して計算しても必ず\(\sqrt 2\)が消えるのが直観とは反していて興味深いです。

フィボナッチ数列は日常にたくさん現れる


フィボナッチ数列が非常に有名な理由の1つに、日常にたくさん現れているというものがあります。代表的な例は、花びらの枚数です。どうやら花びらの枚数は、多くがフィボナッチ数になっているようです。


また先ほど言ったようにフィボナッチ数列で登場する黄金比は、デザインにおいて美しいとされる比率なようです。そのため有名な建築物、絵などに黄金比がよく登場します。


またアスペクト比でよく見る16:10も黄金比に近い比率になっています。このようにフィボナッチ数列は日常でたくさん見ることができます。


またフィボナッチ数列は、バイトニックシーケンスという数字列の最大値を求めるときにも使えます。このような方法をフィボナッチ探索と言います。


pythonでフィボナッチ数列を求めるプログラムを書く


それでは最後にpythonを使ってフィボナッチ数列を求めるプログラムを書いていきます。さきほど説明した漸化式を使ってコードを書くパターンと、一般項を使ってコードを書くパターンの2つを説明します。

漸化式を使って書く


プログラムは下のようになります。

# パターン1:漸化式を使うパターン
def F1(i):
  if i == 0 or i == 1:
    return i
  
  else:
    return F1(i-1) + F1(i-2)

上のコードはi番目のフィボナッチ数を求めるプログラムです。iが0の場合は0、1の場合は1を返して、iが2以上の場合は1個前のフィボナッチ数と2個前のフィボナッチ数の和を返しています。


これを見るとF1関数の中にF1関数が入っていますね。このように関数の定義式の中に同じ関数が入っているのを再帰呼び出し(recursive calls)と言います。

一般項を使って書く


プログラムは以下のようになります。

# パターン2:一般項を使うパターン
def F2(n):
  a = (1 + 5**(1/2))/2
  b = (1 - 5**(1/2))/2
  return int((a**n - b**n)/(5**(1/2)))

aとbにそれぞれ\(\frac{1 + \sqrt 5}{2}, \; \frac{1 – \sqrt 5}{2}\)を割り当てて計算しています。


このようにしてフィボナッチ数を計算することができます!

おわりに


いかがでしたか。

今回の記事ではフィボナッチ数列について解説していきました。

今後もこのような経営工学に関する記事を書いていきます!

最後までこの記事を読んでくれてありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA