{ PRE: n >= 0 and x != 0 } k, y, z := n, 1, x { INV: k>=0 and x^n=y*z^k and x!=0 and z!=0 } while k != 0 do if odd(k) then k, y := k-1, y * z else k, z := k/2, z * z endif endwhile { POST: y = x^n }