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 型を使用するか、必要に応じて多倍長整数(任意精度演算)の利用を検討してください。
-
C++でドラゴン曲線シーケンスのn番目の項を求める方法
この記事では、ドラゴン曲線(Dragon Curve)シーケンスのn番目の項を求めるC++プログラムを紹介します。ドラゴン曲線シーケンスとは、無限に続く二進列(0と1のみで構成される数列)のことで、「1」から始まり、各ステップで前の項の各要素に対して「1」と「0」を交互に追加していくことで次の項を形成していきます。 第1項: 1 第2項: 110 第3項: 1101100 第4項: 110110011100100 まず「1」から始め、前の項の各要素の後に「1」と「0」を交互に付け加えていきます。新しい項が得られたら、それを現在の項として同じ手順をn回繰り返すことで、目的の項を生成できます
-
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上記の式をすべて掛け合わせると、左辺の分