線性篩

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