斐波那契数列的个位数出现的周期是多少?

背景

《斐波那契数列:定义自然法则的数学》 一书提到,斐波那契数列的个位数字会按照固定的周期重复出现。我们可以自己动手来探索这个周期的长度是多少。

正文

斐波那契数列

F1=1,F2=1 F_1=1,F_2=1 F1=1,F2=1,对满足 n≥3n\ge 3 n≥3 的 nn n 而言, Fn= Fn−1 + Fn−2 F_n=F_{n-1}+F_{n-2} Fn=Fn−1+Fn−2。满足这样的规则的数列,我们称其为斐波那契数列。

基本的分析

为了方便讨论,我们记 an=(Fn  mod  10, Fn+1   mod  10) a_n=(F_n\bmod 10,F_{n+1}\bmod 10) an=(Fnmod10,Fn+1mod10)。 对比较小的 nn n, Fn F_n Fn 和 an a_n an 的值列举如下

nn n Fn F_n Fn an a_n an
11 1 11 1 (1,1)(1,1) (1,1)
22 2 11 1 (1,2)(1,2) (1,2)
33 3 22 2 (2,3)(2,3) (2,3)
44 4 33 3 (3,5)(3,5) (3,5)
55 5 55 5 (5,8)(5,8) (5,8)
66 6 88 8 (8,3)(8,3) (8,3)
77 7 1313 13 (3,1)(3,1) (3,1)
88 8 2121 21 (1,4)(1,4) (1,4)
99 9 3434 34 (4,5)(4,5) (4,5)
1010 10 5555 55 (5,9)(5,9) (5,9)

对任意自然数 kk k 来说, 0≤(k  mod  10)≤90\le (k\bmod 10) \le 9 0≤(kmod10)≤9 总是成立,所以 an a_n an 的可能取值只有 10×10=10010\times10=100 10×10=100 个(有的值可能取不到)。根据鸽笼原理, a1,a2,⋯ ,a101 a_1,a_2,\cdots,a_{101} a1,a2,⋯,a101 这 101101 101 个值必然有重复的(因为 an a_n an 的可能取值只有 100100 100 个)。假设第一个重复出现的值为 adup a_{dup} adup 且 adup = adup−t a_{dup}=a_{dup-t} adup=adup−t。那么从 adup a_{dup} adup 开始,会有什么规律?

分析下标更大的项

注意到
an=(Fn  mod  10, Fn+1   mod  10) a_{n}=(F_{n}\bmod 10, F_{n+1} \bmod 10) an=(Fnmod10,Fn+1mod10)
an+1 =( Fn+1   mod  10, Fn+2   mod  10) a_{n+1}=(F_{n+1}\bmod 10, F_{n+2} \bmod 10) an+1=(Fn+1mod10,Fn+2mod10)
Fn+2 = Fn+1 +Fn F_{n+2}=F_{n+1}+F_n Fn+2=Fn+1+Fn

所以
an+1 =( Fn+1   mod  10,( Fn+1 +Fn)  mod  10) a_{n+1}=(F_{n+1}\bmod 10, (F_{n+1} + F_n) \bmod 10) an+1=(Fn+1mod10,(Fn+1+Fn)mod10)
=(an1,(an0+an1)  mod  10) =(a_n1, (a_n0+a_n1) \bmod 10) =(an1,(an0+an1)mod10)

也就是说,从 an a_{n} an 可以直接得出 an+1 a_{n+1} an+1。 既然 adup = adup−t a_{dup}=a_{dup-t} adup=adup−t,那么必然有 ⬇️

  • adup+1 = adup−t+1 a_{dup+1}=a_{dup-t+1} adup+1=adup−t+1
  • adup+2 = adup−t+2 a_{dup+2}=a_{dup-t+2} adup+2=adup−t+2
  • adup+3 = adup−t+3 a_{dup+3}=a_{dup-t+3} adup+3=adup−t+3
  • ⋯\cdots

所以一旦发现了第一个重复值 adup a_{dup} adup,之后所有的值都会周期性出现( tt t 是它的一个周期)。那么随之而来的问题就是 dupdup dup 具体是多少。

分析下标更小的项

刚才提到从 an a_{n} an 可以直接得出 an+1 a_{n+1} an+1,那么如果知道 an+1 a_{n+1} an+1,能否反推出 an a_n an 呢?我们试一试 ⬇️
an=(Fn  mod  10, Fn+1   mod  10) a_{n}=(F_{n}\bmod 10, F_{n+1} \bmod 10) an=(Fnmod10,Fn+1mod10)
=(( Fn+2 − Fn+1 )  mod  10, Fn+1   mod  10) =((F_{n+2}-F_{n+1})\bmod 10,F_{n+1} \bmod 10) =((Fn+2−Fn+1)mod10,Fn+1mod10)
=(( an+1 1− an+1 0)  mod  10, an+1 0) =((a_{n+1}1-a_{n+1}0)\bmod 10,a_{n+1}0) =((an+11−an+10)mod10,an+10)

看来从 an+1 a_{n+1} an+1 也可以直接得出 an a_{n} an。

有趣的部分来了。考虑到 adup = adup+t a_{dup}=a_{dup+t} adup=adup+t,根据刚才提到的 "从 an+1 a_{n+1} an+1 也可以直接得出 an a_{n} an" 可知以下 dupdup dup 个等式都成立 ⬇️

  • adup = adup+t a_{dup}=a_{dup+t} adup=adup+t
  • adup−1 = adup+t−1 a_{dup-1}=a_{dup+t-1} adup−1=adup+t−1
  • adup−2 = adup+t−2 a_{dup-2}=a_{dup+t-2} adup−2=adup+t−2
  • ⋯\cdots
  • a1= a1+t a_{1}=a_{1+t} a1=a1+t

所以 a1+t a_{1+t} a1+t 会是第一个重复的值,它的值和 a1 a_1 a1 相等。如此说来,我们只要找到第一个和 a1 a_1 a1 相等的 an a_n an( n≥2n\ge2 n≥2),就可以得出周期 t=n−1t=n-1 t=n−1 了。

代码实战

我们可以将上述思路用 Python3Python3 Python3 来实现 ⬇️ (请将代码保存为 find_period.py

python 复制代码
appeared_fib_pairs = set()
fib_pair = (1, 1)
n = 1
while True:
    if fib_pair in appeared_fib_pairs:
        break
    appeared_fib_pairs.add(fib_pair)
    print(f'{n}: {fib_pair}')
    next_fib_pair = (fib_pair[1], (fib_pair[0] + fib_pair[1]) % 10)
    fib_pair = next_fib_pair
    n += 1

用以下命令可以运行 find_period.py

bash 复制代码
python3 find_period.py

完整的运行结果如下

text 复制代码
1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 8)
6: (8, 3)
7: (3, 1)
8: (1, 4)
9: (4, 5)
10: (5, 9)
11: (9, 4)
12: (4, 3)
13: (3, 7)
14: (7, 0)
15: (0, 7)
16: (7, 7)
17: (7, 4)
18: (4, 1)
19: (1, 5)
20: (5, 6)
21: (6, 1)
22: (1, 7)
23: (7, 8)
24: (8, 5)
25: (5, 3)
26: (3, 8)
27: (8, 1)
28: (1, 9)
29: (9, 0)
30: (0, 9)
31: (9, 9)
32: (9, 8)
33: (8, 7)
34: (7, 5)
35: (5, 2)
36: (2, 7)
37: (7, 9)
38: (9, 6)
39: (6, 5)
40: (5, 1)
41: (1, 6)
42: (6, 7)
43: (7, 3)
44: (3, 0)
45: (0, 3)
46: (3, 3)
47: (3, 6)
48: (6, 9)
49: (9, 5)
50: (5, 4)
51: (4, 9)
52: (9, 3)
53: (3, 2)
54: (2, 5)
55: (5, 7)
56: (7, 2)
57: (2, 9)
58: (9, 1)
59: (1, 0)
60: (0, 1)

可见 an a_n an 的周期是 6060 60,而 an0 a_n0 an0 就是斐波那契数列的个位数字,也就是说斐波那契数列的个位数字以 6060 60 为周期,循环出现。

相关推荐
Ticnix5 分钟前
"多数新闻站都禁止内嵌"——这句话我信了很久,直到测了 16 个站点
python·agent
贝猫说python27 分钟前
阿里云部署qwen 、第5步:阿里云服务器上大模型运行demo.py,固定提示词模板 拼接用户输入,输出符合要求格式结果
python
小白学大数据33 分钟前
Python 项目实战:用 Flask 构建生产级 MySQL 增删改查 REST API
开发语言·人工智能·python·mysql·flask
诺伦42 分钟前
AI营销从单点智能到系统协同:多Agent编排如何重塑增长运营
python·多agent系统·ai营销·agent编排·增长运营
96245644 分钟前
pywebview 指定 Edge Chromium,为什么打包后仍回退到 MSHTML?
python
ellenwan20261 小时前
量化学习不能只补技术
人工智能·python
SamChan901 小时前
多栏PDF阅读顺序重建:用Python按坐标聚类还原双栏论文的翻译顺序
python·ai·pdf
赵民勇1 小时前
Python collections.ChainMap 详解
python
三十岁老牛再出发1 小时前
9月16日总结
python·深度学习·机器学习
计算机源码社1 小时前
基于大数据的全球温室气体排放燃料结构与碳强度评估研究-基于Spark的全球温室气体排放多维度检测与评估分析
大数据·hadoop·python·数据挖掘·数据分析·spark·毕业设计