RSS

C#で(数学的・集合論的な)集合演算

C# 3.0の集合演算は数学的な計算には向いていない.例えば,

string[] x = new[] { "A", "B", "C" };
string[] y = new[] { "A", "B", "D"};

としたとき,この積集合を X.Intersect(Y) から求めると,

"A", "B"

となる.それぞれの積集合は空集合(AB = φというわけ)になり,数学的にはまったく使えない(和集合も同様).これを集合演算というのかは怪しいけど,SQL的なLINQだから仕方ないのかね.Maximaの数式処理を噛ましてやろうかと思っても見あたらない.他に数学的なものがあるかもしれないけど,コーディング熱が上がってきたので,数学的な集合演算コードを自作した.

C#の(数学的・集合論的な)集合演算コード(簡易版)
(興味ある人はどうぞ,C#を始めて2週間なのでコードは汚い)

演算子のオーバーロードをすれば良かったんだけど,ぺーペーなので,メソッドでお腹いっぱい.calcProductSet(x, y) のようにメソッドを呼べば,その積x*yが戻り値になります.和集合も同じ感じて,吸収則がバシバシ動いているので,きれいな集合になると思います.

ただ,このバーションは,何も考えずに作ってしまったから,集合は一文字しか対応してないという問題作.集合"abc"はa*b*cのように積集合に扱われます.まぁ,後からちゃんと文字列を集合名(例えば,"A_is_1"とか"B_is_0"とかがそれぞれ一つの集合として扱われる)にした修正ヴァージョンを作り直したんだけど,コードがゴチャゴチャになったので公開は未定.コードは汚くなったけど,ちゃんと他のプログラムに埋め込んでちゃんと動きましたよ!

Bookmark and Share

0 コメント: