快速幂详解

目录

  • 快速幂概念
  • 快速幂代码
  • 快速幂例题
    • 题目介绍
    • 思路分析
    • 相关代码
  • 总结

快速幂概念

  • 在介绍快速幂之前,我们在求a的n次方时是遍历n次得到a的n次方,时间复杂度为O(n),而通过快速幂求a的n次方可以让时间复杂度降到O(logn).
  • 快速幂:顾名思义就是快速地求幂(feihua),如何进行快速求幂,根据之前介绍的快速幂的时间复杂度为O(logn)我们可以初步判断是通过类似二分的思想如何求幂。例如2 ^ 5 = (2 ^1) * (2 ^ 2) * (2 ^ 2),我们求了3次,即ceil(log5)次

快速幂代码

 public int fastPower(int a,int n){
        //快速幂(O(logn))
        int res = 1;
        while (n != 0) {
            if (n % 2 != 0) {
            	//n为奇数是需要单独求一次
                res = (int) (((long) res * a));
            }
            每次减半时都需要求a的平方
            a = (int) (((long) a * a));
            n = n / 2;
        }
        return res;
    }
    !!友情提示:可以自己找一个例子根据代码的过程去理解

快速幂例题

题目介绍

快速幂详解_第1张图片

思路分析

  1. 首先明确一点我们不可能直接去求a的b次幂,数太大会造成溢出。
  2. 在解析这道题之前,我们需要介绍一下求模运算的相关特点: ( a + b ) % c = ( ( a % c ) + ( b % c ) ) % c (a+b)\%c = ((a\%c)+(b\%c))\%c (a+b)%c=((a%c)+(b%c))%c
    ( a − b ) % c = ( ( a % c ) − ( b % c ) ) % c (a-b)\%c = ((a\%c)-(b\%c))\%c (ab)%c=((a%c)(b%c))%c
    ( a ∗ b ) % c = ( ( a % c ) ∗ ( b % c ) ) % c (a*b)\%c = ((a\%c)*(b\%c))\%c (ab)%c=((a%c)(b%c))%c
    a % c % c = a % c a\%c\%c = a\%c a%c%c=a%c
    对于本题而言,需要用到的只有后面两个公式。 因此结合快速幂,我们可以得到快速幂求模的方法去求解这个问题
  3. 相较于快速幂而言,只需要在其之后进行求模运算即可。但本题中的b是由数组给出的,因此我们需要对b的每一位分别进行运算,我们从低位(b.length-1)到高位(0)分别进行计算。
  4. 因此在这里插入图片描述

相关代码

	//模数
	public static final int MOD = 1337;

    public int superPow(int a, int[] b) {
        int res = 1;
        for (int i = b.length - 1; i >= 0; i--) {
        	//从低位到高位求a的bi次幂对MOD求模
        	//要注意的是res * pow(a, b[i])是有可能超出int的范围的
            res = (int) (((long) res * pow(a, b[i])) % MOD);
            //由之前的倒数第二个公式可以计算a的10(b.length-i)次幂
            a = pow(a, 10);
        }
        return res;
    }

    public int pow(int a, int n) {
        //快速幂取模
        int res = 1;
        while (n != 0) {
            if (n % 2 != 0) {
            	//与快速幂类似,只不过多了个求模的运算
                res = (int) (((long) res * a) % MOD);
            }
            //不能忘了求模
            //要注意的是a * a是有可能超出int的范围的
            a = (int) (((long) a * a) % MOD);
            n = n / 2;
        }
        return res;
    }

总结

本篇文章主要介绍了快速幂的概念和快速幂的应用,同时也介绍了快速幂求模。

你可能感兴趣的:(数据结构与算法,算法,leetcode,java)