首页 > 其他分享 >快速幂、龟速乘总结

快速幂、龟速乘总结

时间:2023-11-13 14:35:11浏览次数:27  
标签:龟速 总结 10 int res 权值 快速 MOD

快速幂、龟速乘总结

一、快速幂

求 \(a^b\ mod \ p\) 的结果。

\(Code\)

// 快速幂(不加mod)
int qmi(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = res * a;
        b >>= 1;
        a = a * a;
    }
    return res;
}

// 快速幂
int qmi(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = (res * a) % MOD;
        b >>= 1;
        a = a * a % MOD;
    }
    return res;
}

解释一下

假如我们需要计算\(2^{10}\),正常的办法是

   int s = 1;
   for (int i = 1; i <= 10; i++) s = s * 2;
   cout << s << endl;

毫无疑问,这个算法是正确的。但它执行的次数是\(10\)次,有没有什么办法可以优化一下运算次数呢?

优化

将\(10\)进行二进制分解\((10)_{10}=(1010)_2\)
这样处理后,从后向前,借助于我们熟悉的数位分离模板,就是遍历二进制的每一位。

此时,我们发现,最左面的数字\(1\),权值是\(8\),第三位的数字权值是\(2\)

同时,\(2^8*2^2=2^{10}\)

为什么会有这么神奇的现象呢?其实就是因为幂运算的性质造成:

\[\large 2^{10}=2^{8+2}=2^8*2^2 \]

\(Q:\)为啥非得拆成\(8+2\),为啥不拆成\(7+3\)呢?
就是因为类似于 倍增 的办法在计算中好处理呗!

\(a\)在代码中的使命就是:我不管你用不用的上,反正我每次是翻倍!
而枚举\(b\)的每一个数位,就是看看这个位置上的当前\(a\)是不是需要乘进来!幂运算的性质成功的把幂与二进制加法结合起来了。

把倍增的思路\(2,4,8,16,32,...\)这样长上来的,这是因为
\(2^1*2^1=2^2\)
\(2^2*2^2=2^4\)
\(2^4*2^4=2^8\)
\(2^8*2^8=2^{16}\)
\(2^{16}*2^{16}=2^{32}\)

模板题 : \(P1226\) 【模板】快速幂||取余运算

二、龟速乘

求 \(a*b\ mod \ p\) 的结果,\(a,b,p\) 都是 \(10^{18}\) 级别。

\(Code\)

// 龟速乘,快速加
int qadd(int a, int b) {
    int res = 0;
    while (b) {
        if (b & 1) res = (res + a) % MOD;
        b >>= 1;
        a = (a + a) % MOD;
    }
    return res;
}

这东西怎么理解呢?

举栗子吧

\(5*6_{10}=5*(110)_2\)

最右侧的\(0\)对就的权值是\(5^1=5\) ①
右侧第二的\(1\)对就的权值是\(5*2=10\) ②
右侧第三的\(1\)对就的权值是\(10*2=20\) ③

而\(② ③\)对应的位置上有数字\(1\),有效,\(①\)无效
结果就是\(10+20=30\)

标签:龟速,总结,10,int,res,权值,快速,MOD
From: https://www.cnblogs.com/littlehb/p/17829015.html

相关文章

  • 人大金仓数据库的快速安装部署
    人大金仓数据库的快速安装部署说明人大金仓数据库是1999年以王珊教授为代表,中国人民大学一批最早在国内开展数据库教学、科研、开发的专家,创立了我国第一家数据库公司——人大金仓。王珊教授师从萨师煊教授.是中国人民大学的博士生导师人大金仓的创立时间实际上是比武汉......
  • stm32f103rbt6芯片部分知识点总结。
    使用的工具开发板:stm32f103rbt6内核:arm-cotex-m3系类v7架构r:64脚,b:128字节,6:工作温度范围muc就是stm32单片机芯片,soc是带操作系统的开发板,例如a53。 学习的主要内容掌握接口编程技术即裸板驱动开发通过直接写寄存器(寄存器地址=基地址加偏移地址)或调用函数实现cpu对......
  • 每日总结
    今天我对大型数据库练习题进行了复习, 相关sql代码如下:createdatabasedb001;createtablesale_sample(day_idstringcomment'日期编号',sale_nbrstringcomment'卖出方代码',buy_nbrstringcomment'买入方代码',cntstringcomment'数量',......
  • nuclei 快速&可自定义的基于DSL的漏洞扫描工具
    nuclei是基于golang开发的,可以使用基于yaml定义的dsl,支持扫描不少协议(tcp,dns,http,ssl,file,whois,websocket,headless,以及code)同时nuclei也提供了不少模版可以方便快速使用说明nuclei使用简单,主要包含两步,定义yaml文件,运行,同时提供了大量可用的模版是一个很不错的安全工具,很值......
  • [C#] 无序数组快速删除
    原文链接:https://dotnet9.com/2023/11/csharp-array-deletion-secret-quick-deletion-techniques-reveal-secrets-make-your-code-more-efficient将需要删除的元素和数组的最后一个元素进行交换。删除数组的最后一个元素。时间复杂度O(1)......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • 11.13每日总结
    今天早上进行了软件设计模式的上机实验[实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如......
  • 每日总结
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。Client:packagetutorial12;publicclassClient{     publicstaticvoidmain(String[]args){        //T......
  • 学期2023-2024-1 20231409 《计算机基础与程序设计》第七周学习总结
    学期2023-2024-120231409《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第七周作业这个作业的目标自学教材:数组与链表,基于数组和基于链表实现数据结构,......
  • 11月6号总结
    今天又是一个新的一周,上周末参加婚礼回家爽了两天还没缓过进来,早上又是一如既往的实训课程,学会了家庭电路的简单排线。下午学习了java的语法知识之后有练习了还是之前的数据结狗连接。还是得继续练习熟能生巧。de ......