快速求幂与快速幂余算法(Java)
通常提到快速幂指的是快速幂余算法,快速幂余在数论密码方面非常常用,例如Miller-Rabbin素性检验,用于检验一个数是否是素数具有较高的效率,而其中用到快速幂余是不可或缺的。
那就把快速求幂和快速幂余都来一遍吧,先上代码,推导自行百度(值得研究),很多博客都写得很清楚(事实上一搜就搜到了,所以我就不赘述了)
快速求幂:一定需要注意的是,不要把 if((b & 1) == 1)写成了if(b & 1 == 1),优先级会改变了我们的本意
public long fastPower(long a, long b) { long ans = 1; while (b != 0) { if((b & 1) == 1) ans = ( ans * a ); b >>= 1; a = ( a * a ); } return ans; }
快速幂余:
public long fastPowerMod(long a, long b, long c) { long ans = 1; a %= c; while (b != 0) { if((b & 1) == 1) ans = ( ans * a ) % c; b >>= 1; a = ( a * a ) % c; } return ans; }
来个实例试一下效果:
public static void main(String[] args) { PrimeUtil pu = new PrimeUtil(); System.out.println(pu.fastPower(2, 10)); System.out.println(pu.fastPowerMod(2, 10, 10)); }
结果:
1024 4
说明有效
快速幂是一个值得研究的算法,无论是思想(尤其是幂余)还是处理技巧(位运算)都带来了不少的性能,通过同余的性质防止数值溢出更是值得思考的思想。