Java 如何有效地实现Eratosphenes方法生成素数?

Java 如何有效地实现Eratosphenes方法生成素数?,java,Java,我在代码中使用以下组件: 一个字节数组,每一位表示对应的数字是素数(0)还是素数(1) filter.filter()的递归 我想确定这些部件是提高了效率,还是实际上减慢了速度。任何其他建议也将不胜感激 代码: import java.lang.Math; 导入java.util.*; 类容器{ 公共最终字节[]二进制数组; 专用最终整数位长度; 公共容器(整数标称位长度){ int字节长度=(int)Math.ceil(标称位长度/8.0); this.binary_数组=新字节[字节长度

我在代码中使用以下组件:

  • 一个字节数组,每一位表示对应的数字是素数(0)还是素数(1)
  • filter.filter()的递归
我想确定这些部件是提高了效率,还是实际上减慢了速度。任何其他建议也将不胜感激

代码:

import java.lang.Math;
导入java.util.*;
类容器{
公共最终字节[]二进制数组;
专用最终整数位长度;
公共容器(整数标称位长度){
int字节长度=(int)Math.ceil(标称位长度/8.0);
this.binary_数组=新字节[字节长度];
this.bit_length=8*字节长度;
}
私有字符串toBinaryString(int index){//将索引引用的位号所在的字节值转换为二进制字符串
int byte_index=index/8;
//系统输出打印项次(索引);
String str=Integer.tobinarysting(这个.binary_数组[字节索引]);
字符串格式=(“00000000”+str).substring(str.length());
返回格式;
}
公共字符获取(int索引){
String str=this.toBinaryString(索引);
返回str.charAt(索引%8)//
}
公共字符集(int索引,字符值){
StringBuilder str=new StringBuilder(this.toBinaryString(index));
字符温度=str.charAt(索引%8)//
str.setCharAt(索引%8,值)//
int byte_index=index/8;
this.binary_数组[byte_index]=(byte)Integer.parseUnsignedInt(str.toString(),2);
返回温度;
}
公共整数长度(){
返回此.bit_长度;
}
公共静态容器预置(){
容器c=新容器(8);
c、 集合(1-1,'1');
c、 集合(4-1,'1');
c、 集合(6-1,'1');
c、 集合(8-1,'1');
返回c;
}
}
类筛选器{
私有静态void filterMultiplesOf(int num,容器){
如果(num==1){
返回;
}
int i=2;
而((i*num-1)num+“”).forEach(System.out::print);
}
}
除此之外:

import java.lang.Math;
import java.util.*;

/**
* Variation of BitSet which does NOT interpret the highest bit synonymous with
* its length.
*
* @author casper.bang@gmail.com
*/
class FixedBitSet extends BitSet{

    int fixedLength;

    public FixedBitSet(int fixedLength){
        super(fixedLength);
        this.fixedLength = fixedLength;
}

    @Override
    public int length() {
        return fixedLength;
    }
}


class Screener{

    private static FixedBitSet preset;

    static{
            preset = new FixedBitSet(4);
            preset.set(1-1, true);
            preset.set(4-1, true);
    }

    private static void filterMultiplesOf(int num, FixedBitSet bitset){
            //System.out.println("--------");

            if (num == 1){
                    return;
            }

            int i = 2;
            while ((i * num - 1) < bitset.length()){
                    bitset.set(i * num - 1, true);
                    i++;
            }
    }

    public static void filter(FixedBitSet bitset){
            //System.out.println("--------");

            int num = bitset.length();
            if (num <= 4){
                    //System.out.println("--------");
                    bitset = preset;
            } else{
                    FixedBitSet base = new FixedBitSet((int)Math.floor(Math.sqrt(num)));
                    filter(base);
                    for (int i = 0; i < base.length(); i++){
                            if(!base.get(i)){
                                    filterMultiplesOf(i + 1, bitset);
                            }
                    }
            }

    }
}

public class Prime3{

    public static void main(String[] args){
            Scanner reader = new Scanner(System.in);
            int num = reader.nextInt();
            FixedBitSet bs = new FixedBitSet(num);
//                System.out.println(bs.length());
            Screener.filter(bs);

            for (int i = 1; i < bs.length(); i++){
                    if(!bs.get(i)){
                            System.out.print((i + 1) + " ");
                    }
            }
    }
}
import java.lang.Math;
导入java.util.*;
/**
*位集的变体,它不解释与
*它的长度。
*
*@作者卡斯珀。bang@gmail.com
*/
类FixedBitSet扩展了位集{
整型固定长度;
公共固定位集(int-fixedLength){
超级(固定长度);
this.fixedLength=fixedLength;
}
@凌驾
公共整数长度(){
返回固定长度;
}
}
类筛选器{
私有静态固定比特集预置;
静止的{
预设=新的固定位集(4);
预设。设置(1-1,真);
预设。设置(4-1,真);
}
私有静态void filterMultiplesOf(int num,FixedBitSet位集){
//系统输出打印项次(“----------”);
如果(num==1){
返回;
}
int i=2;
while((i*num-1)
相反,编写使用低级位操作运算符(如
~
&
|
)实现
获取
设置
)的代码

如果你没有达到这一点,那么考虑使用<代码> BITSET ,一个提供相同用途的JDK类。


如果您想了解它是如何完成的,那么只需打开
位集
的源代码即可。

在实现位掩码时遇到太多问题;我更喜欢使用位集。非常感谢。如果您参加面试,使用位掩码的练习将非常方便:)
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;


public class PrimeGenerator {



    public static Set<Integer> prime(int num){
            if (num <= 2){
                    Set<Integer> foo = new HashSet<>();
                    foo.add(2);
                    return foo;
            }
            IntStream stream = IntStream.rangeClosed(1, num);
            Set<Integer> base = prime((int)Math.ceil(Math.sqrt(num)));
            IntStream multiples = base.stream().flatMapToInt((factor) -> (IntStream.rangeClosed(2, (int)Math.floorDiv(num, factor)).map(n -> n * factor)));
            Set<Integer> primeset = stream.collect(HashSet::new, HashSet::add, HashSet::addAll);
            Set<Integer> nonprimeset = multiples.collect(HashSet::new, HashSet::add, HashSet::addAll);
            primeset.removeAll(nonprimeset);
            primeset.remove(1);
            return primeset;
    }

    public static void main(String[] args) {
            // TODO code application logic here
            prime(100000).stream().map(num -> num + "  ").forEach(System.out::print);
    }

}
import java.lang.Math;
import java.util.*;

/**
* Variation of BitSet which does NOT interpret the highest bit synonymous with
* its length.
*
* @author casper.bang@gmail.com
*/
class FixedBitSet extends BitSet{

    int fixedLength;

    public FixedBitSet(int fixedLength){
        super(fixedLength);
        this.fixedLength = fixedLength;
}

    @Override
    public int length() {
        return fixedLength;
    }
}


class Screener{

    private static FixedBitSet preset;

    static{
            preset = new FixedBitSet(4);
            preset.set(1-1, true);
            preset.set(4-1, true);
    }

    private static void filterMultiplesOf(int num, FixedBitSet bitset){
            //System.out.println("--------");

            if (num == 1){
                    return;
            }

            int i = 2;
            while ((i * num - 1) < bitset.length()){
                    bitset.set(i * num - 1, true);
                    i++;
            }
    }

    public static void filter(FixedBitSet bitset){
            //System.out.println("--------");

            int num = bitset.length();
            if (num <= 4){
                    //System.out.println("--------");
                    bitset = preset;
            } else{
                    FixedBitSet base = new FixedBitSet((int)Math.floor(Math.sqrt(num)));
                    filter(base);
                    for (int i = 0; i < base.length(); i++){
                            if(!base.get(i)){
                                    filterMultiplesOf(i + 1, bitset);
                            }
                    }
            }

    }
}

public class Prime3{

    public static void main(String[] args){
            Scanner reader = new Scanner(System.in);
            int num = reader.nextInt();
            FixedBitSet bs = new FixedBitSet(num);
//                System.out.println(bs.length());
            Screener.filter(bs);

            for (int i = 1; i < bs.length(); i++){
                    if(!bs.get(i)){
                            System.out.print((i + 1) + " ");
                    }
            }
    }
}