二次同余方程的解的公式
字数 3883 2025-10-26 09:01:44

二次同余方程的解的公式

我们继续讨论二次同余方程。你已经了解了如何判断解的存在性(通过勒让德符号和二次互反律),现在我们来探讨一个核心问题:如果一个二次同余方程有解,我们能否找到一个直接的公式来计算出它的解?

答案是肯定的,但这个过程需要分情况讨论,并且依赖于我们之前学过的模逆元和二次剩余等概念。

第一步:简化问题——模奇素数幂的方程

一个一般的二次同余方程形式为 \(ax^2 + bx + c \equiv 0 \pmod{m}\)。根据中国剩余定理,求解模 \(m\) 的方程可以转化为求解模 \(m\) 的素数幂因子 \(p^k\) 的方程。因此,我们首先需要解决模数为奇素数 \(p\) 的方程,然后再推广到模奇素数幂 \(p^k\) (k>1) 的情况。最后,再单独处理模 \(2^k\) 的特殊情况。

我们先从最基础、最重要的情形开始:模奇素数 \(p\)

第二步:求解模奇素数 \(p\) 的方程 \(x^2 \equiv a \pmod{p}\)

这是最简单的情形,其中 \(a\) 是模 \(p\) 的二次剩余,即勒让德符号 \(\left(\frac{a}{p}\right) = 1\)

  1. 问题转化:我们的目标是找到所有满足 \(x^2 \equiv a \pmod{p}\) 的整数 \(x\)
  2. 关键思路——随机搜索:当 \(p\) 很大时,并没有一个非常快速、确定性的通用公式来直接找到一个解。一个常见的方法是随机尝试。我们随机选择一个数 \(c\) (\(1 \le c \le p-1\)),计算勒让德符号 \(\left(\frac{c^2 - a}{p}\right)\)。如果这个符号等于 -1(即 \(c^2 - a\) 是模 \(p\) 的二次非剩余),那么我们就找到了一个关键的“见证”。
  3. Tonelli-Shanks 算法的核心思想:假设我们找到了一个 \(c\),使得 \(c^2 - a\) 是二次非剩余。令 \(d = c^2 - a\)。那么,在某种扩大的数系(模 \(p\) 的二次域)中,\(\sqrt{d}\) 是存在的。利用这个思想,可以构造出解。
    • 一个更具体但不那么严格的表述是:解可以由下式给出:
      \(x \equiv (c + \sqrt{d})^{(p+1)/2} \pmod{p}\)
  • 这里的 \(\sqrt{d}\) 并不是在整数模 \(p\) 意义下的数,但它指引了一个有效的计算方法。Tonelli-Shanks 算法 就是一个基于这个思想的、高效的计算程序,它通过将 \(p-1\) 分解为 \(Q \cdot 2^S\)(其中 \(Q\) 是奇数),然后进行迭代,最终找到解。
  1. 解的个数:根据之前的知识,如果 \(a \not\equiv 0 \pmod{p}\) 且是二次剩余,那么方程 \(x^2 \equiv a \pmod{p}\) 恰好有两个解。如果我们找到了一个解 \(x_0\),那么另一个解就是 \(-x_0\)

总结(模奇素数):对于 \(x^2 \equiv a \pmod{p}\),当解存在时,虽然没有一个像求根公式那样简单的封闭表达式,但存在有效的算法(如 Tonelli-Shanks 算法)可以计算出解。这两个解互为相反数。

第三步:求解模奇素数幂 \(p^k\) 的方程 \(x^2 \equiv a \pmod{p^k}\)

