关于欧拉函数的东西 从性质开始

1性质

欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。

通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。

对于质数p,φ(p) = p - 1。注意φ(1)=1.

欧拉定理:对于互质的正整数a和n,有a^φ(n) ≡ 1 mod n         即      

欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。

                                 若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。

特殊性质:当n为奇数时,φ(2n)=φ(n)

欧拉函数还有这样的性质:

设a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。


代码实现:

#include     //欧拉之实现
int ef(int n)
{
	int cnt=n;
	int i;
	for(i=2;i<=n;i++)
		if(n%i==0)
		{
			cnt - =cnt/i;      //   m-m/p
			while(n%i==0)
				n/=i;
		}
		return cnt;
}
int main()
{
	int n;int m;
	int count;
	while(scanf("%d",&m)!=EOF)
	{
		
		while(m--){
			scanf("%d",&n);
		count=ef(n);
		printf("%d\n",count);}
	}
	return 0;
}


2模版以及一些快速求值方法

//线性,最快但是很占内存
const int maxp = 1000000 + 5;


LL pri[maxp], phi[maxp], pnum;
bool vis[maxp];


void phi_table(int n) {
    pnum = 0;
    phi[1] = 1;
    for(int i = 2;i <= n; i++){
        if(!vis[i]) {
            pri[pnum++] = i;
            phi[i] = i-1;
        }
        for(int j = 0;j < pnum; j++) {
            if(i*pri[j] > n)    break;
            vis[i * pri[j]] = true;
            if(i % pri[j] == 0) {
                phi[i*pri[j]] = phi[i]*pri[j];
                break;
            }
            phi[i * pri[j]] = phi[i]*(pri[j] - 1);
        }
    }
}




//非线性模版
LL phi[maxp];


void init()//筛选法求欧拉函数的模版,比线性的慢,但是不消耗内存
{
    memset(phi, 0, sizeof(phi));
    phi[1] = 1;
    for(int i = 2; i < maxp; i++) if(!phi[i])
    {
        for(int j = i; j < maxp; j+=i)
        {
            if(!phi[j]) phi[j] = j;
            phi[j] = phi[j] / i * (i-1);
        }
    }
    return ;
}




//筛选法 同时求出了n以内的素数
LL phi[N+10];//sum[N+10];
bool prime[N+10];
void init()
{
LL i,j;
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(i=2;i*i<=N;i++)
{
if(prime[i])
{
for(j=i*i;j<=N;j+=i)
{
prime[j]=false;
}
}
} //这段求出了N内的所有素数
for(i=1;i<=N;i++)
{
phi[i]=i;
}
//sum[0]=0;
//sum[1]=phi[1];
for(i=2;i<=N;i++)
{
if(prime[i])
{
for(j=i;j<=N;j+=i)
{
phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
}
}
//sum[i]=sum[i-1]+phi[i];
}
}//这段求出了N内所有数的欧拉函数值



//无需数组存欧拉函数值,肥预处理型用的
void init()//这段求出了N内的所有素数
{
ll i,j;
for(i=2;i<=N;i++)
{
if(!isprime[i])
prime[cnt++]=i;
for(j=0;j{
isprime[i*prime[j]]=true;
}

cnt--;
isprime[1]=true;
}


ll euler(ll n)//这里利用上面求出来的 素数来进行求解就会快很多,
{
ll i;
ll tempn=n;
ll ans=n;
for(i=0;i<=cnt && prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
ans=ans/prime[i]*(prime[i]-1);
while(tempn%prime[i]==0)
tempn/=prime[i];
}
}
if(tempn>1)
ans=ans/tempn*(tempn-1);
return ans;
}


3

关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明】【指数循环节】

转了图片就没了  只转个地址
http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9

你可能感兴趣的:(数论)