最大公因数
数论分块
一般是求
i≤n∑i=1⌊ni⌋
考虑 ⌊ni⌋ 的值可能会重复,所以可以算出 ⌊ni⌋ 每一段相同的值以及其区间。
接下来考虑如何求出 ⌊ni⌋ 每一段相同的值以及其区间。
方法就是用
while (l <= n) {
r = n / (n / l);
l = r + 1;
}
r=l+1
很好理解,主要是看r=n/(n/l)
在括号里的n/l
其实是指当前这一段 ⌊ni⌋ 的值。
将n/l
在套一个n/
是指 ⌊ni⌋=n/l 中最大的 i
费马小定理
若 p 为素数,gcd(a,p)=1,则 ap−1≡1 (mod p).
引理
-
引理1:若 a,b,c 为任意 3 个整数,m 为正整数,且 gcd(m,c)=1,
则当 a∗c≡b∗c (mop m) 时,有 a≡b (mod m).
证明:
a∗c≡b∗c (mod m) 可得 ac−bc≡0 (mod m) ,即 (a−b)c≡0 (mod m).
因为 gcd(m,c)=1 即 m,c 互质,c 可以约去,a−b≡0 (mod m),a≡b (mod m).
-
引理2:设 m 是一个整数且 m>1,b 是一个整数且 gcd(m,b)=1。如果 a[1],a[2],a[3],a[4],…a[m] 是模 m 的一个完全剩余系,则 b⋅a[1],b⋅a[2],b⋅a[3],b⋅a[4],…b⋅a[m] 也构成模 m 的一个完全剩余系。
证明:若存在2个整数 b⋅a[i] 和 b⋅a[j] 同余即 b⋅a[i]≡b⋅a[j](mod m)(i>=1,j>=1),根据引理1则有 a[i]≡a[j](mod m)。根据完全剩余系的定义可知这是不可能的,因此不存在 2 个整数 b⋅a[i] 和 b⋅a[j] 同余。
所以 b⋅a[1],b⋅a[2],b⋅a[3],b⋅a[4],…b⋅a[m] 也构成模 m 的一个完全剩余系。
证明:
设一个质数为 p,我们取一个不为 p 倍数的数 a.
构造素数 p 的完全剩余系:P=1,2,3,…,p−1
因为 gcd(a,p)=1,有引理2得:A=a,2a,3a,4a,…,(p−1)a 也是一个完全剩余系,由完全剩余系的性质,
得 1×2×3×⋯×(p−1)≡a⋅2a⋅⋯⋅(p−1)a (mod p).
即 (p−1)!≡(p−1)!⋅ap−1 (mod p).
易证:gcd((p−1)!,p)=1 ,根据引理1,约去 (p−1)! ,得到
ap−1≡1(modp)
由此费马小定理得证.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!