斐波那契数列中连续10项的和总是能被11整除吗?

15 阅读2分钟

背景

《斐波那契数列:定义自然法则的数学》 一书提到,斐波那契数列中连续 1010 项的和总是能被 1111 整除。这样的小结论,固然可以记下来,但是如果我们有比较通用的办法,来探索斐波那契数列中连续的 mm 项的和满足怎样的规律,则更为有趣。

结论

kk斐波那契数列中连续 ? 项的和一定能被 kk 整除
2233
3388
4466
552020
662424
771616
881212
992424
10106060
11111010

正文

斐波那契数列

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

简单的分析

对比较小的 nn 来说,FnF_n 的值列举如下 ⬇️

nnFnF_n
1111
2211
3322
4433
5555
6688
771313
882121
993434
10105555
11118989
1212144144
1313233233
1414377377
1515610610
1616987987
171715971597
181825842584
191941814181
202067656765

生成上方表格的 Python3Python3 代码如下 ⬇️


print(r'| $n$ | $F_n$ |')
print('| --- | --- |')

curr, next = 1, 1
for i in range(1, 21):
    print(f'| ${i}$ | ${curr}$ |')
    curr, next = next, (curr + next)

连续 2 项的和

既然想探索连续项的和有什么规律,那么就先看连续 22 项的和吧 ⬇️

nnFnF_nFn+Fn+1F_n+F_{n+1}
111122
221133
332255
443388
55551313
66882121
7713133434
8821215555
9934348989
10105555144144

考虑到 Fn+2=Fn+Fn+1F_{n+2}=F_n+F_{n+1},那么斐波那契数列中连续 22 项的和仍旧会是数列中的某一项。

连续 3 项的和

我们再看看连续 33 项的和。Fn+Fn+1+Fn+2=Fn+2+Fn+2=2Fn+2F_n+F_{n+1}+F_{n+2}=F_{n+2}+F_{n+2}=2 F_{n+2}。所以斐波那契数列中,连续 33 项的和,一定是偶数。

一般化的分析

如果逐个观察不同 mm 时,mm 个连续项的和的规律,可能有点耗时间。我们换个思路,既然是想探索连续 mm 项的和的规律,假设连续 mm 项的和可以被 kk 整除,那么我们只需要分析 FnmodkF_n\bmod k 的规律即可。

k=2k=2

我们还是从 22 开始(但是现在分析的是 k=2k=2 的情况)。不难写出以下代码


print(r'| $n$ | $F_n$ | $F_n\bmod 2$')
print('| --- | --- | --- |')

curr, next = 1, 1
for i in range(1, 21):
    print(f'| ${i}$ | ${curr}$ | ${curr%2}$ |')
    curr, next = next, (curr + next)

它生成的表格如下

nnFnF_nFnmod2F_n\bmod 2
111111
221111
332200
443311
555511
668800
77131311
88212111
99343400
1010555511
1111898911
121214414400
131323323311
141437737711
151561061000
161698798711
17171597159711
18182584258400
19194181418111
20206765676511

Fnmod2F_n\bmod 2 的规律很明显,它以 1,1,01,1,0 为周期,我们可以用数学归纳法证明这个规律是成立的。由此可知,斐波那契数列中连续 33 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+2Fn1+1+00(mod2)\sum_{n=m}^{n=m+2} F_n\equiv1+1+0\equiv0\pmod 2

所以斐波那契数列中连续 33 项的和可以被 22 整除,这和我们刚才的分析是一致的。

k=3k=3

我们再看 k=3k=3 的情况,将代码稍做调整即可 ⬇️


print(r'| $n$ | $F_n$ | $F_n\bmod 3$')
print('| --- | --- | --- |')

curr, next = 1, 1
for i in range(1, 21):
    print(f'| ${i}$ | ${curr}$ | ${curr%3}$ |')
    curr, next = next, (curr + next)

它生成的表格如下

