找到素数的最佳方法

时间:2009-09-15 18:08:51

标签: c++

找到素数的最佳方法是什么,以便大大减少时间复杂度。

9 个答案:

答案 0 :(得分:42)

在查找素数时,Sieve of EratosthenesSieve of Atkin是两种可能的解决方案。 Eratosthenes筛选的复杂度为O((n log n)(log log n))。 Atkin的Sieve具有O的复杂度(N / log log n)。

如果您有一个号码并且想要查明它是否为素数,则称为执行primality test。天真的方法是检查从2到sqrt(n)的所有数字m并验证n%m不是0.如果你想稍微扩展它,你可以抛弃所有偶数(2除外)。这种天真的方法还有一些其他增强功能,可以提高性能,以及其他更先进的技术。

答案 1 :(得分:17)

如果要枚举素数,请使用sieve of Eratosthenes。如果要生成大素数,请生成随机奇数和check for primality

答案 2 :(得分:13)

如果它低于某个范围,最好的方法是在预先计算的列表中查找它。有很多,直到非常高的数字。

例如,在http://www.prime-numbers.org/

的所有素数高达10,000,000,000

答案 3 :(得分:12)

灵感来自xkcd

int findPrimeNumber() {
    return 2; // guaranteed to be prime
}

答案 4 :(得分:3)

如果你想生成从1到1的素数,那么最快的方法可能是实现here的轮式Sieve,它通常可以在平均笔记本电脑上测试超过3,000,000个候选素数(并且正在使用一种未优化的语言,如VB.net),并将非素数引导。在c ++中,它可以轻松快5到20倍。

答案 5 :(得分:1)

虽然有更高效的算法,但Miller-Rabin素性测试是最简单的测试之一。

答案 6 :(得分:1)

有两个不同的问题:

1)如何查找if a number是素数?如果您发现了一个有效的算法,那么您将在下一个2000年出名;)

2)如何查找the prime numbers最多N

可能这就是你要问的问题。 Sieve of Atkin是效率最高的N如果您的范围或限制AKS非常大。在合理的范围内,您可以实施Eratosthenes筛选的优化变体。我发现这两个网站非常有用:

编辑:@avakar

虽然我不仅仅是这个主题的初学者,但我认为{{1}}不是等待算法!来自同一个来源:

  

然而,一些复合数字也   满足等价。证明   AKS的正确性包括   表明存在适当的   小r和适当的小集   整数A这样的如果   在A中所有这样的等价都是等价的   然后n必须是素数。

答案 7 :(得分:0)

查看现有的资料库,例如OpenSSL和GNU MP。

答案 8 :(得分:-2)

我找到了一种方法。但可能它很长,但它的完美..没有缺陷。

package javaapplication4;
import java.io.*;
import java.util.*;

public class Main
{ 
    static Vector vprime = new Vector();
    static Vector vnotprime = new Vector();
    static Vector newVect = new Vector(new LinkedHashSet());
    static TreeSet<Integer> st = new TreeSet<Integer>();
    static int n = 0;
    static int starr[];    

    void prime()
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number to begin");
        int beg = sc.nextInt();
        System.out.println("Enter number to end");
        int end = sc.nextInt();
        try
        {
            for (int i = beg; i <= end; i++)
            {
                if (i == 1)
                {
                    vnotprime.add(i);
                    st.add(i);
                }
                if (i == 2)
                {
                    vprime.add(i);
                }
                if (i%2 != 0 && i%(Math.sqrt(i)) != 0)
                {
                    vprime.add(i);
                }
                if (i%2 == 0 && i != 2)
                {
                    vnotprime.add(i);
                    st.add(i);
                }
                if (i%(Math.sqrt(i)) == 0)
                {
                    vnotprime.add(i);
                    st.add(i);   
                }
                /*if (i%(Math.sqrt(i)) == 0 && i != 1)
                {
                    vnotprime.add(i);
                }*/
            }
        }
        catch(Exception ex)
        {
            System.out.println("Enter proper value");
        }   
    }

    void showprime()
    {
        System.out.println("Prime Numbers are");
        Iterator it = vprime.iterator();
        while (it.hasNext())
        {
            System.out.println(it.next());
            for (int i : st)
            {    
            }
        }
    }

    void shownonprime()
    {
        System.out.println("these are non-Prime Numbers are");
        Iterator it = st.iterator();
        int len = st.size(), k = 0;
        starr = new int[len];
        while (it.hasNext())
        {
            System.out.println(it.next());
        }
        for (int i:st)
        {
            starr[k++] = i;
        }
    }

    public static void main(String[] args) throws IOException, Exception
    {
        Main m = new Main();
        m.prime();
        m.showprime();
        m.shownonprime();
        for(int i = 0; i < starr.length; i++)
        {
            System.out.println("I got it " + starr[i]);
        }            
    }
}