Каков инвариант цикла для этого кода?

Мне нужно придумать инвариант цикла для данного фрагмента кода:

//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


person ceptno    schedule 06.10.2013    source источник
comment
Надеюсь, это правильный сайт, чтобы опубликовать это.   -  person ceptno    schedule 06.10.2013
comment
x^y это... x xor y? (Я не такой глупый, но было бы чертовски полезно сказать, что вы имеете в виду)   -  person sehe    schedule 07.10.2013


Ответы (1)


Я бы предложил один вариант цикла

  • что x' ^ y' == (x ^ y)/z (где x' и y' — измененные входные данные после любой итерации)
  • что x' >= x и 0 <= y' < y (это доказывает, что алгоритм завершится)
person sehe    schedule 06.10.2013
comment
а когда х = 2, у = 3? на третьей итерации x=4, y=1, поэтому 4^1!= 2^1. - person ceptno; 07.10.2013
comment
@ Брэндон, ой, я упустил фактор z в уравнении. Фиксированный. - person sehe; 07.10.2013
comment
Можете ли вы рассказать мне что-нибудь о том, как вы пришли к такому выводу? Это решение настолько чистое и простое. - person ceptno; 07.10.2013
comment
Посмотрите на две ветки. Спросите себя (а) почему это гарантированно закончится (б) почему ответ по-прежнему правильный? - person sehe; 07.10.2013