定義
自然数は1で割り切れる任意の自然数とすると、独自に加えて、できない場合は、この数は素数(も知られている素数)と呼ばれています。
自然数の集合、小さい素数の分布、疎を通して、十分に大きな自然数Nの場合、Nは素数ではないN / LNN番号、すなわちLNN当たり数約素数約以上です。
素数の決意
トライアル部門
正の整数は合成数である場合は、割り切れる数は2 $ \当量$ T $ \ N Tであり当量$ N. それはそれの少しを証明しました。
上記の命題によると、我々は唯一のすべての整数の間で2〜$ \ sqrtの{N} $をスキャンする必要があり、Nは、順次、彼らができるかどうかをチェックすることにより割り切れる、割り切れない場合は、その後、Nは素数である、または合成数。時間計算量はO($ \ SQRT {N}です $)。
void primes(int n)
{
memset(v,0,sizeof(v));
for(int i=2;i<=n;i++)
{
if(v[i]) continue;
cout<<i<<endl;
for (int j = i; j < n/i; j++)
v[i*j]=1;
}
}
あり、ミラー・ロビンの決意方法は、確率的アルゴリズムは、より効率的である、私は学校に行きますよ。
素数のスクリーニング
ここでは素数のためのスクリーニングのいくつかの方法があります。
エラトステネス筛法
任意の整数xの倍数は、確かに素数ではありません。
我々は、それぞれ、この数、マークは合成数である数をスキャンするときに、それが標識されていない場合、それは2〜N-1であることができない複数のスキャンの多数に小さなスキャン、2から開始することができます割り切れる、それが素数です。
ありますので、我々は$からのx ^ 2 $が倍数の始まりをマークし、最適化することができ、より少ない$以上のx ^ 2 $の数が少ない数の上にマークされています。
void primes(int n)
{
memset(v,0,sizeof(v));
for(int i=2;i<=n;i++)
{
if(v[i]) continue;
cout<<i<<endl;
for (int j = i; j < n/i; j++)
v[i*j]=1;
}
}
エッペンドルフふるい時間複雑性はO(NloglogN)です。
リニアふるいです
リニアふるい法をエッペンドルフふるいふるいよりも良い方法です。それは「を通してである小大きい素因数に蓄積マーキングの数は、さらに一緒に圧縮されたように、各合成数の」は、標識され、効率を向上させます。アレイあたりVは、記録品質係数の最小数は、以下の手順メンテナンスvを設けました。
- 順次2〜Nの間の各番号iを考慮
- V [i]は=私、私が説明した素数である場合は、それを保存します。
- スキャンは、[i]は各素数pに対して、そのためV [私は$ \ $回のpのVより大きくない ] = P。すなわち品質係数pは再Iに基づいて計上します。p個の$ \の当量の$のVので[I ]、 それは最小の素因数P複合数pする$ \回$ Iさんです。
Oの時間複雑度(N)。
void primes(int n)
{
memset(v,0,sizeof(v)); //最小质因子
m=0; //质数数量
for (int i = 2; i <= n; i++)
{
if (v[i]==0)
{
v[i]=i;
prime[++m]=i; //i是质数
}
for (int j = 0; j <= m; j++)
{
if(prime[j]>v[i]||prime[j]>n/i) break; //质数的范围不能超出v[i]和n
v[i*prime[j]]=prime[j];
}
}
}
の素因数分解
算術の基本定理
1より大きい任意の正の整数は、製品がユニークな素数の有限数に分解することができ、のように書くことができます。
N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}
そのうち$ C_I $は正の整数で、$ P_I $が素数である、を満たします:
p_1<p_2<...<p_m
トライアル部門
このアプローチは、素数「試行除算」との決意組み合わせ「エッペンドルフふるい」を
乗算および除算が除去さDの累積数が、因子Dの全てから削除N、N、とすることができる場合は、2〜$ \ SQRT {N} $をD、Dの各整数をスキャンします。
各因子は、この因子をスキャンするのは初めてであるので、時間計算量はO(N)であるので、完全に除去されました。
void divide(int n)
{
m=0;
for (int i = 2; i <= sqrt(n); i++)
{
if (n%i==0) //这里i一定是质数,因为后面搜到合数时,早已被前面的质数除掉了
{
p[++m]=i,c[m]=0;
while(n%i==0)
{
n/=i;
c[m]++;
}
}
}
if (n>1) //n是质数
{
p[++m]=n;
c[m]=1;
}
}
「もありポラードのRhoの」アルゴリズム、競争部門と効率的に。