Mathematica:非交换乘法下的下标简化

时间:2011-02-14 02:22:55

标签: wolfram-mathematica

在Mathematica 7.0+中使用Subscript [variable,integer],我有以下形式的表达式:

a_-4 ** b_1 ** a_-4 ** b_-4 ** a_1 ** c_-4 ** c_1 ** c_5

我想简化这个表达式。

规则:
*具有相同下标的变量不通勤,
*具有不同下标的变量确实通勤。

我需要一种简化表达式并组合相似术语的方法(如果可能的话);输出应该是这样的:

(a_-4)^2 ** b_-4 ** c_-4 ** b_1 ** a_1 ** c_1 ** c_5

我需要的最重要的事情是通过下标对表达式中的术语进行排序,同时保留关于通勤和不通信的规则。第二件事(我想)做的是在订单正确后组合相似的术语。我需要至少按照以下方式对上面的表达式进行排序:

a_-4 ** a_-4 ** b_-4 ** c_-4 ** b_1 ** a_1 ** c_1 ** c_5,

即具有不同下标的通勤变量,同时保留具有相同下标的变量的非交际性质。

欢迎所有想法,谢谢。

3 个答案:

答案 0 :(得分:2)

这是你要找的东西

Sort

可以推广这些类型的规则(例如,为非通信对象添加交换规则,使其处理非数字索引等等)并打包到NCMSort例程中。您还可以通过定义唯一的NCMOrder函数,在单个过程中进行排序来优化它,例如

NCMSort[expr_] := expr /. a_NonCommutativeMultiply :> a[[NCMOrder[a]]]

旁白: 我使用这样一个过程来生成arXiv:1009.3298的结果 - 笔记本将随着(即将发布)更长的论文一起发布。

答案 1 :(得分:2)

我前几天引用了一个图书馆笔记本来解决相关问题。

http://library.wolfram.com/infocenter/Conferences/325/

How to expand the arithematics of differential operators in mathematica

我会讨论一些相关的代码。我首先提到(再次)我将定义并使用我自己的非交换运算符,以避免内置NonCommutativeMultiply的模式匹配问题。另外,我将使用[...]而不是下标[a,...]来简化ascii表示法和Mathematica输入/输出的剪切粘贴。

我们将某些“基本”实体分类为标量或变量,后者是具有减刑限制的事物。我几乎没有采用这种方式,只是将标量定义为相当明显的“非变量”。

variableQ[x_] := MemberQ[{a, b, c, d}, Head[x]]
scalarQ[x_?NumericQ] := True
scalarQ[x_[a_]^n_. /; !variableQ[x[a]]] := True
scalarQ[_] := False

ncTimes[] := 1
ncTimes[a_] := a
ncTimes[a___, ncTimes[b___, c___], d___] := ncTimes[a, b, c, d]
ncTimes[a___, x_ + y_, b___] := ncTimes[a, x, b] + ncTimes[a, y, b]
ncTimes[a___, n_?scalarQ*c_, b___] := n*ncTimes[a, c, b]
ncTimes[a___, n_?scalarQ, b___] := n*ncTimes[a, b]
ncTimes[a___, x_[i_Integer]^m_., x_[i_]^n_., b___] /; 
  variableQ[x[i]] := ncTimes[a, x[i]^(m + n), b]
ncTimes[a___, x_[i_Integer]^m_., y_[j_Integer]^n_., b___] /; 
  variableQ[x[i]] && ! OrderedQ[{x, y}] := (* !!! *)
    ncTimes[a, y[j]^n, x[i]^m, b]

我会稍微修改一下你的输入形式,所以我们将转换**表达式来改为使用ncTimes。

Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___] := ncTimes[a]

这是你的例子。

In[124]:= 
    a[-4] ** b[1] ** a[-4] ** b[-4] ** a[1] ** c[-4] ** c[1] ** c[5]

Out[124]= ncTimes[a[-4]^2, a[1], b[1], b[-4], c[-4], c[1], c[5]]

这种看似费力的方法的一个优点是您可以轻松定义换向器。例如,我们已经(隐含地)在制定上述规则时应用了这个。

commutator[x_[a_], y_[b_]] /; x =!= y || !VariableQ[x[a] := 0

一般情况下,如果您有换向器规则,例如

ncTimes[a[j],a[i]] == ncTimes[a[i],a[i]]+(j-i)*a[i]

每当j>我,那么你可以规范化,比如在所有表达式中将[i]放在[j]之前。为此,您需要修改标记为( !!! )的规则以考虑此类换向器。

我应该补充一点,我在任何意义上都没有完全测试过上面的代码。

Daniel Lichtblau Wolfram Research

答案 2 :(得分:0)

您可以使用NCAlgebra执行所需操作。就你的例子而言:

<< NC`
<< NCAlgebra`
expr = Subscript[a, -4] ** Subscript[b, 1] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[a, 1] ** Subscript[c, -4] ** Subscript[c, 1] ** Subscript[c, 5]
rule = {(Subscript[x_, i_] ** Subscript[y_, j_] /; i > j) -> Subscript[y, j] ** Subscript[x, i]}NCReplaceRepeated[expr, rule]
NCReplaceRepeated[expr, rule]

产生

Subscript[a, -4] ** Subscript[a, -4] ** Subscript[b, -4] ** Subscript[c, -4] ** Subscript[b, 1] ** Subscript[a, 1] ** Subscript[c, 1] ** Subscript[c, 5]

这里看起来不太好,但Subscripts会很好地呈现在笔记本上。