我对编程有点新意,现在正试图为Project Euler寻找最大的素数因子600851475143。当我真正尝试进行Fermat Primality测试时,我的代码将无法编译。
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
int main () {
long long int num = 600851475143;
long long int factor = num / 2;
for (long long factor; factor > 0; factor--) {
//Use Fermat primality test.
if (num % factor == 0) {
long long int testNum1 = rand() % 50 + 1;
long long int testNum2 = rand() % 50 + 1;
long long int test1 = (pow(testNum1, factor - 1) % factor);
long long int test2 = (pow(testNum2, factor - 1) % factor);
if (test1 == 1 && test2 == 1){
cout << "The greatest prime factor is: " << factor;
break;
}
}
}
return 0;
}
答案 0 :(得分:2)
查看std::pow
的{{3}}:
如果任何参数具有整数类型,则将其强制转换为双精度
因此在表达式pow(testNum, factor - 1)
中,参数testNum
和factor - 1
被提升为双精度浮点数,结果则是双精度浮点数。
您不能在double上使用operator %
,因为此运算符用于整数类型。向下转换pow
的结果可能有效,但您可能很容易遇到整数溢出问题。
修改强> 有关如何进行此类大整数计算,请参阅documentation available。
答案 1 :(得分:1)
@DanielStrul是正确的,你应该阅读它的解释,以了解如何做modular exponentiation
。
但是,您并不需要使用费马的测试。认为如果这个数字是复合数,它将至少有一个因子(不是最大的),而不是sqrt(n)
。
由于素数的密度大约是x/ln(x)
,你可以期望找到72000,质数更多或更少(公式不完全),这不是那么大。
只需计算一百万以下的所有素数(使用筛子)。并一个接一个地尝试。当你找到一个因子时,继续分算n
,直到你在n
的因式分解中耗尽当前素数的所有幂。
当你用尽所有素数不到一百万(或n
等于1
时),n
不是1
而且它是最大的素数因素,或者最大的主要因素是你在上一步找到的最后一个素数。