1 / 27
文档名称:

素数的几种判断方法和实现-word.docx

格式:docx   大小:23KB   页数:27页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

素数的几种判断方法和实现-word.docx

上传人:文库旗舰店 2022/8/18 文件大小:23 KB

下载得到文件列表

素数的几种判断方法和实现-word.docx

相关文档

文档介绍

文档介绍:BY:Lw
PS:本来没有决心把这个东西写完的,结果早上写到一半,出去吃个饭,没保存,回来手一抖直接
关掉了,好不容易写了一大半了,只能重新写了,坑爹啊,但就是这个插曲,本来还没有决心的我,
一下子却坚定了信念,一点要把这个东西写完。1 == 0) return 0;
}
return 1;
}
最后,来看一下这个牛逼的小学生,
确实,对于一个小学生,能够这么牛逼的想到这么多优化,
已经很强大了。
不过其实没什么必要。。。。。。
这里 的 i+=2,是因为,偶数除了2之外,是不可能是素数的、
所以从3开始,直接 +2 。进一步优化。
这个大概就是 朴素判断素数 方法的最佳优化了。(也许你还有更好的优化)
所以,如果是对于一般的素数判断的话,用上面那个代码吧
小学生毕业了,到了中学,会有怎样的成长呢?
下面来看看中学生们是怎么样判断的。
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
二、 埃拉托斯特尼 筛选法
═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼
(Eratosthenes .~.)提出的一种筛选法。
BY:Lw
是针对自然数列中的自然数而实施的,用于求一定范围内的质数,
它的容斥原理之完备性条件是p=H~。
可参考:
/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF%E7%89
%B9%E5%B0%BC%E7%AD%9B%E6%B3%95
基本原理:
筛素数的基本方法是用来筛选出一定范围内的素数素数筛法的基本原理,利用的是素数p只有1和p
这两个约数,并且一个数的约数一定不大于本身,素数筛法的过程:
把从1开始的、某一范围内的正整数从小到大顺序排列,
1不是素数,首先把它筛掉。
剩下的数中选择最小的数是素数,然后去掉它的倍数。
依次类推,直到筛子为空时结束。
求解用途:
素数筛法经常作为一道题的一部分用来打一定范围内素数表,
然后利用素数表作为基础解题。
*/
1. 老实的中学生的做法
#define MAX 10001
bool isprime[MAX];
void TheSieveofEratosthees()
{
int i, j;
for(i = 2; i < MAX; i++)
isprime[i] = 1;
for(i =2; i< MAX; i++)
{
if(isprime[i])
for(j = i+i;j < MAX; j+=i)
isprime[j] = 0;
}
}
执行完本算法之后,isprime[i]中如果是1,表示i为素数,0,表示i不是素数。
BY:Lw
所以呢,这个算法执行完一遍之后,就可以在O(1)的时间内判断出MAX以内的任意数,是不是素数
了,所以这个算法消耗的时间可以说全部在筛选上了。初看这个算法,会觉得这个算法的时间复杂
度是O(N^2),,但其实不是的,在第二个循环中,每次递增的i,当i越来也大的时候,j很快就能超
过MAX的,筛选法的实际复杂度是 O(n*log(logn))
2. 有思想的中学生的做法
#define MAX 10001
bool isprime[MAX];
int p[MAX];
void prime(int n)
{
memset(isprime, 0, sizeof(isprime));
memset(p, 0, sizeof(p));
int np = 0, i, j;
for(i = 2; i <= n; i++)
{
if(!isprime[i]) p[np++] = i;
for(j = 0; j< np &&p [j]*i <= n; j++)
{
isprime[p[j]*i] = 1;
if(i % p[j] == 0) break;
}
}
}
*
这个算法的关键在于if(i % p[j] == 0) break;, 它使得任何一个合数,只能被它最小的质因数标记过
一次,再一次进行优化。所以整个算法是线性的。但考虑到log(log(100000000))还不到3,
故这个线性算