拓展尤拉定理
拓展尤拉定理
尤拉函式定義
尤拉函式,符號即為記為 \(\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\)
- 對於任意 \(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}\)
尤拉函式計算
眾所周知,線性篩可以處理各種積性函式的計算,尤拉函式也不例外。我們可以通過 \(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\)
但是在某些題目中我們並不需要求出 \([1,n]\) 間所有的 \(\varphi(i)\)。這個時候我們可以根據性質 \(3\) 做一個 \(\sqrt n\) 的演算法求出 \(\varphi(n)\)。在這道模板題中就只需要用這個算就行了。
尤拉定理
內容:對於兩個正整數 \(a,n\),若 \(\gcd(a,n)=1\),則:
\[a^{\varphi(n)}\equiv 1(\bmod \ n) \]
先說說費馬小定理。費馬小定理的內容是:
若 \(\gcd(a,p)=1\) 並且 \(p\) 是一個質數,則:
\[a^{p-1}=1(\bmod \ 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)\)。因此:
\[ax_1ax_2\dots ax_{\varphi(n)} \equiv x_1x_2\dots x_{\varphi(n)} (\bmod \ n) \]
兩邊消掉,得到:
\[a^{\varphi(n)}\equiv 1(\bmod \ n) \]
定理得證。
拓展尤拉定理
扯了這麼多,最重要的還是這個啊。
內容:若 \(b \geq m\) 且 \(\gcd(a,m) \neq 1\),則:
\[a^b \equiv a^{b \bmod \varphi(m)+\varphi(m)}(\bmod \ m) \]
先考慮這個定理沒有包含到的情況。
若 \(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;
}