找到此幂函数的循环不变量

时间:2014-12-01 00:00:31

标签: python loops invariants loop-invariant

在我的计算理论课程中,我很难掌握证明迭代程序/函数正确性的概念。更具体地说,我不知道如何提出循环不变量。我知道一个函数可以有多个循环不变量,但对于如何找到一个帮助我们证明后置条件的函数来说,这是一个完全的谜。我目前正在完成一些功课,不知道如何为以下功能找到循环不变量。

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。

1 个答案:

答案 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