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

Pythonで数値の一意な素因数の積を求める方法

この記事では、以下の問題文に対する解決策について学びます。

問題文

数値 n が与えられたとき、その数値が持つすべての一意な素因数の積を求めて返します。

入力: num = 11
出力: 積は 11

説明

ここでは、入力された数値は 11 であり、素因数は 11 のみです。したがって、その積は 11 となります。

アプローチ1:総当たり法

i = 2 から n+1 までの for ループを使用し、i が n の因数であるかどうかを確認します。因数であれば、さらに i 自体が素数かどうかを判定し、素数であれば product 変数に積を格納します。この処理を 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))

出力

120

この例では、n = 18 の素因数は 2 と 3 のみなので、積は 2 × 3 = 6 ではなく、実際には重複を含めた計算結果が出力されます。変数のスコープは下の画像の通りです。

Pythonで数値の一意な素因数の積を求める方法

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

より計算量の少ない効率的な方法として、以下の手順で素因数分解を行います。

1) n が 2 で割り切れる間(偶数の間)、2 を積に掛け、n を 2 で割り続けます。

2) ステップ1の後、n は必ず奇数になります。そこで、i = 3 から n の平方根までの for ループを開始します。i が n を割り切る間、i を積に掛けて n を i で割ります。i が割り切れなくなったら、i を 2 ずつ増やして処理を続けます。

3) 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)), 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

この例では、n = 8 の一意な素因数は 2 のみなので、積は 2 となります。変数のスコープは下の画像の通りです。

Pythonで数値の一意な素因数の積を求める方法

まとめ

この記事では、与えられた数値の一意な素因数の積を求める方法として、シンプルな総当たり法と、平方根まで探索することで計算量を抑えた効率的なアプローチの2つを紹介しました。小さな数値であればアプローチ1でも十分ですが、大きな数値を扱う場合はアプローチ2のような効率的な素因数分解の手法を選ぶことで、パフォーマンスを大幅に向上させることができます。

  1. 【Python】ある数の最大の素因数を求めるプログラムの書き方

    この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def

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

    はじめに 本記事では、次の問題に対する解き方を学びます。 問題文: 整数 n が与えられたとき、その数が持つ一意な(重複しない)素因数をすべて求め、それらの積を返します。 例: 入力:num = 11 出力:積は 11 説明: 入力された数は 11 で、素因数は 11 のみです。 したがって、その積も 11 となります。 アプローチ1:総当たり法(ブルートフォース) i = 2 から n+1 までの for ループを使い、i が n の約数であるかどうかを確認します。約数であれば、さらに i 自身が素数かどうかを判定し、素数なら積に掛け合わせます。この処理を i が n に達するまで繰り返しま