式の展開と整理
式の展開とは何か
たとえば、長さ メートルと長さ メートルの2辺を持つ長方形の面積を求めたいとしましょう。面積は縦×横なので ですが、これを「バラして計算した結果」にするのが展開です。答えは になります。
「展開」とは、括弧を外して式をすっきりとした形に書き直す操作です。ただ公式を暗記するのではなく、なぜそうなるのかを面積モデルで理解すると、ずっと定着しやすくなります。
FOIL法:2つの2項式の積
想像してみてください—— は「2つの和の掛け算」です。左の括弧の中の も も、右の括弧の中の と のそれぞれと掛け合わさります。これを漏れなく計算するための覚え方がFOIL法です。
| 頭文字 | 意味 | 項 |
|---|---|---|
| F (First) | 各括弧の最初の項どうし | |
| O (Outer) | 外側の項どうし | |
| I (Inner) | 内側の項どうし | |
| L (Last) | 各括弧の最後の項どうし |
(a + b)(c + d) = ac + ad + bc + bd
例:
「左の を右の と掛けて → 右の5と掛けて → 左の3を右の と掛けて → 右の5と掛ける」という順番で、全部で4回の掛け算をしているだけです。
重要な展開公式
高校数学で繰り返し登場する公式を整理します。
和の平方
「 と の和」を2乗するとどうなる? という問いです。 は を展開したものです。
(a + b)² = a² + 2ab + b²
ポイントは中央の「」が生まれること。 と の掛け算が2回分(FOILのOとI)登場するためです。
差の平方
「引き算バージョン」では、中央の符号が変わります。 が になる点だけが違います。
(a - b)² = a² - 2ab + b²
和と差の積(差の平方)
「足した数」と「引いた数」を掛け合わせると、中間の項が消えてしまう、とても便利な公式です。
(a + b)(a - b) = a² - b²
たとえば は暗算しにくいですが、 とすると楽に計算できます。
和の立方
2乗版をさらに 倍した結果です。
(a + b)³ = a³ + 3a²b + 3ab² + b³
係数 はパスカルの三角形の第3行と一致します(第14回で詳しく扱います)。
面積モデルで を「見る」
が になる理由を面積で考えてみましょう。1辺の長さが の正方形を描きます。この正方形を と で分割すると…
- 左上:(青)
- 右上:(緑)
- 左下:(緑)
- 右下:(赤)
合計: — これが の正体です。
「2つの緑色の部分( が2個)がなぜ生まれるのか」が面積を見ると一目でわかります。下のデモで の値(マウスのX座標)を変えながら、面積の変化を確認してください。
var a, b, total, scale, ox, oy;
function loop() {
ctx.clearRect(0, 0, W, H);
total = 6;
a = Math.max(0.5, Math.min(5.5, (mx / W) * total));
b = total - a;
scale = 220 / total;
ox = 40;
oy = 40;
// a² rectangle (top-left)
ctx.fillStyle = '#3b82f6';
ctx.fillRect(ox, oy, a * scale, a * scale);
// ab rectangle (top-right)
ctx.fillStyle = '#22c55e';
ctx.fillRect(ox + a * scale, oy, b * scale, a * scale);
// ab rectangle (bottom-left)
ctx.fillStyle = '#22c55e';
ctx.fillRect(ox, oy + a * scale, a * scale, b * scale);
// b² rectangle (bottom-right)
ctx.fillStyle = '#ef4444';
ctx.fillRect(ox + a * scale, oy + a * scale, b * scale, b * scale);
// labels inside
ctx.fillStyle = '#fff';
ctx.font = 'bold 15px monospace';
ctx.textAlign = 'center';
ctx.fillText('a²', ox + a * scale / 2, oy + a * scale / 2 + 6);
ctx.fillText('ab', ox + a * scale + b * scale / 2, oy + a * scale / 2 + 6);
ctx.fillText('ab', ox + a * scale / 2, oy + a * scale + b * scale / 2 + 6);
ctx.fillText('b²', ox + a * scale + b * scale / 2, oy + a * scale + b * scale / 2 + 6);
// border
ctx.strokeStyle = '#ffffff44';
ctx.lineWidth = 1;
ctx.strokeRect(ox, oy, total * scale, total * scale);
ctx.strokeRect(ox, oy, a * scale, a * scale);
ctx.strokeRect(ox + a * scale, oy, b * scale, a * scale);
ctx.strokeRect(ox, oy + a * scale, a * scale, b * scale);
// equation display
ctx.fillStyle = '#e2e8f0';
ctx.font = '14px monospace';
ctx.textAlign = 'left';
var av = a.toFixed(1), bv = b.toFixed(1);
var a2 = (a*a).toFixed(1), ab2 = (2*a*b).toFixed(1), b2 = (b*b).toFixed(1);
var tot = ((a+b)*(a+b)).toFixed(1);
ctx.fillText('a = ' + av + ', b = ' + bv, ox, 290);
ctx.fillText('(' + av + ' + ' + bv + ')² = ' + a2 + ' + ' + ab2 + ' + ' + b2 + ' = ' + tot, ox, 308);
requestAnimationFrame(loop);
}
loop(); 展開の実践:計算例
例題1
を展開せよ。
まず「 が 、 が 」と対応させます。和の平方の公式 に当てはめると:
として公式を適用:
(2x + 3)² = (2x)² + 2·(2x)·3 + 3²
= 4x² + 12x + 9
例題2
を展開せよ。
として和の立方の公式を使います:
(x + 1)³ = x³ + 3x²·1 + 3x·1² + 1³
= x³ + 3x² + 3x + 1
例題3
を展開せよ。
「足した数 × 引いた数 = 差の平方」の形です。 として:
として差の平方:
(3x - 2y)(3x + 2y) = (3x)² - (2y)²
= 9x² - 4y²
係数比較と整理
展開した後は「同類項をまとめる」作業が必要です。 の項はまとめて、 の項はまとめて、と整理していきます。
を展開して整理:
= x·x² + x·(-x) + x·3 + 2·x² + 2·(-x) + 2·3
= x³ - x² + 3x + 2x² - 2x + 6
= x³ + x² + x + 6
の項:、 の項: とまとめています。
インタラクティブ確認:展開式の検証
マウスのX座標で の値を変えながら、 が常に成り立つことを棒グラフで確認しましょう。4つの棒の合計が常に と一致しているのがわかります。
var a, b, total;
function loop() {
ctx.clearRect(0, 0, W, H);
total = 5;
a = Math.max(0.3, Math.min(4.7, (mx / W) * total));
b = total - a;
var terms = [
{ label: 'a³', val: a*a*a, color: '#3b82f6' },
{ label: '3a²b', val: 3*a*a*b, color: '#8b5cf6' },
{ label: '3ab²', val: 3*a*b*b, color: '#22c55e' },
{ label: 'b³', val: b*b*b, color: '#ef4444' }
];
var maxVal = Math.pow(total, 3);
var barW = 80;
var gap = (W - 4 * barW) / 5;
var maxH = 180;
ctx.fillStyle = '#94a3b8';
ctx.font = '13px sans-serif';
ctx.textAlign = 'center';
ctx.fillText('a = ' + a.toFixed(2) + ', b = ' + b.toFixed(2) + ', (a+b)³ = ' + Math.pow(total,3).toFixed(1), W/2, 22);
for (var i = 0; i < terms.length; i++) {
var x = gap + i * (barW + gap);
var h = (terms[i].val / maxVal) * maxH;
var y = 220 - h;
ctx.fillStyle = terms[i].color;
ctx.fillRect(x, y, barW, h);
ctx.fillStyle = '#e2e8f0';
ctx.font = 'bold 13px monospace';
ctx.fillText(terms[i].label, x + barW / 2, y - 6);
ctx.fillText(terms[i].val.toFixed(1), x + barW / 2, 238);
}
var sum = terms.reduce(function(s, t) { return s + t.val; }, 0);
ctx.fillStyle = '#fbbf24';
ctx.font = '13px monospace';
ctx.fillText('合計 = ' + sum.toFixed(2) + ' (a+b)³ = ' + Math.pow(total,3).toFixed(2), W/2, 262);
requestAnimationFrame(loop);
}
loop(); まとめ
- 展開とは括弧を外して多項式の標準形にする操作。「掛け算を全部バラす」作業です
- は面積モデルで直感的に理解できます——正方形を4つに切り分けた面積の合計です
- 、 は頻出公式。特に は暗算にも使えます
- の係数はパスカルの三角形と対応
- 展開後は必ず同類項をまとめる(同じ の項同士、 の項同士をまとめる)
展開の逆操作、つまり「まとまった式を積の形に戻す」のが因数分解です。次回はその基本を学びます。