nnFnF_nFnmod3F_n\bmod 3
111111
221111
332222
443300
555522
668822
77131311
88212100
99343411
1010555511
1111898922
121214414400
131323323322
141437737722
151561061011
161698798700
17171597159711
18182584258411
19194181418122
20206765676500

这次的周期稍长一些:1,1,2,0,2,2,1,01,1,2,0,2,2,1,0(虽然是观察出来的规律,但是可以用数学归纳法证明其正确性)。

由此可知,斐波那契数列中连续 88 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+7Fn1+1+2+0+2+2+1+00(mod3)\sum_{n=m}^{n=m+7} F_n\equiv1+1+2+0+2+2+1+0\equiv 0\pmod 3

所以斐波那契数列的连续 88 项的和,一定能被 33 整除。

k=4,5,6k=4,5,6

我们再看 k=4,5,6k=4,5,6 的情况,将代码稍做调整即可 ⬇️


print(r'| $n$ | $F_n$ | $F_n\bmod 4$ | $F_n\bmod 5$ |$F_n\bmod 6$ |')
print('| --- | --- | --- | --- | --- | ')

curr, next = 1, 1
for i in range(1, 21):
    print(f'| ${i}$ | ${curr}$ | ${curr%4}$ | ${curr%5}$ | ${curr%6}$ |')
    curr, next = next, (curr + next)

nnFnF_nFnmod4F_n\bmod 4Fnmod5F_n\bmod 5Fnmod6F_n\bmod 6
1111111111
2211111111
3322222222
4433333333
5555110055
6688003322
771313113311
882121111133
993434224444
10105555330011
11118989114455
1212144144004400
1313233233113355
1414377377112255
1515610610220044
1616987987332233
171715971597112211
181825842584004444
191941814181111155
202067656765110033

Fnmod4F_n\bmod 41,1,2,3,1,01,1,2,3,1,0 为周期。

由此可知,斐波那契数列中连续 66 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+5Fn1+1+2+3+1+00(mod4)\sum_{n=m}^{n=m+5} F_n\equiv1+1+2+3+1+0\equiv 0\pmod 4

所以斐波那契数列的连续 66 项的和,一定能被 44 整除。

继续分析 k=5,6k=5,6 的情况时,会发现周期比较长,一眼似乎看不出来周期是什么。此时,我们再换换思路。如果 FnmodkF_n\bmod k 这个数列存在某个周期 TT,那么

  • F1modk=F1+TmodkF_1\bmod k= F_{1+T}\bmod k
  • F2modk=F2+TmodkF_2\bmod k= F_{2+T}\bmod k
  • F3modk=F3+TmodkF_3\bmod k= F_{3+T}\bmod k
  • \cdots

那么 (Fnmodk,Fn+1modk)(F_n\bmod k,F_{n+1}\bmod k) 这样的数对(这里的小括号表示一对数字)也会以周期 TT 重复出现,即

  • (F1modk,F2modk)=(F1+Tmodk,F2+Tmodk)(F_1\bmod k, F_2\bmod k)= (F_{1+T}\bmod k, F_{2+T}\bmod k)
  • (F2modk,F3modk)=(F2+Tmodk,F3+Tmodk)(F_2\bmod k, F_3\bmod k)= (F_{2+T}\bmod k, F_{3+T}\bmod k)
  • (F3modk,F4modk)=(F3+Tmodk,F4+Tmodk)(F_3\bmod k, F_4\bmod k)= (F_{3+T}\bmod k, F_{4+T}\bmod k)
  • \cdots

为了方便讨论,我们记 an=(Fnmodk,Fn+1modk)a_n=(F_n\bmod k,F_{n+1}\bmod k)

