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; }