;-*- Mode:     Lisp -*-
;;;; Author:   Paul Dietz
;;;; Created:  Thu Aug 21 14:21:07 2003
;;;; Contains: Aux. functions for testing ROUND



(defun round.1-fn ()
  (loop for n = (- (random 2000000000)
                   1000000000)
        for d = (1+ (random 10000))
        for vals = (multiple-value-list (round n d))
        for (q r) = vals
        for n2 = (+ (* q d) r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (= n n2)
                    (integerp r)
                    (<= (- (/ d 2)) r (/ d 2)))
        unless (or (not (= (abs r) (/ d 2)))
                   (evenp q))
        collect (list n d q r n2)))

(defun round.2-fn ()
  (loop for num = (random 1000000000)
        for denom = (1+ (random 1000))
        for n = (/ num denom)
        for d = (1+ (random 10000))
        for vals = (multiple-value-list (round n d))
        for (q r) = vals
        for n2 = (+ (* q d) r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (<= (- (/ d 2)) r (/ d 2))
                    (or (not (= (abs r) (/ d 2)))
                        (evenp q))
                    (= n n2))
        collect (list n d q r n2)))

(defun round.3-fn (width)
  (loop for n = (- (random width) (/ width 2))
        for vals = (multiple-value-list (round n))
        for (q r) = vals
        for n2 = (+ q r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (= n n2)
                    (<= -1/2 r 1/2)
                    (or (not (= (abs r) 1/2))
                        (evenp q))
                    )
        collect (list n q r n2)))

(defun round.7-fn ()
  (loop for numerator = (- (random 10000000000) 5000000000)
        for denominator = (1+ (random 100000))
        for n = (/ numerator denominator)
        for vals = (multiple-value-list (round n))
        for (q r) = vals
        for n2 = (+ q r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (rationalp r)
                    (= n n2)
                    (<= -1/2 r 1/2)
                    (or (not (= (abs r) 1/2))
                        (evenp q))
                    )
        collect (list n q r n2)))

(defun round.8-fn ()
  (loop for num1 = (- (random 10000000000) 5000000000)
        for den1 = (1+ (random 100000))
        for n = (/ num1 den1)
        for num2 = (- (1+ (random 1000000)))
        for den2 = (1+ (random 1000000))
        for d = (/ num2 den2)
        for vals = (multiple-value-list (round n d))
        for (q r) = vals
        for n2 = (+ (* q d) r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (rationalp r)
                    (<= (/ d 2) r (- (/ d 2)))
                    (or (not (= (abs r) (- (/ d 2))))
                        (evenp q))
                    (= n n2))
        collect (list n q d r n2)))

(defun round.9-fn ()
  (loop for num1 = (- (random 1000000000000000) 500000000000000)
        for den1 = (1+ (random 10000000000))
        for n = (/ num1 den1)
        for num2 = (- (1+ (random 1000000000)))
        for den2 = (1+ (random 10000000))
        for d = (/ num2 den2)
        for vals = (multiple-value-list (round n d))
        for (q r) = vals
        for n2 = (+ (* q d) r)
        repeat 1000
        unless (and (eql (length vals) 2)
                    (integerp q)
                    (rationalp r)
                    (<= (/ d 2) r (- (/ d 2)))
                    (or (not (= (abs r) (- (/ d 2))))
                        (evenp q))
                    (= n n2))
        collect (list n q d r n2)))
