欧拉定理、扩展欧拉定理与费马小定理
前言
今天刚讲了数学,所以来写一篇跟数学有关的文章。
当然还有个原因是我喜欢数学。
虽然我之前的博客写过一次了。
欧拉定理
在认识欧拉定理之前,我们需要先认识欧拉函数:\(\varphi\)。
我们定义一个数 \(a\) 的剩余系为小于这个数的自然数构成的集合,也就是 \(\{x|x\isin[0,a-1]\cap\N\}\)。我们再定义一个数 \(a\) 的最简剩余系为 \(a\) 的剩余系中与 \(a\) 互质的数构成的集合,即 \(\{x|x\isin[0,a-1]\cap\N\land\gcd(x,a)=1\}\)。
举个例子:\(6\) 的剩余系是 \(\{0,1,2,3,4,5\}\),但 \(6\) 的最简剩余系是 \(\{1,5\}\)。
铺垫结束,我们来说说欧拉函数。
欧拉函数最基本的定义就是一个数 \(x\) 的最简剩余系的大小,比如 \(\varphi(6)=2\),\(\varphi(5)=4\)。
那这个欧拉函数有什么性质呢?我们来介绍一下:
-
欧拉函数是积性函数,即对于任意两个互质的正整数 \(a,b\),有 \(\varphi(ab)=\varphi(a)\varphi(b)\)。
-
\(x=\sum_{d|x}\varphi(d)\)。
-
若 \(x=\prod p_i^{q_i}\),则 \(\varphi(x)=x\prod\frac{p_i-1}{p_i}\)。
证明稍微有一点点复杂,这里不着重讲,想了解的同学可以上 OI-wiki 搜。
上面都是一些小知识,现在我们来讲讲大名鼎鼎的欧拉定理:若 \(\gcd(x,p)=1\),则 \(x^{\varphi(p)}\equiv1\pmod{p}\)。证明如下:
假设 \(p\) 的最简剩余系为 \(\{a_1,a_2,\dots,a_n\}\),则:
\(\because a_i\lt p,a_j\lt p\)
\(\therefore p\nmid a_i-a_j\)
\(\because \gcd(x,p)=1\)
\(\therefore p\nmid x\)
\(\therefore p\nmid x\times(a_i-a_j)\)
\(\therefore x\times a_i\not\equiv x\times a_j\pmod{p}\)
\(\because \gcd(x,p)=1,\gcd(a_i,p)=1\)
\(\therefore\gcd(x\times a_i,p)=1\)
\(\therefore \{x\times a_i\bmod p|i\isin[1,n]\}=\{a_i|i\isin[1,n]\}\)(这里是说 \(x\times a_i\bmod p\) 也构成了 \(p\) 的一个最简剩余系)
\(\therefore a_1\times a_2\times\dots\times a_n\equiv xa_1\times xa_2\times\dots\times xa_n\pmod{p}\)(相同的集合的乘积肯定也相同)
\(\therefore\prod^x_{i=1}a_i\equiv x^n\times\prod^x_{i=1}a_i\pmod{p}\)
\(\because\gcd(\prod^x_{i=1}a_i,p)=1\)
\(\therefore x^n\equiv1\pmod{p}\)
\(\therefore x^{\varphi(p)}\equiv1\pmod{p}\)
证毕。
显然欧拉定理的关键在于这个欧拉函数,我们怎么实现求欧拉函数的过程呢?显然可以用第三条性质在 \(O(\log x)\) 的时间复杂度内求出 \(x\) 的所有质因数并算出值,代码如下:
int phi(int x)
{
int ans=x;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
{
ans=ans/i*(i-1);
while(x%i==0)
{
x/=i;
}
}
}
if(x>1)
{
ans=ans/x*(x-1);
}
return ans;
}
那如果我们要求多个数的函数值又怎么办呢?显然最简单的办法就是枚举每一个值,然后用上面的那份代码一个一个算。当然我们也有另一种写法:
for(int i=2;i<=n;i++)
{
phi[i]=i;
prime[i]=true;
}
for(int i=2;i<=n;i++)
{
if(prime[i])
{
for(int j=i;j<=n;j+=i)
{
prime[j]=false;
phi[j]/=i;
phi[j]*=(i-1);
}
}
}
时间复杂度也是 \(O(n\log n)\) 的。
原理很简单,就是在线性筛质数的时候顺便算出函数值,我觉得不需要我讲解太多。
我们来看一道例题:[SDOI2008] 仪仗队。
显然我们将题目转化后就是让我们求出 \(\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=1]\)。如果你会使用莫比乌斯函数你会发现这是一道水题,但是现在我们不会莫比乌斯函数,因此我们考虑使用欧拉函数。
通过观察你会发现:上面的式子可以被你转化成这样:\(\sum_{i=1}^n2\times\sum_{j=1}^i[\gcd(i,j)=1]\),然后你非常敏锐的观察到后面的那个式子就是 \(\varphi(i)\),因此整个式子就被转化成了 \(\sum_{i=1}^n2\varphi(i)\),但是因为还有 \((1,1),(2,2),(1,2)\) 这几个点的存在,所以最终答案要加上 \(3\)。
代码:
int n,phi[40006];
bool prime[40006];
signed main()
{
n=read()-1;
if(n==0)
{
write(0);
return 0;
}
for(int i=2;i<=n;i++)
{
phi[i]=i;
prime[i]=true;
}
for(int i=2;i<=n;i++)
{
if(prime[i])
{
for(int j=i;j<=n;j+=i)
{
prime[j]=false;
phi[j]/=i;
phi[j]*=(i-1);
}
}
}
int ans=3;
for(int i=2;i<=n;i++)
{
ans+=phi[i]*2;
}
write(ans);
return 0;
}
扩展欧拉定理
上面我们说过:若 \(\gcd(x,m)=1,x^{\varphi(m)}\equiv1\pmod{m}\)。因此当 \(x,m\) 互质时,显然 \(x^a\equiv x^{a\bmod \varphi(m)}\pmod{m}\)。
那如果 \(x,p\) 不互质呢?
\(x,m\) 不互质的情况有两种,我们分别来考虑一下:
-
\(x\) 是 \(m\) 的倍数时,显然此时 \(x^a\equiv0\pmod{m}\)。
-
\(x\) 不是 \(m\) 的倍数时,那么有扩展欧拉定理:若 \(a\ge\varphi(m),x^a\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{m}\)。当然当 \(a\lt\varphi(m)\) 时显然并不需要用这条定理。
在证明之前,你需要知道同余的一些基本定理:
- 若 \(a\not=b,a\equiv b\pmod{m_1},a\equiv b\pmod{m_2}\),那么 \(a\equiv b\pmod{\operatorname{lcm}(m_1,m_2)}\)。
证明:
显然我们可以得到 \(a-b=t_1m_1=t_2m_2\)。
所以有 \(t_1\frac{m_1}{\gcd(m_1,m_2)}=t_2\frac{m_2}{\gcd(m_1,m_2)}\)。
因为 \(\gcd(\frac{m_1}{\gcd(m_1,m_2)},\frac{m_2}{\gcd(m_1,m_2)})=1\),而等式左右要相等。
所以必然有 \(t_1=k\frac{m_2}{\gcd(m_1,m_2)},t_2=k\frac{m_1}{\gcd(m_1,m_2)}\)。
因此 \(a-b=k\frac{m_1m_2}{\gcd(m_1,m_2)}=k\operatorname{lcm}(m_1,m_2)\)。
所以 \(a\equiv b\pmod{\operatorname{lcm}(m_1,m_2)}\)。
好,现在让我们来证明扩展欧拉定理:
假设将 \(m\) 质因数分解后,\(m=\prod p_i^{q_i}\),则:
因为 \(\forall i\not=j,\gcd(p_i^{q_i},p_j^{q_j})=1\),因此如果我们证明了 \(\forall i,x^a\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{p_i^{q_i}}\),结合上面的结论,我们就可以证明扩展欧拉定理了。
我们分类讨论一下:
-
\(x\) 与 \(p_i^{q_i}\) 互质时,那么显然有 \(x^{a}\equiv x^{\lfloor\frac{a}{\varphi(m)}\rfloor\varphi(m)+a\bmod\varphi(m)}\pmod{p_i^{q_i}}\)。由于欧拉函数是积性函数,所以必然有 \(\varphi(m)=\prod\varphi(p_i^{q_i})\),所以 \(\lfloor\frac{a}{\varphi(m)}\rfloor\varphi(m)\equiv0\pmod{\varphi(p_i^{q_i})}\),所以由欧拉定理可知 \(x^a\equiv x^{a\bmod p_i^{q_i}}\equiv x^{a\bmod\varphi(m)}\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{p_i^{q_i}}\)。
-
\(x\) 与 \(p_i^{q_i}\) 不互质时,由于 \(p_i\) 是质数,所以显然 \(x\) 是 \(p_i\) 的倍数。可以证明 \(\varphi(p_i^{q_i})\ge q_i\):显然有 \(\varphi(p_i^{q_i})=p_i^{q_i-1}(p_i-1)\),拆开,然后将 \(p_i\) 看做常量,\(q_i\) 看做变量,可以画出函数图像(当然如果用求导可能更严谨一点):

