这是我能找到最大素数的最佳方法吗?

时间:2016-12-30 09:18:47

标签: java primes

我试图找到我可以拥有的素数,直到最大的两个产品超过Long.MAX_VALUE。

这需要超过半小时(和GB的RAM)

public class Main {
    public static void main(String[] args) {
        ArrayList <Long> primes= new ArrayList<Long>();
        primes.add(2L);
        long i=3L;
        // Looping from 3, to the limit
        while (primes.size()<2||(primes.get(primes.size()-1)*primes.get(primes.size()-2)<Long.MAX_VALUE)) {             
            boolean isPrime = true;
            long maxDiv =Math.round(Math.sqrt(i));
            int j=0;
                while(primes.get(j)<maxDiv && isPrime) {
                if (i % primes.get(j) == 0) {
                    isPrime = false;
                }
                j++;
            }        
            if (isPrime) {
                primes.add(i);
                System.out.println(i);
            }
            i=i+2;
        }
        System.out.println("max size is: "+primes.size());
    }
}

修改

我也对达到此限制之前获得的素数感兴趣。因此,自上而下的方法无法完成这项工作。

无论如何,我意识到我能够在我的应用程序中找到这两个数字,在此期间我会变得富裕起来:)

1 个答案:

答案 0 :(得分:1)

应该有更快的方法来做到这一点。请考虑以下事项:

  • 使用筛子或Eratosthenes获取2Sqrt(Long.MAX_VALUE)之间的数字
  • 在筛子发现的最后一个素数(next)之后找到下一个素数(last)。
  • 如果next*last已经大于Long.MAX_VALUE您已完成。
  • 如果找不到next之后的下一个黄金编号(让我们称之为next2
  • next*next2大于Long.MAX_VALUE

Eratosthenes的筛子时间复杂度为O(n*log(log(n))

你只需要蛮力&#34; 2个大于Sqrt(Long.MAX_VALUE)的素数。加上计算筛子所需的时间,这应该比你的方法快得多!

至于你必须计算素数:

计算筛子时,很容易计算质数的数量!