代码改变世界

为什么二进制数能表示所有整数

2011-11-03 18:28  meteorgan  阅读(1884)  评论(0编辑  收藏  举报

1. 一个显而易见的问题: 为什么二进制数(仅考虑无符号数)与正整数一一对应?
    二进制和整数间的相互转换算法说明每个二进制串对应一个整数,同样每个整数都对应一个二进制串。但不能说明不同二进制串对应不同整数,即,任两个不同的二进制串是不等的。这个问题有一个很简单的证明方法:
    假设有两个二进制串a1,a2,它们的最高位分别为k1, k2(最高位不为0)。如果这两个二进制串相等则它们的最高位相等(k1=k2)。
    反证:假设 k> k2, 则有:
                             
同理得k1不能小于k2于是有k1 = k2。由同样的方法可知它们的次高位有相等,以此类推得:a1,a2每一位都相等。所以有如果两个二进制串相等,则它们每一位都相等(最高位不为0).运用上述结论也可证明不同整数对应的二进制串不同。
    现在如果改变二进制权重的符号,允许某些位的权重为负数。例如:用p,n序列表示二进制的符号(p表示正号, n负号),假设一个k位的二进制数1101,它的符号序列是pnnp,则该二进制数的大小为1*23 + 1*(-22) + 0 + 1*(20) = 5。那么这种二进制仍然能与它表示范围内的所有整数一一对应吗?
    将允许权重为负的二进制定义为“类二进制”,容易验证上述类二进制序列("pnnp")可以表示[-6, 9]的所有整数。对于一个长度为k的二进制序列,它能表示的相异整数的个数最多为2k。对于“类二进制”,最大值在令所有p位为1,n位为0处取得,最小值在令所有n位为1,p位为0处取得,由此可见长度为k的类二进制的表示范围为2k。因此如果每个类二进制的取值不同,则这种类二进制就与它表示范围内的所有整数一一对应。
    证明方法和证明普通二进制与整数对应方法类似,通过证明取值相等的类二进制每位都相等来证明。已知a1, a2是两个相等的正“类二进制”数(负二进制证明方法类似)。a1最高正数位为k,a2正数位序列为{p1, p2,..., pm},最高正数位是p1, 假设k > p1,则有:
                                             

                       
a2 最大值所有正数位都取1,所有负数位都取0处取得;a1最小值在除最高正数位外所有已知正数位都取0,未知位都当负数位,取1时取得。此时有a1 > a2,假设不成立,同理可得 k < p1不成立,所以有k = p1。同理可得a1 ,a2的每位都相等。因此不同的“类二进制”表示的整数不同,“类二进制”可以表示其范围内的所有整数”。
    如果把普通二进制当作2i的整数序列,“类二进制”当作普通二进制序列中某些元素取负值的序列,那么所有整数在这两种序列中都有唯一的表示形式。是否还有其它序列,每个整数都可以在这个序列中有唯一的表示形式?
Fibonacci数列是其中之一。任意挑个数字,譬如17:
17  = 13 + 3 + 1
    = 13 + 2 + 1 + 1
    = 8 + 5 + 3 + 1 
    = 8 + 5 + 2 + 1 + 1

不过此时每个整数有多种表示。如果对整数的Fibonacci数表示加如下限制,则每个数有唯一表示:

  1. Fibonacci数的下标大于1。
  2. 不能取连续的Fibonacci数。

这样17只有17 = 13 + 3 + 1这一种表示。上述整数的Fibonacci表示法被称为Zeckendorf's theorem


2. 完全数列
如果去掉唯一表示这个条件,什么样的数列可以表示所有正整数呢?
    1961年,John L.Brown.Jr提出了如下判定法则(Brown's Criterion):
    一个非递减的正整数序列,若第一项的值为1,且任意一项的值都不大于它前面所有项的和加1,则这个序列是完全的(complete)。即可表示所有整数。形式化的表示为,一个数列{vi}是完全的,当:

  1. v1 = 1
  2. for all k = 2, 3, ……  

             

这个法则的一个推论是:任一首项为1,每项都不大于它前一项两倍的数列是也完全的。显然,二进制和Fibonacci数列满足该条件。

    比较有意思的是,如果把1添加到质数数列的第一项,构成数列(1, 2, 3, 5, 7, 13, ……),那么该数列也是完全的。
    对任一完全数列{vi},任意正整数可以表示为该数列的一个二进制串形式,数列的值为二进制相应位的权重。即,对正整数n有:
                                       
那么在整数的所有完全数列二进制表示中,哪一种数列表示的平均长度最短?可以把这个问题转换为对固定长度的二进制串,用哪种数列表示得到的数最大?
    容易证明普通二进制(1, 2, 22, 23,……)这种表示方法得到的数最大。设某固定长度的二进制串长度为k,由完全数列的推论知:
                         





参考文献
Zeckendorf's theorem
BWeisstein, Eric W. "Brown's Criterion." From MathWorld--A Wolfram Web Resource.
Weisstein, Eric W. "Complete Sequence." From MathWorld--A Wolfram Web Resource.