フィボナッチ数列と黄金比——自然界の数の神秘
フィボナッチ数列
「前の2つを足して次を作る」——これだけの単純なルールから、自然界の至るところに現れる不思議な数列が生まれます。
フィボナッチ数列は次の漸化式で定義されます:
「1個のウサギのペアが毎月1ペアずつ増え、生まれたペアは2ヶ月後から繁殖を始める」——13世紀にイタリアの数学者フィボナッチが「ウサギの繁殖」問題として紹介しましたが、この数列はそれ以前からインドの詩律学で研究されていました。
自然界のフィボナッチ
「なぜこんな数列が自然界に現れるのか」——植物が成長するとき、葉や種を最も効率よく並べようとすると、自然とフィボナッチ数が現れます:
- ひまわりの種の螺旋: と (または と )——「時計回りと反時計回りの螺旋の本数がフィボナッチ数」
- 松ぼっくりのりん片: と
- 花びらの枚数:多くの花が 枚
- 植物の茎に巻く葉の角度:——「この角度で葉を並べると最も重なりが少ない」
黄金比 φ
「隣り合うフィボナッチ数の比は、どこへ向かうのか」——分数の列 を計算してみると、ある一定の値に近づいていきます。
隣り合うフィボナッチ数の比 は でどこへ向かうのでしょうか?
比が収束値 に近づくと仮定すると、 なので:
収束値では 、つまり ——「自分自身の逆数に 1 を足すと自分に戻る、不思議な数」:
これが黄金比(golden ratio)(ファイ)です——古代ギリシャ時代から「最も美しい比」として知られてきた数です。
比の収束を見る
var phi, fibs, i, ratio, ox, oy, pw, ph;
phi = (1 + Math.sqrt(5)) / 2;
fibs = [1, 1];
for (i = 2; i < 20; i++) fibs.push(fibs[i-1] + fibs[i-2]);
function loop() {
ctx.clearRect(0, 0, W, H);
ox = 40; oy = 260; pw = W - 80; ph = 200;
// phi reference line
var phiY = oy - ((phi - 1.3) / 0.5) * ph;
ctx.strokeStyle = '#fbbf2455';
ctx.lineWidth = 1;
ctx.setLineDash([5,4]);
ctx.beginPath();
ctx.moveTo(ox, phiY); ctx.lineTo(ox+pw, phiY); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = '#fbbf24';
ctx.font = '12px monospace';
ctx.textAlign = 'left';
ctx.fillText('φ = ' + phi.toFixed(6), ox+pw+4, phiY+4);
// y axis labels
ctx.fillStyle = '#475569';
ctx.font = '10px monospace';
ctx.textAlign = 'right';
for (var yl = 13; yl <= 18; yl++) {
var lyv = yl / 10;
var lyy = oy - ((lyv - 1.3) / 0.5) * ph;
if (lyy > 40 && lyy < oy) {
ctx.fillText(lyv.toFixed(1), ox-4, lyy+3);
}
}
// plot ratios
ctx.strokeStyle = '#60a5fa';
ctx.lineWidth = 2;
ctx.beginPath();
for (i = 1; i < fibs.length - 1; i++) {
ratio = fibs[i+1] / fibs[i];
var ratioY = oy - ((ratio - 1.3) / 0.5) * ph;
var ratioX = ox + (i-1) * (pw / (fibs.length - 3));
ratioY = Math.max(30, Math.min(oy, ratioY));
if (i === 1) ctx.moveTo(ratioX, ratioY); else ctx.lineTo(ratioX, ratioY);
ctx.fillStyle = '#60a5fa';
ctx.beginPath();
ctx.arc(ratioX, ratioY, 4, 0, Math.PI*2);
ctx.fill();
if (i <= 7) {
ctx.fillStyle = '#94a3b8';
ctx.font = '10px monospace';
ctx.textAlign = 'center';
ctx.fillText(fibs[i+1]+'/'+fibs[i], ratioX, oy + 16);
}
ctx.beginPath();
if (i > 1) {
var prevRatio = fibs[i] / fibs[i-1];
var prevY = oy - ((prevRatio - 1.3) / 0.5) * ph;
var prevX = ox + (i-2) * (pw / (fibs.length - 3));
ctx.moveTo(prevX, Math.max(30,Math.min(oy,prevY)));
ctx.lineTo(ratioX, Math.max(30,Math.min(oy,ratioY)));
}
ctx.strokeStyle = '#60a5fa';
ctx.lineWidth = 2;
ctx.stroke();
}
ctx.fillStyle = '#e2e8f0';
ctx.font = '14px monospace';
ctx.textAlign = 'left';
ctx.fillText('Fₙ₊₁/Fₙ → φ = (1+√5)/2 ≈ 1.61803', 20, 22);
requestAnimationFrame(loop);
}
loop(); 黄金螺旋
「フィボナッチ数を辺の長さとする正方形を並べると、美しい螺旋が現れる」——ノートの隅に 1, 1, 2, 3, 5, 8, 13 の大きさの正方形を並べて、各コーナーを弧でつなぐだけです。
フィボナッチ数を辺の長さとする正方形を並べ、各正方形の弧を連ねると黄金螺旋(対数螺旋)が得られます。
var t, fibSeq, i, ox, oy, scale;
t = 0;
fibSeq = [1, 1, 2, 3, 5, 8, 13, 21];
var colors = ['#3b82f6','#8b5cf6','#22c55e','#f97316','#ec4899','#14b8a6','#fbbf24','#f87171'];
function loop() {
ctx.clearRect(0, 0, W, H);
t += 0.012;
var maxFib = fibSeq[fibSeq.length - 1];
scale = Math.min((W-40) / (maxFib * 1.5), (H-40) / (maxFib * 1.0));
// layout squares: start at center, spiral outward
// Positions computed for fib rectangle layout
var rects = [];
var cx = W/2 - fibSeq[6]*scale/2;
var cy = H/2 - fibSeq[5]*scale/2;
// simplified layout: place squares in order
var px = cx + fibSeq[6]*scale, py = cy + fibSeq[5]*scale;
// direction: right, up, left, down
var dirs = [[1,0],[0,-1],[-1,0],[0,1]];
var x = cx + (fibSeq[5]+fibSeq[4])*scale;
var y = cy + fibSeq[5]*scale;
var dirs2 = [
[cx + fibSeq[5]*scale*1, cy + fibSeq[5]*scale*0, 1, -1, 'right'],
[cx + fibSeq[5]*scale*1, cy - fibSeq[4]*scale, -1, -1, 'up'],
[cx - fibSeq[3]*scale, cy - fibSeq[4]*scale, -1, 1, 'left'],
[cx - fibSeq[3]*scale, cy + fibSeq[2]*scale, 1, 1, 'down']
];
var squares = [
{ x: cx + fibSeq[5]*scale, y: cy, w: fibSeq[6]*scale, arcStartAngle: -Math.PI/2, arcDir: -1 },
{ x: cx + fibSeq[5]*scale - fibSeq[5]*scale, y: cy - fibSeq[5]*scale, w: fibSeq[5]*scale, arcStartAngle: 0, arcDir: -1 },
{ x: cx - fibSeq[4]*scale, y: cy - fibSeq[5]*scale + fibSeq[4]*scale, w: fibSeq[4]*scale, arcStartAngle: Math.PI/2, arcDir: -1 },
{ x: cx, y: cy + fibSeq[2]*scale, w: fibSeq[3]*scale, arcStartAngle: Math.PI, arcDir: -1 },
{ x: cx + fibSeq[2]*scale, y: cy, w: fibSeq[2]*scale, arcStartAngle: -Math.PI/2, arcDir: -1 },
{ x: cx + fibSeq[2]*scale, y: cy + fibSeq[0]*scale, w: fibSeq[1]*scale, arcStartAngle: Math.PI, arcDir: -1 },
{ x: cx + fibSeq[2]*scale + fibSeq[1]*scale, y: cy + fibSeq[0]*scale, w: fibSeq[0]*scale, arcStartAngle: Math.PI/2, arcDir: -1 },
{ x: cx + fibSeq[2]*scale, y: cy, w: fibSeq[0]*scale, arcStartAngle: 0, arcDir: -1 }
];
var numVisible = Math.min(fibSeq.length, Math.floor(t * 1.2) + 1);
for (i = 0; i < numVisible; i++) {
var sq = squares[i % squares.length];
var ww = fibSeq[i] * scale;
var col = colors[i % colors.length];
ctx.fillStyle = col + '33';
ctx.strokeStyle = col;
ctx.lineWidth = 1.5;
ctx.fillRect(sq.x, sq.y, sq.w, sq.w);
ctx.strokeRect(sq.x, sq.y, sq.w, sq.w);
ctx.fillStyle = col;
ctx.font = Math.max(8, sq.w/3) + 'px monospace';
ctx.textAlign = 'center';
if (sq.w > 12) ctx.fillText(fibSeq[i], sq.x + sq.w/2, sq.y + sq.w/2 + 4);
}
ctx.fillStyle = '#e2e8f0';
ctx.font = '13px monospace';
ctx.textAlign = 'left';
ctx.fillText('フィボナッチ: ' + fibSeq.slice(0, numVisible).join(', '), 14, 22);
ctx.fillStyle = '#fbbf24';
ctx.fillText('φ = (1+√5)/2 ≈ 1.61803', 14, 40);
if (t > fibSeq.length / 1.2 + 1) t = 0;
requestAnimationFrame(loop);
}
loop(); ビネの公式(閉形式)
「漸化式を1項ずつ計算しなくても、 番目の値を直接求められる」——これがビネの公式です:
ここで (黄金比)、。
なので ()のとき:
: ✓——「黄金比を10乗して で割るだけで10番目の値が求まる」。
導出:行列 の固有値が であることから導ける(前回の固有値の応用!)——「行列の対角化がフィボナッチの閉形式を生む」。
フィボナッチ数列の恒等式
「フィボナッチ数には美しい関係式がたくさんある」——これらは数学的帰納法や行列の積を使って証明できます:
| 名前 | 式 |
|---|---|
| カッシーニの等式 | |
| ザック条件 | |
| 和の公式 | |
| 二乗の和 |
まとめ
- フィボナッチ数列:、——「前の2項を足して次の項を作る」
- 黄金比:、 を満たす——「自分の逆数に1を足すと自分になる」
- 隣接比 ——「フィボナッチ数の比は黄金比に収束する」
- ビネの公式:(固有値分解から導出)——「1項ずつ計算しなくても直接求まる」
- 自然界・芸術・建築に広く現れる「美しい比」——「ひまわりからオウムガイまで」
次回はシリーズ最終回——グラフ理論の基本。頂点と辺で構成される構造の数学を学びます。