- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 42277
- 在线时间
- 小时
|
发表于 2022-9-20 07:07:09
|
显示全部楼层
- #include <gmpxx.h>
- #include <time.h>
- #include <stdio.h>
- #include <omp.h>
- #define FM 15
- #define TC 2
- #define TRANGE 10000000
- #define BLOCKSIZE 200000
- char isp[TRANGE];
- char bsize[BLOCKSIZE];
- void initp()
- {
- int i;
- for(i=2;i<TRANGE;i++)isp[i]=1;
- for(i=2;i<=TRANGE/i;i++){
- if(isp[i]){
- int j;
- for(j=i*i;j<TRANGE;j+=i)isp[j]=0;
- }
- }
- }
- int pow2n(int n, int p)
- {
- long r=1,m=2;
- int i;
- while(n>0){
- if(n&1){
- r*=m;
- r%=p;
- }
- m*=m;
- m%=p;
- n>>=1;
- }
- return (int)r;
- }
- void init()
- {
- int i,p;
- int n=1<<FM;
- initp();
- for(i=1;i<BLOCKSIZE;i++)bsize[i]=1;
- for(p=2;p<TRANGE;p++){
- if(!isp[p])continue;
- int r=pow2n(n,p);
- for(i=p-r;i<BLOCKSIZE;i+=p){
- bsize[i]=0;
- }
- }
- int c=0;
- for(i=1;i<BLOCKSIZE;i++){
- if(bsize[i])c++;
- }
- printf("Total %d cands left\n",c);
- }
- int gc;
- int main()
- {
- int i;
- time_t start = time(NULL);
- init();
- printf("Init done\n");fflush(stdout);
- mpz_class x=1;
- x<<=1<<FM; //2^(2^FM)
- #pragma omp parallel for
- for(i=1;i<BLOCKSIZE;i++){
- if(!bsize[i])continue;
- mpz_class y=x+i;
- gc++;
- if(mpz_probab_prime_p(y.get_mpz_t(),TC)){
- printf("M%d+%d\n",FM,i-1);
- fflush(stdout);
- fprintf(stderr,"M%d+%d found\n",FM,i-1);
- }
- #if 0
- if(gc%7==0){
- int diff = time(NULL)-start;
- fprintf(stderr,"test %d cost %ds\n",gc,diff);
- }
- #endif
- }
- return 0;
- }
复制代码
|
|