chickadee » math-utils

math-utils

Documentation

Miscellaneous Math Functions

Usage

(import math-utils)

fppred

fpsucc

fppred F #!optional Nprocedure
fpsucc F #!optional Nprocedure

Returns the Nth predecessor or successor of a floating-point number.

F
float ; inexact point ;
N
integer ; distance to move point ; default 1

log-with-base

log/base

log-with-base Bprocedure
log/base Bprocedure

Returns a function for the base B logarithm.

degree->radian

radian->degree

degree->radian Nprocedure
radian->degree Nprocedure

Convert between radians & degrees.

N
real

prime?

prime? Nprocedure

Is N prime?

N
integer

primes

(primes [N 2]) -> (-> integer)procedure

Returns an infinite generator for the primes from N, which must be a prime.

(define (generate-primes n)
  (assert (integer? n)
          'generate-primes "bad argument type - not integer" n)
  (assert (not (negative? n))
          'generate-primes "bad argument type - not positive" n)
  (let ((i n)
        (ps (primes)) )
    (lambda ()
      (if (zero? i) #!eof
          (let ((p (ps)))
            (set! i (- i 1))
            p ) ) ) ) )

coprime?

(coprime? M [N0 ...]) -> booleanprocedure

Are the integers M N0 ... coprime?

pairwise-coprime?

(pairwise-coprime? M [N0 ...]) -> booleanprocedure

Are the pairs of integers in M N0 ... coprime?

fxcoprime?

fxcoprime? M Nprocedure

Are the fixnums M N coprime?

(import (only (srfi 1) filter iota))
(import (only (math-utils) fxcoprime?))

(define (coprimes n)
  (filter (cut fxcoprime? n <>) (iota (- n 1) 1)) )
(import (only (streams derived) stream-range stream-filter))
(import (only (math-utils) fxcoprime?))

(define (coprime-numbers-stream n)
  (stream-filter (cut fxcoprime? n <>) (stream-range 1 n)) )

simple-interest

simple-interest RATE TIME #!optional PRINprocedure

The accumulation function, the principle is assumed 1. Returns the simple interest for the RATE over TIME.

RATE
number ; interest rate
TIME
number ; time period to cover
PRIN
number ; principle, default 1

compound-interest

compound-interest RATE FREQ TIME #!optional PRINprocedure

The accumulation function, the principle is assumed 1. Returns the compound interest for the RATE, applied with FREQ, over TIME.

RATE
number ; interest rate
FREQ
number ; compounding frequency
TIME
number ; time period to cover
PRIN
number ; principle, default 1
(compound-interest 0.043 4 6 1500)
;=> 1938.84 ;rounded to 2 places

fibonacci

*fibonacci

fibonacci/memo

*fibonacci/memo

fibonacci Nprocedure
*fibonacci Nprocedure
fibonacci/memo Nprocedure
*fibonacci/memo Nprocedure

Returns fibonacci of integer N.

fibonacci/approximate

fibonacci/approximate Nprocedure

Returns an approximate fibonacci of integer N, with an error of > 1 at N ~= 70.

binomial

*binomial

binomial/memo

*binomial/memo

binomial N Kprocedure
*binomial N Kprocedure
binomial/memo N Kprocedure
*binomial/memo N Kprocedure

Returns the number of combinations of length K in N.

N1
integer
N2
integer

cross-ratio

cross-ratio N1 N2 N3 N4procedure

Returns the Cross-ratio of N1, N2 and N3, N4.

N1
number
N2
number
N3
number
N4
number

~=

(~= A B [EPSILON 1e-05]) -> booleanprocedure

Does A approximately equal B?

chinum

*chinum

chinum Nprocedure
(*chinum N) -> fixnumsyntax

Returns 1 for even? and -1 for odd; (expt -1 N).

square

sqr

square Nprocedure
(sqr N) -> numbersyntax

cube

cub

cube Nprocedure
(cub N) -> numbersyntax

minimum ((list-of number) -> number))

minimum LSprocedure
LS
(list-of number)

maximum ((list-of number) -> number))

maximum LSprocedure
LS
(list-of number)

range-value ((list-of number) -> number))

range-value LSprocedure
LS
(list-of number)

*average

