Monday, March 16, 2009

从“迷失的8”到生成函数:小数展开的秘密(转)

转自 matrix67.com:<http://www.matrix67.com/blog/archives/1574>

小学时经常在计算器上面按12345679这个神秘的8位数。这个数牛就牛在,它乘以9的结果正好等于111111111。你可以在计算器 上输好12345679,然后问MM“你的幸运数字是多少”;如果她说“7”,你就在计算器上按“乘以63”,计算器上将会显示出清一色的7字,看上去无 比壮观。
假如123456789×9=1111111111的话,我倒不会觉得奇怪。网上流行过一个火星帖子,写了一大堆诸如111111111 * 111111111 = 12345678987654321的式子来展示数学之美,以至于大家会认为123456789×9的结果也一定是一串很有规律的数字。因此,如果我不在 这里说一句123456789×9其实并不等于1111111111的话,估计很多人都发现不了问题。事实 上,123456789×9=1111111101,偏偏就差一个“1”。而怪就怪在,去掉被除数中的数字“8”,偏偏又有了 12345679×9=111111111,一个极其别扭的算式反而得到了完美的结果。不要让你的直觉被数学之美所蒙蔽,数学上有大量出人意料的、看上去 很不对称的结论。
为什么偏偏要少一个“8”呢?难道这真的是算术中的一个不可抹去的疤痕?我们急需要寻求一个解释,填补上算术中的这个不和谐的“漏洞”。一种解释 是,我们看到了123456789×9=1111111101并不美观,想要对其进行改造,进而得到(123456789+1)*9 = 1111111101+9 = 1111111110,于是(123456789+1)*9/10 = 12345679*9 = 111111111。用这种办法的确可以解释“迷失的8”,不过这个解释并不漂亮。为了寻求一个更好的解释,我们来看一看111111111和9的关系。


或许大家都知道,利用等比数列求和,我们可以把任一循环小数还原为分数。111...11和9之间有一个非常精妙的联系:1/9 = 0.111... 。换句话说,1000000000/9取整之后就应该等于111111111。而这个神秘的12345679,就应该是1000000000/81取整后 的结果了。1/81到底等于多少呢?拿精度稍微高一点的计算器一算,我们发现1/81 = 0.01234567901234... 。原来,12345679的秘密全在1/81里面,12345679*9=111111111其实相当于是拿1/81乘以9,取得了1/9的小数部分。
现在余留的问题就是,为什么1/81的前面几位是.012345679呢?仔细观察这个小数,你会发现整个小数的循环节就是012345679,偏偏就少一个“8”。这到底是为什么呢?
为了解释一种反常的数学现象,一个有趣的思路就是,“如果不是这样,你觉得又该是怎样呢?”理想中,这种有悖于数学之美的事情是不应该发生 的,1/81要是等于0.01234567890123456789...就好了,或者更牛B一点的,有没有可能等于 0.0123456789101112131415...?哦,这个好像太夸张了,后面这个小数明显是一个无限不循环小数,不可能和一个有理数相等。不过 呢,Σn/10^(n+1)倒是有可能的。想到这一点,我们最初的谜题迎刃而解!

原来,“迷失的8”并不是一个算术上的瑕疵。或许1/81的小数部分本来就应该是123456789..,接下去的一个数应该是10,但它 应该占据两个数的位置,而留给它的原本只有一个数位。于是乎,数字10中的个位“0”与“9”的后面一位对齐,而十位“1”则加到了“9”身上并产生了进 位,得到了123456790的结果,产生了“迷失的8”这一错觉。而后,刚才10的个位“0”又加上了紧随其后的11的十位,11的个位又和12的十位 拼成了“2”,如此反复,使得整个小数部分不断地重复012345679这一循环。

1/81=Σn/10^(n+1)这一猜测似乎很合理,究竟对不对呢?这和81又有什么关系呢?只需要注意到1/81=(1/9)*(1 /9),联想前面我们讲过的东西,我们就得到了一个虽然不严密但是颇有启发性的推理。111*111=12321,是因为111*111相当于把111错 位写成三行后加起来;类似地,前面提到的极端情形111111111 * 111111111 = 12345678987654321也是如此。那么,如果10个1乘以10个1呢?如果无穷个“1”乘以无穷个“1”呢?当我们计算1/9的平方时,我们 实际上在做的正是用无穷多个1去乘以无穷多个1,而乘式的第n+1列里恰有n个“1”,它们加起来并产生适当的进位后就得到了 0.0123456790123... 。

