首页 > 其他分享 >快速幂定义

快速幂定义

时间:2024-04-26 23:47:31浏览次数:19  
标签:myPow 13 return 定义 int 底数 mid 快速

1.参考

参考:数据结构与算法 - 矩阵快速幂

2.思路

如果直接求取 M^n,时间复杂度是 O(n),可以用快速幂算法来加速这里 M^n的求取, 简化时间复杂度为 O(logn)
主体思路就是不求 M^n 而是求 M^(n/2), 然后先不求M^(n/2), 先求M^(n/4)

代码

1.递归实现快速幂

最直接的写法是使用递归:(求x^n)
这里if (n & 1) 是判断奇偶性的, 决定是 midmidx 还是 mid*mid, 结束条件 x^0 = 1;

double _myPow(double x, long long n)
{
    if (n == 0)
        return 1;
    if (n < 0)
        return 1 / _myPow(x, -n);
    double mid = _myPow(x, n / 2);
    if (n & 1)
        return mid * mid * x;
    return mid * mid;
}

2.二进制分解

此外还有另外一个代码实现技巧:二进制分解,n -> 1, 2, 4, 8, 16, 32。n 可以分解为 2 的幂次的和 。
例如 13 = 8 + 4 + 1, 求 a^13 需要求 a^8, a^4, a^1, 可以用变量存 a^1, a^2, ..., a^(n-1)
如果当前幂次是 n 需要的,则加到结果中。如何判断当前幂次是否需要,可以用位掩码来决定,即下面代码中的 n&1。

在代码中,通过循环进行迭代,每次迭代都将指数 N 右移一位(相当于除以 2),同时将底数 M 平方。
这样就相当于把指数 N 不断地除以 2,并且将底数 M 不断地平方,直到指数 N 变为 0。
在每一次迭代中,如果当前位为 1(即 n & 1 的结果为非零),就将结果乘以当前的底数 M。

主要思路就是标志+还原(标志:这里通过二进制位是否为1判断是否相乘; 还原: 配合a *= a; 底数a平方次增长, 还原对应的二进制位数使用 n >>= 1即可解决)
比如像13 = 1101
我们这里的 a^1 对应的第0位开始判断, 如果为1, 说明需要乘上;
然后

int quickpower(int a, int n)
{
    // a==0 && n==0 特判
    int ans = 1; // n = 0 时候不进循环
    while(n)
    {
        if(n & 1) ans *= a;
        a *= a;
        n >>= 1;
    }
    return ans;
}

3.例子

可看 50.Pow(x,n) _

标签:myPow,13,return,定义,int,底数,mid,快速
From: https://www.cnblogs.com/trmbh12/p/18160394

相关文章

  • 探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
    DTD是文档类型定义(DocumentTypeDefinition)的缩写。DTD定义了XML文档的结构以及合法的元素和属性。为什么使用DTD通过使用DTD,独立的团体可以就数据交换的标准DTD达成一致。应用程序可以使用DTD来验证XML数据的有效性。内部DTD声明如果DTD在XML文件内声......
  • 自定义单链表队列的基本接口函数(非循环队列)
    单链表构建队列的接口函数/********************************************************************文件名称: 单链表构建队列的接口函数文件作者:[email protected]创建日期:2024/04/26文件功能:对单链表循环队列的增删改查功能的定义注意事项:NoneCop......
  • vue3 快速入门系列 —— 状态管理 pinia
    其他章节请看:vue3快速入门系列Piniavue3状态管理这里选择pinia。虽然vuex4已支持Vue3的CompositionAPI,但是vue3官网推荐新的应用使用pinia——vue3pinia集中式状态管理redux、mobx、vuex、pinia都是集中式状态管理工具。与之对应的就是分布式。Pinia符......
  • 矩阵快速幂
    1.参考参考:【矩阵快速幂】简单题学「矩阵快速幂」2.定义2.1定义如果直接求取M^n,时间复杂度是O(n),可以定义矩阵乘法,然后用快速幂算法来加速这里M^n的求取,简化时间复杂度为O(logn)主体思路就是不求M^n而是求M^(n/2),然后先不求M^(n/2),先求M^(n/4)具体实现同......
  • django自定义构建模板,通过bootstrap实现菜单隐藏和显示
    实现后的界面1.自定义页面模板实现主页面代码(home.html){%extends'layout.html'%}#引用模板{%loadstatic%}{%blockcontent%}<h3>欢迎登录</h3>{%endblock%}自定义内容layout.html文件设置(模板){%loadstatic%}{%loadmenu%}#导入m......
  • 抖音商单信息通过ETL工具快速同步
    一、抖音平台抖音是一款热门的短视频社交平台,拥有海量用户和高度活跃的商业生态。在抖音上,商家可以开设商铺并发布商品,消费者可以在平台上购买商品并获得优惠。同时,抖音也是一个广告平台,商家可以通过购买广告位来宣传产品。在这样一个大环境下,商家和消费者都需要保持良好的数据同......
  • 【知识点】快速幂与矩阵快速幂
    什么是快速幂,为什么要使用快速幂?Macw:快速幂有好多好处。Penelope:例如?Macw:它比较快。见名知意,快速幂算法可以在非常短的时间内求出一个数的\(n\)次幂。虽然快速幂在初学阶段的应用不算太多,但是快速幂背后的思想是非常值得我们去理解的。举例而言,如果我们要求出\(3^......
  • 声明和定义,初始化和赋值
    在学习C\C++的过程中有两组概念需要注意:声明(declarartion)和定义(definition)、初始化(initialization)和赋值(assginment)。C语言中初始化和赋值可以认为是一样的,但在C++中这两个是不同的概念。/* 定义和声明 */inti; //全局变量同时声明和定义i和jintj=10;exte......
  • 读《我和Labview》6用户自定义控件
    枚举枚举型控件与下拉列表控件的比较单选按钮控件创建和使用一个枚举控件用户自定义控件创建一个自定义控件自定义控件的组成部分修改控件的组成部分简单动画自定义类型严格自定义类型......
  • ollama——快速上手Llama3部署使用
    ollama——快速上手Llama31.ollama安装#Linuxcurl-fsSLhttps://ollama.com/install.sh|sh#vi/etc/systemd/system/ollama.service[Unit]Description=OllamaServiceAfter=network-online.target[Service]ExecStart=/usr/local/bin/ollamaserveUser=ollamaGrou......