拓展欧拉定理
拓展欧拉定理
欧拉函数定义
欧拉函数,符号即为记为 \(\varphi\)。\(\varphi(n)\) 意思为有多少个数 \(i\),使得 \(\gcd(i,n)=1\) 并且 \(i\leq n\)。用数学符号解释即为 \(\displaystyle \varphi(n)=\sum_{i=1}^n[\gcd(i,n)=1]\)。
特殊性质:
- 若 \(n\) 为质数,则 \(\varphi(n)=n-1\)。根据质数的定义得证;
- 若 \(n=p^k\),其中 \(p\) 为质数,则 \(\varphi(n)=p^k-p^{k-1}=(p-1)p^{k-1}\)。因为 \(n\) 只有 \(p\) 一个素因子,所以除了 \(p\) 的倍数之外其余数都与 \(n\) 互质;
- 对于任意 \(n\),\(\displaystyle \varphi(n)=n\prod_{i=1}^k(1-\dfrac{1}{p_i})\)。通过唯一分解定理得证,注意同一个质因子只计算一次;
- 若 \(\gcd(n,m)=1\),则 \(\varphi(nm)=\varphi(n)\varphi(m)\)。(即 \(\varphi(x)\) 为一个积性函数)。
证明:
根据唯一分解定理,\(n=p_1^{a_1}p_2^{a_2}\dots p_s^{a_s},m=q_1^{b_1}q_2^{b_2}\dots q_t^{b_t}\)。因为 \(\gcd(n,m)=1\),所以不存在 \(1 \leq i \leq s,1 \leq j \leq t\),使得 \(p_i=q_j\)。根据性质 \(3\) 可以证到 \(\varphi(x)\) 为一个积性函数。
欧拉函数计算
众所周知,线性筛可以处理各种积性函数的计算,欧拉函数也不例外。我们可以通过 \(O(n)\) 计算出所有 \(\varphi(i)(1 \leq i \leq n)\)。
具体处理为:如果 \(n\) 为质数,根据性质 \(1\) 得 \(\varphi(n)=n-1\)。
否则,如果 \(\operatorname{prime}_j | i\),则 \(\varphi(i\times \operatorname{prime}_j)=\varphi(i)\times \operatorname{prime}_j\) ;否则 \(\varphi(i\times \operatorname{prime}_j)=\varphi(i)\times (\operatorname{prime}_j-1)\)。
但是在某些题目中我们并不需要求出 \([1,n]\) 间所有的 \(\varphi(i)\)。这个时候我们可以根据性质 \(3\) 做一个 \(\sqrt n\) 的算法求出 \(\varphi(n)\)。在这道模板题中就只需要用这个算就行了。
欧拉定理
内容:对于两个正整数 \(a,n\),若 \(\gcd(a,n)=1\),则:
先说说费马小定理。费马小定理的内容是:
若 \(\gcd(a,p)=1\) 并且 \(p\) 是一个质数,则:
实质上是欧拉定理的一种特殊情况。
证明:
设有 \(\varphi(n)\) 个数 \(x_1,x_2,\dots,x_{\varphi(n)}\),满足 \(\forall i,1 \leq i \leq \varphi(n):\gcd(x_i,n)=1,x_i< n\)。易见这 \(\varphi(n)\) 个数模 \(n\) 两两不同并且余数与 \(n\) 互质。
考虑证明 \(ax_1,ax_2,\dots,ax_{\varphi(n)}\) 也满足以上两个性质。
- 这 \(\varphi(n)\) 个数模 \(n\) 两两不同:使用反证法。若 \(\exists 1 \leq i < j \leq \varphi(n):ax_i-ax_j \equiv 0(\bmod \ n)\)。因为 \(\gcd(a,n)=1\),又因为 \(a_i-a_j\) 不可能是 \(n\) 的倍数,因此假设不成立。所以 \(ax_1,ax_2,\dots,ax_{\varphi(n)}\) 模 \(n\) 两两不同;
- 余数与 \(n\) 互质:\(\gcd(a,n)=1,\gcd(x_i,n)=1\)。所以 \(\gcd(ax_i,n)=1\)。类似于辗转相除法可以证明这个结论。
所以 \(ax_1,ax_2,\dots,ax_{\varphi(n)}\) 也满足以上两个性质。
我们发现与 \(n\) 互质并且小于 \(n\) 的 \(\varphi(n)\) 个数是固定的。所以对于任意 \(1 \leq i \leq \varphi(n)\),都存在唯一一个 \(1 \leq j \leq \varphi(n)\),满足 \(x_i \equiv ax_j(\bmod \ n)\)。因此:
两边消掉,得到:
定理得证。
拓展欧拉定理
扯了这么多,最重要的还是这个啊。
内容:若 \(b \geq m\) 且 \(\gcd(a,m) \neq 1\),则:
先考虑这个定理没有包含到的情况。
若 \(b < m\),可以直接使用快速幂计算;
若 \(\gcd(a,m)=1\),根据欧拉定理,\(a^b \equiv a^{b \bmod \varphi(m)}(\bmod \ m)\)。
考虑证明这个定理,先证明对于一个质数 \(p\),满足拓展欧拉定理。
设一个数 \(s\),使得 \(m=s \times p^k\) 并且 \(\gcd(s,p)=1\)。根据欧拉定理有 \(p^{\varphi(s)} \equiv 1 (\bmod \ s)\)。根据欧拉函数的性质 \(2\),有 \(\varphi(s) | \varphi(m)\),所以 \(p^{\varphi(m)} \equiv 1 (\bmod \ s)\)。
根据同余的性质两边同时乘上一个 \(p^k\)。有 \(p^{\varphi(m)+k}\equiv p^k (\bmod \ m)\)。显然有 \(p^b \equiv p^{b-k+k} \equiv p^{\varphi(m)+b}(\bmod \ m)\)。其中 \(b \geq k\)。那么就有 \(k \leq \varphi(m)\)。因此 \(b \geq \varphi(m)\)。结论就成立了。
对于一个质数的幂次方,可以用上面的方法证明。最后通过唯一分解定理合并就可证明一般性。
代码
#include<bits/stdc++.h>
using namespace std;
typedef __int128 LL;
LL Phi(LL n)
{
LL ans=n;
for(LL i=2;i*i<=n;++i)
{
if(n%i==0)
{
ans-=ans/i;
while(n%i==0) n/=i;
}
}
if(n>1) ans-=ans/n;
return ans;
}
LL QuickPow(LL n,LL p,LL mod)
{
LL base=n,ans=1;
while(p)
{
if(p&1) ans=ans*base%mod;
p>>=1;
base=base*base%mod;
}
return ans%mod;
}
LL mod;
bool flag;
LL read()
{
LL x=0;
char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9')
{
x*=10,x+=(c^'0');
if(x>=mod) flag=true;
x%=mod,c=getchar();
}
return x;
}
LL readI()
{
LL x=0;
char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9') x*=10,x+=(c^'0'),c=getchar();
return x;
}
void write(LL x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main(){
LL a=readI(),m=readI();
mod=Phi(m);
LL b=read();
if(flag) b+=mod;
write(QuickPow(a,b,m));
return 0;
}