algorithm - 乘法算法的循环不变证明
问题描述
我目前在我的家庭作业中陷入循环不变证明。我需要证明其正确性的算法是:
Multiply(a,b)
x=a
y=0
WHILE x>=b DO
x=x-b
y=y+1
IF x=0 THEN
RETURN(y)
ELSE
RETURN(-1)
我试着看几个循环不变量的例子,我对它应该如何工作有了一些了解。然而,在上面的这个算法中,我有两个退出条件,我对如何在循环不变证明中处理这个问题有点迷茫。特别是我正在努力解决的终止部分,围绕 IF 和 ELSE 语句。
到目前为止,我所构建的只是查看算法的终止,在这种情况下,如果x = 0
它返回y
包含n
(while 循环中的迭代次数) 的值的值,其中 if x
is not 0
,x < b
然后它返回-1
。我只是有一种感觉,我需要以某种方式证明这一点。
我希望有人可以为我提供一些帮助,因为我在这里找到的类似案例还不够。
非常感谢您抽出宝贵的时间。
解决方案
假设算法终止(让我们假设a>0
和b>0
,这就足够了),一个不变量是在循环的每次迭代中while
,你都有x + by = a
.
证明:
- 起初,
x = a
所以y = 0
没关系 - If
x + by = a
, then(x - b) + (y + 1)b = a
, 是下一次迭代的x
和的值y
插图:
Multiply(a,b)
x=a
y=0
// x + by = a, is true
WHILE x>=b DO
// x + by = a, is true
x=x-b // X = x - b
y=y+1 // Y = y + 1
// x + by = a
// x - b + by + b = a
// (x-b) + (y+1)b = a
// X + bY = a, is still true
// x + by = a, will remain true when you exit the loop
// since we exited the loop, x < b
IF x=0 THEN
// 0 + by = a, and 0 < b
// y = a/b
RETURN(y)
ELSE
RETURN(-1)
该算法a/b
在b
除以时返回a
,-1
否则返回。Multiply
听起来不太像一个合适的名字......
推荐阅读
- docker-compose - CommandError: /code/manage.py 已经存在,将项目或应用程序覆盖到现有目录中不会替换冲突文件
- c++ - 5000+深度递归时函数堆栈溢出
- python - 为什么 Selenium 只获取页面上第一个 ToolTip 的文本?
- c# - 将 Windows 桌面快捷方式拖放到 listView
- python - 如何查找单词 - 第一个字母大写,其他小写
- python - 如何使用 python 控制台修复导入 keras 错误
- c# - 如何在winform中的file.cs之间传输数据?
- hyperledger-fabric - Hyperledger Fabric 中是否有与 getHistoryForKey 类似的功能,也提供交易详情?
- android - android 不适用于 bg_non_interactive?
- c++ - 获取向量中元素的地址