【快速幂-费马小定理讲解】哈理工 1251 Marshal’s Confusion III

本文介绍费马小定理的基本概念及其在快速幂运算中的应用,并通过实例展示了如何利用该定理简化计算过程。同时,提供了两种不同的快速幂实现方式,帮助读者深入理解算法原理。

1.费马小定理(Fermat’s little theorem)是数论中的一个重要定理,在1636年提出,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p),例如:假如a是整数,p是质数,则a,p显然互质(即两者只有一个公约数1),那么我们可以得到费马小定理的一个特例,即当p为质数时候, a^(p-1)≡1(mod p)。

2.百度(费马小定理求余数应用)
11是素数,∴4^10≡1 (mod11)
而5^273的个位数字是5
∴设5^273=10n+5
∴4^(5^273)=4^(10n+5)=(4^10)^n·4^5
而(4^10)^n≡1^n≡1 (mod11)
∴4^(5^273)≡4^5≡16·16·4≡5·5·4≡3·4≡1 (mod11)

3.快速幂模板:

//快速幂模板:  
lint quick(lint base, lint pow)  
{  
    lint ret=1;  
    while(pow)  
    {  
        if (pow&1) ret=(ret*base)%mod;  
        base=(base*base)%mod;  
        pow>>=1;  
    }  
    return ret%mod;//记得最后mod,比如mod==1的情况  
}  

4.哈理工 1251 Marshal’s Confusion III

#include <iostream>
using namespace std;
const int mod=317000011;
long long mul(long long m,long long n,int k)
{
    long long res=1;
    while(n)
    {
        if(n&1)
            res=(res*m)%k;
        m=(m*m)%k;
        n>>=1;
    }
    return res;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        cout<<mul(a,mul(b,c,mod-1),mod)<<endl;
    }
    return 0;
}
 for(int i=0;i<c;i++)
        {
            sum1=fp(a,b);
            a=sum1;
        }
        //这个更好理解点
### 费马小定理快速幂求解乘法逆元中的应用 费马小定理是数论中的一个重要定理,其描述为:如果 $ p $ 是一个质数,且 $ b $ 不是 $ p $ 的倍数,则有: $$ b^{p-1} \equiv 1 \ (\text{mod} \ p) $$ 基于这一结论,可以推导出 $ b $ 的乘法逆元。具体来说,乘法逆元的定义是:若 $ b \cdot x \equiv 1 \ (\text{mod} \ p) $,则 $ x $ 是 $ b $ 在模 $ p $ 意义下的乘法逆元。根据费马小定理,可以进一步得出: $$ b \cdot b^{p-2} \equiv 1 \ (\text{mod} \ p) $$ 因此,$ b^{p-2} \ \text{mod} \ p $ 就是 $ b $ 的乘法逆元。 在实际计算中,为了高效求解 $ b^{p-2} \ \text{mod} \ p $,通常采用快速幂算法。快速幂通过将指数分解为二进制形式,并利用模运算的性质,将幂次运算的时间复杂度从 $ O(n) $ 降低到 $ O(\log n) $。这种方法特别适合处理大数幂运算,例如在模数 $ p $ 较大的情况下。 以下是一个使用快速幂算法求解乘法逆元的示例代码: ```cpp #include <iostream> using namespace std; // 快速幂算法(取模):a^b % p long long pow_mod(long long a, long long b, long long p) { long long result = 1; a %= p; while (b) { if (b & 1) // 如果b是奇数 result = (result * a) % p; a = (a * a) % p; // 平方 b >>= 1; // 将b右移一位 } return result; } // 求a在模p下的乘法逆元(费马小定理,p必须为质数) long long inv(long long a, long long p) { return pow_mod(a, p - 2, p); } int main() { long long a, p; cout << "请输入a和p的值(p必须为质数):" << endl; cin >> a >> p; cout << a << "在模" << p << "下的乘法逆元是:" << inv(a, p) << endl; return 0; } ``` #### 代码说明 - `pow_mod` 函数实现了快速幂算法,用于计算 $ a^b \ \text{mod} \ p $。 - `inv` 函数调用 `pow_mod`,传入参数 $ a $、$ p-2 $ 和 $ p $,以计算 $ a^{p-2} \ \text{mod} \ p $,即 $ a $ 在模 $ p $ 意义下的乘法逆元。 - 在 `main` 函数中,用户输入 $ a $ 和 $ p $ 的值,程序输出对应的乘法逆元。 #### 适用条件 - 使用费马小定理的前提是模数 $ p $ 必须为质数。 - $ a $ 不能是 $ p $ 的倍数,否则无法满足 $ \text{gcd}(a, p) = 1 $,从而无法保证乘法逆元的存在。 通过快速幂算法,可以在 $ O(\log p) $ 的时间复杂度内高效地求解乘法逆元,这在实际应用中具有重要意义,尤其是在密码学和大数运算等领域。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值