2013-10-06 2 views
0

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

//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% это верно. Есть ли лучший инвариант, который будет охватывать пост состояние г = х^у

+0

Надеюсь, это правильный сайт, чтобы отправить это в. – ceptno

+0

х^у есть .. x xor y? (Я не такой глупый, но, наверняка, как черт может сказать, что вы имеете в виду) – sehe

ответ

1

Я хотел бы предложить один вариант петли

  • что x'^y' == (x^y)/z (где x' и y' являются модифицированные входы после любой итерации)
  • что x' >= x и 0 <= y' < y (это доказывает, что алгоритм завершится)
+0

, о чем когда x = 2, y = 3? на третьей итерации x = 4, y = 1, так что 4^1! = 2^1. – ceptno

+0

@Brandon oops Я не учитывал коэффициент 'z' уравнения. Исправлена. – sehe

+0

Есть ли что-нибудь, что вы можете мне рассказать о том, как вы пришли к такому выводу? Это решение настолько чистое и простое. – ceptno

Смежные вопросы