更新于2021年7月
欧拉函数
对于一个正整数 x x x,小于 x x x且和 x x x互质的正整数的个数,记做 φ ( x ) \varphi(x) φ(x)。其中 φ ( 1 ) \varphi(1) φ(1)被定义为 1 1 1。
性质1: 若 p p p是质数,则
φ ( p a ) = p a − p a − 1 = p a ( 1 − 1 p ) \varphi(p^a)=p^a-p^{a-1}=p^a(1-\dfrac 1p) φ(pa)=pa−pa−1=pa(1−p1)
特别地, φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1。
证明: 由于大于 1 1 1的数不可能与它本身互质,所以定义中的“小于”完全可以改成“小于等于”。只需从小于等于 p a p^a pa的 p a p^a pa个正整数中减去与 p a p^a pa不互质的数,即含有质因数 p p p的数,即 p p p的倍数。而这样的数有 p a p = p a − 1 \dfrac{p^a}p=p^{a-1} ppa=pa−1个。
性质2: 若 p , q p,q p,q是质数,则
φ ( p a q b ) = φ ( p a ) φ ( q b ) \varphi\left(p^aq^b\right)=\varphi\left(p^a\right)\varphi\left(q^b\right) φ(paqb)=φ(pa)φ(qb)
证明: 小于等于 p a q b p^aq^b paqb的正整数中与 p a q b p^aq^b paqb不互质的数要么是 p p p的倍数(有 p a − 1 q b p^{a-1}q^b pa−1qb个),要么是 q q q的倍数(有 p a q b − 1 p^aq^{b-1} paqb−1个),且重复的数是 p q pq pq的倍数(有 p a − 1 q b − 1 p^{a-1}q^{b-1} pa−1qb−1个),所以
φ ( p a q b ) = p a q b − p a − 1 q b − p a q b − 1 + p a − 1 q b − 1 = p a q b ( 1 − 1 p ) ( 1 − 1 q ) = φ ( p a ) φ ( q b ) \begin{aligned} \varphi\left(p^aq^b\right)&=p^aq^b-p^{a-1}q^b-p^aq^{b-1}+p^{a-1}q^{b-1}\\ &=p^aq^b\left(1-\dfrac 1p\right)\left(1-\dfrac 1q\right)\\ &=\varphi\left(p^a\right)\varphi\left(q^b\right) \end{aligned} φ(paqb)=paqb−pa−1qb−paqb−1+pa−1qb−1=paqb(1−p1)(1−q1)=φ(pa)φ(qb)
该性质很容易推广到多个质数的情况。设 x x x的质因数分解为 x = p 1 a 1 p 2 a 2 ⋯ p k a k x=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k} x=p1a1p2a2⋯pkak,则
φ ( x ) = x − ∑ 1 ⩽ i ⩽ k x p i + ∑ 1 ⩽ i < j ⩽ k x p i p j − ⋯ + ( − 1 ) k x p 1 p 2 ⋯ p k = x ( 1 − ∑ 1 ⩽ i ⩽ k 1 p i + ∑ 1 ⩽ i < j ⩽ k 1 p i p j − ⋯ + ( − 1 ) k 1 p 1 p 2 ⋯ p k ) = x ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) = p 1 a 1 p 2 a 2 ⋯ p k a k ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) = φ ( p 1 a 1 ) φ ( p 2 a 2 ) ⋯ φ ( p k a k ) \begin{aligned} \varphi(x)&=x-\sum_{1\leqslant i\leqslant k}\dfrac x{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac x{p_ip_j}-\cdots+(-1)^k\dfrac x{p_1p_2\cdots p_k}\\ &=x\left(1-\sum_{1\leqslant i\leqslant k}\dfrac 1{p_i}+\sum_{1\leqslant i<j\leqslant k}\dfrac 1{p_ip_j}-\cdots+(-1)^k\dfrac 1{p_1p_2\cdots p_k}\right)\\ &=x\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\left(1-\dfrac 1{p_1}\right)\left(1-\dfrac 1{p_2}\right)\cdots\left(1-\dfrac 1{p_k}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_k^{a_k}\right) \end{aligned} φ(x)=x−1⩽i⩽k∑pix+1⩽i<j⩽k∑pipjx−⋯+(−1)kp1p2⋯pkx=x⎝⎛1−1⩽i⩽k∑pi1+1⩽i<j⩽k∑pipj1−⋯+(−1)kp1p2⋯pk1⎠⎞=x(1−p11)(1−p21)⋯(1−pk1)=p1a1p2a2⋯pkak(1−p11)(1−p21)⋯(1−pk1)=φ(p1a1)φ(p2a2)⋯φ(pkak)
由此得到了欧拉函数的计算式:
φ ( x ) = x ∏ p ∣ x ( 1 − 1 p ) \varphi(x)=x\prod_{p\vert x}\left(1-\dfrac 1p\right) φ(x)=xp∣x∏(1−p1)
由于 x x x最多只有一个大于 x \sqrt x x的质因数(否则质因数乘积就超过了 x x x),因此只需枚举 x \sqrt x x以内的质因数,若有大于 x \sqrt x x的质因数再特殊处理。每次枚举到一个质因数 i i i,将 x x x中的质因数 i i i除尽,保证枚举的下一个因数仍是质因数。
int phi(int x){
int ans=x;
for(int i=2;i*i<=x;i++)if(!(x%i)){
ans-=ans/i;
while(!(x%i))x/=i;
}
if(x>1)ans-=ans/x;
return ans;
}
埃氏筛
先将所有的数标记为质数。从小到大讨论,若 i i i是质数,则 i i i的倍数全部标记为合数。
对于一个合数,在讨论其每一个质因数时都会标记到该合数,这就间接实现了枚举质因数的过程,可以据此用来求欧拉函数:先设 φ ( i ) = i \varphi(i)=i φ(i)=i,若 i i i是质数,根据欧拉函数的计算式, i i i的倍数的函数值全部乘以 1 − 1 i 1-\dfrac 1i 1−i1。
时间复杂度: O ( n log log n ) O(n\log\log n) O(nloglogn)。
void make_prime(bool*mk,int n){
memset(mk,0,sizeof(mk));mk[1]=1;
for(int i=2;i<=n;i++)if(!mk[i])
for(int j=i+i;j<=n;j+=i)mk[j]=1;
}
void make_phi(int*phi,int n){
for(int i=1;i<=n;i++)phi[i]=i;
for(int i=2;i<=n;i++)if(phi[i]==i)
for(int j=i;j<=n;j+=i)phi[j]=phi[j]/i*(i-1);
}
线性筛
欧拉筛(线性筛)保证每个合数仅被它的最小质因数筛去正好一次。用当前的 i i i按从小到大的顺序依次乘以已筛出的质数 p p p来标记合数,当 i m o d p = 0 i\bmod p=0 imodp=0时,说明 i i i中含有质因数 p p p,则 i i i乘以更大的质数 p ′ p' p′得到新的合数 i ⋅ p ′ i\cdot p' i⋅p′时,其最小质因数就不是 p ′ p' p′而是 p p p,这个合数应该在 i ′ = i ⋅ p ′ p i'=\dfrac{i\cdot p'}p i′=pi⋅p′时筛去。因此在 i m o d p = 0 i\bmod p=0 imodp=0时,就不再用当前的 i i i标记合数,而是进入下一层循环。
线性筛并没有枚举出所有的质因数,因此不能根据计算式求欧拉函数,需要利用欧拉函数的另一些性质。
性质3: 欧拉函数是积性函数。(若 x , y x,y x,y互质,则 φ ( x y ) = φ ( x ) φ ( y ) \varphi(xy)=\varphi(x)\varphi(y) φ(xy)=φ(x)φ(y)。)
证明: 因为 x , y x,y x,y互质,所以 x , y x,y x,y没有公共质因数。设 x = p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 x=p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}} x=p1a1p2a2⋯pk1ak1, y = p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 y=p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}} y=pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2,则
φ ( x y ) = φ ( p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 ) = φ ( p 1 a 1 ) φ ( p 2 a 2 ) ⋯ φ ( p k 1 a k 1 ) φ ( p k 1 + 1 a k 1 + 1 ) φ ( p k 1 + 2 a k 1 + 2 ) ⋯ φ ( p k 1 + k 2 a k 1 + k 2 ) = φ ( p 1 a 1 p 2 a 2 ⋯ p k 1 a k 1 ) φ ( p k 1 + 1 a k 1 + 1 p k 1 + 2 a k 1 + 2 ⋯ p k 1 + k 2 a k 1 + k 2 ) = φ ( x ) φ ( y ) \begin{aligned} \varphi(xy)&=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}\right)\varphi\left(p_2^{a_2}\right)\cdots\varphi\left(p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}\right)\varphi\left(p_{k_1+2}^{a_{k_1+2}}\right)\cdots\varphi\left(p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi\left(p_1^{a_1}p_2^{a_2}\cdots p_{k_1}^{a_{k_1}}\right)\varphi\left(p_{k_1+1}^{a_{k_1+1}}p_{k_1+2}^{a_{k_1+2}}\cdots p_{k_1+k_2}^{a_{k_1+k_2}}\right)\\ &=\varphi(x)\varphi(y) \end{aligned} φ(xy)=φ(p1a1p2a2⋯pk1ak1pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2)=φ(p1a1)φ(p2a2)⋯φ(pk1ak1)φ(pk1+1ak1+1)φ(pk1+2ak1+2)⋯φ(pk1+k2ak1+k2)=φ(p1a1p2a2⋯pk1ak1)φ(pk1+1ak1+1pk1+2ak1+2⋯pk1+k2ak1+k2)=φ(x)φ(y)
性质4: 若 p p p是质数,则
φ ( x p ) = { φ ( x ) p x m o d p = 0 φ ( x ) ( p − 1 ) x m o d p ≠ 0 \varphi(xp)=\begin{cases} \varphi(x)p&x\bmod p=0\\ \varphi(x)(p-1)&x\bmod p\neq 0 \end{cases} φ(xp)={φ(x)pφ(x)(p−1)xmodp=0xmodp=0
证明:
-
x m o d p = 0 x\bmod p=0 xmodp=0时, x x x一定可以表示成 x = k p a x=kp^a x=kpa,其中 k , p k,p k,p互质,则
φ ( x p ) = φ ( k ) φ ( p a + 1 ) = φ ( k ) ⋅ p a + 1 ( 1 − 1 p ) φ ( x ) p = φ ( k ) φ ( p a ) p = φ ( k ) ⋅ p a ( 1 − 1 p ) p \begin{aligned} \varphi(xp)&=\varphi(k)\varphi(p^{a+1})=\varphi(k)\cdot p^{a+1}\left(1-\dfrac 1p\right)\\ \varphi(x)p&=\varphi(k)\varphi(p^a)p=\varphi(k)\cdot p^a\left(1-\dfrac 1p\right)p \end{aligned} φ(xp)φ(x)p=φ(k)φ(pa+1)=φ(k)⋅pa+1(1−p1)=φ(k)φ(pa)p=φ(k)⋅pa(1−p1)p
于是 φ ( x p ) = φ ( x ) p \varphi(xp)=\varphi(x)p φ(xp)=φ(x)p。
-
x m o d p ≠ 0 x\bmod p\neq 0 xmodp=0时, x , p x,p x,p互质,所以
φ ( x p ) = φ ( x ) φ ( p ) = φ ( x ) ( p − 1 ) \varphi(xp)=\varphi(x)\varphi(p)=\varphi(x)(p-1) φ(xp)=φ(x)φ(p)=φ(x)(p−1)
时间复杂度: O ( n ) O(n) O(n)
void make_prime(bool*mk,int*p,int n){
memset(mk,0,sizeof(mk));mk[1]=1;
for(int i=2;i<=n;i++){
if(!mk[i])p[++tot]=i;
for(int j=1;j<=tot&&i*p[j]<=n;j++){
mk[i*p[j]]=1;
if(!(i%p[j]))break;
}
}
}
void make_phi(int*phi,bool*mk,int*p,int n){
memset(mk,0,sizeof(mk));mk[1]=phi[1]=1;
for(int i=2;i<=n;i++){
if(!mk[i])p[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&i*p[j]<=n;j++){
mk[i*p[j]]=1;
if(i%p[j])phi[i*p[j]]=phi[i]*(p[j]-1);
else{phi[i*p[j]]=phi[i]*p[j];break;}
}
}
}
GCD的个数(NKOJ 3684)
问题描述
给定两个正整数 n n n, m m m, 求满足下列两个条件的 x x x的个数:
条件1: 1 ⩽ x ⩽ n 1\leqslant x\leqslant n 1⩽x⩽n
条件2: g c d ( x , n ) ⩾ m gcd(x,n)\geqslant m gcd(x,n)⩾m
输入格式
一行,两个整数 n n n和 m m m
输出格式
一行,一个整数,表示所求结果
样例输入
10 2
样例输出
6
提示
2 ⩽ n ⩽ 1000000000 , 1 ⩽ m ⩽ N 2\leqslant n\leqslant 1000000000,1\leqslant m\leqslant N 2⩽n⩽1000000000,1⩽m⩽N
先考虑满足
x
⩽
n
x\leqslant n
x⩽n且
g
c
d
(
x
,
n
)
=
d
gcd(x,n)=d
gcd(x,n)=d的
x
x
x的个数,显然
g
c
d
(
x
d
,
n
d
)
=
1
gcd(\frac xd,\frac nd)=1
gcd(dx,dn)=1
∴
x
d
\therefore\dfrac xd
∴dx为
⌊
n
d
⌋
\left\lfloor\dfrac nd\right\rfloor
⌊dn⌋内的与
⌊
n
d
⌋
\left\lfloor\dfrac nd\right\rfloor
⌊dn⌋互质的数,总共有
φ
(
⌊
n
d
⌋
)
\varphi\left(\left\lfloor\dfrac nd\right\rfloor\right)
φ(⌊dn⌋)个。
于是只需枚举
n
n
n的因数
d
d
d,当
d
⩾
m
d\geqslant m
d⩾m时答案增加
φ
(
⌊
n
d
⌋
)
\varphi\left(\left\lfloor\dfrac nd\right\rfloor\right)
φ(⌊dn⌋)。由于
n
n
n较大,可以把枚举量减少到
n
\sqrt n
n。特殊情况特殊处理。
#include<cstdio>
typedef long long LL;
LL phi(LL x){
LL ans=x;
for(LL i=2;i*i<=x;i++)if(!(x%i)){
ans=ans-ans/i;
while(!(x%i))x=x/i;
}
if(x>1)ans=ans-ans/x;
return ans;
}
int main(){
LL n,m,ans=0;
scanf("%lld%lld",&n,&m);
for(LL d=1;d*d<=n;d++){
if(d>=m&&!(n%d))ans+=phi(n/d);
if(d*d<n&&!(n%d)&&n/d>=m)ans+=phi(d);
}
printf("%lld\n",ans);
return 0;
}
费马小定理
如果 p p p是素数,且 a , p a,p a,p互质,那么
a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv1\pmod p ap−1≡1(modp)
证明: 假设有这样 p − 1 p-1 p−1个正整数,其中每个数都小于 p p p,且两两不相同。显然这些数为
1 , 2 , … , p − 1 (1) 1,2,\dots,p-1\tag 1 1,2,…,p−1(1)
再考虑下面这 p − 1 p-1 p−1个数:
a m o d p , 2 a m o d p , 3 a m o d p , … , ( p − 1 ) a m o d p (2) a\bmod p,2a\bmod p,3a\bmod p,\dots,(p-1)a\bmod p\tag 2 amodp,2amodp,3amodp,…,(p−1)amodp(2)
1 ⩽ i ⩽ p − 1 1\leqslant i\leqslant p-1 1⩽i⩽p−1时, a , i a,i a,i都与 p p p互质,因此 i a m o d p ≠ 0 ia\bmod p\neq 0 iamodp=0, ( 2 ) (2) (2)中的数都是小于 p p p的正整数。
假设存在 1 ⩽ i < j ⩽ p − 1 1\leqslant i<j\leqslant p-1 1⩽i<j⩽p−1,使得 i a m o d p = j a m o d p ia\bmod p=ja\bmod p iamodp=jamodp,则 ( j − i ) a m o d p = 0 (j-i)a\bmod p=0 (j−i)amodp=0,而 a , j − i a,j-i a,j−i与 p p p互质,该式不成立。故 ( 2 ) (2) (2)中的数两两不相同。
于是 ( 1 ) ( 2 ) (1)(2) (1)(2)完全相同,则它们的乘积也相同,即
( p − 1 ) ! ≡ ( p − 1 ) ! a p − 1 ( m o d p ) a p − 1 ≡ 1 ( m o d p ) \begin{aligned} (p-1)!&\equiv(p-1)!a^{p-1}&\pmod p\\ a^{p-1}&\equiv 1&\pmod p \end{aligned} (p−1)!ap−1≡(p−1)!ap−1≡1(modp)(modp)
欧拉定理
费马小定理是欧拉定理的一种特殊情况。
若
a
,
n
a,n
a,n为正整数,且
a
,
n
a,n
a,n互质,那么:
a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1\pmod n aφ(n)≡1(modn)
证明: 证明过程与费马小定理类似。假设小于 n n n且与 n n n互质的正整数为
x 1 , x 2 , … , x φ ( n ) (3) x_1,x_2,\dots,x_{\varphi(n)}\tag 3 x1,x2,…,xφ(n)(3)
又有
a x 1 m o d n , a x 2 m o d n , … , a x φ ( n ) m o d n (4) ax_1\bmod n,ax_2\bmod n,\dots,ax_{\varphi(n)}\bmod n\tag 4 ax1modn,ax2modn,…,axφ(n)modn(4)
因为 a , x i a,x_i a,xi都与 n n n互质,所以 a x i m o d n ≠ 0 ax_i\bmod n\neq 0 aximodn=0, ( 4 ) (4) (4)中的数都是小于 n n n的正整数。
假设存在 1 ⩽ i < j ⩽ φ ( n ) 1\leqslant i<j\leqslant\varphi(n) 1⩽i<j⩽φ(n),使得 a x i m o d n = a x j m o d n ax_i\bmod n=ax_j\bmod n aximodn=axjmodn,则 a ( x j − x i ) m o d n = 0 a(x_j-x_i)\bmod n=0 a(xj−xi)modn=0,而 a , x i , x j a,x_i,x_j a,xi,xj与 n n n互质,该式不成立。故 ( 4 ) (4) (4)中的数两两不相同。
同理将 ( 3 ) ( 4 ) (3)(4) (3)(4)中的数分别相乘得
x 1 x 2 ⋯ x φ ( n ) ≡ x 1 x 2 ⋯ x φ ( n ) a φ ( n ) ( m o d n ) a φ ( n ) ≡ 1 ( m o d n ) \begin{aligned} x_1x_2\cdots x_{\varphi(n)}&\equiv x_1x_2\cdots x_{\varphi(n)}a^{\varphi(n)}&\pmod n\\ a^{\varphi(n)}&\equiv 1&\pmod n \end{aligned} x1x2⋯xφ(n)aφ(n)≡x1x2⋯xφ(n)aφ(n)≡1(modn)(modn)
a
,
n
a,n
a,n互质时,可用欧拉定理降幂。
a
b
m
o
d
n
=
a
b
m
o
d
φ
(
n
)
m
o
d
n
a^b\bmod n=a^{b\bmod\varphi(n)}\bmod n
abmodn=abmodφ(n)modn
一般地,
a
,
n
a,n
a,n不互质,且
b
⩾
φ
(
n
)
b\geqslant\varphi(n)
b⩾φ(n)时:
a
b
m
o
d
n
=
a
b
m
o
d
φ
(
n
)
+
φ
(
n
)
m
o
d
n
a^b\bmod n=a^{b\bmod\varphi(n)+\varphi(n)}\bmod n
abmodn=abmodφ(n)+φ(n)modn