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
10
11% declare dummy indices
12
13% first syntax : base <name>
14%
15dummy_base dv;
16
17
18dv
19
20
21% dummy indices are dv1, dv2, dv3, ...
22
23exp := co2(dv2)*co2(dv2)$
24
25
26c_exp := canonical(exp);
27
28
29                 2
30c_exp := co2(dv1)
31
32
33exp := dv2*co2(dv2)*co2(dv2)$
34
35
36c_exp := canonical(exp);
37
38
39                 2
40c_exp := co2(dv1) *dv1
41
42
43exp := c_exp * co1(dv3);
44
45
46                        2
47exp := co1(dv3)*co2(dv1) *dv1
48
49c_exp := canonical(exp);
50
51
52                          2
53c_exp := co1(dv2)*co2(dv1) *dv1
54
55
56%
57operator a,aa,dd,te;
58
59
60
61clear_dummy_base;
62
63
64t
65
66
67dummy_names a1,a2,b1,b2,mu1,mu2,nu1,nu2;
68
69
70t
71
72
73es1:=a(a1,b1)*a(a2,b2);
74
75
76es1 := a(a1,b1)*a(a2,b2)
77
78
79asn14:=aa(mu1,a1)*aa(nu2,b2)*dd(nu1,b1,mu2,a2)
80         *te(mu1,mu2,nu1,nu2);
81
82
83asn14 := aa(mu1,a1)*aa(nu2,b2)*dd(nu1,b1,mu2,a2)*te(mu1,mu2,nu1,nu2)
84
85asn17:=aa(mu1,a1)*aa(mu2,a2)*dd(nu1,b1,nu2,b2)
86          *te(mu1,mu2,nu1,nu2);
87
88
89asn17 := aa(mu1,a1)*aa(mu2,a2)*dd(nu1,b1,nu2,b2)*te(mu1,mu2,nu1,nu2)
90
91
92esn14:=es1*asn14;
93
94
95esn14 :=
96
97a(a1,b1)*a(a2,b2)*aa(mu1,a1)*aa(nu2,b2)*dd(nu1,b1,mu2,a2)*te(mu1,mu2,nu1,nu2)
98
99esn17:=es1*asn17;
100
101
102esn17 :=
103
104a(a1,b1)*a(a2,b2)*aa(mu1,a1)*aa(mu2,a2)*dd(nu1,b1,nu2,b2)*te(mu1,mu2,nu1,nu2)
105
106esn:=es1*(asn14+asn17);
107
108
109esn := a(a1,b1)*a(a2,b2)*aa(mu1,a1)*te(mu1,mu2,nu1,nu2)
110
111       *(aa(mu2,a2)*dd(nu1,b1,nu2,b2) + aa(nu2,b2)*dd(nu1,b1,mu2,a2))
112
113canonical esn;
114
115
116a(a1,a2)*a(b1,b2)*aa(mu2,b1)*(aa(mu1,a1)*dd(nu1,b2,nu2,a2)*te(mu2,mu1,nu1,nu2)
117
118    + aa(mu1,a2)*dd(nu1,b2,nu2,a1)*te(mu2,nu2,nu1,mu1))
119
120% that the next result is correct is not trivial
121% to show.
122% for esn14 changes of names are
123%
124%  nu1 -> nu1
125%  b1 -> b2 -> a2
126%  mu2 -> nu2 -> mu1 -> mu2
127%
128% for esn17 they are
129%
130%  nu1 -> nu1
131%  nu2 -> nu2
132%  b1 -> b2 -> a2 -> a1 -> b1
133%
134% the last result should be zero
135canonical esn -(canonical esn14 +canonical esn17);
136
137
1380
139
140% remove dummy_names and operators.
141clear_dummy_names;
142
143
144t
145
146clear a,aa,dd,te;
147
148
149%
150% Case of anticommuting operators
151%
152operator ao1, ao2;
153
154
155anticom ao1, ao2;
156
157
158t
159
160% product of anticommuting operators with FREE indices
161a_exp := ao1(s1)*ao1(s2) - ao1(s2)*ao1(s1);
162
163
164a_exp := ao1(s1)*ao1(s2) - ao1(s2)*ao1(s1)
165
166a_exp := canonical(a_exp);
167
168
169a_exp := 2*ao1(s1)*ao1(s2)
170
171
172% the indices are summed upon, i.e. are DUMMY indices
173
174clear_dummy_names;
175
176
177t
178
179
180dummy_base dv;
181
182
183dv
184
185
186a_exp := ao1(dv1)*ao1(dv2)$
187
188
189canonical(a_exp);
190
191
1920
193
194
195a_exp := ao1(dv1)*ao1(dv2) - ao1(dv2)*ao1(dv1);
196
197
198a_exp := ao1(dv1)*ao1(dv2) - ao1(dv2)*ao1(dv1)
199
200a_exp := canonical(a_exp);
201
202
203a_exp := 0
204
205
206a_exp := ao1(dv2,dv3)*ao2(dv1,dv2)$
207
208
209a_exp := canonical(a_exp);
210
211
212a_exp := ao1(dv1,dv2)*ao2(dv3,dv1)
213
214
215a_exp := ao1(dv1)*ao1(dv3)*ao2(dv3)*ao2(dv1)$
216
217
218a_exp := canonical(a_exp);
219
220
221a_exp :=  - ao1(dv1)*ao1(dv2)*ao2(dv1)*ao2(dv2)
222
223
224% Case of non commuting operators
225%
226operator no1, no2, no3;
227
228
229noncom no1, no2, no3;
230
231
232
233n_exp := no3(dv2)*no2(dv3)*no1(dv1) + no3(dv3)*no2(dv1)*no1(dv2)
234         + no3(dv1)*no2(dv2)*no1(dv3);
235
236
237n_exp := no3(dv1)*no2(dv2)*no1(dv3) + no3(dv2)*no2(dv3)*no1(dv1)
238
239          + no3(dv3)*no2(dv1)*no1(dv2)
240
241
242n_exp:=canonical n_exp;
243
244
245n_exp := 3*no3(dv3)*no2(dv2)*no1(dv1)
246
247
248% ***
249% The example below displays a restriction of the package i.e
250% The non commuting operators are ASSUMED to COMMUTE with the
251% anticommuting operators.
252% ***
253exp := co1(dv1)*ao1(dv2,dv1,dv4)*no1(dv1,dv5)*co2(dv3)*ao1(dv1,dv3);
254
255
256exp := co1(dv1)*co2(dv3)*(ao1(dv2,dv1,dv4)*no1(dv1,dv5)*ao1(dv1,dv3))
257
258canonical(exp);
259
260
261 - co1(dv1)*co2(dv2)*ao1(dv1,dv2)*ao1(dv3,dv1,dv4)*no1(dv1,dv5)
262
263
264exp := c_exp * a_exp * no3(dv2)*no2(dv3)*no1(dv1);
265
266
267                           2
268exp :=  - co1(dv2)*co2(dv1) *dv1*ao1(dv1)*ao1(dv2)*ao2(dv1)*ao2(dv2)*no3(dv2)
269
270       *no2(dv3)*no1(dv1)
271
272can_exp := canonical(exp);
273
274
275                               2
276can_exp :=  - co1(dv2)*co2(dv1) *dv1*ao1(dv1)*ao1(dv2)*ao2(dv1)*ao2(dv2)
277
278           *no3(dv2)*no2(dv3)*no1(dv1)
279
280
281% Case where some operators have a symmetry.
282%
283operator as1, as2;
284
285
286antisymmetric as1, as2;
287
288
289
290dummy_base s;
291
292
293s
294
295
296% With commuting and antisymmetric:
297
298asc_exp:=as1(s1,s2)*as1(s1,s3)*as1(s3,s4)*co1(s3)*co1(s4)+
299        2*as1(s1,s2)*as1(s1,s3)*as1(s3,s4)*co1(s2)*co1(s4)$
300
301
302
303canonical asc_exp;
304
305
306as1(s1,s2)*as1(s1,s3)*as1(s3,s4)*co1(s3)*co1(s4)
307
308
309% Indeed: the second term is identically zero as one sees
310%          if the substitutions s2->s4, s4->s2 and
311%           s1->s3, s3->s1 are sucessively done.
312%
313% With anticommuting and antisymmetric operators:
314
315dummy_base dv;
316
317
318dv
319
320
321exp1 := ao1(dv1)*ao1(dv2)$
322
323
324canonical(exp1);
325
326
3270
328
329
330exp2 := as1(dv1,dv2)$
331
332
333
334canonical(exp2);
335
336
3370
338
339
340canonical(exp1*exp2);
341
342
343as1(dv1,dv2)*ao1(dv1)*ao1(dv2)
344
345
346canonical(as1(dv1,dv2)*as2(dv2,dv1));
347
348
349 - as1(dv1,dv2)*as2(dv1,dv2)
350
351
352% With symmetric and antisymmetric operators:
353
354operator ss1, ss2;
355
356
357symmetric ss1, ss2;
358
359
360
361exp := ss1(dv1,dv2)*ss2(dv1,dv2) - ss1(dv2,dv3)*ss2(dv2,dv3);
362
363
364exp := ss1(dv1,dv2)*ss2(dv1,dv2) - ss1(dv2,dv3)*ss2(dv2,dv3)
365
366canonical(exp);
367
368
3690
370
371
372exp := as1(dv1,dv2)*as1(dv3,dv4)*as1(dv1,dv4);
373
374
375exp := as1(dv1,dv2)*as1(dv1,dv4)*as1(dv3,dv4)
376
377canonical(exp);
378
379
3800
381
382
383% The last result is equal to half the sum given below:
384%
385exp + sub(dv2 = dv3, dv3 = dv2, dv1 = dv4, dv4 = dv1, exp);
386
387
3880
389
390
391exp1 := as2(dv3,dv2)*as1(dv3,dv4)*as1(dv1,dv2)*as1(dv1,dv4);
392
393
394exp1 :=  - as1(dv1,dv2)*as1(dv1,dv4)*as1(dv3,dv4)*as2(dv2,dv3)
395
396canonical(exp1);
397
398
399as1(dv1,dv2)*as1(dv1,dv3)*as1(dv3,dv4)*as2(dv2,dv4)
400
401
402exp2 := as2(dv1,dv4)*as1(dv1,dv3)*as1(dv2,dv4)*as1(dv2,dv3);
403
404
405exp2 := as1(dv1,dv3)*as1(dv2,dv3)*as1(dv2,dv4)*as2(dv1,dv4)
406
407canonical(exp2);
408
409
410as1(dv1,dv2)*as1(dv1,dv3)*as1(dv3,dv4)*as2(dv2,dv4)
411
412
413canonical(exp1-exp2);
414
415
4160
417
418
419% Indeed:
420%
421exp2 - sub(dv1 = dv3, dv2 = dv1, dv3 = dv4, dv4 = dv2, exp1);
422
423
4240
425
426
427% Case where mixed or incomplete symmetries for operators are declared.
428
429% Function 'symtree' can be used to declare an operator symmetric
430% or antisymmetric:
431operator om;
432
433
434
435symtree(om,{!+,1,2,3});
436
437
438exp:=om(dv1,dv2,dv3)+om(dv2,dv1,dv3)+om(dv3,dv2,dv1);
439
440
441exp := om(dv1,dv2,dv3) + om(dv2,dv1,dv3) + om(dv3,dv2,dv1)
442
443canonical exp;
444
445
4463*om(dv1,dv2,dv3)
447
448
449% Declare om to be antisymmetric in the two last indices ONLY:
450symtree(om,{!*,{!*,1},{!-,2,3}});
451
452
453canonical exp;
454
455
4560
457
458
459% With an antisymmetric operator m:
460operator m;
461
462
463dummy_base s;
464
465
466s
467
468exp := om(nu,s3,s4)*i*psi*(m(s1,s4)*om(mu,s1,s3)
469+ m(s2,s3)*om(mu,s4,s2) - m(s1,s3)*om(mu,s1,s4)
470- m(s2,s4)*om(mu,s3,s2))$
471
472
473
474canonical exp;
475
476
477 - 4*m(s1,s2)*om(mu,s1,s3)*om(nu,s2,s3)*i*psi
478
479
480% Case of the Riemann tensor
481%
482operator r;
483
484
485symtree (r, {!+, {!-, 1, 2}, {!-, 3, 4}});
486
487
488% Without anty dummy indices.
489clear_dummy_base;
490
491
492t
493
494
495exp := r(dv1, dv2, dv3, dv4) * r(dv2, dv1, dv4, dv3)$
496
497
498canonical(exp);
499
500
501                  2
502r(dv1,dv2,dv3,dv4)
503
504
505% With dummy indices:
506
507dummy_base dv;
508
509
510dv
511
512
513canonical( r(x,y,z,t) );
514
515
516 - r(t,z,x,y)
517
518canonical( r(x,y,t,z) );
519
520
521r(t,z,x,y)
522
523canonical( r(t,z,y,x) );
524
525
526 - r(t,z,x,y)
527
528
529exp := r(dv1, dv2, dv3, dv4) * r(dv2, dv1, dv4, dv3)$
530
531
532canonical(exp);
533
534
535                  2
536r(dv1,dv2,dv3,dv4)
537
538
539exp := r(dv1, dv2, dv3, dv4) * r(dv1, dv3, dv2, dv4)$
540
541
542canonical(exp);
543
544
545r(dv1,dv2,dv3,dv4)*r(dv1,dv3,dv2,dv4)
546
547
548clear_dummy_base;
549
550
551t
552
553dummy_names i,j,k,l;
554
555
556t
557
558
559exp := r(i,j,k,l)*ao1(i,j)*ao1(k,l)$
560
561
562
563canonical(exp);
564
565
5660
567
568
569exp := r(k,i,l,j)*as1(k,i)*as1(k,j)$
570
571
572canonical(exp);
573
574
575 - as1(i,j)*as1(i,k)*r(i,k,j,l)
576
577
578% Cleanup of the previousy declared dummy variables..
579
580clear_dummy_names;
581
582
583t
584 clear_dummy_base;
585
586
587t
588
589
590exp := co1(dv3)$
591
592
593c_exp := canonical(exp);
594
595
596c_exp := co1(dv3)
597
598
599end;
600
601Tested on x86_64-pc-windows CSL
602Time (counter 1): 16 ms
603
604End of Lisp run after 0.01+0.04 seconds
605real 0.19
606user 0.00
607sys 0.09
608