Next: , Previous: Multiple polylogarithms, Up: Methods and functions


5.13 Complex expressions

For dealing with complex expressions there are the methods

     ex ex::conjugate();
     ex ex::real_part();
     ex ex::imag_part();

that return respectively the complex conjugate, the real part and the imaginary part of an expression. Complex conjugation works as expected for all built-in functions and objects. Taking real and imaginary parts has not yet been implemented for all built-in functions. In cases where it is not known how to conjugate or take a real/imaginary part one of the functions conjugate, real_part or imag_part is returned. For instance, in case of a complex symbol x (symbols are complex by default), one could not simplify conjugate(x). In the case of strings of gamma matrices, the conjugate method takes the Dirac conjugate.

For example,

     {
         varidx a(symbol("a"), 4), b(symbol("b"), 4);
         symbol x("x");
         realsymbol y("y");
     
         cout << (3*I*x*y + sin(2*Pi*I*y)).conjugate() << endl;
          // -> -3*I*conjugate(x)*y+sin(-2*I*Pi*y)
         cout << (dirac_gamma(a)*dirac_gamma(b)*dirac_gamma5()).conjugate() << endl;
          // -> -gamma5*gamma~b*gamma~a
     }

If you declare your own GiNaC functions and you want to conjugate them, you will have to supply a specialized conjugation method for them (see Symbolic functions and the GiNaC source-code for abs as an example). GiNaC does not automatically conjugate user-supplied functions by conjugating their arguments because this would be incorrect on branch cuts. Also, specialized methods can be provided to take real and imaginary parts of user-defined functions.