LoginSignup
6
5

More than 5 years have passed since last update.

PHP5.6.0α PHPで累乗根を求める

Last updated at Posted at 2014-03-21

PHPには立方根など累乗根(冪根)を求める関数がありませんでした。

自作関数がStackOverflowにありましたが、わりとめんどいです。
というかこのNRoot()、NRoot('64','3')に'3'、NRoot('65','3')に'4'、NRoot('66','3')に'5'を返してくるんだがこれ合ってるのか?

PHP5.6では、このような怪しい自作関数に頼る必要はありません。

23 Jan 2014, PHP 5.6.0 Alpha 1
Added gmp_root() and gmp_rootrem() functions for calculating nth roots.

<?php
    gmp_root('63', '3'), // 3
    gmp_root('64', '3'), // 4
    gmp_root('65', '3'), // 4
    gmp_rootrem('63', '3'), // 3あまり36
    gmp_rootrem('64', '3'), // 4あまり0
    gmp_rootrem('65', '3')  // 4あまり1

便利。
まあ累乗根なんていつ使うんだよという話ですが。
あとあくまで整数部分だけを返してくる関数なので、小数点以下まで求めたい場合はいったん1000を掛けてから計算してやる必要があります。

ところで、GMP演算の返り値はGMPオブジェクトです。
これまでGMPリソースを扱う場合は、ただの足し算でも
$c = gmp_add($a, $b);
などと書く必要がありました。

PHP5.6ではGMPの演算子オーバーロードもサポートされました。

<?php
    gmp_init(1) + 2; // GMP(3)
    gmp_init(1) + '1234567890123456789012345678901234567890'; // GMP(123456789012345678901234567891)
    1 + '1234567890123456789012345678901234567890'; // float(1.2345678901235E+29)

GMPオブジェクトに対して演算を行った場合、GMPとして透過的に取り扱ってくれます。
これでもうgmp_add(gmp_add(gmp_add(gmp_add(gmp_init(1), 2), 3), 4), 5);なんて書かずにすみます。

もうひとつ数学関連の機能追加がありました。

13 Feb 2014, PHP 5.6.0 Alpha 2
Added T_POW (**) operator

<?php
    print(5 ** 3); // 125
    2 ** 3 ** 4;    // float(2.4178516392293E+24)
    gmp_init(2) ** 3 ** 4; // GMP(2417851639229258349412352)

累乗演算子が追加になった模様。
こちらはpow()やgmp_pow()があるのであまり恩恵はない気もしますが、上記演算子オーバーロードと合わせるとその威力は歴然。

マニュアルの演算子の項目にはまだ載っていません。
優先順位は「*/%」のひとつ上で、かなり優先度高めでした。

これでPHPでも実用的な数学計算が行えますね。
まあそういうのはFORTRANやMATLABとかに任せとけよって話ですが。

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5