當前位置:編程學習大全網 - 編程語言 - 求教用C++編寫產生隨機大素數程序,以及驗證輸入的數為素數的各種思路方法

求教用C++編寫產生隨機大素數程序,以及驗證輸入的數為素數的各種思路方法

以前我寫過壹個求打整數的程序,可以給妳解釋下大概的思路

先說說大整數怎麽定義吧,我是用壹個類來寫的,支持1024位的大整數,整數是用數組來裝的,長度可以自己設。然後定義了相關的成員函數,如四則運算,當然也包含了妳所說的素性檢測。這裏用的素性檢測的算法是拉賓米勒算法,這個算法可以判斷大整數是否有可能是素數,函數名為Rab。如果妳想得到大素數,可以看看素性檢測相關的資料,拉賓米勒算法是最常用的算法。類裏也寫了個GetPrime函數用於獲得大素數。類的定義如下:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define BI_MAXLEN 64

class CBigNumber

{

public:

//大數在0x100000000進制下的長度

unsigned m_nLength;

//用數組記錄大數在0x100000000進制下每壹位的值

unsigned long m_ulValue[BI_MAXLEN];

CBigNumber();

~CBigNumber();

/*****************************************************************

基本操作與運算

Mov,賦值運算,可賦值為大數或普通整數

Cmp,比較運算,比較兩個大數或兩個普通整數的大小

Add,加,求大數與大數或大數與普通整數的和

Sub,減,求大數與大數或大數與普通整數的差

Mul,乘,求大數與大數或大數與普通整數的積

Div,除,求大數與大數或大數與普通整數的商

Mod,模,求大數與大數或大數與普通整數的模

Pow,乘方,求大數與普通整數的乘方

*****************************************************************/

void Mov(unsigned __int64 A);

void Mov(CBigNumber A);

CBigNumber Add(CBigNumber A);

CBigNumber Sub(CBigNumber A);

CBigNumber Mul(CBigNumber A);

CBigNumber Div(CBigNumber A);

CBigNumber Mod(CBigNumber A);

CBigNumber Add(unsigned long A);

CBigNumber Sub(unsigned long A);

CBigNumber Mul(unsigned long A);

CBigNumber Div(unsigned long A);

unsigned long Mod(unsigned long A);

int Cmp(CBigNumber A);

CBigNumber Pow(unsigned long A);

/*****************************************************************

輸入輸出

Get,從字符串按10進制或16進制格式輸入到大數

Put,將大數按10進制或16進制格式輸出到字符串

*****************************************************************/

// void Get(unsigned char *str, UINT len);

CBigNumber Get(unsigned char *str, unsigned long len);

void Put10(CString &str);

void Put256(CString &str);

void Put16(CString &str);

void Putchar(CString &str);

/*****************************************************************

RSA相關運算

Rab,拉賓米勒算法進行素數測試

Euc,歐幾裏德算法求解同余方程

Mon,蒙格馬利法進行冪模運算

GetPrime,產生指定長度的隨機大素數

*****************************************************************/

int Rab();

CBigNumber Euc(CBigNumber A);

//CBigNumber RsaTrans(CBigNumber A, CBigNumber B);

CBigNumber Mon(CBigNumber A, CBigNumber B);

void GetPrime(int bits);

};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

最後提醒樓主壹點,大素數不是靠從1到那個數減1那樣算的,因為那樣真的很慢的

還有,這個只是壹個類的定義,實現部分妳可以按自己的想法定義,當然如果有不懂可以找我,我有它的實現部分

  • 上一篇:我想找份工作,我喜歡玩遊戲,做遊戲,從我想出來的遊戲包裏掙錢,就像我壹直在想的那樣,魔龍來了。
  • 下一篇:上班整天對著電腦輻射太強,防藍光眼鏡真的能防藍光嗎?
  • copyright 2024編程學習大全網