%all--得到矩阵A的smith标准型、行列式因子、初等因子、不变因子、最小多项式和jordan标准型
A = input('A = '); %获取矩阵A
n = size(A,1); %将矩阵A的行数赋值给n
syms x; %声明变量x
E = eye(n); %E为n阶的单位矩阵
C = x*E-A; %C为矩阵A的特征矩阵
%1---求lambda矩阵的行列式因子(开始)
h = [];
for k = 1:n
y = [];
%从n个元素(第一个元素到第n个元素的所有元素)中取出k项,其中所有可能的组合放在p中(组合数)
p = nchoosek(1:n,k);
q = p;
m = size(p,1);
%1-b将所有的i阶行列式求出
for i = 1:m
a = p(i,:);
for j = 1:m
b = q(j,:);
B = [];
for s = 1:k
g = [];
for t = 1:k
g = [g,C(a(s),b(t))];
end
B=[B;g];
end
if det(B) ~= 0
y = [y,det(B)];
end
end
end
%1-b结束
o = size(y,2);
%1-a--求所有j阶行列式的最大公因子(开始)
for j = 1:o-1
y(j+1) = gcd(y(j),y(j+1));
end
%1-a--结束
h = [h,y(o)];
end
%1---求lambda矩阵的行列式因子(结束)
d = [];
d = [d,h(1)];
for i = 2:n
% d = [d,factor(h(i)/h(i-1))];
d = [d,expand(h(i)/h(i-1))];
end
%2---将上面所求行列式因子进行因式分解,得到因式分解后的行列式因子
k = size(h,2);
for i = 1:k
t = h(i);
t = factor(t);
l = size(t,2);
h(i)=1;
for j = 1:l
h(i) = h(i)*t(j);
end
end
%2---结束
%3---将上面所求不变因子进行因式分解,得到因式分解后的不变因子
k = size(d,2);
for i = 1:k
t = d(i);
t = factor(t);
l = size(t,2);
d(i)=1;
for j = 1:l
d(i) = d(i)*t(j);
end
end
%3---结束
min_poly = d(k); %由定理知,在A为n*n的矩阵中,A的最小多项式为A的第n个不变因子dn(lambda)
%4---求初等因子(通过不变因子得到初等因子)
%5---将不变因子的每一项分别进行因式分解
%(把每一项中因式分解中相同的元素相乘,不相同的元素分离,分别放在统一数组的不同位置)
u = size(d,2);
y = [];
for r = 1:u
a = d(r);
a = factor(a);
b = unique(a);
n = size(a,2);
m = size(b,2);
c= [];
for i = 1:m
k = 0;
for j = 1:n
if (b(i) == a(j))
k = k+1;
end
end
c = [c,b(i).^k];
end
y = [y,c];
end
%5--结束
%6---将上面不变因子因式分解又组合后的数组中的1剔除,便的到了初等因子
s = size(y,2);
for v = s:-1:1
if y(v) == 1
y(v) = [];
end
end
%6---结束
%4---结束
smith = diag(d);
j = jordan(A);
fprintf("smith标准型为:\n");
smith
fprintf("行列式因子为:\n");
h
fprintf("不变因子为:\n");
d
fprintf("初等因子为:\n");
y
fprintf("最小多项式为:\n");
min_poly
fprintf("jordan标准型为:\n");
j
%all---结束