数が素数かどうかをチェックするアルゴリズムの時間の複雑さはどれくらいですか?
これはアルゴリズムです:
bool isPrime (int number) {
if (number < 2) return false;
if (number == 2) return true;
if (number % 2 == 0) return false;
for (int i=3; (i*i) <= number; i+=2) {
if (number % i == 0 ) return false;
}
return true;
}
O(sqrt(n))は数値の絶対値で、ただしint
を使用している場合のみ
素数に関連するアルゴリズムの複雑さは、nを数値のlength(ビット単位)として説明することが多く、比較のようなことは想定できないことに注意してください。 、加算、モジュレータ、または乗算でO(1)になります。これは、任意精度の数値では、これらの演算は数値のサイズに応じてコストが高くなるためです。
現在最もよく知られているアルゴリズム はO((log n)^ 6)で実行されます
最悪の場合-数値が素数の場合-は明らかですO(sqrt(n))数値が2、3、5、7、9で除算できる場合に最良のケースが発生します。これらの場合有限数のステップでループをすぐに終了します-O(1)
次に、アルゴの完全平均ケースを計算します。
区間[0、n]には、約n/ln(n)個の素数があります。
アルゴはP1 = 1/ln(n)の確率で素数をヒットします
P2 = 1-ln(n)の確率を持つ他の数値
平均的なケースはO(sqrt(n))* 1/ln(n)+ O(1)*(1-ln(n))です。小さい部分を削除します
=O(sqrt(n))/ln(n)
ln(n)をO()内に移動
=O(sqrt(n)/ln(n))
対数の底はbig-O表記には関係ありません
= O(sqrt(n)/log(n))
このアルゴリズムの最大実行時間はO(sqrt(n))です。これは、nが素数または2つの大きな素数の積である場合に達成されます。
平均実行時間は注意が必要です。私はO(sqrt(n)/ log n)のようなものを言います。なぜなら、大きな素因数だけの数はそれほど多くないからです。