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