(in-package :maxima)

(defun $listofei (e )
   (declare (special $d2% $lg% $lexp%))
    (setq $d2% (copy-tree (car e)))
    (setq $lg% ())
    (setq $lexp% ())
    (do ((lvar (caddr $d2%) (cdr lvar))
         (lg% (cadddr $d2%) (cdr lg%))
         (var))
        ((null lvar)(setq $lg% (cons '(mlist) $lg%))
                (setq $lexp% (cons '(mlist) $lexp%))
            (setq $d2% (cons $d2%  (cdr e))) )
        (setq var (car lvar))
            (cond ((and (mexptp var)
                        (equal (cadr var) '$%e)
;                       (mtimesp (caddr var))
;                       (eq (cadr (caddr var)) '$%i)
                        ;; Check that we have a factor of %i. This test includes
                        ;; cases like %i, and %i*x/2, which we get for e.g.
                        ;; sin(1) and sin(x/2).
                        (eq '$%i (cdr (partition (if (atom (caddr var))
                                                     (list '(mtimes)(caddr var))
                                                     (caddr var))
                                                 '$%i 1))))
           (setq $lexp% (cons var $lexp%))
           (setq var  (symbolconc "$_" (car lg%)))
           (setq $lg% (cons var $lg%))
           (rplaca lvar var)))))

#$trigrat_equationp (e%) :=
    not atom (e%)
    and member (op (e%), ["=", "#", "<", "<=", ">=", ">"])$

#$trigrat(exp):=
    if matrixp (exp) or listp (exp) or setp (exp) or trigrat_equationp (exp)
    then map (trigrat, exp)
    else block([e%,n%,d%,lg%,f%,lexp%,ls,d2%,l2%,alg,gcd1],
        alg:algebraic,gcd1:gcd,
        algebraic:true,gcd:subres,
        e%: rat(ratsimp(expand(exponentialize(exp)))),
        n%:num(e%),d%:denom(e%),
        listofei(d%),
        l2%:map(lambda([u%,v%],u%^((hipow(d2%,v%)+lopow(d2%,v%))/2)),
                lexp%,lg%),
        f%:if length(lexp%)=0 then 1
          else if length(lexp%)=1 then part(l2%,1)
          else apply("*",l2%),
        n%:rectform(ratexpand(n%/f%)),
            d%:rectform(ratexpand(d%/f%)),
        e%:ratsimp(n%/d%,%i),
        algebraic:alg,gcd:gcd1,
        e%)$

; written by D. Lazard, august 1988
; modified by C. Sangwin, November 2020.