Location : Home > Languages > Perl > Package
Title : Math::Sequence
Toolbox Logo

名称

 Math::Sequence - 数列の処理


概要

use Math::Sequence;
my $x_n = Math::Sequence->new('x^2 - 1', 2);
print $x_n->next(), "\n" foreach 0..9;
# 2, 3, 8, 63... を出力

print $x_n->at_index(5);
# 15745023 を出力

$x_n->cached(0); # 結果をキャッシュしない(遅い!)
$x_n->cached(1); # 結果をキャッシュする(デフォルト)

説明

 Math::Sequence は x_(n+1) = 1 / (x_n + 1) のような数列の再帰的定義を行うためのクラスを定義する。Math::Sequence オブジェクトの生成については後述するコンストラクタに関するパラグラフに示す。
 Math::Sequence は数列の再帰的定義をパースし修正するために Math::Symbolic を利用する。このことは数列を Math::Symbolic でパースできる文字列として扱うことを意味する。またはコンストラクタを Math::Symbolic ツリーに直接通過させることもできる。
 Math::Sequence は実装のために Math::Symbolic を利用しているので、あらゆる結果は数列を示す変数以外の変数も含む Math::Symbolic オブジェクトとなる。
 それぞれの Math::Sequence オブジェクトは最初の要素から始まる数列の要素全体に繰り返すための反復子(iterator)である(最初の要素により指定され、第2引数は new() コンストラクタに渡される)。計算済みの要素を全てキャッシュし、任意の要素に直接アクセスできる機能も実装している。以前の計算で要素がキャッシュされていなければ、反復子の繰り返し利用のためのショートカットとなる。
 数列の任意の要素は直前のものからのみアクセスでき、それ以前の要素からはアクセスできない。

使用例

use strict;
use warnings;
use Math::Sequence;

my $seq = Math::Sequence->new('x+a', 0, 'x');
print($seq->current_index(), ' => ', $seq->next(), "\n") for 1..10;

クラスデータ

 Math::Sequence は以下のパッケージ変数を取る。

$Math::Sequence::Parser

 このスカラは式をパースするために Parse::RecDescent パーサを含む。これはt is derived from the Math::Symbolic::Parser 文法からの派生である。

$Math::Sequence::warnings

 このスカラは Math::Sequence がキャッシュをしていない数列において back() メソッドを利用しようとした際に警告を発すべきか否かを指定する。 デフォルト値は True である。

メソッド

new()

 Math::Sequence オブジェクトのコンストラクタである。2または3の引数を取る。
 2つの引数をとる場合、第1引数は再帰的定義である。Math::Symbolic パーサまたは Math::Symbolic ツリーによりパースされる文字列でなければならない。再帰変数(先行変数により再帰的に置換される変数)は関数の仕様により推定される。このため式には正確にただ1つの変数しか含まれてはならない。第2引数は初期値でなければならない。定数または Math::Symbolic ツリーまたはパースされる文字列であればよい。
 3つの変数をとる場合、2つの変数をとる場合に加えて再帰変数として利用される変数名を示す文字列を引数としてとる。そのため式に含まれる変数の数はいくらでもよい。

next()

 The next() メソッドは数列の次の要素を返し、反復子を1つ進める。これは数列の反復を順に進める方法である。

cached()

 数列が現在キャッシュされていれば True を返し、そうでなければ False を返す。デフォルトでは新規オブジェクトはキャッシュ可能な状態である。スペースが問題で、数列を順に1回だけ確認できればよいという場合にのみ勧められる。
 cached() はキャッシュ行動の変更にも用いられる。第1引数が True であればキャッシュを可能にする。もし False が指定された場合にはキャッシュは不可となる。

current_index()

 現在の要素のインデクスを返す。すなわち next() メソッドに次の呼び出しを行う際に返される要素のインデクスである。
 本メソッドは next() メソッドに次の呼び出しを行う際の(再)設定にも利用される。その場合、第1引数は適切なインデクスである。
 引数が非正であれば undef を返し、インデクスを設定しない。

at_index()

 本メソッドは、メソッドに第1引数により指定された数列の要素を返す。反復子の状態は変化しない。
 本メソッドはキャッシュをしていない場合、極めて挙動が遅い。
 インデクスが 非正である場合 undef を返す。

back()

 本メソッドは next() メソッドにより以前返された数列の要素を返す。キャッシュをしていないと非常に遅くなるため、デフォルトでは警告を出すようにしている。このメッセージをオフに切り替えるには set the $Math::Sequence::warnings スカラを False に設定変更する。
 本メソッドは反復子を1つずつ減らす。
 インデクスが 非正である場合 undef を返す。


著者

 Steffen Mueller, <sequence-module at steffen-mueller dot net>


参考資料

 Math::Sequence で扱うことのできる式は Math::Symbolic 及び Math::Symbolic::Parser で処理できるものである。

Toolbox Logo
Updated : 2006/11/15