int main() { auto primes = generatePrimes(10000); int maxN = 0; int maxMul = 0; for (int a = -999; a < 999; a++) { // b must be prime for (int bi = 0; primes[bi] < 999; bi++) { int n = 0; while (std::binary_search(primes.begin(), primes.end(), n * n + a * n + primes[bi])) n++; if (n > maxN) { maxN = n; maxMul = a * primes[bi]; } } } std::cout << maxMul << '\n'; }
PrimeSource::PrimeSource(uint32_t primesNum, unsigned inversedMultipliersNum) : _primesNum(primesNum) { // Use Eratosthenes sieve for search first N primes _primes = new uint32_t[primesNum]; _primesCombined = new uint32_t[inversedMultipliersNum]; _isNewMultiplier = new uint32_t[inversedMultipliersNum]; _multipliers = new uint32_t[inversedMultipliersNum]; _offsets = new uint32_t[inversedMultipliersNum]; _multipliers64 = new uint64_t[inversedMultipliersNum]; _offsets64 = new uint32_t[inversedMultipliersNum]; _combinedMultipliers = new uint64_t[inversedMultipliersNum]; _combinedOffsets = new uint32_t[inversedMultipliersNum]; generatePrimes(_primes, primesNum); generateMultipliers(_primesCombined, _isNewMultiplier, _multipliers, _offsets, _multipliers64, _offsets64, _combinedMultipliers, _combinedOffsets, _primes, primesNum, inversedMultipliersNum); }
virtual int PluginMain(int inputBufferSize, const char * inputBuffer, int outputBufferSize, char * outputBuffer) { const ComputePrimesJob * job = reinterpret_cast<const ComputePrimesJob*>(inputBuffer); ComputedPrimesResponse * response = reinterpret_cast<ComputedPrimesResponse*>(outputBuffer); response->count = 0; int inputSize = job->endNumber - job->initialNumber + 1; if (inputSize <= 0) { return 0; } int initialNumber = job->initialNumber > 0 ? job->initialNumber : 1; int endNumber = inputSize > MAX_PRIME_NUMBERS ? job->initialNumber + MAX_PRIME_NUMBERS - 1 : job->endNumber; int size = endNumber - initialNumber + 1; int numberOfBytes = (endNumber + 1) / 8 + (endNumber % 8 ? 1 : 0); char * buffer = new char[numberOfBytes]; generatePrimes(buffer, numberOfBytes, endNumber); for (int i = 0, n = 0; i < size; ++i) { int index = i + initialNumber - 1; if (IsSet(index, buffer)) { response->primeList[n++] = index + 1; ++response->count; } } delete [] buffer; #if SIMULATE_DELAY sleep(6); #endif return 0; }
int main(int argc, char* argv[]) { //skip argv[0] argc--; argv++; if(argc <= 0) //No arguments provided { fprintf(stderr, "Please enter command line arguments.\n"); printUsage(); return EXIT_FAILURE; } //primes if(strcmp(*argv, "primes") == 0) { if(argc-1 < 1 || argc-1 > 1) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } char* maxvalString = malloc(100*sizeof(char)); unsigned int maxval = 0; for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //maxval if(argv[0][0]=='-' && argv[0][1]=='n' && argv[0][2]=='=') { //Get tablefile from argv int i=0; for(i=3; i<strlen(*argv); i++) { maxvalString[i-3] = argv[0][i]; } maxvalString[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } maxval = strtod(maxvalString, NULL); //check for errors if(maxval < 2 || maxval > 16777216) //maxval must be between 2 and 2^24, inclusive { fprintf(stderr, "maxval must be between 2 and 2^24, inclusive.\n"); printUsage(); return EXIT_FAILURE; } generatePrimes(maxval); free(maxvalString); } //trialdiv else if(strcmp(*argv, "trialdiv") == 0) { //Get hold of arguments char* number = malloc(100*sizeof(char)); char* primesfileName = malloc(100*sizeof(char)); //No, less or extra parameters for keyexpand if(argc-1 < 2 || argc-1 > 2) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //key if(argv[0][0]=='-' && argv[0][1]=='n' && argv[0][2]=='=') { //Get key from argv int i=0; for(i=3; i<strlen(*argv); i++) { number[i-3] = argv[0][i]; } number[i-3] = '\0'; } //tablefile else if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='=') { //Get tablefile from argv int i=0; for(i=3; i<strlen(*argv); i++) { primesfileName[i-3] = argv[0][i]; } primesfileName[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(number) == 0 || strlen(primesfileName) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } performTrialDivision((unsigned char*)number, primesfileName); free(number); free(primesfileName); } //millerrabin else if(strcmp(*argv, "millerrabin") == 0) { //Get hold of arguments char* number = malloc(100*sizeof(char)); char* maxIter = malloc(100*sizeof(char)); char* primesfileName = malloc(100*sizeof(char)); //No, less or extra parameters for millerrabin if(argc-1 < 3 || argc-1 > 3) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //number if(argv[0][0]=='-' && argv[0][1]=='n' && argv[0][2]=='=') { //Get number from argv int i=0; for(i=3; i<strlen(*argv); i++) { number[i-3] = argv[0][i]; } number[i-3] = '\0'; } //primesfile else if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='=') { //Get primesfile from argv int i=0; for(i=3; i<strlen(*argv); i++) { primesfileName[i-3] = argv[0][i]; } primesfileName[i-3] = '\0'; } //maxiter else if(argv[0][0]=='-' && argv[0][1]=='t' && argv[0][2]=='=') { //Get number from argv int i=0; for(i=3; i<strlen(*argv); i++) { maxIter[i-3] = argv[0][i]; } maxIter[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(number) == 0 || strlen(primesfileName) == 0 || strlen(maxIter) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } runMillerRabin((unsigned char*)number, maxIter, primesfileName); free(number); free(primesfileName); free(maxIter); } //rndsearch else if(strcmp(*argv, "rndsearch") == 0) { //Get hold of arguments char* numbitsString = malloc(100*sizeof(char)); int numbits = 0; char* maxIter = malloc(100*sizeof(char)); int maxitr = 0; char* primesfileName = malloc(100*sizeof(char)); char* rndfileName = malloc(100*sizeof(char)); //No, less or extra parameters for millerrabin if(argc-1 < 4 || argc-1 > 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //numbits if(argv[0][0]=='-' && argv[0][1]=='k' && argv[0][2]=='=') { //Get numbits from argv int i=0; for(i=3; i<strlen(*argv); i++) { numbitsString[i-3] = argv[0][i]; } numbitsString[i-3] = '\0'; } //maxIter else if(argv[0][0]=='-' && argv[0][1]=='t' && argv[0][2]=='=') { //Get maxIter from argv int i=0; for(i=3; i<strlen(*argv); i++) { maxIter[i-3] = argv[0][i]; } maxIter[i-3] = '\0'; } //primesfile else if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='=') { //Get primesfile from argv int i=0; for(i=3; i<strlen(*argv); i++) { primesfileName[i-3] = argv[0][i]; } primesfileName[i-3] = '\0'; } //rndfile else if(argv[0][0]=='-' && argv[0][1]=='r' && argv[0][2]=='=') { //Get rndfile from argv int i=0; for(i=3; i<strlen(*argv); i++) { rndfileName[i-3] = argv[0][i]; } rndfileName[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(numbitsString) == 0 || strlen(primesfileName) == 0 || strlen(maxIter) == 0 || strlen(rndfileName)==0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } numbits = strtod(numbitsString, NULL); maxitr = strtod(maxIter, NULL); performRndSearch(numbits, maxitr, primesfileName, rndfileName); free(numbitsString); free(primesfileName); free(maxIter); free(rndfileName); } //maurer else if(strcmp(*argv, "maurer") == 0) { //Get hold of arguments char* numbitsString = malloc(100*sizeof(char)); int numbits = 0; char* primesfileName = malloc(100*sizeof(char)); char* rndfileName = malloc(100*sizeof(char)); //No, less or extra parameters for millerrabin if(argc-1 < 3 || argc-1 > 3) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //numbits if(argv[0][0]=='-' && argv[0][1]=='k' && argv[0][2]=='=') { //Get numbits from argv int i=0; for(i=3; i<strlen(*argv); i++) { numbitsString[i-3] = argv[0][i]; } numbitsString[i-3] = '\0'; } //primesfile else if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='=') { //Get primesfile from argv int i=0; for(i=3; i<strlen(*argv); i++) { primesfileName[i-3] = argv[0][i]; } primesfileName[i-3] = '\0'; } //rndfile else if(argv[0][0]=='-' && argv[0][1]=='r' && argv[0][2]=='=') { //Get rndfile from argv int i=0; for(i=3; i<strlen(*argv); i++) { rndfileName[i-3] = argv[0][i]; } rndfileName[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(numbitsString) == 0 || strlen(primesfileName) == 0 || strlen(rndfileName)==0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } numbits = strtod(numbitsString, NULL); performMaurer(numbits, primesfileName, rndfileName); free(numbitsString); free(primesfileName); free(rndfileName); } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } return EXIT_SUCCESS; }
int main(int argc, char **argv){ //help from: http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html //and http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt int c; unsigned int mvalue = UINT_MAX; unsigned long int cvalue = 1; int qflag = 0; int pflag = 0; unsigned long int numOfBitsInBitArray; while((c = getopt(argc, argv, "qm:c:p")) != -1) switch(c){ case 'm': mvalue = atoi(optarg); break; case 'c': cvalue = atoi(optarg); break; case 'q': qflag = 1; break; case 'p': pflag = 1; break; case '?': usageError(); } if((qflag == 1) && (pflag == 0) && (mvalue > 2)){ generatePrimes(mvalue, cvalue, &numOfBitsInBitArray); computeTwinPrimes(&numOfBitsInBitArray); free(bitArray); } else if((qflag == 1) && (mvalue > 2)){ generatePrimes(mvalue, cvalue, &numOfBitsInBitArray); free(bitArray); } else if ((qflag == 0) && (pflag == 0) && (mvalue > 2)){ generatePrimes(mvalue, cvalue, &numOfBitsInBitArray); printTwinPrimes(&numOfBitsInBitArray); free(bitArray); } else if((qflag == 0) && (mvalue > 2)){ generatePrimes(mvalue, cvalue, &numOfBitsInBitArray); printPrimes(&numOfBitsInBitArray); free(bitArray); } else if ((qflag == 0) && (mvalue == 2)){ printf("Primes:\n" "2\n" "There are no twin primes.\n"); } else if((qflag == 1) && (mvalue == 2)){ //do nothing } else{ //mvalue is less than 2 printf("There are no primes.\n"); } return 0; }