最も一般的ではない非除数はN log Cと同じくらい大きくなる可能性がありますが、N個の数値がランダムに分布している場合、最も一般的でない非除数はおそらくNよりもはるかに小さく、おそらくNよりもはるかに小さくなります。素数は、その数の約数です。
各素数pについて、インデックスがありますこれは、そのインデックスまでのすべての数がpによる可分性について調べられたことを意味し、除算可能であったそれらすべての数のリストを持っています。kp
次に、d = 2、3、4、...の場合、dで割り切れる数値を見つけるか、何もないことを示します。dの最大素因数pをとります。次に、pで割り切れるすべての数値を、dでも割り切れるのかどうかをチェックします。何も見つからない場合は、p > で割り切れるインデックス>数値をさらにチェックし、とpで割り切れる数のリストを更新して、各数がdで割り切れるかどうかをチェックします。kpkp
pで割り切れる数があるかどうかをチェックするために、平均p数をチェックします。後で2pで割り切れる数があるかどうかを確認すると、50%の確率で1つの数(pで割り切れる数)だけをチェックする必要があり、50%の確率で平均2p以上の数をチェックします。3pで割り切れる数を見つけるのは非常に高速であり、以下同様です。Nの数しかないため、pで割り切れる数についてNを超える数をチェックすることはありません。
これが約分割可能性チェックでうまくいくことを願っています。N2/logN
PS。乱数の結果はどのくらい大きいでしょうか?
N個の乱数があるとします。N個の数値の1つがdで割り切れる確率は1-(1-1 / d)^ Nです。1≤d≤kの各数値が乱数の1の因数である確率は、これらの確率を乗算することで計算されると想定します(Ok、これらの確率はおそらく完全に独立しているわけではないため、少し危険です)。
その仮定では、N = 1000の場合、1..244の数値のいずれかが数値を除算しない可能性が50%あり、10億分の1が507までのすべての数値がいずれかの数値を除算する可能性があります。N = 10,000の場合、50%の確率で、1..1726の数値のいずれかが任意の数値を除算せず、10億分の1が2979までのすべての数値がいずれかの数値を除算する可能性があります。
N個のランダム入力の場合、結果のサイズはN / ln Nよりも少し大きいと思います。N / ln N *(ln ln N)^ 2のようなものかもしれません。理由は次のとおりです。
N個の乱数のうち少なくとも1つが乱数dで割り切れる確率はです。dがN前後の場合、(1-1は約1-exp(-1)≈0.6321です。それは単一の除数です。いくつかの数値d≈NのそれぞれがN個の数値の少なくとも1つの約数である可能性は非常に小さいため、最大のdはNよりも大幅に小さくなります。1−(1−1/d)N1−(1−1/d)N
d << Nの場合、です。1−(1−1/d)N≈1−exp(−N/d)
d≈N / ln Nの場合、です。1−exp(−N/d)≈1−exp(−lnN)=1−1/N
約N / ln Nの値dに対してこれらの確率を追加しますが、ほとんどのdでは結果が大幅に大きくなるため、最大のdはN / ln Nよりもある程度大きくなりますが、Nよりも大幅に小さくなります。
PS。dで割り切れる数を見つける:
dの最大の素因数pを選び、次に、pで割り切れることがすでにわかっている数を最初に調べます。d = kpと言います。次に、この特定のdをチェックしながら、平均してpで割り切れるkの数だけをチェックし、pで割り切れるすべてのdについて、全体でpで割り切れるかどうか、最大N個の値をチェックします。実際には、ほとんどの素数pについてN未満の値をチェックする可能性が高いです。これは、すべてのN値をチェックした後、アルゴリズムが終了する可能性が最も高いためです。したがって、結果がRの場合、N未満の値がR未満の各素数で除算されることを期待します。R≤Nと仮定すると、これは約N ^ 2 / log Nチェックです。
PS。いくつかのテストを実行する
N = 1,000,000の乱数> 0でこのアルゴリズムを数回実行しました。最も一般的でない非除数は68,000〜128,000で、実行の大部分は100,000〜120,000でした。分割数は5億2千万から1億8千万で、(N / ln N)^ 2よりもはるかに少ないです。大多数のケースでは、1億から1億5000万の部門が使用されました。