- 注册时间
- 2008-12-31
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 6090
- 在线时间
- 小时
|
楼主 |
发表于 2009-9-29 18:58:46
|
显示全部楼层
本帖最后由 winxos 于 2009-9-29 19:01 编辑
//一份简易的GMP测试代码
//梅森素数的鲁卡斯测试以及概率测试
#include
#include
#include //包含了我自己定义的素数相关类,本程序调用了其产生小素数
#include
using namespace std;
#pragma comment(lib,"gmp.lib"); //另外一种引用库的方法
int IsMersenne(int ExpP)
{
if (ExpP == 2) return 1;
mpz_t c, b;
mpz_init(c);
mpz_init(b);
mpz_ui_pow_ui(c, 2, ExpP);
mpz_sub_ui(c, c, 1); //M(p) = 2^p-1
mpz_set_ui(b, 4);
for (int j = 0;j < ExpP-2;j++)
{
mpz_mul(b, b, b);
mpz_sub_ui(b, b, 2);
mpz_mod(b, b, c);
}
mpz_clear(c);
if (mpz_cmp_ui(b, 0) == 0)
{
mpz_clear(b);
return 1;
}
mpz_clear(b);
return 0;
}
int IsMersenne2(int ExpP)
{
if (ExpP == 2) return 1;
mpz_t c;
mpz_init(c);
mpz_ui_pow_ui(c, 2, ExpP);
mpz_sub_ui(c, c, 1);
if (mpz_probab_prime_p(c, 5))
{
return 1;
}
return 0;
}
int main()
{
time_t a,b;
PRIMES P;
int i, ct = 0;
a=time(0);
for (i = 900;i < 1100;i++)
{
int ExpP = P.PrimeAt(i);
SetTitle(ExpP);
if (IsMersenne(ExpP))
{
cout<<++ct<<"\t"<秒"<return 0;
} |
|