这一段代码是我在整理文档的时候发现的,输入是一个矩阵,输出是矩阵的最小多项式,把代码先放在这里,以后用到可以直接使用。
最小多项式介绍
关于最小多项式的介绍,先讲一下我的理解:
根据哈密尔顿—凯莱定理,任给数域p上一个n级矩阵A,总可以找到数域P上一个多项式f(x),使f(A)=0. 如果多项式f(x)使f(A)=0,就称f(x)以A为根 当然,以A为根的多项式是很多的,所以最小多项式的定义是次数最低的首项系数为1的以 为根的多项式称为 的最小多项式.
下面看一下百度百科的解释,这个应该是更加正式一点,前面看懂了这里就不用看了。
只看定义可能不是很明确,我们还是直接来看一下如何来求最小多项式,求的方法见下图
下面我们就根据上面的求法来使用Mathematica求一下矩阵的最小多项式。
Mathematica实现最小多项式计算
因为代码年代久远了,当时我写的也不好,所以导致我现在已经看不懂了,不过能用就好。
matrixhorner[cl_, m_] := Module[{n = Length[cl], k = Length[m], id, pm},
id = IdentityMatrix[k];
pm = cl[[-1]] id;
Do[
pm = cl[[j]] id + m.pm,
{j, n - 1, 1, -1}];
pm];
minimumPolynomial[A_] := Block[{nlList, nlExp, nNlExp, FA},
nlList = FactorList[CharacteristicPolynomial[A, x]];
nlExp = nlList[[#, 2]] & /@ Range@Length[nlList];
nNlExp = Tuples[Range[nlExp[[#]]] & /@ Range[Length[nlExp]]];
Do[
nlList[[All, 2]] = nNlExp[[i]];
FA = Times @@ Power @@@ nlList;
If[matrixhorner[CoefficientList[FA, x], A] == ConstantArray[0, {Length[A], Length[A]}], Print[TraditionalForm[A], "的`最小多项式:", FA]; Break[]];
, {i, 1, Length[nNlExp]}]
]
使用上面的做一下测试:
A = {{1, 1, 0, -2}, {-2, 1, 3, 2}, {0, 1, 1, -2}, {-2, 0, 3, 3}};
minimumPolynomial[A]
我们可以验证一下:
a = {{1, 1, 0, -2}, {-2, 1, 3, 2}, {0, 1, 1, -2}, {-2, 0, 3, 3}};
(a - IdentityMatrix[4]).MatrixPower[(a - 2*IdentityMatrix[4]), 2] // MatrixForm
可以看到得到的是零矩阵。
a = {{7, 1, 0}, {0, 7, 1}, {0, 0, 7}};
b = {{7, 1}, {0, 7}};
c = {{5, 1}, {0, 5}};
A = ArrayFlatten[{{a, 0, 0, 0}, {0, b, 0, 0}, {0, 0, c, 0}, {0, 0, 0, 5}}];
minimumPolynomial[A]
恩,差不多这段代码可以用,以后要用的时候就直接用就可以了。
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论