Pythonで素因数分解を実装する方法【試し割り法を徹底解説】

 

素因数分解は、自然数を素数の積で表現する重要な数学的操作です。Pythonでの効率的な実装方法から高速化技法まで、実用的なコード例とともに詳しく解説します。

素因数分解とは

素因数分解とは、自然数nを素数の積として表現することです。例えば:

  • 12 = 2² × 3
  • 60 = 2² × 3 × 5

この記事では最も基本的な「試し割り法」を中心に実装方法を説明します。

基本的な素因数分解実装

最もシンプルな試し割り法の実装:

def prime_factors(n):
    factors = []
    d = 2
    while d * d <= n:
        while n % d == 0:
            factors.append(d)
            n //= d
        d += 1
    if n > 1:
        factors.append(n)
    return factors

# 使用例
print(prime_factors(60))   # [2, 2, 3, 5]
print(prime_factors(17))   # [17]
print(prime_factors(100))  # [2, 2, 5, 5]

辞書形式での素因数分解

指数も含めて返す実装:

def prime_factors_dict(n):
    factors = {}
    d = 2
    while d * d <= n:
        while n % d == 0:
            factors[d] = factors.get(d, 0) + 1
            n //= d
        d += 1
    if n > 1:
        factors[n] = 1
    return factors

# 使用例
print(prime_factors_dict(60))   # {2: 2, 3: 1, 5: 1}
print(prime_factors_dict(144))  # {2: 4, 3: 2}

高速化された実装

2と奇数のみをチェックする最適化版:

def fast_prime_factors(n):
    factors = []
    
    # 2で割り切れる間は2を追加
    while n % 2 == 0:
        factors.append(2)
        n //= 2
    
    # 3以上の奇数で試し割り
    d = 3
    while d * d <= n:
        while n % d == 0:
            factors.append(d)
            n //= d
        d += 2
    
    if n > 1:
        factors.append(n)
    
    return factors

# 使用例
print(fast_prime_factors(315))  # [3, 3, 5, 7]

より効率的な実装(mathモジュール使用)

import math

def optimized_prime_factors(n):
    factors = []
    
    # 2の処理
    while n % 2 == 0:
        factors.append(2)
        n //= 2
    
    # 奇数のみチェック
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        while n % i == 0:
            factors.append(i)
            n //= i
    
    if n > 2:
        factors.append(n)
    
    return factors

実用的な活用例

最大公約数(GCD)の計算

def gcd_by_factors(a, b):
    factors_a = prime_factors_dict(a)
    factors_b = prime_factors_dict(b)
    
    gcd = 1
    for prime in factors_a:
        if prime in factors_b:
            gcd *= prime ** min(factors_a[prime], factors_b[prime])
    
    return gcd

print(gcd_by_factors(48, 18))  # 6

完全数の判定

def is_perfect_number(n):
    factors = prime_factors_dict(n)
    divisor_sum = 1
    
    for prime, count in factors.items():
        divisor_sum *= (prime ** (count + 1) - 1) // (prime - 1)
    
    return divisor_sum - n == n

print(is_perfect_number(28))  # True

複数の数の素因数分解

def batch_prime_factors(numbers):
    return {num: prime_factors(num) for num in numbers}

numbers = [12, 15, 18, 20]
result = batch_prime_factors(numbers)
for num, factors in result.items():
    print(f"{num}: {factors}")

パフォーマンス比較

大きな数での処理時間を測定:

import time

def time_factorization(func, n):
    start = time.time()
    result = func(n)
    end = time.time()
    return result, end - start

# 比較例
n = 1000003  # 大きな素数
basic_result, basic_time = time_factorization(prime_factors, n)
fast_result, fast_time = time_factorization(fast_prime_factors, n)

print(f"基本実装: {basic_time:.4f}秒")
print(f"高速実装: {fast_time:.4f}秒")

まとめ

素因数分解は数論の基礎となる重要なアルゴリズムです。試し割り法の基本実装から最適化技法まで理解することで、暗号化アルゴリズムや数学的計算での応用が可能になります。

大きな数を扱う場合は、より高度なアルゴリズム(ポラード・ロー法など)の検討も必要ですが、多くの実用場面では今回紹介した手法で十分対応できます。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座