[算法]—快速幂算法及优化

从暴力到优雅:C++快速幂算法的核心优化与位运算实践 本文深入探讨了C++中快速幂算法的核心优化与位运算实践,从暴力循环到数学优化,再到位运算的极致性能提升。通过详细的代码示例和性能对比,展示了如何将时间复杂度从O(n)降至O(logn),并介绍了现代C++中的进阶实现和应用场景。 阅读详情

普通求幂算法

我们先来看一道例题 hdu 2035

人见人爱A^B
题目描述

求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”

Input

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Iutput

2 3
12 6
6789 10000
0 0

Sample Output

8
984
1

解题思路:最简单的思路应该是讲数据求出然后对1000取余求出最后3位数字,我们都听说过指数爆炸这个概念吧,结果会随着指数增加而爆炸式增长,而且6789的10000次方即使long long 类型也存不下,下面我们先来介绍一组数学公式

  1. (a + b) % c = ((a%c) + (b%c)) % c
  2. a * b % c = ( (a%c) * (b%c) ) % c
  3. a / b % c = ((a%c) / (b%c)) %c
    所以我们可以对每个因子进行取模运算,从而减小数据大小
    下面为C语言代码
#include <stdio.h>

long long quit(long long x, long long y)
{
    long long  ans = 1;
    for(int i = 1; i <= y; i++)
    {
        ans *= x;
        ans = ans%1000;
    }
    return ans%1000;
}
int main(void)
{
    long long a, b, ans;
    while(~scanf("%lld%lld", &a, &b))
    {
        if(a == 0 && b == 0) break;
        ans = quit(a, b);
        printf("%d\n", ans);
    }
    return 0;
}

普通求幂算法的时间复杂度为O(n),当我们想求2的1000000000的最后3位数时需要的时间会很长

什么是快速幂算法

快速幂算法的核心思想时讲指数减少而将底数增大从而减少循环次数
我们来看一个栗子

2 ^ 9 = 28 * 2 //此时底数为2
=44 * 2//此时底数为4
=162 * 2//此时底数为16
=2561 * 2//此时底数为256
可以看出 29 结果等于所有指数为奇数时的底数的乘积

下面我们用代码演示!

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power % 2 == 0)//如果指数为偶数
        {
            power /= 2;//把指数缩小一半
            base = base * base % 1000;//底数平方
        }
        else
        {
            power--;//指数减一
            power /= 2;//把指数缩小一半
            ans *= base % 1000;//指数为奇数时的积
            base = base * base % 1000;//底数平方
        }
    }
    return ans;
}

快速幂算法的优化

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power % 2 == 1)
        {
            ans *= base % 1000;
        }
        power /= 2;
        base *= base % 1000;
    }
    return ans;
}

最终优化

我们可以将power % 2 == 1 用更快的 power&1来代替,这种运算被称为“位运算”,power&1,在二进制中如果最后一位为1,那么该数为奇数,如果最后一位为0,那么最后一位为偶数,此时与1进行&运算,若为奇数,则结果为1,若为偶数则结果为0‘
于是代码为

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power&1)
        {
            ans *= base % 1000;
        }
        power /= 2;
        base *= base % 1000;
    }
    return ans;
}

本篇文章参考:https://blog.youkuaiyun.com/qq_19782019/article/details/85621386

(仅供个人学习使用)

算法之矩阵快速幂优化 在斐波那契的计算中,矩阵乘法的作用是降低时间复杂度为O(logN)。 普通的斐波那契f(n)=f(n-1)+f(n-2)的核心代码: //这种接法的关键在于矩阵的赋值[[1,1],[1,0]] #include<bits/stdc++.h> using namespace std; vector<vector<long long>> fun(vector<vector<long long>> a,vector<vector<long 阅读详情

相关推荐

从递归到矩阵快速幂:斐波那契数列的C++算法优化全解析

算法优化是提升程序性能的核心,其本质在于通过改进策略降低时间与空间复杂度。以经典的斐波那契数列问题为例,其定义简单,但不同的实现策略效率天差地别,这背后涉及递归、**动态规划**等关键算法思想。递归实现直观但存在指数级重复计算,通过引入**记忆化**(缓存中间结果)可优化为线性时间,这体现了用空间换时间的基本权衡。进一步地,自底向上的迭代(动态规划)能消除递归开销,并通过状态压缩将空间复杂度降至常数,这是工程实践中的通用首选。对于超大规模输入,结合线性代数与快速幂思想的矩阵解法,能将复杂度降至对数级,展示了

weixin_34414196的博客 360

快速幂取模、大整数快速幂以及优化

快速幂取模: LL pow(LL a, LL n, LL p) //快速幂 a^n % p { LL ans = 1; while(n) { if(n & 1) ans = ans * a % p; //若不取模就去掉p a = a * a % p; n >>= 1; }...

qq_41515833的博客 1006

快速幂算法详解:从原理到C++实现与优化

