Wiki
Download
Manual
Eggs
API
Tests
Bugs
show
edit
history
You can edit this page using
wiki syntax
for markup.
Article contents:
[[tags: egg]] == math-utils [[toc:]] == Documentation === Miscellaneous Math Functions ==== Usage <enscript language=scheme> (import math-utils) </enscript> ==== fppred ==== fpsucc <procedure>(fppred F [N]) -> float</procedure> <procedure>(fpsucc F [N]) -> float</procedure> Returns the {{N}}th 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 <procedure>(log-with-base B) -> (real -> real)</procedure> <procedure>(log/base B) -> (real -> real)</procedure> Returns a function for the base {{B}} logarithm. ==== degree->radian ==== radian->degree <procedure>(degree->radian N) -> real</procedure> <procedure>(radian->degree N) -> real</procedure> Convert between ''radians'' & ''degrees''. ; {{N}} : {{real}} ==== prime? <procedure>(prime? N) -> boolean</procedure> Is {{N}} ''prime''? ; {{N}} : {{integer}} ==== primes <procedure>(primes [N 2]) -> (-> integer)</procedure> Returns an ''infinite generator'' for the primes from {{N}}, which must be a prime. <enscript language=scheme> (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 ) ) ) ) ) </enscript> ==== coprime? <procedure>(coprime? M [N0 ...]) -> boolean</procedure> Are the integers {{M N0 ...}} coprime? ==== pairwise-coprime? <procedure>(pairwise-coprime? M [N0 ...]) -> boolean</procedure> Are the pairs of integers in {{M N0 ...}} coprime? ==== fxcoprime? <procedure>(fxcoprime? M N) -> boolean</procedure> Are the fixnums {{M N}} coprime? <enscript language=scheme> (import (only (srfi 1) filter iota)) (import (only (math-utils) fxcoprime?)) (define (coprimes n) (filter (cut fxcoprime? n <>) (iota (- n 1) 1)) ) </enscript> <enscript language=scheme> (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)) ) </enscript> ==== simple-interest <procedure>(simple-interest RATE TIME [PRIN]) -> number</procedure> 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 <procedure>(compound-interest RATE FREQ TIME [PRIN]) -> number</procedure> 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}} <enscript language=scheme> (compound-interest 0.043 4 6 1500) ;=> 1938.84 ;rounded to 2 places </enscript> ==== fibonacci ==== *fibonacci ==== fibonacci/memo ==== *fibonacci/memo <procedure>(fibonacci N) -> integer</procedure> <procedure>(*fibonacci N) -> integer</procedure> <procedure>(fibonacci/memo N) -> integer</procedure> <procedure>(*fibonacci/memo N) -> integer</procedure> Returns fibonacci of {{integer}} {{N}}. ==== fibonacci/approximate <procedure>(fibonacci/approximate N) -> real</procedure> Returns an approximate fibonacci of {{integer}} {{N}}, with an error of > 1 at N ~= 70. ==== binomial ==== *binomial ==== binomial/memo ==== *binomial/memo <procedure>(binomial N K) -> integer</procedure> <procedure>(*binomial N K) -> integer</procedure> <procedure>(binomial/memo N K) -> integer</procedure> <procedure>(*binomial/memo N K) -> integer</procedure> Returns the number of combinations of length {{K}} in {{N}}. ; {{N1}} : {{integer}} ; {{N2}} : {{integer}} ==== cross-ratio <procedure>(cross-ratio N1 N2 N3 N4) -> number</procedure> Returns the {{Cross-ratio}} of {{N1}}, {{N2}} and {{N3}}, {{N4}}. ; {{N1}} : {{number}} ; {{N2}} : {{number}} ; {{N3}} : {{number}} ; {{N4}} : {{number}} ==== ~= <procedure>(~= A B [EPSILON 1e-05]) -> boolean</procedure> Does {{A}} approximately equal {{B}}? ==== chinum ==== *chinum <procedure>(chinum N) -> fixnum</procedure> <syntax>(*chinum N) -> fixnum</syntax> Returns {{1}} for {{even?}} and {{-1}} for {{odd}}; {{(expt -1 N)}}. ==== square ==== sqr <procedure>(square N) -> number</procedure> <syntax>(sqr N) -> number</syntax> ==== cube ==== cub <procedure>(cube N) -> number</procedure> <syntax>(cub N) -> number</syntax> ==== minimum ((list-of number) -> number)) <procedure>(minimum LS) -> number</procedure> ; {{LS}} : {{(list-of number)}} ==== maximum ((list-of number) -> number)) <procedure>(maximum LS) -> number</procedure> ; {{LS}} : {{(list-of number)}} ==== range-value ((list-of number) -> number)) <procedure>(range-value LS) -> number</procedure> ; {{LS}} : {{(list-of number)}} ==== *average <procedure>(*average LS) -> number</procedure> ; {{LS}} : {{(list-of number)}} ==== average <procedure>(average [N0 ...]) -> number</procedure> ; {{N0}} : {{number}} ==== average* <procedure>(average* [TREE ...]) -> number</procedure> ; {{TREE}} : {{(tree-of number)}} ==== least-squares <procedure>(least-squares PNTS) -> number number</procedure> Returns {{b}} & {{e}} such that {{y ~= b * x + e}}. ; {{PNTS}} : {{(list-of (pair number number))}} ; list of x,y pairs ==== euclidian-distance <procedure>(euclidian-distance X1 Y1 X2 Y2) -> number</procedure> ; {{X1 Y1}} : {{number number}} ; start point ; {{X2 Y2}} : {{number number}} ; end point ==== manhattan-distance <procedure>(manhattan-distance X1 Y1 X2 Y2) -> number</procedure> ; {{X1 Y1}} : {{number number}} ; start point ; {{X2 Y2}} : {{number number}} ; end point ==== factorial ==== *factorial ==== factorial/memo ==== *factorial/memo <procedure>(factorial N) -> integer</procedure> <procedure>(*factorial N) -> integer</procedure> <procedure>(factorial/memo N) -> integer</procedure> <procedure>(*factorial/memo N) -> integer</procedure> ; {{N}} : {{integer}} ==== factorial- ==== *factorial- <procedure>(factorial- N FALL) -> real</procedure> <procedure>(*factorial- N FALL) -> real</procedure> The falling factorial. ; {{N}} : {{real}} ; {{FALL}} : {{integer}} ==== factorial+ ==== *factorial+ <procedure>(factorial+ N RISE) -> real</procedure> <procedure>(*factorial+ N RISE) -> real</procedure> The rising factorial. ; {{N}} : {{real}} ; {{RISE}} : {{integer}} ==== harmonic ==== *harmonic ==== harmonic/memo ==== *harmonic/memo <procedure>(harmonic N) -> real</procedure> <procedure>(*harmonic N) -> real</procedure> procedure>(harmonic/memo N) -> real</procedure> <procedure>(*harmonic/memo N) -> real</procedure> Result of ''Harmonic'' series expansion to {{N}} terms. ; {{N}} : {{integer}} ==== euclidian-distance <procedure>(euclidian-distance X1 Y1 X2 Y2) -> number</procedure> Distance between {{X1,Y1}} and {{X2,Y2}}. ; {{X1 Y1}} : {{number number}} ; from point ; {{X2 Y2}} : {{number number}} ; to point ==== manhattan-distance <procedure>(manhattan-distance X1 Y1 X2 Y2) -> number</procedure> Distance between {{X1,Y1}} and {{X2,Y2}}. ; {{X1 Y1}} : {{number number}} ; from point ; {{X2 Y2}} : {{number number}} ; to point ==== to-places ==== @prec <syntax>(to-places PREC (FUNC EXPR))</syntax> <procedure>(@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 <procedure>(slope P1|X1 P2|Y1 [X2 Y2]) -> number</procedure> 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 <procedure>(slope DX DY) -> number</procedure> Slope of a line delta. ; {{DX}}} : {{number}} ; change in x ; {{DY}} : {{number}} ; change in y ==== fxrnd <procedure>(fxrnd [LIMIT]) -> fixnum</procedure> Return a random {{fixnum}} in the range {{[0 LIMIT)}}. ; {{LIMIT}}} : {{fixnum}} ; default {{most-positive-fixnum}} ==== big-pi <syntax>(big-pi F N1 N2) -> number</syntax> Product of {{F}} in {{N1}} to {{N2}}. ; {{F}} : {{(number -> number)}} ; ; {{N1}} : {{number}} ; ; {{N2}} : {{number}} ; ==== big-sigma <syntax>(big-sigma F N1 N2) -> number</syntax> Sum of {{F}} in {{N1}} to {{N2}}. ; {{F}} : {{(number -> number)}} ; ; {{N1}} : {{number}} ; ; {{N2}} : {{number}} ; ==== prod <syntax>(prod VAR ([N1 [N2 [INC]]]) BODY...) -> number</syntax> Product of {{BODY...}} in {{N1}} to {{N2}} by {{INC}}. ; {{VAR}} : {{symbol}} ; {{VAR}} bound to current {{N}} in {{BODY...}} ; {{BODY...}} : {{number}} ; ; {{N1}} : {{number}} ; ; {{N2}} : {{number}} ; ; {{INC}} : {{number}} ; ==== summ <syntax>(summ VAR ([N1 [N2 [INC]]]) BODY...) -> number</syntax> Sum of {{BODY...}} in {{N1}} to {{N2}} by {{INC}}. ; {{VAR}} : {{symbol}} ; {{VAR}} bound to current {{N}} in {{BODY...}} ; {{BODY...}} : {{number}} ; ; {{N1}} : {{number}} ; ; {{N2}} : {{number}} ; ; {{INC}} : {{number}} ; === Integration Functions ==== Usage <enscript language=scheme> (import (math-utils integration)) </enscript> ==== trapezoid <procedure>(trapezoid F A B) -> (fixnum -> number)</procedure> 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 <procedure>(simpson F A B [N]) -> (fixnum -> number)</procedure> 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 <procedure>(simpson/adaptive F A B EPSILON) -> (fixnum -> number)</procedure> ; {{F}} : {{(number -> number)}} ; function to integrate ; {{A}} : {{number}} ; lower bound ; {{B}} : {{number}} ; upper bound ; {{EPSILON}} : {{real}} ; error threshold for result ==== gamma <procedure>(gamma N EPSILON) -> real</procedure> The ''gamma'' function at {{N}}. ; {{N}} : {{real}} ; {{EPSILON}} : {{real}} ; error threshold for result === Regession Functions ==== Usage <enscript language=scheme> (import (math-utils regression)) </enscript> ==== linear-regression <procedure>(linear-regression SRC -> real real</procedure> Returns the slope & intercept {{values}} of the line ''fitted'' to the data from {{SRC}}. ; {{SRC}} : {{(or list vector (-> (or eof *)))}} ==== linear-extrapolator <procedure>(linear-extrapolator SRC) -> (real -> real)</procedure> 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* <procedure>(big-sigma* SRC REDUCER ...) -> * ...</procedure> <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 <procedure>(accumulate-step ('a 'a -> 'a) (list-of (#!rest * -> 'a)) (list-of 'a) *) -> (list-of 'a)</procedure> ==== summs-accumulate-step ==== prods-accumulate-step <procedure>(summs-accumulate-step (real real -> real) (list-of (#!rest * -> real)) (list-of real) *) -> (list-of real)</procedure> <procedure>(prods-accumulate-step (real real -> real) (list-of (#!rest * -> real)) (list-of real) *) -> (list-of real)</procedure> ==== reduce-data <procedure>(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 <enscript language=scheme> (import (math-utils vector)) </enscript> ==== absolute-magnitude <procedure>(absolute-magnitude NUMVEC) -> number</procedure> ; {{NUMVEC}} : {{(vector-of number)}} ; . ==== cosine-similarity <procedure>(cosine-similarity NUMVEC1 NUMVEC2) -> number</procedure> ; {{NUMVEC1}} : {{(vector-of number)}} ; . ; {{NUMVEC2}} : {{(vector-of number)}} ; . Must be same {{vector-length}}. ==== vector-compare <procedure>(vector-compare VEC ... [DIFF]) -> number</procedure> Result is {{negative}}, {{zero}}, or {{positive}}. Comparison by length when unequal & element-wise when equal. ; {{VEC}} : {{(vector)}} ; . ; {{DIFF}} : {{((* * -> number))}} ; quantified difference function. ==== vector-compare2 <procedure>(vector-compare2 VEC1 VEC2 [DIFF]) -> number</procedure> 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 <procedure>(dot-product NUMVEC1 NUMVEC2) -> number</procedure> ; {{NUMVEC1}} : {{(vector-of number)}} ; . ; {{NUMVEC2}} : {{(vector-of number)}} ; . Must be same {{vector-length}}. ==== cross-product <procedure>(cross-product NUMVEC1 NUMVEC2) -> (or number (vector-of number))</procedure> 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 <procedure>(vector-sum NUMVEC) -> number</procedure> <procedure>(vector-prod NUMVEC) -> number</procedure> <procedure>(vector-min NUMVEC) -> number</procedure> <procedure>(vector-max NUMVEC) -> number</procedure> ==== softmax <procedure>(softmax NUMVEC) -> (vector-of number)</procedure> Returns the ''softmax'' of the vector elements. Normalize the vector elements so {{(= 1 (vector-sum NUMVEC))}}. ; {{NUMVEC}} : {{(vector-of number)}} ; . ==== softmax* <procedure>(softmax* NUMVEC [TEMP]) -> (vector-of number)</procedure> 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 <procedure>(vector-reduce FUNC SEED VEC [START [END]]) -> (vector-of 'a)</procedure> ; {{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 <procedure>(subvector-reduce FUNC VEC [WIDTH [START [END]]]) -> (vector-of 'a)</procedure> 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}}. ; {{START}} : {{fixnum}} ; start index of {{VEC}}, default {{0}}. ; {{END}} : {{fixnum}} ; end index of {{VEC}}, default {{(vector-length VEC)}}. ==== vector-apply <procedure>(vector-apply FUNC [VEC1 VEC2 VEC...]) -> (vector-of 'a)</procedure> ; {{FUNC}} : {{('t1 't2 ... -> 'a}} ; . ; {{VEC#}} : {{(vector-of 't#)}} ; . Must be same {{vector-length}}. <enscript language=scheme> (import (only (math-utils vector) vector-apply)) (define (vector-mul . vs) (apply vector-apply * vs)) (define (vector-add . vs) (apply vector-apply + vs)) </enscript> ==== vector-scale ==== vector-shift <procedure>(vector-scale NUMVEC FACTOR) -> (vector-of number)</procedure> <procedure>(vector-shift NUMVEC BIAS) -> (vector-of number)</procedure> ; {{NUMVEC}} : {{(vector-of number)}} ; . ==== normalize-vector-scale ==== normalize-vector-shift <procedure>(normalize-vector-scale NUMVEC) -> (vector-of number)</procedure> <procedure>(normalize-vector-shift NUMVEC) -> (vector-of number)</procedure> {{vector-scale}} by the {{(/ (vector-maximum))}}. {{vector-shift}} by the {{(- (vector-minimum))}}. ; {{NUMVEC}} : {{(vector-of number)}} ; . == Examples <enscript language=scheme> (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 </enscript> == Requirements [[memoize]] [[miscmacros]] [[vector-lib]] [[fx-utils]] [[test]] [[test-utils]] == Author [[/users/kon-lovett|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|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 [[/egg-svn-checkout|this page]]. == Version history ; 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.
Description of your changes:
I would like to authenticate
Authentication
Username:
Password:
Spam control
What do you get when you subtract 1 from 21?