I said before that the following test takes too much time to run:
     testIntegrate("sqrt(tan(x)^2 + 2*tan(x) + 2)", "x", "alg")

I did some profiling, and found that 40% time is spent in
symmetricRemainder:

                                Callers
                  Total.     Function
  Count     %  Count     %      Callees
------------------------------------------------------------------------
      3   0.0                   |MODRING;reduce;RMod$;6| [76]
     13   0.1                   |INS-;symmetricRemainder;3S;27| [1]
   3431  39.3                   |IDPO;map;M2$;6| [5]
   1104  12.7   3451  39.6   |INS-;symmetricRemainder;3S;27| [1]
     13   0.1                   |INS-;symmetricRemainder;3S;27| [1]
    160   1.8                   |INT;=;2$B;30| [4]
    149   1.7                   |ABELMON-;*;Pi2S;2| [14]
     67   0.8                   SB-VM::ALLOC-TRAMP [15]
    228   2.6                   |ORDSET-;>;2SB;4| [7]
    173   2.0                   |ORDSET-;<=;2SB;6| [20]
     73   0.8                   |INT;+;3$;34| [9]
    160   1.8                   |INT;*;3$;37| [6]
    180   2.1                   |ABELGRP-;*;Nni2S;3| [11]
    366   4.2                   |INT;rem;3$;44| [16]
    369   4.2                   IDENTITY [2]
    407   4.7                   |INT;<;2$B;31| [3]


We can see that "=$INT, +$INT, *$INT, <$INT" are not inlined, and
"*$ABELMON, *$ABELGRP, >, <=" are not defined in INT, thus impossible
to get inlined.

So I want to add inline optimization for these functions.
(I also add inline support for "positive?, even?, ^")

=========== test case
)time on
)lisp (require :sb-sprof)

f := sqrt(tan(x)^2 + 2*tan(x) + 2)
g := integrate(f, x)

f2 := D(g, x)

)lisp (sb-sprof:start-profiling)
normalize(f-f2)
)lisp (sb-sprof:stop-profiling)

)lisp (sb-sprof:report)
===========

Benchmark result:
                 D(g, x)    normalize(f-f2)
before patch    40.3 s      87.4 s
after patch     28.4 s      57.3 s

So it's 30% faster, saves 40 seconds in testing.

diff --git a/src/algebra/integer.spad b/src/algebra/integer.spad
index 0e619c2f..35f673b2 100644
--- a/src/algebra/integer.spad
+++ b/src/algebra/integer.spad
@@ -59,7 +59,6 @@
        ZP ==> SparseUnivariatePolynomial %
        ZZP ==> SparseUnivariatePolynomial Integer
        x, y : %
-      n : NonNegativeInteger

        writeOMInt(dev : OpenMathDevice, x : %) : Void ==
          if x < 0 then
@@ -87,6 +86,7 @@
        dec  x  == x - 1
        hashUpdate!(hs, s) == update!(hs, SXHASH(s)$Lisp)$HashState
        negative? x == MINUSP(x)$Lisp
+      positive? x == PLUSP(x)$Lisp
        coerce(x) : OutputForm == outputForm(x pretend Integer)
        coerce(m : Integer) : % == m pretend %
        convert(x : %) : Integer == x pretend Integer
@@ -125,15 +125,21 @@
        random(x) == RANDOM(x)$Lisp
        x = y == EQL(x, y)$Lisp
        x < y == (x<y)$Lisp
+      x > y == (x>y)$Lisp
        -- critical for coercions to NonNegativeInteger
        x >= y == (x >= y)$Lisp
+      x <= y == (x <= y)$Lisp
        - x == (-x)$Lisp
        x + y == (x+y)$Lisp
        x - y == (x-y)$Lisp
        x * y == (x*y)$Lisp
        (m : Integer) * (y : %) == (m*y)$Lisp -- for subsumption problem
-      x ^ n == EXPT(x, n)$Lisp
+      (m : PositiveInteger) * (y : %) == (m*y)$Lisp
+      (m : NonNegativeInteger) * (y : %) == (m*y)$Lisp
+      (x : %) ^ (n : NonNegativeInteger) == EXPT(x, n)$Lisp
+      (x : %) ^ (n : PositiveInteger) == EXPT(x, n)$Lisp
        odd? x == ODDP(x)$Lisp
+      even? x == EVENP(x)$Lisp
        max(x, y) == MAX(x, y)$Lisp
        min(x, y) == MIN(x, y)$Lisp
        divide(x, y) == DIVIDE2(x, y)$Lisp
@@ -196,6 +200,17 @@
              zero?(n := shift(n, -1)) => return y
              z := mulmod(z, z, p)

+      -- copied from IntegerNumberSystem to get inline optimization
+      symmetricRemainder(x, n) ==
+          r := x rem n
+          r = 0 => 0
+          if n < 0 then n := -n
+          r > 0 =>
+              2 * r > n => r - n
+              r
+          2 * r + n <= 0 => r + n
+          r
+
  )abbrev domain NNI NonNegativeInteger
  ++ Author:
  ++ Basic Operations:

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to fricas-devel+unsubscr...@googlegroups.com.
To post to this group, send email to fricas-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/fricas-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to