複素数と図形
複素数で直線と円を表す
「数式で図形の形が決まる」——これまで実数の方程式で直線や円を表してきましたが、複素数を使うと表現がさらにシンプルになることがあります。
複素数平面では、点 に対して図形の方程式も複素数で書けます。
直線
「 の実部がゼロ」という条件が直線を表します。実係数 ( または )と複素数 のとき、 は直線を表します。
または、2 点 を通る直線は——「2 点を決めれば直線が決まる」のは実数の世界と同じです:
円
「ある点 からの距離がちょうど 」——これは円の定義そのままです。中心 、半径 の円:
これはそのまま「点 から中心 までの距離 = 」という定義です——「 が距離を表す」と読めば自然です。
より一般的に、()はアポロニウスの円を表します——「2 点からの距離の比が一定な点の集まり」です。
1 の 乗根
「 回かけると 1 になる数をすべて見つけよ」——これが 1 の 乗根の問題です。実数の世界では 1 か -1( が偶数のとき)しかありませんが、複素数では必ず 個の解が見つかります。
を満たす複素数を 1 の 乗根といいます。
とおくと、 なので ( は整数)。
性質
- ちょうど 個ある——「 次方程式なので解は 個」
- すべて単位円上にある——「 なので 」
- 単位円上に等間隔( おき)に並ぶ——「 ずつ回転した位置に並ぶ」
- 正 角形の頂点を形成する——「等間隔に 個 = 正多角形の頂点」
インタラクティブ図解:1 の 乗根
マウスを左右に動かすと が変わります。単位円上の頂点が等間隔に並び、正多角形を形成することを確認しましょう。
var OX = 300, OY = 200, R = 150;
var t = 0;
function loop() {
ctx.clearRect(0, 0, W, H);
t += 0.012;
var n = Math.round(2 + (mx / W) * 14);
if (n < 2) n = 2;
if (n > 16) n = 16;
// 同心円(補助)
for (var ri = 1; ri <= 2; ri++) {
ctx.beginPath();
ctx.arc(OX, OY, R * ri / 2, 0, Math.PI*2);
ctx.strokeStyle = '#161b22'; ctx.lineWidth = 1;
ctx.stroke();
}
// 軸
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1.2;
ctx.beginPath(); ctx.moveTo(OX-R-20, OY); ctx.lineTo(OX+R+20, OY); ctx.stroke();
ctx.beginPath(); ctx.moveTo(OX, OY-R-20); ctx.lineTo(OX, OY+R+20); ctx.stroke();
ctx.fillStyle='#8b949e';ctx.font='12px sans-serif';
ctx.fillText('Re',OX+R+6,OY-8);
ctx.fillText('Im',OX+6,OY-R-10);
ctx.fillText('1',OX+R-8,OY+16);
ctx.fillText('-1',OX-R-18,OY+16);
ctx.fillText('i',OX+6,OY-R+6);
ctx.fillText('-i',OX+6,OY+R+6);
// 単位円
ctx.beginPath();
ctx.arc(OX, OY, R, 0, Math.PI*2);
ctx.strokeStyle = '#58a6ff40'; ctx.lineWidth = 2;
ctx.stroke();
// 多角形を描く
var pts = [];
for (var k = 0; k < n; k++) {
var angle = 2 * Math.PI * k / n;
var px = OX + R * Math.cos(angle);
var py = OY - R * Math.sin(angle);
pts.push([px, py]);
}
// 多角形の塗り
ctx.beginPath();
ctx.moveTo(pts[0][0], pts[0][1]);
for (var i = 1; i < pts.length; i++) {
ctx.lineTo(pts[i][0], pts[i][1]);
}
ctx.closePath();
ctx.fillStyle = '#58a6ff10';
ctx.fill();
ctx.strokeStyle = '#58a6ff60'; ctx.lineWidth = 1.5;
ctx.stroke();
// 各頂点から原点への線(放射状)
for (var j = 0; j < pts.length; j++) {
ctx.beginPath();
ctx.moveTo(OX, OY);
ctx.lineTo(pts[j][0], pts[j][1]);
ctx.strokeStyle = '#ffa65730'; ctx.lineWidth = 1;
ctx.stroke();
}
// アニメーション:点が順番に光る
var activeK = Math.floor(t * 1.5) % n;
// 各頂点を描く
for (var m = 0; m < pts.length; m++) {
var isActive = (m === activeK);
var angle2 = 2 * Math.PI * m / n;
var reV = Math.cos(angle2), imV = Math.sin(angle2);
ctx.beginPath();
ctx.arc(pts[m][0], pts[m][1], isActive ? 9 : 6, 0, Math.PI*2);
ctx.fillStyle = isActive ? '#ffa657' : '#58a6ff';
ctx.fill();
if (isActive) {
// 光る点のオーラ
ctx.beginPath();
ctx.arc(pts[m][0], pts[m][1], 16, 0, Math.PI*2);
ctx.strokeStyle = '#ffa65740'; ctx.lineWidth = 3; ctx.stroke();
// 座標ラベル
ctx.fillStyle = '#ffa657'; ctx.font = 'bold 12px monospace';
var lx = pts[m][0] + (pts[m][0] > OX ? 12 : -80);
var ly = pts[m][1] + (pts[m][1] < OY ? -10 : 18);
ctx.fillText('(' + reV.toFixed(2) + ',', lx, ly);
ctx.fillText(imV.toFixed(2) + 'i)', lx, ly + 16);
}
// 添字ラベル
var labelR = R + 20;
var lax = OX + labelR * Math.cos(angle2);
var lay = OY - labelR * Math.sin(angle2);
ctx.fillStyle = '#79c0ff80'; ctx.font = '11px sans-serif';
ctx.fillText('z' + m, lax - 6, lay + 4);
}
// 角度 2π/n の表示弧
ctx.beginPath();
ctx.arc(OX, OY, 30, -2*Math.PI/n, 0);
ctx.strokeStyle = '#56d36480'; ctx.lineWidth = 2; ctx.stroke();
ctx.fillStyle = '#56d364'; ctx.font = '11px sans-serif';
ctx.fillText('2π/'+n, OX+34, OY-10);
// 多角形名
var polyNames = {2:'線分',3:'正三角形',4:'正方形',5:'正五角形',6:'正六角形',
7:'正七角形',8:'正八角形',9:'正九角形',10:'正十角形',12:'正十二角形',16:'正十六角形'};
var pName = polyNames[n] || ('正' + n + '角形');
// 情報パネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(8, 8, 270, 110);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(8, 8, 270, 110);
ctx.font = 'bold 16px sans-serif';
ctx.fillStyle = '#58a6ff';
ctx.fillText('n = ' + n + ' (' + pName + ')', 16, 30);
ctx.font = '12px monospace';
ctx.fillStyle = '#e6edf3';
ctx.fillText('z^n = 1 を満たす解: n個', 16, 52);
ctx.fillStyle = '#ffa657';
ctx.fillText('z_k = e^(i·2πk/n)', 16, 72);
ctx.fillStyle = '#56d364';
ctx.fillText('角度間隔: ' + (360/n).toFixed(1) + '°', 16, 92);
ctx.fillStyle = '#8b949e';
ctx.fillText('光る点: z_' + activeK, 16, 110);
requestAnimationFrame(loop);
}
loop();
1 の 乗根の代数的性質
を原始 乗根とすると、全 個の解は:
「最初の解 を何度もかけていくと、残りの解が順番に現れる」—— 回かけると元の 1 に戻ります。
和の公式
幾何的には「原点を中心に等間隔に並ぶ点の重心は原点」という意味です——「対称に配置された点を平均すれば中心になる」のは直感的にも分かりますね。
積の公式
が奇数なら ( は偶数なら )。
円の複素数方程式
中心 、半径 の円
の形
「 とその共役の和」—— とすると 、つまり :これは虚軸に平行な直線——「実部が一定の点の集まり」です。
の形
「 から までの距離 = から までの距離」——2 点から等距離の点の集まりは、その 2 点を結ぶ線分の垂直二等分線です。 軸と 軸の交点の軌跡 = 虚軸()。
タレスの定理(複素数版)
「直径を見込む角は必ず直角」——これが高校幾何で学ぶタレスの定理です。これも複素数で表現できます。
直径の両端を とすると、直径上の半円の円弧上の点 の条件は:
が実数のとき 3 点 が同一直線上、純虚数のとき (タレスの定理)——「複素数の比で直線上か直角かを判定できる」という美しい事実です。
複素数の図形問題:例題
例題
を満たす の軌跡を求めよ。
解: 「 として成分で計算する」——複素数の絶対値を距離として読み替えます:
とおく。
両辺を 2 乗——「ルートを外す定番の手順」:
直線 (点 と点 の垂直二等分線)——「2 点から等距離の点の軌跡は垂直二等分線」という原則通りです。
シリーズの締めくくり
15 回の「幾何と図形」をすべて学んできました。
| 回 | テーマ |
|---|---|
| 1–3 | 三角比と三角形 |
| 4–6 | 直線・円・位置関係 |
| 7–9 | 二次曲線・軌跡・領域 |
| 10–12 | ベクトル(2D・3D) |
| 13–15 | 複素数平面 |
これらは一見バラバラに見えて、実は「空間の中の点の関係」という共通のテーマでつながっています——「いろんな角度から『点がどこにあるか』を調べ続けてきた」のです。
- 三角比 → ベクトルの内積・外積へ
- 円の方程式 → 複素数の絶対値へ
- 軌跡の思考 → より高度な解析幾何へ
幾何の世界は深く広いです。ここで学んだ道具を持って、ぜひさらなる数学の探求を続けてみてください。
まとめ
- 複素数方程式 は中心 、半径 の円を表す——「距離の定義そのまま」
- 1 の 乗根は単位円上に正 角形をなす——「 等分した回転が 個の解を生む」
- 原始 乗根 の和は 0:——「等間隔に並んだ点の重心は中心」
- 複素数の四則演算が、幾何の変換(回転・拡大・平行移動)と一致する美しさ——「代数と幾何が一体となる瞬間」