欧拉函数
首先明确,没有欧拉函数是没有欧拉定理,所以我们先从欧拉函数入手了解。
定义:对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目( φ(1) = 1 )。它称为Euler’s totient function、φ函数、欧拉商数等。
例如φ(8)=4,因为1,3,5,7均和8互质。(因为 8 = 222。φ(8) = 8*(1-1/2) = 4)
如何求欧拉函数?
(式子中,p 与 x 互为质因数)
当 x= 1 时,φ(1)=1
当 x 为质数时,φ(x) = x-1
否则,φ(x) = 通式的实质是将 大于1的数是 x 公约数的数全部筛掉。
在欧拉筛的基础上可以计算欧拉函数值。
for(i=1;i<=n;i++)
{
if(prime[i]) //判断是否质数
{
phi[i] = i-1;
num++;
zs[num] = i;
}
//筛质数顺便求解
for(j=1;i*zs[j]<=n && j<=num;j++)
{
prime[i*zs[j]] = false;
if(i%zs[j]!=0) phi[i*zs[j]] = phi[i]*phi[zs[j]];
else phi[i*zs[j]] = phi[i]*zs[j];
}
}
#include<cstdio>
using namespace std;
const int N = 1e6+10 ;
int phi[N], prime[N];
int tot;//tot计数,表示prime[N]中有多少质数
void Euler(){
phi[1] = 1;
for(int i = 2; i < N; i ++){
if(!phi[i]){
phi[i] = i-1;
prime[tot ++] = i;
}
for(int j = 0; j < tot && 1ll*i*prime[j] < N; j ++){
if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j]-1);
else{
phi[i * prime[j] ] = phi[i] * prime[j];
break;
}
}
}
}
int main(){
Euler();
}
欧拉函数的特殊性质求φ的值
p为质数
1。phi( p ) = p-1 因为质数p除了1以外的因数只有p,故1至p的整数只有p与p不互质
2. 如果i mod p = 0, 那么 phi(i * p) = phi(i) * p
理解:i mod p==0,p是 i 的一个因子,且p为质数,i * p 后i * p相对于i来说不会出现新的素因子。可以举个例子看看。
3.若i mod p ≠ 0, 那么 phi( i * p ) = phi(i) * ( p-1 )
证明: i mod p 不为0且p为质数, 所以 i与p互质, 那么根据 欧拉函数 的积性 phi(i * p)=phi( i ) * phi( p ) 其中phi( p )=p-1即第一条性质
欧拉函数 的积性 : φ( mn ) = φ(m) * φ(n)
利用性质 gcd(km+r,m) = gcd(r, m) 找出1 - mn 中的质数个数,详细推导看下面博客
欧拉函数的积性
欧拉定理
若 gcd( a,p ) = 1,则 a^φ( p ) ≡ 1 (mod p) (这里还差证明*************)
这个定理可以求乘法逆元
包含了 费马小定理: a ^ (p-1) ≡ 1 (mod p) <==> a^p ≡ a(mod p)
(要求p为质数,因为当p为质数时φ( p ) = p-1)
欧拉定理的应用及推广
扩展欧拉定理:
用途:
1.求解乘法逆元;(求解乘法逆元中使用到了该公式)(这里还差证明*************)
2.取模时降幂 若a,n互质 a^k ≡ a^(k mod φ(n)) (mod n) 显然的;
推导:
a^b % p 不等价 (a%p)^(b%p) % p
因为
a^φ( p ) ≡ 1 (mod p)
所以
a^ b % p = (a%p)^(b%φ( p )) % p
(欧拉函数前提是a和p互质)
如果p为质数,则有
又发现了一个新公式,貌似可以摆脱a和p互质的束缚