LoginSignup
0
2

More than 1 year has passed since last update.

Python: ジェネレーターで素因数分解してみた

Last updated at Posted at 2022-08-17

こちらの記事で へえ素因数分解ってこんな風にやるんだ って勉強になったものの、途中から理解力/集中力が枯渇してきて早々に読むのをあきらめ、自分だったらどうするかな?という体で書いてみました。

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の倍数でもないもの に間引きし、試し割りする上限を素因数分解する数の平方根までと制限しました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2