數學 數論 質數處理

2022-09-15 06:12:13 字數 1985 閱讀 6983

定義:

乙個數的因數只有1和本身,那麼這個數是質數。

質數的判斷:

乙個數n如果不是質數那麼在2—sqr

t(n)

sqrt

(n)一定有他的因子,於是:

bool isprime (

int n)

else

return

false

;}

但是在大量元素中,比如1—1

e61—

1e6中的質數,再用上面的樸素演算法,就有些蹩腳了。

這裡我們給出埃氏篩法:

原理:如果找到乙個質數,那麼這個質數的倍數都不是質數

int primes[n]

,cnt;

bool bprime[n]

;void

getprime

(int n)

}}

但是埃氏篩法的缺點:例如6會被3整除,6會被2整除,會被篩兩次,所以我們再給出歐氏線性篩法:

int primes[n]

,cnt;

bool bprime[n]

;void

getprimes

(int n)

}}

1e8以內的素數篩法

#include

#include

using

namespace std;

bitset<

100000010

>v;

int prime[

6000001];

int m=0;

void

primes

(int n)

}for

(int i=

2; i<=n; i++)if

(!v[i]

) prime[m++

]=i;

for(

int i=

0; i) cout<<}int

main()

奇技淫巧:

用6n±1法求素數

任何乙個自然數,總可以表示成為如下的形式之一:6n,6n+1,6n+2,6n+3,6n+4,6n+5 (n=0,1,2,…)

顯然,當n≥1時,6n,6n+2,6n+3,6n+4都不是素數,只有形如6n+1和6n+5的自然數有可能是素數。所以,除了2和3之外,所有的素數都可以表示成6n±1的形式(n為自然數)。

miller-rabin 演算法

miller-rabin 演算法是乙個隨機演算法,隨機生成幾個 a 利用費馬小定理與二次探測定理來檢測素數。

只需要多次尋找不超過 n-1 基並檢驗是否有 , 如果一直有, 那麼這個數大概率就是乙個素數,否則可以立即判定這個數是個合數。

雖然看似沒有問題,但卻存在一些數,對於 a 的某些選擇可以騙過該演算法,這些數雖然不是素數,但卻對所有與 p 互素的 0mult_mod

(ll a,ll b,ll m)

//res=(a*b)%m

return res%m;

}ll pow_mod

(ll a, ll b, ll m)

//res=(a^b)%m

return res%m;

}bool

witness

(ll a,ll n,ll x,ll sum)

return0;

}bool

miller_rabin

(ll n)

int times=20;

for(ll i=

1;i<=times;i++

)return1;

}int

main()

JZOJ5458 質數 數論,數學

題目 求ll l到rr r中是質數或是兩個質數之積的數的個數。首先,觀察最大資料 l r 107 q 1 05 l leq r leq 10 7,q leq 10 5 l r 10 7,q 105那麼肯定是要離線做的。肯定是要先篩質數,那麼就用線性篩,不僅得到1 11到r rr之間的質數,還得到了每...

數論 質數距離

給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...

數論基礎之質數

文章是看了好多好多大佬的部落格才自己總結出來的,有些地方覺得大佬的文字很精煉於是學習了一下,若是有人認為哪些地方我是不道德的,請指出,謝謝。質數,也稱素數,只包含兩個因數,且乙個因數為1,乙個因數為它本身。無論是數論 計算機應用上還是acm上,質數都是基礎且極其重要。於acm上,質數經常用於判斷乙個...