数学中，**史密斯标准形**（**SNF**）是适用于所有元素都位于主理想域（PID）的矩阵的标准形（不必是方阵）。史密斯标准形是对角矩阵，可以从原始矩阵左右乘可逆方阵得到。特别地，整数构成一个PID，所以总可以计算出任何整数矩阵的史密斯标准形。史密斯标准形对于处理PID上的有限生成模，尤其是推导自由模之商的结构时非常有用。史密斯标准形得名于爱尔兰数学家Henry John Stephen Smith。

定义
--

令*A*为主理想域*R*上的非零*m*×*n*矩阵。存在可逆m\times m、n\times n方阵*S, T*（系数在*R*中），使得它们的积*S A T*为

{\displaystyle {\begin{pmatrix}\alpha \_{1}&0&0&&\cdots &&0\\0&\alpha \_{2}&0&&\cdots &&0\\0&0&\ddots &&&&0\\\vdots &&&\alpha \_{r}&&&\vdots \\&&&&0&&\\&&&&&\ddots &\\0&&&\cdots &&&0\end{pmatrix}}.}

对角元素\alpha \_{i}满足{\displaystyle \forall 1\leq i<r,\ \alpha \_{i}\mid \alpha \_{i+1}}。这就是矩阵A的史密斯标准形。元素\alpha \_{i}在乘法意义上是唯一的，是可逆元，称为*基本除子*、*不变量*或*不变因子*。它们的计算公式为

{\displaystyle \alpha \_{i}={\frac {d\_{i}(A)}{d\_{i-1}(A)}},}
其中{\displaystyle d\_{i}(A)}（即第*i*个*行列式因子*）等于矩阵*A* 所有{\displaystyle i\times i}子式的行列式的最大公因数，且{\displaystyle d\_{0}(A):=1}。

算法
--

第一个目标是找到可逆方阵S、T使得{\displaystyle SAT}为对角阵。这是算法中最难的部分。一旦实现了对角化，将矩阵转化为史密斯标准形就相对简单了。更抽象地说，我们的目标是证明A可以视为从R^n（秩为n的自由R-模）到R^{m}（秩为m的自由R-模）的映射，且有同构{\displaystyle S:R^{m}\to R^{m}}、{\displaystyle T:R^{n}\to R^{n}}，使得{\displaystyle S\cdot A\cdot T}具有对角矩阵的简单形式。S、T可用以下方法得到：从适当大小的单位阵开始，每次在算法中对A进行行运算时，都将相应的列运算施于S（例如，若A的i行加在j行上，则S的i列应减去j ，以保持乘积不变），同理，每次列运算都相应地修改T、由于行运算是左乘，列运算是右乘，这也就保持了{\displaystyle A'=S'\cdot A\cdot T'}不变，其中{\displaystyle A',S',T'}表示当前值，A表示原矩阵；最终，不变式中的矩阵变为对角阵。

对于{\displaystyle a\in R\setminus \{0\}}，记{\displaystyle \delta (a)}为a的素因子数（素因子存在且唯一，因为PID都是唯一分解整环） 。特别地，R也是贝祖环，因此是GCD环，任意两元素的gcd满足贝祖等式。

要将矩阵转为史密斯标准形，可以重复应用下面的公式，其中t从1到m循环。

### 第一步：选择主元

择{\displaystyle j\_{t}}为A中非零元所在的最小列数，若{\displaystyle t>1}则从第{\displaystyle j\_{t-1}+1}列开始搜索。

我们希望{\displaystyle a\_{t,j\_{t}}\neq 0}；若是这种情况，这步就完成了。否则，根据假设，存在某个k，使{\displaystyle a\_{k,j\_{t}}\neq 0}，且我们可以交换t行与k行，得到{\displaystyle a\_{t,j\_{t}}\neq 0}。

现在我们选择的主元位于{\displaystyle (t,j\_{t})}。

### 第二步：改进主元

若(*k*,*j**t*)上有元素使{\displaystyle a\_{t,j\_{t}}\nmid a\_{k,j\_{t}}}，则令{\displaystyle \beta =\gcd \left(a\_{t,j\_{t}},a\_{k,j\_{t}}\right)}，根据贝祖性质我们知道*R*中存在σ、τ使

