(C)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TOP (1ULL<<32) // Memory usage: 0.5 Gb
int main() {
unsigned long long i, j, p, t, r;
unsigned char *c = (unsigned char *)malloc(TOP/8);
memset(c, 0, TOP/8);
for (printf("0, "), i=1; i < TOP; i+=2)
if ((c[i>>4] & (1<<((i>>1)&7))) == 0) {
for (p = i + (i==1), j = p*p; ; j*=p) {
t = j - 1;
r = sqrt(t*2);
if (r*(r+1)==t*2) printf("%llu, ", r);
double k = ((double)j) * ((double)p);
if (k >= ((double)(1ULL<<62)*4.0)) break;
}
if (i>1) for (j=i*i>>1; j<TOP; j+=i) c[j>>3] |= 1 << (j&7);
}
// SORT the output
return 0;
}
|