こちらの記事で へえ素因数分解ってこんな風にやるんだ って勉強になったものの、途中から理解力/集中力が枯渇してきて早々に読むのをあきらめ、自分だったらどうするかな?という体で書いてみました。
from math import sqrt
# 素数の候補を返すジェネレーター
def primables():
yield 2
yield 3
n = 5
while True:
yield n
n += 2
yield n
n += 4
# 素因数分解し、基数と乗数のペアを返すジェネレーター
def factors(n):
limit = sqrt(n)
base_gen = primables()
while n != 1 :
base = next(base_gen)
exponent = 0
while n % base == 0 :
exponent += 1
n //= base
if exponent != 0 :
yield ( base, exponent )
if base > limit :
yield ( n, 1 )
return
return
# 使用例:
def print_factors(n):
print( f'{n} ='
, ' * '.join( f'{b}^{e}'
for (b, e)
in factors(n)
)
)
print_factors(1234567890)
# 出力:
1234567890 = 2^1 * 3^2 * 5^1 * 3607^1 * 3803^1
素朴に試し割りですがちょっと手を加えています。
試し割りする数を2の倍数でも3の倍数でもないもの に間引きし、試し割りする上限を素因数分解する数の平方根までと制限しました。