找到素数的最佳方法是什么,以便大大减少时间复杂度。
答案 0 :(得分:42)
在查找素数时,Sieve of Eratosthenes和Sieve 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)
如果它低于某个范围,最好的方法是在预先计算的列表中查找它。有很多,直到非常高的数字。
的所有素数高达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]);
}
}
}