我目前在家庭作业中停留在循环不变性证明上。我需要证明其正确性的算法是:
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
。我只是觉得我需要证明这一点。
我希望有人可以帮我分享一些信息,因为我在这里找到的类似案例还不够。
提前感谢您的时间。
答案 0 :(得分:2)
假设算法终止(为此假设a>0
和b>0
就足够了),不变的是,在while
循环的每次迭代中,您都有{{ 1}}。
证明:
x + by = a
和x = a
,没关系y = 0
,则为x + by = a
,它们是您下一次迭代的(x - b) + (y + 1)b = a
和x
的值插图:
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=0
和a>=b
的“算法”没有终止,那么它甚至都不是算法。
如Alex M所指出的,该循环的循环不变式为x + by = a
。在循环退出的时刻,我们还有x < b
。 x
没有其他保证,因为(大概)a
可能为负。如果我们保证a
和b
是正数,那么我们可以保证在循环退出的那一刻0<=x<b
,这意味着它将使用余数算法(在循环结束时,y
是商,x
是余数,它以“无限下降”类型自变量终止:正整数x
的递减序列必须终止)。然后,您可以得出结论,如果x=0
,b
均分,并且返回商,否则返回-1
。
但这并不是证明,因为我们缺乏算法应做的规范以及对输入限制的规范。 (a和b是否为正整数?不允许负数和0?)