PEAR::Math_Complexを使ってみた。
以前、PEARのパッケージリストで気になったものをリストアップしていたのだが、なんとなく暇だったのでリストを消費しようと思う。まずは、PEAR::Math_Complex。複素数を扱うライブラリだ。日本語限定でググったら、PEARマニュアルのコピーサイト以外出てこない。なんというマイナーライブラリ。
さて、実際の使用方法だが、やることは単純なので、ソースコードとその結果を見比べてもらったほうが早い。
PHP:
-
require_once('Math/Complex.php');
-
require_once('Math/ComplexOp.php');
-
-
/**
-
* 素数を作成する
-
*/
-
$a1 = 4;
-
$b1 = 3;
-
$z1 = new Math_Complex($a1, $b1);
-
-
/**
-
* 簡単な文字列として表示する
-
*/
-
echo "toString() : ", $z1->toString(), "<br />\n";
-
-
/**
-
* 実数部を返す
-
*/
-
echo "getReal() : ", $z1->getReal(), "<br />\n";
-
-
/**
-
* 虚数部を返す
-
*/
-
echo "getIm() : ", $z1->getIm(), "<br />\n";
-
-
/**
-
* 絶対値を返す
-
*/
-
echo "abs() : ", $z1->abs(), "<br />\n";
-
-
/**
-
* 絶対値の2乗を返す
-
*/
-
echo "abs2() : ", $z1->abs2(), "<br />\n";
-
-
/**
-
* 偏角を返す
-
*/
-
echo "arg() / angle() : ", $z1->arg(), "ラジアン<br />\n";
-
-
/**
-
* 共役複素数
-
*/
-
$z2 = Math_ComplexOp::conjugate($z1);
-
echo "conjugate() : ", $z2->toString(), "<br />\n";
-
-
/**
-
* 負の数
-
*/
-
$z2 = Math_ComplexOp::negative($z1);
-
echo "negative() : ", $z2->toString(), "<br />\n";
でその結果が、
CODE:
-
toString() : 4 + 3i
-
getReal() : 4
-
getIm() : 3
-
abs() : 5
-
abs2() : 25
-
arg() / angle() : 0.643501108793ラジアン
-
arg() / angle() : 36.8698976458度
-
-
Notice: Only variable references should be returned by reference in ???\pear\Math\ComplexOp.php on line 206
-
conjugate() : 4 - 3i
-
-
Notice: Only variable references should be returned by reference in ???\pear\Math\ComplexOp.php on line 223
-
negative() : -4 - 3i
ちなみに、phpのバージョンは5.2.0、xampp on Windowsで実行しています。T_NOTICE吐き出されてしまいました。このエラーはMojavi 2やXOOPSを使っていた人には懐かしい参照系のエラーです。ComplexOp.phpを見てみると、return new Math_Complex()がいたるところに(というか全関数に?)存在していました。
■実際のソースコードの一部
PHP:
-
function &conjugate (&$c1)
-
{
-
if (!Math_ComplexOp::isComplex($c1))
-
return PEAR::raiseError('argument is not a PEAR::Math_Complex object');
-
return new Math_Complex($c1->getReal(), -1 * $c1->getIm());
-
}
■修正例
PHP:
-
function &conjugate (&$c1)
-
{
-
if (!Math_ComplexOp::isComplex($c1))
-
return PEAR::raiseError('argument is not a PEAR::Math_Complex object');
-
$c2 =& new Math_Complex($c1->getReal(), -1 * $c1->getIm());
-
return $c2;
-
}
ということで、結論。Math_Complexは、複素数を作るだけなら簡単。計算をしようとすると、E_NOTICEが出るので、自分でライブラリ書き換える必要がある。でした。
ちなみに・・・PEAR::Math_Matrixも試そうとしたのですが、PHPUnitのVer0.6.2以前が必要とか・・・既にVer1.3.2が入ってるので諦めました。