;;; .EnTete "Le-Lisp (c) version 15.2" " " "Test des fonctions sur Q"
;;; .EnPied "testratio.ll" "%" " "
;;;
;;; .SuperTitre "Test des fonctions sur Q"
;;;
;;;
;;; .Centre "*****************************************************************"
;;; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA.  "
;;; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
;;; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA                 "
;;; .Centre "*****************************************************************"
;;;
;;; .Centre "$Header: testratio.ll,v 4.1 88/01/13 12:32:23 kuczynsk Rel $"

(unless (>= (version) 15.2)
        (error 'load 'erricf 'testratio))

(unless (featurep 'ratio)
        (print "Je charge les rationels interpretes")
        (libload ratio t))

(libload testgenr t)

; Re'sultats du bench arithme'tique sur diverses machines:

(de hit-parade ()
(print "Le Hit Parade De l'Arithme'tique LeLisp sur Diverses Machines")
(print "Porteurs, envoyez vos re'sultats a` vuillemin@inria. Merci!")
(print)
(print "Machine  Config   Type du bench       Ancien Bench  Temps Total")
(print "sps7     8M       interprete             28.83         ??")
(print "sps7     8M       compile mou             5.73         ??")
(print "sps7     8M       compile dur             2.02         ??")
(print)
(print "Vax750   VMS      interprete             27.01       70.7")
(print "Vax750   VMS      compile mou             5.96       18.9")
(print "Vax750   VMS      compile dur             1.94        5.53")
(print)
(print "sun2     4M       interprete             25.10         ??")
(print "sun2     4M       compile mou             5.41         ??")
(print "sun2     4M       compile dur             1.82         ??")
(print)
(print "hp9000-300 68020  interprete             10.40         ??")
(print "hp9000-300 68020  compile mou             2.66         ??")
(print "hp9000-300 68020  compile dur              .87         ??")
(print)
(print "Ridge 4M  ROS 3.3 interprete             12.78       32.46")
(print "Ridge 4M  ROS 3.3 compile mou             2.93        9.74")
(print "Ridge 4M  ROS 3.3 compile dur              .87        2.70")
(print)
(print "Vax785   Unix     interprete             10.61       27.54")
(print "Vax785   Unix     compile mou             2.21        7.01")
(print "Vax785   Unix     compile dur              .75        2.25")
(print)
(print "Sun3/75  Unix     interprete              8.51       21.96")
(print "Sun3/75  Unix     compile mou             1.84        5.66")
(print "Sun3/75  Unix     compile dur              .56        1.66")
(print)
(print "Vax8600  Ultrix   interprete              4.91       13.11")
(print "Vax8600  Ultrix   compile mou              .89        2.90")
(print "Vax8600  Ultrix   compile dur              .31         .90")
)


(defvar #:sys-package:colon 'R)
 
;.Section "Nombres Harmoniques et Fonction Zeta."
; Calcule 1 + 1/2**e + 1/3**e + ... + 1/n**e
; Teste les rationnels.
(de zeta (n e)
    (let ((r 0))
         (for (i 1 1 n)
              (setq r (+ r (1/ (** i e)))))
         r))
;  "Le nombre :e(n) = 1 + 1/2! + ... + 1/n!"
(de serie-e (n)
    (let ((e 1))
         (for (i 1 1 n) (setq e (+ e (1/ (fact i)))))
         e))

; "Teste l'addition sur N"
(de fib+ (n)
    (let ((fn 0) (fn+1 1))
         (repeat n (psetq fn+1 (+ fn fn+1) fn fn+1))
         fn))

(defvar v32 (** 10 9))

; Teste l'arithme'tique entre 16 et 32 bits.
(de fub (n)
    (cond ((= n v32) v32)
          ((= n (+ v32 1)) (+ v32 1))
          (t (+ (fub (1- n)) (fub (- n 2))))))

; Teste les sommes et produits 32 bits.
(de sommes (n)
    (repeat n (+ v32 v32) (* v32 v32)))

; Tente de mesurer le temps de calcul de exp:
(de ebench (exp)
    (let ((tps 0.))
         (repeat 5 (gc) (setq tps (+ tps (time '(eval exp)))))
         (setq tps (/ tps 5))
         (print "Temps de " exp " = " tps)
         tps))

; Tente de mesurer le temps de diverses fonctions arithme'tiques:

(print "Faire (bench) pour le benchmark")
(print "Essayer (bench) en interpre'te' et en compile', par les 2 compilos")
(print "Ne pas oublier (compile-all-in-core) pour compiler le bench lui-mm")

(de bench arg
    (if (null arg) (lebench)
        (let ((tps))
             (let ((#:sys-package:itsoft 'test)) (setq tps (lebench)))
             (print  " Temps total = " tps))))

(de lebench ()
    (hit-parade)
    (let ((tps 0))
         (setq tps (+ tps (ebench '(fib+ 200))))
         (setq tps (+ tps (ebench '(fib 500))))
         (setq tps (+ tps (ebench '(fact 200))))
         (setq fib1000 (fib 1000))
         (setq fact200 (fact 200) fact150 (fact 150))
         (setq tps (+ tps (ebench '(quotient fact200 fact150))))
         (setq tps (+ tps (ebench '(zeta 10 3))))
         (setq tps (+ tps (ebench '(serie-e 10))))
         (print "Temps de l'ancien bench = " tps)
         (setq tps (+ tps 
            (ebench
                   '(let ((#:sys-package:itsoft
                            (cons 'testprint #:sys-package:itsoft)))
                         (print fib1000)))))
         (setq tps (+ tps (ebench '(fub (+ v32 12)))))
         (setq tps (+ tps (ebench '(integerp (zeta 12 3)))))
         (setq tps (+ tps (ebench '(sommes 1000))))
         (print "Temps total du bench = " tps)
    ))
 
; Pour e'viter d'e'crire dans le test de vitesse du print:
(de #:testprint:eol () (outpos 0))

; Appel de la fonction de test 

(testfn ())

          (test-serie "Test des rationnels" ())

      1/0           		  1/0
     -2/0          		  -1/0
      (1+ -2/0)         -1/0
     (+ -1/0 2/3)        -1/0
     (+ 1/0 -1/0)        0/0
     (- 1/0)              -1/0
     (- 0/0)              0/0
     (* -1/0 1/0)            -1/0
     (* 1/0 0)                 0/0
     (/ 999999999 81)       12345679
     (/ -1/0)                 0
     (rationalp 1243245)     1243245
     (rationalp 3/2)         3/2
     (integerp -4/2)         -2
     (integerp 4/3)          ()
     (integerp 4/2)          2
     (integerp 4/3)          ()
     
     (modulo (fact 13) (fact 9))       0
     (modulo (fact 34) (fact 24))      0
;    (modulo (fact 34) (fact 13))      0
     (modulo (fact 57) (fact 21))      0
     (modulo (fact 40) (fact 39))     0  
     (quotient (fact 59) (fact 58))   59
     (quotient   22685491128062564230891640495451214097
                 5281877500950955845296219748)        4294967295
    (NUMERATOR -4/3)      -4
    (DENOMINATOR -4/3)    3
    (NUMERATOR 7)           7
    (DENOMINATOR 7)         1
     (** 2 128)   		 340282366920938463463374607431768211456
     (** 0 0)                    0/0
     (truncate 123456)              123456
     (truncate -123456)             -123456
;     (truncate (power 2 50))      1125899906842624
     (truncate (power 2 20))      1048576
;     (truncate (power 10 10)))    10000000000
;     (truncate (- (power 2 50)))  -1125899906842624
     (truncate (- (power 2 20)))    -1048576
;     (truncate (- (power 10 10)))) -10000000000
     (truncate 123.456789)          123
     (truncate 1234.56789)          1234
     (truncate 12345.6789)          12345
     (truncate 123456.789)          123456
     (truncate 1234567.89)          1234567
     (truncate 12345678.9)          12345678
     (truncate -123.456789)         -123
     (truncate -1234.56789)         -1234
     (truncate -12345.6789)         -12345
     (truncate -123456.789)         -123456
     (truncate -1234567.89)         -1234567
     (truncate -12345678.9)         -12345678

;     (truncate -14232453423.123423) -14232453423
     (quotient 10011100.23 1)    10011100
    (gcd 1769 551)            29
    (gcd 12432245661452 314523541234) 2
    

     (fact 42)  1405006117752879898543142606244511569936384000000000
     (fib 250)  7896325826131730509282738943634332893686268675876375

    (zeta 10 1)  		 7381/2520
    (zeta 10 2)  		 1968329/1270080
    (serie-e 20)  		 6613313319248080001/2432902008176640000
    (float (setq e (serie-e 18))) 2.71828182845904523536
    (+ e 0.0)                     2.71828182845904523536
    (* e 1.0)                     2.71828182845904523536
    (/ e 1.0)                     2.71828182845904523536
    (+ 1/0 1/0)                   1/0
   (+ (* -113/47 (quomod 22/7 -113/47)) #:ex:mod) 22/7
    (- 1/0 1/0)                   1/0

          (test-serie "Fin du test" ())

    ()                            ()