(C)
#包括<stdio.h>
#包括<stdlib.h>
#定义顶部(1ULL<<32)
typedef unsigned long long U64;
int compare64(常量无效*p1,常量无效*p2){
如果(*(U64*)p1==*(U64*)p2),则返回0;
返回(*(U64*)p1<*(U64*)p2)-1 : 1;
}
U64 findElement(U64*a,U64开始,U64结束,U64元素){
if(start+1==end)返回(a[start]==元素);
U64 mid=(开始+结束)/2;
if([mid]>元素)
return findElement(a,start,mid,element);
return findElement(a,mid,end,元素);
}
int主(){
U64 i,j,p,n=0,*pp=(U64*)malloc(TOP/2),总和;
无符号字符*c=(无符号字符*)malloc(TOP/16);
如果(!c||!pp)退出(1);
memset(c,0,TOP/16);
pp[n++]=1;
对于(i=1;i<TOP;i+=2){
如果((c[i>>4]&(1<<(i>>1)&7))==0){
对于(p=i+(i==1),j=p*p;j*=p){
pp[n++]=j;
双k=(双)j)*(双)p);
如果(k>=((双)(1ULL<<60)*16.0))断裂;
}
如果(i>1)
对于(j=i*i>>1;j<TOP/2;j+=i)c[j>>3]|=1<<(j&7);
}
如果((i&(i-2))==1)打印f(“%llu”,i);
}
printf(“//%lu\n\n”,n);
q排序(pp,n,8,compare64);
对于(i=1;i<顶部;i+=2)
如果((c[i>>4]&(1<<(i>>1)&7))==0)
对于(p=i+(i==1),总和=1+p,j=p*p;j*=p){
if(findElement(pp,0,n,sum))打印f(“%llu,”,j);
总和+=j;
双k=(双)j)*(双)p);
如果(k>=((双)(1ULL<<60)*16.0))断裂;
}
返回0;
}
(PARI)对于(n=1,10^6,如果(!isprime(n),v=因子(n);如果(matsize(v)[1]==1,s=sumdiv(n,d,d)-n;如果(!isprime(s),vv=因子;如果(matsize(vv)[1]==1,打印(n)))/*拉尔夫·斯蒂芬2013年8月5日*/