田中太郎
Python で素因数分解する関数を作成しました。
サンプルコード
def detect_prime_number(num):
"""num が素数かどうかを判定する関数"""
num_max = int(num**(1/2))+1 # 計算量を減らすため、平方根を取る。
check = True
for tmp in range(2, num_max): # 2からnum_maxまでtmp が足される。
if num%tmp == 0: # tmp で割り切れたら素数ではない。
check = False
break
return num, check
def factorization(num, num_list):
"""num をnum_listで因数分解する。"""
result = []
for element in num_list:
while True: # 1つの素数で割れるだけ割る。
if num % element == 0:
result += [element]
num = num / element
else:
break
return result
def prime_number_factorization(input_num):
"""."""
result = []
for i in range(2, input_num):
num, check = detect_prime_number(i)
if check:
result += [num]
print(input_num)
print(result)
return factorization(input_num, result)
if __name__ == "__main__":
print(prime_number_factorization(100))
解説
def prime_number_factorization(input_num):
1入力、1出力
入力:int(素因数分解したい数字)
出力:list(素因数分解された数字のリスト)
制約:2以上の数字を引数にする
def detect_prime_number(num):
1入力、2出力
入力:int(素数を判定したい数字)
出力:int(入力した数字), Bool(素数ならTrue、素数でないならFalse)
制約:2以上の数字を入れる。
def factorization(num, num_list):
2入力、1出力
入力:int(素因数分解したい数字)、List(素数のリスト)
出力:List(因数分解に使用した数字のリスト)
制約:numは2以上の数字にする。num_listは素数のリスト。
出力
100
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
[2, 2, 5, 5]
蛇足
平方根の計算で、num**(1/2) を使っていますが、標準モジュールのmath には、math.sqrt()という平方根を求める関数があります。
計算速度が少しだけ違います。お好みでお使いください。
コメント