Re: overloading times operator

*To*: mathgroup at smc.vnet.net*Subject*: [mg88831] Re: overloading times operator*From*: Bill Rowe <readnews at sbcglobal.net>*Date*: Sat, 17 May 2008 23:29:23 -0400 (EDT)

On 5/17/08 at 5:32 AM, gstaceystaples at yahoo.com (gstaples) wrote: >I wrote a procedure to define the non-commutative product of two >elements of the form e_X e_Y, where X and Y are multi-indices. I do >this using Times. >I do a simple calculation like >Expand[(e_{1} + e_{3})(e_{1} - e_{3})] >and get the wrong answer. (On the first try.) >If I then re-execute the code that defines the multiplication, I >repeat the calculation and get correct output. >Alternatively, if I execute >e=Symbol["e"] >before loading the procedure, I get correct output on the first try. >More troubling is that after getting correct output, if I perform >calculations of a different kind (e.g. matrix multiplication), when >I repeat my original calculation, I start getting incorrect output >again. (Until I re-execute the code that defines the >multiplication.) >It's frustrating to repeat a calculation and get different sets of >output depending on what other calculations are done in between. >Does anyone have suggestions? You did not provide details of the procedure you wrote to overload Times. So, I don't see a way to determine precisely why things work the way you describe. But, having said that there are two obvious things to look at: First, would be a problem with the procedure you wrote. Second, is the issue of overloading a commonly used function such as Times. It is inherently risky to overload operations that are likely to be used throughout Mathematica. Possibly, there is some internal code that is designed to temporarily overload Times which restores the default behavior to clean up after itself. Assuming no errors in your code, this would explain the behavior you see. But this is entirely speculation on my part. Rather than overload Times, I would define one of the operators without built in meanings such as CircleTimes to have the behavior you want. This would ensure your code will not interact in some unintended way with other built in functions. See tutorial/OperatorsWithoutBuiltInMeanings.