|
用matlab实现的伪余和上述计算:
function coef = polynomial_coef(ply,para)
if ply == 0
coef = [0];
else
coef = sym(zeros(1,10));
ptr = 1;
while(ply ~= 0)
coef(1,ptr) = subs(ply,[para],[0])/gamma(ptr);
ply = diff(ply,para);
ptr = ptr + 1;
end
coef = coef(1:ptr-1);
coef = coef(end:-1:1);
% if coef(1) == 0
% coef = coef(2:end);
% end
end
% f = x^2 + y^2 - z^2 + x*y - 2*y*z + 5;
% g = x - y^2 + z^2 -6*z + y;
% h = x^2 + y.^2/2 +z^2/3 -x*y +1;
% 将函数变成向量:fz = polynomial_coef(f,z)
% 将向量还原成函数:sum(fz.*(z*ones(1,length(fz))).^(length(fz)*ones(1,length(fz)) - cumsum(ones(1,length(fz)))))
function prem = polynomial_prem(F,G,para)
R = F;
hz = polynomial_coef(G,para);
lz =length(hz) - 1;% 算法prem中的l
Q = 0;
R_coef = polynomial_coef(R,para);
while(length(R_coef)-1>=lz)
length(R_coef)-1-lz;
R = expand(hz(1)*R - R_coef(1)*para^(length(R_coef)-1-lz)*G);
Q = expand(hz(1)*Q + R_coef(1)*para^(length(R_coef)-1-lz));
R_coef = polynomial_coef(R,para);
length(R_coef);
end
prem = R;
syms x y z;
P1 = x*y*z - x*y^2 - z - x - y;
P2 = x*z - x^2 - z - y + x;
P3 = z^2 - x^2 - y^2;
%% B0 = {P2},F0 = {P1,P2,P3} ,z<x<y
R01 = polynomial_prem(P1,P2,y);
R02 = polynomial_prem(P3,P2,y);
%% B1 = {P2,R02},F1 = P + B0 + R0 = {P1,P2,P3,R01,R02}
R11 = polynomial_prem(R01,R02,x);% polynomial_prem(polynomial_prem(P1,P2,y),R02,x);
R12 = polynomial_prem(R02,R02,x);% polynomial_prem(polynomial_prem(P3,P2,y),R02,x);%结果是0,摒除
R13 = polynomial_prem(polynomial_prem(R01,P2,y),R02,x);%等于R11(x,z)
%% B2 = {P2(y,x,z),R11(x,z)},F2 = P + B1 + R1 = {P1,P2,P3,R02,R11}
R21 = polynomial_prem(R01,R11,x); % polynomial_prem(polynomial_prem(P1,P2,y),R11,x);
R22 = polynomial_prem(R02,R11,x);% polynomial_prem(polynomial_prem(P3,P2,y),R11,x);
R23 = polynomial_prem(polynomial_prem(R02,P2,y),R11,x);% 等于R22(x,z)
%% B3 = {P2,R22(或)R23},取前者,F3 = P + B2 + R2 = {P1,P2,P3,R11,R21,R22}
R31 = polynomial_prem(polynomial_prem(P1,P2,y),R22,x);
R32 = polynomial_prem(polynomial_prem(P3,P2,y),R22,x);
R33 = polynomial_prem(polynomial_prem(R11,P2,y),R22,x);
R34 = polynomial_prem(polynomial_prem(R21,P2,y),R22,x);% 和R33差一个负号
%% B4 = {P2,R31(或)R32(或)R33},取第一个,F4 = P + B3 + R3 = {P1,P2,P3,R31,R32,R33,R22}
R41 = polynomial_prem(polynomial_prem(P1,P2,y),R31,x);
R42 = polynomial_prem(polynomial_prem(P3,P2,y),R31,x);
R43 = polynomial_prem(polynomial_prem(R32,P2,y),R31,x);
R44 = polynomial_prem(polynomial_prem(R33,P2,y),R31,x);
R45 = polynomial_prem(polynomial_prem(R22,P2,y),R31,x);
%% 至此 R4 = {空集},直接得到特征列B4
%% 注意到B4中选取三个基列是等价的,但是宜选取对于x相等次数下z次数较低的,便于验证根的正确性.
|
|