#02 ふれてみよう高校数学 離散数学・数論

等比数列——比が一定の列と無限級数

等比数列とは

たとえば、コロナウイルスが「1人が2人に感染させる」パターンで広がるとします。1人 → 2人 → 4人 → 8人 → 16人……と、毎回2倍になっていきます。これが等比数列の考え方です。

等比数列(とうひすうれつ)とは、隣り合う項のが常に一定の数列です。この一定の比を公比(こうひ)と呼び、rr で表します。

例:1,2,4,8,16,1, 2, 4, 8, 16, \ldots(公比 r=2r = 2

毎年 22 倍に増える投資、毎回半分になる薬の量、コンピュータのデータサイズ——等比数列は指数的な成長・減衰を記述する最も基本的な道具です。


一般項の公式

nn 番目の項はいくつか?」を求める公式です。

初項 a1a_1、公比 rr の等比数列の第 nn 項は:

aₙ = a₁ · rⁿ⁻¹

考え方は、「最初の値(a1a_1)を (n1)(n-1) 回、rr 倍する」です。

n=1n = 1a1r0=a1a_1 \cdot r^0 = a_1n=2n = 2a1r1=a1ra_1 \cdot r^1 = a_1 rn=3n = 3a1r2=a1r2a_1 \cdot r^2 = a_1 r^2

nnana_na1=1,r=2a_1=1, r=2ana_na1=16,r=1/2a_1=16, r=1/2
1116
228
344
482
5161

指数的成長を「見る」

等差数列の棒グラフが階段状だったのに対して、等比数列の棒グラフは爆発的に伸びる(または急速に縮む)形になります。

「等差は毎回足し算」「等比は毎回掛け算」——この違いが大きな差を生みます。

マウスを左右に動かして公比 rr を変えてみましょう。r>1r > 1 で成長、0<r<10 < r < 1 で収束する様子が確認できます。

等比数列の棒グラフ:マウスを動かして公比 r を変えよう(左=0.5、右=3.0)
var a1, r, n, i, val, x, h, barW, maxVal;

function loop() {
ctx.clearRect(0, 0, W, H);

a1 = 1;
r = 0.5 + (mx / W) * 2.5;
n = 10;
barW = Math.floor((W - 60) / n) - 4;

var vals = [];
for (i = 0; i < n; i++) {
  vals.push(a1 * Math.pow(r, i));
}
maxVal = Math.max.apply(null, vals);
if (maxVal < 1) maxVal = 1;

for (i = 0; i < n; i++) {
  val = vals[i];
  h = Math.min(220, (val / maxVal) * 220);
  x = 30 + i * ((W - 60) / n);

  var t = i / (n - 1);
  var red = Math.round(59 + t * 220);
  var grn = Math.round(200 - t * 100);
  var blu = Math.round(246 - t * 150);
  ctx.fillStyle = 'rgb(' + red + ',' + grn + ',' + blu + ')';
  ctx.fillRect(x, 250 - h, barW, h);

  ctx.fillStyle = '#94a3b8';
  ctx.font = '11px monospace';
  ctx.textAlign = 'center';
  ctx.fillText(val < 100 ? val.toFixed(1) : val.toFixed(0), x + barW / 2, 264);
}

ctx.fillStyle = '#e2e8f0';
ctx.font = '14px monospace';
ctx.textAlign = 'left';
ctx.fillText('a₁ = 1  r = ' + r.toFixed(2), 20, 22);
ctx.fillText('aₙ = 1 × ' + r.toFixed(2) + 'ⁿ⁻¹', 20, 42);

ctx.fillStyle = r > 1 ? '#f87171' : '#34d399';
ctx.fillText(r > 1 ? '▲ 指数的成長(r > 1)' : '▼ 指数的減衰(0 < r < 1)', 20, 300);

requestAnimationFrame(loop);
}
loop();

等比数列の和の公式

Sn=a1+a1r+a1r2++a1rn1S_n = a_1 + a_1 r + a_1 r^2 + \cdots + a_1 r^{n-1}

「両辺に rr をかけると、ほとんどの項が重なる」という発想で導きます。

両辺に rr をかけて引く「等比数列の和の導出」:

   Sₙ =  a₁ + a₁r + a₁r² + … + a₁rⁿ⁻¹
r·Sₙ =       a₁r + a₁r² + … + a₁rⁿ⁻¹ + a₁rⁿ
──────────────────────────────────────────────
(1-r)Sₙ = a₁ - a₁rⁿ = a₁(1 - rⁿ)

rr 倍してから引くと、中間の項がきれいに消えて、最初と最後だけ残る」——これが等比数列の和の鍵です。

したがって(r1r \neq 1 のとき):

Sₙ = a₁(1 - rⁿ) / (1 - r)

r=1r = 1 のとき:Sn=na1S_n = n a_1(全て同じ値なので nn 倍)


無限等比級数:|r| < 1 のとき

r<1|r| < 1 なら rn0r^n \to 0nn \to \infty)なので:

