1樓:
據說aks演算法特快,不過我沒看懂,沒辦法直接解釋還可以對數進行素性測試(通過不一定是,但通不過一定不是):
原理是femart小定理的逆命題(可惜在少數情況下不成立)femart小定理:若p是素數,則p整除[(a^p)-a]由此可以寫出判定(一般用前5個質數,這樣至少在longint精度內沒有反例)
這樣的時間複雜度可以在logn的範圍內
程式:(0)計算a^b(mod c)
思路:先令ans=1,用二進位制將b,
然後不斷地重複:
若b的最末以為二進位制數為1,ans=ans*a對a賦值(a*a) mod p,
將b的二進位制最後一位去掉
直到b=0
(1)(直接用pascal寫下吧:)
分別令p取2,3,5,7,11,13
計算a^(p-1)(mod c)只需看看有沒有輸出不是1的,若沒有這個數在longint範圍內一定是質數)
至於更廣的範圍,可以查偽素數表。
2樓:匿名使用者
篩選。。。。越大,越複雜,越往後,越接近2的n次方初一某個數,甚至乘
3樓:匿名使用者
srt6r56 7u
如何快速檢查一個素數的素性(演算法)
4樓:hi漫海
現在,確定性素數判定法已經有很多種,常用的有試除法、威廉斯方法、艾德利曼和魯梅利法。它們的適用範圍各不相同,威廉斯方法比較適合10^20到10^50之間的數,艾德利曼和魯梅利法適合大於10^50的數,對於32位機器數,由於都小於10^10,所以一般都用試除法來判定。
阿格拉瓦法雖然是log(n)的多項式級演算法,但目前只有理論上的意義,根本無法實用,因為它的時間複雜度是o(log(n)^12),這個多項式的次數太高了。就拿最慢的試除法跟它來比吧,試除法的時間複雜度為o(n^(1/2)*log(n)^2),當n = 16時,log(n)^12 = 16777216,而n^(1/2)*log(n)^2 = 64,你看相差有多麼大!如果要讓兩者速度相當,即log(n)^12 = n^(1/2)*log(n)^2,得出n = 10^43.
1214,此時需要進行的運算次數為log(n)^12 = 10^25.873(注意:本文中log()函式預設以2為底),這樣的運算次數在一臺主頻3ghz的計算機上執行也要10^8.
82023年才能執行完,除了這些確定性素數判定法外,還有基於概率的非確定性素數判定法,最常用的就是米勒-拉賓法。
c語言中素數的判斷方法
5樓:五四公社
介紹三種使用c語言來判斷素數的方法,以及用做素數表來判斷找素數的方法。
6樓:匿名使用者
求素數的方法很多,其中最簡單的一種就是除以它之前的所有數(從2開始),如果都不能整除,
它就是一個素數。這個是根據素數的定義求解的,只能被1和它本身整除。
但顯然這樣的效率是不高的,如果要求1-100內的素數,對每一個數除以之前所有的數,有很多優化的餘地。
比如除以素數就可以了,沒必要去除以合數,於是加一個表,把之前的結果儲存下來,利用空間換取時間。
對於素數的判定,其實只需要判定是否能被 sqrt(n) 以內的素數整除。
感性上講,對於n,要麼是質數,只能被1和自己整除,要麼能分解質因數,至少有兩個素數因子。 n=p..q
因為不可能p和q都大於sqrt(n)(否則乘積就大於n了),所以只需要判斷那個小的素數能不能被n整除就可以了。
這樣,把求素數的演算法又提高了一步,不過計算中大量的用到除法,除法效率一般比較低。
有一種篩法求素數的演算法,把1-n排成一排,從2開始,2的倍數肯定不是素數,去除,剩下的數中下一個是3.
再把3的倍數去除,再下一個是5(4已經去除了),以此類推,最後剩下的數必然是素數,因為
它沒有被篩,不是任何一個數的倍數(除了1和自己)。這樣只需要很多次加法就可以了。
例如一個求 3000000 以內的素數的程式:#include
#include
using namespace std;
const int max=3000000;
char table[max];
void cal_prime()}}
}int main()
return 0;
}複製**這算是基本的篩法了,它更是以空間換取時間,因為記憶體中存的表不只是素數,還有合數的空間,合數比素數多得多。。。
它也有很多優化的餘地,比如6,在2的時候篩掉一次。在3的時候又篩掉一次。篩選的時候,一個數之所以能被篩去兩次,
它至少是兩個質數的倍數,每個質因數篩選一次。通過一定程度上減少重複,可以提升演算法的效率。
對於這種演算法的改進,有一種更直接的演算法,線性篩選,就是對一個合數,就進行一次篩選,極大程度的減少重複計算。
同樣條件**如下:#include
#include
using namespace std;
const int max=3000000;
char table[max];
int prime[max];
int num = 0;
void cal_prime()}}
int main()
return 0;
}複製**這個演算法又多了兩倍的空間儲存質數,還好這樣空間複雜度也是o(n)。
演算法中關鍵點是
if ( i % prime[j] == 0 ) break;
沒有這句這個跟篩法就差不多了,主要是防止重複篩除。
這個應該算是求素數最快的確定性演算法了,不過感覺用途也不是非常大,除了學習跟玩之外。。。
一般素數的應用在加密領域,利用一個數分解成兩個大素數的積非常難的性質,
數論上大數非常大,陣列是不可能放下1-n個數的(定址都不行了)。這點上這個演算法還沒有
之前直接除的演算法實用,最起碼一直等還是能出來結果的。。。
不過在應用的時候可以利用費馬小定理試探素數,雖然有一定出錯的概率,但是概率非常小,
實際中是能夠容忍的。
費馬小定理雖然證明是錯的,但是總還有不少概率是對的。。。
簡單說演算法是 判斷 2^(n-1) % n == 1 是否成立,成立則基本可認為是素數。(要是整數只能算32以內的素數了,
所以先得有個大整數運算的類,沒有寫過高效的大整數實現,演算法也停留在理論 ⊙﹏⊙b汗。。。)
(費馬定理是 a^(n-1) % n == 1 對所有 a < n 的正整數成立。這個小定理算是逆命題特化,不過
是錯的。。。)
7樓:魏子棟
需要自己根據素數的數學定義,自行書寫素數判斷函式並呼叫。
1、素數的判斷。
根據素數定義,除了1和本身不存在其它約數的正整數為素數。
所以在c語言中判斷n是否為素數可以從2開始到到n-1逐一嘗試,如果可以整除說明不是素數。
更進一步,可以從2判斷到n/2或者n的算術平方根,如果不存在約數,那麼即為素數。
除此以外,判斷素數的演算法還有素數篩等。
2、函式編寫:
以遍歷判斷約數的方法為例,函式可以編寫如下:
int isprime(int n)//判斷n是否為素數,如果是則返回1,否則返回0.
3、以輸入一個整數值,判斷是否為素數,並輸出結果,完整程式如下:
#include
#include
int isprime(int n)//判斷n是否為素數,如果是則返回1,否則返回0.
int main()
注意,用到了平方根函式sqrt,所以需要包含標頭檔案math.h
8樓:匿名使用者
從大於m的數迴圈,讓每個數x從2到sqrt(x)(x的開方取整)看是否存在約數,如果有則不為素,否則為素。讓一個清零的計數器sum每找到一個素就++,直到sum==k時跳出
9樓:化涵桃
不加大括號,for迴圈只執行printf();語句,不會執行break;這一行,迴圈語句的範圍是看括號的範圍的,沒有括號就看它下面出現的第一個分號(;)
10樓:匿名使用者
你可以通過可執行檔案放在專門的c語言虛擬機器內執行,檢視結果的準確性,你可以呼叫谷歌伺服器電腦系統的api,然後帶入實參,除錯一下程式看看能不能判定它的素數,另外別忘了植入標頭檔案,畫流程圖
11樓:某某知識教授
c語言中判斷n是否為素數可以從2開始到到n-1逐一嘗試,如果可以整除說明不是素數。
根據素數定義,除了1和本身不存在其它約數的正整數為素數。
更進一步,可以從2判斷到n/2或者n的算術平方根,如果不存在約數,那麼即為素數。
12樓:匿名使用者
判斷是不是素數,素數就是隻能被1和本身整除的自然數。void main()
13樓:匿名使用者
先來一種比較快速的素數篩選法,這是一種非常高效的篩法,原理的話,你得看下數論方面的書籍#include
#include
#define maxn 100int flag[maxn+1];int main()
for(i=2;i<=maxn;i++)
if(!flag[i])
printf("%d ",i);
printf("\n");
return 0;
}下面的用的是最普通的演算法#include#include
#define maxn 100int main()if(j==i)
printf("%d ",i);}}
printf("\n");
return 0;}
14樓:陳士晟
這是函式的做法
#include
void main()
int sushu(int a)}}
平行線的判定方法有,5個平行線的判定方法有
假面 1.同位角相等,兩條線平行。2.內錯角相等,兩條線平行。3.同旁內角互補,兩條線平行。4.經過直線外一點,有且只有一條直線與已知直線平行。5.如果兩條直線都與第三條直線直線平行,那麼這兩條直線也互相平行。平行線的判定定理 1 兩條直線被第三條直線所截,如果內錯角相等,那麼這兩條直線平行。內錯角...
時間管理的五個方法,時間管理的方法有哪些
一 立刻行動法。立刻行動是一種思維,是在你潛意識裡面一定要紮下根的一種觀念。當我們做很多事情的時候,一定要時時刻刻默唸這4個字 立刻行動 當你猶豫不決的時候,當你懶惰偷懶的時候默唸這4個字!二 番茄工作法。當你想要專注去工作或學習的時候,可以給自己準備一個鬧鐘,定時25分鐘,之後休息5分鐘,30分鐘...
會計核算的基本方法有哪些?它們之間關係如何
阿炎的情感小屋 會計核算基本方法 設定會計科目和賬戶 複式記賬 填制和稽核會計憑證 登記會計賬簿 成本計算 財產清查 編制會計報表。關係 經濟業務發生後,先要取得合法憑證 2.根據設定的賬戶,按複式記賬方法登記賬簿 3.根據賬簿記錄進行成本計算 財產清查,在賬實相符基礎上編制財務報告。擴充套件資料 ...