在计算机科学中,算法效率优化是核心课题之一,尤其涉及指数运算时。传统线性时间复杂度的幂运算方法在处理大规模数据时面临性能瓶颈。快速幂算法基于二进制分解与分治思想,将计算a的n次方的时间复杂度从O(n)降至O(log n),其原理是利用幂运算的结合律,通过反复平方和按位累乘实现指数级的计算加速。该技术在工程实践中价值显著,广泛应用于需要高效幂运算的场景,如密码学中的模幂运算(RSA加密)、算法竞赛中的组合数计算,以及图形学与物理模拟中的矩阵高次幂运算。本文以C++为例,深入剖析快速幂的迭代与递归实现,并探讨其

ctpaknc9526的博客 472

快速幂算法(全网最详细地带你从零开始一步一步优化)

快速幂算法——带你从零开始一步一步优化 目录 快速幂算法——带你从零开始一步一步优化 什么是快速幂算法 再次思考 快速幂算法初步入门 压榨性能再优化 终极优化 参考资料 博客文章版权声明 什么是快速幂算法 首先,我们先来看一道ACM程序设计题,这道题是杭电OJ中序号为2035的题目,没做过这道题目的同学可以...

扬俊的小屋 20万+

快速幂算法详解:从原理到C++实现与模运算优化

在算法设计与高性能计算中,处理大规模指数运算是常见需求。其核心原理基于幂运算的结合律与指数的二进制分解,通过分治思想将时间复杂度从O(n)降至O(log n),实现了指数级的效率提升。这种优化在工程实践中价值显著,尤其在处理大数运算、防止溢出时,常需结合模运算,确保结果在有限域内的正确性。应用场景广泛涵盖算法竞赛、密码学(如RSA加密)以及动态规划优化等领域。本文以C++实现为例,深入剖析了快速幂的迭代与递归写法,并重点探讨了结合模运算处理大数、防范溢出的工程实践,同时延伸至矩阵快速幂解决线性递推问题,为处

weixin_29192365的博客 308

C/C++快速幂算法详解:从基础实现到工业级优化

幂运算(a^b)是编程中的基础数学运算,其核心原理是将指数进行二进制分解,通过平方倍增思想将时间复杂度从O(n)优化至O(log n)。这一优化在计算大整数幂时展现出巨大的技术价值,广泛应用于密码学、图形学和科学计算等高性能场景。快速幂算法通过位运算和迭代,高效处理非负整数指数,并能扩展支持负指数、浮点数底数及模幂运算。本文深入探讨了快速幂的二进制分解魔力、多种实现版本(迭代与递归)、以及工业级考量,如溢出安全处理、性能微调和常见问题排查,为开发者提供了从理论到实践的完整指南。

weixin_42525189的博客 494

快速幂

