这段代码的循环不变量是多少?

时间:2013-10-06 01:48:51

标签: loops while-loop proof loop-invariant

我需要为给定的代码提出一个循环不变量:

//pre: x & y >= 0
//post: z = x^y
//computes pow(x, y), x^y
int pow(int x, int y){
    int z = 1;
    while(y > 0){
        if(y%2==0){
            y /= 2;
            x = x*x;
        }else{
            z = z*x;
            y -= 1;
        }
    }
    return z;
}

我的不变量是:

{(ypre - 0 = 0 & x = x^(ypre  -y)) OR (ypre - y != 0 & x^(n + m) = x^(ypre - y), where (n=ypre-y) and (m=integer value of z/x))}

这是一个混乱的不变量,我不是100%肯定它是正确的。是否有更好的不变量可以覆盖z = x ^ y

的后置条件

1 个答案:

答案 0 :(得分:1)

我建议使用一个循环变体

  • x' ^ y' == (x ^ y)/z(其中x'y'是任何迭代后的修改输入)
  • x' >= x0 <= y' < y(这证明算法将完成)