#  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: e5:=0: f5:=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^4*gamm[i])/360:
      Newb5 := b5 + (a1*a3*gamm[i])/6 - (a1^3*b1*gamm[i])/360 
	    + (a1^3*gamm[i]^2)/90:
      Newc5 := c5 - (a1*a3*gamm[i])/3 - (a1^3*b1*gamm[i])/180 
	    - (a1^3*gamm[i]^2)/30:
      Newd5 := d5 - (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:
      Newe5 := e5 - (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:
      Newf5 := f5 - (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:

      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 )):

#
#     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 - (a1*a3*xi[i])/6 + (a1^3*b1*xi[i])/360 
	    - (a3*xi[i]^2)/6 + (a1^2*b1*xi[i]^2)/45 
	    + (7*a1*b1*xi[i]^3)/180 + (7*b1*xi[i]^4)/360:
      Newb5 := b5 - (a3*b1*xi[i])/3 + (a1^2*b1^2*xi[i])/360 
	    + (a1*b1^2*xi[i]^2)/30 + (b1^2*xi[i]^3)/45:
      Newc5 := c5 + (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:
      Newd5 := d5 + (a1*b1^3*xi[i])/360 + (b1*b3*xi[i])/6 
	    - (b1^3*xi[i]^2)/90:
      Newe5 := e5 + (a1*b1^3*xi[i])/180 - (b1*b3*xi[i])/3 
	    + (b1^3*xi[i]^2)/30:
      Newf5 := f5 + (b1^4*xi[i])/360:

      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 )):
od:

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

for i from 1 to 8 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:
