数论

最大公因数

  • 直接使用__gcd(x,y)

  • 手写 gcd

    inline int gcd(int a,int b)
    {
        if(b==0)return a;
        return gcd(b,a%b);
    }
    

数论分块

一般是求

i=1inni

考虑 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,则 ap11 (mod p).

引理

  • 引理1:若 a,b,c 为任意 3 个整数,m 为正整数,且 gcd(m,c)=1

    则当 acbc (mop m) 时,有 ab (mod m).

    证明:

    acbc (mod m) 可得 acbc0 (mod m) ,即 (ab)c0 (mod m).

    因为 gcd(m,c)=1m,c 互质,c 可以约去,ab0 (mod m)ab (mod m).

  • 引理2:设 m 是一个整数且 m>1b 是一个整数且 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,,p1

因为 gcd(a,p)=1,有引理2得:A=a,2a,3a,4a,,(p1)a 也是一个完全剩余系,由完全剩余系的性质,

1×2×3××(p1)a2a(p1)a (mod p).

(p1)!(p1)!ap1 (mod p).

易证:gcd((p1)!,p)=1 ,根据引理1,约去 (p1)! ,得到

ap11(modp)

由此费马小定理得证.

posted @   tyccyt  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示