核心概述

模逆矩阵:在模素数 p 的有限域内对非奇异方阵 A 求 A^{−1}(mod p),通常用高斯–约当消元并以模逆替代除法,时间复杂度 O(n^3)。

原文引述

Description: Compute A^{-1} modulo a prime p via Gauss–Jordan elimination with modular inverses (or adjugate). Requires det(A) mod p ≠ 0. Time: O(n^3) Status: tested ——摘自本节点现有英文注释

展开阐述

  • 函数/接口(据实现)

    • vector<vector> invMod(const vector<vector>& A, ll mod)
      • 返回 A 在模 mod 下的逆(mod 为素数或保证可逆的域);若不可逆则返回空或报错。
    • bool invertibleMod(const Mat& A, ll mod):可选的可逆性检查。
    • 依赖:
  • 核心算法(Gauss–Jordan with Mod)

    1. 构造增广矩阵 [A | I](n×2n),所有元素先规约到 [0,mod)。
    2. 对 i=0..n−1:
      • 寻找第 i 列从行 i 起的第一个非零元所在行 p;若不存在则 A 奇异(det≡0 mod p)。
      • 若 p≠i,交换第 i 与 p 行。
      • 计算主元的逆 invPiv = inv(A[i][i], mod)(见 088-数论-模逆)。
      • 将主元行乘 invPiv 使其变为 1:A[i][j] = A[i][j]*invPiv % mod。
      • 对所有行 j≠i,消去第 j 行第 i 列:factor = A[j][i];row_j ← row_j − factor·row_i(每步取模)。
    3. 右侧部分即为 A^{−1} mod p。
  • 数值与实现注意

    • 所有运算在模域内进行,需保持 0≤x<mod;加减乘后取模,除法用乘逆元代替。
    • 素数模保证了除数与模互质(非零元素皆可逆);若模非素数,需判断 gcd(piv,mod)==1,否则矩阵在模域不可逆。
    • 主元选择:可选部分主元(按列绝对值或随机)以改善数值/模域性能,但并非必须。
    • 空间优化:可直接在 A 上进行原地操作,覆盖原矩阵为逆矩阵。
  • 输出语义

    • 返回 n×n 矩阵 B,满足 (A·B) mod p = I;若不可逆,返回空或抛出。
  • 复杂度

    • O(n^3) 次模乘加与模逆;单次模逆 O(log mod)(若用扩展欧几里得)或 O(log mod) 次模乘(若用费马小定理)。
  • 使用与注意

    • 依赖:mod 为素数时,可直接用 powmod(a, mod−2) 取逆;否则需 exgcd 并检查 gcd。
    • 可逆性检查:若只需求解 Ax=b 而不需要 A^{−1},可用高斯消元(114-数值算法-线性方程求解)更高效。
    • 与整数逆矩阵的关系:若要求精确整数逆矩阵,可用 107-数值算法-矩阵求逆(实数)或 Bareiss+伴随矩阵,或在多个素模下求逆后用 081-数论-中国剩余定理 合并(CRT 重建)。
    • 优化:
      • 预计算逆元或使用快速幂加速多个矩阵求逆。
      • 对稀疏或特殊结构矩阵(三角、块对角)可优化。

关联节点