{"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":"http:\/\/blog.yuekegu.com\/?p=389","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><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><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% interest paid at the end of every month<\/em>\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% interest<\/em>\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% financing<\/em>\n$reinvestment_rate = 0.10; <em>\/\/<\/em><em> reinvested at 10%<\/em>\n$mirr              = Finance:mirr($values, $finance_rate); <em>\/\/<\/em><em> rate of return of an initial investment of $100 at 5% financing with returns of $50, $40, and $30 reinvested at 10%<\/em>\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% discount rate<\/em><\/pre>\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% =&gt; 13, Q1 =&gt; 13, Q2 =&gt; 14, Q3 =&gt; 17, 100% =&gt; 21, IQR =&gt; 4]<\/em>\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%] =&gt; 13<\/em><em>\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%] =&gt; 21<\/em><em>\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% code coverage!<\/p>\n\n\n\n<p>MathPHP has thousands of unit tests testing individual functions directly with numerous data inputs to achieve 100% test coverage. MathPHP unit tests also test mathematical axioms which indirectly test the same functions in multiple different ways ensuring that those math properties all work out according to the axioms.<\/p>\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><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","raw":"","protected":false},"excerpt":{"rendered":"<p>Powerful Modern Math Library for PHP MathPHP is the onl &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.yuekegu.com\/?p=389\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cMathPHP\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,17],"tags":[],"post_thumbnail_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","content_first_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_medium_image_300":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_thumbnail_image_624":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_frist_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_medium_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_large_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_full_image":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","post_all_images":[{"imagesurl":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","id":"image0"},{"imagesurl":"https:\/\/camo.githubusercontent.com\/b9c2b9b5269306206dd9c141cc0007b8a94dc873\/68747470733a2f2f7472617669732d63692e6f72672f6d61726b726f676f79736b692f6d6174682d7068702e7376673f6272616e63683d6d6173746572","id":"image1"},{"imagesurl":"https:\/\/camo.githubusercontent.com\/bfd92477d451076d69ba5e8ff23eb30128cac54c\/68747470733a2f2f706f7365722e707567782e6f72672f6d61726b726f676f79736b692f6d6174682d7068702f6c6963656e7365","id":"image2"},{"imagesurl":"https:\/\/camo.githubusercontent.com\/e7d729e59a3931cc20635a7f52a004385000c97a\/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d61726b726f676f79736b692f6d6174682d7068702f62616467652e7376673f6272616e63683d6d6173746572","id":"image3"},{"imagesurl":"https:\/\/camo.githubusercontent.com\/b9c2b9b5269306206dd9c141cc0007b8a94dc873\/68747470733a2f2f7472617669732d63692e6f72672f6d61726b726f676f79736b692f6d6174682d7068702e7376673f6272616e63683d6d6173746572","id":"image4"}],"videoAdId":"","listAd":"0","listAdId":"","listAdEvery":5,"total_comments":0,"category_name":"Composer","post_date":"2022-04-13","like_count":"0","praiseWord":"\u9f13\u52b1","copyright_state":"","excitationAd":"0","rewardedVideoAdId":"","detailAdId":"","detailAd":"0","enterpriseMinapp":"0","audios":[],"postImageUrl":false,"avatarurls":[],"related_posts":null,"pageviews":1300,"next_post_id":392,"next_post_title":"window \u5b89\u88c5composer (package not found)","previous_post_id":387,"previous_post_title":"EasyTask\u7b80\u5355\u6613\u7528\u7684PHP\u5e38\u9a7b\u5185\u5b58\u5b9a\u65f6\u5668","_links":{"self":[{"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/posts\/389"}],"collection":[{"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=389"}],"version-history":[{"count":1,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/posts\/389\/revisions"}],"predecessor-version":[{"id":390,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=\/wp\/v2\/posts\/389\/revisions\/390"}],"wp:attachment":[{"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=389"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.yuekegu.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}