我需要为给定的代码提出一个循环不变量:
//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
的后置条件答案 0 :(得分:1)
我建议使用一个循环变体
x' ^ y' == (x ^ y)/z
(其中x'
和y'
是任何迭代后的修改输入)x' >= x
和0 <= y' < y
(这证明算法将完成)