【发布时间】:2023-03-24 23:40:01
【问题描述】:
目前我有这个限制为 n
筛子:
public class Main {
public static void main(String args[]){
long N = 2000000000;
// initially assume all integers are prime
boolean[] isPrime = new boolean[N + 1];
for (int i = 2; i <= N; i++) {
isPrime[i] = true;
}
// mark non-primes <= N using Sieve of Eratosthenes
for (int i = 2; i*i <= N; i++) {
// if i is prime, then mark multiples of i as nonprime
// suffices to consider mutiples i, i+1, ..., N/i
if (isPrime[i]) {
for (int j = i; i*j <= N; j++) {
isPrime[i*j] = false;
}
}
}
}
}
如何修改它以超过 n = 2^32-1?
【问题讨论】:
-
创建另一个数组? :)
-
@alfasin 有没有更好的方法来做到这一点?比如以编程方式创建更多空间,可能是在二维数组中?
-
用例是什么?我用过很多次筛子,从来没有真正需要过尺寸 > 10^7
-
@vish4071 这只是我一直在做的一个项目。
-
项目很好。我的意思是,筛子实现的瓶颈是它需要大量的内存。大多数(通用)语言并没有提供那么多。即使使用
boolean数组来计算最多 2^32 个素数也不错,但肯定会花费很多时间。 (复杂度是O(n loglog n),是最优化的实现,我见过的大部分实现复杂度都是O(n log n))
标签: java algorithm primes sieve-of-eratosthenes