packages feed

egison-3.6.1: lib/math/common/functions.egi

;;;;;
;;;;;
;;;;; Mathematical Functions
;;;;;
;;;;;

(define $exp
  (lambda [$x]
    (if (float? x)
      (b.exp x)
      (if (term? x)
        (match x term-expr
          {[,0 1]
           [,1 e]
           [<mult $a ,(* i pi)> (** -1 a)]
           [_ (`exp x)]})
        (`exp x)))))

(define $log
  (lambda [$x]
    (if (float? x)
      (b.log x)
      (match x math-expr
        {[,1 0]
         [,e 1]
         [_ (`log x)]}))))

(define $cos
  (lambda [$x]
    (if (float? x)
      (b.cos x)
      (match x math-expr
        {[,0 1]
         [<term $n <cons ,π <nil>>> (** -1 (abs n))]
         [<div <mult _ ,π> ,2> 0]
         [_ (`cos x)]}))))

(define $sin
  (lambda [$x]
    (if (float? x)
      (b.sin x)
      (match x math-expr
        {[,0 0]
         [<mult _ ,π> 0]
         [<div <mult $n ,π> ,2> (** -1 (/ (- (abs n) 1) 2))]
         [_ (`sin x)]}))))

(define $tan
  (lambda [$x]
    (if (float? x)
      (b.tan x)
      (match x math-expr
        {[,0 0]
         [_ (`tan x)]}))))

(define $cosh
  (lambda [$x]
    (if (float? x)
      (b.cosh x)
      (match x math-expr
        {[,0 1]
         [_ (`cosh x)]}))))

(define $sinh
  (lambda [$x]
    (if (float? x)
      (b.sinh x)
      (match x math-expr
        {[,0 0]
         [_ (`sinh x)]}))))

(define $tanh
  (lambda [$x]
    (if (float? x)
      (b.tanh x)
      (match x math-expr
        {[,0 0]
         [_ (`tanh x)]}))))

(define $sinc
  (lambda [$x]
    (if (float? x)
      (if (eq? x 0.0)
        1.0
        (/ (b.sin x) x))
      (match x math-expr
        {[,0 1]
         [_ (/ (sin x) x)]}))))

(define $sigmoid
  (lambda [$z]
    (/ 1 (+ 1 (exp (* -1 z))))))

(define $kronecker-delta
  (cambda $js
    (if (all (eq? $ (car js)) (cdr js)) 1 0)))

(define $euler-totient-function
  (lambda [$n]
    (* n
       (product (map (lambda [$p] (- 1 (/ 1 p)))
                     (unique (p-f n)))))))