16楼的代码在找规律上花了不少心血, 是不得不爱版主写的, 欣赏~~~
暂时叫这种方法为"素数相除法"吧, 也不知道对不对.
找到的这个规律还是有局限性的, 而且当取素数的范围超过1-10000, 就会出错, 必须再用101-1000以内或其他高位更多的素数除以10000以后的各数才能保证取到的为素数, 显然这种处理方法就不适宜处理更大的数了. 但求1-10000以内的素数效率还是很高的.
素数相除法: 先用10以内的素数除以100以内有各数, 得到1-100的素数, 再用1-100内的素数除以101-10000以内的数, 得到1-10000以内的素数.
下面是两种算法对求1-11000以内素数和的结果, 素数相除法因为没有采用更高位的素数除10000以后的数, 把一些非素数也判断成了素数. 素数和也更大.
筛法: 1-11000范围内素数和为:的6848586
素数相除法: 1-11000范围内素数和为:6890606
平时我们常用的是筛法求素数(算法在15楼), 但看了namejm版主4楼给出的页面链接印度计算机专家给出的新的算法, 说在处理更大的数时要快很多.
可是网页中给出的算法好像是用伪代码写的, 怎么看也看不懂. 先存好, 再细细去想吧~~~
素数判定算法
(当且仅当n为素数时,最终输出数才为素数)
(当且仅当n为素数时,最终输出数才为素数)
Input: integer n>1
1. if ( n is the form of a^b, b>1) output Composite;
2. r = 2;
3. while (r)
4. if (gcd(n,r)1) output Composite;
5. if (r is the prime)
6. let q be the largest factor of r-1;
7. if (q>= 4 * (r^(1/2)) * log(n)) and (n^((r-1)/q))) mod r 1)
8. break;
9. r:=r+1;
10. {
11. for a := 1 to 2*(r^(1/2))*log(n);
12.if ((x-a)^n mod n(x^n-a)) and ((x-a)^n mod (x^r -1)(x^n-a))output Composite;
13.output Prime;
Last edited by pengfei on 2007-1-25 at 10:53 AM ]