快速幂运算
将指数转化为二进制的形式,之后按照二进制化为十进制的做法将个个位置上代表的值作为底数的平方,之后所有数据再相乘。
感觉可以无限套娃下去。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 - cb =-7 - (-2)4 = 1,
②求余时:r = a - cb = -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 - cb =7 - (1)4 = 3,
②求余时:r = a - cb = 7 - (1)*4 =3。