背景
45=210=1024
看起来对自然数 n 而言,n5≡n(mod10),那么这个猜测是否正确呢?
正文
题目:对任意自然数 n,n5≡n(mod10) 是否总是成立,请证明其成立或者找到反例
分析
暴力做法
考虑到 n5 的个位数只受到 n 的个位数的影响,所以我们只需要检查 n=0,1,2,3,4,5,6,7,8,9 的情况。我写了个简单的 Python 程序 (豆包 帮我完善了格式),可以帮助我们验证 ⬇️
print(r"|$n$|$n^5$|$n^5\equiv n \pmod{10}$")
print("|--|--|--|")
for n in range(10):
if n ** 5 % 10 == n % 10:
print(f"|${n}$|${n ** 5}$|$\\text{{true}}$|")
else:
print(f"|${n}$|${n ** 5}$|$\\text{{false}}$|")
请将以上代码保存为 brute_force.py。用以下命令可以运行 brute_force.py
python3 brute_force.py
运行结果是一个符合 markdown 语法的表格 ⬇️
| n | n5 | n5≡n(mod10) |
|---|
| 0 | 0 | true |
| 1 | 1 | true |
| 2 | 32 | true |
| 3 | 243 | true |
| 4 | 1024 | true |
| 5 | 3125 | true |
| 6 | 7776 | true |
| 7 | 16807 | true |
| 8 | 32768 | true |
| 9 | 59049 | true |
暴力做法的严谨性当然没有问题,不过我感觉还是缺少点美感。我们再试试其他思路。
数学归纳法
在背景那一小节,我们验证了 n=0,1,2,3,4 时,n5≡n(mod10) 均成立。假如 n5≡n(mod10) 总是成立的话,也许可以用数学归纳法证明。
n=0 时,显然成立。
假设 n=k 时,k5≡k(mod10) 成立,那么我们的目标是证明(或者找到反例来证伪) (k+1)5≡k+1(mod10)
用二项式定理,展开 (k+1)5,可得
=C50k015+C51k114+C52k213+C53k312+C54k411+C55k510
=C50k0+C51k1+C52k2+C53k3+C54k4+C55k5
=k0+5k1+10k2+10k3+5k4+k5
=1+5k+10k2+10k3+5k4+k5
我们关心的是 k5+1 和 k+1 的差值是否为 10 的倍数,那么我们来计算两者的差值 ⬇️
(k+1)5−(k+1)
=1+5k+10k2+10k3+5k4+k5−(k+1)
=5k+10k2+10k3+5k4+(k5−k)
- 由归纳假设 k5≡k(mod10),所以 10∣(k5−k),可以忽略 (k5−k)
- 10∣10k2,可以忽略 10k2
- 10∣10k3,可以忽略 10k3
那么只要检查 5k+5k4 是否总是 10 的倍数就行了。
5k+5k4=5k(1+k3)
- 如果 k 是奇数,那么 2∣(1+k3),所以 10∣5k(1+k3)
- 如果 k 是偶数,那么 10∣5k,所以 10∣5k(1+k3)
综上 10∣((k+1)5−(k+1))。那么 n5≡n(mod10) 对 n=k+1 也成立。至此,我们用数学归纳法证明了 n5≡n(mod10) 对任意自然数都成立。
程序验证
由于 n5 的个位数只受到 n 的个位数的影响,所以我们只需要验证 n=0,1,2,3,4,5,6,7,8,9 的情况。请将以下代码保存为 verify.py
for n in range(10):
print(f"n: {n}, n ** 5: {n ** 5}, n ** 5 - n: {n ** 5 - n}")
使用如下命令可以运行 verify.py
python3 verify.py
运行结果如下
n: 0, n ** 5: 0, n ** 5 - n: 0
n: 1, n ** 5: 1, n ** 5 - n: 0
n: 2, n ** 5: 32, n ** 5 - n: 30
n: 3, n ** 5: 243, n ** 5 - n: 240
n: 4, n ** 5: 1024, n ** 5 - n: 1020
n: 5, n ** 5: 3125, n ** 5 - n: 3120
n: 6, n ** 5: 7776, n ** 5 - n: 7770
n: 7, n ** 5: 16807, n ** 5 - n: 16800
n: 8, n ** 5: 32768, n ** 5 - n: 32760
n: 9, n ** 5: 59049, n ** 5 - n: 59040
结果符合预期