みさご解体新書

等差数列の和

コード例

C++

using ll = long long;

ll seq_sum(ll a, ll d, ll n) { return (2 * a + (n - 1) * d) * n / 2; }

ll range_sum(ll a, ll b) {
  if (a > b) {
    swap(a, b);
  }

  return (a + b) * (b - a + 1) / 2;
}

TypeScript

function seqSum(a: number, d: number, n: number): number {
  return ((2 * a + (n - 1) * d) * n) / 2;
}

function rangeSum(a: number, b: number): number {
  if (a > b) {
    [a, b] = [b, a];
  }

  return ((a + b) * (b - a + 1)) / 2;
}

アルゴリズム

初項から末項までの総和

例えば 3, 4, 5, 6, 7 の和を求める場合、その和を x だとすると、

x=3+4+5+6+7x = 3 + 4 + 5 + 6 + 7

となり、足し算の計算は反転しても問題ないので、

x=7+6+5+4+3x = 7 + 6 + 5 + 4 + 3

とも書ける。

これらの式を辺々足し合わせると下記のとおりとなる。

 x =  3 +  4 +  5 +  6 +  7
 x =  7 +  6 +  5 +  4 +  3
---------------------------
2x = 10 + 10 + 10 + 10 + 10

よって、 2x = 50, x = 25 で、 3 + 4 + 5 + 6 + 7 = 25 と分かる。

一般に、初項が a、末項が b、 項数が n だとして、初項から末項まで総和 x は下記のとおりとなる。

x=(a+b)×n×12x = (a + b) \times n \times \frac{1}{2}

補足として項数 n は b - a + 1 で求めることができる。

公差が 1 でない場合

 x =  3 +  5 +  7 +  9 + 11
 x = 11 +  9 +  7 +  5 +  3
---------------------------
2x = 14 + 14 + 14 + 14 + 14

2x = 70
 x = 35

35 = (3 + 11) * 5 / 2

上記のように、公差が 1 でなくても総和を求めることができる。

初項、公差、項数から総和を求める場合

初項 a、 項数 n、 公差 d から末項は a+(n1)×da+(n-1) \times d で求めることができるので、

x=(a+b)×n×12x = (a + b) \times n \times \frac{1}{2}

の式に代入すると、

x=(2a+(n1)×d)×n×12x = (2a + (n - 1) \times d) \times n \times \frac{1}{2}

となる。