{"id":389,"date":"2022-04-13T09:49:46","date_gmt":"2022-04-13T01:49:46","guid":{"rendered":"http:\/\/blog.yuekegu.com\/?p=389"},"modified":"2022-04-13T09:49:46","modified_gmt":"2022-04-13T01:49:46","slug":"mathphp","status":"publish","type":"post","link":"https:\/\/book.yuekegu.com\/index.php\/2022\/04\/13\/mathphp\/","title":{"rendered":"MathPHP"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\" id=\"articleHeader1\">Powerful Modern Math Library for PHP<\/h3>\n\n\n\n<p>MathPHP is the only library you need to integrate mathematical functions into your applications. It is a self-contained library in pure PHP with no external dependencies.<\/p>\n\n\n\n<p>It is actively under development with development (0.y.z) releases.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"javascript:void();\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572\" alt=\"Coverage Status\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"javascript:void();\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/b9c2b9b5269306206dd9c141cc0007b8a94dc873\/68747470733a2f2f7472617669732d63692e6f72672f6d61726b726f676f79736b692f6d6174682d7068702e7376673f6272616e63683d6d6173746572\" alt=\"Build Status\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"javascript:void();\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/bfd92477d451076d69ba5e8ff23eb30128cac54c\/68747470733a2f2f706f7365722e707567782e6f72672f6d61726b726f676f79736b692f6d6174682d7068702f6c6963656e7365\" alt=\"License\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader2\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Features<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Algebra<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Arithmetic<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Finance<\/a><\/li><li>Functions<ul><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Map<\/a><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Special Functions<\/a><\/li><\/ul><\/li><li>Information Theory<ul><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Entropy<\/a><\/li><\/ul><\/li><li>Linear Algebra<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Matrix<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Vector<\/a><\/li><\/ul><\/li><li>Numbers<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Complex<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Rational<\/a><\/li><\/ul><\/li><li>Number Theory<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Integers<\/a><\/li><\/ul><\/li><li>Numerical Analysis<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Interpolation<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Numerical Differentiation<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Numerical Integration<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Root Finding<\/a><\/li><\/ul><\/li><li>Probability<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Combinatorics<\/a><\/li><li>Distributions<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Continuous<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Discrete<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Multivariate<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Tables<\/a><\/li><\/ul><\/li><\/ul><\/li><li>Sequences<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Basic<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Advanced<\/a><\/li><\/ul><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Set Theory<\/a><\/li><li>Statistics<ul><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">ANOVA<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Averages<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Circular<\/a><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Correlation<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Descriptive<\/a><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Distance and Divergence<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Distributions<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Effect Size<\/a><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Experiments<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Kernel Density Estimation<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Random Variables<\/a><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Regressions<\/a><\/li><li><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">Significance Testing<\/a><\/li><\/ul><\/li><li><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">Trigonometry<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader3\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Setup<\/h2>\n\n\n\n<p>Add the library to your&nbsp;<code>composer.json<\/code>&nbsp;file in your project:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"require\": {\n      \"markrogoyski\/math-php\": \"0.*\"\n  }\n}<\/pre>\n\n\n\n<p>Use&nbsp;<a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">composer<\/a>&nbsp;to install the library:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ php composer.phar install<\/pre>\n\n\n\n<p>Composer will install MathPHP inside your vendor folder. Then you can add the following to your .php files to use the library with Autoloading.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">require_once(__DIR__ . '\/vendor\/autoload.php');<\/pre>\n\n\n\n<p>Alternatively, use composer on the command line to require and install MathPHP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ php composer.phar require markrogoyski\/math-php:0.*\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader4\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Minimum Requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>PHP 7<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader5\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Usage<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader6\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Algebra<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Algebra;\n\n<em>\/\/<\/em><em> Greatest common divisor (GCD)<\/em>\n$gcd = Algebra::gcd(8, 12);\n\n<em>\/\/<\/em><em> Extended greatest common divisor - gcd(a, b) = a*a' + b*b'<\/em>\n$gcd = Algebra::extendedGcd(12, 8); <em>\/\/<\/em><em> returns array [gcd, a', b']<\/em>\n\n<em>\/\/<\/em><em> Least common multiple (LCM)<\/em>\n$lcm = Algebra::lcm(5, 2);\n\n<em>\/\/<\/em><em> Factors of an integer<\/em>\n$factors = Algebra::factors(12); <em>\/\/<\/em><em> returns [1, 2, 3, 4, 6, 12]<\/em>\n\n<em>\/\/<\/em><em> Quadradic equation<\/em>\nlist($a, $b, $c) = [1, 2, -8]; <em>\/\/<\/em><em> x\u00b2 + 2x - 8<\/em>\nlist($x\u2081, $x\u2082)   = Algebra::quadradic($a, $b, $c);\n\n<em>\/\/<\/em><em> Cubic equation<\/em>\nlist($a\u2083, $a\u2082, $a\u2081, $a\u2080) = [2, 9, 3, -4]; <em>\/\/<\/em><em> 2x\u00b3 + 9x\u00b2 + 3x -4<\/em>\nlist($x\u2081, $x\u2082, $x\u2083)      = Algebra::cubic($a\u2083, $a\u2082, $a\u2081, $a\u2080);\n\n<em>\/\/<\/em><em> Quartic equation<\/em>\nlist($a\u2084, $a\u2083, $a\u2082, $a\u2081, $a\u2080) = [1, -10, 35, -50, 24]; <em>\/\/<\/em><em> z\u2074 - 10z\u00b3 + 35z\u00b2 - 50z + 24 = 0<\/em>\nlist($z\u2081, $z\u2082, $z\u2083, $z\u2084)      = Algebra::quartic($a\u2084, $a\u2083, $a\u2082, $a\u2081, $a\u2080);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader7\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Arithmetic<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Arithmetic;\n\n$\u00b3\u221ax = Arithmetic::cubeRoot(-8); <em>\/\/<\/em><em> -2<\/em>\n\n<em>\/\/<\/em><em> Sum of digits<\/em>\n$digit_sum    = Arithmetic::digitSum(99):    <em>\/\/<\/em><em> 18<\/em>\n$digital_root = Arithmetic::digitalRoot(99); <em>\/\/<\/em><em> 9<\/em>\n\n<em>\/\/<\/em><em> Equality of numbers within a tolerance<\/em>\n$x = 0.00000003458;\n$y = 0.00000003455;\n$\u03b5 = 0.0000000001;\n$almostEqual = Arithmetic::almostEqual($x, $y, $\u03b5); <em>\/\/<\/em><em> true<\/em>\n\n<em>\/\/<\/em><em> Copy sign<\/em>\n$magnitude = 5;\n$sign      = -3;\n$signed_magnitude = Arithmetic::copySign($magnitude, $sign); <em>\/\/<\/em><em> -5<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader8\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Finance<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Finance;\n\n<em>\/\/<\/em><em> Financial payment for a loan or annuity with compound interest<\/em>\n$rate          = 0.035 \/ 12; <em>\/\/<\/em><em> 3.5\n$periods       = 30 * 12;    <em>\/\/<\/em><em> 30-year mortgage<\/em>\n$present_value = 265000;     <em>\/\/<\/em><em> Mortgage note of $265,000.00<\/em>\n$future_value  = 0;\n$beginning     = false;      <em>\/\/<\/em><em> Adjust the payment to the beginning or end of the period<\/em>\n$pmt           = Finance::pmt($rate, $periods, $present_value, $future_value, $beginning);\n\n<em>\/\/<\/em><em> Interest on a financial payment for a loan or annuity with compound interest.<\/em>\n$period = 1; <em>\/\/<\/em><em> First payment period<\/em>\n$ipmt   = Finance::ipmt($rate, $period, $periods, $present_value, $future_value, $beginning);\n\n<em>\/\/<\/em><em> Principle on a financial payment for a loan or annuity with compound interest<\/em>\n$ppmt = Finance::ppmt($rate, $period, $periods, $present_value, $future_value = 0, $beginning);\n\n<em>\/\/<\/em><em> Number of payment periods of an annuity.<\/em>\n$periods = Finance::periods($rate, $payment, $present_value, $future_value, $beginning);\n\n<em>\/\/<\/em><em> Annual Equivalent Rate (AER) of an annual percentage rate (APR)<\/em>\n$nominal = 0.035; <em>\/\/<\/em><em> APR 3.5\n$periods = 12;    <em>\/\/<\/em><em> Compounded monthly<\/em>\n$aer     = Finance::aer($nominal, $periods);\n\n<em>\/\/<\/em><em> Annual nominal rate of an annual effective rate (AER)<\/em>\n$nomial = Finance::nominal($aer, $periods);\n\n<em>\/\/<\/em><em> Future value for a loan or annuity with compound interest<\/em>\n$payment = 1189.97;\n$fv      = Finance::fv($rate, $periods, $payment, $present_value, $beginning)\n\n<em>\/\/<\/em><em> Present value for a loan or annuity with compound interest<\/em>\n$pv = Finance::pv($rate, $periods, $payment, $future_value, $beginning)\n\n<em>\/\/<\/em><em> Net present value of cash flows<\/em>\n$values = [-1000, 100, 200, 300, 400];\n$npv    = Finance::npv($rate, $values);\n\n<em>\/\/<\/em><em> Interest rate per period of an annuity<\/em>\n$beginning = false; <em>\/\/<\/em><em> Adjust the payment to the beginning or end of the period<\/em>\n$rate      = rate($periods, $payment, $present_value, $future_value, $beginning);\n\n<em>\/\/<\/em><em> Internal rate of return<\/em>\n$values = [-100, 50, 40, 30];\n$irr    = Finance:irr($values); <em>\/\/<\/em><em> Rate of return of an initial investment of $100 with returns of $50, $40, and $30<\/em>\n\n<em>\/\/<\/em><em> Modified internal rate of return<\/em>\n$finance_rate      = 0.05; <em>\/\/<\/em><em> 5\n$reinvestment_rate = 0.10; <em>\/\/<\/em><em> reinvested at 10\n$mirr              = Finance:mirr($values, $finance_rate); <em>\/\/<\/em><em> rate of return of an initial investment of $100 at 5\n\n<em>\/\/<\/em><em> Discounted payback of an investment<\/em>\n$values  = [-1000, 100, 200, 300, 400, 500];\n$rate    = 0.1;\n$payback = Finance::payback($values, $rate); <em>\/\/<\/em><em> The payback period of an investment with a $1,000 investment and future returns of $100, $200, $300, $400, $500 and a discount rate of 0.10<\/em>\n\n<em>\/\/<\/em><em> Profitability index<\/em>\n$values              = [-100, 50, 50, 50];\n$profitability_index = profitabilityIndex($values, $rate); <em>\/\/<\/em><em> The profitability index of an initial $100 investment with future returns of $50, $50, $50 with a 10\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader9\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Functions &#8211; Map &#8211; Single Array<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Functions\\Map;\n\n$x = [1, 2, 3, 4];\n\n$sums        = Map\\Single::add($x, 2);      \/\/ [3, 4, 5, 6]\n$differences = Map\\Single::subtract($x, 1); \/\/ [0, 1, 2, 3]\n$products    = Map\\Single::multiply($x, 5); \/\/ [5, 10, 15, 20]\n$quotients   = Map\\Single::divide($x, 2);   \/\/ [0.5, 1, 1.5, 2]\n$x\u00b2          = Map\\Single::square($x);      \/\/ [1, 4, 9, 16]\n$x\u00b3          = Map\\Single::cube($x);        \/\/ [1, 8, 27, 64]\n$x\u2074          = Map\\Single::pow($x, 4);      \/\/ [1, 16, 81, 256]\n$\u221ax          = Map\\Single::sqrt($x);        \/\/ [1, 1.414, 1.732, 2]\n$\u2223x\u2223         = Map\\Single::abs($x);         \/\/ [1, 2, 3, 4]\n$maxes       = Map\\Single::max($x, 3);      \/\/ [3, 3, 3, 4]\n$mins        = Map\\Single::min($x, 3);      \/\/ [1, 2, 3, 3]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader10\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Functions &#8211; Map &#8211; Multiple Arrays<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Functions\\Map;\n\n$x = [10, 10, 10, 10];\n$y = [1,   2,  5, 10];\n\n<em>\/\/<\/em><em> Map function against elements of two or more arrays, item by item (by item ...)<\/em>\n$sums        = Map\\Multi::add($x, $y);      <em>\/\/<\/em><em> [11, 12, 15, 20]<\/em>\n$differences = Map\\Multi::subtract($x, $y); <em>\/\/<\/em><em> [9, 8, 5, 0]<\/em>\n$products    = Map\\Multi::multiply($x, $y); <em>\/\/<\/em><em> [10, 20, 50, 100]<\/em>\n$quotients   = Map\\Multi::divide($x, $y);   <em>\/\/<\/em><em> [10, 5, 2, 1]<\/em>\n$maxes       = Map\\Multi::max($x, $y);      <em>\/\/<\/em><em> [10, 10, 10, 10]<\/em>\n$mins        = Map\\Multi::mins($x, $y);     <em>\/\/<\/em><em> [1, 2, 5, 10]<\/em>\n\n<em>\/\/<\/em><em> All functions work on multiple arrays; not limited to just two<\/em>\n$x    = [10, 10, 10, 10];\n$y    = [1,   2,  5, 10];\n$z    = [4,   5,  6,  7];\n$sums = Map\\Multi::add($x, $y, $z); <em>\/\/<\/em><em> [15, 17, 21, 27]<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader11\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Functions &#8211; Special Functions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Functions\\Special;\n\n<em>\/\/<\/em><em> Gamma function \u0393(z)<\/em>\n$z = 4;\n$\u0393 = Special::gamma($z);          <em>\/\/<\/em><em> Uses gamma definition for integers and half integers; uses Lanczos approximation for real numbers<\/em>\n$\u0393 = Special::gammaLanczos($z);   <em>\/\/<\/em><em> Lanczos approximation<\/em>\n$\u0393 = Special::gammaStirling($z);  <em>\/\/<\/em><em> Stirling approximation<\/em>\n\n<em>\/\/<\/em><em> Incomplete gamma functions - \u03b3(s,t), \u0393(s,x)<\/em>\nlist($x, $s) = [1, 2];\n$\u03b3 = Special::lowerIncompleteGamma($x, $s); <em>\/\/<\/em><em> same as \u03b3<\/em>\n$\u03b3 = Special::\u03b3($x, $s);                    <em>\/\/<\/em><em> same as lowerIncompleteGamma<\/em>\n$\u0393 = Special::upperIncompleteGamma($x, $s);\n\n<em>\/\/<\/em><em> Beta function<\/em>\nlist($x, $y) = [1, 2];\n$\u03b2 = Special::beta($x, $y); <em>\/\/<\/em><em> same as \u03b2<\/em>\n$\u03b2 = Special::\u03b2($x, $y);    <em>\/\/<\/em><em> same as beta<\/em>\n\n<em>\/\/<\/em><em> Incomplete beta functions<\/em>\nlist($x, $a, $b) = [0.4, 2, 3];\n$B  = Special::incompleteBeta($x, $a, $b);\n$I\u2093 = Special::regularizedIncompleteBeta($x, $a, $b);\n\n<em>\/\/<\/em><em> Multivariate beta function<\/em>\n$\u03b1s = [1, 2, 3];\n$\u03b2  = Special::multivariateBeta($\u03b1s);\n\n<em>\/\/<\/em><em> Error function (Gauss error function)<\/em>\n$error = Special::errorFunction(2);              <em>\/\/<\/em><em> same as erf<\/em>\n$error = Special::erf(2);                        <em>\/\/<\/em><em> same as errorFunction<\/em>\n$error = Special::complementaryErrorFunction(2); <em>\/\/<\/em><em> same as erfc<\/em>\n$error = Special::erfc(2);                       <em>\/\/<\/em><em> same as complementaryErrorFunction<\/em>\n\n<em>\/\/<\/em><em> Hypergeometric functions<\/em>\n$pFq = Special::generalizedHypergeometric($p, $q, $a, $b, $c, $z);\n$\u2081F\u2081 = Special::confluentHypergeometric($a, $b, $z);\n$\u2082F\u2081 = Special::hypergeometric($a, $b, $c, $z);\n\n<em>\/\/<\/em><em> Sign function (also known as signum or sgn)<\/em>\n$x    = 4;\n$sign = Special::signum($x); <em>\/\/<\/em><em> same as sgn<\/em>\n$sign = Special::sgn($x);    <em>\/\/<\/em><em> same as signum<\/em>\n\n<em>\/\/<\/em><em> Logistic function (logistic sigmoid function)<\/em>\n$x\u2080 = 2; <em>\/\/<\/em><em> x-value of the sigmoid's midpoint<\/em>\n$L  = 3; <em>\/\/<\/em><em> the curve's maximum value<\/em>\n$k  = 4; <em>\/\/<\/em><em> the steepness of the curve<\/em>\n$x  = 5;\n$logistic = Special::logistic($x\u2080, $L, $k, $x);\n\n<em>\/\/<\/em><em> Sigmoid function<\/em>\n$t = 2;\n$sigmoid = Special::sigmoid($t);\n\n<em>\/\/<\/em><em> Softmax function<\/em>\n$?    = [1, 2, 3, 4, 1, 2, 3];\n$\u03c3\u27ee?\u27ef\u2c7c = Special::softmax($?);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader12\"><a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Information Theory &#8211; Entropy<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\InformationTheory\\Entropy;\n\n<em>\/\/<\/em><em> Probability distributions<\/em>\n$p = [0.2, 0.5, 0.3];\n$q = [0.1, 0.4, 0.5];\n\n<em>\/\/<\/em><em> Shannon entropy<\/em>\n$bits  = Entropy::shannonEntropy($p);         <em>\/\/<\/em><em> log\u2082<\/em>\n$nats  = Entropy::shannonNatEntropy($p);      <em>\/\/<\/em><em> ln<\/em>\n$harts = Entropy::shannonHartleyEntropy($p);  <em>\/\/<\/em><em> log\u2081\u2080<\/em>\n\n<em>\/\/<\/em><em> Cross entropy<\/em>\n$H\u27eep\u3001q\u27ef = Entropy::crossEntropy($p, $q);       <em>\/\/<\/em><em> log\u2082<\/em>\n\n<em>\/\/<\/em><em> Joint entropy<\/em>\n$P\u27eex\u3001y\u27ef = [1\/2, 1\/4, 1\/4, 0];\nH\u27eex\u3001y\u27ef = Entropy::jointEntropy($P\u27eex\u3001y\u27ef);        <em>\/\/<\/em><em> log\u2082<\/em>\n\n<em>\/\/<\/em><em> R\u00e9nyi entropy<\/em>\n$\u03b1    = 0.5;\n$H\u2090\u27eeX\u27ef = Entropy::renyiEntropy($p, $\u03b1);         <em>\/\/<\/em><em> log\u2082<\/em>\n\n<em>\/\/<\/em><em> Perplexity<\/em>\n$perplexity = Entropy::perplexity($p);         <em>\/\/<\/em><em> log\u2082<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader13\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Linear Algebra &#8211; Matrix<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\LinearAlgebra\\Matrix;\nuse MathPHP\\LinearAlgebra\\MatrixFactory;\n\n$matrix = [\n    [1, 2, 3],\n    [4, 5, 6],\n    [7, 8, 9],\n];\n\n<em>\/\/<\/em><em> Matrix factory creates most appropriate matrix<\/em>\n$A = MatrixFactory::create($matrix);\n$B = MatrixFactory::create($matrix);\n\n<em>\/\/<\/em><em> Matrix factory can create a matrix from an array of column vectors<\/em>\nuse MathPHP\\LinearAlgebra\\Vector;\n$X\u2081 = new Vector([1, 4, 7]);\n$X\u2082 = new Vector([2, 5, 8]);\n$X\u2083 = new Vector([3, 6, 9]);\n$C  = MatrixFactory::create([$X\u2081, $X\u2082, $X\u2083]);\n\n<em>\/\/<\/em><em> Can also directly instantiate desired matrix class<\/em>\n$A = new Matrix($matrix);\n$B = new SquareMatrix($matrix);\n\n<em>\/\/<\/em><em> Basic matrix data<\/em>\n$array = $A-&gt;getMatrix();\n$rows  = $A-&gt;getM();      <em>\/\/<\/em><em> number of rows<\/em>\n$cols  = $A-&gt;getN();      <em>\/\/<\/em><em> number of columns<\/em>\n\n<em>\/\/<\/em><em> Basic matrix elements (zero-based indexing)<\/em>\n$row = $A-&gt;getRow(2);\n$col = $A-&gt;getColumn(2);\n$A\u1d62\u2c7c = $A-&gt;get(2, 2);\n$A\u1d62\u2c7c = $A[2][2];\n\n<em>\/\/<\/em><em> Other representations of matrix data<\/em>\n$vectors = $A-&gt;asVectors();                <em>\/\/<\/em><em> array of column vectors<\/em>\n$D       = $A-&gt;getDiagonalElements();      <em>\/\/<\/em><em> array of the diagonal elements<\/em>\n$d       = $A-&gt;getSuperdiagonalElements(); <em>\/\/<\/em><em> array of the superdiagonal elements<\/em>\n$d       = $A-&gt;getSubdiagonalElements();   <em>\/\/<\/em><em> array of the subdiagonal elements<\/em>\n\n<em>\/\/<\/em><em> Row operations<\/em>\nlist($m\u1d62, $m\u2c7c, $k) = [1, 2, 5];\n$R = $A-&gt;rowInterchange($m\u1d62, $m\u2c7c);\n$R = $A-&gt;rowMultiply($m\u1d62, $k);     <em>\/\/<\/em><em> Multiply row m\u1d62 by k<\/em>\n$R = $A-&gt;rowAdd($m\u1d62, $m\u2c7c, $k);     <em>\/\/<\/em><em> Add k * row m\u1d62 to row m\u2c7c<\/em>\n$R = $A-&gt;rowExclude($m\u1d62);          <em>\/\/<\/em><em> Exclude row $m\u1d62<\/em>\n\n<em>\/\/<\/em><em> Column operations<\/em>\nlist($n\u1d62, $n\u2c7c, $k) = [1, 2, 5];\n$R = $A-&gt;columnInterchange($n\u1d62, $n\u2c7c);\n$R = $A-&gt;columnMultiply($n\u1d62, $k);     <em>\/\/<\/em><em> Multiply column n\u1d62 by k<\/em>\n$R = $A-&gt;columnAdd($n\u1d62, $n\u2c7c, $k);     <em>\/\/<\/em><em> Add k * column n\u1d62 to column n\u2c7c<\/em>\n$R = $A-&gt;columnExclude($n\u1d62);          <em>\/\/<\/em><em> Exclude column $n\u1d62<\/em>\n\n<em>\/\/<\/em><em> Matrix operations - return a new Matrix<\/em>\n$A\uff0bB  = $A-&gt;add($B);\n$A\u2295B   = $A-&gt;directSum($B);\n$A\u2295B   = $A-&gt;kroneckerSum($B);\n$A\u2212B   = $A-&gt;subtract($B);\n$AB    = $A-&gt;multiply($B);\n$\uff12A   = $A-&gt;scalarMultiply(2);\n$A\uff0f2  = $A-&gt;scalarDivide(2);\n$\u2212A    = $A-&gt;negate();\n$A\u2218B   = $A-&gt;hadamardProduct($B);\n$A\u2297B   = $A-&gt;kroneckerProduct($B);\n$A\u1d40 \u3000 = $A-&gt;transpose();\n$D  \u3000 = $A-&gt;diagonal();\n$\u27eeA\u2223B\u27ef  = $A-&gt;augment($B);\n$\u27eeA\u2223I\u27ef  = $A-&gt;augmentIdentity();         <em>\/\/<\/em><em> Augment with the identity matrix<\/em>\n$\u27eeA\u2223B\u27ef  = $A-&gt;augmentBelow($B);\n$A\u207b\u00b9   = $A-&gt;inverse();\n$M\u1d62\u2c7c   = $A-&gt;minorMatrix($m\u1d62, $n\u2c7c);     <em>\/\/<\/em><em> Square matrix with row m\u1d62 and column n\u2c7c removed<\/em>\n$Mk    = $A-&gt;leadingPrincipalMinor($k); <em>\/\/<\/em><em> k\u1d57\u02b0-order leading principal minor<\/em>\n$CM    = $A-&gt;cofactorMatrix();\n$B     = $A-&gt;meanDeviation();\n$S     = $A-&gt;covarianceMatrix();\n$adj\u27eeA\u27ef = $A-&gt;adjugate();\n\n<em>\/\/<\/em><em> Matrix operations - return a new Vector<\/em>\n$AB = $A-&gt;vectorMultiply($X\u2081);\n$M  = $A-&gt;sampleMean();\n\n<em>\/\/<\/em><em> Matrix operations - return a value<\/em>\n$tr\u27eeA\u27ef   = $A-&gt;trace();\n$|A|    = $a-&gt;det();              <em>\/\/<\/em><em> Determinant<\/em>\n$M\u1d62\u2c7c    = $A-&gt;minor($m\u1d62, $n\u2c7c);    <em>\/\/<\/em><em> First minor<\/em>\n$C\u1d62\u2c7c    = $A-&gt;cofactor($m\u1d62, $n\u2c7c);\n$rank\u27eeA\u27ef = $A-&gt;rank();\n\n<em>\/\/<\/em><em> Matrix norms - return a value<\/em>\n$\u2016A\u2016\u2081 = $A-&gt;oneNorm();\n$\u2016A\u2016F = $A-&gt;frobeniusNorm(); <em>\/\/<\/em><em> Hilbert\u2013Schmidt norm<\/em>\n$\u2016A\u2016\u221e = $A-&gt;infinityNorm();\n$max  = $A-&gt;maxNorm();\n\n<em>\/\/<\/em><em> Matrix properties - return a bool<\/em>\n$bool = $A-&gt;isSquare();\n$bool = $A-&gt;isSymmetric();\n$bool = $A-&gt;isSkewSymmetric();\n$bool = $A-&gt;isSingular();\n$bool = $A-&gt;isNonsingular();           <em>\/\/<\/em><em> Same as isInvertible<\/em>\n$bool = $A-&gt;isInvertible();            <em>\/\/<\/em><em> Same as isNonsingular<\/em>\n$bool = $A-&gt;isPositiveDefinite();\n$bool = $A-&gt;isPositiveSemidefinite();\n$bool = $A-&gt;isNegativeDefinite();\n$bool = $A-&gt;isNegativeSemidefinite();\n$bool = $A-&gt;isLowerTriangular();\n$bool = $A-&gt;isUpperTriangular();\n$bool = $A-&gt;isTriangular();\n$bool = $A-&gt;isDiagonal();\n$bool = $A-&gt;isUpperBidiagonal();\n$bool = $A-&gt;isLowerBidiagonal();\n$bool = $A-&gt;isBidiagonal();\n$bool = $A-&gt;isTridiagonal();\n$bool = $A-&gt;isUpperHessenberg();\n$bool = $A-&gt;isLowerHessenberg();\n$bool = $A-&gt;isInvolutory();\n$bool = $A-&gt;isSignature();\n$bool = $A-&gt;isRef();\n$bool = $A-&gt;isRref();\n\n<em>\/\/<\/em><em> Matrix decompositions<\/em>\n$ref  = $A-&gt;ref();                   <em>\/\/<\/em><em> Row echelon form<\/em>\n$rref = $A-&gt;rref();                  <em>\/\/<\/em><em> Reduced row echelon form<\/em>\n$PLU  = $A-&gt;luDecomposition();       <em>\/\/<\/em><em> Returns array of Matrices [L, U, P]; P is permutation matrix<\/em>\n$LU   = $A-&gt;croutDecomposition();    <em>\/\/<\/em><em> Returns array of Matrices [L, U]<\/em>\n$L    = $A-&gt;choleskyDecomposition(); <em>\/\/<\/em><em> Returns lower triangular matrix L of A = LL\u1d40<\/em>\n\n<em>\/\/<\/em><em> Solve a linear system of equations: Ax = b<\/em>\n$b = new Vector(1, 2, 3);\n$x = $A-&gt;solve($b);\n\n<em>\/\/<\/em><em> Map a function over each element of the Matrix<\/em>\n$func = function($x) {\n    return $x * 2;\n};\n$R = $A-&gt;map($func);\n\n<em>\/\/<\/em><em> Print a matrix<\/em>\nprint($A);\n<em>\/*<\/em><em>\n<\/em><em> [1, 2, 3]<\/em><em>\n<\/em><em> [2, 3, 4]<\/em><em>\n<\/em><em> [3, 4, 5]<\/em><em>\n<\/em><em> <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Specialized matrices<\/em>\nlist($m, $n, $k)              = [4, 4, 2];\n$identity_matrix              = MatrixFactory::identity($n);             <em>\/\/<\/em><em> Ones on the main diagonal<\/em>\n$zero_matrix                  = MatrixFactory::zero($m, $n);             <em>\/\/<\/em><em> All zeros<\/em>\n$ones_matrix                  = MatrixFactory::one($m, $n);              <em>\/\/<\/em><em> All ones<\/em>\n$eye_matrix                   = MatrixFactory::eye($m, $n, $k);          <em>\/\/<\/em><em> Ones (or other value) on the k-th diagonal<\/em>\n$exchange_matrix              = MatrixFactory::exchange($n);             <em>\/\/<\/em><em> Ones on the reverse diagonal<\/em>\n$downshift_permutation_matrix = MatrixFactory::downshiftPermutation($n); <em>\/\/<\/em><em> Permutation matrix that pushes the components of a vector down one notch with wraparound<\/em>\n$upshift_permutation_matrix   = MatrixFactory::upshiftPermutation($n);   <em>\/\/<\/em><em> Permutation matrix that pushes the components of a vector up one notch with wraparound<\/em>\n$hilbert_matrix               = MatrixFactory::hilbert($n);              <em>\/\/<\/em><em> Square matrix with entries being the unit fractions<\/em>\n\n<em>\/\/<\/em><em> Vandermonde matrix<\/em>\n$V = MatrixFactory::create([1, 2, 3], 4); <em>\/\/<\/em><em> 4 x 3 Vandermonde matrix<\/em>\n$V = new VandermondeMatrix([1, 2, 3], 4); <em>\/\/<\/em><em> Same as using MatrixFactory<\/em>\n\n<em>\/\/<\/em><em> Diagonal matrix<\/em>\n$D = MatrixFactory::create([1, 2, 3]); <em>\/\/<\/em><em> 3 x 3 diagonal matrix with zeros above and below the diagonal<\/em>\n$D = new DiagonalMatrix([1, 2, 3]);    <em>\/\/<\/em><em> Same as using MatrixFactory<\/em>\n\n<em>\/\/<\/em><em> PHP Predefined Interfaces<\/em>\n$json = json_encode($A); <em>\/\/<\/em><em> JsonSerializable<\/em>\n$A\u1d62\u2c7c  = $A[$m\u1d62][$n\u2c7c];    <em>\/\/<\/em><em> ArrayAccess<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader14\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Linear Algebra &#8211; Vector<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\LinearAlgebra\\Vector;\n\n<em>\/\/<\/em><em> Vector<\/em>\n$A = new Vector([1, 2]);\n$B = new Vector([2, 4]);\n\n<em>\/\/<\/em><em> Basic vector data<\/em>\n$array = $A-&gt;getVector();\n$n     = $A-&gt;getN();           <em>\/\/<\/em><em> number of elements<\/em>\n$M     = $A-&gt;asColumnMatrix(); <em>\/\/<\/em><em> Vector as an nx1 matrix<\/em>\n$M     = $A-&gt;asRowMatrix();    <em>\/\/<\/em><em> Vector as a 1xn matrix<\/em>\n\n<em>\/\/<\/em><em> Basic vector elements (zero-based indexing)<\/em>\n$item = $A-&gt;get(1);\n\n<em>\/\/<\/em><em> Vector operations - return a value<\/em>\n$sum  = $A-&gt;sum();\n$\u2502A\u2502  = $A-&gt;length();           <em>\/\/<\/em><em> same as l2Norm<\/em>\n$A\u22c5B  = $A-&gt;dotProduct($B);     <em>\/\/<\/em><em> same as innerProduct<\/em>\n$A\u22c5B  = $A-&gt;innerProduct($B);   <em>\/\/<\/em><em> same as dotProduct<\/em>\n$A\u22a5\u22c5B = $A-&gt;perpDotProduct($B);\n\n<em>\/\/<\/em><em> Vector operations - return a Vector or Matrix<\/em>\n$kA    = $A-&gt;scalarMultiply($k);\n$A\uff0bB  = $A-&gt;add($B);\n$A\u2212B   = $A-&gt;subtract($B);\n$A\uff0fk  = $A-&gt;scalarDivide($k);\n$A\u2a02B  = $A-&gt;outerProduct($B);  <em>\/\/<\/em><em> Same as direct product<\/em>\n$AB    = $A-&gt;directProduct($B); <em>\/\/<\/em><em> Same as outer product<\/em>\n$AxB   = $A-&gt;crossProduct($B);\n$A\u2a02B   = $A-&gt;kroneckerProduct($B);\n$\u00c2     = $A-&gt;normalize();\n$A\u22a5    = $A-&gt;perpendicular();\n$proj\u1d47A = $A-&gt;projection($B);   <em>\/\/<\/em><em> projection of A onto B<\/em>\n$perp\u1d47A = $A-&gt;perp($B);         <em>\/\/<\/em><em> perpendicular of A on B<\/em>\n\n<em>\/\/<\/em><em> Vector norms - return a value<\/em>\n$l\u2081norm = $A-&gt;l1Norm();\n$l\u00b2norm = $A-&gt;l2Norm();\n$pnorm  = $A-&gt;pNorm();\n$max    = $A-&gt;maxNorm();\n\n<em>\/\/<\/em><em> Print a vector<\/em>\nprint($A); <em>\/\/<\/em><em> [1, 2]<\/em>\n\n<em>\/\/<\/em><em> PHP Predefined Interfaces<\/em>\n$n    = count($A);       <em>\/\/<\/em><em> Countable<\/em>\n$json = json_encode($A); <em>\/\/<\/em><em> JsonSerializable<\/em>\n$A\u1d62   = $A[$i];          <em>\/\/<\/em><em> ArrayAccess<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader15\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Number &#8211; Complex Numbers<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Number\\Complex;\n\nlist($r, $i) = [2, 4];\n$complex     = new Complex($r, $i);\n\n<em>\/\/<\/em><em> Accessors<\/em>\n$r = $complex-&gt;r;\n$i = $complex-&gt;i;\n\n<em>\/\/<\/em><em> Unary functions<\/em>\n$conjugate     = $complex-&gt;complexConjugate();\n$\u2502c\u2502           = $complex-&gt;abs();     <em>\/\/<\/em><em> absolute value (modulus)<\/em>\n$arg\u27eec\u27ef         = $complex-&gt;arg();     <em>\/\/<\/em><em> argument (phase)<\/em>\n$\u221ac            = $complex-&gt;sqrt();    <em>\/\/<\/em><em> positive square root<\/em>\nlist($z\u2081, $z\u2082) = $complex-&gt;roots();\n$c\u207b\u00b9           = $complex-&gt;inverse();\n$\u2212c            = $complex-&gt;negate();\n$polar         = $complex-&gt;polarForm();\n\n<em>\/\/<\/em><em> Binary functions<\/em>\n$c\uff0bc = $complex-&gt;add($complex);\n$c\u2212c  = $complex-&gt;subtract($complex);\n$c\u00d7c  = $complex-&gt;multiply($complex);\n$c\uff0fc = $complex-&gt;divide($complex);\n\n<em>\/\/<\/em><em> Other functions<\/em>\n$bool   = $complex-&gt;equals($complex);\n$string = (string) $complex;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader16\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Number &#8211; Rational Numbers<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Number\\Rational;\n\n$whole       = 0;\n$numerator   = 2;\n$denominator = 3;\n\n$rational = new Rational($whole, $numerator, $denominator); <em>\/\/<\/em><em> \u00b2\/\u2083<\/em>\n\n<em>\/\/<\/em><em> Unary functions<\/em>\n$\u2502rational\u2502 = $rational-&gt;abs();\n\n<em>\/\/<\/em><em> Binary functions<\/em>\n$sum      = $rational-&gt;add($rational);\n$diff     = $rational-&gt;subtract($rational);\n$product  = $rational-&gt;multiply($rational);\n$quotient = $rational-&gt;divide($rational);\n\n<em>\/\/<\/em><em> Other functions<\/em>\n$bool   = $rational-&gt;equals($rational);\n$float  = $rational-&gt;toFloat();\n$string = (string) $rational;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader17\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Number Theory &#8211; Integers<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\NumberTheory\\Integer;\n\n$n = 225;\n\n<em>\/\/<\/em><em> Prime factorization<\/em>\n$factors = Integer::primeFactorization($n);\n\n<em>\/\/<\/em><em> Perfect powers<\/em>\n$bool        = Integer::isPerfectPower($n);\nlist($m, $k) = Integer::perfectPower($n);\n\n<em>\/\/<\/em><em> Coprime<\/em>\n$bool = Integer::coprime(4, 35);\n\n<em>\/\/<\/em><em> Even and odd<\/em>\n$bool = Integer::isEven($n);\n$bool = Integer::isOdd($n);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader18\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Numerical Analysis &#8211; Interpolation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\NumericalAnalysis\\Interpolation;\n\n<em>\/\/<\/em><em> Interpolation is a method of constructing new data points with the range<\/em>\n<em>\/\/<\/em><em> of a discrete set of known data points.<\/em>\n<em>\/\/<\/em><em> Each integration method can take input in two ways:<\/em>\n<em>\/\/<\/em><em> 1) As a set of points (inputs and outputs of a function)<\/em>\n<em>\/\/<\/em><em> 2) As a callback function, and the number of function evaluations to<\/em>\n<em>\/\/<\/em><em> perform on an interval between a start and end point.<\/em>\n\n<em>\/\/<\/em><em> Input as a set of points<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16]];\n\n<em>\/\/<\/em><em> Input as a callback function<\/em>\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 4];\n\n<em>\/\/<\/em><em> Lagrange Polynomial<\/em>\n<em>\/\/<\/em><em> Returns a function p(x) of x<\/em>\n$p = Interpolation\\LagrangePolynomial::interpolate($points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$p = Interpolation\\LagrangePolynomial::interpolate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n$p(0) <em>\/\/<\/em><em> 1<\/em>\n$p(3) <em>\/\/<\/em><em> 16<\/em>\n\n<em>\/\/<\/em><em> Nevilles Method<\/em>\n<em>\/\/<\/em><em> More accurate than Lagrange Polynomial Interpolation given the same input<\/em>\n<em>\/\/<\/em><em> Returns the evaluation of the interpolating polynomial at the $target point<\/em>\n$target = 2;\n$result = Interpolation\\NevillesMethod::interpolate($target, $points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$result = Interpolation\\NevillesMethod::interpolate($target, $f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Newton Polynomial (Forward)<\/em>\n<em>\/\/<\/em><em> Returns a function p(x) of x<\/em>\n$p = Interpolation\\NewtonPolynomialForward::interpolate($points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$p = Interpolation\\NewtonPolynomialForward::interpolate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n$p(0) <em>\/\/<\/em><em> 1<\/em>\n$p(3) <em>\/\/<\/em><em> 16<\/em>\n\n<em>\/\/<\/em><em> Natural Cubic Spline<\/em>\n<em>\/\/<\/em><em> Returns a piecewise polynomial p(x)<\/em>\n$p = Interpolation\\NaturalCubicSpline::interpolate($points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$p = Interpolation\\NaturalCubicSpline::interpolate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n$p(0) <em>\/\/<\/em><em> 1<\/em>\n$p(3) <em>\/\/<\/em><em> 16<\/em>\n\n<em>\/\/<\/em><em> Clamped Cubic Spline<\/em>\n<em>\/\/<\/em><em> Returns a piecewise polynomial p(x)<\/em>\n\n<em>\/\/<\/em><em> Input as a set of points<\/em>\n$points = [[0, 1, 0], [1, 4, -1], [2, 9, 4], [3, 16, 0]];\n\n<em>\/\/<\/em><em> Input as a callback function<\/em>\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\n$f\u2019\u27eex\u27ef = function ($x) {\n    return 2*$x + 2;\n};\nlist($start, $end, $n) = [0, 3, 4];\n\n$p = Interpolation\\ClampedCubicSpline::interpolate($points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$p = Interpolation\\ClampedCubicSpline::interpolate($f\u27eex\u27ef, $f\u2019\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n$p(0) <em>\/\/<\/em><em> 1<\/em>\n$p(3) <em>\/\/<\/em><em> 16<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader19\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Numerical Analysis &#8211; Numerical Differentiation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\NumericalAnalysis\\NumericalDifferentiation;\n\n<em>\/\/<\/em><em> Numerical Differentiation approximates the derivative of a function.<\/em>\n<em>\/\/<\/em><em> Each Differentiation method can take input in two ways:<\/em>\n<em>\/\/<\/em><em> 1) As a set of points (inputs and outputs of a function)<\/em>\n<em>\/\/<\/em><em> 2) As a callback function, and the number of function evaluations to<\/em>\n<em>\/\/<\/em><em> perform on an interval between a start and end point.<\/em>\n\n<em>\/\/<\/em><em> Input as a callback function<\/em>\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\n\n<em>\/\/<\/em><em> Three Point Formula<\/em>\n<em>\/\/<\/em><em> Returns an approximation for the derivative of our input at our target<\/em>\n\n<em>\/\/<\/em><em> Input as a set of points<\/em>\n$points = [[0, 1], [1, 4], [2, 9]];\n\n$target = 0;\nlist($start, $end, $n) = [0, 2, 3];\n$derivative = NumericalDifferentiation\\ThreePointFormula::differentiate($target, $points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$derivative = NumericalDifferentiation\\ThreePointFormula::differentiate($target, $f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Five Point Formula<\/em>\n<em>\/\/<\/em><em> Returns an approximation for the derivative of our input at our target<\/em>\n\n<em>\/\/<\/em><em> Input as a set of points<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4, 25]];\n\n$target = 0;\nlist($start, $end, $n) = [0, 4, 5];\n$derivative = NumericalDifferentiation\\FivePointFormula::differentiate($target, $points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$derivative = NumericalDifferentiation\\FivePointFormula::differentiate($target, $f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Second Derivative Midpoint Formula<\/em>\n<em>\/\/<\/em><em> Returns an approximation for the second derivative of our input at our target<\/em>\n\n<em>\/\/<\/em><em> Input as a set of points<\/em>\n$points = [[0, 1], [1, 4], [2, 9];\n\n$target = 1;\nlist($start, $end, $n) = [0, 2, 3];\n$derivative = NumericalDifferentiation\\SecondDerivativeMidpointFormula::differentiate($target, $points);                <em>\/\/<\/em><em> input as a set of points<\/em>\n$derivative = NumericalDifferentiation\\SecondDerivativeMidpointFormula::differentiate($target, $f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader20\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Numerical Analysis &#8211; Numerical Integration<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\NumericalAnalysis\\NumericalIntegration;\n\n<em>\/\/<\/em><em> Numerical integration approximates the definite integral of a function.<\/em>\n<em>\/\/<\/em><em> Each integration method can take input in two ways:<\/em>\n<em>\/\/<\/em><em> 1) As a set of points (inputs and outputs of a function)<\/em>\n<em>\/\/<\/em><em> 2) As a callback function, and the number of function evaluations to<\/em>\n<em>\/\/<\/em><em> perform on an interval between a start and end point.<\/em>\n\n<em>\/\/<\/em><em> Trapezoidal Rule (closed Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\TrapezoidalRule::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 4];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\TrapezoidalRule::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Simpsons Rule (closed Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4,3]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\SimpsonsRule::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 5];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\SimpsonsRule::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Simpsons 3\/8 Rule (closed Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\SimpsonsThreeEighthsRule::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 5];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\SimpsonsThreeEighthsRule::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Booles Rule (closed Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4, 25]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\BoolesRule::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**3 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 4, 5];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\BoolesRuleRule::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Rectangle Method (open Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\RectangleMethod::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 4];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\RectangleMethod::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em>\n\n<em>\/\/<\/em><em> Midpoint Rule (open Newton-Cotes formula)<\/em>\n$points = [[0, 1], [1, 4], [2, 9], [3, 16]];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\MidpointRule::approximate($points); <em>\/\/<\/em><em> input as a set of points<\/em>\n\n$f\u27eex\u27ef = function ($x) {\n    return $x**2 + 2 * $x + 1;\n};\nlist($start, $end, $n) = [0, 3, 4];\n$\u222bf\u27eex\u27efdx = NumericalIntegration\\MidpointRule::approximate($f\u27eex\u27ef, $start, $end, $n); <em>\/\/<\/em><em> input as a callback function<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader21\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Numerical Analysis &#8211; Root Finding<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\NumericalAnalysis\\RootFinding;\n\n<em>\/\/<\/em><em> Root-finding methods solve for a root of a polynomial.<\/em>\n\n<em>\/\/<\/em><em> f(x) = x\u2074 + 8x\u00b3 -13x\u00b2 -92x + 96<\/em>\n$f\u27eex\u27ef = function($x) {\n    return $x**4 + 8 * $x**3 - 13 * $x**2 - 92 * $x + 96;\n};\n\n<em>\/\/<\/em><em> Newton's Method<\/em>\n$args     = [-4.1];  <em>\/\/<\/em><em> Parameters to pass to callback function (initial guess, other parameters)<\/em>\n$target   = 0;       <em>\/\/<\/em><em> Value of f(x) we a trying to solve for<\/em>\n$tol      = 0.00001; <em>\/\/<\/em><em> Tolerance; how close to the actual solution we would like<\/em>\n$position = 0;       <em>\/\/<\/em><em> Which element in the $args array will be changed; also serves as initial guess. Defaults to 0.<\/em>\n$x        = RootFinding\\NewtonsMethod::solve($f\u27eex\u27ef, $args, $target, $tol, $position); <em>\/\/<\/em><em> Solve for x where f(x) = $target<\/em>\n\n<em>\/\/<\/em><em> Secant Method<\/em>\n$p\u2080  = -1;      <em>\/\/<\/em><em> First initial approximation<\/em>\n$p\u2081  = 2;       <em>\/\/<\/em><em> Second initial approximation<\/em>\n$tol = 0.00001; <em>\/\/<\/em><em> Tolerance; how close to the actual solution we would like<\/em>\n$x   = RootFinding\\SecantMethod::solve($f\u27eex\u27ef, $p\u2080, $p\u2081, $tol); <em>\/\/<\/em><em> Solve for x where f(x) = 0<\/em>\n\n<em>\/\/<\/em><em> Bisection Method<\/em>\n$a   = 2;       <em>\/\/<\/em><em> The start of the interval which contains a root<\/em>\n$b   = 5;       <em>\/\/<\/em><em> The end of the interval which contains a root<\/em>\n$tol = 0.00001; <em>\/\/<\/em><em> Tolerance; how close to the actual solution we would like<\/em>\n$x   = RootFinding\\BisectionMethod::solve($f\u27eex\u27ef, $a, $b, $tol); <em>\/\/<\/em><em> Solve for x where f(x) = 0<\/em>\n\n<em>\/\/<\/em><em> Fixed-Point Iteration<\/em>\n<em>\/\/<\/em><em> f(x) = x\u2074 + 8x\u00b3 -13x\u00b2 -92x + 96<\/em>\n<em>\/\/<\/em><em> Rewrite f(x) = 0 as (x\u2074 + 8x\u00b3 -13x\u00b2 + 96)\/92 = x<\/em>\n<em>\/\/<\/em><em> Thus, g(x) = (x\u2074 + 8x\u00b3 -13x\u00b2 + 96)\/92<\/em>\n$g\u27eex\u27ef = function($x) {\n    return ($x**4 + 8 * $x**3 - 13 * $x**2 + 96)\/92;\n};\n$a   = 0;       <em>\/\/<\/em><em> The start of the interval which contains a root<\/em>\n$b   = 2;       <em>\/\/<\/em><em> The end of the interval which contains a root<\/em>\n$p   = 0;       <em>\/\/<\/em><em> The initial guess for our root<\/em>\n$tol = 0.00001; <em>\/\/<\/em><em> Tolerance; how close to the actual solution we would like<\/em>\n$x   = RootFinding\\FixedPointIteration::solve($g\u27eex\u27ef, $a, $b, $p, $tol); <em>\/\/<\/em><em> Solve for x where f(x) = 0<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader22\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Probability &#8211; Combinatorics<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Probability\\Combinatorics;\n\nlist($n, $x, $k) = [10, 3, 4];\n\n<em>\/\/<\/em><em> Factorials<\/em>\n$n\uff01  = Combinatorics::factorial($n);\n$n\u203c\ufe0e   = Combinatorics::doubleFactorial($n);\n$x\u207d\u207f\u207e = Combinatorics::risingFactorial($x, $n);\n$x\u208d\u1d62\u208e = Combinatorics::fallingFactorial($x, $n);\n$\uff01n  = Combinatorics::subfactorial($n);\n\n<em>\/\/<\/em><em> Permutations<\/em>\n$nPn = Combinatorics::permutations($n);     <em>\/\/<\/em><em> Permutations of n things, taken n at a time (same as factorial)<\/em>\n$nPk = Combinatorics::permutations($n, $k); <em>\/\/<\/em><em> Permutations of n things, taking only k of them<\/em>\n\n<em>\/\/<\/em><em> Combinations<\/em>\n$nCk  = Combinatorics::combinations($n, $k);                            <em>\/\/<\/em><em> n choose k without repetition<\/em>\n$nC\u2032k = Combinatorics::combinations($n, $k, Combinatorics::REPETITION); <em>\/\/<\/em><em> n choose k with repetition (REPETITION const = true)<\/em>\n\n<em>\/\/<\/em><em> Central binomial coefficient<\/em>\n$cbc = Combinatorics::centralBinomialCoefficient($n);\n\n<em>\/\/<\/em><em> Catalan number<\/em>\n$Cn = Combinatorics::catalanNumber($n);\n\n<em>\/\/<\/em><em> Lah number<\/em>\n$L\u27een\u3001k\u27ef = Combinatorics::lahNumber($n, $k)\n\n<em>\/\/<\/em><em> Multinomial coefficient<\/em>\n$groups    = [5, 2, 3];\n$divisions = Combinatorics::multinomial($groups);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader23\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Probability &#8211; Continuous Distributions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Probability\\Distribution\\Continuous;\n\n<em>\/\/<\/em><em> Beta distribution<\/em>\n$\u03b1    = 1; <em>\/\/<\/em><em> shape parameter<\/em>\n$\u03b2    = 1; <em>\/\/<\/em><em> shape parameter<\/em>\n$x    = 2;\n$beta = new Continuous\\Beta($\u03b1, $\u03b2);\n$pdf  = $beta-&gt;pdf($x);\n$cdf  = $beta-&gt;cdf($x);\n$\u03bc    = $beta-&gt;mean();\n\n<em>\/\/<\/em><em> Cauchy distribution<\/em>\n$x\u2080     = 2; <em>\/\/<\/em><em> location parameter<\/em>\n$\u03b3      = 3; <em>\/\/<\/em><em> scale parameter<\/em>\n$x      = 1;\n$cauchy = new Continuous\\Cauchy(x\u2080, \u03b3);\n$pdf    = $cauchy-&gt;pdf(x);\n$cdf    = $cauchy-&gt;cdf(x);\n\n<em>\/\/<\/em><em> \u03c7\u00b2-distribution (Chi-Squared)<\/em>\n$k   = 2; <em>\/\/<\/em><em> degrees of freedom<\/em>\n$x   = 1;\n$\u03c7\u00b2  = new Continuous\\ChiSquared($k);\n$pdf = $\u03c7\u00b2-&gt;pdf($x);\n$cdf = $\u03c7\u00b2-&gt;cdf($x);\n\n<em>\/\/<\/em><em> Dirac delta distribution<\/em>\n$x     = 1;\n$dirac = new Continuous\\DiracDelta();\n$pdf   = $dirac-&gt;pdf($x);\n$cdf   = $dirac-&gt;cdf($x);\n\n<em>\/\/<\/em><em> Exponential distribution<\/em>\n$\u03bb           = 1; <em>\/\/<\/em><em> rate parameter<\/em>\n$x           = 2;\n$exponential = new Continuous\\Exponential($\u03bb);\n$pdf         = $exponential-&gt;pdf($x);\n$cdf         = $exponential-&gt;cdf($x);\n$\u03bc           = $exponential-&gt;mean();\n\n<em>\/\/<\/em><em> F-distribution<\/em>\n$d\u2081  = 3; <em>\/\/<\/em><em> degree of freedom v1<\/em>\n$d\u2082  = 4; <em>\/\/<\/em><em> degree of freedom v2<\/em>\n$x   = 2;\n$f   = new Continuous\\F($d\u2081, $d\u2082);\n$pdf = $f-&gt;pdf($x);\n$cdf = $f-&gt;cdf($x);\n$\u03bc   = $f-&gt;mean();\n\n<em>\/\/<\/em><em> Gamma distribution<\/em>\n$k     = 2; <em>\/\/<\/em><em> shape parameter<\/em>\n$\u03b8     = 3; <em>\/\/<\/em><em> scale parameter<\/em>\n$x     = 4;\n$gamma = new Continuous\\Gamma($k, $\u03b8);\n$pdf   = $gamma-&gt;pdf($x);\n$cdf   = $gamma-&gt;cdf($x);\n$\u03bc     = $gamma-&gt;mean();\n\n<em>\/\/<\/em><em> Laplace distribution<\/em>\n$\u03bc       = 1;   <em>\/\/<\/em><em> location parameter<\/em>\n$b       = 1.5; <em>\/\/<\/em><em> scale parameter (diversity)<\/em>\n$x       = 1;\n$laplace = new Continuous\\Laplace($\u03bc, $b);\n$pdf     = $laplace-&gt;pdf($x);\n$cdf     = $laplace-&gt;cdf($x);\n\n<em>\/\/<\/em><em> Logistic distribution<\/em>\n$\u03bc        = 2;   <em>\/\/<\/em><em> location parameter<\/em>\n$s        = 1.5; <em>\/\/<\/em><em> scale parameter<\/em>\n$x        = 3;\n$logistic = new Continuous\\Logistic($\u03bc, $s);\n$pdf      = $logistic-&gt;pdf($x);\n$cdf      = $logistic-&gt;cdf($x);\n\n<em>\/\/<\/em><em> Log-logistic distribution (Fisk distribution)<\/em>\n$\u03b1           = 1; <em>\/\/<\/em><em> scale parameter<\/em>\n$\u03b2           = 1; <em>\/\/<\/em><em> shape parameter<\/em>\n$x           = 2;\n$logLogistic = new Continuous\\LogLogistic($\u03b1, $\u03b2);\n$pdf         = $logLogistic-&gt;pdf($x);\n$cdf         = $logLogistic-&gt;cdf($x);\n$\u03bc           = $logLogistic-&gt;mean();\n\n<em>\/\/<\/em><em> Log-normal distribution<\/em>\n$\u03bc         = 6;   <em>\/\/<\/em><em> scale parameter<\/em>\n$\u03c3         = 2;   <em>\/\/<\/em><em> location parameter<\/em>\n$x         = 4.3;\n$logNormal = new Continuous\\LogNormal($\u03bc, $\u03c3);\n$pdf       = $logNormal-&gt;pdf($x);\n$cdf       = $logNormal-&gt;cdf($x);\n$mean      = $logNormal-&gt;mean();\n\n<em>\/\/<\/em><em> Noncentral T distribution<\/em>\n$\u03bd            = 50; <em>\/\/<\/em><em> degrees of freedom<\/em>\n$\u03bc            = 10; <em>\/\/<\/em><em> noncentrality parameter<\/em>\n$x            = 8;\n$noncenetralT = new Continuous\\NoncentralT($\u03bd, $\u03bc);\n$pdf          = $noncenetralT-&gt;pdf($x);\n$cdf          = $noncenetralT-&gt;cdf($x);\n$mean         = $noncenetralT-&gt;mean();\n\n<em>\/\/<\/em><em> Normal distribution<\/em>\n$\u03c3      = 1;\n$\u03bc      = 0;\n$x      = 2;\n$normal = new Continuous\\Normal($\u03bc, $\u03c3);\n$pdf    = $normal-&gt;pdf($x);\n$cdf    = $normal-&gt;cdf($x);\n\n<em>\/\/<\/em><em> Pareto distribution<\/em>\n$a      = 1; <em>\/\/<\/em><em> shape parameter<\/em>\n$b      = 1; <em>\/\/<\/em><em> scale parameter<\/em>\n$x      = 2;\n$pareto = new Continuous\\Pareto($a, $b);\n$pdf    = $pareto-&gt;pdf($x);\n$cdf    = $pareto-&gt;cdf($x);\n$\u03bc      = $pareto-&gt;mean();\n\n<em>\/\/<\/em><em> Standard normal distribution<\/em>\n$z              = 2;\n$standardNormal = new Continuous\\StandardNormal();\n$pdf            = $standardNormal-&gt;pdf($z);\n$cdf            = $standardNormal-&gt;cdf($z);\n\n<em>\/\/<\/em><em> Student's t-distribution<\/em>\n$\u03bd        = 3;   <em>\/\/<\/em><em> degrees of freedom<\/em>\n$p        = 0.4; <em>\/\/<\/em><em> proportion of area<\/em>\n$x        = 2;\n$studentT = new Continuous\\StudentT::pdf($\u03bd);\n$pdf      = $studentT-&gt;pdf($x);\n$cdf      = $studentT-&gt;cdf($x);\n$t        = $studentT-&gt;inverse2Tails($p);  <em>\/\/<\/em><em> t such that the area greater than t and the area beneath -t is p<\/em>\n\n<em>\/\/<\/em><em> Uniform distribution<\/em>\n$a       = 1; <em>\/\/<\/em><em> lower boundary of the distribution<\/em>\n$b       = 4; <em>\/\/<\/em><em> upper boundary of the distribution<\/em>\n$x       = 2;\n$uniform = new Continuous\\Uniform($a, $b);\n$pdf     = $uniform-&gt;pdf($x);\n$cdf     = $uniform-&gt;cdf($x);\n$\u03bc       = $uniform-&gt;mean(b);\n\n<em>\/\/<\/em><em> Weibull distribution<\/em>\n$k       = 1; <em>\/\/<\/em><em> shape parameter<\/em>\n$\u03bb       = 2; <em>\/\/<\/em><em> scale parameter<\/em>\n$x       = 2;\n$weibull = new Continuous\\Weibull($k, $\u03bb);\n$pdf     = $weibull-&gt;pdf($x);\n$cdf     = $weibull-&gt;cdf($x);\n$\u03bc       = $weibull-&gt;mean();\n\n<em>\/\/<\/em><em> Other CDFs - All continuous distributions<\/em>\n<em>\/\/<\/em><em> Replace '$distribution' with desired distribution.<\/em>\n$inv_cdf = $distribution-&gt;inverse($target);   <em>\/\/<\/em><em> Inverse CDF of the distribution<\/em>\n$between = $distribution-&gt;between($x\u2081, $x\u2082);  <em>\/\/<\/em><em> Probability of being between two points, x\u2081 and x\u2082<\/em>\n$outside = $distribution-&gt;outside($x\u2081, $x);   <em>\/\/<\/em><em> Probability of being between below x\u2081 and above x\u2082<\/em>\n$above   = $distribution-&gt;above($x);          <em>\/\/<\/em><em> Probability of being above x to \u221e<\/em>\n\n<em>\/\/<\/em><em> Random Number Generator<\/em>\n$random  = $distribution-&gt;rand();  <em>\/\/<\/em><em> A random number with a given distribution<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader24\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Probability &#8211; Discrete Distributions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Probability\\Distribution\\Discrete;\n\n<em>\/\/<\/em><em> Bernoulli distribution (special case of binomial where n = 1)<\/em>\n$p         = 0.3;\n$k         = 0;\n$bernoulli = new Discrete\\Bernoulli($p);\n$pmf       = $bernoulli-&gt;pmf($k);\n$cdf       = $bernoulli-&gt;cdf($k);\n\n<em>\/\/<\/em><em> Binomial distribution<\/em>\n$n        = 2;   <em>\/\/<\/em><em> number of events<\/em>\n$p        = 0.5; <em>\/\/<\/em><em> probability of success<\/em>\n$r        = 1;   <em>\/\/<\/em><em> number of successful events<\/em>\n$binomial = new Discrete\\Binomial($n, $p);\n$pmf      = $binomial-&gt;pmf($r);\n$cdf      = $binomial-&gt;cdf($r);\n\n<em>\/\/<\/em><em> Categorical distribution<\/em>\n$k             = 3;                                    <em>\/\/<\/em><em> number of categories<\/em>\n$probabilities = ['a' =&gt; 0.3, 'b' =&gt; 0.2, 'c' =&gt; 0.5]; <em>\/\/<\/em><em> probabilities for categorices a, b, and c<\/em>\n$categorical   = new Discrete\\Categorical($k, $probabilities);\n$pmf_a         = $categorical-&gt;pmf('a');\n$mode          = $categorical-&gt;mode();\n\n<em>\/\/<\/em><em> Geometric distribution (failures before the first success)<\/em>\n$p         = 0.5; <em>\/\/<\/em><em> success probability<\/em>\n$k         = 2;   <em>\/\/<\/em><em> number of trials<\/em>\n$geometric = new Discrete\\Geometric($p);\n$pmf       = $geometric-&gt;pmf($k);\n$cdf       = $geometric-&gt;cdf($k);\n\n<em>\/\/<\/em><em> Hypergeometric distribution<\/em>\n$N        = 50; <em>\/\/<\/em><em> population size<\/em>\n$K        = 5;  <em>\/\/<\/em><em> number of success states in the population<\/em>\n$n        = 10; <em>\/\/<\/em><em> number of draws<\/em>\n$k        = 4;  <em>\/\/<\/em><em> number of observed successes<\/em>\n$hypergeo = new Discrete\\Hypergeometric($N, $K, $n);\n$pmf      = $hypergeo-&gt;pmf($k);\n$cdf      = $hypergeo-&gt;cdf($k);\n$\u03bc        = $hypergeo-&gt;mean();\n\n<em>\/\/<\/em><em> Multinomial distribution<\/em>\n$frequencies   = [7, 2, 3];\n$probabilities = [0.40, 0.35, 0.25];\n$multinomial   = new Discrete\\Multinomial($probabilities);\n$pmf           = $multinomial-&gt;pmf($frequencies);\n\n<em>\/\/<\/em><em> Negative binomial distribution (Pascal)<\/em>\n$r                = 1;   <em>\/\/<\/em><em> number of successful events<\/em>\n$P                = 0.5; <em>\/\/<\/em><em> probability of success on an individual trial<\/em>\n$x                = 2;   <em>\/\/<\/em><em> number of trials required to produce r successes<\/em>\n$negativeBinomial = new Discrete\\NegativeBinomial($r, $p);\n$pmf              = $negativeBinomial-&gt;pmf($x);\n\n<em>\/\/<\/em><em> Pascal distribution (Negative binomial)<\/em>\n$r      = 1;   <em>\/\/<\/em><em> number of successful events<\/em>\n$P      = 0.5; <em>\/\/<\/em><em> probability of success on an individual trial<\/em>\n$x      = 2;   <em>\/\/<\/em><em> number of trials required to produce r successes<\/em>\n$pascal = new Discrete\\Pascal($r, $p);\n$pmf    = $pascal-&gt;pmf($x);\n\n<em>\/\/<\/em><em> Poisson distribution<\/em>\n$\u03bb       = 2; <em>\/\/<\/em><em> average number of successful events per interval<\/em>\n$k       = 3; <em>\/\/<\/em><em> events in the interval<\/em>\n$poisson = new Discrete\\Poisson($\u03bb);\n$pmf     = $poisson-&gt;pmf($k);\n$cdf     = $poisson-&gt;cdf($k);\n\n<em>\/\/<\/em><em> Shifted geometric distribution (probability to get one success)<\/em>\n$p                = 0.5; <em>\/\/<\/em><em> success probability<\/em>\n$k                = 2;   <em>\/\/<\/em><em> number of trials<\/em>\n$shiftedGeometric = new Discrete\\ShiftedGeometric($p);\n$pmf              = $shiftedGeometric-&gt;pmf($k);\n$cdf              = $shiftedGeometric-&gt;cdf($k);\n\n<em>\/\/<\/em><em> Uniform distribution<\/em>\n$a       = 1; <em>\/\/<\/em><em> lower boundary of the distribution<\/em>\n$b       = 4; <em>\/\/<\/em><em> upper boundary of the distribution<\/em>\n$k       = 2; <em>\/\/<\/em><em> percentile<\/em>\n$uniform = new Discrete\\Uniform($a, $b);\n$pmf     = $uniform-&gt;pmf();\n$cdf     = $uniform-&gt;cdf($k);\n$\u03bc       = $uniform-&gt;mean();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader25\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Probability &#8211; Multivariate Distributions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Probability\\Distribution\\Multivariate;\n\n<em>\/\/<\/em><em> Dirichlet distribution<\/em>\n$\u03b1s        = [1, 2, 3];\n$xs        = [0.07255081, 0.27811903, 0.64933016];\n$dirichlet = new Multivariate\\Dirichlet($\u03b1s);\n$pdf       = $dirichlet-&gt;pdf($xs);\n\n<em>\/\/<\/em><em> Normal distribution<\/em>\n$\u03bc      = [1, 1.1];\n$\u2211      = MatrixFactory::create([\n    [1, 0],\n    [0, 1],\n]);\n$X      = [0.7, 1.4];\n$normal = new Multivariate\\Normal($\u03bc, $\u2211);\n$pdf    = $normal-&gt;pdf($X);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader26\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Probability &#8211; Distribution Tables<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Probability\\Distribution\\Table;\n\n\/\/ Provided solely for completeness' sake.\n\/\/ It is statistics tradition to provide these tables.\n\/\/ MathPHP has dynamic distribution CDF functions you can use instead.\n\n\/\/ Standard Normal Table (Z Table)\n$table       = Table\\StandardNormal::Z_SCORES;\n$probability = $table[1.5][0];                 \/\/ Value for Z of 1.50\n\n\/\/ t Distribution Tables\n$table   = Table\\TDistribution::ONE_SIDED_CONFIDENCE_LEVEL;\n$table   = Table\\TDistribution::TWO_SIDED_CONFIDENCE_LEVEL;\n$\u03bd       = 5;  \/\/ degrees of freedom\n$cl      = 99; \/\/ confidence level\n$t       = $table[$\u03bd][$cl];\n\n\/\/ t Distribution Tables\n$table = Table\\TDistribution::ONE_SIDED_ALPHA;\n$table = Table\\TDistribution::TWO_SIDED_ALPHA;\n$\u03bd     = 5;     \/\/ degrees of freedom\n$\u03b1     = 0.001; \/\/ alpha value\n$t     = $table[$\u03bd][$\u03b1];\n\n\/\/ \u03c7\u00b2 Distribution Table\n$table = Table\\ChiSquared::CHI_SQUARED_SCORES;\n$df    = 2;    \/\/ degrees of freedom\n$p     = 0.05; \/\/ P value\n$\u03c7\u00b2    = $table[$df][$p];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader27\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Sequences &#8211; Basic<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Sequence\\Basic;\n\n$n = 5; <em>\/\/<\/em><em> Number of elements in the sequence<\/em>\n\n<em>\/\/<\/em><em> Arithmetic progression<\/em>\n$d           = 2;  <em>\/\/<\/em><em> Difference between the elements of the sequence<\/em>\n$a\u2081          = 1;  <em>\/\/<\/em><em> Starting number for the sequence<\/em>\n$progression = Basic::arithmeticProgression($n, $d, $a\u2081);\n<em>\/\/<\/em><em> [1, 3, 5, 7, 9] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Geometric progression (ar\u207f\u207b\u00b9)<\/em>\n$a           = 2; <em>\/\/<\/em><em> Scalar value<\/em>\n$r           = 3; <em>\/\/<\/em><em> Common ratio<\/em>\n$progression = Basic::geometricProgression($n, $a, $r);\n<em>\/\/<\/em><em> [2(3)\u2070, 2(3)\u00b9, 2(3)\u00b2, 2(3)\u00b3] = [2, 6, 18, 54] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Square numbers (n\u00b2)<\/em>\n$squares = Basic::squareNumber($n);\n<em>\/\/<\/em><em> [0\u00b2, 1\u00b2, 2\u00b2, 3\u00b2, 4\u00b2] = [0, 1, 4, 9, 16] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Cubic numbers (n\u00b3)<\/em>\n$cubes = Basic::cubicNumber($n);\n<em>\/\/<\/em><em> [0\u00b3, 1\u00b3, 2\u00b3, 3\u00b3, 4\u00b3] = [0, 1, 8, 27, 64] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Powers of 2 (2\u207f)<\/em>\n$po2 = Basic::powersOfTwo($n);\n<em>\/\/<\/em><em> [2\u2070, 2\u00b9, 2\u00b2, 2\u00b3, 2\u2074] = [1, 2, 4, 8, 16] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Powers of 10 (10\u207f)<\/em>\n$po10 = Basic::powersOfTen($n);\n<em>\/\/<\/em><em> [10\u2070, 10\u00b9, 10\u00b2, 10\u00b3, 10\u2074] = [1, 10, 100, 1000, 10000] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Factorial (n!)<\/em>\n$fact = Basic::factorial($n);\n<em>\/\/<\/em><em> [0!, 1!, 2!, 3!, 4!] = [1, 1, 2, 6, 24] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Digit sum<\/em>\n$digit_sum = Basic::digitSum($n);\n<em>\/\/<\/em><em> [0, 1, 2, 3, 4] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Digital root<\/em>\n$digit_root = Basic::digitalRoot($n);\n<em>\/\/<\/em><em> [0, 1, 2, 3, 4] - Indexed from 0<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader28\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Sequences &#8211; Advanced<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Sequence\\Advanced;\n\n$n = 6; <em>\/\/<\/em><em> Number of elements in the sequence<\/em>\n\n<em>\/\/<\/em><em> Fibonacci (F\u1d62 = F\u1d62\u208b\u2081 + F\u1d62\u208b\u2082)<\/em>\n$fib = Advanced::fibonacci($n);\n<em>\/\/<\/em><em> [0, 1, 1, 2, 3, 5] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Lucas numbers<\/em>\n$lucas = Advanced::lucasNumber($n);\n<em>\/\/<\/em><em> [2, 1, 3, 4, 7, 11] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Pell numbers<\/em>\n$pell = Advanced::pellNumber($n);\n<em>\/\/<\/em><em> [0, 1, 2, 5, 12, 29] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Triangular numbers (figurate number)<\/em>\n$triangles = Advanced::triangularNumber($n);\n<em>\/\/<\/em><em> [1, 3, 6, 10, 15, 21] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Pentagonal numbers (figurate number)<\/em>\n$pentagons = Advanced::pentagonalNumber($n);\n<em>\/\/<\/em><em> [1, 5, 12, 22, 35, 51] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Hexagonal numbers (figurate number)<\/em>\n$hexagons = Advanced::hexagonalNumber($n);\n<em>\/\/<\/em><em> [1, 6, 15, 28, 45, 66] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Heptagonal numbers (figurate number)<\/em>\n$hexagons = Advanced::heptagonalNumber($n);\n<em>\/\/<\/em><em> [1, 4, 7, 13, 18, 27] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Look-and-say sequence (describe the previous term!)<\/em>\n$look_and_say = Advanced::lookAndSay($n);\n<em>\/\/<\/em><em> ['1', '11', '21', '1211', '111221', '312211'] - Indexed from 1<\/em>\n\n<em>\/\/<\/em><em> Lazy caterer's sequence (central polygonal numbers)<\/em>\n$lazy_caterer = Advanced::lazyCaterers($n);\n<em>\/\/<\/em><em> [1, 2, 4, 7, 11, 16] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Magic squares series (magic constants; magic sums)<\/em>\n$magic_squares = Advanced::magicSquares($n);\n<em>\/\/<\/em><em> [0, 1, 5, 15, 34, 65] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Perfect powers sequence<\/em>\n$perfect_powers = Advanced::perfectPowers($n);\n<em>\/\/<\/em><em> [4, 8, 9, 16, 25, 27] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Not perfect powers sequence<\/em>\n$not_perfect_powers = Advanced::notPerfectPowers($n);\n<em>\/\/<\/em><em> [2, 3, 5, 6, 7, 10] - Indexed from 0<\/em>\n\n<em>\/\/<\/em><em> Prime numbers up to n (n is not the number of elements in the sequence)<\/em>\n$primes = Advanced::primesUpTo(30);\n<em>\/\/<\/em><em> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] - Indexed from 0<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader29\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Set Theory<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\SetTheory\\Set;\nuse MathPHP\\SetTheory\\ImmutableSet;\n\n<em>\/\/<\/em><em> Sets and immutable sets<\/em>\n$A = new Set([1, 2, 3]);          <em>\/\/<\/em><em> Can add and remove members<\/em>\n$B = new ImmutableSet([3, 4, 5]); <em>\/\/<\/em><em> Cannot modify set once created<\/em>\n\n<em>\/\/<\/em><em> Basic set data<\/em>\n$set         = $A-&gt;asArray();\n$cardinality = $A-&gt;length();\n$bool        = $A-&gt;isEmpty();\n\n<em>\/\/<\/em><em> Set membership<\/em>\n$true = $A-&gt;isMember(2);\n$true = $A-&gt;isNotMember(8);\n\n<em>\/\/<\/em><em> Add and remove members<\/em>\n$A-&gt;add(4);\n$A-&gt;add(new Set(['a', 'b']));\n$A-&gt;addMulti([5, 6, 7]);\n$A-&gt;remove(7);\n$A-&gt;removeMulti([5, 6]);\n$A-&gt;clear();\n\n<em>\/\/<\/em><em> Set properties against other sets - return boolean<\/em>\n$bool = $A-&gt;isDisjoint($B);\n$bool = $A-&gt;isSubset($B);         <em>\/\/<\/em><em> A \u2286 B<\/em>\n$bool = $A-&gt;isProperSubset($B);   <em>\/\/<\/em><em> A \u2286 B &amp; A \u2260 B<\/em>\n$bool = $A-&gt;isSuperset($B);       <em>\/\/<\/em><em> A \u2287 B<\/em>\n$bool = $A-&gt;isProperSuperset($B); <em>\/\/<\/em><em> A \u2287 B &amp; A \u2260 B<\/em>\n\n<em>\/\/<\/em><em> Set operations with other sets - return a new Set<\/em>\n$A\u222aB  = $A-&gt;union($B);\n$A\u2229B  = $A-&gt;intersect($B);\n$A\uff3cB = $A-&gt;difference($B);          <em>\/\/<\/em><em> relative complement<\/em>\n$A\u0394B  = $A-&gt;symmetricDifference($B);\n$A\u00d7B  = $A-&gt;cartesianProduct($B);\n\n<em>\/\/<\/em><em> Other set operations<\/em>\n$P\u27eeA\u27ef = $A-&gt;powerSet();\n$C   = $A-&gt;copy();\n\n<em>\/\/<\/em><em> Print a set<\/em>\nprint($A); <em>\/\/<\/em><em> Set{1, 2, 3, 4, Set{a, b}}<\/em>\n\n<em>\/\/<\/em><em> PHP Interfaces<\/em>\n$n = count($A);                 <em>\/\/<\/em><em> Countable<\/em>\nforeach ($A as $member) { ... } <em>\/\/<\/em><em> Iterator<\/em>\n\n<em>\/\/<\/em><em> Fluent interface<\/em>\n$A-&gt;add(5)-&gt;add(6)-&gt;remove(4)-&gt;addMulti([7, 8, 9]);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader30\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; ANOVA<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\ANOVA;\n\n<em>\/\/<\/em><em> One-way ANOVA<\/em>\n$sample1 = [1, 2, 3];\n$sample2 = [3, 4, 5];\n$sample3 = [5, 6, 7];\n   \u22ee            \u22ee\n\n$anova = ANOVA::oneWay($sample1, $sample2, $sample3);\nprint_r($anova);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [ANOVA] =&gt; Array ( \/\/ ANOVA hypothesis test summary data<\/em><em>\n<\/em><em> [treatment] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 24 \/\/ Sum of squares (between)<\/em><em>\n<\/em><em> [df] =&gt; 2 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 12 \/\/ Mean squares<\/em><em>\n<\/em><em> [F] =&gt; 12 \/\/ Test statistic<\/em><em>\n<\/em><em> [P] =&gt; 0.008 \/\/ P value<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [error] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 6 \/\/ Sum of squares (within)<\/em><em>\n<\/em><em> [df] =&gt; 6 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 1 \/\/ Mean squares<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [total] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 30 \/\/ Sum of squares (total)<\/em><em>\n<\/em><em> [df] =&gt; 8 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [total_summary] =&gt; Array ( \/\/ Total summary data<\/em><em>\n<\/em><em> [n] =&gt; 9<\/em><em>\n<\/em><em> [sum] =&gt; 36<\/em><em>\n<\/em><em> [mean] =&gt; 4<\/em><em>\n<\/em><em> [SS] =&gt; 174<\/em><em>\n<\/em><em> [variance] =&gt; 3.75<\/em><em>\n<\/em><em> [sd] =&gt; 1.9364916731037<\/em><em>\n<\/em><em> [sem] =&gt; 0.6454972243679<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [data_summary] =&gt; Array ( \/\/ Data summary (each input sample)<\/em><em>\n<\/em><em> [0] =&gt; Array ([n] =&gt; 3 [sum] =&gt; 6 [mean] =&gt; 2 [SS] =&gt; 14 [variance] =&gt; 1 [sd] =&gt; 1 [sem] =&gt; 0.57735026918963)<\/em><em>\n<\/em><em> [1] =&gt; Array ([n] =&gt; 3 [sum] =&gt; 12 [mean] =&gt; 4 [SS] =&gt; 50 [variance] =&gt; 1 [sd] =&gt; 1 [sem] =&gt; 0.57735026918963)<\/em><em>\n<\/em><em> [2] =&gt; Array ([n] =&gt; 3 [sum] =&gt; 18 [mean] =&gt; 6 [SS] =&gt; 110 [variance] =&gt; 1 [sd] =&gt; 1 [sem] =&gt; 0.57735026918963)<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Two-way ANOVA<\/em>\n<em>\/*<\/em><em> | Factor B\u2081 | Factor B\u2082 | Factor B\u2083 | \u22ef<\/em><em>\n<\/em><em>Factor A\u2081 | 4, 6, 8 | 6, 6, 9 | 8, 9, 13 | \u22ef<\/em><em>\n<\/em><em>Factor A\u2082 | 4, 8, 9 | 7, 10, 13 | 12, 14, 16| \u22ef<\/em><em>\n<\/em><em> \u22ee \u22ee \u22ee \u22ee <\/em><em>*\/<\/em>\n$factorA\u2081 = [\n  [4, 6, 8],    <em>\/\/<\/em><em> Factor B\u2081<\/em>\n  [6, 6, 9],    <em>\/\/<\/em><em> Factor B\u2082<\/em>\n  [8, 9, 13],   <em>\/\/<\/em><em> Factor B\u2083<\/em>\n];\n$factorA\u2082 = [\n  [4, 8, 9],    <em>\/\/<\/em><em> Factor B\u2081<\/em>\n  [7, 10, 13],  <em>\/\/<\/em><em> Factor B\u2082<\/em>\n  [12, 14, 16], <em>\/\/<\/em><em> Factor B\u2083<\/em>\n];\n       \u22ee\n\n$anova = ANOVA::twoWay($factorA\u2081, $factorA\u2082);\nprint_r($anova);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [ANOVA] =&gt; Array ( \/\/ ANOVA hypothesis test summary data<\/em><em>\n<\/em><em> [factorA] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 32 \/\/ Sum of squares<\/em><em>\n<\/em><em> [df] =&gt; 1 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 32 \/\/ Mean squares<\/em><em>\n<\/em><em> [F] =&gt; 5.6470588235294 \/\/ Test statistic<\/em><em>\n<\/em><em> [P] =&gt; 0.034994350619895 \/\/ P value<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [factorB] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 93 \/\/ Sum of squares<\/em><em>\n<\/em><em> [df] =&gt; 2 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 46.5 \/\/ Mean squares<\/em><em>\n<\/em><em> [F] =&gt; 8.2058823529412 \/\/ Test statistic<\/em><em>\n<\/em><em> [P] =&gt; 0.0056767297582031 \/\/ P value<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [interaction] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 7 \/\/ Sum of squares<\/em><em>\n<\/em><em> [df] =&gt; 2 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 3.5 \/\/ Mean squares<\/em><em>\n<\/em><em> [F] =&gt; 0.61764705882353 \/\/ Test statistic<\/em><em>\n<\/em><em> [P] =&gt; 0.5555023440712 \/\/ P value<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [error] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 68 \/\/ Sum of squares (within)<\/em><em>\n<\/em><em> [df] =&gt; 12 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> [MS] =&gt; 5.6666666666667 \/\/ Mean squares<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [total] =&gt; Array (<\/em><em>\n<\/em><em> [SS] =&gt; 200 \/\/ Sum of squares (total)<\/em><em>\n<\/em><em> [df] =&gt; 17 \/\/ Degrees of freedom<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [total_summary] =&gt; Array ( \/\/ Total summary data<\/em><em>\n<\/em><em> [n] =&gt; 18<\/em><em>\n<\/em><em> [sum] =&gt; 162<\/em><em>\n<\/em><em> [mean] =&gt; 9<\/em><em>\n<\/em><em> [SS] =&gt; 1658<\/em><em>\n<\/em><em> [variance] =&gt; 11.764705882353<\/em><em>\n<\/em><em> [sd] =&gt; 3.4299717028502<\/em><em>\n<\/em><em> [sem] =&gt; 0.80845208345444<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [summary_factorA] =&gt; Array ( ... ) \/\/ Summary data of factor A<\/em><em>\n<\/em><em> [summary_factorB] =&gt; Array ( ... ) \/\/ Summary data of factor B<\/em><em>\n<\/em><em> [summary_interaction] =&gt; Array ( ... ) \/\/ Summary data of interactions of factors A and B<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader31\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Averages<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Average;\n\n$numbers = [13, 18, 13, 14, 13, 16, 14, 21, 13];\n\n<em>\/\/<\/em><em> Mean, median, mode<\/em>\n$mean   = Average::mean($numbers);\n$median = Average::median($numbers);\n$mode   = Average::mode($numbers); <em>\/\/<\/em><em> Returns an array \u2014 may be multimodal<\/em>\n\n<em>\/\/<\/em><em> Weighted mean<\/em>\n$weights       = [12, 1, 23, 6, 12, 26, 21, 12, 1];\n$weighted_mean = Average::weightedMean($numbers, $weights)\n\n<em>\/\/<\/em><em> Other means of a list of numbers<\/em>\n$geometric_mean      = Average::geometricMean($numbers);\n$harmonic_mean       = Average::harmonicMean($numbers);\n$contraharmonic_mean = Average::contraharmonicMean($numbers);\n$quadratic_mean      = Average::quadraticMean($numbers);  <em>\/\/<\/em><em> same as rootMeanSquare<\/em>\n$root_mean_square    = Average::rootMeanSquare($numbers); <em>\/\/<\/em><em> same as quadraticMean<\/em>\n$trimean             = Average::trimean($numbers);\n$interquartile_mean  = Average::interquartileMean($numbers); <em>\/\/<\/em><em> same as iqm<\/em>\n$interquartile_mean  = Average::iqm($numbers);               <em>\/\/<\/em><em> same as interquartileMean<\/em>\n$cubic_mean          = Average::cubicMean($numbers);\n\n<em>\/\/<\/em><em> Truncated mean (trimmed mean)<\/em>\n$trim_percent   = 25;\n$truncated_mean = Average::truncatedMean($numbers, $trim_percent);\n\n<em>\/\/<\/em><em> Generalized mean (power mean)<\/em>\n$p                = 2;\n$generalized_mean = Average::generalizedMean($numbers, $p); <em>\/\/<\/em><em> same as powerMean<\/em>\n$power_mean       = Average::powerMean($numbers, $p);       <em>\/\/<\/em><em> same as generalizedMean<\/em>\n\n<em>\/\/<\/em><em> Lehmer mean<\/em>\n$p           = 3;\n$lehmer_mean = Average::lehmerMean($numbers, $p);\n\n<em>\/\/<\/em><em> Moving averages<\/em>\n$n       = 3;\n$weights = [3, 2, 1];\n$SMA     = Average::simpleMovingAverage($numbers, $n);             <em>\/\/<\/em><em> 3 n-point moving average<\/em>\n$CMA     = Average::cumulativeMovingAverage($numbers);\n$WMA     = Average::weightedMovingAverage($numbers, $n, $weights);\n$EPA     = Average::exponentialMovingAverage($numbers, $n);\n\n<em>\/\/<\/em><em> Means of two numbers<\/em>\nlist($x, $y) = [24, 6];\n$agm           = Average::arithmeticGeometricMean($x, $y); <em>\/\/<\/em><em> same as agm<\/em>\n$agm           = Average::agm($x, $y);                     <em>\/\/<\/em><em> same as arithmeticGeometricMean<\/em>\n$log_mean      = Average::logarithmicMean($x, $y);\n$heronian_mean = Average::heronianMean($x, $y);\n$identric_mean = Average::identricMean($x, $y);\n\n<em>\/\/<\/em><em> Averages report<\/em>\n$averages = Average::describe($numbers);\nprint_r($averages);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [mean] =&gt; 15<\/em><em>\n<\/em><em> [median] =&gt; 14<\/em><em>\n<\/em><em> [mode] =&gt; Array ( [0] =&gt; 13 )<\/em><em>\n<\/em><em> [geometric_mean] =&gt; 14.789726414533<\/em><em>\n<\/em><em> [harmonic_mean] =&gt; 14.605077399381<\/em><em>\n<\/em><em> [contraharmonic_mean] =&gt; 15.474074074074<\/em><em>\n<\/em><em> [quadratic_mean] =&gt; 15.235193176035<\/em><em>\n<\/em><em> [trimean] =&gt; 14.5<\/em><em>\n<\/em><em> [iqm] =&gt; 14<\/em><em>\n<\/em><em> [cubic_mean] =&gt; 15.492307432707<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader32\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Circular<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Circular;\n\n$angles = [1.51269877, 1.07723915, 0.81992282];\n\n$\u03b8 = Circular::mean($angles);\n$R = Circular::resultantLength($angles);\n$\u03c1 = Circular::meanResultantLength($angles);\n$V = Circular::variance($angles);\n$\u03bd = Circular::standardDeviation($angles);\n\n<em>\/\/<\/em><em> Descriptive circular statistics report<\/em>\n$stats = Circular::describe($angles);\nprint_r($stats);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [n] =&gt; 3<\/em><em>\n<\/em><em> [mean] =&gt; 1.1354043006436<\/em><em>\n<\/em><em> [resultant_length] =&gt; 2.8786207547493<\/em><em>\n<\/em><em> [mean_resultant_length] =&gt; 0.9595402515831<\/em><em>\n<\/em><em> [variance] =&gt; 0.040459748416901<\/em><em>\n<\/em><em> [sd] =&gt; 0.28740568481722<\/em><em>\n<\/em><em>); <\/em><em>*\/<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader33\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Correlation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Correlation;\n\n$X = [1, 2, 3, 4, 5];\n$Y = [2, 3, 4, 4, 6];\n\n<em>\/\/<\/em><em> Covariance<\/em>\n$\u03c3xy = Correlation::covariance($X, $Y);  <em>\/\/<\/em><em> Has optional parameter to set population (defaults to sample covariance)<\/em>\n\n<em>\/\/<\/em><em> Weighted covariance<\/em>\n$w    = [2, 3, 1, 1, 5];\n$\u03c3xyw = Correlation::weightedCovariance($X, $Y, $w);\n\n<em>\/\/<\/em><em> r - Pearson product-moment correlation coefficient (Pearson's r)<\/em>\n$r = Correlation::r($X, $Y);  <em>\/\/<\/em><em> Has optional parameter to set population (defaults to sample correlation coefficient)<\/em>\n\n<em>\/\/<\/em><em> Weighted correlation coefficient<\/em>\n$rw = Correlation::weightedCorrelationCoefficient($X, $Y, $w);\n\n<em>\/\/<\/em><em> R\u00b2 - Coefficient of determination<\/em>\n$R\u00b2 = Correlation::r2($X, $Y);  <em>\/\/<\/em><em> Has optional parameter to set population (defaults to sample coefficient of determination)<\/em>\n\n<em>\/\/<\/em><em> \u03c4 - Kendall rank correlation coefficient (Kendall's tau)<\/em>\n$\u03c4 = Correlation::kendallsTau($X, $Y);\n\n<em>\/\/<\/em><em> \u03c1 - Spearman's rank correlation coefficient (Spearman's rho)<\/em>\n$\u03c1 = Correlation::spearmansRho($X, $Y);\n\n<em>\/\/<\/em><em> Descriptive correlation report<\/em>\n$stats = Correlation::describe($X, $Y);\nprint_r($stats);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [cov] =&gt; 2.25<\/em><em>\n<\/em><em> [r] =&gt; 0.95940322360025<\/em><em>\n<\/em><em> [r2] =&gt; 0.92045454545455<\/em><em>\n<\/em><em> [tau] =&gt; 0.94868329805051<\/em><em>\n<\/em><em> [rho] =&gt; 0.975<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Confidence ellipse - create an ellipse surrounding the data at a specified standard deviation<\/em>\n$sd           = 1;\n$num_points   = 11; <em>\/\/<\/em><em> Optional argument specifying number of points of the ellipse<\/em>\n$ellipse_data = Correlation::confidenceEllipse($X, $Y, $sd, $num_points);\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader34\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Descriptive<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Descriptive;\n\n$numbers = [13, 18, 13, 14, 13, 16, 14, 21, 13];\n\n<em>\/\/<\/em><em> Range and midrange<\/em>\n$range    = Descriptive::range($numbers);\n$midrange = Descriptive::midrange($numbers);\n\n<em>\/\/<\/em><em> Variance (population and sample)<\/em>\n$\u03c3\u00b2 = Descriptive::populationVariance($numbers); <em>\/\/<\/em><em> n degrees of freedom<\/em>\n$S\u00b2 = Descriptive::sampleVariance($numbers);     <em>\/\/<\/em><em> n - 1 degrees of freedom<\/em>\n\n<em>\/\/<\/em><em> Variance (Custom degrees of freedom)<\/em>\n$df = 5;                                    <em>\/\/<\/em><em> degrees of freedom<\/em>\n$S\u00b2 = Descriptive::variance($numbers, $df); <em>\/\/<\/em><em> can specify custom degrees of freedom<\/em>\n\n<em>\/\/<\/em><em> Weighted sample variance<\/em>\n$weights = [0.1, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1];\n$\u03c3\u00b2w     = Descriptive::weightedSampleVariance($numbers, $weights, $biased = false);\n\n<em>\/\/<\/em><em> Standard deviation (For a sample; uses sample variance)<\/em>\n$\u03c3 = Descriptive::sd($numbers);                <em>\/\/<\/em><em> same as standardDeviation;<\/em>\n$\u03c3 = Descriptive::standardDeviation($numbers); <em>\/\/<\/em><em> same as sd;<\/em>\n\n<em>\/\/<\/em><em> SD+ (Standard deviation for a population; uses population variance)<\/em>\n$SD\uff0b = Descriptive::sd($numbers, Descriptive::POPULATION); <em>\/\/<\/em><em> POPULATION constant = true<\/em>\n$SD\uff0b = Descriptive::standardDeviation($numbers, true);     <em>\/\/<\/em><em> same as sd with POPULATION constant<\/em>\n\n<em>\/\/<\/em><em> Coefficient of variation (c\u1d65)<\/em>\n$c\u1d65 = Descriptive::coefficientOfVariation($numbers);\n\n<em>\/\/<\/em><em> MAD - mean\/median absolute deviations<\/em>\n$mean_mad   = Descriptive::meanAbsoluteDeviation($numbers);\n$median_mad = Descriptive::medianAbsoluteDeviation($numbers);\n\n<em>\/\/<\/em><em> Quartiles (inclusive and exclusive methods)<\/em>\n<em>\/\/<\/em><em> [0\n$quartiles = Descriptive::quartiles($numbers);          <em>\/\/<\/em><em> Has optional parameter to specify method. Default is Exclusive<\/em>\n$quartiles = Descriptive::quartilesExclusive($numbers);\n$quartiles = Descriptive::quartilesInclusive($numbers);\n\n<em>\/\/<\/em><em> IQR - Interquartile range<\/em>\n$IQR = Descriptive::interquartileRange($numbers); <em>\/\/<\/em><em> Same as IQR; has optional parameter to specify quartile method.<\/em>\n$IQR = Descriptive::iqr($numbers);                <em>\/\/<\/em><em> Same as interquartileRange; has optional parameter to specify quartile method.<\/em>\n\n<em>\/\/<\/em><em> Percentiles<\/em>\n$twentieth_percentile    = Descriptive::percentile($numbers, 20);\n$ninety_fifth_percentile = Descriptive::percentile($numbers, 95);\n\n<em>\/\/<\/em><em> Midhinge<\/em>\n$midhinge = Descriptive::midhinge($numbers);\n\n<em>\/\/<\/em><em> Describe a list of numbers - descriptive stats report<\/em>\n$stats = Descriptive::describe($numbers); <em>\/\/<\/em><em> Has optional parameter to set population or sample calculations<\/em>\nprint_r($stats);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [n] =&gt; 9<\/em><em>\n<\/em><em> [min] =&gt; 13<\/em><em>\n<\/em><em> [max] =&gt; 21<\/em><em>\n<\/em><em> [mean] =&gt; 15<\/em><em>\n<\/em><em> [median] =&gt; 14<\/em><em>\n<\/em><em> [mode] =&gt; Array ( [0] =&gt; 13 )<\/em><em>\n<\/em><em> [range] =&gt; 8<\/em><em>\n<\/em><em> [midrange] =&gt; 17<\/em><em>\n<\/em><em> [variance] =&gt; 8<\/em><em>\n<\/em><em> [sd] =&gt; 2.8284271247462<\/em><em>\n<\/em><em> [cv] =&gt; 0.18856180831641<\/em><em>\n<\/em><em> [mean_mad] =&gt; 2.2222222222222<\/em><em>\n<\/em><em> [median_mad] =&gt; 1<\/em><em>\n<\/em><em> [quartiles] =&gt; Array (<\/em><em>\n<\/em><em> [0\n<\/em><em> [Q1] =&gt; 13<\/em><em>\n<\/em><em> [Q2] =&gt; 14<\/em><em>\n<\/em><em> [Q3] =&gt; 17<\/em><em>\n<\/em><em> [100\n<\/em><em> [IQR] =&gt; 4<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [midhinge] =&gt; 15<\/em><em>\n<\/em><em> [skewness] =&gt; 1.4915533665654<\/em><em>\n<\/em><em> [ses] =&gt; 0.71713716560064<\/em><em>\n<\/em><em> [kurtosis] =&gt; 0.1728515625<\/em><em>\n<\/em><em> [sek] =&gt; 1.3997084244475<\/em><em>\n<\/em><em> [sem] =&gt; 0.94280904158206<\/em><em>\n<\/em><em> [ci_95] =&gt; Array (<\/em><em>\n<\/em><em> [ci] =&gt; 1.8478680091392<\/em><em>\n<\/em><em> [lower_bound] =&gt; 13.152131990861<\/em><em>\n<\/em><em> [upper_bound] =&gt; 16.847868009139<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em> [ci_99] =&gt; Array (<\/em><em>\n<\/em><em> [ci] =&gt; 2.4285158135783<\/em><em>\n<\/em><em> [lower_bound] =&gt; 12.571484186422<\/em><em>\n<\/em><em> [upper_bound] =&gt; 17.428515813578<\/em><em>\n<\/em><em> )<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Five number summary - five most important sample percentiles<\/em>\n$summary = Descriptive::fiveNumberSummary($numbers);\n<em>\/\/<\/em><em> [min, Q1, median, Q3, max]<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader35\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Distance and Divergence<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Distance;\n\n<em>\/\/<\/em><em> Probability distributions<\/em>\n$p = [0.2, 0.5, 0.3];\n$q = [0.1, 0.4, 0.5];\n\n<em>\/\/<\/em><em> Distances<\/em>\n$DB\u27eep\u3001q\u27ef = Distance::bhattacharyyaDistance($p, $q);\n$H\u27eep\u3001q\u27ef  = Distance::hellingerDistance($p, $q)\n\n<em>\/\/<\/em><em> Divergences<\/em>\n$Dkl\u27eeP\u2016Q\u27ef = Distance::kullbackLeiblerDivergence($p, $q);\n$JSD\u27eeP\u2016Q\u27ef = Distance::jensenShannonDivergence($p, $q);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader36\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Distributions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Distribution;\n\n$grades = ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'D', 'F'];\n\n<em>\/\/<\/em><em> Frequency distributions (frequency and relative frequency)<\/em>\n$frequencies          = Distribution::frequency($grades);         <em>\/\/<\/em><em> [ A =&gt; 2, B =&gt; 4, C =&gt; 2, D =&gt; 1, F =&gt; 1 ]<\/em>\n$relative_frequencies = Distribution::relativeFrequency($grades); <em>\/\/<\/em><em> [ A =&gt; 0.2, B =&gt; 0.4, C =&gt; 0.2, D =&gt; 0.1, F =&gt; 0.1 ]<\/em>\n\n<em>\/\/<\/em><em> Cumulative frequency distributions (cumulative and cumulative relative)<\/em>\n$cumulative_frequencies          = Distribution::cumulativeFrequency($grades);         <em>\/\/<\/em><em> [ A =&gt; 2, B =&gt; 6, C =&gt; 8, D =&gt; 9, F =&gt; 10 ]<\/em>\n$cumulative_relative_frequencies = Distribution::cumulativeRelativeFrequency($grades); <em>\/\/<\/em><em> [ A =&gt; 0.2, B =&gt; 0.6, C =&gt; 0.8, D =&gt; 0.9, F =&gt; 1 ]<\/em>\n\n<em>\/\/<\/em><em> Stem and leaf plot<\/em>\n<em>\/\/<\/em><em> Return value is array where keys are the stems, values are the leaves<\/em>\n$values             = [44, 46, 47, 49, 63, 64, 66, 68, 68, 72, 72, 75, 76, 81, 84, 88, 106];\n$stem_and_leaf_plot = Distribution::stemAndLeafPlot($values);\n<em>\/\/<\/em><em> [4 =&gt; [4, 6, 7, 9], 5 =&gt; [], 6 =&gt; [3, 4, 6, 8, 8], 7 =&gt; [2, 2, 5, 6], 8 =&gt; [1, 4, 8], 9 =&gt; [], 10 =&gt; [6]]<\/em>\n\n<em>\/\/<\/em><em> Optional second parameter will print stem and leaf plot to STDOUT<\/em>\nDistribution::stemAndLeafPlot($values, Distribution::PRINT);\n<em>\/*<\/em><em>\n<\/em><em> 4 | 4 6 7 9<\/em><em>\n<\/em><em> 5 |<\/em><em>\n<\/em><em> 6 | 3 4 6 8 8<\/em><em>\n<\/em><em> 7 | 2 2 5 6<\/em><em>\n<\/em><em> 8 | 1 4 8<\/em><em>\n<\/em><em> 9 |<\/em><em>\n<\/em><em>10 | 6<\/em><em>\n<\/em><em>*\/<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader37\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Effect Size<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\EffectSize;\n\n$SSt = 24;  <em>\/\/<\/em><em> Sum of squares treatment<\/em>\n$SSE = 300; <em>\/\/<\/em><em> Sum of squares error<\/em>\n$SST = 600; <em>\/\/<\/em><em> Sum of squares total<\/em>\n$dft = 1;   <em>\/\/<\/em><em> Degrees of freedom treatment<\/em>\n$MSE = 18;  <em>\/\/<\/em><em> Mean squares error<\/em>\n\n<em>\/\/<\/em><em> \u03b7\u00b2 - Eta-squared<\/em>\n$\u03b7\u00b2  = EffectSize::etaSquared($SSt, $SST);\n$\u03b7\u00b2p = EffectSize::partialEtaSquared($SSt, $SSE);\n\n<em>\/\/<\/em><em> \u03c9\u00b2 - Omega-squared<\/em>\n$\u03c9\u00b2 = EffectSize::omegaSquared($SSt, $dft, $SST, $MSE);\n\n<em>\/\/<\/em><em> Cohen's \u0192\u00b2<\/em>\n$\u0192\u00b2 = EffectSize::cohensF($\u03b7\u00b2);\n$\u0192\u00b2 = EffectSize::cohensF($\u03c9\u00b2);\n$\u0192\u00b2 = EffectSize::cohensF($R\u00b2);\n\n<em>\/\/<\/em><em> Cohen's q<\/em>\nlist($r\u2081, $r\u2082) = [0.1, 0.2];\n$q = EffectSize::cohensQ($r\u2081, $r\u2082);\n\n<em>\/\/<\/em><em> Cohen's d<\/em>\nlist($\u03bc\u2081, $\u03c3\u2081) = [6.7, 1.2];\nlist($\u03bc\u2082, $\u03c3\u2082) = [6, 1];\n$d = EffectSize::cohensD($\u03bc\u2081, $\u03bc\u2082, $\u03c3\u2081, $\u03c3\u2082);\n\n<em>\/\/<\/em><em> Hedges' g<\/em>\nlist($\u03bc\u2081, $\u03c3\u2081, $n\u2081) = [6.7, 1.2, 15];\nlist($\u03bc\u2082, $\u03c3\u2082, $n\u2082) = [6, 1, 15];\n$g = EffectSize::hedgesG($\u03bc\u2081, $\u03bc\u2082, $\u03c3\u2081, $\u03c3\u2082, $n\u2081, $n\u2082);\n\n<em>\/\/<\/em><em> Glass' \u0394<\/em>\n$\u0394 = EffectSize::glassDelta($\u03bc\u2081, $\u03bc\u2082, $\u03c3\u2082);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader38\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Experiments<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Experiment;\n\n$a = 28;   \/\/ Exposed and event present\n$b = 129;  \/\/ Exposed and event absent\n$c = 4;    \/\/ Non-exposed and event present\n$d = 133;  \/\/ Non-exposed and event absent\n\n\/\/ Risk ratio (relative risk) - RR\n$RR = Experiment::riskRatio($a, $b, $c, $d);\n\/\/ ['RR' =&gt; 6.1083, 'ci_lower_bound' =&gt; 2.1976, 'ci_upper_bound' =&gt; 16.9784, 'p' =&gt; 0.0005]\n\n\/\/ Odds ratio (OR)\n$OR = Experiment::oddsRatio($a, $b, $c, $d);\n\/\/ ['OR' =&gt; 7.2171, 'ci_lower_bound' =&gt; 2.4624, 'ci_upper_bound' =&gt; 21.1522, 'p' =&gt; 0.0003]\n\n\/\/ Likelihood ratios (positive and negative)\n$LL = Experiment::likelihoodRatio($a, $b, $c, $d);\n\/\/ ['LL+' =&gt; 7.4444, 'LL-' =&gt; 0.3626]\n\n$sensitivity = 0.67;\n$specificity = 0.91;\n$LL          = Experiment::likelihoodRatioSS($sensitivity, $specificity);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader39\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Kernel Density Estimation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\KernelDensityEstimation\n\n$data = [-2.76, -1.09, -0.5, -0.15, 0.22, 0.69, 1.34, 1.75];\n$x    = 0.5;\n\n<em>\/\/<\/em><em> Density estimator with default bandwidth (normal distribution approximation) and kernel function (standard normal)<\/em>\n$kde     = new KernelDensityEstimation($data);\n$density = $kde-&gt;evaluate($x)\n\n<em>\/\/<\/em><em> Custom bandwidth<\/em>\n$h = 0.1;\n$kde-&gt;setBandwidth($h);\n\n<em>\/\/<\/em><em> Library of built-in kernel functions<\/em>\n$kde-&gt;setKernelFunction(KernelDensityEstimation::STANDARD_NORMAL);\n$kde-&gt;setKernelFunction(KernelDensityEstimation::NORMAL);\n$kde-&gt;setKernelFunction(KernelDensityEstimation::UNIFORM);\n$kde-&gt;setKernelFunction(KernelDensityEstimation::TRIANGULAR);\n$kde-&gt;setKernelFunction(KernelDensityEstimation::EPANECHNIKOV);\n$kde-&gt;setKernelFunction(KernelDensityEstimation::TRICUBE);\n\n<em>\/\/<\/em><em> Set custom kernel function (user-provided callable)<\/em>\n$kernel = function ($x) {\n  if (abs($x) &gt; 1) {\n      return 0;\n  } else {\n      return 70 \/ 81 * ((1 - abs($x) ** 3) ** 3);\n  }\n};\n$kde-&gt;setKernelFunction($kernel);\n\n<em>\/\/<\/em><em> All customization optionally can be done in the constructor<\/em>\n$kde = new KernelDesnsityEstimation($data, $h, $kernel);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader40\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Random Variables<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\RandomVariable;\n\n$X = [1, 2, 3, 4];\n$Y = [2, 3, 4, 5];\n\n<em>\/\/<\/em><em> Central moment (nth moment)<\/em>\n$second_central_moment = RandomVariable::centralMoment($X, 2);\n$third_central_moment  = RandomVariable::centralMoment($X, 3);\n\n<em>\/\/<\/em><em> Skewness (population and sample)<\/em>\n$skewness = RandomVariable::skewness($X);            <em>\/\/<\/em><em> general method of calculating skewness<\/em>\n$skewness = RandomVariable::populationSkewness($X);  <em>\/\/<\/em><em> similar to Excel's SKEW.P<\/em>\n$skewness = RandomVariable::sampleSkewness($X);      <em>\/\/<\/em><em> similar to Excel's SKEW<\/em>\n$SES      = RandomVariable::ses(count($X));          <em>\/\/<\/em><em> standard error of skewness<\/em>\n\n<em>\/\/<\/em><em> Kurtosis (excess)<\/em>\n$kurtosis    = RandomVariable::kurtosis($X);\n$platykurtic = RandomVariable::isPlatykurtic($X); <em>\/\/<\/em><em> true if kurtosis is less than zero<\/em>\n$leptokurtic = RandomVariable::isLeptokurtic($X); <em>\/\/<\/em><em> true if kurtosis is greater than zero<\/em>\n$mesokurtic  = RandomVariable::isMesokurtic($X);  <em>\/\/<\/em><em> true if kurtosis is zero<\/em>\n$SEK         = RandomVariable::sek(count($X));    <em>\/\/<\/em><em> standard error of kurtosis<\/em>\n\n<em>\/\/<\/em><em> Standard error of the mean (SEM)<\/em>\n$sem = RandomVariable::standardErrorOfTheMean($X); <em>\/\/<\/em><em> same as sem<\/em>\n$sem = RandomVariable::sem($X);                    <em>\/\/<\/em><em> same as standardErrorOfTheMean<\/em>\n\n<em>\/\/<\/em><em> Confidence interval<\/em>\n$\u03bc  = 90; <em>\/\/<\/em><em> sample mean<\/em>\n$n  = 9;  <em>\/\/<\/em><em> sample size<\/em>\n$\u03c3  = 36; <em>\/\/<\/em><em> standard deviation<\/em>\n$cl = 99; <em>\/\/<\/em><em> confidence level<\/em>\n$ci = RandomVariable::confidenceInterval($\u03bc, $n, $\u03c3, $cl); <em>\/\/<\/em><em> Array( [ci] =&gt; 30.91, [lower_bound] =&gt; 59.09, [upper_bound] =&gt; 120.91 )<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader41\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Regressions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Regression;\n\n$points = [[1,2], [2,3], [4,5], [5,7], [6,8]];\n\n<em>\/\/<\/em><em> Simple linear regression (least squares method)<\/em>\n$regression = new Regression\\Linear($points);\n$parameters = $regression-&gt;getParameters();          <em>\/\/<\/em><em> [m =&gt; 1.2209302325581, b =&gt; 0.6046511627907]<\/em>\n$equation   = $regression-&gt;getEquation();            <em>\/\/<\/em><em> y = 1.2209302325581x + 0.6046511627907<\/em>\n$y          = $regression-&gt;evaluate(5);              <em>\/\/<\/em><em> Evaluate for y at x = 5 using regression equation<\/em>\n$ci         = $regression-&gt;ci(5, 0.5);               <em>\/\/<\/em><em> Confidence interval for x = 5 with p-value of 0.5<\/em>\n$pi         = $regression-&gt;pi(5, 0.5);               <em>\/\/<\/em><em> Prediction interval for x = 5 with p-value of 0.5; Optional number of trials parameter.<\/em>\n$\u0176          = $regression-&gt;yHat();\n$r          = $regression-&gt;r();                      <em>\/\/<\/em><em> same as correlationCoefficient<\/em>\n$r\u00b2         = $regression-&gt;r2();                     <em>\/\/<\/em><em> same as coefficientOfDetermination<\/em>\n$se         = $regression-&gt;standardErrors();         <em>\/\/<\/em><em> [m =&gt; se(m), b =&gt; se(b)]<\/em>\n$t          = $regression-&gt;tValues();                <em>\/\/<\/em><em> [m =&gt; t, b =&gt; t]<\/em>\n$p          = $regression-&gt;tProbability();           <em>\/\/<\/em><em> [m =&gt; p, b =&gt; p]<\/em>\n$F          = $regression-&gt;fStatistic();\n$p          = $regression-&gt;fProbability();\n$h          = $regression-&gt;leverages();\n$e          = $regression-&gt;residuals();\n$D          = $regression-&gt;cooksD();\n$DFFITS     = $regression-&gt;dffits();\n$SStot      = $regression-&gt;sumOfSquaresTotal();\n$SSreg      = $regression-&gt;sumOfSquaresRegression();\n$SSres      = $regression-&gt;sumOfSquaresResidual();\n$MSR        = $regression-&gt;meanSquareRegression();\n$MSE        = $regression-&gt;meanSquareResidual();\n$MSTO       = $regression-&gt;meanSquareTotal();\n$error      = $regression-&gt;errorSd();                <em>\/\/<\/em><em> Standard error of the residuals<\/em>\n$V          = $regression-&gt;regressionVariance();\n$n          = $regression-&gt;getSampleSize();          <em>\/\/<\/em><em> 5<\/em>\n$points     = $regression-&gt;getPoints();              <em>\/\/<\/em><em> [[1,2], [2,3], [4,5], [5,7], [6,8]]<\/em>\n$xs         = $regression-&gt;getXs();                  <em>\/\/<\/em><em> [1, 2, 4, 5, 6]<\/em>\n$ys         = $regression-&gt;getYs();                  <em>\/\/<\/em><em> [2, 3, 5, 7, 8]<\/em>\n$\u03bd          = $regression-&gt;degreesOfFreedom();\n\n<em>\/\/<\/em><em> Linear regression through a fixed point (least squares method)<\/em>\n$force_point = [0,0];\n$regression  = new Regression\\LinearThroughPoint($points, $force_point);\n$parameters  = $regression-&gt;getParameters();\n$equation    = $regression-&gt;getEquation();\n$y           = $regression-&gt;evaluate(5);\n$\u0176           = $regression-&gt;yHat();\n$r           = $regression-&gt;r();\n$r\u00b2          = $regression-&gt;r2();\n \u22ee                     \u22ee\n\n<em>\/\/<\/em><em> Theil\u2013Sen estimator (Sen's slope estimator, Kendall\u2013Theil robust line)<\/em>\n$regression  = new Regression\\TheilSen($points);\n$parameters  = $regression-&gt;getParameters();\n$equation    = $regression-&gt;getEquation();\n$y           = $regression-&gt;evaluate(5);\n \u22ee                     \u22ee\n\n<em>\/\/<\/em><em> Use Lineweaver-Burk linearization to fit data to the Michaelis\u2013Menten model: y = (V * x) \/ (K + x)<\/em>\n$regression  = new Regression\\LineweaverBurk($points);\n$parameters  = $regression-&gt;getParameters();  <em>\/\/<\/em><em> [V, K]<\/em>\n$equation    = $regression-&gt;getEquation();    <em>\/\/<\/em><em> y = Vx \/ (K + x)<\/em>\n$y           = $regression-&gt;evaluate(5);\n \u22ee                     \u22ee\n\n<em>\/\/<\/em><em> Use Hanes-Woolf linearization to fit data to the Michaelis\u2013Menten model: y = (V * x) \/ (K + x)<\/em>\n$regression  = new Regression\\HanesWoolf($points);\n$parameters  = $regression-&gt;getParameters();  <em>\/\/<\/em><em> [V, K]<\/em>\n$equation    = $regression-&gt;getEquation();    <em>\/\/<\/em><em> y = Vx \/ (K + x)<\/em>\n$y           = $regression-&gt;evaluate(5);\n \u22ee                     \u22ee\n\n<em>\/\/<\/em><em> Power law regression - power curve (least squares fitting)<\/em>\n$regression = new Regression\\PowerLaw($points);\n$parameters = $regression-&gt;getParameters();   <em>\/\/<\/em><em> [a =&gt; 56.483375436574, b =&gt; 0.26415375648621]<\/em>\n$equation   = $regression-&gt;getEquation();     <em>\/\/<\/em><em> y = 56.483375436574x^0.26415375648621<\/em>\n$y          = $regression-&gt;evaluate(5);\n \u22ee                     \u22ee\n\n<em>\/\/<\/em><em> LOESS - Locally Weighted Scatterplot Smoothing (Local regression)<\/em>\n$\u03b1          = 1\/3;                         <em>\/\/<\/em><em> Smoothness parameter<\/em>\n$\u03bb          = 1;                           <em>\/\/<\/em><em> Order of the polynomial fit<\/em>\n$regression = new Regression\\LOESS($points, $\u03b1, $\u03bb);\n$y          = $regression-&gt;evaluate(5);\n$\u0176          = $regression-&gt;yHat();\n \u22ee                     \u22ee<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader42\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Statistics &#8211; Significance Testing<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Statistics\\Significance;\n\n<em>\/\/<\/em><em> Z test - One sample (z and p values)<\/em>\n$H\u2090 = 20;   <em>\/\/<\/em><em> Alternate hypothesis (M Sample mean)<\/em>\n$n  = 200;  <em>\/\/<\/em><em> Sample size<\/em>\n$H\u2080 = 19.2; <em>\/\/<\/em><em> Null hypothesis (\u03bc Population mean)<\/em>\n$\u03c3  = 6;    <em>\/\/<\/em><em> SD of population (Standard error of the mean)<\/em>\n$z  = Significance:zTest($H\u2090, $n, $H\u2080, $\u03c3);           <em>\/\/<\/em><em> Same as zTestOneSample<\/em>\n$z  = Significance:zTestOneSample($H\u2090, $n, $H\u2080, $\u03c3);  <em>\/\/<\/em><em> Same as zTest<\/em>\n<em>\/*<\/em><em> [<\/em><em>\n<\/em><em> 'z' =&gt; 1.88562, \/\/ Z score<\/em><em>\n<\/em><em> 'p1' =&gt; 0.02938, \/\/ one-tailed p value<\/em><em>\n<\/em><em> 'p2' =&gt; 0.0593, \/\/ two-tailed p value<\/em><em>\n<\/em><em>] <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Z test - Two samples (z and p values)<\/em>\n$\u03bc\u2081 = 27;   <em>\/\/<\/em><em> Sample mean of population 1<\/em>\n$\u03bc\u2082 = 33;   <em>\/\/<\/em><em> Sample mean of population 2<\/em>\n$n\u2081 = 75;   <em>\/\/<\/em><em> Sample size of population 1<\/em>\n$n\u2082 = 50;   <em>\/\/<\/em><em> Sample size of population 2<\/em>\n$\u03c3\u2081 = 14.1; <em>\/\/<\/em><em> Standard deviation of sample mean 1<\/em>\n$\u03c3\u2082 = 9.5;  <em>\/\/<\/em><em> Standard deviation of sample mean 2<\/em>\n$z  = Significance::zTestTwoSample($\u03bc\u2081, $\u03bc\u2082, $n\u2081, $n\u2082, $\u03c3\u2081, $\u03c3\u2082);\n<em>\/*<\/em><em> [<\/em><em>\n<\/em><em> 'z' =&gt; -2.36868418147285, \/\/ z score<\/em><em>\n<\/em><em> 'p1' =&gt; 0.00893, \/\/ one-tailed p value<\/em><em>\n<\/em><em> 'p2' =&gt; 0.0179, \/\/ two-tailed p value<\/em><em>\n<\/em><em>] <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> Z score<\/em>\n$M = 8; <em>\/\/<\/em><em> Sample mean<\/em>\n$\u03bc = 7; <em>\/\/<\/em><em> Population mean<\/em>\n$\u03c3 = 1; <em>\/\/<\/em><em> Population SD<\/em>\n$z = Significance::zScore($M, $\u03bc, $\u03c3);\n\n<em>\/\/<\/em><em> T test - One sample (from sample data)<\/em>\n$a     = [3, 4, 4, 5, 5, 5, 6, 6, 7, 8]; <em>\/\/<\/em><em> Data set<\/em>\n$H\u2080    = 300;                            <em>\/\/<\/em><em> Null hypothesis (\u03bc\u2080 Population mean)<\/em>\n$tTest = Significance::tTest($a, $H\u2080)\nprint_r($tTest);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [t] =&gt; 0.42320736951516 \/\/ t score<\/em><em>\n<\/em><em> [df] =&gt; 9 \/\/ degrees of freedom<\/em><em>\n<\/em><em> [p1] =&gt; 0.34103867713806 \/\/ one-tailed p value<\/em><em>\n<\/em><em> [p2] =&gt; 0.68207735427613 \/\/ two-tailed p value<\/em><em>\n<\/em><em> [mean] =&gt; 5.3 \/\/ sample mean<\/em><em>\n<\/em><em> [sd] =&gt; 1.4944341180973 \/\/ standard deviation<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> T test - One sample (from summary data)<\/em>\n$H\u2090    = 280; <em>\/\/<\/em><em> Alternate hypothesis (M Sample mean)<\/em>\n$s     = 50;  <em>\/\/<\/em><em> Standard deviation of sample<\/em>\n$n     = 15;  <em>\/\/<\/em><em> Sample size<\/em>\n$H\u2080    = 300; <em>\/\/<\/em><em> Null hypothesis (\u03bc\u2080 Population mean)<\/em>\n$tTest = Significance::tTestOneSampleFromSummaryData($H\u2090, $s, $n, $H\u2080);\nprint_r($tTest);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [t] =&gt; -1.549193338483 \/\/ t score<\/em><em>\n<\/em><em> [df] =&gt; 14 \/\/ degreees of freedom<\/em><em>\n<\/em><em> [p1] =&gt; 0.071820000122611 \/\/ one-tailed p value<\/em><em>\n<\/em><em> [p2] =&gt; 0.14364000024522 \/\/ two-tailed p value<\/em><em>\n<\/em><em> [mean] =&gt; 280 \/\/ sample mean<\/em><em>\n<\/em><em> [sd] =&gt; 50 \/\/ standard deviation<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> T test - Two samples (from sample data)<\/em>\n$x\u2081    = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4];\n$x\u2082    = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4];\n$tTest = Significance::tTest($x\u2081, $x\u2082);\nprint_r($tTest);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [t] =&gt; -2.4553600286929 \/\/ t score<\/em><em>\n<\/em><em> [df] =&gt; 24.988527070145 \/\/ degrees of freedom<\/em><em>\n<\/em><em> [p1] =&gt; 0.010688914613979 \/\/ one-tailed p value<\/em><em>\n<\/em><em> [p2] =&gt; 0.021377829227958 \/\/ two-tailed p value<\/em><em>\n<\/em><em> [mean1] =&gt; 20.82 \/\/ mean of sample x\u2081<\/em><em>\n<\/em><em> [mean2] =&gt; 22.98667 \/\/ mean of sample x\u2082<\/em><em>\n<\/em><em> [sd1] =&gt; 2.804894 \/\/ standard deviation of x\u2081<\/em><em>\n<\/em><em> [sd2] =&gt; 1.952605 \/\/ standard deviation of x\u2082<\/em><em>\n<\/em><em>) <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> T test - Two samples (from summary data)<\/em>\n$\u03bc\u2081    = 42.14; <em>\/\/<\/em><em> Sample mean of population 1<\/em>\n$\u03bc\u2082    = 43.23; <em>\/\/<\/em><em> Sample mean of population 2<\/em>\n$n\u2081    = 10;    <em>\/\/<\/em><em> Sample size of population 1<\/em>\n$n\u2082    = 10;    <em>\/\/<\/em><em> Sample size of population 2<\/em>\n$\u03c3\u2081    = 0.683; <em>\/\/<\/em><em> Standard deviation of sample mean 1<\/em>\n$\u03c3\u2082    = 0.750; <em>\/\/<\/em><em> Standard deviation of sample mean 2<\/em>\n$tTest = Significance::tTestTwoSampleFromSummaryData($\u03bc\u2081, $\u03bc\u2082, $n\u2081, $n\u2082, $\u03c3\u2081, $\u03c3\u2082);\nprint_r($tTest);\n<em>\/*<\/em><em> Array (<\/em><em>\n<\/em><em> [t] =&gt; -3.3972305988708 \/\/ t score<\/em><em>\n<\/em><em> [df] =&gt; 17.847298548027 \/\/ degrees of freedom<\/em><em>\n<\/em><em> [p1] =&gt; 0.0016211251126198 \/\/ one-tailed p value<\/em><em>\n<\/em><em> [p2] =&gt; 0.0032422502252396 \/\/ two-tailed p value<\/em><em>\n<\/em><em> [mean1] =&gt; 42.14<\/em><em>\n<\/em><em> [mean2] =&gt; 43.23<\/em><em>\n<\/em><em> [sd1] =&gt; 0.6834553<\/em><em>\n<\/em><em> [sd2] =&gt; 0.7498889<\/em><em>\n<\/em><em>] <\/em><em>*\/<\/em>\n\n<em>\/\/<\/em><em> T score<\/em>\n$H\u2090 = 280; <em>\/\/<\/em><em> Alternate hypothesis (M Sample mean)<\/em>\n$s  = 50;  <em>\/\/<\/em><em> SD of sample<\/em>\n$n  = 15;  <em>\/\/<\/em><em> Sample size<\/em>\n$H\u2080 = 300; <em>\/\/<\/em><em> Null hypothesis (\u03bc\u2080 Population mean)<\/em>\n$t  = Significance::tScore($H\u2090, $s, $n, $H);\n\n<em>\/\/<\/em><em> \u03c7\u00b2 test (chi-squared goodness of fit test)<\/em>\n$observed = [4, 6, 17, 16, 8, 9];\n$expected = [10, 10, 10, 10, 10, 10];\n$\u03c7\u00b2       = Significance::chiSquaredTest($observed, $expected);\n<em>\/\/<\/em><em> ['chi-square' =&gt; 14.2, 'p' =&gt; 0.014388]<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"articleHeader43\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Trigonometry<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">use MathPHP\\Trigonometry;\n\n$n      = 9;\n$points = Trigonometry::unitCircle($n); <em>\/\/<\/em><em> Produce n number of points along the unit circle<\/em><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader44\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Unit Tests<\/h2>\n\n\n\n<p>Beyond 100\n\n\n\n<p>MathPHP has thousands of unit tests testing individual functions directly with numerous data inputs to achieve 100\n\n\n\n<pre class=\"wp-block-preformatted\">$ cd tests\n$ phpunit<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"javascript:void()\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572\" alt=\"Coverage Status\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"javascript:void()\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/b9c2b9b5269306206dd9c141cc0007b8a94dc873\/68747470733a2f2f7472617669732d63692e6f72672f6d61726b726f676f79736b692f6d6174682d7068702e7376673f6272616e63683d6d6173746572\" alt=\"Build Status\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader45\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>Standards<\/h2>\n\n\n\n<p>MathPHP conforms to the following standards:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>PSR-1 &#8211; Basic coding standard (<a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">http:\/\/www.php-fig.org\/psr\/psr-1\/<\/a>)<\/li><li>PSR-2 &#8211; Coding style guide (<a href=\"javascript:void()\" rel=\"noreferrer noopener\" target=\"_blank\">http:\/\/www.php-fig.org\/psr\/psr-2\/<\/a>)<\/li><li>PSR-4 &#8211; Autoloader (<a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\">http:\/\/www.php-fig.org\/psr\/psr-4\/<\/a>)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"articleHeader46\"><a href=\"javascript:void();\" rel=\"noreferrer noopener\" target=\"_blank\"><\/a>License<\/h2>\n\n\n\n<p>MathPHP is licensed under the MIT License.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Powerful Modern Math Library for PHP MathPHP is the only library you need to integrate mathematical functions into your applications. It is a self-contained library in pure PHP with no external dependencies. It is actively under development with development (0.y.z) releases. Features [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,27],"tags":[],"class_list":["post-389","post","type-post","status-publish","format-standard","hentry","category-composer","category-27"],"_links":{"self":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/comments?post=389"}],"version-history":[{"count":0,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/389\/revisions"}],"wp:attachment":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/media?parent=389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/categories?post=389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/tags?post=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}