我想更快地完成这段代码。 它返回长数的所有因子(素数)。 如果longNumber是特定的,那么执行它显然需要几分钟。

int div = 2;
String factors = "";

while (longNumer != 1)
{
    if (longNumer % div == 0)
    {
        longNumer /= div;
        factors += div + " ";
    }
    else { div++; }
}

//longNumber = 10, gives: 2 5. 
//longNumber = 150, gives: 3 5 7.
//longNumber = 10523, gives: 17 619.

数字如“7544222046562688368”需要太长时间,而且不好,你会建议什么?

#1楼 票数:4

对于大数字,您可以使用Sieve of Eratosthenes算法首先找到最大为sqrt(n)的素数,然后您必须检查这些素数是否是因子

#2楼 票数:2

您可以使用以下步骤 -

1.找到所有素数<= sqrt(longNumber)。 并将它们保存在一个数组中 - primes
2.现在逐渐使用数组的元素 - primes作为除数来找到因子。

#3楼 票数:2

提出Eratosthenes筛选的答案对于你描述的数字不会有太大作用。 对于64位数字sqrt(2^64) = 2^32 ,这仍然很多。

对于那些,你最好的赌注是Pollard的Rho算法这里列出的更复杂的整数分解方法:

代数群分解算法,其中包括Pollard的p - 1算法,Williams的p + 1算法和Lenstra椭圆曲线分解算法。

费马的分解方法

欧拉的分解方法

特号现场筛

#4楼 票数:2

在比试验分割更快地实施其中一个分解算法之前,一个容易纠正的错误是避免在最后一个分段的sqrt之前进行试验分割。

while (longNumber != 1) {
    if (longNumber % div == 0) {
        longNumber /= div;
        factors += div + " ";
    }
    else {
        if (div*div>longNumber) {
            if (longNumber > 1)
                factors += longNumber + " ";
            break; // leave the while loop.  
        } 
        div++; 
    }
}

让两个最大的素数因子是P1和P2。 在您的版本中,您可以执行c P1操作。 在修改后的版本中,您可以执行c Max(sqrt(P1),P2)。 在7544222046562688368,改善应该是45的因素。

另一个改进是改变div ++线。 您不需要通过大于2的偶数进行试验除法,也可以通过大于3的3除以数字进行试验除法。避免这些加速计算的速度超过另一个因子2,并且您可以通过避免测试倍数来做得更好其他小素数。 但是,你不想花时间用小素数进行div的试验分割。 相反,你可以跟踪当前和允许的余数mod 2 * 3 * 5 * 7,比如说。 这被称为使用小轮子的轮子。

其他一些答案谈到了使用筛子找到所有小素数,然后仅使用试验除法。 如果你只考虑一个数字,这没有任何帮助,因为它需要很长时间来筛选出素数。 生成直到sqrt(n)的素数列表需要大约c sqrt(n)loglog n运算,而对于sqrt(n)的所有项的试验除法需要大约c sqrt(n)运算。 如果您需要考虑许多大数字,那么执行一次筛选并存储结果可能会有所帮助。

#5楼 票数:1

对64位整数进行分解的好方法是,它既简单编程又在实践中具有合理的效率,它结合了试验分区和Pollard的rho算法。 这是伪代码:

function factors(n)
    wheel := [1,2,2,4,2,4,2,4,6,2,6]
    w, f, fs := 0, 2, []
    while f*f <= n and f < 10000
        while n % f == 0
            fs, n := f :: fs, n / f
        f, w := f + wheel[w], w+1
        if w = 11 then w = 3
    if n == 1 return fs
    h, t, g, c := 1, 1, 1, 1
    while not isPrime(n)
        repeat
            h := (h*h+c) % n # the hare runs
            h := (h*h+c) % n # twice as fast
            t := (t*t+c) % n # as the tortoise
            g := gcd(t-h, n)
        while g == 1
        if isPrime(g)
            while n % g == 0
                fs, n := g :: fs, n / g
        h, t, g, c := 1, 1, 1, c+1
    return n :: fs

这使用2,3,5轮试验分割高达10000,然后简单实施rho算法; 它应该在几毫秒内将您的样品编号计算为7544222046562688368 = 2 * 2 * 2 * 2 * 7 * 7 * 14618561 * 658254407。 可以进行改进,但这应该足以让您入门。

  ask by Matt translate from so

未解决问题?本站智能推荐:

2回复

在给出其素数因子分解的情况下生成数字的所有因子

如果您已经对数字进行了素数分解,那么获得该数字的所有因子的最简单方法是什么? 我知道我可以从2循环到sqrt(n)并找到所有可分的数字,但这似乎效率低,因为我们已经有了素数分解。 我想它基本上是组合/选择功能的修改版本,但我似乎找到的只是计算组合数量的方法,以及计算因子数量的方法,而不是
3回复

以编程方式分解大量数字

好吧,所以我有一个巨大的数字f 。 实际上,这个数字只有100多位。 我知道这些因素的大小差不多。 如果我的资源和时间有限,我应该使用哪种语言和算法? 我包括在限制时间内对算法进行编码的时间长度。 思考? 编辑:有限,我的意思是在最短的时间内。
3回复

确定可以被分解为2 ^ p5 ^ q的数字集的算法

我正在尝试编写一个算法,该算法可以返回小于实例n的正整数集,并且可以将其分解为2 ^ p5 ^ q。 我的数学不是最好的,所以我不知道如何确定一个数字是否可以用这种特定的形式分解... 任何帮助将非常感激 :)
9回复

最快的整数分解算法是什么?

我写了一个程序,试图找到友好对。 这需要找到数字的适当除数的总和。 这是我当前的sumOfDivisors()方法: int sumOfDivisors(int n) { int sum = 1; int bound = (int) sqrt(n); for(int i
2回复

Pollard rho整数分解

我试图在C / C ++中实现Pollard Rho整数分解.Google在这里给我一个Java实现的问题。 我不太了解Java,所以我想到了这一点。我在C ++中的实现适用于大多数情况但不是很少像我在那里使用的“9999”。 我知道C ++没有Biginteger类,所以我不能拥有
4回复

用于java或scala中的整数分解的库

关于如何实现分解有很多问题,但是对于生产用途,我宁愿使用开源库来获得高效的东西并立即进行测试。 我正在寻找的方法如下: 对于n = 12,它将返回{2,2,3} 库也可能具有处理long或甚至BigInteger类型的重载 问题不是关于特定的应用程序,而是关于有一个处理这个
1回复

如何在Java中优化此代码?

您好,我在Java中执行分解函数,但是计算却要花费很多时间,我尝试在互联网上看到一些定理,但结果是相同的。 您能建议我一些算法以最快的速度执行此分解吗? 此代码大约需要2分钟。
1回复

Java代码优化会导致数字不准确和错误

我正在尝试用Java实现Fuzzy C-Means算法的一个版本,我试图通过计算一次只能计算一次的所有内容来进行一些优化。 这是一个迭代算法,关于矩阵的更新, 像素x簇成员矩阵U (行中值的总和必须为1.0),这是我想要优化的更新规则: 其中x是矩阵X的元素( 像素x特征 ),v属