#  Approximate exp(t X+t Y) by
#
#   exp(xi t X) exp( gamm t Y) ... exp(xi   tX) .... exp(gamm t Y) exp(xi t X)
#         1              1               m+1                  1           1
#
#  It has (m+1)+m free parameters xi_1, ..., xi_{m+1} and gamm_1, ..., gamm_m
#
#  This is the same with s21odr6 except xi_1=0.
#
#                           Ren-Cang Li, June 1, 1996
#                           na.rcli@na-net.ornl.gov

with(linalg): 
m := 4:
cxs:=vector(2*m+1,[0,cx[1],cx[2],cx[3],1-cx[3],1-cx[2],1-cx[1],1,1]): 

# Notice: the index of cx[i] here differs from cx_j in Ren-Cang Li's
# thesis by 1, i.e., cx_{i+1} (thesis) = cx[i] (here) and cx_1 (thesis) = 0.

cys:=vector(2*m,[cy[1],cy[2],cy[3],1/2,1-cy[3],1-cy[2],1-cy[1],1]):
#
#
xi[1]:=cxs[1]: gamm[1]:=cys[1]:
for i from 2 to m do
    xi[i]:=cxs[i]-cxs[i-1]: gamm[i]:=cys[i]-cys[i-1]:
od:
xi[m+1]:=cxs[m+1]-cxs[m]:

#  Get exp(xi   t X)
#            m+1

a1:=xi[m+1]: b1:=0:
a3:=0: b3:=0:
a5:=0: b5:=0: c5:=0: d5:=0: 
a7:=0: b7:=0: c7:=0: d7:=0: e7:=0: 
f7:=0: g7:=0: h7:=0: i7:=0: j7:=0: 
#
# Successive applications
#
  for i from m by -1 to 1 do
