sign(zeta(x))



I found that Maxima doesn't know how to find sign(zeta(x))
for non-integer or positive odd x:

  integrate (t^3/(exp(t)-1), t, 0, inf)
  Is  zeta(3)  positive, negative, or zero?

It happens because zeta(3) is not evaluated, so sign(zeta(3))=pnz.

Other examples:

  sign (zeta(5/6)) => pnz
  sign (zeta(-5/2)) => pnz

Maybe we can extend compar.lisp by the following stuff:

  ;; for real x, zeta(x) has
  ;; trivial negative even roots
  ;; and a pole at x=1
  (defun sign-zeta (x)
    (let ((arg (cadr x)))
      (cond
        ((eq (mgqp arg 1) t) '$pos)
        ((eq (mgqp arg 0) t) '$neg)
        ((eq (mgrp 0 arg) t)
          (if (integerp arg)
            (let ((m (mod arg 4)))
              (cond
                ((= m 3) '$neg)
                ((= m 1) '$pos)
                (t '$zero)))
            (let ((fl (take '($floor) arg)))
            (if (integerp fl)
              (if (= (mod (if (evenp fl) fl (1- fl)) 4) 0)
                '$pos
                '$neg)
              '$pnz))))
        (t '$pnz))))

Examples:

  (sign-zeta '(($zeta) -23)) => $pos
  (sign-zeta '(($zeta) -22)) => $zero
  (sign-zeta '(($zeta) -21)) => $neg
  (sign-zeta '(($zeta) 0) => $neg
  (sign-zeta '(($zeta) 23)) => $pos
  (sign-zeta '(($zeta) ((rat) 5 6))) => $neg
  (sign-zeta '(($zeta) ((rat) -5 2))) => $pos
  (sign-zeta '(($zeta) $%pi))) => $pos
  (sign-zeta '(($zeta) ((mtimes) 23 $%i))) => $pnz
  (sign-zeta '(($zeta) $x)) => $pnz

-- 
Boomtime, Chaos 17 YOLD 3175
Alexey Beshenov  http://beshenov.ru/