快速幂qmi

部署运行你感兴趣的模型镜像

模板题 快速幂

【暴力解法】

每次循环输出a^k%p,时间复杂度O(n)。

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a,b,p;
        long long res=1;
        cin>>a>>b>>p;
        while(b--)
            res = res * a %p;
        cout<<res<<endl;
    }
}

【基本思路】

时间复杂度是O(log n) 

【Reminder】

1.b&1就是判断b的二进制表示中第0位上的数是否为1,若为1,b&1=true,反之b&1=false

2.每次运算都要 %p ,为了防止溢出

【代码】

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int qmi(int a,int k,int p){
    int res=1;
    while(k){//从低位到高位
        if(k&1) res=(ll)res*a%p;
        k>>=1;//判断k的二进制下一位
        a=(ll)a*a%p;
    }
    return res;
}
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int a,k,p;
        scanf("%d%d%d",&a,&k,&p);
        printf("%d\n",qmi(a,k,p));
    }
    return 0;
}

模板题 快速幂求逆元

【基本概念】

1.逆元

当 ax≡1(modb), x即为 a 在mod b 意义下的逆元。
逆元的数学符号是 inv ,a 在mod b 意义下的逆元记作 inv(a,b)。注意不要写反了。
简单来说逆元就是在mod某个数意义下的倒数例如5x≡1(mod3),x=2是满足10=1(mod3),所以称2是5在mod3意义下的逆元。
2.同余定理(≡)

两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对于模m同余或a同余于b模m
记作 a≡b (mod m)
读作 a同余于b模m,或读作a与b对模m同余。
例如 26≡2 (mod 12)

3.费马小定理(Fermat’s little theorem)

如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
费马小定理规定了p一定为一个质数,所以a和p一定互质,那么双方在modp的意义下同时除a可得
a^(p-2) ≡1/a (mod p) ,也就是a^(p-2) ≡ inv(a) (mod p)
所以inv(a) = a^(p-2) (mod p)

【基本思路】

 【代码】

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int qmi(int a,int k,int p){
    int res=1;
    while(k){
        if(k&1) res=(ll)res*a%p;
        k>>=1;
        a=(ll)a*a%p;
    }
    return res;
}
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int a,p;
        scanf("%d%d",&a,&p);
        int res=qmi(a,p-2,p);
        if(a%p!=0) printf("%d\n",res);
        else puts("impossible");
    }
    return 0;
}

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

<think>好的,我现在需要回答用户关于快速幂算法的实现和应用的问题。首先,我得回忆一下快速幂的基本原理。快速幂算法主要用于高效计算大指数的幂取模运算,比如计算$a^k \mod p$,这在加密算法和数论问题中很常见。用户还提到了参考中的代码示例,里面有一个Java或类似语言的实现,我需要确保我的解释与这个示例一致。 接下来,我应该先解释快速幂的原理。传统的幂运算需要进行k次乘法,时间复杂度是$O(k)$,而快速幂通过将指数k分解为二进制形式,逐位处理,将复杂度降到$O(\log k)$。比如,计算$a^{13}$,13的二进制是1101,可以分解为$a^8 \times a^4 \times a^1$,这样只需要几次乘法而不是13次。 然后,我需要详细说明实现步骤。参考中的代码使用了循环,每次将k右移一位,检查最低位是否为1,如果是的话就将当前的a乘到结果中。同时,a在每次循环中自乘,相当于计算$a^2, a^4, a^8$等。这个过程需要逐步解析,确保用户理解每一步的作用。 在代码示例部分,用户提供的代码是类似Java的,但用户可能需要其他语言的例子,比如Python。所以我可以给出Python的实现,并解释每行代码的作用。例如,初始化res为1,循环直到k为0,通过位运算判断当前位是否为1,更新res和a的值,最后返回结果。同时需要注意取模运算,防止数值溢出。 关于应用场景,快速幂常用于加密算法如RSA,或者在需要大数幂取模的场合,比如计算斐波那契数的高效算法中。此外,还可以在组合数学中计算模逆元,或者动态规划中的某些状态转移优化。用户可能对这些实际应用感兴趣,需要举一些具体的例子,比如计算$a^b \mod p$的实际问题。 然后,用户可能遇到的问题,比如如何处理大数运算中的溢出,或者如何调整算法以适应不同的编程语言。此外,可能需要解释为什么位运算能提高效率,或者快速幂与普通递归分治方法的区别。 最后,生成的相关问题需要覆盖快速幂的原理、优化方法、应用场景以及与其他算法的比较。比如,如何分析时间复杂度,快速幂的迭代和递归实现哪种更好,或者在不同编程语言中的实现差异。 需要确保回答结构清晰,分点解释,代码示例正确,并且引用用户提供的参考内容。同时,注意使用中文,数学公式用$...$和$$...$$正确格式化,避免语法错误。在引用部分,正确标注来源,如引用[^1]对应的内容。</think>### 快速幂算法详解 #### 一、快速幂的原理 快速幂算法用于高效计算形如$a^k \mod p$的大数幂取模运算,将时间复杂度从$O(k)$优化到$O(\log k)$。其核心思想是将指数$k$表示为二进制形式,逐位分解计算。例如,计算$a^{13}$时,由于$13=8+4+1$,可分解为: $$a^{13} = a^{8} \cdot a^{4} \cdot a^{1}$$ 每一步通过平方操作累积$a$的值,仅需$\log_2 k$次乘法。 #### 二、实现步骤 1. **初始化结果**:`res = 1` 2. **循环处理二进制位**:当$k > 0$时: - 若当前二进制位为1(即`k & 1 == 1`),将`res`乘以当前的$a$并取模 - 将$k$右移一位(`k >>= 1`),将$a$平方并取模(`a = a * a % p`) 3. **返回结果**:最终`res`即为$a^k \mod p$ #### 三、代码示例(Python) ```python def qmi(a: int, k: int, p: int) -> int: res = 1 while k > 0: if k & 1: res = res * a % p k >>= 1 a = a * a % p return res print(qmi(2, 100, 10**9 + 7)) # 输出2^100模1e9+7的结果 ``` #### 四、应用场景 1. **加密算法**:如RSA中计算大数幂模。 2. **数论问题**:求解斐波那契数矩阵快速幂法、组合数取模等。 3. **动态规划优化**:某些状态转移需要快速计算幂次。 4. **模逆元计算**:结合费马小定理,用快速幂求$a^{p-2} \mod p$得到逆元。 #### 五、性能分析 - **时间复杂度**:$O(\log k)$,因为每次循环将$k$减半。 - **空间复杂度**:$O(1)$,仅需常数级额外空间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值