hephys.red 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. %*********************************************************************
  2. %*********************************************************************
  3. % HIGH ENERGY PHYSICS PACKAGE
  4. %*********************************************************************
  5. %********************************************************************;
  6. %Copyright (c) 1983 The Rand Corporation;
  7. SYMBOLIC;
  8. %*********************************************************************
  9. % REQUIRES SIMPLIFICATION FUNCTIONS FOR NON-SCALAR QUANTITIES
  10. %********************************************************************;
  11. %*********************************************************************
  12. % NON LOCAL VARIABLES REFERENCED IN THIS PACKAGE
  13. %********************************************************************;
  14. FLUID '(!*S!*);
  15. GLOBAL '(DEFINDICES!* INDICES!* MUL!* NCMP!* NDIM!* TYPL!* !*SUB2);
  16. DEFINDICES!* := NIL; %deferred indices in N dim calculations;
  17. INDICES!* := NIL; %list of indices in High Energy Physics
  18. %tensor expressions;
  19. NDIM!* := 4; %number of dimensions in gamma algebra;
  20. COMMENT The generalizations in this package for n dimensional vector
  21. and gamma algebra are due to Gastmans, Van Proeyen and
  22. Verbaeten, University of Leuven, Belgium;
  23. %*********************************************************************
  24. % SOME DECLARATIONS
  25. %********************************************************************;
  26. DEFLIST ('((CONS SIMPDOT)),'SIMPFN);
  27. SYMBOLIC PROCEDURE VECTOR U;
  28. VECTOR1 U;
  29. SYMBOLIC PROCEDURE VECTOR1 U;
  30. <<TYPL!* := UNION('(HVECTORP),TYPL!*);
  31. FOR EACH X IN U DO PUT(X,'VECTOR,'VECTOR)>>;
  32. SYMBOLIC PROCEDURE HVECTORP U;
  33. NSP(U,'VECTOR);
  34. PUT('VECTOR,'FN,'VECFN);
  35. PUT('HVECTORP,'LETFN,'NSLET);
  36. PUT('HVECTORP,'NAME,'VECTOR);
  37. PUT('HVECTORP,'EVFN,'VEVAL);
  38. PUT('G,'SIMPFN,'SIMPGAMMA);
  39. FLAGOP NONCOM,NOSPUR;
  40. FLAG ('(G),'NONCOM);
  41. SYMBOLIC PROCEDURE INDEX U;
  42. BEGIN VECTOR1 U; RMSUBS(); INDICES!* := UNION(INDICES!*,U) END;
  43. SYMBOLIC PROCEDURE REMIND U;
  44. BEGIN INDICES!* := SETDIFF(INDICES!*,U) END;
  45. SYMBOLIC PROCEDURE MASS U;
  46. <<TYPL!* := UNION('(HVECTORP),TYPL!*);
  47. FOR EACH X IN U DO
  48. <<PUT(CADR X,'MASS,CADDR X); PUT(CADR X,'VECTOR,'VECTOR)>>>>;
  49. SYMBOLIC PROCEDURE GETMAS U;
  50. (LAMBDA X; IF X THEN X ELSE REDERR LIST(U,"has no mass"))
  51. GET!*(U,'MASS);
  52. SYMBOLIC PROCEDURE VECDIM U;
  53. BEGIN
  54. TYPL!* := UNION('(HVECTORP),TYPL!*);
  55. NDIM!* := CAR U
  56. END;
  57. SYMBOLIC PROCEDURE MSHELL U;
  58. BEGIN SCALAR X,Z;
  59. TYPL!* := UNION('(HVECTORP),TYPL!*);
  60. A: IF NULL U THEN RETURN LET0(Z,NIL);
  61. X := GETMAS CAR U;
  62. Z := LIST('EQUAL,LIST('CONS,CAR U,CAR U),LIST('EXPT,X,2)) . Z;
  63. U := CDR U;
  64. GO TO A
  65. END;
  66. RLISTAT '(VECDIM INDEX MASS MSHELL REMIND VECTOR);
  67. %*********************************************************************
  68. % FUNCTIONS FOR SIMPLIFYING HIGH ENERGY EXPRESSIONS
  69. %********************************************************************;
  70. SYMBOLIC PROCEDURE VEVAL U;
  71. BEGIN SCALAR Z;
  72. U := NSSIMP(U,'HVECTORP);
  73. A: IF NULL U THEN RETURN REPLUS Z
  74. ELSE IF NULL CDAR U THEN REDERR "Missing vector"
  75. ELSE IF CDDAR U THEN REDERR LIST("Redundant vector",CDAR U);
  76. Z := ACONC(Z,RETIMES(PREPSQ CAAR U . CDAR U));
  77. U := CDR U;
  78. GO TO A
  79. END;
  80. SYMBOLIC PROCEDURE VMULT U;
  81. BEGIN SCALAR Z;
  82. Z := LIST LIST(1 . 1);
  83. A: IF NULL U THEN RETURN Z;
  84. Z := VMULT1(NSSIMP(CAR U,'HVECTORP),Z);
  85. IF NULL Z THEN RETURN;
  86. U := CDR U;
  87. GO TO A
  88. END;
  89. SYMBOLIC PROCEDURE VMULT1(U,V);
  90. BEGIN SCALAR Z;
  91. IF NULL V THEN RETURN;
  92. A: IF NULL U THEN RETURN Z
  93. ELSE IF CDDAR U
  94. THEN REDERR("Redundant vector" . CDAR U);
  95. Z := NCONC(Z,MAPCAR(V,FUNCTION (LAMBDA J;
  96. MULTSQ(CAR J,CAAR U) . APPEND(CDR J,CDAR U))));
  97. U := CDR U;
  98. GO TO A
  99. END;
  100. SYMBOLIC PROCEDURE SIMPDOT U;
  101. MKVARG(U,FUNCTION DOTORD);
  102. SYMBOLIC PROCEDURE DOTORD U;
  103. <<IF XNP(U,INDICES!*) AND NOT MEMQ('ISIMPQ,MUL!*)
  104. THEN MUL!* := ACONC(MUL!*,'ISIMPQ) ELSE NIL;
  105. IF 'A MEMQ U
  106. THEN REDERR "A represents only gamma5 in vector expressions"
  107. ELSE MKSQ('CONS . ORD2(CAR U,CARX(CDR U,'DOT)),1)>>;
  108. SYMBOLIC PROCEDURE MKVARG(U,V);
  109. BEGIN SCALAR Z;
  110. U := VMULT U;
  111. Z := NIL ./ 1;
  112. A: IF NULL U THEN RETURN Z;
  113. Z := ADDSQ(MULTSQ(APPLY(V,LIST CDAR U),CAAR U),Z);
  114. U := CDR U;
  115. GO TO A
  116. END;
  117. SYMBOLIC PROCEDURE SPUR U;
  118. <<RMSUBS();
  119. MAP(U,FUNCTION (LAMBDA J;
  120. <<REMFLAG(LIST CAR J,'NOSPUR);
  121. REMFLAG(LIST CAR J,'REDUCE)>>))>>;
  122. RLISTAT '(SPUR);
  123. SYMBOLIC PROCEDURE SIMPGAMMA !*S!*;
  124. IF NULL !*S!* OR NULL CDR !*S!*
  125. THEN REDERR "Missing arguments for G operator"
  126. ELSE BEGIN
  127. IF NOT MEMQ('ISIMPQ,MUL!*) THEN MUL!*:= ACONC(MUL!*,'ISIMPQ);
  128. NCMP!* := T;
  129. RETURN MKVARG(CDR !*S!*,FUNCTION (LAMBDA J;
  130. LIST ((('G . CAR !*S!* . J) . 1) . 1) . 1))
  131. END;
  132. SYMBOLIC PROCEDURE SIMPEPS U;
  133. MKVARG(U,FUNCTION EPSORD);
  134. SYMBOLIC PROCEDURE EPSORD U;
  135. IF REPEATS U THEN NIL ./ 1 ELSE MKEPSQ U;
  136. SYMBOLIC PROCEDURE MKEPSK U;
  137. %U is of the form (v1 v2 v3 v4).
  138. %Value is <sign flag> . <kernel for EPS(v1,v2,v3,v4)>;
  139. BEGIN SCALAR X;
  140. IF XNP(U,INDICES!*) AND NOT 'ISIMPQ MEMQ MUL!*
  141. THEN MUL!* := ACONC(MUL!*,'ISIMPQ);
  142. X := ORDN U;
  143. U := PERMP(X,U);
  144. RETURN U . ('EPS . X)
  145. END;
  146. SYMBOLIC PROCEDURE MKEPSQ U;
  147. (LAMBDA X; (LAMBDA Y; IF NULL CAR X THEN NEGSQ Y ELSE Y)
  148. MKSQ(CDR X,1))
  149. MKEPSK U;
  150. %*********************************************************************
  151. % FUNCTIONS FOR SIMPLIFYING VECTOR AND GAMMA MATRIX EXPRESSIONS
  152. %********************************************************************;
  153. SYMBOLIC SMACRO PROCEDURE MKG(U,L);
  154. %Value is the standard form for G(L,U);
  155. !*P2F('G . L . U TO 1);
  156. SYMBOLIC SMACRO PROCEDURE MKA L;
  157. %Value is the standard form for G(L,A);
  158. !*P2F(LIST('G,L,'A) TO 1);
  159. SYMBOLIC SMACRO PROCEDURE MKGF(U,L);
  160. MKSF('G . (L . U));
  161. SYMBOLIC PROCEDURE MKG1(U,L);
  162. IF NOT FLAGP(L,'NOSPUR) THEN MKG(U,L) ELSE MKGF(U,L);
  163. SYMBOLIC SMACRO PROCEDURE MKPF(U,V);
  164. MULTPF(U,V);
  165. SYMBOLIC PROCEDURE MKF(U,V);
  166. MULTF(U,V);
  167. SYMBOLIC PROCEDURE MULTD!*(U,V);
  168. IF ONEP U THEN V ELSE MULTD(U,V);
  169. SYMBOLIC SMACRO PROCEDURE ADDFS(U,V);
  170. ADDF(U,V);
  171. SYMBOLIC SMACRO PROCEDURE MULTFS(U,V);
  172. %U and V are pseudo standard forms
  173. %Value is pseudo standard form for U*V;
  174. MULTF(U,V);
  175. FLUID '(NDIMS!*);
  176. SYMBOLIC PROCEDURE ISIMPQ U;
  177. BEGIN SCALAR NDIMS!*;
  178. NDIMS!* := SIMP NDIM!*;
  179. IF DENR NDIMS!* NEQ 1
  180. THEN <<!*SUB2 := T;
  181. NDIMS!* := MULTPF(MKSP(LIST('RECIP,DENR NDIMS!*),1),
  182. NUMR NDIMS!*)>>
  183. ELSE NDIMS!* := NUMR NDIMS!*;
  184. A: U := ISIMP1(NUMR U,INDICES!*,NIL,NIL,NIL) ./ DENR U;
  185. IF DEFINDICES!*
  186. THEN <<INDICES!* := UNION(DEFINDICES!*,INDICES!*);
  187. DEFINDICES!* := NIL;
  188. GO TO A>>
  189. ELSE IF NULL !*SUB2 THEN RETURN U
  190. ELSE RETURN RESIMP U
  191. END;
  192. SYMBOLIC PROCEDURE ISIMP1(U,I,V,W,X);
  193. IF NULL U THEN NIL
  194. ELSE IF DOMAINP U
  195. THEN IF X THEN MULTD(U,SPUR0(CAR X,I,V,W,CDR X))
  196. ELSE IF V THEN REDERR("Unmatched index" . I)
  197. ELSE IF W THEN MULTFS(EMULT W,ISIMP1(U,I,V,NIL,X))
  198. ELSE U
  199. ELSE ADDFS(ISIMP2(CAR U,I,V,W,X),ISIMP1(CDR U,I,V,W,X));
  200. SYMBOLIC PROCEDURE ISIMP2(U,I,V,W,X);
  201. BEGIN SCALAR Z;
  202. IF ATOM (Z := CAAR U) THEN GO TO A
  203. ELSE IF CAR Z EQ 'CONS AND XNP(CDR Z,I)
  204. THEN RETURN DOTSUM(U,I,V,W,X)
  205. ELSE IF CAR Z EQ 'G
  206. THEN GO TO B
  207. ELSE IF CAR Z EQ 'EPS THEN RETURN ESUM(U,I,V,W,X);
  208. A: RETURN MKPF(CAR U,ISIMP1(CDR U,I,V,W,X));
  209. B: Z := GADD(APPN(CDDR Z,CDAR U),X,CADR Z);
  210. RETURN ISIMP1(MULTD!*(NB CAR Z,CDR U),I,V,W,CDR Z)
  211. END;
  212. SYMBOLIC PROCEDURE NB U;
  213. IF U THEN 1 ELSE -1;
  214. SYMBOLIC SMACRO PROCEDURE MKDOT(U,V);
  215. %Returns a standard form for U.V;
  216. MKSF('CONS . ORD2(U,V));
  217. SYMBOLIC PROCEDURE DOTSUM(U,I,V,W,X);
  218. BEGIN SCALAR I1,N,U1,U2,V1,Y,Z;
  219. N := CDAR U;
  220. IF NOT (CAR (U1 := CDAAR U) MEMBER I) THEN U1 := REVERSE U1;
  221. U2 := CADR U1;
  222. U1 := CAR U1;
  223. V1 := CDR U;
  224. IF N=2 THEN GO TO H ELSE IF N NEQ 1 THEN REDERR U;
  225. A: IF U1 MEMBER I THEN GO TO A1
  226. ELSE IF NULL (Z := MKDOT(U1,U2)) THEN RETURN NIL
  227. ELSE RETURN MKF(Z,ISIMP1(V1,I1,V,W,X));
  228. A1: I1 := DELETE(U1,I);
  229. IF U1 EQ U2 THEN RETURN MULTF(NDIMS!*,ISIMP1(V1,I1,V,W,X))
  230. ELSE IF NOT (Z := ATSOC(U1,V)) THEN GO TO C
  231. ELSE IF U2 MEMBER I THEN GO TO D;
  232. U1 := CDR Z;
  233. GO TO E;
  234. C: IF Z := MEMLIS(U1,X)
  235. THEN RETURN ISIMP1(V1,
  236. I1,
  237. V,
  238. W,
  239. SUBST(U2,U1,Z) . DELETE(Z,X))
  240. ELSE IF Z := MEMLIS(U1,W)
  241. THEN RETURN ESUM((('EPS . SUBST(U2,U1,Z)) . 1) . V1,
  242. I1,
  243. V,
  244. DELETE(Z,W),
  245. X)
  246. ELSE IF U2 MEMBER I AND NULL Y THEN GO TO G;
  247. RETURN ISIMP1(V1,I,(U1 . U2) . V,W,X);
  248. D: U1 := U2;
  249. U2 := CDR Z;
  250. E: I := I1;
  251. V := DELETE(Z,V);
  252. GO TO A;
  253. G: Y := T;
  254. Z := U1;
  255. U1 := U2;
  256. U2 := Z;
  257. GO TO A1;
  258. H: IF U1 EQ U2 THEN REDERR U;
  259. I := I1 := DELETE(U1,I);
  260. U1 := U2;
  261. GO TO A
  262. END;
  263. SYMBOLIC PROCEDURE MKSF U;
  264. %U is a kernel.
  265. %Value is a (possibly substituted) standard form for U;
  266. BEGIN SCALAR X;
  267. X := MKSQ(U,1);
  268. IF CDR X=1 THEN RETURN CAR X;
  269. !*SUB2 := T;
  270. RETURN !*P2F(U TO 1)
  271. END;
  272. %*********************************************************************
  273. % FUNCTIONS FOR SIMPLIFYING DIRAC GAMMA MATRICES
  274. %********************************************************************;
  275. SYMBOLIC PROCEDURE GADD(U,V,L);
  276. BEGIN SCALAR W,X; INTEGER N;
  277. N := 0; %number of gamma5 interchanges;
  278. IF NOT (X := ATSOC(L,V)) THEN GO TO A;
  279. V := DELETE(X,V);
  280. W := CDDR X; %list being built;
  281. X := CADR X; %true if gamma5 remains;
  282. A: IF NULL U THEN RETURN ((REMAINDER(N,2)=0) . (L . X . W) . V)
  283. ELSE IF CAR U EQ 'A THEN GO TO C
  284. ELSE W := CAR U . W;
  285. B: U := CDR U;
  286. GO TO A;
  287. C: IF NDIMS!* NEQ 4
  288. THEN REDERR "Gamma5 not allowed unless vecdim is 4";
  289. X := NOT X;
  290. N := LENGTH W + N;
  291. GO TO B
  292. END;
  293. %*********************************************************************
  294. % FUNCTIONS FOR COMPUTING TRACES OF DIRAC GAMMA MATRICES
  295. %********************************************************************;
  296. SYMBOLIC PROCEDURE SPUR0(U,I,V1,V2,V3);
  297. BEGIN SCALAR L,W,I1,KAHP,N,Z;
  298. L := CAR U;
  299. N := 1;
  300. Z := CADR U;
  301. U := REVERSE CDDR U;
  302. IF Z THEN U := 'A . U; %GAMMA5 REMAINS;
  303. IF NULL U THEN GO TO END1
  304. ELSE IF NULL FLAGP(L,'NOSPUR)
  305. THEN IF CAR U EQ 'A AND (LENGTH U<5 OR HEVENP U)
  306. OR NOT CAR U EQ 'A AND NOT HEVENP U
  307. THEN RETURN NIL
  308. ELSE IF NULL I THEN <<W := REVERSE U; GO TO END1>>;
  309. A:
  310. IF NULL U THEN GO TO END1
  311. ELSE IF CAR U MEMBER I
  312. THEN IF CAR U MEMBER CDR U
  313. THEN <<IF CAR U EQ CADR U
  314. THEN <<I := DELETE(CAR U,I);
  315. U := CDDR U;
  316. N := MULTF(N,NDIMS!*);
  317. GO TO A>>;
  318. KAHP := T;
  319. I1 := CAR U . I1;
  320. GO TO A1>>
  321. ELSE IF CAR U MEMBER I1 THEN GO TO A1
  322. ELSE IF Z := BASSOC(CAR U,V1)
  323. THEN <<V1 := DELETE(Z,V1);
  324. I := DELETE(CAR W,I);
  325. U := OTHER(CAR U,Z) . CDR U;
  326. GO TO A>>
  327. ELSE IF Z := MEMLIS(CAR U,V2)
  328. THEN RETURN IF FLAGP(L,'NOSPUR)
  329. AND NULL V1
  330. AND NULL V3
  331. AND NULL CDR V2
  332. THEN MKF(MKGF(APPEND(REVERSE W,U),L),
  333. MULTFS(N,MKEPSF Z))
  334. ELSE MULTD!*(N,
  335. ISIMP1(SPUR0(
  336. L . (NIL . APPEND(REVERSE U,W)),NIL,V1,DELETE(Z,V2),V3),
  337. I,NIL,LIST Z,NIL))
  338. ELSE IF Z := MEMLIS(CAR U,V3)
  339. THEN IF NDIMS!*=4
  340. THEN RETURN SPUR0I(U,DELETE(CAR U,I),V1,V2,
  341. DELETE(Z,V3),L,N,W,Z)
  342. ELSE <<INDICES!* := DELETE(CAR U,INDICES!*);
  343. I := DELETE(CAR U,I);
  344. IF NOT CAR U MEMQ DEFINDICES!*
  345. THEN DEFINDICES!* :=
  346. CAR U . DEFINDICES!*;
  347. GO TO A1>>
  348. ELSE REDERR LIST("Unmatched index",CAR U);
  349. A1:
  350. W := CAR U . W;
  351. U := CDR U;
  352. GO TO A;
  353. END1:
  354. IF KAHP
  355. THEN IF NDIMS!*=4
  356. THEN <<Z := MULTFS(N,KAHANE(REVERSE W,I1,L));
  357. RETURN ISIMP1(Z,SETDIFF(I,I1),V1,V2,V3)>>
  358. ELSE Z := SPURDIM(W,I,L,NIL,1)
  359. ELSE Z := SPURR(W,L,NIL,1);
  360. RETURN IF NULL Z THEN NIL
  361. ELSE IF GET('EPS,'KLIST) AND NOT FLAGP(L,'NOSPUR)
  362. THEN ISIMP1(MULTFS(N,Z),I,V1,V2,V3)
  363. ELSE MULTFS(Z,ISIMP1(N,I,V1,V2,V3))
  364. END;
  365. SYMBOLIC PROCEDURE SPUR0I(U,I,V1,V2,V3,L,N,W,Z);
  366. BEGIN SCALAR KAHP,I1;
  367. IF FLAGP(L,'NOSPUR) AND FLAGP(CAR Z,'NOSPUR)
  368. THEN ERRACH "This NOSPUR option not implemented"
  369. ELSE IF FLAGP(CAR Z,'NOSPUR) THEN KAHP := CAR Z;
  370. Z := CDR Z;
  371. I1 := CAR Z;
  372. Z := REVERSE CDR Z;
  373. IF I1 THEN Z := 'A . Z;
  374. I1 := NIL;
  375. <<WHILE NULL (CAR U EQ CAR Z) DO
  376. <<I1 := CAR Z . I1; Z := CDR Z>>;
  377. Z := CDR Z;
  378. U := CDR U;
  379. IF FLAGP(L,'NOSPUR)
  380. THEN <<W := W . (U . (I1 . Z));
  381. I1 := CAR W;
  382. Z := CADR W;
  383. U := CADDR W;
  384. W := CDDDR W>>;
  385. W := REVERSE W;
  386. IF NULL ((NULL U OR NOT EQCAR(W,'A)) AND (U := APPEND(U,W)))
  387. THEN <<IF NOT HEVENP U THEN N := - N;
  388. U := 'A . APPEND(U,CDR W)>>;
  389. IF KAHP THEN L := KAHP;
  390. Z :=
  391. MKF(MKG(REVERSE I1,L),
  392. MULTF(BRACE(U,L,I),MULTFS(N,MKG1(Z,L))));
  393. Z := ISIMP1(Z,I,V1,V2,V3);
  394. IF NULL Z OR (Z := QUOTF(Z,2)) THEN RETURN Z
  395. ELSE ERRACH LIST('SPUR0,N,I,V1,V2,V3)>>
  396. END;
  397. SYMBOLIC PROCEDURE SPURDIM(U,I,L,V,N);
  398. BEGIN SCALAR W,X,Y,Z,Z1; INTEGER M;
  399. A: IF NULL U
  400. THEN RETURN IF NULL V THEN N
  401. ELSE IF FLAGP(L,'NOSPUR) THEN MULTFS(N,MKGF(V,L))
  402. ELSE MULTFS(N,SPRGEN V)
  403. ELSE IF NOT(CAR U MEMQ CDR U)
  404. THEN <<V := CAR U . V; U := CDR U; GO TO A>>;
  405. X := CAR U;
  406. Y := CDR U;
  407. W := Y;
  408. M := 1;
  409. B: IF X MEMQ I THEN GO TO D
  410. ELSE IF NOT X EQ CAR W THEN GO TO C
  411. ELSE IF NULL(W := MKDOT(X,X)) THEN RETURN Z;
  412. IF X MEMQ I THEN W := NDIMS!*;
  413. RETURN ADDFS(MKF(W,SPURDIM(DELETE(X,Y),I,L,V,N)),Z);
  414. C: Z1 := MKDOT(X,CAR W);
  415. IF CAR W MEMQ I
  416. THEN Z := ADDFS(SPURDIM(SUBST(X,CAR W,REMOVE(Y,M)),
  417. I,L,V,2*N),Z)
  418. ELSE IF Z1
  419. THEN Z := ADDFS(MKF(Z1,SPURDIM(REMOVE(Y,M),I,L,V,2*N)),Z);
  420. W := CDR W;
  421. N := -N;
  422. M := M+1;
  423. GO TO B;
  424. D: WHILE NOT(X EQ CAR W) DO
  425. <<Z:= ADDFS(SPURDIM(SUBST(CAR W,X,REMOVE(Y,M)),I,L,V,2*N),Z);
  426. W := CDR W;
  427. N := -N;
  428. M := M+1>>;
  429. RETURN ADDFS(MKF(NDIMS!*,SPURDIM(DELETE(X,Y),I,L,V,N)),Z)
  430. END;
  431. SYMBOLIC PROCEDURE APPN(U,N);
  432. IF N=1 THEN U ELSE APPEND(U,APPN(U,N-1));
  433. SYMBOLIC PROCEDURE OTHER(U,V);
  434. IF U EQ CAR V THEN CDR V ELSE CAR V;
  435. SYMBOLIC PROCEDURE KAHANE(U,I,L);
  436. %The Kahane algorithm for Dirac matrix string reduction
  437. %Ref: Kahane, J., Journ. Math. Phys. 9 (1968) 1732-1738;
  438. BEGIN SCALAR P,R,V,W,X,Y,Z; INTEGER K,M;
  439. K := 0;
  440. MARK:
  441. IF EQCAR(U,'A) THEN GO TO A1;
  442. A: P := NOT P; %vector parity;
  443. IF NULL U THEN GO TO D ELSE IF CAR U MEMBER I THEN GO TO C;
  444. A1: W := ACONC(W,CAR U);
  445. B: U := CDR U;
  446. GO TO A;
  447. C: Y := CAR U . P;
  448. Z := (X . (Y . W)) . Z;
  449. X := Y;
  450. W := NIL;
  451. K := K+1;
  452. GO TO B;
  453. D: Z := (NIL . (X . W)) . Z;
  454. %BEWARE ... END OF STRING HAS OPPOSITE CONVENTION;
  455. PASS2:
  456. M := 1;
  457. L1: IF NULL Z THEN GO TO L9;
  458. U := CAAR Z;
  459. X := CADAR Z;
  460. W := CDDAR Z;
  461. Z := CDR Z;
  462. M := M+1;
  463. IF NULL U THEN GO TO L2
  464. ELSE IF (CAR U EQ CAR X) AND EXC(X,CDR U) THEN GO TO L7;
  465. W := REVERSE W;
  466. R := T;
  467. L2: P := NOT EXC(X,R);
  468. X := CAR X;
  469. Y := NIL;
  470. L3: IF NULL Z
  471. THEN REDERR("Unmatched index" .
  472. IF Y THEN IF NOT ATOM CADAR Y THEN CADAR Y
  473. ELSE IF NOT ATOM CAAR Y THEN CAAR Y
  474. ELSE NIL
  475. ELSE NIL)
  476. ELSE IF (X EQ CAR (I := CADAR Z)) AND NOT EXC(I,P)
  477. THEN GO TO L5
  478. ELSE IF (X EQ CAR (I := CAAR Z)) AND EXC(I,P) THEN GO TO L4;
  479. Y := CAR Z . Y;
  480. Z := CDR Z;
  481. GO TO L3;
  482. L4: X := CADAR Z;
  483. W := APPR(CDDAR Z,W);
  484. R := T;
  485. GO TO L6;
  486. L5: X := CAAR Z;
  487. W := APPEND(CDDAR Z,W);
  488. R := NIL;
  489. L6: Z := APPR(Y,CDR Z);
  490. IF NULL X THEN GO TO L8
  491. ELSE IF NOT EQCAR(U,CAR X) THEN GO TO L2;
  492. L7: IF W AND CDR U THEN W := ACONC(CDR W,CAR W);
  493. V := MULTFS(BRACE(W,L,NIL),V); %V := ('BRACE . L . W) . V;
  494. GO TO L1;
  495. L8: V := MKG(W,L); %V := LIST('G . L . W);
  496. Z := REVERSE Z;
  497. K := K/2;
  498. GO TO L1;
  499. L9: U := 2**K;
  500. IF NOT (REMAINDER(K-M,2) = 0) THEN U := - U;
  501. RETURN MULTD!*(U,V) %RETURN 'TIMES . U . V;
  502. END;
  503. SYMBOLIC PROCEDURE APPR(U,V);
  504. IF NULL U THEN V ELSE APPR(CDR U,CAR U . V);
  505. SYMBOLIC PROCEDURE EXC(U,V);
  506. IF NULL CDR U THEN V ELSE NOT V;
  507. SYMBOLIC PROCEDURE BRACE(U,L,I);
  508. IF NULL U THEN 2
  509. ELSE IF XNP(I,U) OR FLAGP(L,'NOSPUR)
  510. THEN ADDF(MKG1(U,L),MKG1(REVERSE U,L))
  511. ELSE IF CAR U EQ 'A
  512. THEN IF HEVENP U THEN ADDFS(MKG(U,L),
  513. NEGF MKG('A . REVERSE CDR U,L))
  514. ELSE MKF(MKA L,SPR2(CDR U,L,2,NIL))
  515. ELSE IF HEVENP U THEN SPR2(U,L,2,NIL)
  516. ELSE SPR1(U,L,2,NIL);
  517. SYMBOLIC PROCEDURE SPR1(U,L,N,B);
  518. IF NULL U THEN NIL
  519. ELSE IF NULL CDR U THEN MULTD!*(N,MKG1(U,L))
  520. ELSE BEGIN SCALAR M,X,Z;
  521. X := U;
  522. M := 1;
  523. A: IF NULL X THEN RETURN Z;
  524. Z:= ADDFS(MKF(MKG1(LIST CAR X,L),
  525. IF NULL B THEN SPURR(REMOVE(U,M),L,NIL,N)
  526. ELSE SPR1(REMOVE(U,M),L,N,NIL)),
  527. Z);
  528. X := CDR X;
  529. N := - N;
  530. M := M+1;
  531. GO TO A
  532. END;
  533. SYMBOLIC PROCEDURE SPR2(U,L,N,B);
  534. IF NULL CDDR U AND NULL B THEN MULTD!*(N,MKDOT(CAR U,CADR U))
  535. ELSE (LAMBDA X; IF B THEN ADDFS(SPR1(U,L,N,B),X) ELSE X)
  536. ADDFS(SPURR(U,L,NIL,N),
  537. MKF(MKA L,SPURR(APPEND(U,LIST 'A),L,NIL,N)));
  538. SYMBOLIC PROCEDURE HEVENP U;
  539. NULL U OR NOT HEVENP CDR U;
  540. SYMBOLIC PROCEDURE BASSOC(U,V);
  541. IF NULL V THEN NIL
  542. ELSE IF U EQ CAAR V OR U EQ CDAR V THEN CAR V
  543. ELSE BASSOC(U,CDR V);
  544. SYMBOLIC PROCEDURE MEMLIS(U,V);
  545. IF NULL V THEN NIL
  546. ELSE IF U MEMBER CAR V THEN CAR V
  547. ELSE MEMLIS(U,CDR V);
  548. SYMBOLIC PROCEDURE SPURR(U,L,V,N);
  549. BEGIN SCALAR W,X,Y,Z,Z1; INTEGER M;
  550. A: IF NULL U THEN GO TO B
  551. ELSE IF CAR U MEMBER CDR U THEN GO TO G;
  552. V := CAR U . V;
  553. U := CDR U;
  554. GO TO A;
  555. B: RETURN IF NULL V THEN N
  556. ELSE IF FLAGP(L,'NOSPUR) THEN MULTD!*(N,MKGF(V,L))
  557. ELSE MULTD!*(N,SPRGEN V);
  558. G: X := CAR U;
  559. Y := CDR U;
  560. W := Y;
  561. M := 1;
  562. H: IF NOT X EQ CAR W THEN GO TO H1
  563. ELSE IF NULL(W:= MKDOT(X,X)) THEN RETURN Z
  564. ELSE RETURN ADDFS(MKF(W,SPURR(DELETE(X,Y),L,V,N)),Z);
  565. H1: Z1 := MKDOT(X,CAR W);
  566. IF Z1 THEN Z:= ADDFS(MKF(Z1,SPURR(REMOVE(Y,M),L,V,2*N)),Z);
  567. W := CDR W;
  568. N := - N;
  569. M := M+1;
  570. GO TO H
  571. END;
  572. SYMBOLIC PROCEDURE SPRGEN V;
  573. BEGIN SCALAR X,Y,Z;
  574. IF NOT (CAR V EQ 'A) THEN RETURN SPRGEN1(V,T)
  575. ELSE IF NULL (X := COMB(V := CDR V,4)) THEN RETURN NIL
  576. ELSE IF NULL CDR X THEN GO TO E;
  577. C: IF NULL X THEN RETURN MULTPF('I TO 1,Z);
  578. Y := MKEPSF CAR X;
  579. IF ASIGN(CAR X,V,1)=-1 THEN Y := NEGF Y;
  580. Z := ADDF(MULTF(Y,SPRGEN1(SETDIFF(V,CAR X),T)),Z);
  581. D: X := CDR X;
  582. GO TO C;
  583. E: Z := MKEPSF CAR X;
  584. GO TO D
  585. END;
  586. SYMBOLIC PROCEDURE ASIGN(U,V,N);
  587. IF NULL U THEN N ELSE ASIGN(CDR U,V,ASIGN1(CAR U,V,-1)*N);
  588. SYMBOLIC PROCEDURE ASIGN1(U,V,N);
  589. IF U EQ CAR V THEN N ELSE ASIGN1(U,CDR V,-N);
  590. SYMBOLIC PROCEDURE SPRGEN1(U,B);
  591. IF NULL U THEN NIL
  592. ELSE IF NULL CDDR U THEN (LAMBDA X; IF B THEN X ELSE NEGF X)
  593. MKDOT(CAR U,CADR U)
  594. ELSE BEGIN SCALAR W,X,Y,Z;
  595. X := CAR U;
  596. U := CDR U;
  597. Y := U;
  598. A: IF NULL U THEN RETURN Z
  599. ELSE IF NULL(W:= MKDOT(X,CAR U)) THEN GO TO C;
  600. Z := ADDF(MULTF(W,SPRGEN1(DELETE(CAR U,Y),B)),Z);
  601. C: B := NOT B;
  602. U := CDR U;
  603. GO TO A
  604. END;
  605. %*********************************************************************
  606. % FUNCTIONS FOR EPSILON ALGEBRA
  607. %********************************************************************;
  608. PUT('EPS,'SIMPFN,'SIMPEPS);
  609. SYMBOLIC PROCEDURE MKEPSF U;
  610. (LAMBDA X; (LAMBDA Y; IF NULL CAR X THEN NEGF Y ELSE Y) MKSF CDR X)
  611. MKEPSK U;
  612. SYMBOLIC PROCEDURE ESUM(U,I,V,W,X);
  613. BEGIN SCALAR Y,Z,Z1;
  614. Z := CAR U;
  615. U := CDR U;
  616. IF CDR Z NEQ 1
  617. THEN U := MULTF(EXPTF(MKEPSF CDAR Z,CDR Z-1),U);
  618. Z := CDAR Z;
  619. A: IF REPEATS Z THEN RETURN;
  620. B: IF NULL Z THEN RETURN ISIMP1(U,I,V,REVERSE Y . W,X)
  621. ELSE IF NOT (CAR Z MEMBER I) THEN GO TO D
  622. ELSE IF NOT (Z1 := BASSOC(CAR Z,V)) THEN GO TO C;
  623. V := DELETE(Z1,V);
  624. I := DELETE(CAR Z,I);
  625. Z := APPEND(REVERSE Y,OTHER(CAR Z,Z1) . CDR Z);
  626. Y := NIL;
  627. GO TO A;
  628. C: IF Z1 := MEMLIS(CAR Z,W) THEN GO TO C1
  629. ELSE RETURN ISIMP1(U,I,V,APPEND(REVERSE Y,Z) . W,X);
  630. C1: Z := APPEND(REVERSE Y,Z);
  631. Y := XN(I,XN(Z,Z1));
  632. RETURN ISIMP1(MULTFS(EMULT1(Z1,Z,Y),U),
  633. SETDIFF(I,Y),
  634. V,
  635. DELETE(Z1,W),
  636. X);
  637. D: Y := CAR Z . Y;
  638. Z := CDR Z;
  639. GO TO B
  640. END;
  641. SYMBOLIC PROCEDURE EMULT U;
  642. IF NULL CDR U THEN MKEPSF CAR U
  643. ELSE IF NULL CDDR U THEN EMULT1(CAR U,CADR U,NIL)
  644. ELSE MULTFS(EMULT1(CAR U,CADR U,NIL),EMULT CDDR U);
  645. SYMBOLIC PROCEDURE EMULT1(U,V,I);
  646. (LAMBDA (X,Y);
  647. (LAMBDA (M,N);
  648. IF M=4 THEN 24*N
  649. ELSE IF M=3 THEN MULTD(6*N,MKDOT(CAR X,CAR Y))
  650. ELSE MULTD!*(N*(IF M = 0 THEN 1 ELSE M),
  651. CAR DETQ MAPLIST(X,
  652. FUNCTION (LAMBDA K;
  653. MAPLIST(Y,
  654. FUNCTION (LAMBDA J;
  655. MKDOT(CAR K,CAR J) . 1))))))
  656. (LENGTH I,
  657. (LAMBDA J; NB IF PERMP(U,APPEND(I,X)) THEN NOT J ELSE J)
  658. PERMP(V,APPEND(I,Y))))
  659. (SETDIFF(U,I),SETDIFF(V,I));
  660. END;