幂运算的O(lgn)算法
对于幂运算 a^b,最原始的方法是用for循环一遍:
double powRaw(double base,int n)
{double r = 1;for(int i=1;i<=n;i++)r = r*base;return r;
}
考虑如下下面的事实:
对于r = a^b,若b为偶数,那么r = a^(b/2)·a^(b/2);若b为奇数,那么r = a^((n-1)/2)·a^((n-1)/2)·a。利用这个事实可以得到如下的递归解法:
double pow(double base,int n)
{if (n == 0)return 1;if (n == 1)return base;double t = pow(base,n >> 1);if (n & 0x1) return t*t*base;elsereturn t*t;
}
另外,b用二进制表示,那么a^b可以看到r = a^(1011) = a^(1000)·a^(10)·a^(1),那么可以得到其非递归算法如下:
double power(double base,unsigned int n)
{double r = 1;while(n){if (n & 0x1)r *= base;n = n >> 1;base *= base;}return r;
}
参考文章:
http://blog.csdn.net/prstaxy/article/details/8740838
幂运算的O(lgn)算法相关推荐
- 如何高效进行模乘、模幂运算?——蒙哥马利算法(Montgomery Algorithm)从入门到精通
蒙哥马利算法(Montgomery Algorithm)从入门到精通 加密算法中,模运算(包括模乘.模幂运算)是难以避免的,如何高效地进行模运算,是提高算法效率的一个关键. 直观的想法 在数学 ...
- 幂运算 数组_Super Pow:如何高效进行模幂运算
点击上方蓝字设为星标 东哥带你搞定算法~ 今天来聊一道与数学运算有关的算法题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数. int superPow(int ...
- 《算法基础》——2.3 求幂运算
本节书摘来自华章计算机<算法基础>一书中的第2章,第2.3节,作者:(美)罗德·斯蒂芬斯(Rod Stephens)著,更多章节内容可以访问云栖社区"华章计算机"公众号 ...
- C++modular exponentiation模幂运算的实现算法(附完整源码)
C++modular exponentiation模幂运算的实现算法 C++modular exponentiation模幂运算的实现算法完整源码(定义,实现,main函数测试) C++modular ...
- 模幂运算问题,使用朴素算法和重复-平方算法(快速幂+C#计算程序运行时间)
1.什么是模幂运算问题 给出a, k, mod 计算ak(%mod)a^k (\%mod)ak(%mod)的值 k是一个非常大的正整数(超过1e7) 附,一个可以提交的地方: leetcode 372 ...
- 快速幂算法c语言求a的n次方,快速幂运算模板(求n^k以及前几位或后几位)
计算n^k的结果 步骤: 1.把n由十进制转换为二进制,按二进制来计算(最后结果还是一样的) 2.把n由二进制转换为2^k相加的形式 先举个例子: 求5^22: 接着就可以很好地理解了 O(logn) ...
- JAVA:实现binary exponentiation二进制幂运算算法(附完整源码)
JAVA:实现binary exponentiation二进制幂运算算法 package com.thealgorithms.divideandconquer;public class BinaryE ...
- python pow函数——幂运算 快速幂算法实现思路
说明 python 内置pow函数用于实现幂的运算,在这里我使用的是快速幂算法实现pow函数功能. 快速幂 快速幂算法本质上基于的是分治思想. 优点:其时间复杂度为 O (log₂N), 与暴力遍历时 ...
- Modular_exponentiation模幂运算
https://en.wikipedia.org/wiki/Modular_exponentiation 蒙哥马利(Montgomery)幂模运算是快速计算a^b%k的一种算法,是RSA加密算法的核心 ...
- 大数运算(8)——大数幂运算
大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...
最新文章
- Java中的ClassLoader和SPI机制
- mysql权限表整理
- linux shell sshpass 远程服务器 批量修改密码
- c++性能优化之Profiler
- Ubuntu 16.04 安装 Wireshark分析tcpdump的pcap包——sudo apt install wireshark-qt
- 鸿蒙系统突破,华为解锁新成就!新系统用户突破1亿,鸿蒙系统也传来了新消息...
- IE浏览器导出问题。。好要命
- 鸿蒙os首批适配机型,鸿蒙OS正式版首批名单曝光,适配速度让人意外,8款机型恭喜了...
- [渝粤教育] 新乡医学院 医学免疫学 参考 资料
- leetcode238 除本身以外数组的乘积
- 简化Java中的异常处理
- SQLSERVER 清除链接历史记录
- go home(2)-supprise
- 2021考研王道计算机408
- java统计代码行数
- 药品数据查询系统工具(非付费官网50个)
- 网际风全推数据接口_网际风千钧版 飞狐配套全推接口最新版(2013年5月10更新)...
- 京东/拼多多淘客小程序跳入路径
- 自定义控件ViewGroup上下滑动
- Connection terminated as request was larger than XXX
热门文章
- 如何在手机或平板上编写代码?
- 把抽奖活动写成一篇技术博客是怎样一种体验
- Android 中使用AlarmManager设置闹钟详解
- python大作业数据_python 爬虫初探和简单数据分析及可视化,帮学妹写个大作业...
- 图片中加入超链接html代码,html网页超链接代码 怎样用HTML代码在图片插入超链接...
- python开发桌面时钟_python+PyQT实现系统桌面时钟
- css控制表格剧中,如何通过css设置表格居中
- nginx配置多个域名使用同一个端口
- 刚斩获头条美团的offer,Java开发面试题详解(带答案)
- 第2.2节 串行SPI接口控制PE4312数控衰减器