定義:
乙個數的因數只有1和本身,那麼這個數是質數。
質數的判斷:
乙個數n如果不是質數那麼在2—sqr
t(n)
sqrt
(n)一定有他的因子,於是:
但是在大量元素中,比如1—1bool isprime (
int n)
else
return
false
;}
e61—
1e6中的質數,再用上面的樸素演算法,就有些蹩腳了。
這裡我們給出埃氏篩法:
原理:如果找到乙個質數,那麼這個質數的倍數都不是質數
但是埃氏篩法的缺點:例如6會被3整除,6會被2整除,會被篩兩次,所以我們再給出歐氏線性篩法:int primes[n]
,cnt;
bool bprime[n]
;void
getprime
(int n)
}}
1e8以內的素數篩法int primes[n]
,cnt;
bool bprime[n]
;void
getprimes
(int n)
}}
奇技淫巧:#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上,質數經常用於判斷乙個...