0(Fnmodk)<k0\le (F_n\bmod k) \lt k 总是成立,所以 ana_n 的可能取值只有 k×k=k2k\times k=k^2 个(有的值可能取不到)。根据鸽笼原理,a1,a2,,ak2+1a_1,a_2,\cdots,a_{k^2+1}k2+1k^2+1 个值必然有重复的(因为 ana_n 的可能取值只有 k2k^2 个)。假设第一个重复出现的值为 adupa_{dup}adup=adupta_{dup}=a_{dup-t}。注意到

an=(Fnmodk,Fn+1modk)a_{n}=(F_{n}\bmod k, F_{n+1} \bmod k)
an+1=(Fn+1modk,Fn+2modk)a_{n+1}=(F_{n+1}\bmod k, F_{n+2} \bmod k)
Fn+2=Fn+1+FnF_{n+2}=F_{n+1}+F_n

所以

an+1=(Fn+1modk,(Fn+1+Fn)modk)a_{n+1}=(F_{n+1}\bmod k, (F_{n+1} + F_n) \bmod k)
=(an[1],(an[0]+an[1])modk)=(a_n[1], (a_n[0]+a_n[1]) \bmod k)

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

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

那么对任意 ndupn\ge dupan=anta_n=a_{n-t} 都成立。

刚才提到从 ana_{n} 可以直接得出 an+1a_{n+1},那么如果知道 an+1a_{n+1},能否反推出 ana_n 呢?我们试一试 ⬇️

an=(Fnmodk,Fn+1modk)a_{n}=(F_{n}\bmod k, F_{n+1} \bmod k)
=((Fn+2Fn+1)modk,Fn+1modk)=((F_{n+2}-F_{n+1})\bmod k,F_{n+1} \bmod k)
=((an+1[1]an+1[0])modk,an+1[0])=((a_{n+1}[1]-a_{n+1}[0])\bmod k,a_{n+1}[0])

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

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

  • adup=adupta_{dup}=a_{dup-t}
  • adup1=adupt1a_{dup-1}=a_{dup-t-1}
  • adup2=adupt2a_{dup-2}=a_{dup-t-2}
  • \cdots
  • a1+t=a1a_{1+t}=a_{1}

所以 a1+ta_{1+t} 会是第一个重复的值,它的值和 a1a_1 相等。如此说来,我们只要找到第一个和 a1a_1 相等的 ana_nn2n\ge2),就可以得出周期 t=n1t=n-1 了。由于 Fnmodk=an[0]F_n\bmod k=a_n[0],那么 tt 自然也是 FnmodkF_n\bmod k 的(一个)周期。至于 kn=1n=t(Fnmodk)k\mid\sum_{n=1}^{n=t}{(F_n\bmod k)} 是否成立,我们可以这样思考 ⬇️

  • F1=F3F2F_1=F_3-F_2
  • F2=F4F3F_2=F_4-F_3
  • F3=F5F4F_3=F_5-F_4
  • \cdots
  • Ft=Ft+2Ft+1F_t=F_{t+2}-F_{t+1}

对这个 tt 个等式求和,得到 ⬇️

n=1n=tFn=Ft+2F2=Ft+21\sum_{n=1}^{n=t}{F_n}=F_{t+2}-F_2=F_{t+2}-1

根据模运算的性质,可以得出

n=1n=t(Fnmodk)Ft+21(modk)\sum_{n=1}^{n=t}{(F_n\bmod k)} \equiv F_{t+2}-1 \pmod {k}

注意到 FnmodkF_n\bmod {k}tt 为周期,那么 Ft+2F2(modk)F_{t+2}\equiv F_2 \pmod {k}。所以

n=1n=t(Fnmodk)Ft+21F210(modk)\sum_{n=1}^{n=t}{(F_n\bmod k)} \equiv F_{t+2}-1 \equiv F_2-1\equiv 0 \pmod {k}

kn=1n=t(Fnmodk)k\mid \sum_{n=1}^{n=t}{(F_n\bmod k)} 成立。

我用 Python3Python3 实现了这样的逻辑 ⬇️ (豆包 提供了一些帮助)

import argparse

