0d4470a497465e083b09dedb38abab0899d33c56
[scilab.git] / scilab / modules / ast / macros / %p_p_s.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 f=%p_p_s(p,s)
14     // %p_p_s(p,s)  computes p^s for p polynomial matrix in special cases
15     //!
16
17     if s==[] then f=[],return,end
18     if  or(imag(s)<>0)|or(int(s)<>s) then  error(msprintf(_("%s: Wrong type for input argument #%d: An integer matrix expected.\n"),"%p_p_s",2)),end
19     [m,n]=size(p)
20     [ms,ns]=size(s)
21     if ms==1&ns==1 then
22         if m==1|n==1 then //Element wise exponentiation p.^s with p vector
23             if s<0 then
24                 if or(abs(coeff(p(:)))*ones(max(degree(p))+1,1)==0) then
25                     error(27)
26                 end
27                 f = rlist(ones(p),p.^(-s),[])
28             else // this case is in fact hard coded
29                 f=p.^s
30             end
31         elseif m==n then //square matrix exponentiation p^s
32             if s<0 then
33                 f=invr(p),
34                 s=-s;
35                 f1=f;for k=2:s,f=f*f1;end
36             else
37                 f=p
38                 for k=2:s,f=f*p;end
39             end
40         else
41             error(20,1)
42         end
43     elseif ms==1|ns==1 then // Element wise exponentiation f.^s with f "scalar"
44         if m<>1|n<>1 then error(43),end
45
46         kp=find(s>=0)
47         kn=find(s<0)
48         num=ones(s)
49         den=ones(s)
50         num(kp)=p.^s(kp)
51         if abs(coeff(p))*ones(degree(p)+1,1)==0 then
52             error(27)
53         end
54         den(kn)=p.^(-s(kn))
55         f = rlist(num,den,[])
56     else
57         error(43)
58     end
59
60
61 endfunction