java - 查找大范围内奇数位素数的算法

标签 java algorithm optimization

给定范围 [1, 1000000000],我们需要找到素数,并且素数的所有数字都必须是奇数。 (例如:23 不行,31 可以) 如果我们继续循环每个数字并检查它是否是素数等,那么速度会非常慢。有没有办法让它接近 O(N) ? 我试图通过首先查看数字来尽可能地消除。但在消除偶数之后,素数测试就太慢了。

  • 对于 [1, N] 中的所有数字
  • 检查所有数字,如果有偶数,则继续
  • 检查素数(这一步非常慢)

并且素性测试不应该非常复杂(概率等不可能,必须可以在几分钟内实现)。我用的是:

    private static boolean isPrime(int n) {
        boolean isPrime = true;
        for (int divisor = 2; divisor <= n / 2; divisor++) {
            if (n % divisor == 0) {
                isPrime = false;
                break;
            }
        }

        return isPrime;
   }

也许有一个技巧可以确保快速素性测试,但我找不到。有什么建议么?感谢您的阅读。

最佳答案

您不需要检查所有的百万数字。生成所有只有奇数位的数字 - 最多有 5^9~2 百万个。排除以 5 结尾的数字,并且不生成能被 3 整除的数字(在生成最后一位数字时)

然后检查这些数字的素数。请注意,循环限制可能是 sqrt(n)

Ideone

class Ideone
{
   static int oddcnt;

        public static void checkprime(int x) {
           for (int i=3; i <= Math.sqrt(x); i +=2)
              if ((x % i) == 0)
                 return;
             oddcnt++;
        }


    public static void genodd(int x, int curlen, int maxlen) {
        x *= 10;
        for (int i=1; i<10; i+=2) {
            int nx = x + i;
            checkprime(nx);
            if (curlen < maxlen)
                genodd(nx, curlen + 1, maxlen);
        } 
    }

    public static void main (String[] args) throws java.lang.Exception
    {

    genodd(0, 1, 8);
    System.out.println(oddcnt);
    }
}

关于java - 查找大范围内奇数位素数的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53863924/

相关文章:

algorithm - 图算法思想

java BlockingQueue和JDBC批量更新

java - 从 Spring Security 上下文访问应用程序上下文

java - 跨多个控制实例同步转换

java - 根据其他列表的 ID 匹配从列表中删除对象

c# - 如何确定数学表达式的求值顺序?

mysql - 高效的 MySQL 模式,对巨大的数据集进行分区(7.300.000.000 行和大约 80 GB 的数据)

c - 这是 Clang 优化器错误还是未定义的行为?

C 功能优化

java - JDK6 HTTP 服务器上带有 Spring 3 的 REST 服务