质数表线性时间筛法
樸素的篩法在時間上的額外開銷主要是因為同一個數會被篩掉好幾次,所以線性篩法要做的就是利用數學方法保證每個和數只被篩掉一次。
?
原理:
每一個和數都可以分解成一個質數乘一個整數的形式,樸素篩法正是通過這樣的策略去篩,但是這個條件很粗略,導致和數分解的方式不唯一。
在線性篩法中,和數(n)被分解成“n的最小質因數(p)* n的最大因數(a)”,(a可以=p);其中p為最小質因數時,a必然為最大因數,反過來也一樣。
p與a的約束條件如下
1)a>=p;如果a>p那么a顯然不是這個數的最大因數,所以a>=2
2)設最大因數(a)有最小質因數(m),則m>=p;
這確保了p是該和數(n)的最小質因數,p>m說明m是n更小的質因數,和p是最小質因數的假設矛盾;同時,也保證了a是n的最大因數
?
條件2)保證了和數能被分解成唯一形式,因此:對任意給定的一個整數a(a>=2),a與所有比其最小質因數(m)小的質數(p)相乘得到的n便是所有以a為最大因數的n。反之給出最小質數p也能按照這個條件得知a知否滿足條件。
?
所以在線性篩法中要一邊制作質數表,一邊篩掉a與表內p的積。
?
代碼出自演算法筆記,感謝這位臺灣的朋友整理分享
const int N = 20000000; bool sieve[N];void eratosthenes() {vector<int> prime;for (int i=2; i<N; i++) //i為最大因數{if (!sieve[i]) prime.push_back(i);for (int j=0; i*prime[j]<N; j++){sieve[i*prime[j]] = true;if (i % prime[j] == 0) break;}} }轉載于:https://www.cnblogs.com/zhen94/p/3560331.html
總結
- 上一篇: HDU 1754 I Hate It(线
- 下一篇: toString() 和 强制类型转换