gpt4 book ai didi

java - 这是我找到我可以处理的最大质数的最好方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:38 25 4
gpt4 key购买 nike

我试图找出在最大两个的乘积超过 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());
}
}

编辑

我还想知道在达到此限制之前我得到了多少素数。因此,自上而下的方法无法胜任这项工作。

无论如何,我意识到我可以在我的申请中达到这两个数字,同时我会变得非常富有:)

最佳答案

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

  • 2Sqrt(Long.MAX_VALUE)
  • 之间的数字使用筛法或 Eratosthenes
  • 在筛子找到的最后一个素数 (last) 之后找到下一个素数 (next)。
  • 如果 next*last 已经大于 Long.MAX_VALUE 你就完成了。
  • 如果在 next 之后找不到下一个质数(我们称之为 next2)
  • next*next2 大于 Long.MAX_VALUE

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

您只需“暴力破解”2 个大于 Sqrt(Long.MAX_VALUE) 的素数。加上计算筛子所需的时间,这应该比您的方法快得多!


到了必须数素数的地步:

在计算筛子的同时计算素数的个数真的很容易!

关于java - 这是我找到我可以处理的最大质数的最好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com