【问题标题】:Mathematica: subscript simplification under noncommutative multiplicationMathematica:非交换乘法下的下标化简
【发布时间】:2011-02-14 02:22:55
【问题描述】:

在 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,

也就是说,对具有不同下标的变量进行交换,同时保留具有相同下标的变量的非交流性质。

欢迎所有想法,谢谢。

【问题讨论】:

  • 你知道同下标对象的交换性质吗?如果不是,那么您将不会获得表达式的唯一形式 - 组合它们将是次优的。

标签: wolfram-mathematica


【解决方案1】:

这是你要找的东西吗

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

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

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

【讨论】:

  • 我很想你提出了这个问题 :)
  • @Janus 也许我做到了...(这是我致富五步计划的一部分)
  • @Janus :那是一个邪恶的评论。我从不怀疑@Simon 做了这么肮脏的事情。 @Simon:你需要一个伙伴吗? :D
【解决方案2】:

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

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

How to expand the arithematics of differential operators in mathematica

我会写一些相关的代码。我首先(再次)提到我将定义并使用我自己的非交换运算符,以避免来自内置 NonCommutativeMultiply 的模式匹配问题。此外,我将使用 a[...] 而不是 Subscript[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,你就可以规范化,比如在所有表达式中将 a[i] 放在 a[j] 之前。为此,您需要修改标记为 (!!!) 的规则以考虑此类换向器。

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

丹尼尔·利希特布劳 Wolfram 研究

【讨论】:

    【解决方案3】:

    您可以使用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 在笔记本上会很好地呈现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多