Example #1
0
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++;
	}
}