[Maxima] complex conjugate and modulus

Barton Willis willisb at unk.edu
Sat Aug 9 13:20:39 CDT 2008

```Two suggestions:

(1) Instead of setting simp to false, try subst('fake_conjugate,
'conjugate, ...). After processing, revert the substitution. It might
help to declare fake_conjugate to be additive and multiplicative (but
it might hurt too).

(2) Instead of apply1 + a rule, try using ratsubst.

Here is some CL code and some tests--expect bugs!

;; start of file conjugate_to_abs.lisp  ------------

(mfuncall '\$declare 'non-simp-conjugate '\$additive)
(mfuncall '\$declare 'non-simp-conjugate '\$multiplicative)

(defmspec \$conj_to_abs (e)
(setq e (\$substitute 'non-simp-conjugate '\$conjugate (cadr e)))
(\$substitute '\$conjugate 'non-simp-conjugate (conj-to-abs e e)))

(defun conj-to-abs (e p)
(cond ((or (\$mapatom e) (\$mapatom p)) e)

((and (not (\$mapatom p)) (eq (mop p) 'non-simp-conjugate))
(setq p (cadr p))
(\$ratsubst (power (take '(\$cabs) p) 2) (mul p (take '(non-simp-conjugate)
p)) e))

(t
(mapcar #'(lambda (s) (setq e (conj-to-abs e s))) (cdr p))
e)))

;; end of file conjugate_to_abs.lisp  ------------

Examples:

(%i13) declare([x,y,z],complex)\$

(%i14) conj_to_abs(x * conjugate(5*x));
(%o14) 5*cabs(x)^2

(%i15) conj_to_abs(x^3 * conjugate(5*x));
(%o15) 5*x^2*cabs(x)^2

(%i16) conj_to_abs( 2 * y * conjugate(y) * z * conjugate(z) * w * conjugate
(w));
(%o16) 2*cabs(w)^2*cabs(y)^2*cabs(z)^2

(%i17) conj_to_abs(sqrt(z)*conjugate(sqrt(z)));
(%o17) cabs(sqrt(z))^2

(%i18) conj_to_abs( foo(z) * conjugate(foo(z)));
(%o18) cabs(foo(z))^2

(%i19) conj_to_abs(z * conjugate(42 + z));
(%o19) cabs(z)^2+42*z

(%i20) conj_to_abs((z + 42) * conjugate(z));
(%o20) 42*conjugate(z)+cabs(z)^2

(%i21) conj_to_abs(z^5 * conjugate(z + 12));
(%o21) z^4*cabs(z)^2+12*z^5

(%i22) conj_to_abs(z^5 * conjugate(z^2+12));
(%o22) z^3*cabs(z^2)^2+12*z^5

Here, it would be better if non-simp-conjugate was not additive :(

(%i23) conj_to_abs((x + y) * conjugate(x + y));
(%o23) x*conjugate(y)+cabs(y)^2+conjugate(x)*y+cabs(x)^2

Again, my code is almost surely buggy, but maybe it is a start for
something
that will work for you. One problem is

(%i11) conj_to_abs(6.7b0 + conjugate(x));
`rat' replaced 6.7B0 by 67/10 = 6.7B0
(%o11) (10*conjugate(x)+67)/10

I don't know of a way around that---for doubles, keepfloat takes care of
this,
but not for big floats.

Barton

-----maxima-bounces at math.utexas.edu wrote: -----

>I am trying to write a function to rewrite
>  z*conjugate(z) as  abs(z)^2 , and do this when z is
>other expressions, as well.

```