拓展欧拉定理

拓展欧拉定理

欧拉函数定义

欧拉函数,符号即为记为 \(\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;
}
posted @ 2020-08-02 12:15  SyadouHayami  阅读(389)  评论(0编辑  收藏  举报

My Castle Town.