筛选后找到素因的最快方法

时间:2015-10-05 15:53:47

标签: performance time-complexity primes sieve-of-eratosthenes factorization

primes之后,我已将所有素数存储在向量sieve中的范围内。现在我想在短时间内找到n的所有主要因素。

我的代码:

    i=0
    while(primes[i]<=n)
    {
        if(n%primes[i]==0)
        {
           cout<<primes[i]<<endl;
        }
        while(n%primes[i]==0)
            n/=primes[i];
        i++;
    }

但这不高效,请建议任何可能的修改。 谢谢!

3 个答案:

答案 0 :(得分:1)

我认为这应该更有效率,因为我消除了代码中的其他循环。我在C#中进行了测试,除了我用硬编码测试它。

我认为这是您想要看到的代码。希望它更有效率。我用C#编写它并没有素数列表所以我硬编码(或者足够我的例子)

我认为代码将基于您的代码

i = 0
while(n > 1)
{
    if(n % primes[i] == 0)
    {
       cout<<primes[i]<<endl;
       n /= primes[i];
    }
    else
        i++;
}

我在C#编写的代码,我认为模仿你的代码或者至少我认为你在做什么。

        int n = 1806046;
        int[] primes;
        primes = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 439, 601, 733, 941, 1151 };
        int i = 0;
        while (n > 1)
        {
            if (n % primes[i] == 0)
            {
                comboBox1.Items.Add(primes[i]);
                n /= primes[i];
            }
            else
                i++;
        }

这是我测试过的代码,并以C#为基础。哪个工作得很好并且迭代了所有数字而不仅仅是素数。

        int x = 1806046;
        int i = 2;

        while (x > 1)
        {
            if (x % i++ == 0)
            {
                x /= --i;
            }
        }

答案 1 :(得分:1)

您正在检查n以前的所有素数。你不需要这样做。一旦你删除了所有因素,并且包括sqrt(n),那么剩下的未被证实的部分本身就是素数或者是1。

您可以在n == 1时退出外循环,因为找不到更多素因子。想想像16这样的数字,有许多小的素因子。

每次通过外循环进入内循环。你不需要这样做;当if为真时,你只需要内循环。

进入if后,您可以通过将while循环更改为do循环来保存重复模数计算。

i = 0;

// Find prime factors up to square root.
limit = sqrt(n);
while ((primes[i] <= limit) && (n > 1))
{
    if (n % primes[i] == 0)
    {
       cout << primes[i] << endl;
       do 
       {
           n /= primes[i];
       } while (n % primes[i] == 0);
    }
    i++;
}

// Find possible factor above square root.
if (n > 1) 
{
    cout << n << endl;
}

我没有对代码进行测试,所以最好自己测试一下。

答案 2 :(得分:0)

解决这个问题的关键是理解只有一个素数&gt; = square_root(N)。

因此,您可以遍历主要列表到square_root(N)。您可以执行以下代码:

Factor generation