В настоящее время я работаю над программой на C ++, конечной целью которой является отображение списка основных факторов для данного значения, вплоть до предела unsigned long int
,
Он использует пробное деление для первых 1000 простых чисел и использует метод факторизации Ферма для каждого последующего значения.
В целом, я бы сказал, что программа работает нормально для большинства номеров, с которыми я ее тестировал, включая некоторые большие числа. Тем не менее, я, кажется, столкнулся с определенными цифрами. Например, когда простое число 18446744073709551557 введен, он падает полностью. Для других больших значений, таких как 246819835539726757, он правильно отображает первые пять простых факторов (7, 11, 37, 131 и 557), но неправильно рассчитывает последние два, которые должны быть 18379 и 64601.
Код для функции выглядит следующим образом:
std::list < unsigned long int >primeFactors(unsigned long int n)
{
bool complete = false;
std::list<unsigned long int> factors;
unsigned long int ans1 = 0;
unsigned long int ans2 = 0;
int a;
int b;
// If n is 0 or 1, return a blank list
//
// This is run outside the while loop, as n will never be 0 or 1 after
// the initial calculation
if (n == 0 || n == 1)
{
complete = true;
return factors;
}
while (complete == false)
{
// if n is a prime number, add to the list and return
if (isPrime(n) == true)
{
factors.push_back(n);
complete = true;
return factors;
}
// if n is even (i.e. divisible by 2), add 2 and n/2 to the list and
// return
else if (divisibleByPrime(n) != 0)
{
unsigned long int divisor = divisibleByPrime(n);
ans1 = divisor;
ans2 = n / divisor;if (isPrime(ans1) == true && isPrime(ans2) == true)
{
factors.push_back(ans1);
factors.push_back(ans2);
complete = true;
return factors;
}
else
{
if (isPrime(ans1) == true)
{
factors.push_back(ans1);
n = ans2;
}
else
{
factors.push_back(ans2);
n = ans1;
}
}
}
else
{
// a is the square root of n + a^2
unsigned long int i = 1;
float squareRoot;
std::stringstream ss;
std::string str;
bool isDouble = true;
bool answerFound = false;
unsigned long int x;
unsigned long int y;
while (answerFound == false)
{
isDouble = false;
squareRoot = (float)sqrt(n + (i * i));
ss << squareRoot;
str = ss.str();
for (char& i : str)
{
if (strchr(".", i) != NULL)
{
isDouble = true;
}
}
if (isDouble == true)
{
ss.str("");
i += 1;
}
else
{
answerFound = true;
}
}
x = (unsigned long int) squareRoot;
y = i;
ans1 = x + y;
ans2 = x - y;
if (isPrime(ans1) == true && isPrime(ans2) == true)
{
factors.push_back(ans1);
factors.push_back(ans2);
complete = true;
return factors;
}
else
{
if (isPrime(ans1))
{
factors.push_back(ans1);
n = ans2;
}
else
{
factors.push_back(ans2);
n = ans1;
}
}
}
}
Я не включил такие функции, как isPrime
или же divisibleByPrime
так как оба, кажется, работают нормально в изолированной среде.
РЕДАКТИРОВАТЬ: Я ценю, что некоторые переменные в данный момент немного беспорядочные, но я планирую исправить это в ближайшее время.
Задача ещё не решена.
Других решений пока нет …