def main():
    parser = argparse.ArgumentParser(description="斐波那契模k周期计算")
    parser.add_argument("-k", type=int, required=True, help="取模的k值,正整数")
    args = parser.parse_args()
    k = args.k

    if k <= 0:
        raise ValueError("k必须为正整数")

    print('```text')
    appeared_fib_pairs = set()
    fib_pair = (1, 1)
    n = 1
    seen_num = []
    while True:
        if fib_pair in appeared_fib_pairs:
            break
        appeared_fib_pairs.add(fib_pair)
        seen_num.append(fib_pair[0])
        print(f'{n}: {fib_pair}')
        next_fib_pair = (fib_pair[1], (fib_pair[0] + fib_pair[1]) % k)
        fib_pair = next_fib_pair
        n += 1
    print('```')

    conclusion = f'''
由此可知,斐波那契数列中连续 ${len(appeared_fib_pairs)}$ 项的和满足 ⬇️ ($m$ 是任意正整数)
$$
\\sum_{{n=m}}^{{n=m+{len(appeared_fib_pairs)-1}}} F_n \\equiv {'+'.join(map(str, seen_num))}\\equiv 0\\pmod {{{k}}}
$$ 
所以斐波那契数列的连续 ${len(appeared_fib_pairs)}$ 项的和,一定能被 ${k}$ 整除。
'''
    print(conclusion)


if __name__ == "__main__":
    main()

请将以上代码保存为 find_period.py。运行以下命令可以处理 k=5k=5 的情况

python3 find_period.py -k 5

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 0)
5: (0, 3)
6: (3, 3)
7: (3, 1)
8: (1, 4)
9: (4, 0)
10: (0, 4)
11: (4, 4)
12: (4, 3)
13: (3, 2)
14: (2, 0)
15: (0, 2)
16: (2, 2)
17: (2, 4)
18: (4, 1)
19: (1, 0)
20: (0, 1)

由此可知,斐波那契数列中连续 2020 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+19Fn1+1+2+3+0+3+3+1+4+0+4+4+3+2+0+2+2+4+1+00(mod5)\sum_{n=m}^{n=m+19} F_n \equiv 1+1+2+3+0+3+3+1+4+0+4+4+3+2+0+2+2+4+1+0\equiv 0\pmod {5}

所以斐波那契数列的连续 2020 项的和,一定能被 55 整除。

运行以下命令可以处理 k=6k=6 的情况

python3 find_period.py -k 6

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 2)
6: (2, 1)
7: (1, 3)
8: (3, 4)
9: (4, 1)
10: (1, 5)
11: (5, 0)
12: (0, 5)
13: (5, 5)
14: (5, 4)
15: (4, 3)
16: (3, 1)
17: (1, 4)
18: (4, 5)
19: (5, 3)
20: (3, 2)
21: (2, 5)
22: (5, 1)
23: (1, 0)
24: (0, 1)

由此可知,斐波那契数列中连续 2424 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+23Fn1+1+2+3+5+2+1+3+4+1+5+0+5+5+4+3+1+4+5+3+2+5+1+00(mod6)\sum_{n=m}^{n=m+23} F_n \equiv 1+1+2+3+5+2+1+3+4+1+5+0+5+5+4+3+1+4+5+3+2+5+1+0\equiv 0\pmod {6}

所以斐波那契数列的连续 2424 项的和,一定能被 66 整除。

k=7,8,9,10k=7,8,9,10

我们再看 k=7,8,9,10k=7,8,9,10 的情况。

运行以下命令可以处理 k=7k=7 的情况

python3 find_period.py -k 7

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 1)
6: (1, 6)
7: (6, 0)
8: (0, 6)
9: (6, 6)
10: (6, 5)
11: (5, 4)
12: (4, 2)
13: (2, 6)
14: (6, 1)
15: (1, 0)
16: (0, 1)

