最小多项式计算

  • A+
所属分类:Wolfram语言与数学
摘要这里记录一下最小多项式的定义,以及求解最小多项式的方法。最后,会使用mathematica来计算最小多项式,给出代码,方便使用。

这一段代码是我在整理文档的时候发现的,输入是一个矩阵,输出是矩阵的最小多项式,把代码先放在这里,以后用到可以直接使用。

最小多项式介绍

关于最小多项式的介绍,先讲一下我的理解:

根据哈密尔顿—凯莱定理,任给数域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]

恩,差不多这段代码可以用,以后要用的时候就直接用就可以了。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: