Aggregate

Aggregateは汎用性のあるメソッドで、これを利用すれば、 通常の数列の和や積の計算はもちろん、連分数や多重平方根の計算まで可能である。 maximaでいえば「lreduce」とほぼ同じ機能のメソッドで、 一般的には「fold left」とよばれる概念。

さらに数列に限らず、様々なデータ型の列、例えば、文字列の列に関しても利用できる。

利用方法

あるデータ型Dの列 sequence={A1,A2,A3} と データ型Dを値としてとる2変数関数$f(x,y)$があった時

sequence.Aggregate(f)

は f(f(A1,A2),A3) となる。

sequence ={A1,A2,A3,A4} であれば

f(f(f(A1,A2),A3),A4)

となる。一般的にsequenceの長さに特に制限はない。

例1

var r = Enumerable.Range(1, 3).Aggregate((x, y) => x + y);
Console.WriteLine(r);

実行結果.

6

解説

最初 \[1+2 =3\] を行い、次にこの結果$3$を用いて \[3+3=6\] を行う。

例2

var z = new string[] { "a", "b", "c" }.Aggregate((x, y) => x + y);
Console.WriteLine(z);

実行結果.

abc

解説

最初、文字列として
"a+"b" = "ab"
を行い、次にこの結果"ab"を用いて
"ab"+"c" = "abc"
を行う。

例3

var w = Enumerable.Range(1, 3).Aggregate((x, y) => (1+x)*y);
Console.WriteLine(w);

実行結果.

15

解説

最初、 \[ a:=(1+1)\times 2 \] を行い、次にこの結果を用いて \[ (1+a)\times 3 \] を行う。これらの計算をあわせると \[ (1+(1+1)\times 2)\times 3 \] という計算していることになる。

連分数の計算

var cf = Enumerable.Range(1,3).Select(x => x + 0.0).Aggregate((x, y) => 1.0 / x + y);
Console.WriteLine(cf);

実行結果.

3.33333333333333

解説

\[ \cfrac{1}{\cfrac{1}{1}+2}+{3} = \frac{10}{3} \] という計算を行っている。

通常の連分数とは順序が逆になるので注意が必要。 (maximaであればrreduceを用いるが、LINQにはこれに対応するメソッドがない。 したがって、rreduceのようなものを拡張メソッドとして定義するか、 あるいは、少し面倒であるが、シーケンスを逆順にして適用するしかない。 )