zoukankan      html  css  js  c++  java
  • 快速求幂与快速幂余算法(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

    说明有效

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

  • 相关阅读:
    最小生成树(模板)
    排序
    kmp模板
    图书管理系统
    顺序表的创建
    洛谷p1090合并果子(优先队列或堆)
    洛谷P1464Function(逆向递推递归+记忆化)
    ueditor设置
    php isset()和 in_array()
    php 判断空
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/13950570.html
Copyright © 2011-2022 走看看