リュカ数を求めるプログラムをC++で実装します。実行環境はVisual Studio Community 2022バージョン17.10.1とC++20です。
リュカ数の定義
リュカ数とは、初項を2、2項目を1とし、それ以降の項が直前の2つの項の和になっている数列の項と定義されています。$n$を正の整数とすると以下の数式で表すことが出来ます。
\displaylines{
L_1 = 2\\
L_2 = 1\\
L_{n+2} = L_n + L_{n+1}
}
リュカ数を計算するプログラム
リュカ数を求めるプログラムを以下に示します。
Lucas.cpp
#include <iostream>
#include <vector>
int main()
{
int n; //出力する項数
std::cin >> n;
if (n == 1)
{
std::cout << 2 << std::endl;
}
else if (n == 2)
{
std::cout << 2 << std::endl;
std::cout << 1 << std::endl;
}
else if (n >= 3)
{
std::vector<long long> lucas(n);
lucas.at(0) = 2; //初項に2を設定
lucas.at(1) = 1; //2項目に1を設定
for (int i = 2; i < n; i++)
{
lucas.at(i) = lucas.at(i - 1) + lucas.at(i - 2); //直前の2項の和を計算する
}
for (auto x : lucas)
{
std::cout << x << std::endl;
}
}
else
{
return 0; //入力された値が正の整数でなければプログラムを終了する
}
}
実行すると整数$n$の入力が求められるので、正の整数を入力します。$n$を入力したら$n$項目までのリュカ数が表示されます。
リュカ数と黄金比
リュカ数の性質として、$n$が大きくなると、リュカ数の隣接する2項の比$L_{n+1}/L_n$は黄金比に収束することが知られています。この性質をプログラムで確認してみます。なお、C++では標準ライブラリのnumbersを用いて黄金比の値を取得できます。黄金比の値は1.61803のようです。
C++における黄金比の値の定義
GoldenRatio.cpp
#include <iostream>
#include <numbers>
int main()
{
std::cout << std::numbers::phi;
//1.61803
}
リュカ数列における隣接項の比の推移
Lucas.cpp
#include <iostream>
#include <vector>
int main()
{
std::vector<long long> lucas(21); //21項のリュカ数列を格納するための配列
lucas.at(0) = 2;
lucas.at(1) = 1;
for (int i = 2; i <= 20; i++)
{
lucas.at(i) = lucas.at(i - 1) + lucas.at(i - 2);
}
for (int i = 1; i <= 20; i++)
{
std::cout << double(lucas.at(i)) / lucas.at(i - 1) << std::endl; //リュカ数列の隣接する2項を求める
}
}
出力
0.5
3
1.33333
1.75
1.57143
1.63636
1.61111
1.62069
1.61702
1.61842
1.61789
1.61809
1.61801
1.61804
1.61803
1.61804
1.61803
1.61803
1.61803
1.61803
1.61803に収束していくことがわかります。
参考