快速幂取模算法

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。——bybaidu

原理:

以求a的b次方来介绍

把b转换成二进制数。

该二进制数第i位的权为

例如:

11的二进制是  1011

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

因此,我们将a¹¹转化为算

 

实现:

快速幂可以用位运算这个强大的工具实现。

代码比较:

常规求幂

intpow1(int a,int b)
{
    int r=1;
    while(b--)
        r*=a;
    return r;
}

二分求幂(一般)

复制代码
intpow2(int a,int b)
{
    int r=1,base=a;
    while(b!=0)
    {
        if(b%2)
            r*=base;
        base*=base;
        b/=2;
    }
    return r;
}
复制代码

 

快速求幂(位操作)

复制代码
intpow3(int a,int b)
{
    int r=1,base=a;
    while(b!=0)
    {
        if(b&1)
            r*=base;
        base*=base;
        b>>=1;
    }
    return r;
}
复制代码

 


其中二分求幂与快速求幂都是利用了二进制数的思想。

蒙哥马利快速幂取模算法,简单漂亮

复制代码
int pow3(int a,int b,int c)
{
    int ans=1;
    a=a%c;
    while(b!=0)
    {
        if(b&1)
            ans=(ans*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return ans;
}
复制代码

 算法详解:

公式:(a*b)mod c=[(a mod c)*(b mod c)]mod c;

证明:

a mod c=d => a=t*c+d;

b mod c=e => b=k*c+e;

a*b mod c= (t*c+d)*(k*c+e)mod c

=(t*k*c*c+(t*e+d*k)*c+d*e)mod c

=d*e mod c=[(a mod c)*(b mod c)]mod c;

上面公式为下面公式的引理,即积的取余等于取余积的取余。

 

公式:a^b mod c =(a mod c)^b mod c;

证明:[(a mod c)^b]mod c

=[((a mod c) mod c)^b]mod c(由上面公式的迭代)

 [(a mod c)^b]modc=a^b mod c;

证明了以上公式以后,我们可以先让a关于c取余,这样可以大大减小a的大小。

 

posted @   人艰不拆_zmc  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示