素数

数可以分为两类,素数,合数;合数又可以分解为素数;所以掌握一些有关素数的知识很有必要;(素数定义:只能被1和自己整除的数成为素数;)

1.①线性筛素数(Eratosthenes筛法)

伪代码如下:

const int maxn=100005;
bool v[maxn];
void found_prime()//筛法素数打表 
{
	int m=sqrt(maxn+0.5);
	memset(v,true,sizeof(v));
	v[0]=v[1]=false;
	for(int i=2;i<=m;i++)
	{
		if(v[i]==true)
		{
			for(int j=i*i;j

  ②快速线性筛素数(欧拉筛法)

伪代码如下:

const int maxn=1000005;
int prime[maxn],num_prime=0;
bool isnotprime[maxn]={1,1};
void found_prime()//快速线性筛法 
{
	for(int i=2;i

2.约数个数定理。(参考刘汝佳的算法竞赛入门经典p321)

给出一个正整数n的唯一分解式n=p1^a1 * p2^a2 * p3^a3...pk^ak,求n的正约数个数。

分析:不难看出,n的任意正约数也只能包含p1,p2,p3等素因子,而不能有新的素因子出现。对于n的某个素因子pi,它在所求约数中的指数可以是0,1,2...ai共ai+1种情况,而不同的素因子之间相互独立。根据乘法级数原理,n的正约数个数为:(a1+1)(a2+1)(a3+1)...(ak+1);

3.约数和定理。

对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,

则由约数个数定理可知n的正约数有(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,

那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)

证明:若n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,

可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1

同理可知,pk^ak的约数有:pk^0, pk^1, pk^2......pk^ak ;

实际上n的约数是在p1^a1、p2^a2、...、pk^ak每一个的约数中分别挑一个相乘得来,可知共有(a₁+1)(a₂+1)(a₃+1)…(ak+1)种挑法,即约数的个数。

乘法原理可知它们的和为f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)




你可能感兴趣的:(【模板】)