在我的计算理论课程中,我很难掌握证明迭代程序/函数正确性的概念。更具体地说,我不知道如何提出循环不变量。我知道一个函数可以有多个循环不变量,但对于如何找到一个帮助我们证明后置条件的函数来说,这是一个完全的谜。我目前正在完成一些功课,不知道如何为以下功能找到循环不变量。
PREcondition: a is a number, b is a natural number.
POSTcondition: return a^b.
def power(a, b):
s = a
k = b
p = 1
while k > 0:
if k % 2 == 1:
p = p * s
s = s * s
k = k // 2
return p
截至目前,我理解该函数是如何工作的,但正如我之前所说的那样,当我试图找到一个合适的循环不变量时,我会迷失方向,这将帮助我显示该函数返回^ b。
答案 0 :(得分:2)
请注意,虽然^
在某些语言中意味着“权力”,但在Python中它是按位xor。幂运算符为**
这是一对检查循环正朝向正确结果的夫妇
while k > 0:
assert s ** k * p == a ** b
if k % 2 == 1:
p = p * s
s = s * s
k = k // 2
assert k == 0 or s ** k * p == a ** b
也可以编写像
这样的防守不变量s >= a
n <= b