バーゼリヤ藤崎

学生の頃、社会人の方から「仕事楽しいよ、やりがいがあって良いよ」と言われましたが、嘘だと気づきました。。。

ジョジョの奇妙な冒険7部スティール・ボール・ランで出てくる黄金比の性質について、フィボナッチ数列をもとに計算してみた【Python】

みなさん、こんばんは藤崎です。

 

ジョジョの奇妙な冒険7部スティール・ボール・ランをご存じでしょうか。

 

概要

人類史上初の乗馬による北米大陸横断レースを描いています。

 

ただ、北米大陸横断レースの裏ではアメリカ合衆国大統領アメリカ全土に隠された「聖なる遺体」の確保に向けて動き出しています。

 

この「聖なる遺体」を巡って、主人公であるジョニィ・ジョースタージャイロ・ツェペリスタンド能力を持った敵との対戦に巻き込まれていきます。

 

そもそも「聖なる遺体」とは何なのか?主人公がレースに参加した真の目的は何なのか?北米大陸横断レースを通して、主人公の成長を描いた作品になります。

 

黄金比

スティール・ボール・ランでは「黄金比」というワードが作品では重要になります。

黄金比とは以下のように1:1.618の比率(黄金比)を正方形と曲線で表現した黄金長方形を指します。

 

 

この無限に続く回転のことを「黄金の回転」と物語では表現しています。

「黄金の回転」を利用することで、ジョニィ・ジョースタースタンド能力タスクでの攻撃を実現しています。

 

黄金比を計算

黄金比を数式で表すと以下のようになります。

\begin{eqnarray*} α= \displaystyle \frac{1+\sqrt{5}}{2} \\ \end{eqnarray*}

 

pythonで計算してみると以下のように求まります。


import math

# 黄金比
golden_ratio = (1 + math.sqrt(5))/2

# 出力
print(golden_ratio)

>出力結果
1.618033988749895

 

先ほどの図形で表現した通り1.618となります。

 

フィボナッチ数列

隣り合う項どうしの比が黄金比に近い値となる数列があります。

フィボナッチ数列といいます。

 

初項、第2項を1とし、第3項以降は直前の2項の和をとって得られる数列のことを指します。

 

数式に表すと以下になります。

\begin{eqnarray*} F_1= \displaystyle F_2 = 1 \\ \end{eqnarray*}

 

\begin{eqnarray*} F_n= \displaystyle F_{n-1} + F_{n-2} (n>2) \\ \end{eqnarray*}

 

pythonでプログラムを書いて計算させると以下の結果となります。

※nの値が大きくなるにつれて処理に時間がかかります。一旦nが20の場合までを求めています。


def fib(n):
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

for n in range(1,21):
    print(f'n = {n}の場合 :', fib(n=n))

>出力結果
n = 1の場合 : 1
n = 2の場合 : 1
n = 3の場合 : 2
n = 4の場合 : 3
n = 5の場合 : 5
n = 6の場合 : 8
n = 7の場合 : 13
n = 8の場合 : 21
n = 9の場合 : 34
n = 10の場合 : 55
n = 11の場合 : 89
n = 12の場合 : 144
n = 13の場合 : 233
n = 14の場合 : 377
n = 15の場合 : 610
n = 16の場合 : 987
n = 17の場合 : 1597
n = 18の場合 : 2584
n = 19の場合 : 4181
n = 20の場合 : 6765

 

フィボナッチ数列は第3項以降は直前の2項の和をとって得られる性質があるため、nの値が大きくなればなるほど数値が指数的に増加します。

 

 

フィボナッチ数列は隣り合う項どうしの比が黄金比に近い値になります。

初項、第2項を1ですので、第4項以降の隣り合うどうしの比を求めてみます。


def fib(n):
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

def fib_1(n):
    if n < 2:
        return n
    else:
        return fib(n-2) + fib(n-3)

for n in range(4,21):
    gold = fib(n) / fib_1(n)
    print(f'n = {n}の場合の黄金比 :', gold , (fib(n),fib_1(n)))

>出力結果
n = 4の場合の黄金比 : 1.5 (3, 2)
n = 5の場合の黄金比 : 1.6666666666666667 (5, 3)
n = 6の場合の黄金比 : 1.6 (8, 5)
n = 7の場合の黄金比 : 1.625 (13, 8)
n = 8の場合の黄金比 : 1.6153846153846154 (21, 13)
n = 9の場合の黄金比 : 1.619047619047619 (34, 21)
n = 10の場合の黄金比 : 1.6176470588235294 (55, 34)
n = 11の場合の黄金比 : 1.6181818181818182 (89, 55)
n = 12の場合の黄金比 : 1.6179775280898876 (144, 89)
n = 13の場合の黄金比 : 1.6180555555555556 (233, 144)
n = 14の場合の黄金比 : 1.6180257510729614 (377, 233)
n = 15の場合の黄金比 : 1.6180371352785146 (610, 377)
n = 16の場合の黄金比 : 1.618032786885246 (987, 610)
n = 17の場合の黄金比 : 1.618034447821682 (1597, 987)
n = 18の場合の黄金比 : 1.6180338134001253 (2584, 1597)
n = 19の場合の黄金比 : 1.618034055727554 (4181, 2584)
n = 20の場合の黄金比 : 1.6180339631667064 (6765, 4181)

 

どうでしょう。

黄金比の1.618に近い値になっているのが分かると思います。

 

~~~~~~

 

いかかだったでしょうか。

 

ジョジョの奇妙な冒険を読んでから黄金比というものを気になって調べてみたら、数学の入門になっていました。

 

また、フィボナッチ数列の隣り合う項どうしの比が黄金比に近いこともPyhtonを使用すれば求められ良かったです。

 

また、世の中を紐解くと数学の世界につながっていると思うので、何気なく気になったことでも調べてみるのも面白いのではないかと思いました。

 

ただ、Pythonで上記のようにプログラミングコードを書きましたが、nの値が変わるごとに都度計算しているので処理に時間がかかってしまいます。

 

一度計算した値を保持させて、再度求めなくてもよいようなプログラミングコードを書くべきだと思いました。

 

 

別記事では様々な事象の確率を求めているので、こちらも良かったら是非!

vazeriya-fujisaki.hatenablog.com

 

vazeriya-fujisaki.hatenablog.com