afa5d509a86b22577f395f34d1be83c5d9985afe
[scilab.git] / scilab / modules / overloading / macros / %r_m_p.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [f1]=%r_m_p(f1,n2)
14     // r=%r_m_p(f1,n2)  <=> r=f1*n2
15     // f1=rational n2=polynomial
16     //!
17
18     [n1,d1]=f1(["num","den"]),
19     [l1,m1]=size(n1);[l2,m2]=size(n2),
20     //
21     indef=%f
22     if l1==-1 then
23         n1=n1+0;d1=d1+0;l1=1;m1=1;
24         if l2*m2==1 then indef=%t,else error(14),end
25     end
26     if l2==-1 then
27         n2=n2+0;l2=1;m2=1;
28         if l1*m1==1 then indef=%t,else error(14),end
29     end
30     if min([l1*m1,l2*m2])==1 then,
31         num=n1*n2,
32         den=d1*ones(l2,m2),
33     else,
34         if m1<>l2 then error(10),end,
35         for i=1:l1,
36             n=n1(i,:);
37             [y,fact]=lcm(d1(i,:)),
38             den(i,1:m2)=ones(1,m2)*y,
39             for j=1:m2,
40                 num(i,j)=n*(n2(:,j).*matrix(fact,l2,1)),
41             end,
42         end,
43     end,
44     if ndims(num)<=2 then
45         [num,den]=simp(num,den),
46     else
47         sz=size(num)
48         [num,den]=simp(num(:),den(:)),
49         num=matrix(num,sz)
50         den=matrix(den,sz)
51     end
52     if indef then
53         num=num*eye()
54         den=den*eye()
55     end
56     f1=rlist(num,den,f1("dt"))
57 endfunction