1% test of DUMMY package version 1.1 running in REDUCE 3.6 and 3.7 2% DATE: 15 September 1998 3% Authors: H. Caprasse <hubert.caprasse@ulg.ac.be> 4% 5% Case of commuting operator: 6% 7operator co1,co2; 8 9% declare dummy indices 10 11% first syntax : base <name> 12% 13dummy_base dv; 14 15% dummy indices are dv1, dv2, dv3, ... 16 17exp := co2(dv2)*co2(dv2)$ 18c_exp := canonical(exp); 19 20exp := dv2*co2(dv2)*co2(dv2)$ 21c_exp := canonical(exp); 22 23exp := c_exp * co1(dv3); 24c_exp := canonical(exp); 25 26% 27operator a,aa,dd,te; 28 29clear_dummy_base; 30 31dummy_names a1,a2,b1,b2,mu1,mu2,nu1,nu2; 32 33es1:=a(a1,b1)*a(a2,b2); 34 35asn14:=aa(mu1,a1)*aa(nu2,b2)*dd(nu1,b1,mu2,a2) 36 *te(mu1,mu2,nu1,nu2); 37asn17:=aa(mu1,a1)*aa(mu2,a2)*dd(nu1,b1,nu2,b2) 38 *te(mu1,mu2,nu1,nu2); 39 40esn14:=es1*asn14; 41esn17:=es1*asn17; 42esn:=es1*(asn14+asn17); 43canonical esn; 44% that the next result is correct is not trivial 45% to show. 46% for esn14 changes of names are 47% 48% nu1 -> nu1 49% b1 -> b2 -> a2 50% mu2 -> nu2 -> mu1 -> mu2 51% 52% for esn17 they are 53% 54% nu1 -> nu1 55% nu2 -> nu2 56% b1 -> b2 -> a2 -> a1 -> b1 57% 58% the last result should be zero 59canonical esn -(canonical esn14 +canonical esn17); 60% remove dummy_names and operators. 61clear_dummy_names; 62clear a,aa,dd,te; 63% 64% Case of anticommuting operators 65% 66operator ao1, ao2; 67anticom ao1, ao2; 68% product of anticommuting operators with FREE indices 69a_exp := ao1(s1)*ao1(s2) - ao1(s2)*ao1(s1); 70a_exp := canonical(a_exp); 71 72% the indices are summed upon, i.e. are DUMMY indices 73 74clear_dummy_names; 75 76dummy_base dv; 77 78a_exp := ao1(dv1)*ao1(dv2)$ 79canonical(a_exp); 80 81a_exp := ao1(dv1)*ao1(dv2) - ao1(dv2)*ao1(dv1); 82a_exp := canonical(a_exp); 83 84a_exp := ao1(dv2,dv3)*ao2(dv1,dv2)$ 85a_exp := canonical(a_exp); 86 87a_exp := ao1(dv1)*ao1(dv3)*ao2(dv3)*ao2(dv1)$ 88a_exp := canonical(a_exp); 89 90% Case of non commuting operators 91% 92operator no1, no2, no3; 93noncom no1, no2, no3; 94 95n_exp := no3(dv2)*no2(dv3)*no1(dv1) + no3(dv3)*no2(dv1)*no1(dv2) 96 + no3(dv1)*no2(dv2)*no1(dv3); 97 98n_exp:=canonical n_exp; 99 100% *** 101% The example below displays a restriction of the package i.e 102% The non commuting operators are ASSUMED to COMMUTE with the 103% anticommuting operators. 104% *** 105exp := co1(dv1)*ao1(dv2,dv1,dv4)*no1(dv1,dv5)*co2(dv3)*ao1(dv1,dv3); 106canonical(exp); 107 108exp := c_exp * a_exp * no3(dv2)*no2(dv3)*no1(dv1); 109can_exp := canonical(exp); 110 111% Case where some operators have a symmetry. 112% 113operator as1, as2; 114antisymmetric as1, as2; 115 116dummy_base s; 117 118% With commuting and antisymmetric: 119 120asc_exp:=as1(s1,s2)*as1(s1,s3)*as1(s3,s4)*co1(s3)*co1(s4)+ 121 2*as1(s1,s2)*as1(s1,s3)*as1(s3,s4)*co1(s2)*co1(s4)$ 122 123canonical asc_exp; 124 125% Indeed: the second term is identically zero as one sees 126% if the substitutions s2->s4, s4->s2 and 127% s1->s3, s3->s1 are sucessively done. 128% 129% With anticommuting and antisymmetric operators: 130 131dummy_base dv; 132 133exp1 := ao1(dv1)*ao1(dv2)$ 134canonical(exp1); 135 136exp2 := as1(dv1,dv2)$ 137 138canonical(exp2); 139 140canonical(exp1*exp2); 141 142canonical(as1(dv1,dv2)*as2(dv2,dv1)); 143 144% With symmetric and antisymmetric operators: 145 146operator ss1, ss2; 147symmetric ss1, ss2; 148 149exp := ss1(dv1,dv2)*ss2(dv1,dv2) - ss1(dv2,dv3)*ss2(dv2,dv3); 150canonical(exp); 151 152exp := as1(dv1,dv2)*as1(dv3,dv4)*as1(dv1,dv4); 153canonical(exp); 154 155% The last result is equal to half the sum given below: 156% 157exp + sub(dv2 = dv3, dv3 = dv2, dv1 = dv4, dv4 = dv1, exp); 158 159exp1 := as2(dv3,dv2)*as1(dv3,dv4)*as1(dv1,dv2)*as1(dv1,dv4); 160canonical(exp1); 161 162exp2 := as2(dv1,dv4)*as1(dv1,dv3)*as1(dv2,dv4)*as1(dv2,dv3); 163canonical(exp2); 164 165canonical(exp1-exp2); 166 167% Indeed: 168% 169exp2 - sub(dv1 = dv3, dv2 = dv1, dv3 = dv4, dv4 = dv2, exp1); 170 171% Case where mixed or incomplete symmetries for operators are declared. 172 173% Function 'symtree' can be used to declare an operator symmetric 174% or antisymmetric: 175operator om; 176 177symtree(om,{!+,1,2,3}); 178exp:=om(dv1,dv2,dv3)+om(dv2,dv1,dv3)+om(dv3,dv2,dv1); 179canonical exp; 180 181% Declare om to be antisymmetric in the two last indices ONLY: 182symtree(om,{!*,{!*,1},{!-,2,3}}); 183canonical exp; 184 185% With an antisymmetric operator m: 186operator m; 187dummy_base s; 188exp := om(nu,s3,s4)*i*psi*(m(s1,s4)*om(mu,s1,s3) 189+ m(s2,s3)*om(mu,s4,s2) - m(s1,s3)*om(mu,s1,s4) 190- m(s2,s4)*om(mu,s3,s2))$ 191 192canonical exp; 193 194% Case of the Riemann tensor 195% 196operator r; 197symtree (r, {!+, {!-, 1, 2}, {!-, 3, 4}}); 198% Without anty dummy indices. 199clear_dummy_base; 200 201exp := r(dv1, dv2, dv3, dv4) * r(dv2, dv1, dv4, dv3)$ 202canonical(exp); 203 204% With dummy indices: 205 206dummy_base dv; 207 208canonical( r(x,y,z,t) ); 209canonical( r(x,y,t,z) ); 210canonical( r(t,z,y,x) ); 211 212exp := r(dv1, dv2, dv3, dv4) * r(dv2, dv1, dv4, dv3)$ 213canonical(exp); 214 215exp := r(dv1, dv2, dv3, dv4) * r(dv1, dv3, dv2, dv4)$ 216canonical(exp); 217 218clear_dummy_base; 219dummy_names i,j,k,l; 220 221exp := r(i,j,k,l)*ao1(i,j)*ao1(k,l)$ 222 223canonical(exp); 224 225exp := r(k,i,l,j)*as1(k,i)*as1(k,j)$ 226canonical(exp); 227 228% Cleanup of the previousy declared dummy variables.. 229 230clear_dummy_names; clear_dummy_base; 231 232exp := co1(dv3)$ 233c_exp := canonical(exp); 234 235end; 236