线性筛选素数和线性筛选欧拉函数【bzoj2190]

一、线性筛选素数

#include<cstring>
#include<cstdio>
using namespace std;
int prime[1110000],pr,n;
bool v[1110000];
void getprime()
{
	memset(v,true,sizeof(v));
	pr=0;
	for(int i=2;i<=n;i++)
	{
		if(v[i])
		{
			pr++;
			prime[pr]=i;
		}
		for(int j=1;(j<=pr)&&(i*prime[j]<=n);j++)
		{
			v[ i*prime[j]]=false;
			if(i%prime[j]==0)break;
		}
	}
}
int main()
{
	scanf("%d",&n);
	getprime();
	for(int i=1;i<=pr;i++) printf("%d ",prime[i]);
	return 0;
}

线性筛选欧拉函数:求小于n,且和n互质的数字个数

 比如:

 1: 0

 2: 1

 3: 2

 4: 2

 5: 4

 6: 2

 7: 6

 8: 4

 9: 6

10: 4

#include<stdio.h>

#include<string.h>

#define M 1000

int prime[M/3],phi[M];

bool flag[M];

void get_prime()

{

int i,j,k;

memset(flag,false,sizeof(flag));

k=0;

for(i=2;i<M;i++)

    {

if(!flag[i]){                            

prime[k++]=i;

phi[i]=i-1;

}

for(j=0;j<k&&i*prime[j]<M;j++){

flag[i*prime[j]]=true;            

if(i%prime[j]==0){

phi[i*prime[j]]=phi[i] * prime[j];

break;

}

else

phi[i*prime[j]]=phi[i] * phi[prime[j]];

}

    }

}

int main()

{

freopen("da2.out","w",stdout);

get_prime();

for(int i=1;i<100;i++)printf("%2d:%2d\n",i,phi[i]); 

}

欧拉函数的几个性质:E(x)表示比x小的且与x互质的正整数的个数。

1、*若p是素数,E(p)=p-1。// 这个没意见!

2、*E(p^k)=p^k - p^(k-1)=(p-1)*p^(k-1)

证:令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^(k-1)个。//同意?

1~n出去p的倍数,所以E(n)= n -  p^(k-1)  =p^k - p^(k-1) =  (p-1)*P^(k-1).得证。

想通以上证明很重要,因为是看懂下来证明的基础。
3、*若ab互质,则E(a*b)=E(a)*E(b),欧拉函数是积性函数.
*对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)// 这个没意见!可以理解

=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)      

=(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)
=E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)     //由此证明了互质的可以用各自的欧拉函数直接乘

所以当ab互质的时候E(a*b)=E(a)*E(b)
不互质的时候怎么办呢?

b是质数,a%b==0,那么由上面的证明,b并到其中一个b^x里面,所以E(a*b)=E(a)*b

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值