1. 程式人生 > 實用技巧 >拓展尤拉定理

拓展尤拉定理

拓展尤拉定理

尤拉函式定義

尤拉函式,符號即為記為 \(\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\),則:

\[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;
}