# Math functions

Below are a few mathematical functions for computing the factorial decomposition of an integer, for determining whether a number is a prime number as well as for computing the factorial and the n-th fibonacci number.

    ;; Returns the factorial decomposition of integer `n` in form of a list of prime numbers
    (define (factors n)
      (cond ((negative? n) (cons -1 (factors (- n))))
            ((< n 3)       (list n))
            ((even? n)     (cons 2 (factors (/ n 2))))
            (else          (let loop ((divisor 3) (n n))
                             (if (> (square divisor) n)
                                 (list n)
                                 (if (zero? (modulo n divisor))
                                     (cons divisor (loop divisor (/ n divisor)))
                                     (loop (+ divisor 2) n)))))))

    ;; Returns `#t` if integer `n` is a prime number, `#f` otherwise.
    (define (prime? n)
      (cond ((= n 0)   #f)
            ((= n 1)   #f)
            ((= n 2)   #t)
            ((even? n) #f)
            (else      (let loop ((d 3))
                         (cond ((> (square d) n)        #t)
                               ((zero? (remainder n d)) #f)
                               (else                    (loop (+ d 2))))))))

    ;; Returns the `n`-th Fibonacci number
    (define (fib n)
      (if (fx< n 2)
          n
          (fx+ (fib (fx1- n)) (fib (fx- n 2)))))

    ;; Returns the factorial of integer `n`
    (define (fac n)
      (if (= n 0)
          1
          (* n (fac (- n 1)))))