美文网首页
除法与GCD算法的相关分析

除法与GCD算法的相关分析

作者: Bintou老师 | 来源:发表于2018-05-17 11:17 被阅读95次

学习算法三个要素:

1、验证算法的正确性
2、分析算法的效率
3、如何提高算法的效率

以下是两个算除法的“玩具”算法,请验证其正确性,分析它们的效率并进行对比,并思考是否可以进一步提高除法的效率。最后这个问题不容易。

def QuoRem(a, b):
    q, r = 0, 0
    while(a >= b):
        a, q = a - b, q + 1
    r = a
    return q, r

def BinaryQuoRem(a, b):
    if(a == 0):
        return 0, 0
    q, r = BinaryQuoRem(a // 2, b)
    q, r = 2 * q, 2 * r
    if(a & 1): #if a is an odd number
        r = r + 1
    if(r >= b):
        r, q = r - b, q + 1
    return q, r

GCD 与Binary GCD的对比

为什么需要Binary GCD?
为什么看上去Binary GCD更高效?
但是,Binary GCD真的更高效吗?为什么是,为什么不是?
请分析下面这两个算法,并回答以上问题。

# Function to implement Euclidean Algorithm
def gcd(a, b):
    while(b):
        a, b = b, a % b
    return a

# Function to implement Stein's Algorithm
def binary_gcd( a, b) :

    # GCD(0, b) == b; GCD(a, 0) == a,
    # GCD(0, 0) == 0
    if (a == 0) :
        return b

    if (b == 0) :
        return a

    # Finding K, where K is the greatest
    # power of 2 that divides both a and b.
    k = 0

    while(((a | b) & 1) == 0) :
        a = a >> 1
        b = b >> 1
        k = k + 1

    # Dividing a by 2 until a becomes odd
    while ((a & 1) == 0) :
        a = a >> 1

    # From here on, 'a' is always odd.
    while(b != 0) :

        # If b is even, remove all factor of
        # 2 in b
        while ((b & 1) == 0) :
            b = b >> 1

        # Now a and b are both odd. Swap if
        # necessary so a <= b, then set
        # b = b - a (which is even).
        if (a > b) :

            # Swap u and v.
            a, b = b, a

        b = (b - a)

    # restore common factors of 2
    return (a << k)

总结

算法分析实在是太难了!

参考文献

1、对Binary GCD的分析
2、Recursive Binary GCD
3、快速乘法及其应用


2018.0518

相关文章

  • 除法与GCD算法的相关分析

    学习算法三个要素: 1、验证算法的正确性2、分析算法的效率3、如何提高算法的效率 以下是两个算除法的“玩具”算法,...

  • 算法-辗转相除法

    算法:辗转相除法(欧几里得算法) GCD递归定理 辗转相除法算法概述 辗转相除法伪代码 辗转相除法代码实现 对于两...

  • 欧几里得算法(辗转相除法)最大公约数

    欧几里得算法原理 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。gcd(a,b)=gcd(b,a...

  • 辗转相除法——字符串处理

    辗转相除法 GCD:辗转相除法,求两个正整数的最大公约数。 gcd(m,n) = gcd(n,m mod n) [...

  • 算法学习(1)----扩展欧几里得算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: gcd...

  • CSI讲义9: GCD算法

    本文简介求两个整数的最大公因子的GCD算法,并作简要分析。目标:让大一新生建立起关于算法的若干概念。 GCD算法 ...

  • 长期计划安排

    一、数据结构与算法分析 参考书 数据结构与算法分析:C语言描述 算法(第四版) 算法导论 课程相关 MOOC 邓俊...

  • OC多线程学习(二) - GCD

    本文内容: GCD相关概念 有关GCD的几道面试题 源码分析:队列和异步函数 GCD概念 GCD是Grand Ce...

  • BigDecimal类型的相关运算

    1.相关算法: 加法:add()减法:subtract()乘法:multiply()除法:divide()绝对值:...

  • 欧几里得算法(最大公因数)

    问题## 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。例如,gcd(50,15)=5。 证明...

网友评论

      本文标题:除法与GCD算法的相关分析

      本文链接:https://www.haomeiwen.com/subject/pezvdftx.html