#
#     exp(gamm t Y) (***) exp(gamm t Y)
#             i                   i
#
     Newa1 := a1;
     Newb1 := b1 + 2*gamm[i];
     Newa3 := a3 + (a1^2*gamm[i])/6;
     Newb3 := b3 + (a1*b1*gamm[i])/6 + (a1*gamm[i]^2)/6;
     Newa5 := a5 - (a1*a3*gamm[i])/3 - (a1^3*b1*gamm[i])/180 
		 - (a1^3*gamm[i]^2)/30;
     Newb5 := b5 - (a1^2*b1^2*gamm[i])/360 - (a1*b3*gamm[i])/3 
		 - (a1^2*b1*gamm[i]^2)/30 - (a1^2*gamm[i]^3)/45;
     Newc5 := c5 - (a3*b1*gamm[i])/6 - (a1^2*b1^2*gamm[i])/180 
		 + (a1*b3*gamm[i])/6 - (a3*gamm[i]^2)/6 
		 - (a1^2*b1*gamm[i]^2)/90 - (a1^2*gamm[i]^3)/60;
     Newd5 := d5 - (a1*b1^3*gamm[i])/360 - (b1*b3*gamm[i])/6 
		 - (a1*b1^2*gamm[i]^2)/45 - (b3*gamm[i]^2)/6 
		 - (7*a1*b1*gamm[i]^3)/180 - (7*a1*gamm[i]^4)/360;
     Newa7 := a7 + (a3^2*gamm[i])/6 - (a1*a5*gamm[i])/3 
		 + (a1^2*a3*b1*gamm[i])/60 + (a1^4*b1^2*gamm[i])/3780 
		 - (a1^3*b3*gamm[i])/180 + (a1^2*a3*gamm[i]^2)/10 
		 + (a1^4*b1*gamm[i]^2)/420 + (a1^4*gamm[i]^3)/140;
     Newb7 := b7 - (a3^2*gamm[i])/9 + (a1*a5*gamm[i])/9 
		 - (a1^2*a3*b1*gamm[i])/135 + (a1^4*b1^2*gamm[i])/45360 
		 + (a1^3*b3*gamm[i])/135 - (2*a1^2*a3*gamm[i]^2)/45 
		 - (a1^4*b1*gamm[i]^2)/3780 - (a1^4*gamm[i]^3)/378;
     Newc7 := c7 - (a1*a3*b1^2*gamm[i])/180 - (a1^3*b1^3*gamm[i])/15120 
		 - (a3*b3*gamm[i])/3 + (a1*c5*gamm[i])/3 
		 - (a1*a3*b1*gamm[i]^2)/15 - (a1^3*b1^2*gamm[i]^2)/630 
		 - (2*a1*a3*gamm[i]^3)/45 - (11*a1^3*b1*gamm[i]^3)/1890 
		 - (a1^3*gamm[i]^4)/210;
     Newd7 := d7 + (a1*a3*b1^2*gamm[i])/90 + (a1^3*b1^3*gamm[i])/3024 
		 + (2*a3*b3*gamm[i])/3 + (a1^2*b1*b3*gamm[i])/90 
		 - (a1*b5*gamm[i])/3 - (2*a1*c5*gamm[i])/3 
		 + (2*a1*a3*b1*gamm[i]^2)/15 + (13*a1^3*b1^2*gamm[i]^2)/2520 
		 + (a1^2*b3*gamm[i]^2)/15 + (4*a1*a3*gamm[i]^3)/45 
		 + (17*a1^3*b1*gamm[i]^3)/945 + (4*a1^3*gamm[i]^4)/315;
     Newe7 := e7 + (a5*b1*gamm[i])/18 - (7*a1*a3*b1^2*gamm[i])/1080 
		 + (a1^3*b1^3*gamm[i])/45360 - (2*a3*b3*gamm[i])/9 
		 + (a1^2*b1*b3*gamm[i])/180 + (a1*b5*gamm[i])/6 
		 + (a5*gamm[i]^2)/18 - (11*a1*a3*b1*gamm[i]^2)/270 
		 - (a1^3*b1^2*gamm[i]^2)/2520 - (11*a1^2*b3*gamm[i]^2)/270 
		 - (a1*a3*gamm[i]^3)/30 - (13*a1^3*b1*gamm[i]^3)/2520 
		 - (a1^3*gamm[i]^4)/252;
     Newf7 := f7 - (a5*b1*gamm[i])/6 + (a1*a3*b1^2*gamm[i])/90 
		 + (a1^3*b1^3*gamm[i])/3780 - (a3*b3*gamm[i])/6 
		 - (a1^2*b1*b3*gamm[i])/90 + (a1*c5*gamm[i])/6 
		 - (a5*gamm[i]^2)/6 + (a1*a3*b1*gamm[i]^2)/45 
		 + (a1^3*b1^2*gamm[i]^2)/1260 - (a1^2*b3*gamm[i]^2)/90 
		 + (a1*a3*gamm[i]^3)/30 + (a1^3*b1*gamm[i]^3)/504 
		 + (a1^3*gamm[i]^4)/420;
     Newg7 := g7 + (a1^2*b1^4*gamm[i])/15120 + (a1*b1^2*b3*gamm[i])/180 
		 + (b3^2*gamm[i])/6 - (a1*d5*gamm[i])/3 
		 + (a1^2*b1^3*gamm[i]^2)/840 + (a1*b1*b3*gamm[i]^2)/15 
		 + (23*a1^2*b1^2*gamm[i]^3)/3780 + (2*a1*b3*gamm[i]^3)/45 
		 + (a1^2*b1*gamm[i]^4)/126 + (a1^2*gamm[i]^5)/315 ;
     Newh7 := h7 - (a3*b1^3*gamm[i])/360 - (a1^2*b1^4*gamm[i])/15120 
		 - (b3^2*gamm[i])/3 + (b1*c5*gamm[i])/6 + (a1*d5*gamm[i])/6 
		 - (a3*b1^2*gamm[i]^2)/45 - (a1^2*b1^3*gamm[i]^2)/840 
		 - (a1*b1*b3*gamm[i]^2)/18 + (c5*gamm[i]^2)/6 
		 - (7*a3*b1*gamm[i]^3)/180 - (53*a1^2*b1^2*gamm[i]^3)/7560 
		 - (a1*b3*gamm[i]^3)/36 - (7*a3*gamm[i]^4)/360 
		 - (37*a1^2*b1*gamm[i]^4)/3780 - (23*a1^2*gamm[i]^5)/5040 ;
     Newi7 := i7 + (a3*b1^3*gamm[i])/180 + (a1^2*b1^4*gamm[i])/3024 
		 + (a1*b1^2*b3*gamm[i])/360 + (b3^2*gamm[i])/6 
		 - (b1*b5*gamm[i])/6 - (b1*c5*gamm[i])/3 
		 + (2*a3*b1^2*gamm[i]^2)/45 + (a1^2*b1^3*gamm[i]^2)/315 
		 + (a1*b1*b3*gamm[i]^2)/30 - (b5*gamm[i]^2)/6 
		 - (c5*gamm[i]^2)/3 + (7*a3*b1*gamm[i]^3)/90 
		 + (173*a1^2*b1^2*gamm[i]^3)/15120 + (a1*b3*gamm[i]^3)/45 
		 + (7*a3*gamm[i]^4)/180 + (59*a1^2*b1*gamm[i]^4)/3780 
		 + (19*a1^2*gamm[i]^5)/2520 ;
     Newj7 := j7 + (a1*b1^5*gamm[i])/15120 + (b1^3*b3*gamm[i])/360 
		 - (b1*d5*gamm[i])/6 + (a1*b1^4*gamm[i]^2)/1260 
		 + (b1^2*b3*gamm[i]^2)/45 - (d5*gamm[i]^2)/6 
		 + (53*a1*b1^3*gamm[i]^3)/15120 + (7*b1*b3*gamm[i]^3)/180 
		 + (13*a1*b1^2*gamm[i]^4)/1890 + (7*b3*gamm[i]^4)/360 
		 + (31*a1*b1*gamm[i]^5)/5040 + (31*a1*gamm[i]^6)/15120 ;

      a1:=simplify(expand( Newa1 )):
      b1:=simplify(expand( Newb1 )):

      a3:=simplify(expand( Newa3 )): 
      b3:=simplify(expand( Newb3 )):

      a5:=simplify(expand( Newa5 )): 
      b5:=simplify(expand( Newb5 )):
      c5:=simplify(expand( Newc5 )):
      d5:=simplify(expand( Newd5 )):
      e5:=simplify(expand( Newe5 )):
      f5:=simplify(expand( Newf5 )):

      a7:=simplify(expand( Newa7 )): 
      b7:=simplify(expand( Newb7 )):
      c7:=simplify(expand( Newc7 )):
      d7:=simplify(expand( Newd7 )):
      e7:=simplify(expand( Newe7 )):
      f7:=simplify(expand( Newf7 )):
      g7:=simplify(expand( Newg7 )):
      h7:=simplify(expand( Newh7 )):
      i7:=simplify(expand( Newi7 )):
      j7:=simplify(expand( Newj7 )):
      k7:=simplify(expand( Newk7 )):
      l7:=simplify(expand( Newl7 )):
      m7:=simplify(expand( Newm7 )):
      n7:=simplify(expand( Newn7 )):
      o7:=simplify(expand( Newo7 )):
      p7:=simplify(expand( Newp7 )):
      q7:=simplify(expand( Newq7 )):
      r7:=simplify(expand( Newr7 )):
