欧拉定理是数论中一个非常重要的定理:若正整数
与
互质,则
这里的
是欧拉函数,即小于或等于
且与
互质的正整数个数。当
是质数
时,欧拉定理退化成费马小定理
。
我们稍后再来证明欧拉定理。在算法竞赛中,我们常常会用到它的一个重要的推论:若正整数
与
互质,则
(这是因为
)
利用这个推论,即使
比较大,我们也可以轻松地计算
的值,但需要满足
与
互质的前提。
为了解决
与
不互质时的此问题,我们引入
拓展欧拉定理:若
,则:
这里仍有前提条件,但影响不大,因为
时直接用快速幂计算即可。
当
与
,
式显然成立。
当
与
,我们只需要证明对于每个
,都有
即可。因为如果设
、
互质,且
同时
,则
必成立(
既是
的倍数又是
的倍数),所以这里可以进行合并。
现在再分类讨论
。
- 若
,则 :
(注意到
必然是
的倍数,因为欧拉函数是
积性函数)
- 若
,则的倍数。设,注意到,可以证明。则:
所以
是
的因数,也是
的因数,即:
综上,
代码实现时可以边读入边取模,另外一定要注意这个式子仅在
时成立。
#include
附:欧拉定理的群论证明
欧拉定理的初等证明这篇博客讲得很清楚了。这里讲一个我觉得很有意思的群论证明。(需要一点点抽象代数基础)
设
是正整数,则小于
且与
互质的正整数组成集合
,又设
,则代数系统
满足:
- 封闭性,因为
,故必与互质
- 结合律,这是显然的
- 存在单位元
- 对于每个元素
必存在逆元。即模的乘法逆元(注意与互质,故乘法逆元必存在)
所以该代数系统是群。这个群的阶数是
,根据群论的
拉格朗日定理:
有限群的阶数是群中元素的阶数的整数倍,取任意
,设
的阶数是
,于是
,所以
。证毕。
Pecco:算法学习笔记(目录)zhuanlan.zhihu.com