费马小定理

背景

您是否注意过以下规律?

  • 整数 nn n 的平方 n2n^2 n2 总是满足以下两个命题中的某一个
    • n2≡0(mod3) n^2\equiv 0 \pmod{3} n2≡0(mod3)
    • n2≡1(mod3) n^2\equiv 1 \pmod{3} n2≡1(mod3)
  • 整数 nn n 的 44 4 次方 n4n^4 n4 总是满足以下两个命题中的某一个
    • n4≡0(mod5) n^4\equiv 0 \pmod{5} n4≡0(mod5)
    • n4≡1(mod5) n^4\equiv 1 \pmod{5} n4≡1(mod5)
  • 整数 nn n 的 55 5 次方总是满足以下命题
    • n5≡n(mod10) n^5\equiv n \pmod{10} n5≡n(mod10)

这些规律的背后是否有更深层的原因呢?我们能否证明这些规律?本文对此进行探讨。

正文

用较小的质数进行试验

我们可以用较小的质数 pp p 进行一些试验。我想通过 Python\text{Python} Python 代码来自动生成下图展示的这种表格 ⬇️

于是我写了这样的代码 (豆包trae 提供了帮助)

python 复制代码
"""
A tool for generating modular powers for a given prime number p.
"""
from typing import List


class SimpleModularPowDisplayer:
    """A class to display modular powers for a given positive integer m.

    Attributes:
        m (int): a positive integer (greater than or equal to 2)
    """

    def __init__(self, m: int) -> None:
        """Initialize the displayer with a positive integer m.
        
        Args:
            m (int): a positive integer
        
        Raises:
            ValueError: when m is not an integer or m < 2
        """
        if not isinstance(m, int) or m < 2:
            raise ValueError("m must be an integer that is greater than or equal to 2")
        self.m = m

    def _get_header_elements(self) -> List[str]:
        """Generate the header elements for the Markdown table.

        Returns:
            List[str]: Header cells for the Markdown table (LaTeX-formatted)
        """
        header = [f"$a$"]
        for exp in range(2, self.m + 1):
            header.append(f"$a^{{{exp}}} \\bmod {self.m}$")
        return header

    def print_header(self) -> None:
        """Print the header row of the Markdown table."""
        elements = self._get_header_elements()
        print(f"| {' | '.join(elements)} |")

    def _get_row_elements(self, a: int) -> List[str]:
        """Generate the elements for a single row of the Markdown table.
        
        Args:
            a (int): the base number (0 <= a < m)
        
        Returns:
            List[str]: Cell values for the row (LaTeX-formatted)
        """
        elements = [f"${a}$"]
        current = a
        for _ in range(2, self.m + 1):
            current = (current * a) % self.m
            elements.append(f"${current}$")
        return elements

    def print_row(self, a: int) -> None:
        """Print a single row of the Markdown table for a given base a.
        
        Args:
            a (int): an integer that satisfies the condition 0 <= a < m
        
        Raises:
            ValueError: If a is outside the range [0, m-1]
        """
        if not 0 <= a < self.m:
            raise ValueError(f"a should be inside [0, {self.m-1}]")
        elements = self._get_row_elements(a)
        print(f"| {' | '.join(elements)} |")

    def show_markdown_result(self) -> None:
        """Print the complete Markdown table for modular powers of m."""
        print(f"#### $m={self.m}$")
        self.print_header()
        # Print the separator row
        separator = ["---"] * len(self._get_header_elements())
        print(f"| {' | '.join(separator)} |")
        # Traverse all numbers from 0 to m-1
        for a in range(self.m):
            self.print_row(a)


if __name__ == "__main__":
    # A list with prime numbers
    PRIME_LIST = [2, 3, 5, 7, 11]
    for prime in PRIME_LIST:
        try:
            displayer = SimpleModularPowDisplayer(prime)
            displayer.show_markdown_result()
            print("\n")
        except ValueError as e:
            print(f"Error occurred when processing p={prime}: {e}")

