高次方程式と因数定理
因数定理
「 を代入すると式がちょうど0になる」——これは単なる偶然ではありません。実は「 で割り切れる」という強力な情報を含んでいます。
因数定理:多項式 について、
これは非常に強力なツールです。ある値 を代入して になれば、 で割り切れるとわかります。
例:
小さな整数()を順に代入してみます:
→ は因数
→ は因数
→ は因数
よって:
剰余定理
剰余定理: を で割ったときの余りは です。
「割り算の余りを知るために、全部計算しなくていい」—— を代入するだけで余りがわかります。
f(x) = (x-a)・Q(x) + R
x=a を代入:
f(a) = 0・Q(a) + R = R
因数定理は剰余定理の特別な場合(、つまり割り切れる場合)です。
組立除法(合成除法)
多項式を で割るとき、係数だけを使って計算する組立除法(synthetic division)が便利です。「式全体を書かずに、係数の配列だけで計算する」省力技術です。
例: を で割る
係数: 1 -6 11 -6 (a = 1)
1 | 1 -6 11 -6
| 1 -5 6
-----------------
1 -5 6 0 ← 余り = 0 ✓
商:
よって全体:
組立除法の手順:
- 係数を横に並べる
- を左に書く
- 最初の係数をそのまま下に
- 下の数 × を右上にずらして足す
- 繰り返す → 最後の数が余り
有理根の候補(有理根定理)
「どんな値を代入すればゼロになるか」——手当たり次第に試すより、候補を絞れます。
整数係数の多項式 の有理数の根は:
の形に限られます。
例:
- の因数:
- の因数:
- 候補:(全部で8個)
→ が根——8個の候補から1つずつ試せばすぐ見つかります。
高次方程式の一般的な解法
「3次・4次方程式は手ごわそう」——でも次のステップを踏めば必ず解けます。
- 有理根定理で候補を絞る
- 代入して を確認(因数定理)
- 組立除法で次数を下げる
- 残った式をさらに因数分解
- 2次式は解の公式で解く
| 次数 | 解法の流れ |
|---|---|
| 3次 | 因数定理 → 2次式 → 解の公式 |
| 4次 | 因数定理 → 3次式 → 再び因数定理 → 2次式 |
| 特殊形 | は で2次に |
多項式のゼロ点とグラフ
のグラフは、 で 軸と交わります——「因数の数だけグラフがx軸を通過する」という視覚的なルールです。
function loop() {
ctx.clearRect(0, 0, W, H);
var cx = W/2, cy = H/2;
var scaleX = 55, scaleY = 10;
var r1 = -4 + (mx / W) * 8; // -4 to 4
var r2 = 1.5, r3 = -1.5;
// Grid
ctx.strokeStyle = '#1a2036';
ctx.lineWidth = 1;
for (var gx = -5; gx <= 5; gx++) {
ctx.beginPath(); ctx.moveTo(cx+gx*scaleX,0); ctx.lineTo(cx+gx*scaleX,H); ctx.stroke();
}
// Axes
ctx.strokeStyle = '#334155'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(0,cy); ctx.lineTo(W,cy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(cx,0); ctx.lineTo(cx,H); ctx.stroke();
ctx.fillStyle = '#475569'; ctx.font = '11px monospace'; ctx.textAlign = 'center';
for (var n = -5; n <= 5; n++) {
if (n===0) continue;
ctx.fillText(n, cx+n*scaleX, cy+14);
}
// Curve
ctx.strokeStyle = '#3b82f6';
ctx.lineWidth = 2.5;
ctx.beginPath();
var started = false;
for (var px = 0; px <= W; px += 2) {
var xv = (px - cx) / scaleX;
var yv = (xv - r1) * (xv - r2) * (xv - r3);
var py = cy - yv * scaleY;
if (py < -50 || py > H + 50) { started = false; continue; }
if (!started) { ctx.moveTo(px, py); started = true; }
else ctx.lineTo(px, py);
}
ctx.stroke();
// Roots
var roots = [r1, r2, r3];
var rootColors = ['#fbbf24', '#22c55e', '#ef4444'];
var rootLabels = ['r₁ (可変)', 'r₂=1.5', 'r₃=-1.5'];
for (var i = 0; i < 3; i++) {
var rx = cx + roots[i] * scaleX, ry = cy;
ctx.fillStyle = rootColors[i];
ctx.beginPath();
ctx.arc(rx, ry, 7, 0, Math.PI*2);
ctx.fill();
ctx.fillStyle = rootColors[i]; ctx.font = '12px monospace'; ctx.textAlign = 'center';
ctx.fillText(rootLabels[i], rx, ry + (i===0 ? -14 : 22));
ctx.fillText(roots[i].toFixed(2), rx, ry + (i===0 ? -28 : 36));
}
// f(r1) check
var fAtMouse = (r1-r1)*(r1-r2)*(r1-r3);
// Info
ctx.fillStyle = '#0f172a';
ctx.fillRect(8, 8, 290, 70);
ctx.strokeStyle = '#334155'; ctx.lineWidth = 1; ctx.strokeRect(8, 8, 290, 70);
ctx.font = '12px monospace'; ctx.textAlign = 'left';
ctx.fillStyle = '#e2e8f0';
ctx.fillText('f(x) = (x - ' + r1.toFixed(2) + ')(x - 1.5)(x + 1.5)', 18, 28);
ctx.fillStyle = '#fbbf24';
ctx.fillText('f(r₁) = f(' + r1.toFixed(2) + ') = ' + fAtMouse.toFixed(3), 18, 48);
ctx.fillStyle = '#94a3b8';
ctx.fillText('マウスで r₁ を変える', 18, 68);
requestAnimationFrame(loop);
}
loop(); 重根
のように同じ因数が2回現れるとき、 を重根(二重根)と言います。グラフはその点で 軸に接する(交差しない)という特徴があります——「x軸にそっと触れて、また引き返す」形です。
→ (重根)、(単純根)
function loop() {
ctx.clearRect(0, 0, W, H);
var cx = W/2, cy = H/2;
var scaleX = 55, scaleY = 12;
var a = -3 + (mx / W) * 6; // -3 to 3
// Grid
ctx.strokeStyle = '#1a2036'; ctx.lineWidth = 1;
for (var gx = -5; gx <= 5; gx++) {
ctx.beginPath(); ctx.moveTo(cx+gx*scaleX,0); ctx.lineTo(cx+gx*scaleX,H); ctx.stroke();
}
// Axes
ctx.strokeStyle = '#334155'; ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(0,cy); ctx.lineTo(W,cy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(cx,0); ctx.lineTo(cx,H); ctx.stroke();
ctx.fillStyle = '#475569'; ctx.font = '11px monospace'; ctx.textAlign = 'center';
for (var n = -5; n<=5; n++) {
if (n===0) continue;
ctx.fillText(n, cx+n*scaleX, cy+14);
}
// Curve: (x-a)²(x+1)
ctx.strokeStyle = '#8b5cf6';
ctx.lineWidth = 2.5;
ctx.beginPath();
var started = false;
for (var px = 0; px <= W; px += 2) {
var xv = (px - cx) / scaleX;
var yv = (xv-a)*(xv-a)*(xv+1);
var py = cy - yv * scaleY;
if (py < -50 || py > H+50) { started = false; continue; }
if (!started) { ctx.moveTo(px, py); started = true; }
else ctx.lineTo(px, py);
}
ctx.stroke();
// Double root at x=a
ctx.fillStyle = '#fbbf24';
ctx.beginPath();
ctx.arc(cx + a*scaleX, cy, 9, 0, Math.PI*2);
ctx.fill();
ctx.fillStyle = '#fde68a'; ctx.font = 'bold 13px monospace'; ctx.textAlign = 'center';
ctx.fillText('重根 x=' + a.toFixed(2), cx+a*scaleX, cy-18);
// Simple root at x=-1
ctx.fillStyle = '#22c55e';
ctx.beginPath();
ctx.arc(cx - scaleX, cy, 7, 0, Math.PI*2);
ctx.fill();
ctx.fillStyle = '#86efac'; ctx.font = '13px monospace';
ctx.fillText('x=-1', cx - scaleX, cy + 22);
ctx.fillStyle = '#c4b5fd'; ctx.font = '13px monospace'; ctx.textAlign = 'center';
ctx.fillText('f(x) = (x - ' + a.toFixed(2) + ')²(x + 1)', W/2, 20);
ctx.fillText('重根では x 軸に接する(交差しない)', W/2, H-14);
requestAnimationFrame(loop);
}
loop(); 代数学の基本定理
代数学の基本定理: 次多項式は(複素数の範囲で)ちょうど 個の根を持ちます(重根は重複度分カウント)。
「 次式なら必ず 個の根がある」——これは「解がなくて困る」という事態が複素数まで広げると起きないことを保証する定理です。
と完全に因数分解できます(複素数の範囲で)。
まとめ
- 因数定理: は の因数——「代入してゼロならその値が根」
- 剰余定理: の余り ——「代入するだけで余りがわかる」
- 組立除法:係数だけで高速に除法を実行——「式全体を書かずに省力計算」
- 有理根定理:整数係数多項式の有理根候補を絞り込む——「手当たり次第に試す前に候補を減らす」
- 重根: の形 → グラフが 軸に接する——「通過ではなく、そっと触れて戻る」
次回は不等式の世界へ。方程式との違いと、不等号の向きに関する注意点を整理します。