C ++长期费马原始性检验最大素数因子

时间:2015-10-25 19:10:18

标签: c++ algorithm primes

我对编程有点新意,现在正试图为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;
}

2 个答案:

答案 0 :(得分:2)

查看std::pow的{​​{3}}:

  

如果任何参数具有整数类型,则将其强制转换为双精度

因此在表达式pow(testNum, factor - 1)中,参数testNumfactor - 1被提升为双精度浮点数,结果则是双精度浮点数。

您不能在double上使用operator %,因为此运算符用于整数类型。向下转换pow的结果可能有效,但您可能很容易遇到整数溢出问题。

修改 有关如何进行此类大整数计算,请参阅documentation available

答案 1 :(得分:1)

@DanielStrul是正确的,你应该阅读它的解释,以了解如何做modular exponentiation

但是,您并不需要使用费马的测试。认为如果这个数字是复合数,它将至少有一个因子(不是最大的),而不是sqrt(n)

由于素数的密度大约是x/ln(x),你可以期望找到72000,质数更多或更少(公式完全),这不是那么大。

只需计算一百万以下的所有素数(使用筛子)。并一个接一个地尝试。当你找到一个因子时,继续分算n,直到你在n的因式分解中耗尽当前素数的所有幂。

当你用尽所有素数不到一百万(或n等于1时),n不是1而且它是最大的素数因素,或者最大的主要因素是你在上一步找到的最后一个素数。