乘法算法的循环不变性证明

时间:2018-10-26 14:59:35

标签: algorithm pseudocode discrete-mathematics loop-invariant

我目前在家庭作业中停留在循环不变性证明上。我需要证明其正确性的算法是:

Multiply(a,b)
    x=a
    y=0
    WHILE x>=b DO
        x=x-b
        y=y+1
    IF x=0 THEN
        RETURN(y)
    ELSE
        RETURN(-1)

我试图看一些循环不变式的例子,并且对它应该如何工作有一些想法。但是,在上面的算法中,我有两个退出条件,而对于如何在循环不变性证明中解决这个问题,我有些迷失。特别是我在IF和ELSE语句周围苦苦挣扎的终止部分。

到目前为止,我所构造的只是看算法的终止,在这种情况下,如果x = 0则返回包含y值的n值( while循环中的迭代次数),其中x不是0,而x < b则返回-1。我只是觉得我需要证明这一点。

我希望有人可以帮我分享一些信息,因为我在这里找到的类似案例还不够。

提前感谢您的时间。

2 个答案:

答案 0 :(得分:2)

假设算法终止(为此假设a>0b>0就足够了),不变的是,在while循环的每次迭代中,您都有{{ 1}}。

证明:

  • 首先使用x + by = ax = a,没关系
  • 如果为y = 0,则为x + by = a,它们是您下一次迭代的(x - b) + (y + 1)b = ax的值

插图:

y

Multiply(a,b) x=a y=0 // x + by = a, is true WHILE x>=b DO // x + by = a, is true x=x-b // X = x - b y=y+1 // Y = y + 1 // x + by = a // x - b + by + b = a // (x-b) + (y+1)b = a // X + bY = a, is still true // x + by = a, will remain true when you exit the loop // since we exited the loop, x < b IF x=0 THEN // 0 + by = a, and 0 < b // y = a/b RETURN(y) ELSE RETURN(-1) 除以a/b时,此算法返回b,否则返回a-1听起来不太合适……

答案 1 :(得分:0)

如果没有确切说明该函数应该做什么的说明,我们就无法证明其正确性,我在您的问题中找不到。甚至函数的名称也无济于事:如前所述,当b除以a时,函数大多数时候返回a / b,否则返回-1。乘法是一个不合适的名字。

此外,如果b=0a>=b的“算法”没有终止,那么它甚至都不是算法。

如Alex M所指出的,该循环的循环不变式为x + by = a。在循环退出的时刻,我们还有x < bx没有其他保证,因为(大概)a可能为负。如果我们保证ab是正数,那么我们可以保证在循环退出的那一刻0<=x<b,这意味着它将使用余数算法(在循环结束时,y是商,x是余数,它以“无限下降”类型自变量终止:正整数x的递减序列必须终止)。然后,您可以得出结论,如果x=0b均分,并且返回商,否则返回-1

但这并不是证明,因为我们缺乏算法应做的规范以及对输入限制的规范。 (a和b是否为正整数?不允许负数和0?)