1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

フィボナッチ数列で遊んだ

Last updated at Posted at 2022-04-05

フィボナッチ数列を定義する

漸化式での定義

フィボナッチ数列は数学者レオナルド・フィボナッチに因んで名付けられた数で、漸化式を使って次のように表現することができます。

\begin{align}
F_0&=0\\
F_1&=1\\
F_{n+2}&=F_{n+1}+F_{n} (n \geq 0)
\end{align}

これを計算して1項目から順に並べると

1,1,2,3,5 \cdots

となります。C++での実装例は以下の通り。

#include <stdio.h>
#define N 15
int main() {
    int i;
    int* F;
    F = new int[N+1];
    F[0] = 0;
    F[1] = 1;

    printf("1 -> %d \r\n", F[1]);

    for (i = 2; i < N+1; i++) {
        F[i] = F[i - 2] + F[i - 1];
        printf("%d -> %d \r\n", i, F[i]);
    }

    delete[] F;
}

C++として振る舞うコードはメモリの動的確保を行う部分

F = new int[N+1];

//省略

delete[] F;

であるので、malloc等に置き換えればC言語として実行することができます。mallocで実行するにはヘッダーに

#include <cstdlib> // for malloc

を追加し

F = (int *)malloc(sizeof(int)*(N+1));

//省略

free(F);

とすると動くと思います。

フィボナッチ数列の一般解を使った定義

漸化式的な計算はメモリが必要だったりと面倒です。そこで一般解を使って各項を計算することを考えます。フィボナッチ数列の一般解はすでに得られていて

\begin{align}
F(n)&=\frac{\phi^n-(-\phi)^{-n}}{\sqrt{5}} \\
\phi&=\frac{1+\sqrt{5}}{2}
\end{align}

となります。一般解を用いてフィボナッチ数列を計算するC++での実装例は以下の通り。

#include <stdio.h>
#include <math.h>
#define n 15
int main(){
    int i;
    double phi = (1 + sqrt(5)) / 2;
    for (i = 1; i <= n; i++) {
        printf("%d -> %f\r\n",i, (pow(phi,i) - pow(-phi,-i)) / sqrt(5));
    }
}

ここで累乗は

#include <math.h>

を追加し

int y;
y=pow(a,x);

とすれば

y=a^x

を計算できます。

フィボナッチ数列の関係式

フィボナッチ数列にはいくつかの関係が知られています。これをプログラムで計算して確かめてみます。

フィボナッチ数列の特别な和公式

\begin{align}
\sum_{i=1}^\infty  \frac{F_i}{10^{i+1}} = \frac{1}{89}
\end{align}
#include <stdio.h>
#include <math.h>
#define N 30
const double phi = (1 + sqrt(5)) / 2;
double Fibonacci(int);
int main() {
    int i, n;
    double psi = 0;
    for (i = 1; i <= N; i++) {
        n = i + 1;
        psi = psi + Fibonacci(i) / pow(10, n);
        printf("%f -> %f \r\n",1/89.0,  psi);
    }
}

double Fibonacci(int i) {
    return (pow(phi, i) - pow(-phi, -i)) / sqrt(5);
}

フィボナッチ数列の逆数和

\begin{align}
\psi=\sum_{i=1}^\infty  \frac{1}{F_i} = 3.3498 \cdots
\end{align}
#include <stdio.h>
#include <math.h>
#define n 30
const double phi = (1 + sqrt(5)) / 2;
double Fibonacci(int);
int main() {
    int i;
    double psi = 0;
    for (i = 1; i <= n; i++) {
        psi = psi + 1 / Fibonacci(i);
        printf("%d -> %f\r\n",i, psi);
    }
}

double Fibonacci(int i) {
    return (pow(phi, i) - pow(-phi, -i)) / sqrt(5);
}

フィボナッチ数列の比の極限

\begin{align}
\lim_{n \to \infty } \frac{F_{n+1}}{F_n}= \phi = \frac{1 + \sqrt{5}}{2}
\end{align}
#include <stdio.h>
#include <math.h>
#define n 30
const double phi = (1 + sqrt(5)) / 2;
double Fibonacci(int);
int main() {
    int i;
    for (i = 2; i <= n; i++) {
        printf("%f -> %f\r\n", phi, Fibonacci(i) / Fibonacci(i - 1));
    }
}

double Fibonacci(int i) {
    return (pow(phi, i) - pow(-phi, -i)) / sqrt(5);
}

連続する10個のフィボナッチ数列の和と7番目の数との関係

\begin{align}
\sum_{i=1}^{10}  F_{n+i} = 11 \times F_{n+7}
\end{align}
#include <stdio.h>
#include <math.h>
#define N 9
const double phi = (1 + sqrt(5)) / 2;
double Fibonacci(int);
int main() {
    int i;
    double psi = 0;
    for (i = 1; i <= 10; i++) {
        psi = psi + Fibonacci(N + i);
    }
    printf("%f -> %f \r\n", 11*Fibonacci(N+7), psi);
}

double Fibonacci(int i) {
    return (pow(phi, i) - pow(-phi, -i)) / sqrt(5);
}

参考

Wikipedia フィボナッチ数列

しろねこらぼ(ブログ)

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?