#
#     exp( xi t X) (***) exp( xi t X)
#            i                  i
#
     Newa1 := a1 + 2*xi[i];
     Newb1 := b1;
     Newa3 := a3 - (a1*b1*xi[i])/6 - (b1*xi[i]^2)/6;
     Newb3 := b3 - (b1^2*xi[i])/6;
     Newa5 := a5 + (a3*b1*xi[i])/6 + (a1^2*b1^2*xi[i])/180 
		 - (a1*b3*xi[i])/6 + (a1*b1^2*xi[i]^2)/90 
		 - (b3*xi[i]^2)/6 + (b1^2*xi[i]^3)/60;
     Newb5 := b5 + (a1*b1^3*xi[i])/360 + (b1*b3*xi[i])/6 - (b1^3*xi[i]^2)/90;
     Newc5 := c5 + (a1*b1^3*xi[i])/180 - (b1*b3*xi[i])/3 + (b1^3*xi[i]^2)/30;
     Newd5 := d5 + (b1^4*xi[i])/360;
     Newa7 := a7 + (a5*b1*xi[i])/6 - (a1*a3*b1^2*xi[i])/90 
	         - (a1^3*b1^3*xi[i])/3780 + (a3*b3*xi[i])/6 
		 + (a1^2*b1*b3*xi[i])/90 - (a1*c5*xi[i])/6 
		 - (a3*b1^2*xi[i]^2)/90 - (a1^2*b1^3*xi[i]^2)/1260 
		 + (a1*b1*b3*xi[i]^2)/45 - (c5*xi[i]^2)/6 
		 - (a1*b1^3*xi[i]^3)/504 + (b1*b3*xi[i]^3)/30 
		 - (b1^3*xi[i]^4)/420;
     Newb7 := b7 - (a5*b1*xi[i])/18 + (7*a1*a3*b1^2*xi[i])/1080 
		 - (a1^3*b1^3*xi[i])/45360 - (a3*b3*xi[i])/9 
		 - (a1^2*b1*b3*xi[i])/180 - (a1*b5*xi[i])/6 
		 + (a3*b1^2*xi[i]^2)/90 - (a1^2*b1^3*xi[i]^2)/1890 
		 - (a1*b1*b3*xi[i]^2)/90 - (b5*xi[i]^2)/6 
		 - (13*a1*b1^3*xi[i]^3)/15120 - (b1*b3*xi[i]^3)/60 
		 + (b1^3*xi[i]^4)/3780;
     Newc7 := c7 + (a3*b1^3*xi[i])/360 + (a1^2*b1^4*xi[i])/15120 
		 - (b3^2*xi[i])/6 - (b1*c5*xi[i])/6 - (a1*b1^4*xi[i]^2)/1260 
		 + (b1^2*b3*xi[i]^2)/18 - (19*b1^4*xi[i]^3)/5040 
		 - (a1*xi[i]*d5)/6 - (xi[i]^2*d5)/6;
     Newd7 := d7 - (a3*b1^3*xi[i])/180 - (a1^2*b1^4*xi[i])/3024 
		 - (a1*b1^2*b3*xi[i])/360 + (b3^2*xi[i])/3 + (b1*b5*xi[i])/6 
		 + (b1*c5*xi[i])/3 + (a1*b1^4*xi[i]^2)/840 
		 - (b1^2*b3*xi[i]^2)/10 + (2*b1^4*xi[i]^3)/315;
     Newe7 := e7 + (a3*b1^3*xi[i])/180 - (a1^2*b1^4*xi[i])/45360 
		 - (a1*b1^2*b3*xi[i])/270 - (b3^2*xi[i])/18 
		 - (b1*b5*xi[i])/3 - (a1*b1^4*xi[i]^2)/1512 
		 - (b1^2*b3*xi[i]^2)/45 + (b1^4*xi[i]^3)/1260 ;
     Newf7 := f7 - (a3*b1^3*xi[i])/180 - (a1^2*b1^4*xi[i])/3780 
		 + (a1*b1^2*b3*xi[i])/60 - (b3^2*xi[i])/6 - (b1*c5*xi[i])/3 
		 - (a1*b1^4*xi[i]^2)/420 + (b1^2*b3*xi[i]^2)/10 
		 - (b1^4*xi[i]^3)/140 ;
     Newg7 := g7 - (a1*b1^5*xi[i])/15120 - (b1^3*b3*xi[i])/360 
		 + (b1^5*xi[i]^2)/2520 + (b1*xi[i]*d5)/6 ;
     Newh7 := h7 + (a1*b1^5*xi[i])/15120 - (b1^5*xi[i]^2)/2520 - (b1*xi[i]*d5)/3 ;
     Newi7 := i7 - (a1*b1^5*xi[i])/3024 + (b1^3*b3*xi[i])/180 
		 - (b1^5*xi[i]^2)/1260 ;
     Newj7 := j7 - (b1^6*xi[i])/15120 ;
    
      a1:=simplify(expand( Newa1 )):
      b1:=simplify(expand( Newb1 )):

      a3:=simplify(expand( Newa3 )): 
      b3:=simplify(expand( Newb3 )):

      a5:=simplify(expand( Newa5 )): 
      b5:=simplify(expand( Newb5 )):
      c5:=simplify(expand( Newc5 )):
      d5:=simplify(expand( Newd5 )):
      e5:=simplify(expand( Newe5 )):
      f5:=simplify(expand( Newf5 )):

      a7:=simplify(expand( Newa7 )): 
      b7:=simplify(expand( Newb7 )):
      c7:=simplify(expand( Newc7 )):
      d7:=simplify(expand( Newd7 )):
      e7:=simplify(expand( Newe7 )):
      f7:=simplify(expand( Newf7 )):
      g7:=simplify(expand( Newg7 )):
      h7:=simplify(expand( Newh7 )):
      i7:=simplify(expand( Newi7 )):
      j7:=simplify(expand( Newj7 )):
      k7:=simplify(expand( Newk7 )):
      l7:=simplify(expand( Newl7 )):
      m7:=simplify(expand( Newm7 )):
      n7:=simplify(expand( Newn7 )):
      o7:=simplify(expand( Newo7 )):
      p7:=simplify(expand( Newp7 )):
      q7:=simplify(expand( Newq7 )):
      r7:=simplify(expand( Newr7 )):
od:

 f[1]:=a3:  f[2]:=b3:
 f[3]:=a5:  f[4]:=b5:  f[5]:=c5:  f[6]:=d5:  

for i from 1 to 6 do
    for j from 1 to m-1 do
        g[i][j]     := diff(f[i],cx[j]):
        g[i][m+j-1] := diff(f[i],cy[j]):
    od:
od:
