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

背景

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

正文

斐波那契数列

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 为周期,循环出现。

相关推荐
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(十二)
大数据·开发语言·python·数据清洗
qq_316411032 小时前
专业的腹腔镜医疗器械物联网APP开发服务商
python
阿童木写作2 小时前
跨境电商翻译利器,批量图片视频翻译+智能抠图工具
python·音视频
绘梨衣5473 小时前
异步任务队列-学习2
爬虫·python·学习·任务队列
用户8356290780514 小时前
使用 Python 在 Excel 中插入 OLE 对象
后端·python
one3124 小时前
高精度MEMS电容式倾角传感器:原理、结构与Python三维可视化
开发语言·python
深蓝海拓5 小时前
基于QtPy (PySide6) 的PLC-HMI工程实战记录(七)创建适合HMI项目的数字输入/显示类部件
python
MartinYeung55 小时前
[论文学习]MPIB:医疗提示注入基准——针对LLM临床安全性的系统性评估
人工智能·python·学习