complex conjugation
Jens Vollinga
vollinga at thep.physik.uni-mainz.de
Thu Dec 18 16:33:15 CET 2003
Hi.
On Thu, Dec 18, 2003 at 01:38:01PM +0000, Chris Dams wrote:
>
> Hello,
>
> On Tue, 16 Dec 2003, Jens Vollinga wrote:
>
> > The digestion of your contribution took a while, because the complex
> > conjugation of some functions (harmonic and multiple polylog) is a bit more
> > involved, and I wanted to think of a solution to this before integrating
> > the patch.
> >
> > In doing so I recognized the following:
> > sin(x).conjugate() gives sin(x) ?!
> > or simpler
> > x.conjugate() gives x ?!
> > if x is symbol.
>
> This issue is discussed in
> http://www.ginac.de/lists/ginac-list/msg01354.html and follow-ups. An
> alternative to assuming all symbols to be real would be to have a global
> map (perhaps attached to the class symbol) that maps symbols to their
> complex conjugates.
>
Oops. Read the mails once, but forgot about it in the meantime ;-)
> I must say I am totally new to polylogs. Looking at their definition, I
> notice that they have a convergence radius of 1. Also the documentation
> says that they can only be evaluated numerically for arguments x_i with
> |x_i|<1. I only see problems for complex conjugation at branch cuts for
> |x|>1 (and only at the real axis I would guess). This is the same problem
> that was discussed in the aforementioned thread for the log. Therefore I
> still think that complex conjugating arguments would be best for these
> functions, or do you know of other problems with cc-ing these functions?
Only harmonic and multiple polylogs take some knowledge to conjugate,
the other polylogs could use the default behaviour. Harmonic polylogs
can be evaluated everywhere now, so they would need the knowledge of how
to cconj themselves.
But I admit that this not a argument in favour of or against any
implementation of cconj. Probably nobody uses these functions at the
moment and there would/will be enough time to think about the
mathematics of those certain functions.
Style and execution speed don't matter either, I think. The crucial
points in my opinion are:
- The basic idea to give the user the obligation to subsitute the
symbols afterwards is not so good (bad). It is counter-intuitive and
asks for users to delve into debugging sessions. Functions (C++) with
input parameters using cconj would have to extent their parameter list
for cconj-symbols. What about an expression x+abs(x) if x is a
symbol? How to substitute? (maybe this example is not so well
devised, but it makes you feel that there could appear problems
in similar cases...)
- The way you proposed to do the cconj (in patch) is good, because
every function can care about its cconj for itself. Ginac doesn't need
to know about every new function a user might want to implement
(impossible!).
(Not an important argument: on top of that, with a Ginac-function you
could nicely do cconj(cconj(x)) -> x and have a latex output for
cconj(x) as x^*).
Maybe all of this can be taken into account by the following
approach:
- Every class has a (private) method for cconj and there are macros for
the Ginac-function. This is basically your patch.
- There exists a Ginac-function cconj (or different name?). It evaluates
by calling the (private) cconj methods. If (by a not yet specified
way) the method signals, that it could cconj correctly, the
Ginac-cconj is replaced by the result, otherwise Ginac-cconj remains
unevaluated.
That should give for
symbol x("x");
ex a = sin(x) + 3 + 4*I - sin(2/3*I);
cout << cconj(a) << endl;
something like
sin(cconj(x)) + 3 - 4*I - sin(-2/3*I)
Bye,
Jens
More information about the GiNaC-devel
mailing list