*average LSprocedure
LS
(list-of number)

average

(average [N0 ...]) -> numberprocedure
N0
number

average*

(average* [TREE ...]) -> numberprocedure
TREE
(tree-of number)

least-squares

least-squares PNTSprocedure

Returns b & e such that y ~= b * x + e.

PNTS
(list-of (pair number number)) ; list of x,y pairs

euclidian-distance

euclidian-distance X1 Y1 X2 Y2procedure
X1 Y1
number number ; start point
X2 Y2
number number ; end point

manhattan-distance

manhattan-distance X1 Y1 X2 Y2procedure
X1 Y1
number number ; start point
X2 Y2
number number ; end point

factorial

*factorial

factorial/memo

*factorial/memo

factorial Nprocedure
*factorial Nprocedure
factorial/memo Nprocedure
*factorial/memo Nprocedure
N
integer

factorial-

*factorial-

factorial- N FALLprocedure
*factorial- N FALLprocedure

The falling factorial.

N
real
FALL
integer

factorial+

*factorial+

factorial+ N RISEprocedure
*factorial+ N RISEprocedure

The rising factorial.

N
real
RISE
integer

harmonic

*harmonic

harmonic/memo

*harmonic/memo

harmonic Nprocedure
*harmonic Nprocedure

procedure>(harmonic/memo N) -> real</procedure> <procedure>(*harmonic/memo N) -> real</procedure>

Result of Harmonic series expansion to N terms.

N
integer

euclidian-distance

euclidian-distance X1 Y1 X2 Y2procedure

Distance between X1,Y1 and X2,Y2.

X1 Y1
number number ; from point
X2 Y2
number number ; to point

manhattan-distance

manhattan-distance X1 Y1 X2 Y2procedure

Distance between X1,Y1 and X2,Y2.

X1 Y1
number number ; from point
X2 Y2
number number ; to point

to-places

@prec

(to-places PREC (FUNC EXPR))syntax
(@prec PREC EXPR [FUNC truncate])procedure

Truncate the result of (FUNC EXPR) to PREC decimal places.

PREC
fixnum ; precision
FUNC
symbol ; clip operation, i.e. round, etc.
EXPR
* ; value to clip

slope

(slope P1|X1 P2|Y1 [X2 Y2]) -> numberprocedure

Slope of a line defined by 2 points, P1 & P2 or X1 Y1 & X2 Y2.

P1 & P2
(pair number number)
X1 Y1 & X2 Y2
number number

delta-slope

slope DX DYprocedure

Slope of a line delta.

DX}
number ; change in x
DY
number ; change in y

fxrnd

fxrnd #!optional LIMITprocedure

Return a random fixnum in the range [0 LIMIT).

LIMIT}
fixnum ; default most-positive-fixnum

big-pi

(big-pi F N1 N2) -> numbersyntax

Product of F in N1 to N2.

F
(number -> number) ;
N1
number ; range start
N2
number ; range end

big-sigma

(big-sigma F N1 N2) -> numbersyntax

Sum of F in N1 to N2.

F
(number -> number) ;
N1
number ; range start
N2
number ; range end

prod

(prod VAR ([N1 [N2 [STEP]]]) BODY...) -> numbersyntax

Product of BODY... in N1 to N2, inclusive, by STEP. When N1 > N2 the STEP becomes negative.

VAR
symbol ; VAR bound to current N in BODY...
BODY...
number ;
N1
number ; range start
N2
number ; range end
STEP
number ; step size, positive, default 1

summ

(summ VAR ([N1 [N2 [STEP]]]) BODY...) -> numbersyntax

Sum of BODY... in N1 to N2, inclusive, by STEP. When N1 > N2 the STEP becomes negative.

VAR
symbol ; VAR bound to current N in BODY...
BODY...
number ;
N1
number ; range start
N2
number ; range end
STEP
number ; step size, positive, default 1

Integration Functions

Usage

(import (math-utils integration))

trapezoid

trapezoid F A Bprocedure

Returns a function to calculate the area under F between A & B using the Trapezoid Rule. The function takes the number of estimations as an argument, larger for a "better" result.

F
(number -> number) ; function to integrate
A
number ; lower bound
B
number ; upper bound

simpson

simpson F A B #!optional Nprocedure