{\displaystyle a\_{t,j\_{t}}\cdot \sigma +a\_{k,j\_{t}}\cdot \tau =\beta .}
与适当的可逆阵*L*左乘，矩阵乘积的第*t*行是原矩阵第*t*行的σ倍与第*k*行的τ倍的和，乘积的第*k*行则是这些行的另一个线性组合，其他行则保持不变。若σ、τ满足上市，则对于{\displaystyle \alpha =a\_{t,j\_{t}}/\beta }和{\displaystyle \gamma =a\_{k,j\_{t}}/\beta }（根据β的定义，这样作商是可能的），可以得到

{\displaystyle \sigma \cdot \alpha +\tau \cdot \gamma =1,}
那么矩阵

{\displaystyle L\_{0}={\begin{pmatrix}\sigma &\tau \\-\gamma &\alpha \\\end{pmatrix}}}
可逆，其逆为

{\displaystyle {\begin{pmatrix}\alpha &-\tau \\\gamma &\sigma \\\end{pmatrix}}.}
现在*L*可以通过将L\_0放入单位阵的*t~k*行列来得到。根据构造，*L*左乘后得到的矩阵在(*t*,*j**t*)的位置上有元素β（由于我们选择了α、γ，(*k*,*j**t*)上也有元素0，虽然这对算法并不重要，但很有用）。这个新元素β除了原元素{\displaystyle a\_{t,j\_{t}}}，因此{\displaystyle \delta (\beta )<\delta (a\_{t,j\_{t}})}；因此重复这些步骤最后必须终止。最终得到的矩阵的(*t*,*j**t*)元素除以了*j**t*列的所有元素。

### 第三步：消除元素

最后，加上第*t*行的适当倍数，可以使*j**t*列中除(*t*,*j**t*)外的所有元素都变为零。这也可以通过左乘适当的矩阵来实现。不过，为使矩阵完全对角，还需消除(*t*,*j**t*)所在行上的非零元素，这可以通过对列重复第二步中的算法来实现，并与得到的矩阵*L*的转置右乘。一般来说，这会导致之前应用第三步时消除的元素再次变为非零。

注意，对行列每次应用第二步的算法都必须减少{\displaystyle \delta (a\_{t,j\_{t}})}的值，因此这一过程须在一定迭代次数后终止，使矩阵中(*t*,*j**t*)元素是所在行列中的唯一非零元。

这时，只需对(*t*,*j**t*)右下方的*A*块进行对角化，从概念上讲这个算法可以递归应用，将块视为单独的矩阵。换句话说，可以将*t*增加1，然后回到第一步。

### 最后一步

将上述步骤用于结果矩阵的剩余非零列（如果有的话），最后得到m\times n矩阵，列为{\displaystyle j\_{1}<\ldots <j\_{r}}，其中{\displaystyle r\leq \min(m,n)}。矩阵非零元只有{\displaystyle (l,j\_{l})}。

现在可以把空列向右移动，这样非零元就到了位置{\displaystyle (i,i)(1\leq i\leq r)}。简而言之，设\alpha \_{i}为{\displaystyle (i,i)}上的元素。

对角元的可除性条件可能不能满足。{\displaystyle \forall i<r}使{\displaystyle \alpha \_{i}\nmid \alpha \_{i+1}}，可以只对i、{\displaystyle i+1}行列进行操作来弥补这一缺陷：首先将第{\displaystyle i+1}列加到i列，以在第i列得到{\displaystyle \alpha \_{i+1}}元素而不影响{\displaystyle (i,i)}位置上的元素\alpha \_{i}，然后应用行运算使{\displaystyle (i,i)}元素等于{\displaystyle \beta =\gcd(\alpha \_{i},\alpha \_{i+1})}，如第二步所述；最后按第三步方法，使矩阵再次对角化。由于{\displaystyle (i+1,i+1)}的新条目是原{\displaystyle \alpha \_{i},\alpha \_{i+1}}的线性组合，所以可以被β除。

{\displaystyle \delta (\alpha \_{1})+\cdots +\delta (\alpha \_{r})}的值不会因为上述操作而改变（它是上{\displaystyle r\times r}子阵的行列式的δ），因此操作确实（通过向右移动因子）减小了

