等差数列——一定の差で増える列
等差数列とは
たとえば電車の座席番号を思い浮かべてください。1号車の座席が1, 2, 3, 4, …と並んでいます。毎回「1ずつ増える」ルールで並んでいます。これが等差数列の考え方です。
等差数列(とうさすうれつ)とは、隣り合う項の差が常に一定の数列のことです。この「一定の差」を公差(こうさ)と呼び、 で表します。
例えば という数列は、各項が前の項より 大きい等差数列です()。
一般項の公式
「 番目の項はいくつか?」を一発で求めるのが一般項の公式です。
初項 、公差 の等差数列の第 項(一般項)は次の式で表せます。
aₙ = a₁ + (n-1)d
考え方は単純です——最初の値()から出発して、 ずつ 回増やした値が 番目の項です。
のとき: ✓ のとき: ✓ が増えるたびに ずつ増えていく構造です。
| 計算 | 値() | |
|---|---|---|
| 1 | 2 | |
| 2 | 5 | |
| 3 | 8 | |
| 4 | 11 | |
| 10 | 29 |
等差数列の視覚化
各項を高さとして棒グラフで描くと、棒の高さが等間隔に増加していることが一目でわかります。隣り合う棒の差(公差 )が常に同じ幅の「段差」を作っています。
マウスを左右に動かして公差 を変えてみましょう。 がプラスなら右に行くほど高くなり、 がマイナスなら右に行くほど低くなります。
var a1, d, n, x, h, barW, maxH, i, val, label;
function loop() {
ctx.clearRect(0, 0, W, H);
a1 = 2;
d = Math.round((mx / W) * 8 - 1);
n = 12;
barW = (W - 60) / n - 4;
maxH = 220;
ctx.fillStyle = '#94a3b8';
ctx.font = '14px sans-serif';
ctx.textAlign = 'left';
ctx.fillText('初項 a₁ = ' + a1 + ' 公差 d = ' + d, 20, 24);
for (i = 0; i < n; i++) {
val = a1 + i * d;
var clampedVal = Math.max(0, Math.min(maxH / 10, val));
h = clampedVal * 10;
x = 30 + i * ((W - 60) / n);
var ratio = i / (n - 1);
var r = Math.round(59 + ratio * 137);
var g = Math.round(130 + ratio * 60);
var b = Math.round(246 - ratio * 100);
ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
ctx.fillRect(x, 260 - h, barW, h);
ctx.fillStyle = '#cbd5e1';
ctx.font = '11px monospace';
ctx.textAlign = 'center';
ctx.fillText(val, x + barW / 2, 275);
if (i < n - 1 && d !== 0) {
ctx.strokeStyle = '#fbbf2488';
ctx.lineWidth = 1;
ctx.setLineDash([3, 3]);
var nextVal = a1 + (i + 1) * d;
var nextClamp = Math.max(0, Math.min(maxH / 10, nextVal));
var nextX = 30 + (i + 1) * ((W - 60) / n);
ctx.beginPath();
ctx.moveTo(x + barW, 260 - clampedVal * 10);
ctx.lineTo(nextX, 260 - nextClamp * 10);
ctx.stroke();
ctx.setLineDash([]);
}
}
ctx.fillStyle = '#fbbf24';
ctx.font = '13px monospace';
ctx.textAlign = 'left';
ctx.fillText('aₙ = ' + a1 + ' + (n-1)×' + d, 20, 305);
requestAnimationFrame(loop);
}
loop(); 等差数列の和の公式
第 項から第 項までの和 はどうなるでしょうか?
Sₙ = a₁ + (a₁+d) + (a₁+2d) + … + aₙ
ここでガウスのトリックを使います。これはドイツの天才数学者ガウスが少年のころに先生から「1から100まで足せ」という問題を出されたとき、瞬時に解いた有名な方法です。
数列を順方向と逆方向に並べて足し合わせると:
Sₙ = a₁ + (a₁+d) + … + aₙ
Sₙ = aₙ + (aₙ-d) + … + a₁
─────────────────────────────────
2Sₙ = (a₁+aₙ) + (a₁+aₙ) + … + (a₁+aₙ) ← n 個
「順方向と逆方向を足すと、どの組もきれいに になる」のがポイントです。これが 個あるので:
Sₙ = n(a₁ + aₙ) / 2
を使って書き直すと:
Sₙ = n{2a₁ + (n-1)d} / 2
台形で「見る」和の公式
は初項 と末項 を平行な辺にもつ台形の面積と同じ構造です。
面積 = (上底 + 下底) × 高さ / 2
= (a₁ + aₙ) × n / 2
棒グラフを並べると台形のような形になりますね。その台形の面積が和 に対応します。下のデモでは、等差数列の棒グラフが台形の形を形成する様子を確認できます。マウスを動かして の値を変えてみましょう。
var a1, d, nMax, i, val, x, h, barW;
function loop() {
ctx.clearRect(0, 0, W, H);
a1 = 2;
d = 3;
nMax = Math.max(2, Math.round((mx / W) * 18) + 2);
barW = Math.floor((W - 60) / nMax) - 2;
var an = a1 + (nMax - 1) * d;
var Sn = nMax * (a1 + an) / 2;
for (i = 0; i < nMax; i++) {
val = a1 + i * d;
h = val * 7;
x = 30 + i * ((W - 60) / nMax);
ctx.fillStyle = '#3b82f6';
ctx.fillRect(x, 240 - h, barW, h);
}
// trapezoid outline
ctx.strokeStyle = '#fbbf24';
ctx.lineWidth = 2;
ctx.setLineDash([5, 4]);
ctx.beginPath();
ctx.moveTo(30, 240 - a1 * 7);
ctx.lineTo(30 + (nMax - 1) * ((W - 60) / nMax) + barW, 240 - an * 7);
ctx.lineTo(30 + (nMax - 1) * ((W - 60) / nMax) + barW, 240);
ctx.lineTo(30, 240);
ctx.closePath();
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#e2e8f0';
ctx.font = '14px monospace';
ctx.textAlign = 'left';
ctx.fillText('n = ' + nMax + ' a₁ = ' + a1 + ' aₙ = ' + an, 20, 22);
ctx.fillStyle = '#fbbf24';
ctx.fillText('Sₙ = ' + nMax + ' × (' + a1 + ' + ' + an + ') / 2 = ' + Sn, 20, 42);
requestAnimationFrame(loop);
}
loop(); 練習問題
問題1
初項 、公差 の等差数列の第 項を求めよ。
「最初の から ずつ 回増やす」と考えます:
問題2
初項 、末項 、項数 の等差数列の和を求めよ。
「最初 、最後 、全部で 個」——台形の公式をそのまま使えます:
問題3
を計算せよ。(ガウスが少年時代に解いた有名問題)
1から100まで、全部で100個の等差数列()の和です:
まとめ
- 等差数列:「毎回同じだけ増える(or 減る)」数列。電車の座席番号や毎月の積み立てなどが身近な例
- 一般項:——「最初の値 + 公差 × (n-1)回分」
- 和の公式:——台形の面積と同じ計算式
- ガウスのトリック:「順方向と逆方向を足すと全て同じ値になる」という天才的な発想
次回は等比数列を扱います。差が一定ではなく、比が一定な数列です。たとえば「毎年1.05倍になる預金」がその例です。