努力で数論

僕が勉強した内容をまとめておきたくて作ってみました。

Fibonacci数列についての考察

複素関数と解析接続を学ぶ中で以下の動画を見て、pythonを使ってもタマキさんが動画内で描いていた図と似たようなものを描けそうだなと思ったので、今回はそれをトライしてみました。まずは以下の動画を見て頂けると内容が分かるかと思います。

www.youtube.com

Fibonacci数列とは。

フィボナッチ数列  a_{0} = a_{1} = 1を満たす数列 \{ a_{n} \}について以下の漸化式  a_{n+2} = a_{n+1} + a_{n} を満たす。このとき、フィボナッチ数列 1,1,2,3,5,8,...となる。


このとき上の漸化式は \phi = \frac{1 + \sqrt{5}}{2}, \psi = \frac{1 - \sqrt{5}}{2}に対して、以下の関係式を満たす。

 a_{n+2} - \phi a_{n+1} = \psi (a_{n+1} - \phi a_{n})\\
a_{n+2} - \psi a_{n+1} = \phi (a_{n+1} - \psi a_{n})

 \Longleftrightarrow

 a_{n+2} - \phi a_{n+1} = \psi^{n} (a_{1} - \phi a_{0}) = \psi^{n} (1 - \phi) = \psi^{n+1}  a_{n+2} - \psi a_{n+1} = \phi^{n} (a_{1} - \psi a_{0}) = \phi^{n} (1 - \psi) = \phi^{n+1}

 \Longleftrightarrow

 (\psi - \phi)a_{n+1} = \psi^{n+1} - \phi^{n+1}

 \Longleftrightarrow

 \sqrt{5} a_{n+1} = \phi^{n} - \psi^{n}

 \Longleftrightarrow

 a_{n} = \frac{1}{\sqrt{5}} \bigg \{ \bigg( \frac{1 + \sqrt{5}}{2} \bigg) ^{n} - \bigg( \frac{1 - \sqrt{5}}{2} \bigg)^{n} \bigg \}

Fibonacci数列を係数に持つ級数と解析接続

フィボナッチ数列を係数に持つ級数の関数  \{ a_{n} \}フィボナッチ数列にするとき、 F(x)を次のように定義する  F(x) = a_{0} + a_{1}x + a_{2}x^2 + ... = \sum_{n=0}^{\infty}a_{n}x^{n}


この級数は次の収束半径 Rを持つ。

 R = \lim_{n \to \infty} \bigg| \frac{a_{n}}{a_{n+1}} \bigg|  = \lim_{n \to \infty} \frac{ \bigg| \frac{1}{\sqrt{5}} \bigg \{ \bigg(\frac{1 + \sqrt{5}}{2} \bigg)^{n} - \bigg(\frac{1 - \sqrt{5}}{2} \bigg)^{n} \bigg \} \bigg| }{ \bigg| \frac{1}{\sqrt{5}} \bigg \{ \bigg(\frac{1 + \sqrt{5}}{2} \bigg)^{n+1} - \bigg(\frac{1 - \sqrt{5}}{2} \bigg)^{n+1} \bigg \} \bigg| }  = \lim_{n \to \infty} 2 \frac{ \bigg| \big(1 + \sqrt{5} \big)^{n} - \big(1 - \sqrt{5} \big)^{n} \bigg| }{ \bigg| \big(1 + \sqrt{5} \big)^{n+1} - \big(1 - \sqrt{5} \big)^{n+1} \bigg| }  = \lim_{n \to \infty} 2 \frac{ \bigg| \frac{1}{1+\sqrt{5}} - \frac{1}{1+\sqrt{5}} \bigg( \frac{1- \sqrt{5}}{1+ \sqrt{5}} \bigg)^{n} \bigg| }{ \bigg| 1 - \bigg(\frac{1 - \sqrt{5}}{1 + \sqrt{5}} \bigg)^{n+1} \bigg| }  = \lim_{n \to \infty} 2 \frac{ \bigg| \frac{1}{1+\sqrt{5}}\bigg| }{|1|}  = \frac{2}{1+\sqrt{5}} < 1

