快速求幂与快速幂余算法(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

说明有效

  快速幂是一个值得研究的算法,无论是思想(尤其是幂余)还是处理技巧(位运算)都带来了不少的性能,通过同余的性质防止数值溢出更是值得思考的思想。

posted @ 2020-11-09 20:21  倦鸟已归时  阅读(659)  评论(0编辑  收藏  举报