00001-质数续(转)

来源:互联网 发布:mac matlab 编辑:程序博客网 时间:2024/05/18 03:37

 求质数,效率最高的一种方法。

首先建立一个布尔型1维数组a,长度为j-i,初始值为true。

先用第二种方法求得i、j之间的第一个质数m。求得m以后,将所有小于i的m的倍数所在的数组(即a[m的倍数-i])位置全部设为false。

然后进行下一步,从n=m++开始,如果a[n-i]已经被设置为false,则n++,直到出现首个为true的位置p,再将所有小于i的p的倍数所在的数组位置置为false。

继续下一步,直到n>根号j为止,这样所有为true的数组id(如果i=1则0除外,id从1开始)+i 即为质数。

说的比较复杂,举个例子。

例如要查找2-100之间的质数,首先2是质数,把2的倍数去掉(比如4,6,8,...,100,对应的数组位置是a[m-2]即a[2],a[4],a[6],...,a[98],将这些位置设为false);

进行下一步,此时3没有被去掉(a[2]=true),可认为是质数,所以把3的倍数去掉(a[5]a[8]a[11],...,a[98]=false);

再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数的最小质数因子肯定小于等于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。

最后只要将a[id]中所有等于true的id值加上i输出即可。按照这个例子是id+2,比如0+2,1+2,3+2,...
相对来说这种算法求1到n之间的质数实现起来比较简单,如果是求任意两个数之间的质数,逻辑上会比较复杂。但是,效率的确提高了很多很多。

 

import java.util.*;public class BitSetTest {public static void main(String[] args) {BitSet sieve = new BitSet(1024);int size = sieve.size();for (int i = 2; i < size; i++)sieve.set(i);int finalBit = (int) Math.sqrt(sieve.size());for (int i = 2; i < finalBit; i++)if (sieve.get(i))for (int j = 2 * i; j < size; j += i)sieve.clear(j);int counter = 0;for (int i = 1; i < size; i++) {if (sieve.get(i)) {System.out.printf("%5d", i);if (++counter % 15 == 0)System.out.println();}}}}


 

原创粉丝点击