Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】フィボナッチ数列におけるkのn番目の倍数の位置を求める方法

この記事では、「フィボナッチ数列の中に現れるある数の倍数」をテーマに、Pythonでの解法をサンプルコードとともにわかりやすく解説します。

問題の概要

整数 kn が与えられたとき、フィボナッチ数列の中で k の n 番目の倍数が何番目の項として現れるかを求めます。

例えば「k = 4 の 5 番目の倍数」なら、フィボナッチ数列を順にたどりながら 4 の倍数になっている項を探し、そのうち 5 番目に該当する項の位置を出力します。

解法のポイント

フィボナッチ数列を k で割った余りには周期性があるため、k の倍数となる項は等間隔で出現します。最初に k の倍数になった項の位置を i とすると、その後の倍数は i の整数倍の位置(i, 2i, 3i, …)に現れます。

この性質を利用すると、次の手順で答えが求まります。

  1. フィボナッチ数列の項を順に生成する。
  2. 初めて k で割り切れた項の位置を i として記録する。
  3. 答えは n × i となるので、その値を返す。

サンプルコード

# kのn番目の倍数の位置を求める関数
def find(k, n):
    f1 = 0   # 前の項
    f2 = 1   # 現在の項
    i = 2    # 現在の項の位置
    # フィボナッチ数列を順に生成
    while True:
        f3 = f1 + f2
        f1 = f2
        f2 = f3
        # kの倍数を見つけたら位置を返す
        if f2 % k == 0:
            return n * i
        i += 1

# 求めたい倍数の番号
n = 5
# 対象となる数
k = 4
print("フィボナッチ数列におけるkのn番目の倍数の位置:", find(k, n))

実行結果

フィボナッチ数列におけるkのn番目の倍数の位置: 30

コードの解説

変数と関数はすべてグローバルスコープで定義されています。処理の流れは以下の通りです。

  • f1・f2:フィボナッチ数列の計算に使う変数で、初期値はそれぞれ 0 と 1。
  • i:現在注目している項の位置。初期値は 2。
  • ループの中で新しい項 f3 = f1 + f2 を計算し、f1 と f2 を入れ替えながら数列を伸ばしていきます。
  • f2 % k == 0 が成立した瞬間に、初めて k の倍数となった項の位置 i が確定するので、n × i を返り値とします。

今回の例では、k = 4 のとき最初に 4 の倍数になるのは第 6 項の 8 です。したがって 5 番目の倍数の位置は 5 × 6 = 30 となり、実際に第 30 項の値 832040 は 4 で割り切れることが確認できます。

まとめ

この記事では、フィボナッチ数列における k の n 番目の倍数の位置を Python で求める方法を紹介しました。「k の倍数となる項は等間隔で現れる」というフィボナッチ数列の性質を活かすことで、無駄なく効率的に答えを導き出せます。ぜひご自身の環境でもコードを実行してみてください。

  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, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法

  2. 【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説

    本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が