binom($n, $k); } public static function getProvider(): BinomialProvider { if (self::$provider === null) { self::$provider = self::initProvider(); } return self::$provider; } /** * @return string[] */ public static function getUsableProviderClasses(): array { // In order of priority. The first provider with a value of true will be used. $possibleProviderClasses = [ BinomialProviderPhp73Gmp::class => function_exists('gmp_binomial'), BinomialProviderInt64::class => PHP_INT_SIZE >= 8, BinomialProviderFloat64::class => PHP_FLOAT_DIG >= 15, ]; $possibleProviderClasses = array_filter($possibleProviderClasses); return array_keys($possibleProviderClasses); } private static function initProvider(): BinomialProvider { $providerClasses = self::getUsableProviderClasses(); if (!$providerClasses) { throw new \LogicException("No valid providers"); } $bestProviderClass = reset($providerClasses); return new $bestProviderClass(); } }