素數篩法(埃氏篩,線性篩)

2021-10-21 12:26:18 字數 655 閱讀 7310

時間複雜度o(nloglogn)

void

prime

(int b)

//prime[i]==1則是合數

}

原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。

但很明顯,這樣做會有重複。比如12==3*4==2*6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會被標記。

接下來介紹的線性篩就解決了這個問題。

時間複雜度o(n)

void prime[

1000001];

void numlist[

100000001];

void

prime

(int n)

}}

解釋1:i*prime[j]這個數的最小質因數就是i的最小質因數(prime[j]的最小質因數就是本身,所以乘積的最小質因數取決於另乙個數i)

解釋2:i能用prime[j]表示,則i*prime[j+1,2,3,4…]的最小質因數就不是prime[j+1,2,3,4…]而是prime[j]了。至於這些沒有在這裡篩掉的數,可以表示為prime[j]*m(m>i),在後面外迴圈列舉到m的時候會篩去。

埃氏篩法 素數篩

埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...

素數篩 埃氏篩 線性篩 區間篩)

顧名思義,素數篩就是用來篩素數的。1.埃氏篩 o nloglogn 對於一般 不毒瘤 的素數題,埃氏篩就夠了 原理 任何合數都有小於自身的質因數 內容 對於每乙個素數將它的 2 i x i i全部標記為1,使得所有的合數全被標記 不足 合數會被標記素因數次,不夠高效 void prime int x...

埃氏篩法和線性篩法求素數

演算法中有一類題,題目中涉及到大量素數的判定,只要範圍確定,素數的個數和素數就已經是固定不變的,那麼我們可以考慮先預處理,把範圍內所有素數篩選出來,那麼篩素數的方法有哪些,下面就兩種演算法的思想和標程進行說明。一 埃氏 eratosthenes 篩素數。原理 基於任意整數x的倍數2x,3x,4x,都...