Keito

© 2024 Keito

技術ブログとポートフォリオ

最大公約数(ユークリッドの互除法)

紀元前300年から続く古典的なアルゴリズムで二つの整数の最大公約数を効率的に求めよう

O(log n)
時間計算量
O(1)
空間計算量
中級
難易度
紀元前300年
歴史

🔢 入力設定

計算対象:
gcd(48, 18)
アルゴリズム:
ユークリッドの互除法
📐 原理: gcd(a, b) = gcd(b, a mod b)

📚 推奨入力例

🧮

最大公約数を計算してください

左側の入力パネルから数値を設定し、「GCD計算実行」ボタンを押してください

💻 実装例(JavaScript)

// ユークリッドの互除法による最大公約数の計算
function gcd(a, b) {
    // 特殊ケース: 片方が0の場合
    if (b === 0) {
        return a;
    }
    
    // 負数の場合は絶対値を取る
    a = Math.abs(a);
    b = Math.abs(b);
    
    // より大きい数を最初に配置
    if (a < b) {
        [a, b] = [b, a];
    }
    
    // ユークリッドの互除法の実行
    while (b !== 0) {
        const remainder = a % b;
        console.log(`${a} ÷ ${b} = ${Math.floor(a / b)} あまり ${remainder}`);
        
        // gcd(a, b) = gcd(b, a % b)
        a = b;
        b = remainder;
    }
    
    return a;
}

// 再帰版の実装
function gcdRecursive(a, b) {
    // ベースケース
    if (b === 0) {
        return a;
    }
    
    // 再帰的に呼び出し
    return gcdRecursive(b, a % b);
}

// 最小公倍数(LCM)も計算可能
function lcm(a, b) {
    return Math.abs(a * b) / gcd(a, b);
}

// 使用例
console.log(gcd(48, 18));        // 6
console.log(gcd(17, 13));        // 1 (互いに素)
console.log(gcd(100, 25));       // 25
console.log(gcdRecursive(1071, 462)); // 21

// 最小公倍数の例
console.log(lcm(12, 8));         // 24

// 複数の数の最大公約数
function gcdMultiple(...numbers) {
    return numbers.reduce((acc, num) => gcd(acc, num));
}

console.log(gcdMultiple(12, 18, 24)); // 6

🎯 アルゴリズムの特徴

歴史的価値

  • • 紀元前300年頃に考案された最古のアルゴリズム
  • • ユークリッド「原論」第7巻に記載
  • • 2000年以上経った現在も最効率の手法
  • • 数学の基礎を築いた重要な発見

現代での応用

  • • RSA暗号の鍵生成アルゴリズム
  • • 分数の約分・通分計算
  • • コンピュータグラフィックスの比率計算
  • • 音楽理論での和音周期の分析

💡 学習ポイント: 古典的なアルゴリズムでありながら、現代のコンピュータサイエンスや暗号学でも重要な役割を果たしています。 効率的な問題解決の思考法を学ぶ絶好の例です。