欧拉函数及定理

ps:文章篇幅较长=_=(像我这种蒟蒻的证明当然又臭又长),请善用目录^_^

欧拉函数

定义

欧拉函数φ(n)表示1~n中所有与n互质的数。比如1~8中与8互质的数有1,3,5,7,所以φ(8)=4。

公式

ps:关于简系请移步剩余类、完系及简系。
公式1:如果p是素数,有φ(p)=p-1,这个很显然。
公式2(积性):如果(a,b)=1,有φ(a*b)=φ(a)*φ(b),证明如下:
设模a的一个简系为 a1,a2,a3,,aφ(a) ,模b的一个简系为 b1,b2,b3,,bφ(b)
现在我们要证明:所有 aib+bja (共φ(a)*φ(b)个)组成了模a*b的一个简系(即φ(a*b)=φ(a)*φ(b))。判定简系需要证明下面三点:
1. (aib+bja,ab)=1
2. aib+bja≢akb+bta(mod ab)(i!=kj!=t)
3.对于任意k满足(k,a*b)=1,则一定有 kaib+bja(mod ab) (即没有遗漏)。
证明1:
因为(a, ai )=1,(a,b)=1,所以(a, ai *b)=1,由辗转相除法可得(a, ai *b+ bj *a)=(a, ai *b)=1,同理得(b, ai *b+ bj *a)=1。
所以1得证。
证明2:
假设存在 aib+bjaakb+bta(mod ab)(i!=kj!=t) ,那么也就是说:
a(bjbt)+b(aiak)0(mod ab) ,即:
ab|a(bjbt)+b(aiak)
所以 a|a(bjbt)+b(aiak),b|a(bjbt)+b(aiak)
因为 a|a(bjbt) ,所以 a|b(aiak) ,同理得 b|a(bjbt)
又因为(a,b)=1, ai - ak =a,同理得 bj - bt =b
aiak(mod a) , bjbt(mod b)
也就是说 ai ak 是同一剩余类且 bj bt 是同一剩余类,这与i!=k或j!=t矛盾(i!=k说明 ai ak 不是同一剩余类,j!=t说明 bj bt 不是同一剩余类,由于i!=k和j!=t至少有一个不成立,所以矛盾)。
所以2得证。
证明3:
kxb+ya(mod ab) k=xb+ya+tab(tZ) (这是个不定方程,可以变形为x*b+y*a=k-t*a*b,由于(a,b)=1且(k,a*b)=1,所以一定有解,即k一定可以表示为这种形式)。
因为(k,a*b)=1,根据辗转相除法,得:
(x*b+y*a,a*b)=(x*b+y*a+t*a*b,a*b)=(k,a*b)=1
所以(x*b+y*a,a)=1,(x*b+y*a,b)=1,
根据辗转相除法,得(x*b,a)=1,(y*a,b)=1
因为(a,b)=1,所以(x,a)=1,(y,b)=1
所以x是a简系中的数,y是b简系中的数,即一定有 kaib+bja(mod ab)
所以3得证。
综上所述:所有 aib+bja 组成了模a*b的一个简系,即φ(a*b)=φ(a)*φ(b)。

所以φ(n)是积性函数(但不是完全积性,因为要满足(a,b)=1)。
有了这个公式,就可以推得欧拉函数的通项公式。

因为 n=pk11pk22pk33pkrr (p为质数),又因任意两个p互质(没有共同质因子),所以:
φ(n)=φ( pk11 )*φ( pk22 )*φ( pk33 )*…*φ( pkrr )

现在需要知道φ( pk )如何计算:
因为p是质数,所以除了p的倍数之外,1~ pk 之间所有数都与 pk 互质。而易得1~ pk 之间p的倍数的个数是 pkp ,所以:
公式3:φ( pk )= pk - pkp = pkpk1 = pk(11p)

代回原式,得:
φ(n)= pk11pk22pk33pkrr(11p1)(11p2)(11pr)
而n= pk11pk22pk33pkrr ,得:
φ(n)= n(11p1)(11p2)(11pr)
这就是欧拉函数的通项公式。

求法

1.唯一分解
如果只求φ(n),那么我们就直接将n唯一分解处理出每一个n的素数,然后用通项公式就行了。
效率: O(n)

int phi(int n)
{
    int sq=sqrt(n),ans=n;
    for (int i=2;i<=sq;i++)
        if (n%i==0)
        {
            ans=ans/i*(i-1);
            while (n%i==0) n/=i;
        }
    if (n>1) ans=ans/n*(n-1);
    return ans;
}

2.筛法
如果要求φ(1~n),用唯一分解就比较慢了,所以我们可以用筛法求出φ(1~n),原理和筛素数是一样的。这里给出普通筛法以及线性筛法,但是要注意普通筛法用到的是通项公式,而线性筛法用到公式1、积性和公式3:
效率: O(nlog2n)

void make_phi(int n)
{
    memset(phi,0,sizeof(phi));phi[1]=1;
    for (int i=2;i<=n;i++) if (!phi[i])
    for (int j=1;j<=n/i;j++)
    {
        if (!phi[i*j]) phi[i*j]=i*j;
        phi[i*j]=phi[i*j]/i*(i-1);
    }
}

效率: O(n)

int make_phi(int n)
{
    memset(vis,1,sizeof(vis));vis[0]=vis[1]=false; 
    phi[1]=1;
    for (int i=2;i<=n;i++)
    {
        if (vis[i]) p[++p[0]]=i,phi[i]=i-1; //用公式1
        for (int j=1;j<=p[0]&&p[j]*i<=n;j++)
        {
            vis[p[j]*i]=false;
            if (i%p[j]) phi[p[j]*i]=phi[p[j]]*phi[i]; else
            //i和p[j]互质,用积性
            {phi[p[j]*i]=p[j]*phi[i];break;}
            //i是p[j]倍数,用公式3
        }
    }
}

拓展

1~n与n互质的所有数的和为:
n=1:n*φ(n)/2+1/2=1
n>1:n*φ(n)/2
其实很好求:如果(x,n)=1,那么(n-x,n)=1。也就是说与n互质的数是成对出现的,那么显然这些数的和为n*φ(n)/2(1比较特殊,需要特判)。

欧拉定理

内容

如果(a,p)=1,有 aφ(p)1(mod p)
由于当p是素数时φ(p)=p-1,所以 ap11(mod p) ,由此可见费马小定理是欧拉定理的特殊形式。

证明

设p的一个简系为 r1,r2,r3,,rφ(p)
因为(a,p)=1,所以 ar1,ar2,ar3,arφ(p) 也是p的一个简系。
所以 ar1ar2ar3arφ(p)r1r2r3rφ(p)(mod p)
aφ(p)r1r2r3rφ(p)r1r2r3rφ(p)(mod p)
所以 p|(aφ(p)1)r1r2r3rφ(p)
因为( r1r2r3rφ(p) ,p)=1
所以 p|(aφ(p)1)
所以 aφ(p)10(mod p) aφ(p)1(mod p)
欧拉定理得证。

你可能感兴趣的:(欧拉函数及扩展定理,数论总结By_ZZK)