miller-rabin演算法
pollard-rho演算法
伯特蘭-切比雪夫定理
\(\quad\)首先介紹一下費馬小定理:
\(\quad\)如果乙個數 p 是質數,乙個正整數 a 滿足 gcd(a,p)=1,那麼 $a^\equiv 1 \pmod p $
\(\quad\)事實上對於乙個數如果多次隨機數都滿足這個性質,那麼這個數接近 100% 就是質數了。 平常判斷質數用這個就夠了。
\(\quad\)當然,還有更準確的演算法,介紹一下二次探測定理:
\(\quad\)如果乙個數 p 是質數,並且乙個正整數 a 滿足 \(a^2 \equiv 1 \pmod p\),則 a 一定滿足 \(a\equiv \pm 1 \pmod p\)
\(\quad\)於是引出今天的主角:miller-rabin 演算法 = (費馬小定理+二次探測定理)
inline bool mr(ll x,ll b)
return 1;
}inline bool prime(ll x)
\(\quad\)這個**大概就是判斷素數的流程了,下面的prime函式中mr中判斷可以多搞幾個以保證正確率。只要乙個不滿足就直接否掉。
\(\quad\)它的應用就是判斷素數(在資訊學奧賽中)
\(\quad\)這裡我們要寫乙個程式,對於每個數字檢驗是否是質數,是質數就輸出 prime ,如果不是質數,輸出它最大的質因子是哪個
\(\quad\)首先我們知道生日悖論,生日悖論的實質是:由於採用"組合隨機取樣"的方法,滿足答案的組合比單個個體要多一些.這樣可以提高正確率。我們不妨想一想:如何通過組合來提高正確率呢?
\(\quad\)我們不放選取一組數 \(x_1,x_2,x_3\cdots x_n\) ,若有 \(gcd(|x_i-x_j|,n)>1\) ,則稱\(gcd(|x_i-x_j|,n)\) 是n的乙個因子。而通過組合數可以大大提高效率。有證明,需要選取的數的個數大約是 \(o(n^})\) .但是,我們還需要解決儲存方面的問題。如果 \(n=10^\),那麼我們也需要取\(10^4\)個數.如果還要 \(o(n^2)\) 來兩兩比較,時間複雜度又會彈回去.因此還需要優化。
\(\quad\)我們不妨考慮構造乙個偽隨機數序列,然後取相鄰的兩項來求gcd.為了生成一串優秀的隨機,pollard設計了這樣乙個函式:
\[f(x)=(x^2+c)\mod n
\]\(\quad\)其中 c 是乙個隨機的常數.我們隨便取乙個 \(x1,x2=f(x1),x3=f(x2)\) 。在一定的範圍內,這個數列是基本隨機的,可以取相鄰兩項作差求gcd。這樣子的乙個序列是相對很隨機的(有根據,這裡不詳細說了)。但是這個序列會出現迴圈節,且仍然不太快,我們繼續優化。
\(\quad\)由於求 gcd 的時間複雜度是 \(o(logn)\) 的,頻繁地呼叫這個函式會導致演算法變得異常慢.我們可以通過乘法累積來減少求 gcd 的次數.比如 gcd(a,b)=1,gcd(c,b)=1,gcd(d,b)>1, 那麼gcd(acd,b)>1。
\(\quad\)我們每次倍增取一段區間,將這個區間的數全部乘上,再求一次gcd就好了。
\(\quad\)這裡給倍增乙個上限127(這個數字很特殊,具體我也不太懂)
\(\quad\)這不重要,下面給出這個問題(模板題)的**:
#include#define ll long long
#define lll __int128
using namespace std;
ll max_factor,n;
inline ll gcd(ll a,ll b)
inline ll ksm(ll x,ll p,ll mod)//快速冪
x=(lll)x*x%mod;
p>>=1;
}return ans;
}inline bool mr(ll x,ll b)//判斷素數
return 1;
}inline bool prime(ll x)//判斷質數
inline ll f(ll x,ll c,ll n)//f函式
inline ll pr(ll x)//求x的乙個不為x和1的因子
}ll d=gcd(val,x);
if(d>1) return d;
} } inline void fac(ll x)//分解x
ll p=x;
while(p>=x) p=pr(x);
while((x%p)=0) x/=p;
fac(x),fac(p);
} int main()
return 0;
}
\(\quad\)若整數 n > 3,則至少存在乙個質數 p,符合n < p < 2n − 2。另乙個稍弱說法是:對於所有大於1的整數 n,至少存在乙個質數p,符合n < p < 2nluogu p5535 【xr-3】小道訊息
\(\quad\)我們根據以上定理知道 n/2 < p(質數)< n 中,一定存在 p
\(\quad\)然後我們進行分類:
一. k+1 為質數
k+1 的倍數(>=2)仍在1-n 內,那麼易知需要兩天,第一天為除了倍數的所有數,我們又知道 gcd(a,a+1)=1,所以第二天就結束。
k+1 的倍數大於 n,那麼就只用一天了
二. k+1 為合數
\(\quad\)顯然 k+1 不可能為p的倍數,所以第一天就告訴 p , 第二天就是一的 2 類
\(\quad\)這道題第一眼看起來很懵逼,但是知道了伯特蘭-特比雪夫定理後就沒什麼難度了
素數有關演算法
以下介紹判別素數以及篩選素數的相關演算法 一 素數判斷 判斷乙個非負整數是否為素數,若為素數則返回真。素數判斷 bool is prime int u 二 素數篩選一 構造乙個vector記錄已找到的所有素數。素數篩法一 vectorp 素數表,用來儲存所有素數 const int max 1000...
有關測試的理論
一 測試什麼時候介入,為什麼?測試要盡早介入,最好在需求評審,因為越早介入,付出的代價就越少 二 軟體缺陷產生的原因?我認為有三點原因 1,軟體本身,需求不清晰,導致設計目標偏離客戶的需求,從而引起功能或產品特徵上的缺陷。2,團隊工作,不同階段的開發人員相互理解不一致。3,專案管理的問題 缺乏質量文...
理論 數論(4) 素數舉例
假設只有有限多個素數,比如k個,2,3,5,7,pk。然後尤拉說 我們令 設k個素數沒有乙個能整除m,因為他們都能整除m 1,於是必定有另乙個素數整除m,或許m本身就是個素數,這兩種可能都與我們假設僅有2,3,5,7 pk,這k個素數相矛盾。定理歐幾里得數,此序列的前面的一些數是 這些全部都是素數,...