算法基础系列第四章——数论之从欧拉卷到欧几里得(2)

简介: 算法基础系列第四章——数论之从欧拉卷到欧几里得(2)

快速幂


快速幂也叫欧拉降幂、反复平方法。是数论中常客的常客了。 使用背景:一般看到幂运算的时候就可以考虑把快速幂拿出来了。

快速幂的时间复杂度是O(logn),举个栗子,假如要处理109的数据,大概只需要运算30次,比O(n2)的效率高了很多个档次了。


快速幂算法的原理说简单一点,就是把幂二进制化,比如对于x22

22的二进制是(10110)2

那么对于x22按照快速幂的原理的拆分法,拆出来就是下面的效果:

x22 = x16 * x4 * x2

基本了解的算法怎么实现的,那么下面咱们具体从例题中落实吧


算法模板


幂运算实现流程:

微信图片_20221018135417.jpg

幂运算代码实现:

快速幂
求 m^k mod p,时间复杂度 O(logk)。
int qmi(int m, int k, int p)
{
    int res = 1, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

例题描述

微信图片_20221018135520.jpg

参考代码


疑难点剖析


小心int溢出

因为快速幂中是指数函数彼此之间的乘积运算。当数据十分庞大的时候,int可能装不下,所以要强转为long long类型

    if(k&1) res = (LL)res*a%p;
    k>>=1;
    a=(LL)a*a%p;

拓展欧几里得算法


前提引入


拓展欧几里得算法是在欧几里得算法的基础上,证明裴蜀定理而产生的的。

裴蜀定理:

对于任意整数a,b,存在一对整数x,y,满足 ax + by = gcb(a,b)


下图是李煜东老师书中对定理证明的详细步骤。后续算法的代码落实也是依赖于这个证明中进行公式变换的部分

微信图片_20221018135703.jpg

算法模板


算法实现流程

微信图片_20221018135729.jpg

算法代码描述:

扩展欧几里得算法
// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1; y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= (a/b) * x;
    return d;

例题描述

微信图片_20221018135812.jpg

参考代码(C++版本)


疑难点剖析


注意要拓展欧几里得算法实现的时候,在函数参数中,要传入系数x和y的引用

微信图片_20221018135853.png


相关文章
|
4月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
7月前
|
算法 数据安全/隐私保护
什么是扩展欧几里得算法?
【5月更文挑战第13天】什么是扩展欧几里得算法?
119 3
|
6月前
|
算法 安全 数据挖掘
解锁编程之门:数论在算法与加密中的实用应用
解锁编程之门:数论在算法与加密中的实用应用
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
|
7月前
|
算法 Python
Python欧几里得算法找最大公约数
Python欧几里得算法找最大公约数
82 0
|
7月前
|
算法 搜索推荐 程序员
C语言第二十二练——扩展欧几里得算法
C语言第二十二练——扩展欧几里得算法
72 0
P4057 [Code+#1]晨跑(数学分析,辗转相除法模板(欧几里得算法))
P4057 [Code+#1]晨跑(数学分析,辗转相除法模板(欧几里得算法))
71 0
|
算法 搜索推荐 程序员
欧几里得算法
欧几里得算法(Euclidean algorithm)是一种计算两个数的最大公约数(Greatest Common Divisor,简称 GCD)的算法。欧几里得算法的基本思想是通过辗转相除的方式,将两个数逐步缩小,直到它们的公约数为止。欧几里得算法的时间复杂度为 O(log n)。
242 1
|
算法 Java
欧几里得算法(GCD, 辗转相除法)
欧几里得算法(GCD, 辗转相除法)
|
算法 Java C++
秒懂算法 │数论之GCD和LCM
本篇内容介绍了GCD和LCM的多种编码方法及其典型例题。
2086 0
秒懂算法 │数论之GCD和LCM