首页 > 其他分享 >快速幂的实现及原理分析

快速幂的实现及原理分析

时间:2024-02-02 21:31:54浏览次数:21  
标签:分析 return int double result pow 次方 原理 快速

快速幂(Exponentiation by squaring)或称:平方求幂,是一种高效计算幂函数的算法。

其以O(logN)的时间复杂度求任意乘方。

本质上,快速幂是分治思想的一种应用。

案例引入

欲求8的6次方

常规算法:

private double pow(double x, int y) {
    double result = 1;
    for (int i = 0; i < y; i++) {
        result *= x;
    }
    return result;
}

该算法的时间复杂度为O(N)

从数学推导

数学公式: $$ a ^ n * a ^ n = a ^ {2n} \ a ^ n * a ^ m = a ^ {n + m} $$ 以此作为突破,整理思路。

欲计算 6 次方,则该式简化为: $$ 8 ^ 6 = 8 ^ 3 * 8 ^ 3 ;;;① \ 8 ^ 3 = 8 ^ 2 * 8 ^ 1;;;②\ 8 ^ 2 = 8 ^ 1 * 8 ^ 1;;;③ $$ 根据上述理论,可以写出如下方程式: $$ a ^ n = \left{\begin{matrix} a ^ {n - 1},;;;;;;;; n是奇数\ a ^ \frac{n}{2} * a ^ \frac{n}{2},;;;; n是偶数 \ 1,;;;;;;;;;;;n为0 \end{matrix}\right. $$ 整理为代码:

private double pow(double x, int y) {
        if (y == 0) {
            return 1;
        } else if (y % 2 == 1) {
           return pow(x, y - 1) * x; 
        } else {
            double temp = pow(x, y / 1);
            return temp * temp;
        }
    }

其中,利用到了 二分查找 的思想。

递归虽然简洁,但会产生额外的栈空间开销。将递归改写为递推(循环),来避免对栈空间的大量占用,也就是非递归快速幂

非递归快速幂

从另一个视角引入快速幂:

已知定理:

任何自然数都可以转化为 2的n次方相乘

例: $$ 2023 = (0111; 1110; 0111)_{2} = 2^0+2^1+2^2+2^5+2^6+2^7+2^8+2^9+2^{10} $$ 二进制上从右往左第n位,分别代表2 的 n - 1次方,而所有的数都可以用二进制表示,所以我们可以根据二进制来优化幂的计算。

也就是说,所有的幂计算都可以看作是底数的2的n次方幂相乘

例如: $$ 3^{999} = 3^{512}+3^{256}+3^{128}+3^{64}+3^{32}+3^{4}+3^{2}+3^{1} $$ 其中 512、256、128、64、32、4、2和1都是 2 的 n 次方。

将以上理论转化为代码可得:

double pow(double x, int y){
        double result = 1;
        while (y != 0)
        {
            if ((y & 1) == 1) {
                result *= x;
            }
            y >>= 1;      
            x *= x;
        }
        return result;
    }

y < 0时,上述代码存在问题。

则修改为:

public double pow(double x, int y) {
        double result = 1.0;
        if(y < 0) {
            x = 1 / x;
            y = -y;
        }
        while(y > 0) {
            if((y & 1) == 1) {
                result *= x;
            }
            x *= x;
            y >>= 1;
        }
        return result;
    }

标签:分析,return,int,double,result,pow,次方,原理,快速
From: https://blog.51cto.com/ErickRen/9562491

相关文章

  • 出海业务如何搭建国内也能快速访问的https网站与接口(无需备案)
    背景信息由于最近在搭建我的出海网站https://www.idatariver.com/zh-cn,感兴趣的可以看看。其中一个环节便是给后端API接口加上ssl,毕竟http看着不如https,但因为没有备案,所以不能使用国内的服务器(国内未备案域名是不开放服务器443和80端口的),本文便是解决怎么在网站没有备案的......
  • [Flink] Flink源码分析 : BoundedOutOfOrdernessTimestampExtractor
    0序言0.1缘起importorg.apache.flink.api.common.functions.MapFunction;importorg.apache.flink.api.java.tuple.Tuple;importorg.apache.flink.api.java.tuple.Tuple3;importorg.apache.flink.configuration.Configuration;importorg.apache.flink.configuration.......
  • (数据科学学习手札158)基于martin为在线地图快速构建精灵图服务
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,martin作为快速发展中的新一代开源高性能地图服务框架,在之前的两篇文章中,我已为大家分别介绍过使用martin快速发布矢量切片地图服务(https://www.cnblogs.co......
  • 智能分析网关V4+EasyCVR视频融合平台——高速公路交通情况的实时监控和分析一体化方案
    随着2024年春运帷幕的拉开,不少人的返乡之旅也即将开启,从这几日的新闻来看,高速上一路飘红。伴随恶劣天气,加上激增的车流,极易导致高速瘫痪,无法正常使用。为解决此问题,助力高速高效运营,TSINGSEE青犀智能分析网关V4+EasyCVR视频融合平台——高速公路一体化监控体系给出答案。1、视频......
  • 2023爱分析·知识库问答市场厂商评估报告:爱数
    01研究范围定义研究范围:大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来,ChatGPT引爆全球大模型市场。国内众多大模型先后公测,众多互联网领军者投身大模型事业,使得大模型市场进入“百团大战”阶段,2023年成为公认的“大模型元年”。......
  • 模型训练ppo如何评估分析
        1 11  11 1 1    1 11 1   11 11   1在使用PPO(ProximalPolicyOptimization)算法进行模型评估时,可能会出现相同模型但评估结果不同的情况。这种情况可能是由以下几个原因导致的:1.数据集不同:如果使用......
  • R语言时变向量自回归(TV-VAR)模型分析时间序列和可视化|附代码数据
    全文链接:http://tecdat.cn/?p=22350 最近我们被客户要求撰写关于时变向量自回归(TV-VAR)模型的研究报告,包括一些图形和统计输出。在心理学研究中,个人主体的模型正变得越来越流行。原因之一是很难从人之间的数据推断出个人过程另一个原因是,由于移动设备无处不在,从个人获得的时间......
  • 如何通过ETL实现快速同步美团订单信息
    一、美团外卖现状美团作为中国领先的生活服务电子商务平台,其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步,但由于数据量庞大且来源多样化,传统的手动处理方式效率低下,容易出错。比如,不同渠道的数据格式不一致,需要进行数据清洗和格式转换;数据量大......
  • R语言社区检测算法可视化网络图:ggplot2绘制igraph对象分析物种相对丰度
    原文链接:http://tecdat.cn/?p=23836原文出处:拓端数据部落公众号我们使用R中的igraph包,产生了网络的图形。但是很难将这些图表放到演讲和文章中,因为图表很难根据需要定制。使用igraph中的绘图功能可以得到你想要的结果,但用ggplot对工作更有帮助。所以本文探索了一种在ggplot中创......
  • 推荐系统实现原理介绍
    1:推荐系统简易架构图2:推荐引擎流程图Mixer系统的用户推荐就是按照上面流程实现,接下来分别介绍各个功能3:索引内容1:索引目的是提供高效查询索引内容就是将内容生产索引文件,目的是提高查询速度,不可能每个请求过来都把所有的数据查出来,然后过滤、计算特征、排序、最后将排在前......