请将上述代码保存为 print_markdown_table.py。用如下命令可以运行 print_markdown_table.py

bash 复制代码
python3 print_markdown_table.py

运行结果包含了 55 5 个 markdown 表格 ⬇️

m=2m=2 m=2

aa a a2  mod  2a^{2} \bmod 2 a2mod2
00 0 00 0
11 1 11 1

m=3m=3 m=3

aa a a2  mod  3a^{2} \bmod 3 a2mod3 a3  mod  3a^{3} \bmod 3 a3mod3
00 0 00 0 00 0
11 1 11 1 11 1
22 2 11 1 22 2

m=5m=5 m=5

aa a a2  mod  5a^{2} \bmod 5 a2mod5 a3  mod  5a^{3} \bmod 5 a3mod5 a4  mod  5a^{4} \bmod 5 a4mod5 a5  mod  5a^{5} \bmod 5 a5mod5
00 0 00 0 00 0 00 0 00 0
11 1 11 1 11 1 11 1 11 1
22 2 44 4 33 3 11 1 22 2
33 3 44 4 22 2 11 1 33 3
44 4 11 1 44 4 11 1 44 4

m=7m=7 m=7

aa a a2  mod  7a^{2} \bmod 7 a2mod7 a3  mod  7a^{3} \bmod 7 a3mod7 a4  mod  7a^{4} \bmod 7 a4mod7 a5  mod  7a^{5} \bmod 7 a5mod7 a6  mod  7a^{6} \bmod 7 a6mod7 a7  mod  7a^{7} \bmod 7 a7mod7
00 0 00 0 00 0 00 0 00 0 00 0 00 0
11 1 11 1 11 1 11 1 11 1 11 1 11 1
22 2 44 4 11 1 22 2 44 4 11 1 22 2
33 3 22 2 66 6 44 4 55 5 11 1 33 3
44 4 22 2 11 1 44 4 22 2 11 1 44 4
55 5 44 4 66 6 22 2 33 3 11 1 55 5
66 6 11 1 66 6 11 1 66 6 11 1 66 6

m=11m=11 m=11

aa a a2  mod  11a^{2} \bmod 11 a2mod11 a3  mod  11a^{3} \bmod 11 a3mod11 a4  mod  11a^{4} \bmod 11 a4mod11 a5  mod  11a^{5} \bmod 11 a5mod11 a6  mod  11a^{6} \bmod 11 a6mod11 a7  mod  11a^{7} \bmod 11 a7mod11 a8  mod  11a^{8} \bmod 11 a8mod11 a9  mod  11a^{9} \bmod 11 a9mod11 a10  mod  11a^{10} \bmod 11 a10mod11 a11  mod  11a^{11} \bmod 11 a11mod11
00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0
11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1
22 2 44 4 88 8 55 5 1010 10 99 9 77 7 33 3 66 6 11 1 22 2
33 3 99 9 55 5 44 4 11 1 33 3 99 9 55 5 44 4 11 1 33 3
44 4 55 5 99 9 33 3 11 1 44 4 55 5 99 9 33 3 11 1 44 4
55 5 33 3 44 4 99 9 11 1 55 5 33 3 44 4 99 9 11 1 55 5
66 6 33 3 77 7 99 9 1010 10 55 5 88 8 44 4 22 2 11 1 66 6
77 7 55 5 22 2 33 3 1010 10 44 4 66 6 99 9 88 8 11 1 77 7
88 8 99 9 66 6 44 4 1010 10 33 3 22 2 55 5 77 7 11 1 88 8
99 9 44 4 33 3 55 5 11 1 99 9 44 4 33 3 55 5 11 1 99 9
1010 10 11 1 1010 10 11 1 1010 10 11 1 1010 10 11 1 1010 10 11 1 1010 10

找规律