この時、この収束半径内で級数は収束することが言えます。さて、他方

 xF(x) = a_{0}x + a_{1}x^2 + a_{2}x^3 + ...

なので

 F(x) + xF(x) = a_{0} + (a_{0} + a_{1})x + (a_{1} + a_{2})x^2 + ...  = a_{1} + a_{2}x + a_{3}x^2 + ...  = \frac{1}{x} (a_{1}x + a_{2}x^2 + a_{3}x^3 + ... )  = \frac{1}{x} (F(x) - a_{0})  = \frac{1}{x} (F(x) - 1)

 \Longrightarrow

 F(x) = \frac{1}{1-x-x^2}

を満たす。 F(x) x=\frac{1 \pm \sqrt{5}}{2}を除く任意の点で正則で、先の級数表示の解析接続したものとなっています。

pythonでグラフを作る

さて、この関数の実部と虚部を複素平面上からの写像で3Dのグラフに表す。これはミックスされた形でタマキさんの動画でも流れているものかと思います。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpmath import *
from mpl_toolkits.mplot3d import Axes3D

def three_D_plots(func,picname):
    
    x, y = np.meshgrid(np.linspace( -5, 5, 500), np.linspace( -5, 5, 500))
    z = x + y*1j
    w = func(z)
    fig1 = plt.figure()
    ax = Axes3D(fig1)
    ax.plot_surface(x, y, w.real, color="blue")
    ax.set_zlim3d(0, 15.)
    ax.autoscale(False)
    plt.axis([-6., 6., -6., 6.])
    plt.title("real_part")
    
    fig2 = plt.figure()
    ax = Axes3D(fig2)
    ax.plot_surface(x, y, w.imag, color="orange")
    ax.set_zlim3d(0, 15.)
    ax.autoscale(False)
    plt.axis([-6., 6., -6., 6.])
    plt.title("imag_part")
    
    plt.savefig(picname)
    plt.show()
def fibonacci(s):
    return 1/(1-s-s**2)

three_D_plots(fibonacci,"fibonacci_real.png","fibonacci_img.png")

f:id:okenta:20190801021155p:plain

f:id:okenta:20190801021223p:plain

さて、今までやってきた通りこれを今度は絶対値付きのグラフにしたり、2Dの図を作ったりすると

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
from scipy.special import gamma

def three_D_plot(func,picname):
    x, y = np.meshgrid(np.linspace( -5, 5, 500), np.linspace( -5, 5, 500))
    z = x + y*1j
    w = func(z)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.plot_surface(x, y, np.abs(w))
    ax.set_zlim3d(0, 15.)
    ax.autoscale(False)
    plt.axis([-6., 6., -6., 6.])
    plt.savefig(picname)
    plt.show()
    
def plot_complex(complex_func,picname1,picname2):

    x, y = np.meshgrid(np.linspace(-4, 4, 400), np.linspace(-4, 4, 400))
    z = x + y*1j

    angles = (np.angle(complex_func(z)) + 2*np.pi) % (2*np.pi)
    plt.figure(figsize=(6,5))
    im_1 = plt.pcolor(x, y, angles, cmap="hsv", vmin=0, vmax=6)
    plt.colorbar(im_1)
    plt.title('argument')
    plt.savefig(picname1)

    plt.figure(figsize=(6,5))
    im_2 = plt.pcolor(x, y, np.abs(complex_func(z)), vmin=0, vmax=4)
    plt.title('absolute value')
    plt.colorbar(im_2)
    plt.savefig(picname2)

    plt.show()
    

three_D_plot(fibonacci,"fibonacci3D.png")
plot_complex(fibonacci,"fibonacci_arg.png","fibonacci_abs.png")

f:id:okenta:20190801021939p:plain

f:id:okenta:20190801021955p:plain

f:id:okenta:20190801022011p:plain

のようになります。タマキさんの今回の動画の面白いところはサムネにもある式がどういう意味をもつのかということだと思うので解析接続についてや無限級数の収束半径などは飛ばしてもとても楽しめます!その他Riemann Zeta関数についても似た内容の動画がアップされているかと思うので、ぜひ興味のある方はそちらもチェックなさってみてはいかがでしょう。