现在我们将问题提升到模 \(p^k\) (k>1) 的情形。这里我们使用一种称为 Hensel 引理 的强大工具。

  1. Hensel 引理(提升引理):这个引理告诉我们,如何将一个模 \(p^k\) 的方程的解“提升”为模 \(p^{k+1}\) 的解。
  2. 应用过程
  • 基础步骤:首先,求解模 \(p\) 的方程 \(x^2 \equiv a \pmod{p}\)。假设我们找到了一个解 \(x_1\),满足 \(x_1^2 \equiv a \pmod{p}\)
  • 提升步骤:现在我们想找到一个解 \(x_2\),满足 \(x_2^2 \equiv a \pmod{p^2}\),并且 \(x_2 \equiv x_1 \pmod{p}\)。我们设 \(x_2 = x_1 + p \cdot t_1\),其中 \(t_1\) 是待确定的整数。
  • \(x_2\) 代入方程:
    \((x_1 + p t_1)^2 \equiv a \pmod{p^2}\)
    \(x_1^2 + 2 x_1 p t_1 + p^2 t_1^2 \equiv a \pmod{p^2}\)
    由于 \(p^2 t_1^2 \equiv 0 \pmod{p^2}\),我们得到:
    \(x_1^2 + 2 x_1 p t_1 \equiv a \pmod{p^2}\)
  • 因为 \(x_1^2 \equiv a \pmod{p}\),所以 \(x_1^2 - a\) 能被 \(p\) 整除,记 \(x_1^2 - a = p \cdot M\)。那么上面的同余式变为:
    \(p \cdot M + 2 x_1 p t_1 \equiv 0 \pmod{p^2}\)
    两边同时除以 \(p\)
    \(M + 2 x_1 t_1 \equiv 0 \pmod{p}\)
    \(2 x_1 t_1 \equiv -M \pmod{p}\)
  • 这是一个关于 \(t_1\)线性同余方程。由于 \(p\) 是奇素数,且 \(x_1 \not\equiv 0 \pmod{p}\)(因为 \(a \not\equiv 0 \pmod{p}\)),所以 \(2x_1\) 在模 \(p\) 下有逆元。因此,我们可以解出唯一的 \(t_1 \pmod{p}\)
    \(t_1 \equiv -M \cdot (2x_1)^{-1} \pmod{p}\)
  • 这样就得到了模 \(p^2\) 的一个解 \(x_2 = x_1 + p \cdot t_1\)
  • 这个提升过程可以重复进行,从模 \(p^2\) 提升到模 \(p^3\),依此类推,直到模 \(p^k\)

总结(模奇素数幂):只要方程在模 \(p\) 下有解,并且 \(a\) 不被 \(p\) 整除(即解不是“奇异的”),那么我们就可以通过 Hensel 引理,将这个解唯一地提升到任意高的素数幂 \(p^k\)。对于每个模 \(p\) 的解,在模 \(p^k\) 下也恰好对应一个解。

第四步:求解一般二次方程 \(ax^2 + bx + c \equiv 0 \pmod{p}\)

现在我们来处理带一次项的一般形式。

  1. 配方:方法和解实数域中的二次方程类似,我们通过配方来简化。
    \(ax^2 + bx + c \equiv 0 \pmod{p}\)
    两边乘以 \(4a\) 的模 \(p\) 逆元 \((4a)^{-1}\) 不是必须的,更直接的方法是确保 \(a\) 有逆元。因为 \(p\) 是奇素数且 \(p \nmid a\),所以 \(a\) 在模 \(p\) 下有逆元。两边乘以 \(4a\)
    \(4a^2x^2 + 4abx + 4ac \equiv 0 \pmod{p}\)
    \((2ax)^2 + 2 \cdot (2ax) \cdot b + 4ac \equiv 0 \pmod{p}\)
    为了配方,我们需要加上 \(b^2\) 再减去它:
    \((2ax)^2 + 2 \cdot (2ax) \cdot b + b^2 - b^2 + 4ac \equiv 0 \pmod{p}\)
    \((2ax + b)^2 \equiv b^2 - 4ac \pmod{p}\)

  2. 变量代换:令 \(y = 2ax + b\),且令 \(D = b^2 - 4ac\)。方程简化为:
    \(y^2 \equiv D \pmod{p}\)

  3. 求解:这样我们就回到了第二步中的形式。首先判断 \(D\) 是否是模 \(p\) 的二次剩余(计算 \(\left(\frac{D}{p}\right)\))。

  • 如果 \(\left(\frac{D}{p}\right) = -1\),无解。
  • 如果 \(\left(\frac{D}{p}\right) = 0\),即 \(D \equiv 0 \pmod{p}\),则有一个解 \(y \equiv 0 \pmod{p}\)
  • 如果 \(\left(\frac{D}{p}\right) = 1\),则有两个解 \(y \equiv y_0 \pmod{p}\)\(y \equiv -y_0 \pmod{p}\)
  1. 回代:最后,将 \(y\) 的解代回 \(x\) 的表达式:
    \(2ax + b \equiv y_0 \pmod{p}\)
    \(x \equiv (y_0 - b) \cdot (2a)^{-1} \pmod{p}\)
    对另一个解 \(y \equiv -y_0\) 做同样的操作,就得到了原方程的两个解。

这个推导过程给出了一个清晰的“公式化”求解路径:配方 -> 求解简化后的二次剩余方程 -> 回代

