#2514 Taylor result inconsistent T/x^2 vs. T/x/x

None
open
nobody
taylor (3)
5
2012-12-14
2012-12-07
Stavros Macrakis
No

taylor(x,x,0,5)/x^2 => 1/x+...
Internally: ((MRAT SIMP ($X) (#:X1942) (($X ((5 . 1)) 0 NIL #:X1942 . 1)) TRUNC) PS
(#:X1942 . 1) ((3 . 1)) ((-1 . 1) 1 . 1))

(taylor(x,x,0,5)/x)/x => 1/x (without ellipses)
Internally: ((MRAT SIMP ($X) (#:X1945) (($X ((5 . 1)) 0 NIL #:X1945 . 1)) TRUNC) PS
(#:X1945 . 1) * (NIL) * ((-1 . 1) 1 . 1))

taylorinfo of both expressions remains [[x,0,5]]

Versions: 5.27.0 2012-04-30 11:59:06 i686-apple-darwin11.3.0 SBCL 1.0.55.0-abb03f9

Discussion

  • When dividing twice by x the result is, as you say:

    ((MRAT SIMP ($X) (#:X1461) (($X ((5 . 1)) 0 NIL #:X1461 . 1)) TRUNC) PS
     (#:X1461 . 1) (NIL) ((-1 . 1) 1 . 1))
    

    Printing is done by FORM-MRAT, which decides the result is "exact"
    (because of the NIL) and intentionally doesn't print a trailing ...

    Another way to get the same result is:

    taylor(1, x, 0, 5) / x;
    
     
  • Something that definitely appears wrong shows up when you trace
    TAYLOR2 in the division taylor(1, x, 0, 5) / x;:

    0: (TAYLOR2
        ((MTIMES)
         ((MRAT SIMP ($X) (#:X1480) (($X ((5 . 1)) 0 NIL #:X1480 . 1)) TRUNC) 1
          . 1)
         ((MEXPT SIMP) $X -1)))
    0: TAYLOR2 returned (PS (#:X1481 . 1) (NIL) ((-1 . 1) 1 . 1))
    

    The (NIL) is "<trunc-lvl>" as explained in the comment at the top of
    hayat.lisp and I think it should probably be set to ((4 . 1)) not
    NIL!

    Digging into TAYLOR2, and tracing TSTIMES, this looks pretty bogus:

    1: (TSTIMES
        (((MRAT SIMP ($X) (#:X1480) (($X ((5 . 1)) 0 NIL #:X1480 . 1)) TRUNC) 1
          . 1)
         ((MEXPT SIMP) $X -1)))
      2: (TAYLOR2 ((MEXPT SIMP) $X -1))
      2: TAYLOR2 returned (PS (#:X1485 . 1) (NIL) ((-1 . 1) 1 . 1))
      2: (TAYLOR2
          ((MRAT SIMP ($X) (#:X1480) (($X ((5 . 1)) 0 NIL #:X1480 . 1)) TRUNC)
           1 . 1))
        3: (TAYLOR2 1)
        3: TAYLOR2 returned (1 . 1)
      2: TAYLOR2 returned (1 . 1)
      2: (TAYLOR2 ((MEXPT SIMP) $X -1))
      2: TAYLOR2 returned (PS (#:X1485 . 1) (NIL) ((-1 . 1) 1 . 1))
    1: TSTIMES returned (PS (#:X1485 . 1) (NIL) ((-1 . 1) 1 . 1))
    

    Basically, I think the second call to TAYLOR2 should probably result
    in something like

    (PS (#:X1485 . 1) ((5 . 1)) (1 . 1))
    

    which would say "This is a power series in X, which is 1 up to
    x^5". If something like this doesn't get returned, there's no way for
    the following code to work out the truncation order.