完全数・友愛数 — 古代から愛された神秘の数
自分自身を除く約数の和が自分と等しい「完全な数」、互いに結びついた「友愛数」の不思議
- 1
- 完全数とは、自分自身を除く約数の和が自分と等しい数(例: 6 = 1+2+3)
- 2
- 2000年以上前から知られる完全数は現在でも48個しか見つかっていない(奇数の完全数は未発見)
- 3
- 友愛数とは互いの真の約数の和が相手と等しい数のペア(例: 220と284)
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
古代ギリシャのピタゴラスが「6は完全な数だ」と述べてから2500年以上、完全数への探求は止まっていない。奇数の完全数が存在するかどうかは今も世界中の数学者が解けていない未解決問題だ。
身につく武器・思考力
数の持つ神秘的な構造への感性・約数と倍数の深い理解・暗号理論や素数探索アルゴリズムの基礎
実社会・ITでの活躍現場
- •GIMPS(Great Internet Mersenne Prime Search)でのメルセンヌ素数探索:完全数の発見と直結
- •暗号理論におけるRSA暗号の基礎となる大きな素数の探索
- •約数の列挙アルゴリズム:データ圧縮・素因数分解の実装基礎
Layer 1 — 直感・シミュレーター
「完全数チェック」に好きな数を入力して、その数の約数を全部足すといくつになるか確かめよう。1〜10000の範囲を「一括スキャン」すると、いくつの完全数が見つかるだろうか?さらに「友愛数ペア」ボタンで、互いに約数の和が相手と等しい不思議なペアを探してみよう。
好きな数を入力して完全数かチェック!
1〜10,000の中にある完全数はたった4つだけ!
オイラー公式: 2¹ × (2² - 1) = 2 × 3
約数の和: 1 + 2 + 3 = 6
オイラー公式: 2² × (2³ - 1) = 4 × 7
約数の和: 1 + 2 + 4 + 7 + 14 = 28
オイラー公式: 2⁴ × (2⁵ - 1) = 16 × 31
約数の和: 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 = 496
オイラー公式: 2⁶ × (2⁷ - 1) = 64 × 127
約数の和: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 = 8128
次のうち、完全数はどれですか?
Layer 2 — 定義・受験・証明
定義
**完全数(Perfect Number)**とは、自分自身を除く正の約数(真の約数)の総和が、その数自身に等しい自然数のこと。
例: の真の約数は → 和 ✓ 例: の真の約数は → 和 ✓
**友愛数(Amicable Numbers)**とは、2つの数 が「 の真の約数の和 」かつ「 の真の約数の和 」を満たすペアのこと。
例: と — 最も有名な友愛数ペア
公式・数理モデル
証明・導出
**なぜ と が完全数なのか(オイラーの公式による)**
のとき: ← は素数なので OK のとき: ← は素数なので OK のとき: ← は素数なので OK のとき: ← は素数なので OK
次は だが で合成数 → 完全数にならない 次の完全数 ( の場合)までジャンプする。
**友愛数 220 と 284 の確認** の真の約数: → 和 ✓ の真の約数: → 和 ✓
押さえておきたいポイント
- 完全数は現在48個しか見つかっていない(2024年時点)— 偶数の完全数はすべてメルセンヌ素数と対応する
- 奇数の完全数は1つも見つかっていない — 存在しない、または10^{1500}より大きいと推測されるが未証明
- 友愛数のペアは約1.2万組が知られているが、奇数同士の友愛数ペアは1組も見つかっていない
- 古代ピタゴラス教団は「220と284は友情の象徴」と信じていた — 中世では指輪や護符に刻まれた
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
GIMPSプロジェクト — 世界最大の分散コンピューティングによるメルセンヌ素数探索
完全数の発見はメルセンヌ素数の発見と同義。GIMPS(Great Internet Mersenne Prime Search)では世界中のボランティアPCを結集して素数を探索している。最新の最大素数(2^136279841 - 1、2024年発見)も完全数と対応する。約数の列挙は暗号解読・因数分解アルゴリズムの基礎技術でもある。
1// 完全数・友愛数の探索アルゴリズム(TypeScript)23/** 真の約数の和を返す(n自身を除く) */4function sumOfProperDivisors(n: number): number {5 if (n <= 1) return 0;6 let sum = 1; // 1は必ず約数7 const sqrtN = Math.sqrt(n);8 for (let i = 2; i <= sqrtN; i++) {9 if (n % i === 0) {10 sum += i;11 if (i !== n / i) sum += n / i;12 }13 }14 return sum;15}1617/** 完全数かどうか判定 */18function isPerfect(n: number): boolean {19 return n > 1 && sumOfProperDivisors(n) === n;20}2122/** 1〜limit の完全数を列挙 */23function findPerfectNumbers(limit: number): number[] {24 const perfects: number[] = [];25 for (let n = 2; n <= limit; n++) {26 if (isPerfect(n)) perfects.push(n);27 }28 return perfects;29}3031/** 1〜limit の友愛数ペアを列挙 */32function findAmicablePairs(limit: number): [number, number][] {33 const pairs: [number, number][] = [];34 for (let m = 2; m <= limit; m++) {35 const n = sumOfProperDivisors(m);36 // m < n かつ σ(n)-n = m を満たすかチェック37 if (n > m && n <= limit && sumOfProperDivisors(n) === m) {38 pairs.push([m, n]);39 }40 }41 return pairs;42}4344// 実行例45console.log("完全数(〜10000):", findPerfectNumbers(10000));46// → [6, 28, 496, 8128]4748console.log("友愛数ペア(〜10000):", findAmicablePairs(10000));49// → [[220, 284], [1184, 1210], [2620, 2924], [5020, 5564], [6232, 6368]]5051// オイラーの公式でメルセンヌ完全数を生成52function mersennePerfect(p: number): bigint {53 const mp = (2n ** BigInt(p)) - 1n;54 return (2n ** BigInt(p - 1)) * mp;55}5657// p=2,3,5,7,13...(メルセンヌ素数の指数)58[2, 3, 5, 7, 13, 17, 19, 31].forEach(p => {59 console.log(`p=${p}: 完全数 = ${mersennePerfect(p)}`);60});61// p=2: 662// p=3: 2863// p=5: 49664// p=7: 812865// p=13: 33550336
前提知識なしでここから始められます!
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元