Skip to content

Instantly share code, notes, and snippets.

@konjac
Created March 6, 2014 07:38
Show Gist options
  • Save konjac/9384301 to your computer and use it in GitHub Desktop.
Save konjac/9384301 to your computer and use it in GitHub Desktop.
const int MAXN = 110000;
int mask[MAXN];
static int primes[10000]={2,3,5,7,9};
int size = 0;
bool TestPrime(const CBigNum& p){
for(int i = 0; i < 5; ++i){
CBigNum remain = p % CBigNum(primes[i]);
if(remain==0)return false;
}
return true;
}
bool TestWithSmallPrime(const CBigNum& origin, int length){
if(size == 0){
memset(mask, 0, sizeof(mask));
primes[size++] = 2;
for(int i = 3; i < MAXN; i+=2){
if(mask[i]==0){
primes[size++] = i;
if(size == 10000)break;
for(int j = i+i; j < MAXN; j+=i)
mask[j] = 1;
}
}
printf("#primes = %d\n", size);
}
int len1=0, len2=0, len3=0;
for(int i = 0; i < length; ++i){
if(TestPrime(origin*(1<<i)-1)) ++len1;
else break;
}
if(len1 == length) return true;
for(int i = 0; i < length; ++i){
if(TestPrime(origin*(1<<i)+1)) ++len2;
else break;
}
if(len2 == length) return true;
len3 = 2 * std::min(len1, len2);
if(len1 == len2 +1) ++len3;
if(len3 >= length) return true;
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment