(*                         Ren-Cang Li, June 1, 1996
                           na.rcli@na-net.ornl.gov    *)

(* Initialization and Rules *)
Cmt[x_,x_]:=0; 
Cmt[a___, 0,             b___] :=     0; 
Cmt[a___, x_+y_,         b___] :=     Cmt[a,x,b]+Cmt[a,y,b];
Cmt[a___, n_ x_Cmt,      b___] := n   Cmt[a,x,b];
Cmt[a___, n_?NumberQ x_, b___] := n   Cmt[a,x,b];
Cmt[a___, t^n_ x_,       b___] := t^n Cmt[a,x,b];
Cmt[a___, x_ y_,         b___] :=     Cmt[a,Expand[x y],b];
Cmt[a___, n_ X[i_],      b___] := n   Cmt[a,X[i],b]; 

DEGREE=11;
termaction[xx]:=x; termaction[yy]:=y;
termaction[n_?NumberQ x_]:=n termaction[x];
termaction[x_Cmt]:=Expand[Normal[Series[Cmt[termaction[x[[1]]],
                                   termaction[x[[2]]]],{t,0,DEGREE}]]];

Cmt[X[3],X[1]]:=-Cmt[X[1],X[3]];
Cmt[X[5],X[1]]:=-Cmt[X[1],X[5]];
Cmt[X[7],X[1]]:=-Cmt[X[1],X[7]];
Cmt[X[9],X[1]]:=-Cmt[X[1],X[9]];
Cmt[X[5],X[3]]:=-Cmt[X[3],X[5]];
Cmt[X[7],X[3]]:=-Cmt[X[3],X[7]];

Cmt[X[3],Cmt[X[1],Cmt[X[1],X[3]]]]:=Cmt[X[1],Cmt[X[3],Cmt[X[1],X[3]]]];

Cmt[X[5],Cmt[X[1],Cmt[X[1],Cmt[X[1],X[3]]]]]:=Expand[
                -  Cmt[X[1],Cmt[X[1],Cmt[X[1],Cmt[X[3],X[5]]]]]
                +  Cmt[X[3],Cmt[X[1],Cmt[X[1],Cmt[X[1],X[5]]]]]
                -3 Cmt[X[1],Cmt[X[3],Cmt[X[1],Cmt[X[1],X[5]]]]]
                +3 Cmt[X[1],Cmt[X[1],Cmt[X[3],Cmt[X[1],X[5]]]]] ];

Cmt[X[5],Cmt[X[1],Cmt[X[1],X[3]]]]:=Expand[
     -   Cmt[X[1],Cmt[X[1],Cmt[X[3],X[5]]]]
     -   Cmt[X[3],Cmt[X[1],Cmt[X[1],X[5]]]] 
     + 2 Cmt[X[1],Cmt[X[3],Cmt[X[1],X[5]]]] ];

Cmt[X[1],Cmt[X[1],Cmt[X[1],Cmt[X[3],Cmt[X[1],X[3]]]]]]:=Expand[
     -   Cmt[X[3],Cmt[X[1],Cmt[X[1],Cmt[X[1],Cmt[X[1],X[3]]]]]] 
     + 2 Cmt[X[1],Cmt[X[3],Cmt[X[1],Cmt[X[1],Cmt[X[1],X[3]]]]]] ];

Cmt[x_Cmt,X[i_]]:=-Cmt[X[i],x];
Cmt[x_Cmt,Cmt[X[i_],X[j_]]]:=-Cmt[X[i],Cmt[X[j],x]]-Cmt[X[j],Cmt[x,X[i]]];
Cmt[Cmt[X[i_],X[j_]],z_Cmt]:=-Cmt[Cmt[X[j],z],X[i]]-Cmt[Cmt[z,X[i]],X[j]];

Cmt[X[5],Cmt[X[1],X[3]]]:=-Cmt[X[1],Cmt[X[3],X[5]]]-Cmt[X[3],Cmt[X[5],X[1]]];
Cmt[X[7],Cmt[X[1],X[3]]]:=-Cmt[X[1],Cmt[X[3],X[7]]]-Cmt[X[3],Cmt[X[7],X[1]]];

<<DefFun;

Print["Compute term1"]
y=( t    a1    X[1]
   +t^3  a3    X[3] 
   +t^5  a5    X[5]
   +t^5  b5  b5Cmt
   +t^7  a7    X[7]
   +t^7  b7  b7Cmt
   +t^7  c7  c7Cmt
   +t^7  d7  d7Cmt
   +t^9  a9    X[9]
   +t^9  b9  b9Cmt
   +t^9  c9  c9Cmt
   +t^9  d9  d9Cmt
   +t^9  e9  e9Cmt
   +t^9  f9  f9Cmt
   +t^9  g9  g9Cmt
   +t^9  h9  h9Cmt
   +t^11 a11   X[11]
   +t^11 b11 b11Cmt
   +t^11 c11 c11Cmt
   +t^11 d11 d11Cmt
   +t^11 e11 e11Cmt
   +t^11 f11 f11Cmt
   +t^11 g11 g11Cmt
   +t^11 h11 h11Cmt
   +t^11 i11 i11Cmt
   +t^11 j11 j11Cmt
   +t^11 k11 k11Cmt
   +t^11 l11 l11Cmt
   +t^11 m11 m11Cmt
   +t^11 n11 n11Cmt
   +t^11 o11 o11Cmt
   +t^11 p11 p11Cmt
   +t^11 q11 q11Cmt
   +t^11 r11 r11Cmt );
x= d t X[1] + d^3 t^3 X[3] + d^5 t^5 X[5] + d^7 t^7 X[7] + 
              d^9 t^9 X[9] + d^11 t^11 X[11];
term1=Expand[nc1[x,y]];
(* Save["b1rec",term1]; *)

Print["Compute term3"]
y=Expand[Normal[Series[y,{t,0,DEGREE-2}]]];
x=Normal[Series[x,{t,0,DEGREE-2}]];
term3=Expand[Normal[Series[nc3[x,y],{t,0,DEGREE}]]];
(* Save["b3rec",term3]; *)

Print["Compute term5"]
y=Expand[Normal[Series[y,{t,0,DEGREE-4}]]];
x=Normal[Series[x,{t,0,DEGREE-4}]];
tmp=Expand[nc5[xx,yy]]; LL=Length[tmp]; term5=0;
Do[{tmp1=tmp[[i]]; term5=term5+termaction[tmp1]},{i,LL}];
term5=Expand[term5];
(* Save["b5rec",term5]; *)

Print["Compute term7"]
y=Expand[Normal[Series[y,{t,0,DEGREE-6}]]];
x=Normal[Series[x,{t,0,DEGREE-6}]];
tmp=Expand[nc7[xx,yy]]; LL=Length[tmp]; term7=0;
Do[{tmp1=tmp[[i]]; term7=term7+termaction[tmp1]},{i,LL}];
term7=Expand[term7];
(* Save["b7rec",term7]; *)

Print["Compute term9"]
y=Expand[Normal[Series[y,{t,0,DEGREE-8}]]];
x=Normal[Series[x,{t,0,DEGREE-8}]];
tmp=Expand[nc9[xx,yy]]; LL=Length[tmp]; term9=0;
Do[{tmp1=tmp[[i]]; term9=term9+termaction[tmp1]},{i,LL}];
term9=Expand[term9];
(* Save["b9rec",term9]; *)
