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 ではなく、実際には重複を含めた計算結果が出力されます。変数のスコープは下の画像の通りです。

アプローチ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 となります。変数のスコープは下の画像の通りです。

まとめ
この記事では、与えられた数値の一意な素因数の積を求める方法として、シンプルな総当たり法と、平方根まで探索することで計算量を抑えた効率的なアプローチの2つを紹介しました。小さな数値であればアプローチ1でも十分ですが、大きな数値を扱う場合はアプローチ2のような効率的な素因数分解の手法を選ぶことで、パフォーマンスを大幅に向上させることができます。
-
【Python】ある数の最大の素因数を求めるプログラムの書き方
この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def
-
Pythonプログラム:数の一意な素因数の積を求める方法
はじめに 本記事では、次の問題に対する解き方を学びます。 問題文: 整数 n が与えられたとき、その数が持つ一意な(重複しない)素因数をすべて求め、それらの積を返します。 例: 入力:num = 11 出力:積は 11 説明: 入力された数は 11 で、素因数は 11 のみです。 したがって、その積も 11 となります。 アプローチ1:総当たり法(ブルートフォース) i = 2 から n+1 までの for ループを使い、i が n の約数であるかどうかを確認します。約数であれば、さらに i 自身が素数かどうかを判定し、素数なら積に掛け合わせます。この処理を i が n に達するまで繰り返しま