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

第n項が n² − (n−1)² で表される級数の総和を求めるC/C++プログラム


数学にはさまざまな種類の級数が存在し、その多くはC言語やC++を使って効率的に計算することができます。本記事では、次の級数の総和を求めるプログラムを紹介します。

Tn = n2 - (n-1)2

この級数のすべての項の総和 Sn を、109 + 7 で割った余り(mod)として求めます。総和は次のように定義されます。

Sn = T1 + T2 + T3 + T4 + …… + Tn

入力:229137999
出力:218194447

解説

Tn は 2n − 1 の形に変形できます。(n−1)2 を展開して、実際に確認してみましょう。

=> Tn = n2 - (n-1)2
=> Tn = n2 - (1 + n2 - 2n)
=> Tn = n2 - 1 - n2 + 2n
=> Tn = 2n - 1

次に、この級数の総和 ∑Tn を求めます。

∑Tn = ∑(2n – 1)

この式をさらに変形すると、

=> ∑(2n – 1) = 2*∑n – ∑1
=> ∑(2n – 1) = 2*∑n – n

ここで、∑n は最初の n 個の自然数の総和を意味します。1 から n までの自然数の和は、有名な公式によって次のように表されます。

∑n = n(n+1)/2

この公式を代入すると、最終的な式は次のようにまとめられます。

∑Tn = (2 * n * (n+1) / 2) – n = n2

つまり、この級数の総和はシンプルに n2 になると分かります。ただし、n2 の値は非常に大きな数になる可能性があるため、結果は 109 + 7 の mod で管理する必要があります。

そこで、mod乗算の性質を利用して n2 をオーバーフローなしに計算します。

(a*b)%k = ((a%k)*(b%k))%k

プログラム例

#include <iostream>
using namespace std;
#define mod 1000000007
int main() {
   long long n = 229137999;
   cout << ((n%mod)*(n%mod))%mod;
   return 0;
}
出力:218194447

このように、数式的に総和が n2 になると導くことで、各項を順番に足し合わせることなく、O(1) の計算量で答えを求めることができます。大きな n が与えられても、mod乗算の性質を組み合わせれば高速かつ正確に計算可能です。

  1. 第n項が n² −(n−1)² となる数列の総和を求めるJavaプログラム

    第n項が n² −(n−1)² で表される数列の総和を求める方法を解説します。まず数学的な仕組みを確認し、その後で実際に動作するJavaプログラムと実行結果を見ていきましょう。 数学的な背景:総和がn²になる理由 第n項が n² −(n−1)² である数列について、初項から第n項までの総和 S は次のように表せます。 S = (1² − 0²) + (2² − 1²) + (3² − 2²) + … + (n² −(n−1)²) 各カッコ内のマイナスの項と、直後のカッコ内のプラスの項が順に打ち消し合うため、このような級数は「望遠鏡和(テレスコーピング級数)」と呼ばれます。すべての項が消去された

  2. 第n項がn² − (n−1)²で表される級数の総和を求めるPythonプログラム

    本記事では、第n項が n² − (n−1)² で表される級数の総和を、Pythonを使って効率的に求める方法について解説します。 問題文 整数 n が与えられたとき、次の一般項で表される級数の最初の n 項の総和を求めます。 Tn = n² − (n−1)² アプローチのポイント 各項を順番に計算して足し合わせることも可能ですが、この級数には「望遠鏡和(テレスコーピング)」と呼ばれる便利な性質があります。一般項を展開してみましょう。 Tn = n² − (n−1)² = n² − (n² − 2n + 1) = 2n − 1 つまり各項は連続する奇数であり、その総和は次のように簡潔に表せます。