APL/J言語:パーティション

パーティションのところは訳しにくいなぁ。部屋の仕切りのことをパーティションといいますが、リストの区切りと言いたいのかなぁ。副詞\(バックスラッシュ、円マーク)のことです。概念としては簡単で、たとえばsum=: +/を全体にかける際に、初めは初めの1つ、次に2つ、3つと順番にやっていって、最後に全部にかけた数字(この場合はリストの合計)を算出する。結果はもとのリストと要素数が同じリストになります。

英語での説明はこんな感じです。

関数sum=: +/はリスト全体に作用する。部分の合計やサブトータルを計算するためには、引数のその場所までの前段部分(prefix)のそれぞれについてsumを作用させる必要がある。

   sum=: +/ 
   a=: 1 2 3 4 5 6
   (sum a) ; (sum\ a)
 +--+--------------+
 |21|1 3 6 10 15 21|
 +--+--------------+

つまり、1=1, 1+2=3, 1+2+3=6,...ということです。
記号の\(バックスラッシュ、円マークは)前段部分(prefix)に作用させるという意味の副詞で、動詞引数(この場合はsum)を右側引数の前段部分のそれぞれに作用させます。副詞の\.(バックスラッシュドット、円マークドット)は同様に後段部分のそれぞれに作用します。

   sum\. a
21 20 18 15 11 6

単項動詞の<(小なりマーク)は引数をボックス化します。したがって<\(小なりバックスラッシュ、小なり円マーク)や<\.(小なりバックスラッシュドット、小なり円マークドット)は区切り(パーティション)の効果を明確に示します。

   <1 2 3
 +-----+
 |1 2 3|
 +-----+

   (<1),(<1 2),(<1 2 3)
 +-+---+-----+
 |1|1 2|1 2 3|
 +-+---+-----+

   <\ a
 +-+---+-----+-------+---------+-----------+
 |1|1 2|1 2 3|1 2 3 4|1 2 3 4 5|1 2 3 4 5 6|
 +-+---+-----+-------+---------+-----------+

   <\. a
 +-----------+---------+-------+-----+---+-+
 |1 2 3 4 5 6|2 3 4 5 6|3 4 5 6|4 5 6|5 6|6|
 +-----------+---------+-------+-----+---+-+

斜め線副詞/.(スラッシュドット)はテーブルについて対角線上に作用します。

   

#.(シャープドット)は、左側の引数(デフォルトは2)をベースにして、右側の引数を数値化する動詞で、10 #.1 2 3ならば1*10*10+2*10*3=123が返されます。

演習:
14.1 掛け算、最大値、最小値についてsum:+/\と似たような動詞を作れ。

   prog=:*/\
   prog a
1 2 6 24 120 720
   max=:>./\
   max a
1 2 3 4 5 6
   min=:<./\
   min a
1 1 1 1 1 1

14.1 下記のプログラムについて演習せよ。c=:1 3 3 1、d=: 1 2 1、x=:i.5とした上で、c pol x、c pp d、(c pp d) pol x等を実行してみよ。

pol=: +/@([*]^i.@#@[)"1 0   NB.多項式(Polynomial) 
pp=: +//.@(*/)   NB.多項式の積
pp11=: 1 1&pp   NB.1 1による多項式の積
pp11 d 
pp11^:5 (1) 
ps=: +/@,:   NB.多項式の和
   c =: 1 3 3 1
   d=: 1 2 1
   x=:i.5
   pol=: +/@([*]^i.@#@[)"1 0
   c pol x
1 8 27 64 125
   1 3 3 1 ([*]^i.@#@[)"1 0 i.5
1  0  0  0
1  3  3  1
1  6 12  8
1  9 27 27
1 12 48 64

   c pp d
1 5 10 10 5 1
   c */ d
1 2 1
3 6 3
3 6 3
1 2 1