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