Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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

Unprotect[NonCommutativeMultiply];
Clear[NonCommutativeMultiply]
     (*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
Protect[NonCommutativeMultiply];

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

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 at 14:58
add comment

Your Answer

 
discard

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

Browse other questions tagged or ask your own question.