使用筛子查找小于 LONG 数的素数
finding prime numbers less than a LONG number using sieve
我必须找出小于或等于给定数 n
的质数个数。我正在使用埃拉托色尼筛法寻找素数。
这是我写的代码:
static int find_prime(int n) {
boolean[] arr = new boolean[n+1];
Arrays.fill(arr, true);
for(int i=2;i<=n;i++) {
if(arr[i]==true) {
for(int j=2*i; j<=n; j+=i)
arr[j] = false;
}
}
int count=0;
for(int i=2;i<=n;i++) {
//System.out.print(arr[i]+" ");
if (arr[i] == true)
count++;
}
return count;
}
此代码适用于 integer
个值,但我必须为 long
个数字实现它。 Java 不允许创建 long
大小的数组,因此 boolean[] arr = new boolean[n+1];
不起作用。
有人可以建议我解决这个问题的方法吗?
您将没有足够的内存来表示整个筛子,因为它是以 EB 为单位的。甚至 BitSet
is not going to fit all the indexes that you need, because ultimately it uses 一个 long
的数组来存储位。
您可以通过混合方法找到答案:
- 建造并 运行 筛子达
Integer.MAX_VALUE
- 将最多
Integer.MAX_VALUE
个素数收集到 long
个 数组中
- 观察到您可以在达到候选数的平方根时停止检查除数
c
- 这意味着您已经拥有所有高于
Integer.MAX_VALUE
的值的潜在除数
- 使用除数数组过滤
Integer.MAX_VALUE
和 n
之间的数字
由于您不需要在 Integer.MAX_VALUE
之后存储额外的素数,因此您的代码不会 运行 内存不足。
我必须找出小于或等于给定数 n
的质数个数。我正在使用埃拉托色尼筛法寻找素数。
这是我写的代码:
static int find_prime(int n) {
boolean[] arr = new boolean[n+1];
Arrays.fill(arr, true);
for(int i=2;i<=n;i++) {
if(arr[i]==true) {
for(int j=2*i; j<=n; j+=i)
arr[j] = false;
}
}
int count=0;
for(int i=2;i<=n;i++) {
//System.out.print(arr[i]+" ");
if (arr[i] == true)
count++;
}
return count;
}
此代码适用于 integer
个值,但我必须为 long
个数字实现它。 Java 不允许创建 long
大小的数组,因此 boolean[] arr = new boolean[n+1];
不起作用。
有人可以建议我解决这个问题的方法吗?
您将没有足够的内存来表示整个筛子,因为它是以 EB 为单位的。甚至 BitSet
is not going to fit all the indexes that you need, because ultimately it uses 一个 long
的数组来存储位。
您可以通过混合方法找到答案:
- 建造并 运行 筛子达
Integer.MAX_VALUE
- 将最多
Integer.MAX_VALUE
个素数收集到long
个 数组中
- 观察到您可以在达到候选数的平方根时停止检查除数
c
- 这意味着您已经拥有所有高于
Integer.MAX_VALUE
的值的潜在除数
- 使用除数数组过滤
Integer.MAX_VALUE
和n
之间的数字
由于您不需要在 Integer.MAX_VALUE
之后存储额外的素数,因此您的代码不会 运行 内存不足。