#include #include #include #include #define DEFAULT_NUM 5000 #define PROGNAME "primepattern" void primetable(long long int maxnumber); int main(int argc, char *argv[]){ long long int numprimes = 0; if(argc == 1){ fprintf(stderr, "No number specified, using %i\n", DEFAULT_NUM); numprimes = DEFAULT_NUM; }else if(argc == 2){ numprimes = atoll(argv[1]); if(numprimes <= 0){ fprintf(stderr, "Number must be greater than 0\n"); numprimes = 0; } }else{ fprintf(stderr, "Syntax:\n\t%s \n", PROGNAME); } if(numprimes){ primetable(numprimes); } return (numprimes != 0); } void primetable(long long int maxnumber){ long long int testnum, n, tnsq, delta, pindex; unsigned char *isprime; int displaynum; isprime = (unsigned char *)malloc(maxnumber * sizeof(unsigned char)); if(isprime != (unsigned char *)NULL){ memset(isprime, (1 << (8 * sizeof(unsigned char))) - 1, maxnumber * sizeof(unsigned char)); pindex = 0; testnum = 2; tnsq = testnum * testnum; do{ printf("[%4lli]", testnum); /* print the prime we're filtering out */ for(n = 0; n < pindex; n++) printf(" "); /* line up the output */ delta = 0; for(n = tnsq; n < maxnumber; n += testnum){ if(isprime[n]){ isprime[n] = 0; displaynum = (delta / testnum) % 62; if(displaynum < 10) printf("%i", displaynum); else if(displaynum < 36) printf("%c", 'A' + (char)(displaynum - 10)); else printf("%c", 'a' + (char)(displaynum - 36)); delta = 0; } delta += testnum; } printf("\n"); do testnum++; while(!isprime[testnum] && testnum < maxnumber); tnsq = testnum * testnum; pindex++; fflush(stdout); }while(tnsq < maxnumber); /* for(n = 0; n < maxnumber; n++) if(isprime[n]) printf("%lli ", n); printf("\n"); */ free(isprime); } }