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

C++で漸化式のn番目の項を求めるアルゴリズム

概要

数列 bn が次の漸化式で定義されているとします。

  • b1 = 1
  • bn+1 / bn = 2n

このとき、与えられた n に対して log2(bn) の値を求めるのが本記事の目的です。

入出力例

入力1

6

出力1

15

説明: 後述の通り log2(bn) = n(n − 1) / 2 となるため、(6 × (6 − 1)) / 2 = 15 が出力されます。

入力2

200

出力2

19900

解法の考え方(一般項の導出)

まず、漸化式の関係を n の降順に書き並べます。

  • bn+1 / bn = 2n
  • bn / bn−1 = 2n−1
  • b2 / b1 = 21

これらの式をすべて辺々掛け合わせると、左辺の分子と分母が打ち消し合い、次のようになります。

(bn+1 / bn) × (bn / bn−1) × … × (b2 / b1) = 2n + (n−1) + … + 1

つまり、

bn+1 / b1 = 2n(n+1)/2

ここでは、1 + 2 + 3 + … + n = n(n+1)/2 という等差数列の和の公式を利用しています。

初期値 b1 = 1 を代入すると、

bn+1 = 2n(n+1)/2

さらに、n を n+1 で置き換えることで、

bn = 2n(n−1)/2

両辺の底を2とする対数を取れば、目的の一般項が得られます。

log2(bn) = n(n − 1) / 2

C++による実装例

// 与えられた漸化式の n 番目の項を求める C++ プログラム
#include <bits/stdc++.h>
using namespace std;

// 必要な値を返す関数
int sum(int n1) {
    // 答えを計算する
    int ans1 = (n1 * (n1 - 1)) / 2;
    // 答えを返す
    return ans1;
}

// メイン関数
int main() {
    // n の値を設定
    int n = 200;
    // 関数を呼び出して結果を出力
    cout << sum(n);
    return 0;
}

出力

19900

計算量と実装上の注意点

この解法は、漸化式を閉じた形(一般項の公式)に変換してから計算しているため、計算量は O(1) となります。n の値がどれだけ大きくても、一定時間で答えを求められるのが大きな利点です。

ただし、int 型は約21億までしか表現できないため、n が大きくなると乗算時にオーバーフローを起こします。n が約46,000を超えるようなケースでは、long long 型を使用するか、必要に応じて多倍長整数(任意精度演算)の利用を検討してください。

  1. C++でドラゴン曲線シーケンスのn番目の項を求める方法

    この記事では、ドラゴン曲線(Dragon Curve)シーケンスのn番目の項を求めるC++プログラムを紹介します。ドラゴン曲線シーケンスとは、無限に続く二進列(0と1のみで構成される数列)のことで、「1」から始まり、各ステップで前の項の各要素に対して「1」と「0」を交互に追加していくことで次の項を形成していきます。 第1項: 1 第2項: 110 第3項: 1101100 第4項: 110110011100100 まず「1」から始め、前の項の各要素の後に「1」と「0」を交互に付け加えていきます。新しい項が得られたら、それを現在の項として同じ手順をn回繰り返すことで、目的の項を生成できます

  2. Pythonで漸化式のn番目の項を求める方法:log₂(bₙ)の計算

    次のような数列 bn を考えてみましょう。この数列は、b1 = 1 および bn+1/bn = 2n という漸化式で表されます。ここでの課題は、与えられた n に対して log2(bn) の値を求めることです。たとえば、入力が 6 の場合、出力は 15 になります。これは log2(bn) = (n × (n − 1)) / 2 = (6 × (6 − 1)) / 2 = 15 となるためです。数学的な導出手順この問題は、漸化式を段階的に展開することで解くことができます。bn+1/bn = 2nbn/bn−1 = 2n−1…(中略)…b2/b1 = 21上記の式をすべて掛け合わせると、左辺の分