【算术基本定理】任意一个大于1的整数,都能表示成若干个质数的乘积,如果不计质因数的顺序,则这个分解式是唯一的。即任意一个大于1的整数
a1=[p1×p2×p3×……×pn(p1≤p2≤p3≤……≤pn)其中p1、p2、p3、…、pn都是质数;并且若
a1=q1×q2×q3×…qm(q1≤q2≤q3≤…≤qm)
其中q1、q2、q3、…、qm都是质数。那么,m=n,qi=pi(i=1,2,3,…,n)
当这个整数是质数时是符合定理的特例。素数即是质数。
【求一定范围里的素数】说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。 中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。例如,16=4^2,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=4^2,18=2*9,691488=2^5 * 21609,;换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。 由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除P^2,p^3,p^4,... ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。
求2~20之间的素数prime函数如下:
#include<iostream>
using namespace std;
const int maxn=1000001;
int mark[maxn];
void prime()
{
int i;
for(i=2;i*i<maxn;i++)
{
if(mark[i]==0)
{
for(int j=i*i;j<maxn;j+=i)
mark[j]=1;
}
}
}
int main()
{
prime();
for(int i=2;i<=20;i++)
if(mark[i]==0)
cout<<i<<endl;
return 0;
}