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
呢?是的,这看起来很公平,但这是不变量的合法证明吗?最让我沮丧的是,我很难看到我需要解决手头的问题。如果我需要以某种方式证明它,或者我可以说,例如,你所描述的,例如,我编辑了我的答案,包括额外的步骤来证明。