通过观察以上 55 5 个 markdown 表格,我们可以发现一些规律 ⬇️ (也许您还能发现其他规律)

  • 对满足 0<a<p0\lt a\lt p 0<a<p 的整数 aa a 而言, a2k≡(p−a)2k(modp)a^{2k}\equiv (p-a)^{2k} \pmod {p} a2k≡(p−a)2k(modp) 似乎总是成立 ( kk k 为任意正整数)
  • 对满足 0<a<p0\lt a\lt p 0<a<p 的整数 aa a 而言, ap−1≡1(modp) a^{p-1}\equiv 1 \pmod {p} ap−1≡1(modp) 似乎总是成立

我们试试证明它们。

规律一的证明

我们尝试证明以下规律

对满足 0<a<p0\lt a\lt p 0<a<p 的整数 aa a 而言, a2k≡(p−a)2k(modp)a^{2k}\equiv (p-a)^{2k} \pmod {p} a2k≡(p−a)2k(modp) 总是成立 ( kk k 为任意正整数, pp p 为任意质数)

k=1k=1 k=1 的情况最简单,我们先看看它 ⬇️
a2−(p−a)2=a2−(p2−2pa+a2)=−p2+2paa^2-(p-a)^2=a^2-(p^2-2pa+a^2)=-p^2+2pa a2−(p−a)2=a2−(p2−2pa+a2)=−p2+2pa

因此 p∣(a2−(p−a)2)p\mid (a^2-(p-a)^2) p∣(a2−(p−a)2),所以 a2≡(p−a)2(modp)a^2\equiv (p-a)^2 \pmod {p} a2≡(p−a)2(modp)

如果我们能将以下 kk k 个等式左边右边各自相乘,就可以得到要证的等式 👉 a2k≡(p−a)2k(modp)a^{2k}\equiv (p-a)^{2k} \pmod {p} a2k≡(p−a)2k(modp)

  • a2≡(p−a)2(modp)a^2\equiv (p-a)^2 \pmod {p} a2≡(p−a)2(modp)
  • a2≡(p−a)2(modp)a^2\equiv (p-a)^2 \pmod {p} a2≡(p−a)2(modp)
  • ⋯\cdots
  • a2≡(p−a)2(modp)a^2\equiv (p-a)^2 \pmod {p} a2≡(p−a)2(modp)

但是能否这样做乘法呢?答案是肯定的。

