欧拉定理、扩展欧拉定理与费马小定理

前言

今天刚讲了数学,所以来写一篇跟数学有关的文章。

当然还有个原因是我喜欢数学。

虽然我之前的博客写过一次了。

欧拉定理

在认识欧拉定理之前,我们需要先认识欧拉函数:\(\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\)。

那这个欧拉函数有什么性质呢?我们来介绍一下:

  1. 欧拉函数是积性函数,即对于任意两个互质的正整数 \(a,b\),有 \(\varphi(ab)=\varphi(a)\varphi(b)\)。

  2. \(x=\sum_{d|x}\varphi(d)\)。

  3. 若 \(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)\) 的。

原理很简单,就是在线性筛质数的时候顺便算出函数值,我觉得不需要我讲解太多。

另外还有一种线性算欧拉函数的,代码如下:

for(int i=1;i<=n;i++)
{
	prime[i]=true;
}
prime[1]=false;
for(int i=2;i<=n;i++)
{
	if(prime[i])
	{
		phi[i]=i-1;
		v.push_back(i);
	}
	for(auto j:v)
	{
		if(i*j>n)
		{
			break;
		}
		prime[i*j]=false;
		if(i%j==0)
		{
			phi[i*j]=phi[i]*j;
			break;
		}
		phi[i*j]=phi[i]*phi[j];
	}
}

这个代码的时间复杂度是 \(O(n)\) 的。

扩展欧拉定理

上面我们说过:若 \(\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\) 不互质的情况有两种,我们分别来考虑一下:

  1. \(x\) 是 \(m\) 的倍数时,显然此时 \(x^a\equiv0\pmod{m}\)。

  2. \(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}}\),结合上面的结论,我们就可以证明扩展欧拉定理了。

我们分类讨论一下:

  1. \(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}}\)。

  2. \(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\) 就能观察出来这个结论:\(\varphi(p_i^{q_i})\ge q_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}\)。

证毕。


这下再也不用担心指数爆炸了!

当然,因为扩展欧拉定理可以将指数降次,所以很多时候我们可能会将很多个欧拉函数套一起,也就是算 \(\varphi(\varphi(\dots))\) 这种东西。可以证明,在不断套用下去的过程中,最多只需要 \(\log x\) 次这个值就会变成 \(1\),证明如下:


若当前的 \(x\) 为奇数,那么我们可以知道 \(\varphi(x)\) 必然是偶数。

若当前的 \(x\) 为偶数,那么可以得到 \(\varphi(x)\le\frac{x}{2}\)。

所以最多只需要接近 \(\log x\) 次就可以把这个东西变成 \(1\)。

上面两个结论都可以通过欧拉函数的算法得出。

证毕。


费马小定理

现在我们来讲讲费马小定理:若 \(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}\)。

可以说,费马小定理就是欧拉定理一个更加特殊的情况。

你可能会问:那费马小定理有什么用呢?

你要单说它的用处,它确实没什么特别的地方。但它最大的优势就在于它简洁的形式,这也让它成为求逆元一种很受欢迎的方式:

\[x^{p-1}\equiv1\pmod{p}\Rightarrow x^{p-2}\equiv x^{-1}\pmod{p} \]

因为你会发现题目中的模数常常是 \(10^9+7,998244353\) 这些质数(如果不是质数大部分时候都可以转化成不需要除法的形式),因此费马小定理在求逆元上就取得了巨大的优势。

尾声

舍得舍得,先舍后得。欧拉函数舍弃了非互质数,却得到了更优美的性质;费马小定理舍弃了原本的限制,却得到了更加简洁的等式。有的时候,舍弃其实是为了更好的得到。人亦如此:有的人可以为了竞赛而暂时放弃文化课;有的人为了更加理性清晰的思考而舍弃掉最本真的情感。舍弃不是放弃,得到也不是成功。舍得只是漫漫征途上的短短的一条路。但是,缺少了任何一条路,我们都无法抵达终点。

因为有悔,所以披星戴月;因为有梦,所以奋不顾身。

posted @ 2026-07-31 15:44  cwxcplh  阅读(25)  评论(1)    收藏  举报