数学知识:快速幂

 快速幂:

#include<iostream>
using namespace std;

long long qmi(long long a,int b,int p)
{
    long long res=1;
    while(b)//对b进行二进制化,从低位到高位
    {
        //如果b的二进制表示的第0位为1,则乘上当前的a
        if(b&1) res = res *a %p;
        //b右移一位
        b>>=1;
        //更新a
        a=a*a%p;
    }
    return res;
    //a:4 b:3 p:9
//二进制b   11        1
      //res 1*4%9=4   4*7%9=1     
      //b   1         0        
      //a   4*4%9=7   16*16%9=112
      //因为:2^0=1,2^1=2,2^2=4,2^3=8...
      //根据公式:b=3,所以2^0+2^1=b,与这个指数上面的b算的一样
      //所以(4^2^0%9*4^2^1%9)%9=(4*7)%9=28%9=1,这个就是上面的res
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b,p;
        long long res=1;
        scanf("%d%d%d",&a,&b,&p);
        res = qmi(a,b,p);
        printf("%d\n",res);
    }
    return 0;
}

快速幂求逆元:

注意:p只能是质数,否则只能用扩展欧几里得算法求解

#include<iostream>
using namespace std;

long long qmi(long long a,int b,int p)
{
    long long res=1;
    while(b)//对b进行二进制化,从低位到高位
    {
        //如果b的二进制表示的第0位为1,则乘上当前的a
        if(b&1) res = res *a %p;
        //b右移一位
        b>>=1;
        //更新a
        a=a*a%p;
    }
    return res;
    //a:8 b:5-2=3 p:5
//二进制b   11       1
      //res 1*8%5=3  3*4%5=2  
      //b   1        0
      //a   8*8%5=4  4*4%5=1
      //因为:2^0=1,2^1=2,2^2=4,2^3=8...
      //根据公式:b=3,所以2^0+2^1=b,与这个指数上面的b算的一样
      //所以(8^2^0%5*8^2^1%5)%5=(3*4)%5=12%5=2,这个就是上面的res
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,p;
        long long res=1;
        scanf("%d%d",&a,&p);
        if(a % p == 0) printf("impossible\n");
        else printf("%d\n",qmi(a,p-2,p));
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
快速运算是一种常用的数学计算方法,用于求解大数的运算取模问题。它的原理基于数学中的取模运算和运算,而快速运算则是求解运算的一种高效的方法。 首先,我们需要了解以下两个数学概念: 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
发出的红包

打赏作者

@katoumegumi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值