Algoritmo para la
División de Polinomios en Matlab
hay un método para dividir
polinomios llamado "División Larga" en el cual se basan ciertas
igualdades con series de sumas infinitas de series de potencias.
Por ejemplo esta serie:
1/(1 - x) = 1 + x + x2 + x3
+ ...
Para hacer esta división
los polinomios se deben ordenar de menor a mayor grado, en el caso de una
división simple como (x2+2x+1)/(x+1) se coloca de esta forma:

Sí, el numerador y el
denominador se colocan al revés de cómo normalmente se colocan al hacer la
división. Bueno así nos enseñó el profe de PDS y así está basado el
algoritmo...
Para el primer término (en
este caso el de menor grado) del cociente se divide el término de menor grado
del numerador entre el término de menor grado del denominador:

Luego se multiplica el
denominador por eeste primer término del cociente y se resta al numerador:
(1+2x+x2)-(1+x)=x+x2
por lo que la nueva
división será entre:

Y se vuelve a dividir el
término de menor grado del nuevo numerador entre el término de menor grado del
denominador:

Luego se multiplica el
denominador por el término del cociente recién calculado (en verde) y se resta
al numerador:
(x+x2)-(x+x2)=0
Esto se repite hasta que ya
no queda numerador. El coeficiente se obtiene término a término y en este
punto ya lo tenemos.
En el caso de 1/(1-x) se
generará una suma polinómica infinita pues siempre habrá numerador con el
qué dividir.
He aquí el algoritmo ya
comentado:
%Algoritmo para realizar la "División Larga"
%programado por Yelinna Pulliti Carrasco
%https://toyscaos.tripod.com/eam.html
ex = input('ingresar el mayor grado de los polinomios: ');
% si se tiene por ejemplo (0.5-3x^2)/(2 + x + x^3) se debera ingresar 3
Hd = zeros(1,30); %contendra los coeficientes del denominador
Hn = zeros(1,30); %contendra los coeficientes del numerados
Hc= zeros(1,30); %contendra los coeficientes del cociente
% la longitud de estos vectores puede hacerse mas o menos larga a
% conveniencia, he puesto arbitrariamente 30 pero puede ser cualquier
% numero, esto es porque hay divisiones polinomicas que generan sumas
% infinitas.
Hn(1)= input('ingrese el termino independiente del numerador: '); % para el ejemplo anterior seria 0.5
while Hn(1) ==0 %si este termino es cero, el polinomio no es irreductible
Hn(1)= input('dato no valido, debe ser diferente de 0. Ingrese otro valor: ') ;
end;
for k = 2:ex+1
Hn(k) = input(strcat('ingrese el ', int2str(k-1), '° coeficiente del numerador: '));
end; % en el caso del numerador los numeros a ingresar son: 0.5 , 0 y -3
disp('2do polinomio: ');
Hd(1)= input('ingrese el termino independiente del denominador: '); % para el ejemplo seria 2
while Hd(1) ==0
Hd(1)= input('dato no valido, debe ser diferente de 0. Ingrese otro valor: ') ;
end;
for k = 2:ex+1
Hd(k) = input(strcat('ingrese el ', int2str(k-1), '° coeficiente del denominador: '));
end; % en el caso del denominador los numeros a ingresar son: 1 , 0 y 1
% este algoritmo se deduce del metodo para dividir polinomios que genera
% sumas infinitas si el resultado no es exacto, por ello nunca se generara
% un residuo. Este tipo de division es muy util en el caso que se tengan
% que generar series de potencias y se conoce como "División larga"
% Recomiendo probarlo con 1/(1-x) y haciendo que la longitud de los
% vectores Hn, Hc y Hd sea mucho mayor.
Hc(1) = Hn(1)/Hd(1);
for i=2:length(Hn)
Hn(i-1)=0; kk= 2;
for j=i:length(Hn)
Hn(j) = Hn(j)-Hc(i-1)*Hd(kk);
kk= kk+1;
end;
Hc(i) = Hn(i)/Hd(1);
end;
disp('Los sumandos del cociente son: ');
for i = 1:length(Hc)
if Hc(i)==0
continue;
else
disp(strcat(int2str(Hc(i)), 'x^', int2str(i-1) ));
end;
end; |
La condición es que el denominador y
tenga un término independiente, es preferible que numerador y denominador sean
irreductibles.
