python - 找到该幂函数的循环不变量

标签 python loops invariants loop-invariant

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

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

到目前为止,我了解该函数是如何工作的,但正如我之前所说,当我试图找到一个合适的循环不变量来帮助我证明该函数返回 a^b 时,我非常迷失。

最佳答案

请注意,虽然 ^ 在某些语言中表示“幂”,但在 Python 中它是按位异或。幂运算符是 **

这里有一些检查循环是否朝着正确的结果前进

    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

关于python - 找到该幂函数的循环不变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27219817/

相关文章:

python - 安装包的导入错误(wikitools)

python - 如何使用groupby计算vwap(成交量加权平均价格)并申请?

vba - Excel VBA 使用循环将员工分配给任务

PHP 向结果添加计算,推送到结果数组,排序,然后打印

c# - 有没有一种简单的方法可以创建相同对象的列表而不使用循环?

domain-driven-design - 具有重要不变量的潜在大型集合的 DDD 聚合

javascript - 使用 Facebook 的不变量 vs if throw

java - 计算机术语中的前置条件,后置条件和不变量有什么区别

Python getchildren() 不适用于有效的 XML 树

python - ImportError:无法导入名称 get_column_letter