如果 x≡x′(modn) x\equiv x' \pmod n x≡x′(modn) 和 y≡y′(modn) y\equiv y' \pmod n y≡y′(modn) 成立,那么以下两个命题成立

  • n∣(x−x′)n \mid (x-x') n∣(x−x′)
  • n∣(y−y′)n \mid (y-y') n∣(y−y′)

也就是说,我们可以找到整数 a,ba,b a,b 使得以下两个等式成立

  • x′=x+anx'=x+an x′=x+an
  • y′=y+bny'=y+bn y′=y+bn

所以 xy−x′y′=xy−(x+an)(y+bn)=−ayn−bxn−abn2xy-x'y'=xy-(x+an)(y+bn)=-ayn-bxn-abn^2 xy−x′y′=xy−(x+an)(y+bn)=−ayn−bxn−abn2,那么 n∣(xy−x′y′)n\mid (xy-x'y') n∣(xy−x′y′)

由此可见,在模 nn n 运算中,我们确实可以在 ≡\equiv ≡ 运算两边做乘法。

于是 a2k≡(p−a)2k(modp)a^{2k}\equiv (p-a)^{2k} \pmod {p} a2k≡(p−a)2k(modp) 对任意正整数 kk k 都成立。

规律二的证明

说明:本小节的证明来自 灵茶山艾府 所写的 分享丨模运算的世界:当加减乘除遇上取模(模运算恒等式/费马小定理/组合数) 一文(有改动)。由于其中所讲的都是经典的数学知识,我想其中的证明应该不存在版权问题,但引用其中的内容时,应该注明出处。于是我写了这么一段说明

我们的目标是,证明或者证伪以下命题

0<a<p0\lt a\lt p 0<a<p 的整数 aa a 而言, ap−1≡1(modp) a^{p-1}\equiv 1 \pmod {p} ap−1≡1(modp)。

首先,对任意整数 x,yx,y x,y, (x+y)p(x+y)^p (x+y)p 可以用二项式定理进行展开。
(x+y)p= ∑i=0p Cpixiyp−i(x+y)^p=\sum_{i=0}^{p}C_p^i x^i y^{p-i} (x+y)p=i=0∑pCpixiyp−i

Cpi= p!i!(p−i)! C_p^i=\frac{p!}{i!(p-i)!} Cpi=i!(p−i)!p!

  • i=0i=0 i=0 时, Cp0=1 C_p^0=1 Cp0=1
  • 0<i<p0\lt i\lt p 0<i<p 时, p∣p!p\mid p! p∣p! 成立,由算术基本定理可得, p∣Cpi p\mid C_p^i p∣Cpi
  • i=pi=p i=p 时, Cpp=1 C_p^p=1 Cpp=1

所以
(x+y)p= ∑i=0p Cpixiyp−i(x+y)^p=\sum_{i=0}^{p}C_p^i x^i y^{p-i} (x+y)p=i=0∑pCpixiyp−i
=Cp0yp+⋯+Cppxp =C_p^0y^p + \cdots + C_p^px^p =Cp0yp+⋯+Cppxp

其中 ⋯\cdots ⋯ 所表示的各项均可被 pp p 整除。

于是我们可以得出
(x+y)p≡xp+yp(modp)(x+y)^p\equiv x^p + y^p \pmod p (x+y)p≡xp+yp(modp)

y=1y=1 y=1 就会得到 (x+1)p≡xp+1(modp)(x+1)^p\equiv x^p + 1 \pmod p (x+1)p≡xp+1(modp)。

x=0x=0 x=0 时, 0p≡0(modp) 0^p\equiv 0 \pmod p 0p≡0(modp) 显然成立。假设 x=kx=k x=k 时, kp≡k(modp) k^p\equiv k \pmod p kp≡k(modp) 成立( kk k 是某个自然数)。也就是说, p∣(kp−k)p\mid (k^p-k) p∣(kp−k) 成立。

那么 x=k+1x=k+1 x=k+1 时,
(k+1)p−(k+1)=kp+1+pN−(k+1)(k+1)^p-(k+1)=k^p+1+pN-(k+1) (k+1)p−(k+1)=kp+1+pN−(k+1)

其中 NN N 表示某个整数。继续化简,可以得到 ⬇️
(k+1)p−(k+1)=kp+pN−k=kp−k+pN(k+1)^p-(k+1)=k^p+pN-k=k^p-k+pN (k+1)p−(k+1)=kp+pN−k=kp−k+pN

注意到以下两个命题成立

  • p∣(kp−k)p\mid (k^p-k) p∣(kp−k)
  • p∣pNp\mid pN p∣pN

那么 p∣(kp−k+pN)p\mid (k^p-k+pN) p∣(kp−k+pN) 成立,也就是说, (k+1)p≡kp+1(modp)(k+1)^p\equiv k^p + 1\pmod p (k+1)p≡kp+1(modp) 成立。

运用数学归纳法,可以得到 xp≡x(modp) x^p\equiv x \pmod p xp≡x(modp) 对任意自然数 xx x 都成立。

  • p∣xp\mid x p∣x 时, xp≡0(modp) x^p\equiv 0 \pmod p xp≡0(modp) 显然成立
  • p∤xp\nmid x p∤x 时,由于 p∣(xp−x)p\mid (x^p-x) p∣(xp−x),那么 p∣x(xp−1−1)p\mid x(x^{p-1}-1) p∣x(xp−1−1)。由算术基本定理可得 p∣(xp−1−1)p\mid (x^{p-1} - 1) p∣(xp−1−1),即 xp−1≡1(modp) x^{p-1}\equiv 1 \pmod p xp−1≡1(modp)。⬅️ 这就是费马小定理

费马小定理的简单应用

我们回到 背景 中所提到的 33 3 个问题

问题 1

  • 整数 nn n 的平方 n2n^2 n2 是否总是满足以下两个命题中的某一个
    • n2≡0(mod3) n^2\equiv 0 \pmod{3} n2≡0(mod3)
    • n2≡1(mod3) n^2\equiv 1 \pmod{3} n2≡1(mod3)
  • 3∣n3\mid n 3∣n 时, n2≡0(mod3) n^2\equiv 0 \pmod{3} n2≡0(mod3) 显然成立
  • 3∤n3\nmid n 3∤n 时,由费马小定理可得, n2≡1(mod3) n^2\equiv 1 \pmod{3} n2≡1(mod3)

问题 11 1 解决了

问题 2

  • 整数 nn n 的 44 4 次方 n4n^4 n4 是否总是满足以下两个命题中的某一个
    • n4≡0(mod5) n^4\equiv 0 \pmod{5} n4≡0(mod5)
    • n4≡1(mod5) n^4\equiv 1 \pmod{5} n4≡1(mod5)
  • 5∣n5\mid n 5∣n 时, n4≡0(mod5) n^4\equiv 0 \pmod{5} n4≡0(mod5) 显然成立
  • 4∤n4\nmid n 4∤n 时,由费马小定理可得, n4≡1(mod5) n^4\equiv 1 \pmod{5} n4≡1(mod5)

问题 22 2 解决了

问题 3

  • 整数 nn n 的 55 5 次方是否总是满足以下命题
    • n5≡n(mod10) n^5\equiv n \pmod{10} n5≡n(mod10)
  • 在费马小定理的基础上,可知 n5≡n(mod5) n^5\equiv n \pmod{5} n5≡n(mod5),所以 5∣(n5−n)5\mid (n^5-n) 5∣(n5−n) 成立
  • 考虑到 n5n^5 n5 和 nn n 的奇偶性相同,那么 2∣(n5−n)2\mid (n^5-n) 2∣(n5−n)

由算术基本定理可知,当 n>1n\gt1 n>1 时, n5−nn^5-n n5−n 的质因数分解结果是唯一的,那么这个分解结果中至少包含一个 22 2,至少包含一个 55 5。所以 10∣(n5−n)10|(n^5-n) 10∣(n5−n)。而 n=0,1n=0,1 n=0,1 时, 10∣(n5−n)10\mid (n^5-n) 10∣(n5−n) 显然成立。所以对任意自然数 nn n 而言, 10∣(n5−n)10\mid(n^5-n) 10∣(n5−n)。对负整数 nn n 来说, n5−n=−((−n)5−(−n))n^5-n=-((-n)^5-(-n)) n5−n=−((−n)5−(−n))。那么对任意整数 nn n 而言, 10∣(n5−n)10\mid(n^5-n) 10∣(n5−n) 成立。换句话说 n5≡n(mod10) n^5\equiv n \pmod{10} n5≡n(mod10) 对任意整数 nn n 成立

问题 33 3 解决了

相关推荐
技术不好的崎鸣同学3 小时前
[ACTF2020 新生赛]Exec 思路及解法
算法·安全·web安全
Full Stack Developme4 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry5 小时前
LeetCode 707. 设计链表
算法
疋瓞5 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车6 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
kebidaixu6 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法
智能排队系统_头部供应商6 小时前
RK3588边缘网关改造银行排队系统实战
算法
东方佑6 小时前
临界分词的存在性与最优性:从统计临界态到神经语言模型的双语实证检验
人工智能·算法·语言模型