素数一覧・判定ツール

指定した範囲内のすべての素数を一覧表示(エラトステネスの篩)、または1つの数が素数かどうかを瞬時に判定します。

1,052回閲覧

使い方

このツールは、それぞれ異なる問いに答える2つのアルゴリズムを切り替えて使用します。リストモードは、今でも日常的に使われている最古のアルゴリズムの一つであるエラトステネスの篩を用いて、指定した上限までのすべての素数を見つけます(紀元前3世紀のギリシャの数学者エラトステネスに由来するとされています)。2から始めて2のすべての倍数を合成数として消していき、次に消されていない数(3)に進んでその倍数を消し、次に消されていない数(5)に進む、という具合に続けます。上限の平方根に達した時点で消されずに残っている数がすべて素数です。小さな例:30まで篩にかける場合、まず2の倍数(4,6,8,…)を消し、次に3の倍数(6,9,12,…、一部はすでに消済み)を消し、次に5の倍数(10,15,…)を消します — 5×5=25 ≤ 30ですが7×7=49 > 30なので、そこで止められます。残るのは2, 3, 5, 7, 11, 13, 17, 19, 23, 29で、これが完全なリストです。この処理はO(n log log n)の計算量で動作するため、範囲が数十万に広がっても高速さを保ちます。

判定モードは別の問い — この特定の数は素数か? — に答えるもので、平方根までの試し割りを使います。nが素数かどうかを調べるには、2から√nまでの約数を確認すれば十分です。理由はこうです:もしn = a × bで、aとbの両方が√nより大きいとすると、a × bはnより大きくなってしまい、矛盾します。したがって2つの因数のうち少なくとも一方は√n以下でなければならず、ループが終わる前に見つかります。例:97を調べるには2, 3, 5, 7で割り切れるかを確認するだけで十分です(9²=81 ≤ 97ですが10²=100 > 97のため) — どれも割り切れないため、97は素数です。

知っておくべきこと

この2つのモードが存在するのは、それぞれトレードオフが異なるためです:篩は一度に多数の素数を生成するのに効率的ですが、巨大な上限付近の1つの数だけに関心がある場合はメモリと時間を無駄にします。試し割りは1回の判定には効率的ですが、大きな範囲のすべての数に対して1つずつ繰り返すには遅すぎます。用途に応じて適切な方を選べるようにするために、このツールは両方を提供しています。

  • 1は定義と慣習により素数から除外されています — 約数が2つではなく1つしかなく、もし素数に含めると素因数分解の一意性が崩れてしまうためです。
  • 2は唯一の偶数の素数です。それ以外のすべての偶数は2で割り切れるため合成数です。
  • 数が大きくなるにつれて素数は平均的に希少になっていきますが、決して現れなくなることはありません — ユークリッドは2000年以上前に、素数が無限に存在することを証明しました。

よくある質問

素数とは何ですか?

1より大きく、1とそれ自身という正確に2つの正の約数を持つ自然数です。1は約数が1つしかないため素数ではなく、負の数は素数にも合成数にも分類されません。

どれくらい広い範囲を一覧表示できますか?

最大1,000,000までです — この範囲内であればエラトステネスの篩は高速さを保ち(O(n log log n)の計算量は非常にゆっくりとしか増加しません)、ブラウザも快適に応答し続けます。

試し割りが平方根までしか確認しなくてよいのはなぜですか?

ある数nが√nより大きい約数を持つ場合、その約数は必ず√nより小さい約数と対になります(2つの積がnに等しいため)。したがって、どの因数のペアにも必ず平方根以下のメンバーが少なくとも1つ含まれます — それ以上先を確認するのは無駄です。

なぜリスト作成にも試し割りを使わないのですか?

使うこと自体は可能ですが、はるかに遅くなります:範囲内のすべての数を1つずつ、それぞれの平方根まで個別にテストするのは、篩が行う処理よりもはるかに多くの繰り返し作業を必要とします。篩は範囲全体にわたって、各素数の倍数を一度の効率的な処理で消していきます。

素数は無限に存在しますか?

はい — ユークリッドは紀元前300年頃に次のような証明を示しました:すべての素数からなる有限のリストがあると仮定し、それらをすべて掛け合わせて1を加えます。その結果はリスト中のどの素数でも割り切れないため、それ自体が新しい素数であるか、リストにない素因数を持つことになります。いずれの場合も、そのリストは不完全だったことになります。

コメント

まだコメントはありません — 最初のコメントを書いてみましょう!

関連ツール