行列式(Determinant):通过高斯消元将矩阵化为上三角,行列式为对角线元素乘积并考虑行交换符号;数值实数版用部分主元选取提升稳定性,模数域下用逆元代替除法。复杂度 O(n^3)。
Description: Compute det(A) via Gaussian elimination (partial pivoting). Over reals: floating-point with row swaps tracking sign. Over mod prime: use modular inverses. For exact integer determinant prefer Bareiss or CRT. Time: O(n^3) Status: tested
-
函数/接口(据实现)
- double/long double det(vector<vector<double/long double>> A)
- long long detMod(vector<vector
> A, long long P)(P 为素数,结果规约到 [0,P)) - 注意:整数精确行列式建议使用 103-数值算法-整数行列式(Bareiss 或多模 CRT)。
-
核心思路(高斯消元 + 行交换)
- sgn = 1;ans = 1;对列 c=0..n-1:
- 选取从行 r≥c 中 |A[r][c]| 最大者作为主元行 p;若 A[p][c]≈0(或 ≡0 mod P),则行列式为 0。
- 若 p ≠ c,则交换第 p 与第 c 行,sgn = −sgn。
- 令 piv = A[c][c];实数版将第 c 行右侧元素除以 piv;模数版将其乘以 inv(piv)(模逆)。
- 对所有 r>c:用 A[r][c] 消去第 c 列(A[r][*] -= A[r][c]A[c][])。
- 最终 ans = sgn · ∏ A[i][i](实数版乘原始主元;若实现中做了行归一,需相应累积/还原)。
- 数值稳定性:采用部分主元(按列最大值选行)显著降低误差;阈值 EPS 判断“近 0”。
- sgn = 1;ans = 1;对列 c=0..n-1:
-
输出语义
- 实数版:返回 double/long double,受浮点误差影响(规模大时优先 long double)。
- 模数版:返回 det(A) mod P,位于 [0,P);要求 P 为素数,并为每个非零主元存在逆元。
-
复杂度
- 时间 O(n^3),空间 O(1) 额外(原地操作);对于稀疏或超大矩阵可考虑分块/并行或专门库。
-
使用与注意
- 实数版:
- EPS 选取与缩放策略会影响数值稳定;尽量选择部分主元,必要时可做行/列尺度归一化。
- 结果可能因舍入误差导致非常接近 0 的小值,可用 |ans|<EPS 判断奇异性。
- 模数版:
- 精确整数:
- 切勿使用纯整数高斯除法(中间数爆炸);使用 103-数值算法-整数行列式 的 Bareiss 法或多模 CRT(多素模求 det 后用 081-数论-中国剩余定理 合并)。
- 与求逆/解方程关系:
- det(A)=0 ⇔ A 奇异,无法求逆(见 107-数值算法-矩阵求逆、114-数值算法-线性方程求解)。
- 实数版: