Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I need a noncommutative multiplication that is

  1. Associative
  2. Distributive
  3. $A**0=0$, $A**1=A$
  4. Agrees with the commutative multiplication ($A**(k B)=(k A)**B=k (A**B)$)

I have found a code

     (*Factor out numerics -- could generalize to some ScalarQ*)
nc : NonCommutativeMultiply[a__] /; MemberQ[{a}, _?NumericQ] := 
  NCMFactorNumericQ[NCM[a]] /. NCM -> NonCommutativeMultiply
     (*Simplify Powers*)
b___ ** a_^n_. ** a_^m_. ** c___ := 
  NCM[b, a^(n + m), c] /. NCM -> NonCommutativeMultiply
     (*Expand Brackets*)
nc : NonCommutativeMultiply[a___, b_Plus, c___] := 
  Distribute[NCM[a, b, c]] /. NCM -> NonCommutativeMultiply
     (*Sort Subscripts*)
c___ ** Subscript[a_, i_] **Subscript[b_, j_] ** d___ /; i > j := 
  c ** Subscript[b, j] ** Subscript[a, i] ** d

NCMFactorNumericQ[nc_NCM] := 
  With[{pos = Position[nc, _?NumericQ, 1]}, Times \@@ Extract[nc, pos] Delete[nc, pos]]
NCM[a_] := a
NCM[] := 1

Here 1, 2, 3 are satisfied and 4 is not. Could you please help me to modify it.

share|improve this question
If you want it to agree with ordinary multiplication, do Unprotect[NonCommutativeMultiply]; NonCommutativeMultiply[x___]:=Times[x] (you probably also need to set its attributes to those of Times). If you want it to have a notion of scalars that get pulled out, that's a very different matter. So you really need to spell out more carefully what it is you want, if in fact it is not to make NonCommutativeMultiply into Times. – Daniel Lichtblau Mar 17 '14 at 14:58

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.