快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大。所以我们快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。 long long fastPower(long long base, long long power,long long mod) { long long result

qq_43811879的博客 273

快速幂:一种经过优化的算法

快速幂:一种经过优化的算法快速幂:一种经过优化的算法

快速幂及其优化

快速幂取模算法 取模运算的运算法则 (a + b) % p = (a % p + b % p) % p (1) (a - b) % p = (a % p - b % p ) % p (2) (a * b) % p = (a % p * b % p) % p (3) 背景: 求一个数的指数,如果指数很大,根据”指数爆炸递增“的常识,计算结果会造成内存溢出 比如,求2的10000此方结果的最后三位,如果直接循环乘,一定会造成内存溢出 根据取模运算的运算法则,可以对每一次循环的结果取模,返回结果取模 lo

Archerrrrr的博客 983

blenderproc 制作位姿估计数据集

blenderproc 制作位姿估计数据集 准备工作 1.首先需要去下载blenderproc的源码blenderproc,按照作者的readme文件进行编译。 2.其次需要下载bop_toolkit源码,链接如下bop_toolkit 3.说明:blenderproc主要用来生成数据,包括depth,rgb,位姿标签文件(scene_gt.json),bop_toolkit主要用来生成mask和mask_visib,scene_gt_info.json,用于判断物体的可见区域比例,如果遮挡太多考虑去掉。做

qq_43814359的博客 5698

《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第一部分:AI遥感工程师的基础设施与工具链-文章 4:传统遥感分析与机器学习基线

本章将系统性地介绍经典遥感分析工作流,从数据预处理到多维度特征工程,再到如何利用经典的机器学习模型(如随机森林、支持向量机)进行监督与非监督学习。我们将通过一个完整的“智慧农业作物分类”项目实战,展示如何利用我们之前构建的数据湖和工具链,从原始数据到最终的分析结果,构建一个性能可靠、可解释性强的基线系统。更重要的是,我们将深入剖析这种传统方法的局限性,从而为后续章节引入遥感大模型的必要性提供强有力的论证。

panshengwu的博客 705

快速幂算法详解(C++实现)

快速幂算法详解

m0_70980326的博客 4871

Vivado IP核:AXI Uartlite的使用经验分享

1. IP基本设置 在Vivado中,打开IP Catalog,搜索“uart”: 双击“AXI Uartlite”,进入IP配置界面: 这里可以配置IP的具体参数,设置时钟频率、波特率等,完成后,生成IP即可。 2. IP的时序特点 点击下面的链接可以下载该IP核的官方指导文档: https://china.xilinx.com/support/documentation/ip_docume...

weixin_43265132的博客 1万+

快速幂算法原理及优化

#快速幂算法 #问题描述 这道题的常规解法很简单,简单的一个循环就能搞定 /** *普通的求幂函数 *@Param base 底数 *@Param power 指数 *@return 求幂结果是最后三位表示的整数 **/ public int normalPow(long base, long power){ long result = 1; for(int i=1;i<=power;i++){ result *= base; } return resul

qq_40223083的博客 636

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 254

windows 下AD9361的 no-os master 工程搭建

参考网站: https://wiki.analog.com/resources/fpga/docs/build#windows_environment_setup https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/no-os-setup 参考博客: https://blog.youkuaiyun.com...

Bronceyang的博客 7294

快速幂 优化快速幂 算法宝典 中等

优化快速幂的算法 计算X的n次方, //位优化快速幂运算 解题思路: 代码: #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cstdlib&amp;gt; using namespace std; long long Pow(long long int x,long long int n) { long long

weixin_43805821的博客 246

【机器人】转动的指数坐标表示心得理解

转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需

要恰饭得嘛 2328

深入理解快速幂算法:从原理到优化

例如计算3^11时,11的二进制是1011,只需计算3^8、3^2和3^1的乘积。这种方法利用了指数运算的性质:(a^b)^c = a^(b*c),通过不断平方底数来抵消指数折半的影响,最终将大指数问题转化为一系列小问题。对于想深入理解算法细节的同学,建议在平台上多尝试不同的输入案例,观察算法在不同情况下的表现,这种实践方式比单纯阅读理论要有效得多。算法中base *= base的操作保证了每次循环都能计算出下一项的值,这种递推方式避免了重复计算,大幅提升了效率。这遵循了模运算的乘法分配律。

IronwoodPanther89的博客 788

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

华为iTrustee实战:5分钟搞定TrustZone环境搭建(附BoostKit配置技巧)

本文提供了一份华为iTrustee与ARM TrustZone环境的5分钟快速搭建实战指南。详细介绍了在TaiShan服务器上利用鲲鹏BoostKit套件部署可信执行环境(TEE)的完整流程,包括环境检查、驱动安装、首个可信应用(TA)的编译与运行,并分享了关键的BoostKit配置技巧与深度排错方法,助力开发者快速为业务注入硬件级安全能力。

yoga7的博客 966

【算法】 递归实战应用:从暴力迭代到快速幂的优化之路

【算法】 递归实战应用:从暴力迭代到快速幂的优化之路 详细介绍递归的实战应用——快速幂算法的算法思路以及代码实现

蒙奇D索大的博客 845

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

快速幂算法优化实战:从基础实现到性能飞跃

通过边运算边取模的优化((a*b)%p = (a%p * b%p)%p),可以避免溢出问题,但计算2^1e9仍需要约18秒。通过平台的一键运行功能,我亲自测试发现:从传统方法到快速幂的优化过程非常清晰,特别适合用来验证算法优化的实际效果。快速幂算法在密码学(RSA加密)、图形学(矩阵快速幂)等领域有广泛应用。例如区块链中的哈希运算、3D变换矩阵的连续计算都需要处理超大指数运算。这种方法将时间复杂度降为O(logn),计算2^1e9仅需0.002秒。| 方法 | 计算2^1e9耗时 |

FrostfireStag78的博客 269

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

算法总结:递归优化,二路归并,快速幂

递归的优化,二路归并的正向与反向,快速幂的实现,一个 a ^ b % c的计算

ylh的博客 569

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法基础篇:(十二)基础算法之倍增思想:从快速幂到大数据运算优化

摘要:本文深入探讨了倍增思想在算法中的应用,通过二进制分解和分步处理将时间复杂度从O(n)优化到O(logn)。重点讲解了快速幂算法(a^b mod p)和大整数乘法取模(a×b mod p)的实现原理与C++代码,包括递归和迭代两种版本。文章还介绍了倍增思想在RMQ、LCA等高级场景的应用,并提供了处理数据溢出的"快速乘"优化方案。通过数学原理、案例分析和代码实现,帮助读者掌握这一高效算法思想,适用于处理10^18级别的大数据运算。

2301_79248256的博客 2162

费马小定理(优化快速幂算法)实战

题目在蓝桥第26场入门赛春晚魔术。

wykwasd75869的博客 168
上一篇: [算法]—容斥原理
下一篇: [题解]—hdu 2036
zhbbbb!
博客等级 码龄7年 43粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值