Calculate the area under F between A & B

F
(number -> number) ; function to integrate
A
number ; lower bound
B
number ; upper bound
N
fixnum ; interval count, default 6.

Composite Simpson's 1/3 rule.

simpson/adaptive

simpson/adaptive F A B EPSILONprocedure
F
(number -> number) ; function to integrate
A
number ; lower bound
B
number ; upper bound
EPSILON
real ; error threshold for result

gamma

gamma N EPSILONprocedure

The gamma function at N.

N
real
EPSILON
real ; error threshold for result

Regession Functions

Usage

(import (math-utils regression))

linear-regression

linear-regression SRCprocedure

Returns the slope & intercept values of the line fitted to the data from SRC.

SRC
(or list vector (-> (or eof *)))

linear-extrapolator

linear-extrapolator SRCprocedure

Returns a procedure taking the x coordinate of the line fitted to the data from SRC, and return the y.

SRC
(or (list-of real) (vector-of real) (-> (or eof real)))

big-sigma*

big-pi*

big-sigma* SRC REDUCER ...procedure
big-pi* SRC REDUCER ...procedure

Returns reduced values for each REDUCER, in order.

SRC
(or list vector (-> (or eof *)))
REDUCER
(#!rest * -> real)

accumulate-step

(accumulate-step ('a 'a -> 'a) (list-of (#!rest * -> 'a)) (list-of 'a) *) -> (list-of 'a)procedure

summs-accumulate-step

prods-accumulate-step

(summs-accumulate-step (real real -> real) (list-of (#!rest * -> real)) (list-of real) *) -> (list-of real)procedure
(prods-accumulate-step (real real -> real) (list-of (#!rest * -> real)) (list-of real) *) -> (list-of real)procedure

reduce-data

reduce-data SRC ACC REDUCER ...procedure

Returns reduced values for each REDUCER, in order.

SRC
(or list vector (-> (or eof *)))
ACC
((list-of (#!rest * -> 'a)) (list-of 'a) * -> (list-of 'a))
REDUCER
(#!rest * -> *)

Miscellaneous Vector Math Functions

Usage

(import (math-utils vector))

absolute-magnitude

absolute-magnitude NUMVECprocedure
NUMVEC
(vector-of number) ; .

cosine-similarity

cosine-similarity NUMVEC1 NUMVEC2procedure
NUMVEC1
(vector-of number) ; .
NUMVEC2
(vector-of number) ; .

Must be same vector-length.

vector-compare

vector-compare VEC ... #!optional DIFFprocedure

Result is negative, zero, or positive. Comparison by length when unequal & element-wise when equal.

VEC
(vector) ; .
DIFF
((* * -> number)) ; quantified difference function.

vector-compare2

vector-compare2 VEC1 VEC2 #!optional DIFFprocedure

Result is negative, zero, or positive. Comparison by length when unequal & element-wise when equal.

VEC1
(vector-of 'a) ; .
VEC2
(vector-of 'b) ; .
DIFF
(('a 'b -> number)) ; quantified difference function.

dot-product

dot-product NUMVEC1 NUMVEC2procedure
NUMVEC1
(vector-of number) ; .
NUMVEC2
(vector-of number) ; .

Must be same vector-length.

cross-product

cross-product NUMVEC1 NUMVEC2procedure

Only defined for a vector-length of (0 1 2 3 4 8). All others generate an error. Must be same vector-length.

NUMVEC1
(vector-of number) ; .
NUMVEC2
(vector-of number) ; .

vector-sum

vector-prod

vector-min

vector-max

vector-sum NUMVECprocedure
vector-prod NUMVECprocedure
vector-min NUMVECprocedure
vector-max NUMVECprocedure

softmax

softmax NUMVECprocedure

Returns the softmax of the vector elements. Normalize the vector elements so (= 1 (vector-sum NUMVEC)).

NUMVEC
(vector-of number) ; .

softmax*

softmax* NUMVEC #!optional TEMPprocedure

Returns the softmax of the tempered vector elements. Spread, (< 1 TEMP), or shrink, (> 1 TEMP), data before normalization. A TEMP of 1 has no effect.

NUMVEC
(vector-of number) ; .
TEMP
real ; temperature, default 1.

vector-reduce

vector-reduce FUNC SEED VEC #!optional START ENDprocedure
FUNC
('a 'b -> 'a) ; .
SEED
'a ; initial value.
VEC
(vector-of 'b ; vector to reduce.
START
fixnum ; start index of VEC, default 0.
END
fixnum ; end index of VEC, default (vector-length VEC).

vector-reduce

subvector-reduce FUNC VEC #!optional WIDTH OVERLAY START ENDprocedure

Returns a vector from the application of FUNC to every set of sequential WIOTH elements in VEC; the subinterval. Should the VEC have a non-integer number of subinterval the remainder is treated a vector with WIDTH the remaining length. It is up to the caller to ensure an integral subinterval count.

FUNC
('b #!optional 'b -> 'a) ; .
VEC
(vector-of 'b ; vector to reduce.
WIDTH
fixnum ; subinterval width, default 2.
OVERLAY
fixnum ; subinterval shift, default WIDTH.
START
fixnum ; start index of VEC, default 0.
END
fixnum ; end index of VEC, default (vector-length VEC).

vector-apply

(vector-apply FUNC [VEC1 VEC2 VEC...]) -> (vector-of 'a)procedure
FUNC
('t1 't2 ... -> 'a ; .
VEC#
(vector-of 't#) ; .

Must be same vector-length.

(import (only (math-utils vector) vector-apply))

(define (vector-mul . vs) (apply vector-apply * vs))
(define (vector-add . vs) (apply vector-apply + vs))

vector-scale

vector-shift

vector-scale NUMVEC FACTORprocedure
vector-shift NUMVEC BIASprocedure
NUMVEC
(vector-of number) ; .

normalize-vector-scale

normalize-vector-shift

normalize-vector-scale NUMVECprocedure
normalize-vector-shift NUMVECprocedure

vector-scale by the (/ (vector-maximum)). vector-shift by the (- (vector-minimum)).

NUMVEC
(vector-of number) ; .

Examples

(import scheme)
(import (chicken base))
(import (rename (only math-utils
                  summ sqr
                  ;non-checking & memoized version is used
                  *chinum factorial/memo *factorial+/memo)
                (*chinum chinum)
                (factorial/memo factorial)
                (*factorial+/memo factorial+)))

;https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.132.221601
;@lam `lambda' param
(define (saha-sinha-pi #!optional (lim 100) (lam 4))
  (+ 4 (summ n (1 lim)
             (let* ((2n (* 2 n)) (2n+1 (+ 2n 1)))
               (* (/ 1 (factorial n))
                  (- (/ 1 (+ n lam)) (/ 4 2n+1))
                  (factorial+ (- (/ (sqr 2n+1) (+ (* 2 2n) (* 4 lam))) n)
                              (- n 1)))))) )

(define (madhava-leibniz-pi #!optional (lim 100))
  (* 4 (summ n (1 lim) (/ (chinum (- n 1)) (- (* 2 n) 1)))) )

(- (acos -1) (saha-sinha-pi))       ;=> 1.90993887372315e-11
(- (acos -1) (madhava-leibniz-pi))  ;=> -0.0101007524813226

Requirements

memoize miscmacros vector-lib fx-utils

test test-utils

Author

Kon Lovett

Repository

This egg is hosted on the CHICKEN Subversion repository:

https://anonymous@code.call-cc.org/svn/chicken-eggs/release/5/math-utils

If you want to check out the source code repository of this egg and you are not familiar with Subversion, see this page.

Version history

1.18.0
Add subvector-reduce overlay argument. summ & prod will count down.
1.17.0
Add subvector-reduce. Widen vector type, not just number, for vector-apply. vector-compare, & vector-reduce. Add optional difference function argument to vector-compare*. Add integration & regression modules. moving trapezoid & linear-regression.
1.16.0
Add minimum, maximum, range-value, fxrnd.
1.15.2
Change factorial+/-.
1.15.1
Fix type signatures.
1.15.0
CHICKEN 6 release. Remove square (scheme base). Add accumulate-step, summs-accumulate-step, prods-accumulate-step, reduce-data, big-sigma*, big-pi*, linear-regression, linear-extrapolator.

License

This code is in the public domain.

Contents »