我正在尝试创建一个处理运算符代数的程序,其中运算符没有显式表示。 这意味着我必须定义许多符号和参数函数来跟踪已经完成的工作。
我有两种运算符:V ^ +和V ^ - 。
代数上写着: [V ^ +(a),V ^ +(b)] = I X [a,b] V ^ +(a + b) [V ^ - (a),V ^ - (b)] = I Xbar [a,b] V ^ - (a + b) 注意:(“a + b”不是总和。它是费曼图中两组腿的结合)
然后我们得到:V ^ +(a)V ^ +(b)= I X [a,b] V ^ +(a | b) 当然,V ^ +(a | b)+ V ^ +(b | a)= V ^ +(a + b)。
X和Xbar是结构常量,在两个参数中是反对称的。
然后我们必须定义: V ^ +(a | b)* V ^ + / - (c | d)= I X [b,c + d] V ^ + / - (a + b + c | d) V ^ - (a | b)* V ^ + / - (c | d)= I Xbar [b,c + d] V ^ + / - (a + b + c | d)
同样重要的是定义:V ^ + / - (a)= V ^ + / - (0 | a)。
所以,在mathematica中,我到目前为止定义了换向器和包含诸如a | b之类的东西的V的乘积。 当我想计算我有换向器换向器的结构时,会出现主要问题。 以下是代码的相关部分: 结构常量:
XX[A_, B_] := If[A < B, X[A, B], -X[B, A]]
XXb[A_, B_] := If[A < B, Xb[A, B], -Xb[B, A]]
这样做是为了实现反对称性并促进简化。 带竖条对象的产品
PB[V[VB[A_,B_],K_],V[VB[C_,D_],PD_]] :=If[K == 1,I*XX[B,piu[C,D]]V[VB[piu[A,B,C],D],PD],I*XXb[B,piu[C,D]]V[VB[piu[A,B,C],D],PD]]
我使用了“piu”这个函数,它代表了腿的联合,如“a + b”(= piu [a,b])。
piu[A_, B_] := If[A != 0, If[B != 0, pi[A, B], A], If[B != 0, B, 0]]
piu[A_, B_, C_] := If[A != 0,If[B != 0, If[C != 0, pi[A, B, C], pi[A, B]],If[C != 0,pi[A, C], A]], If[B != 0, If[C != 0, pi[B, C], B], If[C != 0, C, 0]]]
V中的第二个参数可以是0或1,仅代表“+”(1)或“ - ”(0)。
然后换向器:
Comm[V[vb[A_, B_], K_], V[vb[C_, D_], M_]] := PB[V[VB[A, B], K], V[VB[C, D], M]]-PB[V[VB[C, D], M], V[VB[A, B], K]]
Comm[V[vb[A_, B_], K_], V[[piu[C_, D_], E_], M_]] :=PB[V[VB[A, B], K], V[VB[C, D], M]]-PB[V[VB[C, D], M], V[VB[A, B], K]]
我直接使用“0 | a”编写“a”的方式来避免含糊不清的地方,我也定义了其中一个参数是其他两个的总和的特殊情况。
最后,我创建了一组规则来简化内容并给出正确的结果: 的规则
RC = {
VB[A_, B_] :> vb[A, B],
vb[A_, pi[B_, C_]] :> If[A != 0, vb[A, pi[B, C]], vb[0, pi[B, C]]],
vb[A_, B_] :> If[A != 0, If[B != 0, vb[A, B], vb[A]], If[B != 0, vb[B], 0]],
VB[Null, A_] :> vb[A],
(V[vb[A_, B_], K_] + V[vb[B_, A_], K_]) :> V[vb[0, piu[A, B]], K]
}
我使用以下规则来应用规则:
SimplifyRC[expr_]:=Simplify[expr]//.RC
为了举例说明发生了什么,这是一个简单的换向器的结果: SimplifyRC [Comm [V [VB [0,1],1],V [VB [0,2],1]]]
Out= I V[vb[0, pi[1, 2]], 1] X[1, 2]
到目前为止一切都很好。
然而,该计划的目标是使用换向器的换向器计算更复杂的结构。
我的问题是:我如何处理换向器内部换向器内的因子(I,X [a,b],Xbar [a,b])? 我尝试定义一些规则,说这个函数在两个参数中应该是双线性的,但这只能工作一次,一旦我在函数内部多次调用函数,问题就会重新出现。
示例:
SimplifyRC[Comm[V[VB[0, 1], 1], Comm[V[VB[0, 2], 1], V[VB[0, 3], 1]]]]
Out= Comm[V[vb[1], 1], I V[vb[0, pi[2, 3]], 1] X[2, 3]]
这可以通过设置替代规则轻松处理。 但是,一旦我去
SimplifyRC[Comm[V[VB[0, 1], 1],Comm[V[VB[0, 1], 2], Comm[V[VB[0, 3], 1], V[VB[0, 4], 1]]]]]
问题会再次出现,因为在新的换向器中我会有类似“X [a,b] X [c,d]”的东西,规则将不再起作用。
有没有一种聪明的方法来实现一个处理这个问题的规则,并且无论它不是V运算符,它都会从换向器中带出来?
我希望这很清楚。代码很乱,但是由于缺少运算符的显式表示,必须定义所有这些函数和符号以跟踪操作。 提前谢谢。