斐波那契数列
在解决这道题目之前我们首先先了解一下什么是斐波那契数列:
斐波那契数列的由来源于一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?
为了更清晰一点,我们作出下面的示意图。
在图中,我们的黑点表示的是成熟兔子,白点表示的是小兔子。我们够仔细的话能够发现,右边这一列数字是有规律的。第一个数和第二个数为 1,之后的每一个数为之前两个数之和。比如,六月份的兔子数量为四月份和五月份兔子数量之和,即 8=5+3。
此外,我们再仔细看一下,六月份的兔子中有五对黑(成熟)兔子和三对白兔子,8=5+3。同样是 8=5+3,但是该等式和上式中的 5 与 3 表示了不同的意义,那么他们之间是否存在本质的联系呢。实际上 5 对黑兔子就是上个月的 5 对兔子变来的,只不过其中的白兔子都变为了黑兔子,即 5=5; 三只白兔子从哪来的,它们是四月份的三对兔子生的,不管黑白,到了五月份都是黑兔子,六月份的时候也就只有它们能生小兔子,而且必须生一对小兔子,所以 3=3。
由此,我们甚至可以预测到未来的兔子数量
斐波那契数列的特性
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
观察一下上面的数列,你发现有什么特征吗?
- 第一项和第二项是 1,之后的每一项为之前两项的和。
即:
- 对每一项做平方
前几项平方求和求和:
=2
=6
=15
=40
=104
......................
我们观察一下等式右边
该等式右边中所有的数字均为斐波那契数,神奇吧。而且这不是一个巧合,这个性质不限于上式中的几个,事实上,我们可以写出前 n 项的平方和,依旧有这样的性质。为什么斐波那契数的前 N 项平方和可以写成两个斐波那契数之积呢?
既然这个性质不是巧合,那么其中必定有着更深层的数学本质。解决这个问题,我们从从上述的等式中貌似很难得到结论。我们转换一下思路,平方有何几何意义,显然平方指的是一个正方形的面积,那好,我们依照这个思路,作一个几何图形试试。
这下就很容易明白了,比如式中的第一个等式 12+12=1*2。左边表示两个正方形的面积,右边表示一个长方形的面积,很显然它们表示的是同一区块的面积。再比如最后一个等式,左边表示上图中六个正方形的面积之和,右边表示图中的大长方形的面积,左右两边也是同一个区块。现在似乎明白了等式为什么成立了
我们只要知道当一个斐波那契数为其前 n 项平方之和,我们就可以构造上面的几何图形,而且这样构造的图形中的长方形 (粗黑线为边界) 的边长只能为斐波那契数。
- 左边为相邻两个斐波那契数的平方和,我们发现计算的结果全为斐波那契数
- 斐波那契数列与杨辉三角的关系
将杨辉三角中的斜向的一列数求和,得到一组新的数,而这一组新的数正好是斐波那契数列
- 斐波那契数列的整除性与素数生成性
每 3 个数有且只有一个被 2 整除,
每 4 个数有且只有一个被 3 整除,
每 5 个数有且只有一个被 5 整除,
每 6 个数有且只有一个被 8 整除,
每 7 个数有且只有一个被 13 整除,
每 8 个数有且只有一个被 21 整除,
每 9 个数有且只有一个被 34 整除,
.... ...
... ....
生活中斐波那契数列也是很神秘的存在
大到宇宙银河
小到我们的手指
甚至是鹦鹉螺中都存在斐波那契数
总地来说,斐波那契数列代表了神一样的递归思想。并在数论和计算机科学领域中长盛不衰。
参考
[1] O'Connor, John J.; Robertson, Edmund F., Leonardo Pisano Fibonacci//MacTutor History of Mathematics archive
[2] Dr R Knott. "Who was Fibonacci?". Maths.surrey.ac.uk. Retrieved 2010-08-02.
[3] Weisstein, Eric W., "Binet's Fibonacci Number Formula", MathWorld.
[4] Douady, S; Couder, Y (1996), "Phyllotaxis as a Dynamical Self Organizing Process" (PDF), Journal of Theoretical Biology 178 (178): 255–74, doi:10.1006/jtbi.1996.0026
[5] Jones, Judy; Wilson, William (2006), "Science", An Incomplete Education, Ballantine Books, p. 544, ISBN 978-0-7394-7582-9
[6] Brousseau, A (1969), "Fibonacci Statistics in Conifers", Fibonacci Quarterly (7): 525–32
[7] Prusinkiewicz, Przemyslaw; Lindenmayer, Aristid (1990), The Algorithmic Beauty of Plants, Springer-Verlag, pp. 101–7, ISBN 978-0-387-97297-8
[8] Vogel, H (1979), "A better way to construct the sunflower head", Mathematical Biosciences 44 (44): 179–89, doi:10.1016/0025-5564(79)90080-4
解题思路
现在回到题目
达芬奇隐藏在蒙娜丽莎中的数字列: | |
1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 | |
记录在达芬奇窗台口的神秘数字串: | |
36968853882116725547342176952286 |
这道题题目是达芬奇密码,我一开始猜想可能会和原著有关,于是去翻阅里面存在的各种密码
不耐心,没找到。
但是
电影简介中会提到 —— 斐波那契数列。贯穿整部电影的重要线索。
而隐藏在蒙娜丽莎中的数字列则是斐波那契数列
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 |
对比蒙娜丽莎中的数字列,发现数值一样,但是进行了位移。
之后对比,观察题目中给到的两个数列的长度都是 32,并且题目提示 flag 也是 32 位,可以推测,神秘数列是通过 flag 位移后得出的,而位移的规则是斐波那契数列的位移。
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 | |
1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 | |
3 6 9 6 8 8 5 3 8 8 2 1 1 6 7 2 5 5 4 7 3 4 2 1 7 6 9 5 2 2 8 6 |
对比两列数列:
第 0 位 1 还是 1,没有位移。
第一位 233 是斐波那契数列中的第十二位(从第 0 位开始算),因此下面神秘数字串的第一位的 6 是原本 flag 的第十二位。(因为神秘数列是通过 flag 位移后得出的,而位移的规则是斐波那契数列的位移。我们通过斐波那契数列位移反推 flag)
第二位 3 是斐波那契数列的第三位,因此下面神秘数字串的第二位的 9 是原本 flag 的第三位。
以此类推……
fb = '1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309' | |
t = '1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 ' | |
m = '36968853882116725547342176952286' | |
s = 'a' * 32 | |
s = list(s) | |
fb = fb.split(' ') | |
t = t.split(' ') | |
for i in range(32): | |
s[fb.index(t[i])] = m[i] | |
for i in range(32): | |
print(s[i], end='') |
这里补充一下 python 语法:
Python 列表 index () 方法
index () 方法返回指定值首次出现的位置
fruits = ['apple', 'banana', 'cherry'] | |
x = fruits.index("cherry") | |
print(x) | |
返回为2 |
最后结果中带有一个 a
题目说的是 32 位十进制,可能是哪里出错了...
注意数字列中的第 2 个 1 在第 24 位,由于 string.index () 函数在查询下标的时候,会从右往左查询,故而第 24 位的 1 所对应的数字 7,覆盖了第 0 个位置的 1 所对应的数字 3。所以第 1 个位置没有数字,还是 a