二次同余方程的解的公式 我们继续讨论二次同余方程。你已经了解了如何判断解的存在性(通过勒让德符号和二次互反律),现在我们来探讨一个核心问题: 如果一个二次同余方程有解,我们能否找到一个直接的公式来计算出它的解? 答案是肯定的,但这个过程需要分情况讨论,并且依赖于我们之前学过的模逆元和二次剩余等概念。 第一步:简化问题——模奇素数幂的方程 一个一般的二次同余方程形式为 \( ax^2 + bx + c \equiv 0 \pmod{m} \)。根据中国剩余定理,求解模 \(m\) 的方程可以转化为求解模 \(m\) 的素数幂因子 \(p^k\) 的方程。因此,我们首先需要解决模数为 奇素数 \(p\) 的方程,然后再推广到模奇素数幂 \(p^k\) (k>1) 的情况。最后,再单独处理模 \(2^k\) 的特殊情况。 我们先从最基础、最重要的情形开始: 模奇素数 \(p\) 。 第二步:求解模奇素数 \(p\) 的方程 \(x^2 \equiv a \pmod{p}\) 这是最简单的情形,其中 \(a\) 是模 \(p\) 的二次剩余,即勒让德符号 \(\left(\frac{a}{p}\right) = 1\)。 问题转化 :我们的目标是找到所有满足 \(x^2 \equiv a \pmod{p}\) 的整数 \(x\)。 关键思路——随机搜索 :当 \(p\) 很大时,并没有一个非常快速、确定性的通用公式来直接找到一个解。一个常见的方法是 随机尝试 。我们随机选择一个数 \(c\) (\(1 \le c \le p-1\)),计算勒让德符号 \(\left(\frac{c^2 - a}{p}\right)\)。如果这个符号等于 -1(即 \(c^2 - a\) 是模 \(p\) 的二次非剩余),那么我们就找到了一个关键的“见证”。 Tonelli-Shanks 算法的核心思想 :假设我们找到了一个 \(c\),使得 \(c^2 - a\) 是二次非剩余。令 \(d = c^2 - a\)。那么,在某种扩大的数系(模 \(p\) 的二次域)中,\(\sqrt{d}\) 是存在的。利用这个思想,可以构造出解。 一个更具体但不那么严格的表述是:解可以由下式给出: \(x \equiv (c + \sqrt{d})^{(p+1)/2} \pmod{p}\) 这里的 \(\sqrt{d}\) 并不是在整数模 \(p\) 意义下的数,但它指引了一个有效的计算方法。 Tonelli-Shanks 算法 就是一个基于这个思想的、高效的计算程序,它通过将 \(p-1\) 分解为 \(Q \cdot 2^S\)(其中 \(Q\) 是奇数),然后进行迭代,最终找到解。 解的个数 :根据之前的知识,如果 \(a \not\equiv 0 \pmod{p}\) 且是二次剩余,那么方程 \(x^2 \equiv a \pmod{p}\) 恰好有两个解。如果我们找到了一个解 \(x_ 0\),那么另一个解就是 \(-x_ 0\)。 总结(模奇素数) :对于 \(x^2 \equiv a \pmod{p}\),当解存在时,虽然没有一个像求根公式那样简单的封闭表达式,但存在有效的算法(如 Tonelli-Shanks 算法)可以计算出解。这两个解互为相反数。 第三步:求解模奇素数幂 \(p^k\) 的方程 \(x^2 \equiv a \pmod{p^k}\) 现在我们将问题提升到模 \(p^k\) (k>1) 的情形。这里我们使用一种称为 Hensel 引理 的强大工具。 Hensel 引理(提升引理) :这个引理告诉我们,如何将一个模 \(p^k\) 的方程的解“提升”为模 \(p^{k+1}\) 的解。 应用过程 : 基础步骤 :首先,求解模 \(p\) 的方程 \(x^2 \equiv a \pmod{p}\)。假设我们找到了一个解 \(x_ 1\),满足 \(x_ 1^2 \equiv a \pmod{p}\)。 提升步骤 :现在我们想找到一个解 \(x_ 2\),满足 \(x_ 2^2 \equiv a \pmod{p^2}\),并且 \(x_ 2 \equiv x_ 1 \pmod{p}\)。我们设 \(x_ 2 = x_ 1 + p \cdot t_ 1\),其中 \(t_ 1\) 是待确定的整数。 将 \(x_ 2\) 代入方程: \( (x_ 1 + p t_ 1)^2 \equiv a \pmod{p^2} \) \( x_ 1^2 + 2 x_ 1 p t_ 1 + p^2 t_ 1^2 \equiv a \pmod{p^2} \) 由于 \(p^2 t_ 1^2 \equiv 0 \pmod{p^2}\),我们得到: \( x_ 1^2 + 2 x_ 1 p t_ 1 \equiv a \pmod{p^2} \) 因为 \(x_ 1^2 \equiv a \pmod{p}\),所以 \(x_ 1^2 - a\) 能被 \(p\) 整除,记 \(x_ 1^2 - a = p \cdot M\)。那么上面的同余式变为: \( p \cdot M + 2 x_ 1 p t_ 1 \equiv 0 \pmod{p^2} \) 两边同时除以 \(p\): \( M + 2 x_ 1 t_ 1 \equiv 0 \pmod{p} \) \( 2 x_ 1 t_ 1 \equiv -M \pmod{p} \) 这是一个关于 \(t_ 1\) 的 线性同余方程 。由于 \(p\) 是奇素数,且 \(x_ 1 \not\equiv 0 \pmod{p}\)(因为 \(a \not\equiv 0 \pmod{p}\)),所以 \(2x_ 1\) 在模 \(p\) 下有逆元。因此,我们可以解出唯一的 \(t_ 1 \pmod{p}\): \( t_ 1 \equiv -M \cdot (2x_ 1)^{-1} \pmod{p} \) 这样就得到了模 \(p^2\) 的一个解 \(x_ 2 = x_ 1 + p \cdot t_ 1\)。 这个提升过程可以重复进行,从模 \(p^2\) 提升到模 \(p^3\),依此类推,直到模 \(p^k\)。 总结(模奇素数幂) :只要方程在模 \(p\) 下有解,并且 \(a\) 不被 \(p\) 整除(即解不是“奇异的”),那么我们就可以通过 Hensel 引理,将这个解唯一地提升到任意高的素数幂 \(p^k\)。对于每个模 \(p\) 的解,在模 \(p^k\) 下也恰好对应一个解。 第四步:求解一般二次方程 \(ax^2 + bx + c \equiv 0 \pmod{p}\) 现在我们来处理带一次项的一般形式。 配方 :方法和解实数域中的二次方程类似,我们通过配方来简化。 \( ax^2 + bx + c \equiv 0 \pmod{p} \) 两边乘以 \(4a\) 的模 \(p\) 逆元 \((4a)^{-1}\) 不是必须的,更直接的方法是确保 \(a\) 有逆元。因为 \(p\) 是奇素数且 \(p \nmid a\),所以 \(a\) 在模 \(p\) 下有逆元。两边乘以 \(4a\): \( 4a^2x^2 + 4abx + 4ac \equiv 0 \pmod{p} \) \( (2ax)^2 + 2 \cdot (2ax) \cdot b + 4ac \equiv 0 \pmod{p} \) 为了配方,我们需要加上 \(b^2\) 再减去它: \( (2ax)^2 + 2 \cdot (2ax) \cdot b + b^2 - b^2 + 4ac \equiv 0 \pmod{p} \) \( (2ax + b)^2 \equiv b^2 - 4ac \pmod{p} \) 变量代换 :令 \(y = 2ax + b\),且令 \(D = b^2 - 4ac\)。方程简化为: \( y^2 \equiv D \pmod{p} \) 求解 :这样我们就回到了第二步中的形式。首先判断 \(D\) 是否是模 \(p\) 的二次剩余(计算 \(\left(\frac{D}{p}\right)\))。 如果 \(\left(\frac{D}{p}\right) = -1\),无解。 如果 \(\left(\frac{D}{p}\right) = 0\),即 \(D \equiv 0 \pmod{p}\),则有一个解 \(y \equiv 0 \pmod{p}\)。 如果 \(\left(\frac{D}{p}\right) = 1\),则有两个解 \(y \equiv y_ 0 \pmod{p}\) 和 \(y \equiv -y_ 0 \pmod{p}\)。 回代 :最后,将 \(y\) 的解代回 \(x\) 的表达式: \( 2ax + b \equiv y_ 0 \pmod{p} \) \( x \equiv (y_ 0 - b) \cdot (2a)^{-1} \pmod{p} \) 对另一个解 \(y \equiv -y_ 0\) 做同样的操作,就得到了原方程的两个解。 这个推导过程给出了一个清晰的“公式化”求解路径: 配方 -> 求解简化后的二次剩余方程 -> 回代 。