快速幂讲解

快速幂取模

用法:用于求解 a 的 b 次方,而b是一个非常大的数,用O(n)的复杂度会超时。那么就需要这个算法,注意它不但可以对数求次幂,而且可用于矩阵快速幂。

假如求 x ^ n 次方

我们可以把 n 表示为 2^k1 + 2k2 + 2^k3….,可以证明所有数都可以用前式来表示。(其实就是二进制表示数的原理)

那么 x^n = x^2^k1 * x^2^k2 * x^2^k3……

那么就可以利用二进制来加快计算速度了。

假如 x^23 , 23转化为二进制为 10111, 即 x^23 = (x^16) * ( x^4) * ( x^2) * (x^1);
通过判断二进制x是否为1来判断是否加入运算中,(x>>1)每次向右移动一位,(x&1)判断是否为1,如果是1,则加入运算。如果不是,则x的幂次方继续乘方(1,2,4,8,16,32增长,作为待用乘法因子)。

那么是不是可以在O(logn)的复杂度求解。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int pw(int a,int n)
{
    int tmp=a,ans=1;
    while(n)//这里用a的1次方来试,就很容易写出
    {
        if(n&1)
        {
            ans*=tmp;
        }
        tmp*=tmp;
        n>>=1;
    }   
    return ans;
}
int main()
{
    int a,n; 
    cin>>a>>n;
    cout<<pw(a,n)<<endl;
}

那么假如让你求一个矩阵的很大的次方幂呢,当然我们同样可以求解。

比如我们都知道斐波那契数列可以用矩阵来求

当求第非常大的一个斐波那契数的后几位时我们可以用上面方法求解了。

方法和上面的方法一模一样,只是把数 x 变成了一个矩阵。

注意代码中矩阵的存法,很好用,题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=148

那么假如让你求一个矩阵的很大的次方幂呢,当然我们同样可以求解。

比如我们都知道斐波那契数列可以用矩阵来求

当求第非常大的一个斐波那契数的后几位时我们可以用上面方法求解了。

方法和上面的方法一模一样,只是把数 x 变成了一个矩阵。

注意代码中矩阵的存法,很好用,题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=148

快速模幂运算是一种常用的数学计算方法,用于求解大数的幂运算取模问题。它的原理基于数学中的取模运算和幂运算,而快速幂运算则是求解幂运算的一种高效的方法。 首先,我们需要了解以下两个数学概念: 1. 取模运算:取模运算就是将一个数除以另一个数后所得到的余数。例如,5除以2的余数为1,即5 mod 2 = 1。 2. 幂运算:幂运算就是将一个数乘以自己若干次的结果。例如,2的3次方等于8,即2^3 = 8。 接下来,我们来讲解快速模幂的原理和过程: 假设要求解 a^b mod c 的值,其中 a、b、c 均为正整数,其中 b 可以非常大,达到几百万甚至更大,此时计算 a^b mod c 的常规方法是直接计算 a 的 b 次方,然后再对 c 取模。这种方法的时间复杂度是 O(b)。如果 b 很大,计算时间就会很长,效率很低。 快速模幂算法的核心思想是利用幂运算的性质和取模运算的性质将 b 分解为若干个二进制位,然后对每个二进制位进行计算。具体过程如下: 1. 将 b 转换为二进制数,例如,b=13,二进制表示为:1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将对应的幂运算结果乘到最终结果中,否则直接忽略。 3. 在计算过程中,用已经计算出来的结果不断平方,然后对 c 取模,这样可以避免重复计算,提高计算效率。 举个例子,我们要计算 2^13 mod 7 的值,可以使用快速模幂算法进行计算: 1. 将 13 转换为二进制数,即 13 = 1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将相应的幂运算结果乘到最终结果中,否则直接忽略。计算过程如下: - 2^1 mod 7 = 2 - 2^2 mod 7 = 4 - 2^4 mod 7 = 2 - 2^8 mod 7 = 4 - 2^13 mod 7 = 2 * 4 * 2 * 4 * 2 mod 7 = 8 mod 7 = 1 因此,2^13 mod 7 的值为 1。 快速幂算法是求解幂运算的一种高效的方法,其核心思想是利用幂运算的性质将指数进行二进制分解,然后利用分治思想进行计算。具体过程如下: 1. 将指数 b 转化成二进制数,例如,b=13,二进制表示为:1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将底数 a 的对应次方乘到最终结果中,否则直接忽略。 3. 在计算过程中,用已经计算出来的结果不断平方,这样可以避免重复计算,提高计算效率。 举个例子,我们要计算 2^13 的值,可以使用快速幂算法进行计算: 1. 将 13 转换为二进制数,即 13 = 1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将相应的幂运算结果乘到最终结果中,否则直接忽略。计算过程如下: - 2^1 = 2 - 2^2 = 4 - 2^4 = 16 - 2^8 = 256 - 2^13 = 2 * 4 * 16 * 256 * 2 = 32768 因此,2^13 的值为 32768。 快速幂算法和快速模幂算法都是常用的数学计算方法,在实际应用中经常被使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值