然后通过调整 \(p_i\) 就能观察出来这个结论。
因此有 \(a\ge\varphi(m)\ge\varphi(p_i^{q_i})\ge q_i\)。
所以 \(x^a\equiv 0\pmod{p_i^{q_i}}\)。
而因为 \(a\bmod\varphi(m)+\varphi(m)\ge \varphi(m)\),
所以肯定也有 \(x^{a\bmod\varphi(m)+\varphi(m)}\equiv0\pmod{p_i^{q_i}}\)。
所以 \(x^a\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{p_i^{q_i}}\)。
因此我们证明了 \(\forall i,x^a\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{p_i^{q_i}}\) 都必然成立,因此 \(x^a\equiv x^{a\bmod\varphi(m)+\varphi(m)}\pmod{m}\)。
证毕。
这下再也不用担心指数爆炸了!
费马小定理
现在我们来讲讲费马小定理:若 \(p\) 是质数且 \(x\) 不是 \(p\) 的倍数,则:\(x^{p-1}\equiv1\pmod{p}\)。
证明是显然的:因为 \(p\) 是质数且 \(x\) 不是 \(p\) 的倍数,所以 \(\gcd(x,p)=1\),因此有欧拉定理 \(x^{\varphi(p)}\equiv1\pmod{p}\),而因为 \(p\) 是质数,所以有 \(\varphi(p)=p-1\),所以 \(x^{p-1}\equiv1\pmod{p}\)。
可以说,费马小定理就是欧拉定理一个更加特殊的情况。
你可能会问:那费马小定理有什么用呢?
你要单说它的用处,它确实没什么特别的地方。但它最大的优势就在于它简洁的形式,这也让它成为求逆元一种很受欢迎的方式:
因为你会发现题目中的模数常常是 \(10^9+7,998244353\) 这些质数(如果不是质数大部分时候都可以转化成不需要除法的形式),因此费马小定理在求逆元上就取得了巨大的优势。
尾声
舍得舍得,先舍后得。欧拉函数舍弃了非互质数,却得到了更优美的性质;费马小定理舍弃了原本的限制,却得到了更加简洁的等式。有的时候,舍弃其实是为了更好的得到。人亦如此:有的人可以为了竞赛而暂时放弃文化课;有的人为了更加理性清晰的思考而舍弃掉最本真的情感。舍弃不是放弃,得到也不是成功。舍得只是漫漫征途上的短短的一条路。但是,缺少了任何一条路,我们都无法抵达终点。
因为有悔,所以披星戴月;因为有梦,所以奋不顾身。

浙公网安备 33010602011771号