有趣的素數題

2022-02-19 01:02:33 字數 1891 閱讀 3833

剛看到乙個題目,有些意思

請使用c或者c++編寫符合posix規範的下述程式。

寫個列出所有long long能表示的素數的程式,單程序雙線程的。

要求a執行緒用rabin-miller演算法篩數,b執行緒用演算法2驗證。

a執行緒篩出n(n=100)個數之後(b執行緒此期間應協助a執行緒篩數),

b執行緒開始驗證,a執行緒繼續篩數,

a執行緒篩完數後,協助b執行緒驗證。

素數是這樣的整數,它除了表示為它自己和1的乘積以外,無論他表示為任何兩個整數的乘積。

素數演算法:

1:是從2開始用「是則留下,不是則去掉」的方法把所有的數列出來(一直列到你不想再往下列為止,比方說,一直列到10,000)。第乙個數是2,它是一 個素數,所以應當把它留下來,然後繼續往下數,每隔乙個數刪去乙個數,這樣就能把所有能被2整除、因而不是素數的數都去掉。在留下的最小的數當中,排在2 後面的是3,這是第二個素數,因此應該把它留下,然後從它開始往後數,每隔兩個數刪去乙個,這樣就能把所有能被3整除的數全都去掉。下乙個未去掉的數是 5,然後往後每隔4個數刪去乙個,以除去所有能被5整除的數。再下乙個數是7,往後每隔6個數刪去乙個;再下乙個數是11,往後每隔10個數刪乙個;再下 乙個是13,往後每隔12個數刪乙個。就這樣依法做下去。

但是程式設計我們一般不採用上面的方法,並不說這中方法計算機實現不了,或者說實現演算法比較複雜。因為它更像乙個數學推理。下面為通常所用演算法:

設n=2^127-1是乙個38位數,要驗證它是否為素數,有下面幾個不同的方法:

1.遍歷2以上n的平方根以下的每乙個整數,是不是能整除n;(這是最基本的方法)

2.遍歷2以上n的平方根以下的每乙個素數,是不是能整除n;(這個方法是上面方法的改進,但要求n平方根以下的素數已全部知道)

(以下為用於長數)

3.採用rabin-miller演算法(1978 年就出現了這種演算法,它是第乙個既能用於資料加密也能用於數字簽名的演算法。它易於理解和操作,也很流行。演算法的名字以發明者的名字命名:ron rivest, adishamir 和leonard adleman。但rsa的安全性一直未能得到理論上的證明。 rsa的安全性依賴於大數難於分解這一特點。);

4.aks 演算法(agrawal、kayal和saxena);

驗算結果,假設計算機能每秒鐘計算1億次除法,那麼

演算法1要用4136年,演算法2要用93年,演算法3只要不到1秒鐘!

rabin -miller演算法是典型的驗證乙個數字是否為素數的方法。判斷素數的方法是rabin-miller概率測試,那麼他具體的流程是什麼呢。假設我們要判 斷n是不是素數,首先我們必須保證n 是個奇數,那麼我們就可以把n 表示為 n = (2^r)*s+1,注意s 也必須是乙個奇數。然後我們就要選擇乙個隨機的整數a (1 <=a <=n-1),接下來我們就是要判斷 a^s=1 (mod n) 或a^((2^j)*s)= -1(mod n)(0 <=j如果任意一式成立,我們就說n通過了測試,但是有可能不是素數也能通過測試。所以我們通常要做多次這樣的測試,以確保我們得到的是乙個素 數。(dds的標準是要經過50次測試)

採用rabin-miller演算法進行驗算

首先選擇乙個代測的隨機數p,計算b,b是2整除p-1的次數。然後計算m,使得n=1+(2^b)m。

(1) 選擇乙個小於p的隨機數a。

(2) 設j=0且z=a^m mod p

(3) 如果z=1或z=p-1,那麼p通過測試,可能使素數

(4) 如果j>0且z=1, 那麼p不是素數

(5) 設j=j+1。如果j且z <>p-1,設z=z^2 mod p,然後回到(4)。如果z=p-1,那麼p通過測試,可能為素數。

(6) 如果j=b 且z <>p-1,不是素數

有趣的遞迴題

遞迴經典題目 1 給定乙個含有n個元素的整型陣列a,求a中所有元素的和。這道題要求用遞迴,只用一行 分析 簡單說一下,兩種情況 1.如果陣列元素個數為0,那麼和為0 2.如果陣列元素個數為n,那麼先求出前n 1個元素之和,再加上a n 1 即可 陣列求和 intsum int a,intn 2 函式...

有趣的程式設計題

1 甲乙做乙個遊戲叫做pick a number 給定乙個數字list,甲先從list首尾選乙個數字,然後乙從剩下數字首尾選乙個數字,已知甲乙都足夠聰明,以保證自己拿到的最終分數最高,用遞迴寫出pick a number的程式 比如list 3,5,2,1 最終甲乙得分為 6,5 2 arthur最...

有趣的密碼題。

1 某一密碼僅使用k l m n o共5個字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規則 1 密碼單詞的最小長度是兩個字母,可以相同,也可以不同 2 k不可能是單詞的第乙個字母 3 如果l出現,則出現次數不止一次 4 m不能使最後乙個也不能是倒數第二個字母 5 k出現,則n就一定出現 6 ...