快速幂运算

快速幂运算

将指数转化为二进制的形式,之后按照二进制化为十进制的做法将个个位置上代表的值作为底数的平方,之后所有数据再相乘。

感觉可以无限套娃下去。hhhh
例如:
3^11的计算
11的二进制为 1011=23+21+2^0
311=(3(23))*(3(21))*(3(2^0)</pre>

快速幂运算取模

就是在每次运算之后就对数据进行一次取模化简数据的长度,减少复杂度。

这里也可以直接求出一个数据的后多少位是什么,比如要求后5位的数据,可以对计算结果对10000取余。

Java中存在Java.math.BigInteger.modPow()可以直接对大数运算取余。

当数据的长度不超过long时,手写的快速幂取余效率最高,长度过大时Java.math.BigInteger.modPow()的效率更高一点。

取模运算

对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求整数商: c = [a/b];
2.计算模或者余数: r = a - cb.
求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
例1.计算:-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c:
①进行求模运算c = [a/b] = -7 / 4 = -2(向负无穷方向舍入),
②进行求余运算c = [a/b] = -7 / 4 = -1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,
①求模时:r = a - c
b =-7 - (-2)4 = 1,
②求余时:r = a - c
b = -7 - (-1)4 =-3。
例2.计算:7 Mod 4
那么:a = 7;b = 4
第一步:求整数商c:
①进行求模运算c = [a/b] = 7 / 4 = 1
②进行求余运算c = [a/b] = 7 / 4 = 1
第二步:计算模和余数的公式相同
①求模时:r = a - c
b =7 - (1)4 = 3,
②求余时:r = a - c
b = 7 - (1)*4 =3。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对一个给定的数计算乘幂。这一过程的参数是一个基数b和一个正整数的指数n,过程计算出b ^ n。一种方式是通过下面这...
    szu_bee阅读 3,101评论 0 1
  • 数据的表示和运算 一、数值和编码 1.基本概念 ①进位制:表示数时,仅用一位数码往往不够用,必须用进位计数的方法组...
    我可能是个假开发阅读 4,330评论 1 1
  • 1. 十进制数的编码表示 4位十进制有权码XXXX码其中的X代表对应二进制位的权值 8421码2421码5211码...
    WilsonEdwards阅读 505评论 0 1
  • 留此记录或供同好参考,中英混合,有些乱勿怪。 RSA算法:RSA算法是基于大数难于分解的原理。不但可以用于认证,也...
    陆满庭阅读 1,679评论 0 3
  • 今天在看《C++Primer》中文版时,遇到一个问题,如下: C++中,把负值赋给unsigned对象是完...
    即墨雨阅读 18,323评论 0 4