package Ġorg . rgb stud ios . bin omial distribution calculator Ċ Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . text . Decimal Format Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠMath Ġutilities Ġfor Ġbin omial Ġdistribution Ġprobabilities Ċ Ġ*/ Ċ object ĠUtil Ġ{ ĊĠĠĠ Ġ// ĠĠĠ Ġpublic Ġstatic Ġlong Ġn choose k ( int Ġn , Ġint Ġk ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif ( n Ġ== Ġk ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ; Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġdouble Ġresult Ġ= Ġ 1 ; Ċ // ĠĠĠĠĠĠĠ Ġfor ( int Ġi = 1 ; Ġi <= k ; Ġi ++) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ*= Ġ( double ) Ġ( n + 1 - i )/ i ; Ġ// replace Ġn + 1 - i Ġwith Ġn - k + i ? Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġ( long ) Ġresult ; Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġn choose k ( n : ĠInt , Ġk : ĠInt ): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġk ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . multiply ( BigInteger . valueOf ( n Ġ- Ġi . to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. divide ( BigInteger . valueOf ( i Ġ+ Ġ 1 . to Long ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġpublic Ġstatic ĠBigInteger Ġfactor ial ( int Ġn ) Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠBigInteger Ġret Ġ= ĠBigInteger . ONE ; Ċ // ĠĠĠĠĠĠĠ Ġfor ( int Ġi Ġ= Ġn ; Ġi > 1 ; Ġi --) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġret . multiply ( BigInteger . valueOf ( i ) Ġ); Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn ( ret ); Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġpublic Ġstatic ĠBigInteger Ġn choose k ( int Ġn , Ġint Ġk ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġfactor ial ( n ). divide ( factor ial ( k ) Ġ). divide ( factor ial ( n - k ) Ġ); Ċ // ĠĠĠ Ġ} Ċ // ĠĠĠ Ġpublic Ġstatic Ġdouble Ġequal ( double Ġp , Ġint Ġn , Ġint Ġx ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġ( double ) Ġ( n choose k ( n , Ġx ) Ġ* ĠMath . pow ( p , Ġx ) Ġ* ĠMath . pow ( 1 - p , Ġn - x ) Ġ); Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġequal ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbin Ġ= ĠBigDecimal ( n choose k ( n , Ġx )) ĊĠĠĠĠĠĠĠ Ġreturn Ġbin . multiply ( BigDecimal . valueOf ( p . pow ( x . toDouble ())) ). multiply ( BigDecimal . valueOf (( 1 Ġ- Ġp ). pow ( n Ġ- Ġx . toDouble ()))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġpublic Ġstatic Ġdouble Ġless ( double Ġp , Ġint Ġn , Ġint Ġx ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġdouble Ġresult Ġ= Ġ 0 ; Ċ // ĠĠĠĠĠĠĠ Ġfor ( int Ġi = 0 ; Ġi < x ; Ġi ++) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġequal ( p , Ġn , Ġi ); Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġresult ; Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġless ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . add ( equal ( p , Ġn , Ġi )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġpublic Ġstatic Ġdouble Ġgreater ( double Ġp , Ġint Ġn , Ġint Ġx ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġdouble Ġresult Ġ= Ġ 0 ; Ċ // ĠĠĠĠĠĠĠ Ġfor ( int Ġi = n ; Ġi > x ; Ġi --) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġequal ( p , Ġn , Ġi ); Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġresult ; Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġgreater ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġn Ġdown To Ġx Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . add ( equal ( p , Ġn , Ġi )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmean ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn Ġ* Ġp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvariance ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġn Ġ* Ġp Ġ* Ġ( 1 Ġ- Ġp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstd dev ( p : ĠDouble , Ġn : ĠInt , Ġx : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( variance ( p , Ġn , Ġx )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġ< K > Ġget Pretty Num ( num : ĠK ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDecimal Format ("# 0 . ######## ## "). format ( num ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġround ( num : ĠDouble , Ġdigits : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( num Ġ* Ġ 1 0 . 0 . pow ( digits . toDouble ())). round ToInt () Ġ/ Ġ 1 0 . 0 . pow ( digits . toDouble ()) ĊĠĠĠ Ġ} Ċ }