欧拉函数
本文大部分来自知乎Pecco,供自己复习使用
1、若 p p p是质数则 φ ( p n ) = p n − 1 ( p − 1 ) \varphi (p^n)=p^{n-1}(p-1) φ(pn)=pn−1(p−1)
在不大于 p n p^{n} pn的正整数中,只有 p 、 2 p 、 3 p 、 . . . 、 p ∗ p n − 1 p、2p、3p、...、p*p^{n-1} p、2p、3p、...、p∗pn−1总共 p n − 1 p^{n-1} pn−1个所以 φ ( p n ) = p n − p n − 1 = p n − 1 ( p − 1 ) \varphi (p^n)=p^n-p^{n-1}=p^{n-1}(p-1) φ(pn)=pn−pn−1=pn−1(p−1)
2、若 a ∣ x a\mid x a∣x,则 φ ( a x ) = a φ ( x ) \varphi(ax)=a\varphi(x) φ(ax)=aφ(x)
因为 a a a是 x x x的约数,所以 a a a的所有质因数都被 x x x包含,根据欧拉函数的定义易得结论 φ ( a x ) = a φ ( x ) \varphi(ax)=a\varphi(x) φ(ax)=aφ(x)
3、若 a 、 b a、b a、b互质,则 φ ( a b ) = φ ( a ) ∗ φ ( b ) \varphi(ab)=\varphi(a)*\varphi(b) φ(ab)=φ(a)∗φ(b)
因为 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1,所以 a a a和 b b b的所有质因数都不相同,根据欧拉函数定义易得 φ ( a x ) = a φ ( x ) \varphi(ax)=a\varphi(x) φ(ax)=aφ(x),且符合这种性质的数论函数被称为积性函数
欧拉函数可以单个求,也可以使用埃氏筛法、和线性筛求,上边链接里有,这里不说了
欧拉定理
若 a a a与 m m m互质,则 a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1(mod\ m) aφ(m)≡1(mod m)
当 m m m是质数时,欧拉定理退化成费马小定理 a m − 1 ≡ 1 ( m o d m ) a^{m-1}\equiv 1(mod\ m) am−1≡1(mod m)
重要推论:当 a a a与 m m m互质时, a b ≡ a b m o d φ ( m ) ( m o d m ) a^b\equiv a^{b\ mod\ \varphi(m)}\ (mod\ m) ab≡ab mod φ(m) (mod m)
因为 a b = a φ ( m ) ⌊ b / φ ( m ) ⌋ + b m o d φ ( m ) ≡ 1 ∗ a b m o d φ ( m ) a^b=a^{\varphi(m)\left \lfloor b/\varphi(m) \right \rfloor+b\ mod\ \varphi(m)}\equiv 1*a^{b\ mod\ \varphi(m)} ab=aφ(m)⌊b/φ(m)⌋+b mod φ(m)≡1∗ab mod φ(m)
那么 a a a和 m m m不互质时我们怎么办呢?
这时我们引入扩展欧拉定理
若 b ≥ φ ( m ) b \geq\varphi(m) b≥φ(m),则 a b ≡ a b m o d φ ( m ) + φ ( m ) ( m o d m ) a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\ (mod\ m) ab≡ab mod φ(m)+φ(m) (mod m)
当 b < φ ( m ) b<\varphi(m) b<φ(m)时,直接用快速幂计算即可
当 b ≥ φ ( m ) b \geq\varphi(m) b≥φ(m)时,分两种情况讨论
1、 a a a与 m m m互质,
a
b
≡
a
b
m
o
d
φ
(
m
)
(
m
o
d
m
)
∗
1
≡
a
b
m
o
d
φ
(
m
)
+
φ
(
m
)
(
m
o
d
m
)
a^b\equiv a^{b\ mod\ \varphi(m)}\ (mod\ m)*1\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\ (mod\ m)
ab≡ab mod φ(m) (mod m)∗1≡ab mod φ(m)+φ(m) (mod m)
显然成立
2、 a a a与 m m m不互质
我们先把m分解质因数,即 m = p 1 q 1 p 2 q 2 . . . p n q n m={p_{1}}^{q_{1}}{p_{2}}^{q_{2}}...{p_{n}}^{q_{n}} m=p1q1p2q2...pnqn
我们只需要证明对于每个
p
i
q
i
{p_{i}}^{q_{i}}
piqi都有
a
b
≡
a
b
m
o
d
φ
(
m
)
+
φ
(
m
)
(
m
o
d
p
i
q
i
)
a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\ (mod\ {p_{i}}^{q_{i}})
ab≡ab mod φ(m)+φ(m) (mod piqi)
假设 m 1 、 m 2 m_{1}、m_{2} m1、m2互质,且 x ≡ y ( m o d m 1 ) , x ≡ y ( m o d m 2 ) , 则 x ≡ y ( m o d m 1 m 2 ) x\equiv y\ (mod\ m_{1}),x\equiv y\ (mod\ m_{2}),则x\equiv y\ (mod\ m_{1}m_{2}) x≡y (mod m1),x≡y (mod m2),则x≡y (mod m1m2)
因为 x − y ∣ m 1 x-y\mid m_1 x−y∣m1且 x − y ∣ m 2 x-y\mid m_2 x−y∣m2,所以两者可以合并
现在开始分类讨论 p i q i {p_{i}}^{q_{i}} piqi
1、 g c d ( a , p i q i ) = 1 gcd(a, {p_{i}}^{q_{i}})=1 gcd(a,piqi)=1
上面已经证明,根据欧拉定理必然有
a
b
=
a
φ
(
m
)
⌊
b
/
φ
(
m
)
⌋
+
b
m
o
d
φ
(
m
)
≡
a
b
m
o
d
φ
(
m
)
+
φ
(
m
)
(
m
o
d
p
i
q
i
)
a^b= a^{\varphi(m)\left \lfloor b/\varphi(m) \right \rfloor+b\ mod\ \varphi(m)}\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\ (mod\ {p_{i}}^{q_{i}})
ab=aφ(m)⌊b/φ(m)⌋+b mod φ(m)≡ab mod φ(m)+φ(m) (mod piqi)
因为欧拉函数是积性函数,所以 φ ( m ) ⌊ b / φ ( m ) ⌋ \varphi(m)\left \lfloor b/\varphi(m) \right \rfloor φ(m)⌊b/φ(m)⌋必然是 φ ( p i q i ) \varphi({p_{i}}^{q_{i}}) φ(piqi)的倍数
2、 g c d ( a , p i q i ) ≠ 1 gcd(a, {p_{i}}^{q_{i}})\neq 1 gcd(a,piqi)=1
因为 p i p_i pi是一个质数,所以 a a a必然是 p i p_i pi的倍数,设 a = n p i a=np_i a=npi(以下 p i p_i pi用 p p p表示)
由欧拉定理可知
φ
(
p
i
q
i
)
=
p
i
q
i
−
1
(
p
i
−
1
)
\varphi ({p_{i}}^{q_{i}})={p_{i}}^{q_{i}-1}(p_i-1)
φ(piqi)=piqi−1(pi−1),易知
φ
(
p
i
q
i
)
≥
q
i
\varphi ({p_{i}}^{q_{i}})\geq q_i
φ(piqi)≥qi
粗略证明:
∵
p
i
是
一
个
质
数
\because p_i是一个质数
∵pi是一个质数
∴
p
i
≥
2
,
p
i
−
1
>
0
\therefore p_i\geq 2,p_{i}-1> 0
∴pi≥2,pi−1>0
已
知
q
i
≥
1
已知q_i\geq1
已知qi≥1(都是质因数的幂了,这不废话吗 )
现 在 问 题 已 经 转 化 成 了 证 明 a x − 1 ≥ x ( x ≥ 1 ) 现在问题已经转化成了证明a^{x-1}\geq x(x\geq1) 现在问题已经转化成了证明ax−1≥x(x≥1)
动 手 画 一 下 函 数 就 知 道 了 动手画一下函数就知道了 动手画一下函数就知道了
综 上 所 述 , φ ( p i q i ) ≥ q i 综上所述,\varphi ({p_{i}}^{q_{i}})\geq q_i 综上所述,φ(piqi)≥qi
则 b ≥ φ ( m ) ≥ φ ( p i q i ) ≥ q i b\geq \varphi(m) \geq \varphi ({p_{i}}^{q_{i}}) \geq q_i b≥φ(m)≥φ(piqi)≥qi
所以 p i q i {p_{i}}^{q_{i}} piqi既是 a b m o d φ ( m ) + φ ( m ) a^{b\ mod\ \varphi(m)+\varphi(m)} ab mod φ(m)+φ(m)的因数,又是 a b a^b ab的因数
所以 a b ≡ a b m o d φ ( m ) + φ ( m ) ≡ 0 ( m o d p i q i ) a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\equiv0\ (mod\ {p_{i}}^{q_{i}}) ab≡ab mod φ(m)+φ(m)≡0 (mod piqi)
综上所述: a b ≡ a b m o d φ ( m ) + φ ( m ) ( m o d m ) ( b ≥ φ ( m ) ) a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}\ (mod\ m)\ (b\geq \varphi(m)) ab≡ab mod φ(m)+φ(m) (mod m) (b≥φ(m))
具体代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL qmi(LL a, LL b, LL p)
{
LL res = 1;
while(b)
{
if(b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
int main()
{
LL a, m;
cin >> a >> m;
LL phi = m, temp = m;
for(LL i = 2; i * i <= temp; ++ i)
if(temp % i == 0)
{
phi = phi / i * (i - 1);
while(temp % i == 0) temp /= i;
}
if(temp > 1)
{
phi = phi / temp * (temp - 1);
}
LL b = 0;
char c;
bool flag = false;
while(!isdigit(c = getchar()));
for(; isdigit(c); c = getchar())
{
b = b * 10 + (c - '0');
if(b >= phi)
{
flag = true;
b %= phi;
}
}
if(flag) b += phi;
LL ans = qmi(a, b, m);
cout << ans << endl;
return 0;
}