证明算法在确定位串中1位数的正确性

时间:2012-12-05 06:27:57

标签: algorithm proof

procedure bit count(S: bit string)
count := 0
      while S != 0
          count := count + 1
          S := S ∧ (S − 1)
return count {count is the number of 1s in S}

这里S-1是通过将S的最右边的1位改为0而将其右边的所有0位改为1来获得的位串。

所以我理解为什么这是正确的,我已经写了一个粗略的解释;

在每次迭代之后,S中最右边的1位以及它右边的所有位都设置为0.因此,在每次迭代之后,下一个最右边的1被计算并设置为0,直到整个字符串为0并且循环中断,计数等于1的数量。

我知道这种答案在任何数学界都没有通过,所以我希望写一份正式的证据,但我不知道如何去做。我的证明技巧特别粗制滥造,所以对所涉及的技术的解释将非常感激。

2 个答案:

答案 0 :(得分:1)

使用归纳的证明可能如下所示:

声明:在算法的n次迭代开始时,您已看到(翻转)n-1 1(设置)位和count == n-1

<强>证明:
基础: n==1的微不足道,在第一次迭代中 - 您还没有看到任何设置位,并且count设置为0 ..
假设:对于每个k<n(对于某些n),声明都是正确的。
n 的证明:第n次迭代之后是n-1次迭代。在n-1迭代中,从归纳假设中您已经看到n-1位和count == n-1
由于您到达n次迭代,n-1迭代成功结束 - 因此未满足结束条件,因此存在翻转位。您还将count增加了一个,因此在n步骤中您翻转了n位和count == n

从上面我们可以得出结论,当算法结束时,count == #flipped_bits

<强> QED


请注意,以上是部分正确性 - 它证明如果算法终止 - 它会产生正确的答案,但它不保证终止。
保证终止可以通过显示最多|S|步骤来完成,因为您最多可以翻转最快|S|次,直到获得S = 0。 (终止+部分正确性称为完全正确性)


如果您对证明算法感兴趣,可能会对 Hoare Logic 感兴趣,这提供了一个正式的工具,如何验证程序是否正确。该研究领域称为Software Verification

答案 1 :(得分:0)

首先,它正确。您需要while S != 0,而不是while S = 0

至于证明,我使用归纳证明:如果没有设置位,证明它能正常工作,然后证明如果至少有一个位置位,它会增加计数,减少位数由一个设置,并重复。

在归纳步骤中,唯一困难的部分是显示在S := S ∧ (S − 1)之后,在S中设置的位数将精确地减少1.主要部分是对于任何数量N的表单10..0N-1的格式为01..1 - 这是二进制计数的基本特性。我可能反过来做 - 显示任何数字:01..1,下一个连续数字是10..0,基本上归结为:“1 + 1 - &gt; 0 + carry`。