{\displaystyle \sum \_{j=1}^{r}(r-j)\delta (\alpha \_{j}).}
所以，这算法只能应用有限次，意味着我们已经如愿得到了{\displaystyle \alpha \_{1}\mid \alpha \_{2}\mid \cdots \mid \alpha \_{r}}。

由于所有行列运算都可逆，这就表明存在可逆方阵m\times m、n\times n*S, T*使乘积*S A T*满足史密斯标准形的定义。特别地，这表明史密斯标准形一定存在，无需证明。

应用
--

链复形的链模为有限生成模时，史密斯标准形对计算链复形的同调将十分有用。例如，拓扑学中，可用于计算整数上有限单纯复形或CW复形的同调，因为这种复形的边界映射的整数矩阵；还可用于确定主理想域上有限生成模结构定理中出现的不变因子，其中包括了有限生成阿贝尔群基本定理。

控制论中，史密斯标准形还用于计算传递函数矩阵的零点。

例子
--

求下列整数矩阵的史密斯标准形：

{\displaystyle {\begin{pmatrix}2&4&4\\-6&6&12\\10&4&16\end{pmatrix}}}
下面的矩阵是算法应用于上述矩阵的中间步骤。

{\displaystyle \to {\begin{pmatrix}2&0&0\\-6&18&24\\10&-16&-4\end{pmatrix}}\to {\begin{pmatrix}2&0&0\\0&18&24\\0&-16&-4\end{pmatrix}}}
{\displaystyle \to {\begin{pmatrix}2&0&0\\0&2&20\\0&-16&-4\end{pmatrix}}\to {\begin{pmatrix}2&0&0\\0&2&20\\0&0&156\end{pmatrix}}}
{\displaystyle \to {\begin{pmatrix}2&0&0\\0&2&0\\0&0&156\end{pmatrix}}}
所求史密斯标准形为

{\displaystyle {\begin{pmatrix}2&0&0\\0&2&0\\0&0&156\end{pmatrix}}}
不变因子为2、2、156。

矩阵相似
----

史密斯标准形可用于判定元素属于同一域的两个矩阵是否相似。具体来说，当且仅当特征矩阵{\displaystyle xI-A}、{\displaystyle xI-B}有相同的史密斯标准形时，*A、B*相似。

例如

{\displaystyle {\begin{aligned}A&{}={\begin{bmatrix}1&2\\0&1\end{bmatrix}},&&{\mbox{SNF}}(xI-A)={\begin{bmatrix}1&0\\0&(x-1)^{2}\end{bmatrix}}\\B&{}={\begin{bmatrix}3&-4\\1&-1\end{bmatrix}},&&{\mbox{SNF}}(xI-B)={\begin{bmatrix}1&0\\0&(x-1)^{2}\end{bmatrix}}\\C&{}={\begin{bmatrix}1&0\\1&2\end{bmatrix}},&&{\mbox{SNF}}(xI-C)={\begin{bmatrix}1&0\\0&(x-1)(x-2)\end{bmatrix}}.\end{aligned}}}
*A、B*相似是因为它们特征矩阵的史密斯标准形相同，而与*C*不相似，因为它们特征矩阵的史密斯标准形不同。

另见
--

* 规范形
* 丢番图方程
* 弗罗贝尼乌斯标准形（也称为有理规范形）
* 埃尔米特标准形
* 奇异值分解

参考文献
----

* Smith, Henry J. Stephen.. Phil. Trans. R. Soc. Lond. 1861, **151** (1): 293–326. JSTOR 108738. S2CID 110730515. doi:10.1098/rstl.1861.0016.  Reprinted (pp. 367–409) in *The Collected Mathematical Papers of Henry John Stephen Smith*, Vol. I, edited by J. W. L. Glaisher. Oxford: Clarendon Press (1894), *xcv*+603 pp.
* *Smith normal form* at PlanetMath.
* *Example of Smith normal form* at PlanetMath.
* K. R. Matthews, Smith normal form （页面存档备份，存于）. MP274: Linear Algebra, Lecture Notes, University of Queensland, 1991.

外部链接
----

* An animated example of computation of Smith normal form （页面存档备份，存于）.