快速乘方

a= an/2*an/2   , n为even

a= a(n-1)/2*a(n-1)/2 *a  , n为odd

double powerWithUnsignedExponent(double base, unsigned int exponent)
{
      if(0 == exponent)
          return 1;
      if(1 == exponent)
          return base;
      double result = powerWithUnsignedExponent(base, exponnet >> 1);
          result *= result;
      if(1 == exponent & 0x1)     //二进制末尾为1,一定是奇数
          result *= base;

      return result;
}

借助位运算判断奇偶性:

a & 0x1 == 0;    //even偶数

a & 0x1 != 0;     //odd奇数

时间: 2024-10-23 23:53:24

快速乘方的相关文章

欧拉函数&&快速乘方

1 //phi(a)=a*(a1-1)*(a2-1)*(a3-1)*...*(an-1)/(a1*a2*a3*...*an); 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 typedef __int64 LL; 8 LL phi(LL a){//phi 9 LL temp=a; 10 for(LL

NOIP考纲总结+NOIP考前经验谈

NOIP考纲总结+NOIP考前经验谈 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精                 (后面c,d考的可能性较小,应该只考a,b) 排序算法 a.选择排序 b.插入排序 c.hash排序 d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)

NOIP注意事项

高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精)                                d.高精度除单精                 (后面c,d考的可能性较小,应该只考a,b) 排序算法 a.选择排序 b.插入排序 c.hash排序 d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要) e.堆排序 f.快排 字符串匹配算法 a.蛮力法 b.KMP 数论 a.欧几里德算法(用辗转相除法求最大公约数) b.扩展欧几里德算法 ax+by

leetcode第一刷_Pow(x, n)

快速乘方的算法,写了好多变,出了各种错,真是服了我自己了. 思想是每次对n减半,将当前的temp平方.需要注意的是如果当前的n是个奇数,减半之后会丢失掉一次乘积,因此如果当前的n为奇数,应该先在结果里面乘一个temp. 还有,n可能是负数,负数的次方最后要求一次倒数. class Solution { public: double pow(double x, int n) { if(n == 0) return 1; if(n == 1) return x; double res = 1, te

乘方快速幂 OR 乘法快速幂

关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了. 快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板: 1 __int64 mulpow(__int64 a,__int64 p,__int64 m) 2 { 3 __int64 ans = 1; 4 while(p) 5 { 6 if(p&1)

HDU - 1588 Gauss Fibonacci (矩阵快速幂+二分求等比数列和)

Description Without expecting, Angel replied quickly.She says: "I'v heard that you'r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. " How good an opportunity that Gardon can not give up! The "Prob

睡前一小时数学系列之从零开始的快速乘法。

当我们遇到大数相乘的时候情不自禁可以想到高精度.但是如果遇到 形如 a*b%c 的运算的时候.数也就是long long级别(2^61-1)但是没有办法的是这样数如果相乘会超long long级,再一模,hhhh肯定会炸.所以既然要提高乘法的效率而且保证精度.采用快速乘法.主要思想就是对数进行二进制拆分,运用乘法分配律把拆分结果加起来,嗯就好了. 举个栗子 23*123   123的二进制是(1111011)2 那么我们就可将这个结果拆成 23*2^0 +  23*2^1 +  23*2^3 +

pthon核心编程-读书笔记:知识点摘录与总结(方便理解和快速记忆)

Python 中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的.在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们, 缩短开发时间与代码量,产生出可读性更好的代码.C不提供, c++功能不够简洁. 面向对象, 可升级:Python 提倡简洁的代码设计.高级的数据结构和模块化的组件,确保灵活性. 一致性并缩短必要的调试时间 扩展性:兼容扩展c和java 易读写,易维护 健壮性:Python 提供了"安全合理"的退出机制, Python由于错误崩溃,解释程序就会转出一个

取余运算||快速幂

题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 思路: 显然取余和乘法谁都会 关键在于快速 我们知道乘方有一个性质 x^n=(x^2)^(n/2) 这样我们就能通过二分使时间复杂度降到log级别 你可能会说,n%2==1怎么办?? 和简单,再定义一个变量作为暂存器,乘一下x 这时候又有另一个定理 x^n=x^(n-1)*x 所以n可以减一 最