S=limnSn=a11rS = \lim_{n \to \infty} S_n = \frac{a_1}{1 - r}

直感的には:公比が 11 より小さければ、各項が急速に 00 に近づき、無限に足し続けても有限の値に収まります。

有名な例:12+14+18+=1/211/2=1\dfrac{1}{2} + \dfrac{1}{4} + \dfrac{1}{8} + \cdots = \dfrac{1/2}{1 - 1/2} = 1

これは「1枚のケーキを半分ずつ切り続けると、無限に切っても元の1枚になる」という直感と一致します。

別の例えを使えば——1メートル進んで、また0.5メートル進んで、また0.25メートル進んで……と永遠に続けても、合計は2メートルを超えません。


収束の可視化

a1=1a_1 = 1、公比 rr0<r<10 < r < 1)のとき、SnS_n11r\dfrac{1}{1-r} に収束していく様子を観察しましょう。マウスを動かして rr を変えてみてください。rr が小さいほど素早く収束し、rr が1に近いほどゆっくり収束します。

|r|<1 のとき無限等比級数が収束する様子:マウスで r を変えよう
var a1, r, i, Sn, partial, limit;
var nSteps = 20;

function loop() {
ctx.clearRect(0, 0, W, H);

a1 = 1;
r = 0.1 + (mx / W) * 0.88;

limit = a1 / (1 - r);

var partials = [];
Sn = 0;
for (i = 0; i < nSteps; i++) {
  Sn += a1 * Math.pow(r, i);
  partials.push(Sn);
}

var maxY = limit * 1.1;
var ox = 40, oy = 260, pw = W - 80;

// limit line
ctx.strokeStyle = '#fbbf2466';
ctx.lineWidth = 1;
ctx.setLineDash([6, 4]);
var limitY = oy - (limit / maxY) * 240;
ctx.beginPath();
ctx.moveTo(ox, limitY);
ctx.lineTo(ox + pw, limitY);
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#fbbf24';
ctx.font = '12px monospace';
ctx.textAlign = 'left';
ctx.fillText('S = ' + limit.toFixed(3), ox + pw + 4, limitY + 4);

// partial sums
ctx.strokeStyle = '#60a5fa';
ctx.lineWidth = 2;
ctx.beginPath();
for (i = 0; i < partials.length; i++) {
  var px = ox + i * (pw / (nSteps - 1));
  var py = oy - (partials[i] / maxY) * 240;
  if (i === 0) ctx.moveTo(px, py); else ctx.lineTo(px, py);
  ctx.fillStyle = '#60a5fa';
  ctx.beginPath();
  ctx.arc(px, py, 3, 0, Math.PI * 2);
  ctx.fill();
  ctx.beginPath();
  if (i > 0) { ctx.moveTo(ox + (i-1) * (pw/(nSteps-1)), oy - (partials[i-1]/maxY)*240); ctx.lineTo(px, py); }
}
ctx.stroke();

ctx.fillStyle = '#e2e8f0';
ctx.font = '14px monospace';
ctx.textAlign = 'left';
ctx.fillText('r = ' + r.toFixed(3) + '  収束値 1/(1-r) = ' + limit.toFixed(3), 20, 22);
ctx.fillText('S₂₀ = ' + partials[nSteps-1].toFixed(4), 20, 42);

requestAnimationFrame(loop);
}
loop();

等比数列の応用

複利計算

「利息にも利息がつく」複利は等比数列そのものです。元本 PP、年利 rrnn 年後の金額:

An=P(1+r)nA_n = P \cdot (1 + r)^n

これは初項 PP、公比 (1+r)(1+r) の等比数列です。たとえば年利 5% なら公比 1.05——毎年1.05倍になっていきます。

等比数列の応用例

場面初項公比
人口成長(年率2%)現在人口1.02
放射性崩壊(半減期ごと)初期量0.5
デジタルデータ(バイト→KB→MB)11024

まとめ

  • 等比数列:「毎回同じ数を掛ける」数列。等差数列(毎回足す)とは違います
  • 一般項an=a1rn1a_n = a_1 \cdot r^{n-1}——「最初の値を (n1)(n-1)rr 倍する」
  • 和の公式Sn=a1(1rn)1rS_n = \dfrac{a_1(1-r^n)}{1-r}r1r \neq 1)——「rr 倍してから引く」で導出
  • 無限等比級数r<1|r| < 1 のとき S=a11rS = \dfrac{a_1}{1-r} に収束——ケーキを半分ずつ切っても全体は1枚
  • 等比数列は複利・人口増加・放射線の減衰など、身近な「指数的変化」を表す

次回は数列の和のシグマ記法と各種公式を学びます。