unsigned long Primer::calculatePrime(unsigned long num) { if (num > MAX_PRIME_NUM) { std::cout << "Number to big, max is " << MAX_PRIME_NUM << std::endl; return 0; } if (num >= foundPrimes.size()) { std::cout << "Prime #" << std::setw(10) << num + 1 << " not known. Calculating from #" << std::setw(10) << foundPrimes.size() << std::endl; try { if (num >= MAX_PRIME_NUM / 2) { foundPrimes.reserve(MAX_PRIME_NUM); } else { foundPrimes.reserve(num + 1); } } catch (std::bad_alloc& ex) { fprintf(stderr, "Failed to allocate more memory: %s\n", ex.what()); return 0; } startTime = std::chrono::high_resolution_clock::now(); try { for (unsigned long i = foundPrimes.size(); i <= num; i++) { calculateNextPrime(i); } } catch (std::exception& ex) { fprintf(stderr, "Failed to calculate prime: %s\n", ex.what()); return 0; } } return foundPrimes[num]; }
/* factorized a number into prime numbers and registers the result in the arrays */ void primeFactorization (int number, int primes[MAX_PRIMES], int instancesCount[MAX_PRIMES], int primesUsed[MAX_PRIMES], int *maxPrimeDefined, int *primesUsedCount) { int currentPrimeIndex = 0; #ifdef debug_on printf("primeFactorization(%d)\n",number); #endif while (number > 1) { if (currentPrimeIndex > *maxPrimeDefined) { primes[currentPrimeIndex] = calculateNextPrime(primes[currentPrimeIndex-1]); *maxPrimeDefined = *maxPrimeDefined; } while (number % primes[currentPrimeIndex] == 0) { number = number / primes[currentPrimeIndex]; if (instancesCount[currentPrimeIndex] == 0) { primesUsed[*primesUsedCount] = currentPrimeIndex; *primesUsedCount = *primesUsedCount + 1; } instancesCount[currentPrimeIndex] = instancesCount[currentPrimeIndex] + 1; #ifdef debug_on printf("%d\n",primes[currentPrimeIndex]); #endif } currentPrimeIndex++; } }