2的正幂 — 2, 4, 8, 16, 32, 64, 128, 256, … — 末尾数字遵循一个显而易见的规律: 2, 4, 8, 6, 2, 4, 8, 6, … . 这4个数字永远循环下去。最末尾数以外还有循环 — 实际上是最末m位 — 从2m 开始的2的幂。例如,从04开始最末两位数就存在一个长度20的循环,同时从008开始最末3位数就存在一个长度100的循环。
本文,我将告诉你为什么会有这些循环,它们有多长,如何表达为数学形式,如何看见它们。
最末尾数的循环
末位数-所在位置-是十进制整数d在d/10后的余数。等价地,末位数是d mod 10的结果,根据约定取最小非负值-普通余数-作为返回结果。模运算,持续叠加到2的幂运算,得到末位数的循环:
…
我们从2开始,取10的模,再乘以2,再对10取模,等等。可知此模式将循环,直到先前的一个结果-2再次出现在第五步-循环确认。这展现了数字 2n, n ≥ 1, 末位数在四个数字 2, 4, 8, 和 6间循环。
这循环告诉我们,末尾数相同的2的幂是有关联的,它们的指数相差4:
Ends in 2: 21, 25, 29, 213, 217, … .
Ends in 4: 22, 26, 210, 214, 218, … .
Ends in 8: 23, 27, 211, 215, 219, … .
Ends in 6: 24, 28, 212, 216, 220, … .
你可以使用指数运算规则来更简洁地描述,展示所有2的幂中末位数有规律的前4个:
Ends in 2: 21·24k, or 21+4k, k ≥ 0.
Ends in 4: 22·24k, or 22+4k, k ≥ 0.
Ends in 8: 23·24k, or 23+4k, k ≥ 0.
Ends in 6: 24·24k, or 24+4k, k ≥ 0.
也可以按照指数对4取模的结果来对2的幂建立联系:
Ends in 2:
Ends in 4:
Ends in 8:
Ends in 6:
这就很容易知道任意2的正幂的末位数是几。例如, 2319 的末位数是 8, 因为 .
Cycle in the Last Digit of 2n, n≥1
Power of Two (k ≥ 0)Exponent (mod 4)Last Digit
21+4k
1
2
22+4k
2
4
23+4k
3
8
24+4k
0
6
小结,表格告诉我们,如果 , .
末两位数的循环
类似的分析,只是对100取模,展示2的幂的末两位数,从 22 开始,循环周期是20:
Cycle in the Last Two Digits of 2n, n≥2
Power of Two (k ≥ 0)Exponent (mod 20)Last 2 Digits
22+20k
2
04
23+20k
3
08
24+20k
4
16
25+20k
5
32
26+20k
6
64
27+20k
7
28
28+20k
8
56
29+20k
9
12
210+20k
10
24
211+20k
11
48
212+20k
12
96
213+20k
13
92
214+20k
14
84
215+20k
15
68
216+20k
16
36
217+20k
17
72
218+20k
18
44
219+20k
19
88
220+20k
0
76
221+20k
1
52
末三位的循环
为了找出末三位数的循环,重复上面的过程,对1000取模。下面展示了2的幂的末三位,从 23开始,循环周期是100:
Cycle in the Last Three Digits of 2n, n≥3
Power of Two (k ≥ 0)Exponent (mod 100)Last 3 Digits
23+100k
3
008
24+100k
4
016
25+100k
5
032
26+100k
6
064
27+100k
7
128
28+100k
8
256
29+100k
9
512
210+100k
10
024
211+100k
11
048
212+100k
12
096
213+100k
13
192
214+100k
14
384
215+100k
15
768
216+100k
16
536
217+100k
17
072
218+100k
18
144
219+100k
19
288
220+100k
20
576
221+100k
21
152
222+100k
22
304
223+100k
23
608
224+100k
24
216
225+100k
25
432
226+100k
26
864
227+100k
27
728
228+100k
28
456
229+100k
29
912
230+100k
30
824
231+100k
31
648
232+100k
32
296
233+100k
33
592
234+100k
34
184
235+100k
35
368
236+100k
36
736
237+100k
37
472
238+100k
38
944
239+100k
39
888
240+100k
40
776
241+100k
41
552
242+100k
42
104
243+100k
43
208
244+100k
44
416
245+100k
45
832
246+100k
46
664
247+100k
47
328
248+100k
48
656
249+100k
49
312
250+100k
50
624
251+100k
51
248
252+100k
52
496
253+100k
53
992
254+100k
54
984
255+100k
55
968
256+100k
56
936
257+100k
57
872
258+100k
58
744
259+100k
59
488
260+100k
60
976
261+100k
61
952
262+100k
62
904
263+100k
63
808
264+100k
64
616
265+100k
65
232
266+100k
66
464
267+100k
67
928
268+100k
68
856
269+100k
69
712
270+100k
70
424
271+100k
71
848
272+100k
72
696
273+100k
73
392
274+100k
74
784
275+100k
75
568
276+100k
76
136
277+100k
77
272
278+100k
78
544
279+100k
79
088
280+100k
80
176
281+100k
81
352
282+100k
82
704
283+100k
83
408
284+100k
84
816
285+100k
85
632
286+100k
86
264
287+100k
87
528
288+100k
88
056
289+100k
89
112
290+100k
90
224
291+100k
91
448
292+100k
92
896
293+100k
93
792
294+100k
94
584
295+100k
95
168
296+100k
96
336
297+100k
97
672
298+100k
98
344
299+100k
99
688
2100+100k
0
376
2101+100k
1
752
2102+100k
2
504
末m位数循环
2的正幂的末m位数循环要对10m取模,循环周期是 4·5m-1, 始于 2m. (具体证明涉及到数论,超出了本文的范围)
Cycle Length for Number of Ending Digits (1 to 10)
mPeriod (4·5m-1)Starts with
1
4
21
2
20
22
3
100
23
4
500
24
5
2500
25
6
12500
26
7
62500
27
8
312500
28
9
1562500
29
10
7812500
210
周期增长飞快-指数级增长-所以无法列出m大于3的列表。
循环的嵌套(Nesting of Cycles)
对于末m位,m-1位,m-2位, …, 末1位的循环,可以看做是嵌套的,尽管它们的起始点是交错的。你只需将较小的起始数补零,就能让它们对齐。
例如,在长度是100的末三位循环中,包含了5次长度是20的末两位循环;每一个长度是20的末两位循环包含5次长度为4的最末位循环。你从8(需移动两位)开始观察就能发现最末位的规律,末两位的规律始于08(需移动一位),末三位的规律始于008(不需移位)。
下表标出了嵌套的循环(全部100行都被标记,因为只有100个2的幂-末三位的一个循环-被列出)。
Nested 1-3 Digit Ending Patterns From 23 to 2102
使用PARI/GP探索末位循环
我使用PARI/GP 来进行上面的计算和验证。下面是三个例子:
列出前20个末位是2的2的幂:
? for (i=0,19,print("2^",1+4*i,": ",2^(1+4*i)))
2^1: 2
2^5: 32
2^9: 512
2^13: 8192
2^17: 131072
2^21: 2097152
2^25: 33554432
2^29: 536870912
2^33: 8589934592
2^37: 137438953472
2^41: 2199023255552
2^45: 35184372088832
2^49: 562949953421312
2^53: 9007199254740992
2^57: 144115188075855872
2^61: 2305843009213693952
2^65: 36893488147419103232
2^69: 590295810358705651712
2^73: 9444732965739290427392
2^77: 151115727451828646838272
列出末两位的循环( ‘%’ 号返回余数,等价于取模运算):
? for (i=2,21,print("2^",i," mod(100): ",2^i % 100))
2^2 mod(100): 4
2^3 mod(100): 8
2^4 mod(100): 16
2^5 mod(100): 32
2^6 mod(100): 64
2^7 mod(100): 28
2^8 mod(100): 56
2^9 mod(100): 12
2^10 mod(100): 24
2^11 mod(100): 48
2^12 mod(100): 96
2^13 mod(100): 92
2^14 mod(100): 84
2^15 mod(100): 68
2^16 mod(100): 36
2^17 mod(100): 72
2^18 mod(100): 44
2^19 mod(100): 88
2^20 mod(100): 76
2^21 mod(100): 52
(单位的数字这里没有前补零)
打印末位1到10位数的周期长度:
? for (i=1,10,print(i,": ",4*5^(i-1)))
1: 4
2: 20
3: 100
4: 500
5: 2500
6: 12500
7: 62500
8: 312500
9: 1562500
10: 7812500