循环小数与整数之间存在着很多微妙的关系。很多时候,利用小数展开我们能解决很多无从下手的算术题目。小学奥数中有一道题目我印象极深:一 个位数小于30的、以“15”打头的整数,把这个“15”移到数的末尾后,新数正好是原数的5倍。问原数是多少。很少有人能想到,解开这道题的钥匙竟然是 分数和小数。假设有某个小数x的循环节就等于我们要求的数,那么

可知100x-5x=15,解得x=15/95=3/19。把3/19还原成小数,发现它的循环节是157894736842105263,问题就如此简单的解决了。
且慢,我还准备了更加精彩的数学魔术!让我们来看一看下面这套把戏:

100/9899 = 0.0101020305081321345590463 ...

牛B吧!两位两位的看,前面几个数正好形成Fibonacci数列!不过,再往后走,位数的限制迫使进位产生,打乱了原有的秩序。能让每个数的位数更长一些吗?能!请看:

1000/998999 = 0.001001002003005008013021034055089144233377610...
10000/99989999 = 0.000100010002000300050008001300210034005500890144...
100000/9999899999 = 0.00001000010000200003000050000800013000210003400055000890014400233...
......................

这个就更加奇怪了。为什么一个简简单单的分数展开之后竟然出现了Fibonacci数列?其实,道理和前面所讲的很相似。100/9899 显然是由100/(10000-100-1)得到的,让我们来看一下0.0101020305081321...乘以(10000-100-1)是否能还 原成100:

可以看到,这个“Fibonacci小数”的10000倍,减去它的100倍,再减去它自身,得到的结果正好是100,究其原因则是Fibonacci数列的递归性质。熟悉生成函数的读者猛地一拍大腿,唉呀!这不就是生成函数么!我在讲解生成函数的日志里曾经写道:

接下来我们要演示如何使用生成函数求出Fibonacci数列的通项公式。
Fibonacci数列是这样一个递推数列:f(n)=f(n-1)+f(n-2)。现在我们需要求出它的生成函数g(x)。g(x)应该是一个这样的函数:
g(x)=x+x^2+2x^3+3x^4+5x^5+8x^6+13x^7+...
等式两边同时乘以x,我们得到:
x*g(x)=x^2+x^3+2x^4+3x^5+5x^6+8x^7+...
就像我们前面说过的一样,这相当于等式右边的所有系数向右移动了一位。
现在我们把前面的式子和后面的式子相加,我们得到:
g(x)+x*g(x)=x+2x^2+3x^3+5x^4+8x^5+...
把这最后一个式子和第一个式子好好对比一下。如果第一个式子的系数往左边移动一位,然后把多余的“1”去掉,就变成了最后一个式子了。由于递推函 数的性质,我们神奇地得到了:g(x)+x*g(x)=g(x)/x-1。也就是说,g(x)*x^2+g(x)*x-g(x)=-x。把左边的g(x) 提出来,我们有:g(x)(x^2+x-1)=-x。于是,我们得到了g(x)=x/(1-x-x^2)。

原来,100/9899说穿了就是把x=1/100代入生成函数g(x)。
这下子就热闹了。考虑数列1, 4, 9, 16, 25, 36, ...的生成函数g(x)=x(1+x)/(1-x)^3,代入x=1/100得到g(1/100)=10100/970299,于是出现了:

10100/970299 = 0.0104091625364964 ...

当然,想要更牛B的也不难:

g(1/1000) = 1001000/997002999 = 0.001004009016025036049064081100121144169 ...

再来看看数列2, 4, 8, 16, 32, ...的生成函数g(x)=2x/(1-2x),利用它可以产生出

g(1/100) = 1/49 = 0.0204081632 ...

或许有人会恍然大悟,原来,1/7=0.142857...也不是一个巧合。14是7的两倍,28是7的四倍,57是7的八倍加一,这都是因为它们是7乘以“2的幂序列”并产生适当进位后得到的。
重新回到我们先前讨论的话题,我们惊奇地发现,数列0, 1, 2, 3, 4, ...的生成函数为g(x)=x^2/(1-x)^2。于是:

g(1/10) = 1/81 = 0.0123456790123...

No comments: