>>7881417unsigned long long int root2(unsigned long long int n) {
if(n==0)
return 0;
if(n==1)
return 1;
unsigned long long int i=0,f=(static_cast<unsigned long long>(1)<<32);
unsigned long long int j=(static_cast<unsigned long long>(1)<<31);
while(1)
{
if((n/j==j)||(n/j==(j+1))||(i==f)){
return j;
}
if((n/j==(j-1)))
return j-1;
else if(n/j>j)
i=j;
else
f=j;
j=(i+f)/2;
}
return j;
}
void coprimes_init(unsigned long long int * coprimearray, unsigned long long int mod, unsigned long long int order){
bool * coprimeTest = new bool[order];
for(unsigned long long int i=0;i<mod;i++){
coprimeTest
=true;
}
for(unsigned long long int i=0;i<primeNum;i++){
unsigned long long int index=primearray*primearray;
coprimeTest[primearray]=false;
while(index<mod){
coprimeTest[index]=false;
index+=primearray;
}
}
for(unsigned long long int i=1,j=0;i<mod;i++){
if(coprimeTest){
coprimearray[j++]=i;
}
}
delete coprimeTest;
return;
}
bool primeChecker(unsigned long long int n){//Abandon hope all ye who enter here
const size_t primeNum=6;
const unsigned long long int primearray[primeNum]={2,3,5,7,11,13};
unsigned long long int mod=1, order=1;
if((n==0)||n==1)
return false;
for(unsigned long long int i = 0; i<primeNum; i++){
order*=(primearray-1);
mod*=primearray;
if( n==primearray )
return true;
else if(n%primearray==0)
return false;
}
static bool init=false;
static unsigned long long int * coprimearray=new unsigned long long int[order];
if(!init){
coprimes_init(coprimearray, mod, order);
init=true;
}
unsigned long int root=static_cast<unsigned long int>(root2(n));
if((n%root)==0)
return false;
unsigned long long int test=coprimearray[1], i=1;
do{
if(n%test==0)
return false;
i++;
if(i==order){
i=0;
test++;
}
test+=coprimearray;
}while(test<root);
return true;
}