我想知道是否存在任何继续证明算法正确性的规则/方案?例如,我们在自然数上定义了一个函数$ F $,定义如下:
function F(n,k)
begin
if k=0 then return 1
else if (n mod 2 = 0) and (k mod 2 = 1) then return 0
else return F(n div 2, k div 2);
end;
其中$ n \ \ text {div} \ 2 = \ left \ lfloor \ frac {n} {2} \ right \ rfloor $
任务是证明$ F(n,k)= \ begin {cases} 1 \ Leftrightarrow {n \ choose k} \ \ text {mod} \ 2 = 1 \ 0 \ text {otherwise} \ end {cases} $
它看起来并不复杂(我错了吗?),但我不知道这种证据应该如何构建。我非常感谢你的帮助。
答案 0 :(得分:6)
mathematical induction经常证明递归算法的正确性。这个方法由两部分组成:首先,你建立基础,然后你使用归纳步骤。
在你的情况下,基数是k = 0时的所有情况,或者当k是奇数但n是偶数时。
归纳步骤要求证明当f(n,k)
正确时,f(2*n,2*k)
,f(2*n+1,2*k)
,f(2*n,2*k+1)
和f(2*n+1,2*k+1)
都是正确的。
答案 1 :(得分:6)
除了以数学方式证明你的逻辑(例如:inductive proof)之外,计算科学还有一些与此相关的结果。
您可以从这里开始概述主题:Correctness
对于您的特定情况,您会对部分正确性感兴趣,以表明答案是预期的答案。然后总的正确性表明程序终止。
Hoare logic可以解决您的部分正确性。
关于这个特殊问题的终止:
如果(n%2 == 0且k%1 == 1)或(k == 0)程序终止,否则它将递归到n / 2,k / 2情况。
在k上使用strong induction,我们可以证明程序总是到达其中一个终端节点,其中k == 0。 (它可能在第一个条款的早期终止,但我们只需要显示它终止,这样做)
所以我给你留下了部分正确性的证明(因为我不知道那些东西)
答案 2 :(得分:2)
一般来说,您会尝试通过归纳证明正确性。这在证明递归函数的正确性时非常有效,因为您可以直接证明基本情况,然后可以使用该函数适用于“较小”输入的事实,以证明它适用于下一个最大输入。
在这种情况下,我会尝试通过有根据的归纳证明。具体来说,我会证明
此证明的细节需要利用函数的细节和二项式系数的bahvaior,但一般模板如上所述。
希望这有帮助!