由此可知,斐波那契数列中连续 1616 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+15Fn1+1+2+3+5+1+6+0+6+6+5+4+2+6+1+00(mod7)\sum_{n=m}^{n=m+15} F_n \equiv 1+1+2+3+5+1+6+0+6+6+5+4+2+6+1+0\equiv 0\pmod {7}

所以斐波那契数列的连续 1616 项的和,一定能被 77 整除。

运行以下命令可以处理 k=8k=8 的情况

python3 find_period.py -k 8

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 0)
6: (0, 5)
7: (5, 5)
8: (5, 2)
9: (2, 7)
10: (7, 1)
11: (1, 0)
12: (0, 1)

由此可知,斐波那契数列中连续 1212 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+11Fn1+1+2+3+5+0+5+5+2+7+1+00(mod8)\sum_{n=m}^{n=m+11} F_n \equiv 1+1+2+3+5+0+5+5+2+7+1+0\equiv 0\pmod {8}

所以斐波那契数列的连续 1212 项的和,一定能被 88 整除。

运行以下命令可以处理 k=9k=9 的情况

python3 find_period.py -k 9

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 8)
6: (8, 4)
7: (4, 3)
8: (3, 7)
9: (7, 1)
10: (1, 8)
11: (8, 0)
12: (0, 8)
13: (8, 8)
14: (8, 7)
15: (7, 6)
16: (6, 4)
17: (4, 1)
18: (1, 5)
19: (5, 6)
20: (6, 2)
21: (2, 8)
22: (8, 1)
23: (1, 0)
24: (0, 1)

由此可知,斐波那契数列中连续 2424 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+23Fn1+1+2+3+5+8+4+3+7+1+8+0+8+8+7+6+4+1+5+6+2+8+1+00(mod9)\sum_{n=m}^{n=m+23} F_n \equiv 1+1+2+3+5+8+4+3+7+1+8+0+8+8+7+6+4+1+5+6+2+8+1+0\equiv 0\pmod {9}

所以斐波那契数列的连续 2424 项的和,一定能被 99 整除

k=10k=10 的情况,我在 斐波那契数列的个位数出现的周期是多少? 一文里专门进行了讨论。

运行以下命令可以处理 k=10k=10 的情况

python3 find_period.py -k 10

完整的运行结果如下

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)

由此可知,斐波那契数列中连续 6060 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+59Fn1+1+2+3+5+8+3+1+4+5+9+4+3+7+0+7+7+4+1+5+6+1+7+8+5+3+8+1+9+0+9+9+8+7+5+2+7+9+6+5+1+6+7+3+0+3+3+6+9+5+4+9+3+2+5+7+2+9+1+00(mod10)\sum_{n=m}^{n=m+59} F_n \equiv 1+1+2+3+5+8+3+1+4+5+9+4+3+7+0+7+7+4+1+5+6+1+7+8+5+3+8+1+9+0+9+9+8+7+5+2+7+9+6+5+1+6+7+3+0+3+3+6+9+5+4+9+3+2+5+7+2+9+1+0\equiv 0\pmod {10}

所以斐波那契数列的连续 6060 项的和,一定能被 1010 整除。

k=11k=11 的情况

运行以下命令可以处理 k=11k=11 的情况

python3 find_period.py -k 11

完整的运行结果如下

1: (1, 1)
2: (1, 2)
3: (2, 3)
4: (3, 5)
5: (5, 8)
6: (8, 2)
7: (2, 10)
8: (10, 1)
9: (1, 0)
10: (0, 1)

由此可知,斐波那契数列中连续 1010 项的和满足 ⬇️ (mm 是任意正整数)

n=mn=m+9Fn1+1+2+3+5+8+2+10+1+00(mod11)\sum_{n=m}^{n=m+9} F_n \equiv 1+1+2+3+5+8+2+10+1+0\equiv 0\pmod {11}

所以斐波那契数列的连续 1010 项的和,一定能被 1111 整除。