Algorithm 乘法算法的循环不变证明
在我的家庭作业中,我目前被困在循环不变证明上。我需要证明正确性的算法是:Algorithm 乘法算法的循环不变证明,algorithm,pseudocode,discrete-mathematics,loop-invariant,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) 我试着看了几个循环不变量的例子,我对它应该如何工作有了一些想法。然而在上面的算法中,我有两个退出条件,我对如何在循环不变证明中实现这一点有点迷
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
,然后它返回-1
。我只是觉得我需要证明这一点
我希望有人能为我提供一些帮助,因为我在这里发现的类似案例还不够
提前感谢您的时间。如果算法终止(为此,我们假设
a>0
和b>0
,这就足够了),一个不变量是,在的每次迭代中,当循环时,您都有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)
x=a
y=0
//x+by=a是真的
当x>=b时
//x+by=a是真的
x=x-b//x=x-b
y=y+1//y=y+1
//x+by=a
//x-b+b+b=a
//(x-b)+(y+1)b=a
//X+bY=a仍然是真的
//退出循环时,x+by=a将保持为真
//因为我们退出了循环,x
当b
除以a
时,此算法返回a/b
,否则返回-1
Multiply
听起来不是一个合适的名称…假设算法终止(为此,我们假设a>0
和b>0
,这就足够了),一个不变量是,在循环的每次迭代时,都有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)
x=a
y=0
//x+by=a是真的
当x>=b时
//x+by=a是真的
x=x-b//x=x-b
y=y+1//y=y+1
//x+by=a
//x-b+b+b=a
//(x-b)+(y+1)b=a
//X+bY=a仍然是真的
//退出循环时,x+by=a将保持为真
//因为我们退出了循环,x
当b
除以a
时,此算法返回a/b
,否则返回-1
Multiply
听起来不太适合它的名字…如果没有函数应该做什么的具体说明,我们就无法证明正确性,我在你的问题中找不到。甚至函数名也没有帮助:如前所述,当b
除以a
时,函数大部分时间返回a/b,否则返回-1
。乘法是一个不合适的名称
此外,如果b=0
和a>=b
则“算法”不会终止,因此它甚至不是算法
正如Alex M所指出的,循环的循环不变量是x+by=a
。在循环退出时,我们还有x
。x
没有其他保证,因为(大概)a
可能是负数。如果我们保证a
和b
是正的,那么我们可以保证0如果没有函数应该做什么的具体说明,我们就无法证明正确性,这是我在你的问题中找不到的。甚至函数名也没有帮助:如前所述,当b
除以a
时,函数大部分时间返回a/b,否则返回-1
。乘法是一个不合适的名称
此外,如果b=0
和a>=b
则“算法”不会终止,因此它甚至不是算法
正如Alex M所指出的,循环的循环不变量是x+by=a
。在循环退出时,我们还有x
。x
没有其他保证,因为(大概)a
可能是负数。如果我们保证a
和b
为正,那么我们可以保证0为什么函数在除法时被称为Multiply
呢?为什么函数在除法时被称为Multiply
呢?是的,这看起来很公平,但这是不变量的合法证明吗?最让我沮丧的是,我很难看到我需要解决手头的问题。如果我需要以某种方式证明它,或者我可以说,例如,你所描述的,例如,我编辑了我的答案,包括额外的步骤来证明。