線性篩
std::vector<bool> isPrime(maxValue + 1, true);
std::vector<int> primes;
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i <= maxValue; ++i) {
if (isPrime[i]) primes.push_back(i);
for (int p : primes) {
if (i * p > maxValue) break;
isPrime[i * p] = false;
if (i % p == 0) break;
}
}| 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
std::vector<bool> isPrime(maxValue + 1, true);
std::vector<int> primes;質數們
假設最大值是 10
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
顯然 0 和 1 不是質數
| 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
isPrime[0] = false;
isPrime[1] = false;| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
for (int i = 2; i <= maxValue; ++i)| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
for (int i = 2; i <= maxValue; ++i)if (isPrime[i]) primes.push_back(i);| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
for (int i = 2; i <= maxValue; ++i)for (int p : primes)p
| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
for (int i = 2; i <= maxValue; ++i)for (int p : primes)p
if (i * p > maxValue) break;| 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
for (int i = 2; i <= maxValue; ++i)for (int p : primes)p
isPrime[i * p] = false;| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
for (int i = 2; i <= maxValue; ++i)for (int p : primes)p
if (i % p == 0) break;| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
for (int i = 2; i <= maxValue; ++i)if (isPrime[i]) primes.push_back(i);是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 2 |
| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
| 2 | 3 |
for (int i = 2; i <= maxValue; ++i)for (int p : primes)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
| 2 | 3 |
p
for (int i = 2; i <= maxValue; ++i)if (i * p > maxValue) break;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
| 2 | 3 |
p
for (int p : primes)for (int i = 2; i <= maxValue; ++i)isPrime[i * p] = false;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
| 2 | 3 |
p
for (int p : primes)| 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | 是 |
for (int i = 2; i <= maxValue; ++i)if (i % p == 0) break;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
| 2 | 3 |
p
for (int p : primes)for (int i = 2; i <= maxValue; ++i)if (i * p > maxValue) break;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
| 2 | 3 |
p
for (int p : primes)for (int i = 2; i <= maxValue; ++i)isPrime[i * p] = false;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
p
for (int p : primes)| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
for (int i = 2; i <= maxValue; ++i)if (i % p == 0) break;是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
p
for (int p : primes)for (int i = 2; i <= maxValue; ++i)if (isPrime[i]) primes.push_back(i);是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
for (int i = 2; i <= maxValue; ++i)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
for (int p : primes)p
for (int i = 2; i <= maxValue; ++i)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
if (i * p > maxValue) break;for (int p : primes)p
for (int i = 2; i <= maxValue; ++i)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 否 |
| 2 | 3 |
for (int p : primes)p
isPrime[i * p] = false;| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 否 | 否 |
for (int i = 2; i <= maxValue; ++i)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 否 | 否 |
| 2 | 3 |
for (int p : primes)p
if (i % p == 0) break;我們先不管這個條件,繼續跑 p
for (int i = 2; i <= maxValue; ++i)是質數嗎?
質數們
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
i
| 否 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 否 | 否 |
| 2 | 3 |
for (int p : primes)p
此時將會篩掉 12
但這真的是必要的嗎?
之後 i 跑到 6,p 跑到 2 的時候也會篩掉 12
此時將會篩掉 12
但這真的是必要的嗎?
之後 i 跑到 6,p 跑到 2 的時候也會篩掉 12
同理,i 跑到 6 時 p 也不用跑到 3
因為 18 會被 i = 9、p = 2 時篩掉
數學一點
當 p 是 i 的因數時
我們可以假設 i = p × k
這時候如果有另一個更大的質數 q
q × i = q × p × k = p × (q × k)
這之後一定會被另一個 i = q × k 由 p 篩掉
所以對於現在的 i 已經不用管 q 或者任何更大的質數了
線性篩
By 晴☆
線性篩
- 88