フェルマー数 が素数でないことを示すには、 法と試し割り法ではどちらが早いか。
- 法
n = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137217 非自明な約数: 6487031809 実行時間: 0.015044 秒
- 試し割り法
n = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137217 最も小さな素因数: 45592577 実行時間: 4.262128 秒
圧倒的に 法が早い。これはどういうことなのだろう。
法とは
適当な を与えて
を計算する。
のとき、 の非自明な約数を得る。
計算例
に対して次のように をとると
となった。ここで は素数であり、
と素因数分解される。
疑問
なぜ を適当にとって のように素因数が現れるのだろうか。
考察
速度比較のとき、最初から を与えてしまっていた。 は探索しなければならないパラメータである。そこで をパラメータ化して計測した結果:
| a = 3 | b = 4100 | d = 6487031809 成功 実行時間: 3.109131 秒
a は小さい範囲 を動き、 は が までの素因数を含むことを許容した。
def find_factor(): isSuccess = False for a in range(2, 10): for b in range(10, 5000, 10): d = p_minus_1(n, a, b) # 判定 if 1 < d < n: print(f'| a = {a} | b = {b} | d = {d} 成功') isSuccess = True break elif d == 1: # b を大きくする必要あり print(f'| a = {a} | b = {b} | d = 1 失敗') elif d == n: # これ以上 b を大きくしても無駄なので a をインクリメントする必要あり print(f'| a = {a} | b = {b} | d = n 失敗') break else: continue if isSuccess: break
試し割り法より早かった。
いろいろな整数で速度比較
比較的小さな数
- 法
n = 8226679 | a = 2 | b = 10 | d = 26797 成功 実行時間: 0.000306 秒
※ は合成数。
- 試し割り法
n = 8226679 最も小さな素因数: 127 実行時間: 0.000010 秒
比較的大きな数
両者ともに 10 秒以内に終わらない。