Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonプログラム:数の一意な素因数の積を求める方法

はじめに

本記事では、次の問題に対する解き方を学びます。

問題文: 整数 n が与えられたとき、その数が持つ一意な(重複しない)素因数をすべて求め、それらの積を返します。

例:

入力:num = 11
出力:積は 11
説明:
入力された数は 11 で、素因数は 11 のみです。
したがって、その積も 11 となります。

アプローチ1:総当たり法(ブルートフォース)

i = 2 から n+1 までの for ループを使い、i が n の約数であるかどうかを確認します。約数であれば、さらに i 自身が素数かどうかを判定し、素数なら積に掛け合わせます。この処理を i が n に達するまで繰り返します。

実装例

def productPrimeFactors(n):
    product = 1
    for i in range(2, n + 1):
        if n % i == 0:
            isPrime = 1
            for j in range(2, int(i / 2) + 1):
                if i % j == 0:
                    isPrime = 0
                    break
            if isPrime:
                product = product * i
    return product

# main
n = 18
print(productPrimeFactors(n))

出力

6

18 の場合、一意な素因数は 2 と 3 なので、積は 2 × 3 = 6 となります。この方法はロジックがシンプルで理解しやすい反面、各約数ごとに素数判定を行うため、n が大きくなると計算量が増加し、非効率になるという欠点があります。

アプローチ2:効率的な素因数分解

計算量を抑えるために、以下の手順で素因数分解を行います。

  • n が 2 で割り切れる間(偶数の間)、2 を積に掛け、n を 2 で割り続けます。
  • ステップ1の後、n は必ず奇数になります。そこで i = 3 から √n までの範囲で for ループを回します。i が n を割り切れる間、i を積に掛けて n を i で割ります。割り切れなくなったら i を 2 ずつ増やして処理を続けます。
  • n が 2 より大きい素数である場合、上記の2ステップだけでは n は 1 になりません。そのため、最後に n が 2 より大きければ n 自身を積に掛けます。

実装例

import math

def productPrimeFactors(n):
    product = 1
    # 素因数 2 を処理
    if n % 2 == 0:
        product *= 2
        while n % 2 == 0:
            n = n // 2
    # ここで n は必ず奇数になっている
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        # i が n を割り切る間、i を積に掛けて n を割る
        if n % i == 0:
            product = product * i
            while n % i == 0:
                n = n // i
    # n が 2 より大きい素数の場合
    if n > 2:
        product = product * n
    return product

# main
n = 8
print(int(productPrimeFactors(n)))

出力

2

8 の場合、一意な素因数は 2 のみなので、積は 2 となります。この方法では試し割りの範囲を √n までに限定できるため、計算量は O(√n) 程度に抑えられ、総当たり法と比べて大幅に高速です。

まとめ

本記事では、与えられた整数の一意な素因数の積を求める2つの方法——シンプルな総当たり法と、√n まで試し割りを行う効率的な手法——を紹介しました。小さな数であれば前者でも十分ですが、大きな数を扱う場合は後者の効率的なアプローチを選ぶことをおすすめします。

  1. n番目のフィボナッチ数を求めるPythonプログラム【再帰・動的計画法】

    本記事では、n番目のフィボナッチ数を計算するPythonプログラムについて解説します。フィボナッチ数とは?フィボナッチ数とは、次の漸化式で定義される数列のことです。Fn = Fn-1 + Fn-2ただし、初期値は F0 = 0、F1 = 1 とします。フィボナッチ数列の最初のいくつかの値は以下の通りです。0, 1, 1, 2, 3, 5, 8, 13, ..................フィボナッチ数は、再帰と動的計画法(Dynamic Programming)という2つの代表的な手法で求めることができます。それでは、それぞれの実装方法をPythonスクリプトで見ていきましょう。方法1:再帰

  2. Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法

    本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法