|
发表于 2024-2-6 06:25:39
|
显示全部楼层
直接穷举,未做筛选。
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
__int64 TEMP=65536, Limit=TEMP*TEMP/2;
const int L=10;
__int64 POWOF10[L], Max;
void Perpare( ){
POWOF10[0]=1; Max=10;
for( int i=1; i<L; ++i )
Max*=10, POWOF10=POWOF10[i-1]*10;
}
__int64 MultiModular( __int64 a, __int64 b, __int64 mod ){
__int64 r=0, t=a%mod;
while( b>0 ){
if( (b&1) && (r=r+t)>mod ) r-=mod;
if( (t<<=1)>mod ) t-=mod;
b>>=1;
}
return r;
}
__int64 PowModular( __int64 base, __int64 n, __int64 mod ){
__int64 s=1, t=base, u=n;
while(u){
if(u&1)
s=(s>=Limit || t>=Limit)? MultiModular( s, t, mod ) : (s*t)%mod;
u>>=1;
t=(t>=Limit)? MultiModular( t, t, mod ) : (t*t)%mod;
}
return s;
}
bool Miller_Rabin_Test( __int64 n ){
int base[]={2,3,7,61,24251},base_num=sizeof(base)/sizeof(base[0]);
__int64 t=n-1;
int s=0;
while( (t&1)==0 ) t>>=1, ++s;
for( int i=0; i<base_num; ++i ){
if( n==base ) return true;
__int64 r=PowModular( base, t, n );
if( r==1 ) continue;
int j;
for( j=0; j<s; ++j ){
if( r==n-1 ) break;
r=(r>=Limit)? MultiModular( r, r, n ) : (r*r)%n;
}
if( j<s ) continue;
return false;
}
return true;
}
int main()
{
ofstream file("output.txt");
int count=0;
Perpare( );
for( __int64 i=1, k1=1, Temp1=1; Temp1<Max; ){
for( __int64 j=1, k2=1, E=i*i*POWOF10[k2], Temp2=j*j, T=Temp2+E; T<Max; ){
if( Miller_Rabin_Test( T ) )
file<<T<<endl, ++count;
Temp2+=(j<<2)+4; j+=2;
if( Temp2>POWOF10[k2] )
++k2, E*=10;
T=Temp2+E;
}
Temp1+=(i<<1)+2;
++i;
if( Temp1>POWOF10[k1] )
++k1;
}
file<<count<<endl;
system("PAUSE");
return EXIT_SUCCESS;
} |
|