# [GiNaC-list] About non commutative transformations in GiNaC

abpetrov abpetrov at ufacom.ru
Sun Jan 22 20:35:56 CET 2017

```Hello,
I wrote a program to do calculations with non commutative
variables in GiNaC.
But when I made attempt to apply noncommutative rule I got error:

terminate called after throwing an instance of 'std::logic_error'
what():  add::eval(): sum of non-commutative objects has non-zero
numeric term

Below is simple example of program with program output.
How to change the class ncsymbol so that it was possible to apply rules
like a*ap==ap*a+1?

Best regards Petrov A.B.
--------------------------------------------------------------------
Output for program:

Starting: ./test2
e1: a*ap*a
terminate called after throwing an instance of 'std::logic_error'
what():  add::eval(): sum of non-commutative objects has non-zero
numeric term
*** Crashed with return code: 0 ***

------------------------------------------------------------------

Program:

#include <iostream>
using namespace std;

#include<ginac/ginac.h>
using namespace GiNaC;

class ncsymbol : public symbol
{
GINAC_DECLARE_REGISTERED_CLASS(ncsymbol, symbol)
public:
ncsymbol(const string &s);

protected:
unsigned return_type() const { return
return_types::noncommutative_composite; }

};

GINAC_IMPLEMENT_REGISTERED_CLASS(ncsymbol, symbol)
ncsymbol::ncsymbol() { }
ncsymbol::ncsymbol(const string &s) :  inherited(s) { }

int ncsymbol::compare_same_type(const basic &other) const
{
GINAC_ASSERT(is_a<ncsymbol>(other));
const ncsymbol *o = static_cast<const ncsymbol *>(&other);
if (serial==o->serial) return 0;
return serial < o->serial ? -1 : 1;
}

void calc_example(){
ncsymbol a("a"),ap("ap");

ex e1 = a*ap*a;
cout << "e1: " << e1 << endl;

e1 = e1.subs(a*ap==ap*a+1);
cout << "e1 subs: " << e1 << endl;
}

int main(int argc, char** argv)
{
calc_example();
return 0;
}
```