フィボナッチ数列におけるn番目の倍数の位置を求めるJavaプログラム
フィボナッチ数列の中である整数の「n番目の倍数」が何番目に現れるのかを求めたい場合、数列の数学的な性質を利用すると効率的に実装できます。この記事では、その処理を行うJavaプログラムのサンプルコードと、その仕組みについて詳しく解説します。
サンプルコード
public class Demo {
public static int position(int pos, int num) {
long val_1 = 0, val_2 = 1, val_3;
int i = 2;
while (i != 0) {
val_3 = val_1 + val_2;
val_1 = val_2;
val_2 = val_3;
if (val_2 % pos == 0) {
return num * i;
}
i++;
}
return 0;
}
public static void main(String[] args) {
int n = 10;
int k = 9;
System.out.print("フィボナッチ数列における9の10番目の倍数の位置は ");
System.out.println(position(k, n));
}
}
実行結果
フィボナッチ数列における9の10番目の倍数の位置は 120
プログラムの解説
Demo クラスには、フィボナッチ数を順に生成しながら目的の位置を計算する position メソッドが定義されています。main メソッド内では、倍数を調べる対象の数(この例では9)と、何番目の倍数を求めるか(この例では10番目)を変数として定義し、それらを引数としてメソッドを呼び出します。最後に、得られた結果をコンソールに出力します。
アルゴリズムのポイント
- 変数
val_1とval_2を使って、フィボナッチ数列を先頭から順に1項ずつ生成していきます。 - 生成したフィボナッチ数
val_2がpos(この例では9)で割り切れた時点で、その項の位置iを記録します。 - フィボナッチ数列には「ある数kで割り切れる項は、最初に現れた位置z(k)の倍数の位置に必ず現れる」という重要な性質があります。そのため、最初に割り切れた位置さえ分かれば、n番目の倍数の位置は「
num × i」という単純な掛け算で求められます。 - フィボナッチ数は増加が非常に速いため、値の保持には
long型を使用し、オーバーフローをできるだけ回避しています。
実行結果が「120」になる理由
この例では、9で初めて割り切れるフィボナッチ数は第12項の F(12) = 144 です。以降も、9の倍数に該当する項は第12項、第24項、第36項…と12の倍数の位置に現れます。したがって、10番目の倍数の位置は「12 × 10 = 120」と計算され、これが出力結果になります。
このように、全ての項を個別に確認する必要はなく、最初に条件を満たす位置を見つけるだけで答えを導き出せるのが、このアルゴリズムの大きな利点です。
-
n番目のフィボナッチ数を求めるPythonプログラム【再帰・動的計画法】
本記事では、n番目のフィボナッチ数を計算するPythonプログラムについて解説します。フィボナッチ数とは?フィボナッチ数とは、次の漸化式で定義される数列のことです。Fn = Fn-1 + Fn-2ただし、初期値は F0 = 0、F1 = 1 とします。フィボナッチ数列の最初のいくつかの値は以下の通りです。0, 1, 1, 2, 3, 5, 8, 13, ..................フィボナッチ数は、再帰と動的計画法(Dynamic Programming)という2つの代表的な手法で求めることができます。それでは、それぞれの実装方法をPythonスクリプトで見ていきましょう。方法1:再帰
-
Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法
本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法