欧拉函数,欧拉定理,欧拉降幂

欧拉函数

定义:小于或等于n的正整数中与n互质的数的数目,例如:φ(8)=4,1,3,5,7与8互质。

通式:(其中p1, p2……pn为x的所有质因数,x是不为0的整数)

性质:

p为质数,m为大于0自然数

φ( p)=p-1

欧拉函数是积性函数——若m,n互质

if(m%p==0) φ(p*m) = φ(m)*p

else φ(p*m) = φ( p)*φ(m)

if(m&1) φ(2*m) = φ(m)

else if(m>2)φ(m)为偶数

φ(pm)=φ(pm)-φ(pm-1)

求和:

Σ d ∣ n = n Σ_{d|n}=n Σdn=n
Σ i = 1 n [ g c d ( i , n ) = 1 ] = φ ( n ) Σ^{n}_{i=1}[gcd(i,n)=1]=φ(n) Σi=1n[gcd(i,n)=1]=φ(n)
Σ i = 1 n i [ g c d ( i , n ) = 1 ] = ⌈ φ ( n ) ∗ n 2 ⌉ Σ^{n}_{i=1}i[gcd(i,n)=1]=⌈\frac {φ(n)*n}{2}⌉ Σi=1ni[gcd(i,n)=1]=2φ(n)n


麻瓜(我)的求法:

int gtpi(int n){
	int res=1;
	for(int i=2;i<n;i++)
		if(__gcd(i,n) == 1)res++;
	return res;
}

O(sqrt(n))求φ(n):

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

O(n)求1~n所有数的欧拉函数:

const int N;
int prime[N],cnt;
int phi[N];
bool vis[N];

void Get_phi(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            prime[cnt++]=i;
            phi[i]=i-1;//性质1
        }
        for(int j=0;prime[j]<=n/i;j++){
            int t=prime[j]*i;
            vis[t]=1;
            if(i%prime[j]==0){
                phi[t]=phi[i]*prime[j];//性质2
                break;
            }
            phi[t]=phi[i]*(prime[j]-1);//性质2
        }
    }
}

欧拉定理

定义:
欧拉定理(Euler Theorem,也称费马-欧拉定理或欧拉函数定理)是一个关于同余的性质。
内容:
若n,a为正整数,且n,a互质,则:
a ϕ ( n ) ≡ 1 ( m o d    n ) a ^{\phi(n)} \equiv 1(mod\;n) aϕ(n)1(modn)

费马小定理
若n,a为正整数,且n为质数,则:
a ϕ ( n ) ≡ 1 ( m o d    n )    > >    a n − 1 ≡ 1 ( m o d    n ) a ^{\phi(n)} \equiv 1(mod\;n)\;>>\;a ^{n-1} \equiv 1(mod\;n) aϕ(n)1(modn)>>an11(modn)

逆元:
a ϕ ( n ) − 1 a^{\phi(n)-1} aϕ(n)1

证明:

设x(1),x(2),…,x(φ(n))是一个以n为模的缩系,
则ax(1),ax(2),…,ax(φ(n) )也是一个以n为模的缩系(因为(a,n)=1)。
于是有ax(1)ax(2)…ax(φ(n) )≡x(1)x(2)…x(φ(n))(mod n),
所以a^φ(n) ≡ 1 (mod n)。证毕。


欧拉降幂

显然
a b ≡ { a b % ϕ ( p ) if  g c d ( a , p ) = 1 a b if  g c d ( a , p ) ≠ 1 , b < ϕ ( p )   ( m o d    p ) a b % ϕ ( p ) + ϕ ( p ) if  g c d ( a , p ) ≠ 1 , b > = ϕ ( p ) a^b \equiv \begin{cases} a^{b\%\phi(p)} &\text{if } gcd(a,p)=1 \\ a^b &\text{if } gcd(a,p)\not=1,b<\phi(p) &\text{ }(mod\;p)\\ a^{b\%\phi(p)+\phi(p)} &\text {if }gcd(a,p)\not=1 ,b>=\phi(p) \end{cases} abab%ϕ(p)abab%ϕ(p)+ϕ(p)if gcd(a,p)=1if gcd(a,p)=1,b<ϕ(p)if gcd(a,p)=1,b>=ϕ(p) (modp)
然后就可以愉快地做题了
例如: 牛客的
简单数据结构1
Ternary String
子序列
[SDOI2008]仪仗队洛谷也有一样的 ,但好像数据不太一样

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