Entity: MathLib 417 61 null * ix int 3 false false true iy int 3 false false true iz int 3 false false true Operation: pi MathLib double query static true result = 3.14159265 Operation: e MathLib double query static true result = 1->exp() Operation: setSeeds MathLib void x int y int z int static true ix = x & iy = y & iz = z Operation: nrandom MathLib double query static true ix = ( ix@pre * 171 ) mod 30269 & iy = ( iy@pre * 172 ) mod 30307 & iz = ( iz@pre * 170 ) mod 30323 & result = ( ix / 30269.0 + iy / 30307.0 + iz / 30323.0 ) Operation: random MathLib double query static true r = MathLib.nrandom() & result = ( r - r.floor ) Operation: combinatorial MathLib long n int m int query static n >= m & m >= 0 ( n - m < m => result = Integer.Prd(m + 1,n,i,i) / Integer.Prd(1,n - m,j,j) ) & ( n - m >= m => result = Integer.Prd(n - m + 1,n,i,i) / Integer.Prd(1,m,j,j) ) Operation: factorial MathLib long x int query static true ( x < 2 => result = 1 ) & ( x >= 2 => result = Integer.Prd(2,x,i,i) ) Operation: gcd MathLib int x int y int query static x >= 1 & y >= 1 true Operation: lcm MathLib int x int y int query static x >= 1 & y >= 1 result = ( x * y ) / MathLib.gcd(x,y) Activity: MathLib gcd l : int ; k : int ; l := x ; k := y ; while l /= 0 & k /= 0 do if l < k then k := k mod l else l := l mod k ; if l = 0 then return k else return l Operation: integrate MathLib double f Sequence(double) d double query static f.size >= 1 & d >= 1 result = d*(f.subrange(2, f.size - 1)->sum()) + d*(f[1] + f.last)/2.0 Operation: asinh MathLib double x double query static true result = (x + (x*x + 1)->sqrt())->log() Operation: acosh MathLib double x double query static x >= 1 result = (x + (x*x - 1)->sqrt())->log() Operation: atanh MathLib double x double query static x /= 1 result = 0.5*((1+x)/(1-x))->log() Operation: isPrime MathLib boolean x int query static true ( x <= 1 => result = false ) & ( x = 2 => result = true ) & ( x > 2 => result = Integer.subrange(2,x.sqrt.floor)->forAll( i | x mod i > 0 ) ) Activity: MathLib isPrime if x < 2 then return false else skip ; if x = 2 then return true else skip ; b : int := x.sqrt.floor ; i : int := 2 ; while i <= b do if x mod i = 0 then return false else i := i + 1 ; return true Entity: NormalDist 238 195 null * Operation: normal NormalDist double m double sigma double x double query static true disp = x - m & denom = ( -0.5 * disp * disp / ( sigma * sigma ) )->exp() & num = sigma * ( 2 * MathLib.pi() )->sqrt() & result = denom / num Operation: cumulative NormalDist double m double sigma double x double query static x >= m k = ( 1 / ( 1 + 0.2316419 * ( x - m ) ) ) & poly = ( 0.31938153 * k ) + ( -0.356563782 * k * k ) + ( 1.781477937 * k * k * k ) + ( -1.821255978 * k * k * k * k ) + ( 1.330274429 * k * k * k * k * k ) & result = 1 - NormalDist.normal(m,sigma,x) * poly Operation: cumulative NormalDist double x double query static true ( x >= 0 => result = NormalDist.cumulative(0,1,x) ) & ( x < 0 => result = 1 - NormalDist.cumulative(0,1,-x) ) Operation: sample NormalDist double query static true r1 = MathLib.nrandom() & r2 = MathLib.nrandom() & r3 = MathLib.nrandom() & r4 = MathLib.nrandom() & result = ( r1 + r2 + r3 + r4 ) - 6 Entity: FinLib 124 45 null * Operation: bsd1 FinLib double s double x double dt double r double sigma double query static x > 0 & dt > 0 & sigma > 0 result = ( ( s / x )->log() + ( r + sigma.sqr / 2.0 ) * dt ) / sigma * dt.sqrt Operation: bsd2 FinLib double s double x double dt double r double sigma double query static x > 0 & dt > 0 & sigma > 0 result = FinLib.bsd1(s,x,dt,r,sigma) - sigma * dt.sqrt Operation: euPutOptionPrice FinLib double s double x double r double q double dt double sigma double income double query static x > 0 & dt > 0 & sigma > 0 adjustedS = ( s - income ) * ( -q * dt )->exp() & d1 = FinLib.bsd1(s - income,x,dt,r - q,sigma) & d2 = FinLib.bsd2(s - income,x,dt,r - q,sigma) & result = x * ( -r * dt )->exp() * NormalDist.cumulative(-d2) - adjustedS * NormalDist.cumulative(-d1) GeneralUseCase: test false