解答例_3_12

解答例:練習問題_3_12(素因数分解 試し割り法)

def trial_div(n):
    """素因数分解
    
    引数 n: 2以上の整数
    戻り値  nの素因数list
    """
    if (isinstance(n, int) and n > 1):
        results = []
        x_start = 2
        while True:
            for x in range(x_start, int(n**0.5) + 1):
                if n%x == 0:
                    results.append(x)
                    n, x_start = n//x, x
                    break  # for文のbreak
            else: # 割り切れない素数が残った場合
                results.append(n)
                break  # while文のbreak
        return results
    
    else: # 引数nが2以上の整数ではない
        print('引数には2以上の整数を使用してください')
        return None

trial_div(12546)

[2, 3, 3, 17, 41]

この関数の結果の確認も大きい数字の場合は難しいと思われますが、前問の素数と同様に簡単に判定できる数字で確認するしかないかと思います。また、極端なケースとして trial_div(2)で [2] 、trial_div(128)で [2, 2, 2, 2, 2, 2, 2] なども確認して下さい。

この問題では以下の様に2つのケースを考える必要があります。

内側のforループのシーケンス range(x_start, int(n**0.5) + 1) を考える場合、
左側の最後の判定では、range(5, 12)の範囲で139を割り切れるかどうかの判定を行います。一方右側の最後の判定では、問題文でも述べた通り、range(17, 12)という値が入ることになりますので、この時にelseの処理文が実行されるのかどうかを予め確認しておく必要があります。
まず range(start, stop), start > stop の中身をlist化して確認してみます。

list(range(20,10))

[]

start > stop の時のrangeの中身は上記の様に [] の状態となります。それではこの状態で for if break else の elseが実行されるかどうかも確認してみます。

for i in range(20,10):
    if True:
        print('NG')
        break
else:
    print('OK')

OK

この様にrange(20,10)の場合は、forの処理文は一度も実行されずに elseの実行文が実行されていることが分かります。従って上記右側のケースでも意図した通りにコードが実行されていると確認することができます。

タイトルとURLをコピーしました