# Mathematica : Noncommutative Multiply and Replacement Rules

Tags:
1. Apr 4, 2014

### Hepth

Code (Text):

Val[a_] := ToCharacterCode[ToString[a]][[1]];
GH[a].GH[b].GH[c].GH[d].GH[b] //. {GH[a_].GH[b_] :> If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]]}
I have the noncommutative multiply of GH[a].GH.GH[c].GH[d].GH

My goal is to order these in increasing charcter value. (Val is the function to convert to basically ascii code).

Shouldn't this work? And give GH[a].GH.GH.GH[c].GH[d] at the end?

Notice also that
Code (Text):

GH[a].GH[b].GH[c].GH[d].GH[b]

GH[a].GH[b].GH[c].GH[d].GH[b] //. {
(A_).GH[a_].GH[b_].(B_) :>
A.If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]].B,
(A_).GH[a_].GH[b_] :>
A.If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]],
GH[a_].GH[b_].(B_) :>
If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]].B,
GH[a_].GH[b_] :> If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]]}

GH[a].GH[b].GH[c].GH[d].GH[b] //. {
(A_).GH[a_].GH[b_] :> A.If[Val[a] > Val[b], GH[b].GH[a], GH[a].GH[b]]
}

Even though the rule in the 2nd one exists in the replacements of the first, it doesn't apply. I think the problem comes in the fact that its applying a rule to the position right before the last two, and once that is evaluated, does not re-evaluate it, even though no real action was taken. Though I guess if you consider it replacing itself an action, then that's what it did.

Any ideas? Even if its a different method. This is something that I'm trying to write in a much more complicated way, and I need to figure out how these work.

Thanks!

2. Apr 4, 2014

### Bill Simpson

Code (Text):
In[1]:= Val[a_] := ToCharacterCode[ToString[a]][[1]];
GH[a].GH[b].GH[c].GH[d].GH[b] //. Dot[h___, GH[a_], GH[b_], t___] /;
Val[a]>Val[b]:>Dot[h,GH[b],GH[a],t]

Out[1]= GH[a].GH[b].GH[b].GH[c].GH[d]
Or

Code (Text):
In[2]:= Sort[GH[a].GH[b].GH[c].GH[d].GH[b]]

Out[2]= GH[a].GH[b].GH[b].GH[c].GH[d]

Last edited: Apr 5, 2014