• 数论学习笔记 - 同余及其拓展知识


    同余定义

    若 a,b 为两个整数,且它们的差 a-b 能被某个自然树 m 所整除,则称 a 就模 m 来说同余于 b,或者说 a 和 b 关于模 m 同余,记为:a\equiv b(modm)。它意味着:a-b=m*k(k为某一个整数)。

    同余类与剩余系

    对于任意a∈[0,m-1],集合 {a+km}(k属于Z) 的所有数模 m 同余,余数都是 a。该集合称为一个模 m 的同余类,简记为\bar{a}

    模 m 的同余类一共有 m 个,分别为 \bar{0},\bar{1},\bar{2},...,\bar{m-1}。它们构成 m 的完全剩余系

    1~m 中与 m 互质的数代表的同余类共有 φ(m) 个,它们构成 m 的简化剩余系

    简化剩余系关于模 m 乘法封闭。这是因为若 a,b(1≤a,b≤m) 与 m 互质,则 a*b 也不可能与 m 含有相同的质因子,即 a*b 也与 m互质。再由余数的定义即可得到 a*b mod m 也与 m 互质,即 a*b mod m 也属于 m 的简化剩余系。

    快速幂

    根据数学常识,每一个正整数可以唯一表示为若干指数不重复的2的次幂的和。也就是说,如果 b 在二进制表示下有 k 位,其中第 i(0≤i

    b=c_{k-1}2^{k-1}+c_{k-2}2^{k-2}+...+c_{0}2^{0}

    于是:

    a^{b}=a^{c_{k-1}*2^{k-1}}*a^{c_{k-2}*2^{k-2}}*...*a^{c_{0}*2^{0}}

    所以我们很容易通过 k 次递推求出每个乘积项,当 ci=1 时,把该乘积项累积到答案中。b&1 运算可以取出 b 在二进制表示下的最低位,而 b>>1 运算可以舍去最低位,在递推的过程中将二者结合,就可以遍历 b 在二进制表示下的所有数位 ci。整个算法的时间复杂度为 O(logb)。

    题目链接

    代码示例

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. int a,b,p;
    8. int power(int a,int b,int p){
    9. int ans=1;
    10. for(;b;b>>=1){
    11. if(b&1) ans=(long long)ans*a%p;
    12. a=(long long)a*a%p;
    13. }
    14. return ans;
    15. }
    16. int main(){
    17. cin>>a>>b>>p;
    18. cout<"^"<" mod "<"="<<power(a,b,p)<
    19. }

    费马小定理

    若 p 是质数,则对于任意整数 a,有a^{p}\equiv a(mod p)

    欧拉定理

    若正整数 a,n 互质,则 a^{\varphi (n)}\equiv 1(mod n),其中 φ(n) 为欧拉函数

    当 p 是质数时,φ(p)=p-1,并且只有 p 的倍数与 p 不互质。所以,只要 a 不是 p 的倍数,就有a^{p-1}\equiv 1(mod p),两边同乘 a 就是费马小定理。另外,若 a 是 p 的倍数,费马小定理显然成立

    欧拉定理的推论

    若正整数 a,n 互质,则对于任意正整数 b,有 a^{b}\equiv a^{b mod\varphi (n)}(mod n)

    许多计数类的题目要求我们把答案对一个质数 p 取模然后输出。面对 a+b,a-b,a*b 这样的算式,可以在计算前先把 a,b 对 p 取模。面对乘方算式,根据欧拉定理的理论,可以先把底数对 p 取模、指数对 φ(p) 取模,再计算乘方。

    特别地,当 a,n 不一定互质且 b>φ(n) 时,有 a^{b}\equiv a^{b mod\varphi (n)+\varphi (n)}(mod n)。这意味着即使底数和模数不互质,我们也有办法把指数的规模缩小到容易计算的范围内。上式可以通过寻找 a^{b}modn 的指数循环节证明。

     

  • 相关阅读:
    centos7.9部署nexus内网源服务器(yum,apt)
    Sanic​——Python函数变成API的神器
    unordered_set和unordered_map的使用【STL】
    OpenCV-Python学习(4)—— OpenCV 图像对象的创建与赋值
    使用VMware 16 安装中标麒麟 7 --九五小庞
    JeecgBoot搭建及启动笔记
    pyqt5设置背景图片
    [QCM6125][Android13] 大屏显示时任务栏以及虚拟按键靠右问题
    PyCharm 虚拟环境搭建
    Redis高级数据结构HyperLogLog
  • 原文地址:https://blog.csdn.net/haobowen/article/details/126267597