PHPで分数を単純化するにはどうすればよいですか?
たとえば、 に変換40/100
し2/5
ます。
私が考えることができる唯一の方法は、両方の数値で素因数分解を行い、同様の結果を比較することですが、それを行う方法もよくわかりません。
PHPで分数を単純化するにはどうすればよいですか?
たとえば、 に変換40/100
し2/5
ます。
私が考えることができる唯一の方法は、両方の数値で素因数分解を行い、同様の結果を比較することですが、それを行う方法もよくわかりません。
分数を整理するときは、分子と分母をそれらの最大公約数で割ります。
したがって、必要なのは 2 つの数値の GCD を計算することだけです。そのための組み込み関数はありませんが、ユークリッド アルゴリズムを実装するのは簡単です。
function gcd($a,$b) {
$a = abs($a); $b = abs($b);
if( $a < $b) list($b,$a) = Array($a,$b);
if( $b == 0) return $a;
$r = $a % $b;
while($r > 0) {
$a = $b;
$b = $r;
$r = $a % $b;
}
return $b;
}
あとはそれで上と下を割ります。
function simplify($num,$den) {
$g = gcd($num,$den);
return Array($num/$g,$den/$g);
}
var_export(simplify(40,100)); // Array(2,5)
PHPgmp
拡張機能があれば、これを行うことができます。
$num = 40;
$den = 100;
$gcd = gmp_intval(gmp_gcd((string)$num, (string)$den));
$new_num = $num / $gcd;
$new_den = $den / $gcd;
これは単純な再帰的な PHP 関数です。
<?php
function reduceFraction($numerator, $denominator)
{
$gcd = findGreatestCommonDenominator($numerator, $denominator);
return [$numerator / $gcd, $denominator / $gcd];
}
function findGreatestCommonDenominator($a, $b)
{
return $b ? findGreatestCommonDenominator($b, $a % $b) : $a;
}
}
利用方法 :
<?php $reduced = reduceFraction(40,100); // returns [2,5] ?>
アルゴリズムは非常に単純です。