以下、書きかけです。
-
-
- -
-
APL/J言語:アイデンティティ関数とニュートラル
単項動詞の0&+と1&*はアイデンティティ関数と呼ばれます。ここで0と1はそれぞれ二項動詞+と*のアイデンティティ要素、またはニュートラルと呼ばれます。空のリストに挿入すると挿入された二項動詞のニュートラルが返されます。例を示します。
+/ i.0 0 +/'' 0 +/0{. 2 3 5 0 */i.0 1 */'' 1 */0{. 2 3 5 1
この結果はリストをパーティションするときに便利です。なぜなら演算が空のリストを含んでいる場合でも成立するため、一貫性を保てます。
+/ a=: 2 3 5 7 11 28 (+/4{.a)+(+/4}.a) 28 (+/0{.a)+(+/0}.a) 28 */a 2310 (*/4{.a)*(*/4}.a) 2310 (*/0{.a)*(*/0}.a) 2310
アイデンティティ関数とその他のベーシックな関数の性質(ランクなど)は副詞のb.(ビードット、ベーシック)で調べることができます。
^ b. _1 NB.インバース ^. ^ b. 0 NB.ランク _ 0 0 ^ b. 1 NB.アイデンティティ関数 $&1@(}.@$)
演習:
27.1 下記の表現の結果を予想し、確認せよ。
*/'' <./'' >./'' >./0 4 4 $ 0 +/ . */ 0 4 4 $ 0 1 2 3 4 +&.^./ 5 6 7 8
*/'' 1 <./'' _ >./'' __ >./0 4 4 $ 0 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ +/ . */ 0 4 4 $ 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 2 3 4 +&.^./ 5 6 7 8 5 6 7 8 10 12 14 16 15 18 21 24 20 24 28 32
27.2 二項動詞{@;について実験し、数学的言語でなんと言うか回答せよ。
{@;
0 1 2 {@; 3 4 5 6 +---+---+---+---+ |0 3|0 4|0 5|0 6| +---+---+---+---+ |1 3|1 4|1 5|1 6| +---+---+---+---+ |2 3|2 4|2 5|2 6| +---+---+---+---+
答え:デカルト積
27.3 単項動詞(%:@~. +/ . * =)と%:について、同じものであることを証明し、1 4 1 4 2のように繰り返しを含むリストに対しては前者を使うべきある理由を述べよ。
答え:関数%:は演算コストが高い。(%:@~. +/ . * =)においてはナブ関数~.(チルダドット、ナブ)を用いることにより、同じ要素については一度だけ実行するようになっている。
%:1 4 1 4 2 1 2 1 2 1.41421 (%:@~. +/ . * =)1 4 1 4 2 1 2 1 2 1.41421 ] a=: = 1 4 1 4 2 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 ] b=: %:@~. 1 4 1 4 2 1 2 1.41421 b +/ . * a 1 2 1 2 1.41421 = i.4 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 = (i.4) , i.4 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1
27.4 下記の実験を行い、結果をコメントと比較せよ。
a=: 2 3 5 [ b=: 1 2 4 a (f=: *:@+) b NB.合計の二乗 9 25 81 a (g=: +&*: + +:@*) b NB.それぞれの二乗の合計と積の二乗の合計 9 25 81 a +&*: b 5 13 41 a +:@* b 4 12 40 a (f=g) b NB.結果が同じであることの表現 1 1 1 a (f-:g) b NB.fとgがトートロジーである(常に一致する) 1
27.5 f-:gというようなフレーズがトートロジーとして成立するのは二項動詞でだけの場合と、単項動詞だけの場合と、両方で成立する場合がある。以下のトートロジーについて確認せよ。
t1=: >: -: > +. = NB.二項動詞のみ。>:は大なりイコールの意味 3 >: 1 2 3 4 1 1 1 0 3 (> +. =) 1 2 3 4 1 1 1 0 t2=: <. -: -@>.&- NB.両方。<.最小値は最大値の逆、フロアはシーリングの逆 3 <. 1 2 3 4 1 2 3 3 3 (-@>.&-) 1 2 3 4 NB.x u&v y => (v x) u (v y) =>この結果にマイナスを作用 1 2 3 3 <.3.7 3 (-@>.&-) 3.7 3 t3=: <. -: >.&.- NB.t2と同じであるが、&.(アンダー、アンドドット)を用いている => x u&.v y => vi (v x) u (v y) 3 <. 1 2 3 4 1 2 3 3 3 (>.&.-) 1 2 3 4 1 2 3 3 (- 3) >. - 1 2 3 4 _1 _2 _3 _3 -"_1 (- 3) >. - 1 2 3 4 1 2 3 3 t4=: *:@>: -: *: + +: + 1: NB.単項動詞のみ。a+1の二乗はaの二乗+2a+1 *:@>: i.4 1 4 9 16 *:@>: 10 121 (*: + +: + 1:) i.4 1 4 9 16 t5=: *:@>: -: #.&1 2 1"0 NB.t4と同じであるが、多項式を用いている t6=: ^&3@>: -: #.&1 3 3 1"0 三乗についてt4と同様 bc=: i.@>: ! ] NB.二項係数 t7=: (>:@]^[) -: (]#.bc@[)"0 NB.t6と同様のことをk次元でk&t7として実行 s=: 1&o. NB.サイン c=: 2&o. NB.コサイン t8=: s@+-:(s@[*c@])+(c@[*s@]) NB.二項動詞での足し算と引き算 t9=: s@--:(s@[*c@])-(c@[*s@]) NB.サインの公式 det=: -/ . * NB.行列式(Determinant) perm=: +/ . * NB.Permanent=>matrix product=>行列の積 sct=: 1 2&o."0@(,"0) NB.サインとコサインの表 t10=: s@- -: det@sct NB.t9をサインとコサインの表の行列式を用いて算出 t11=: s@+ -: perm@sct NB.t8をpermanentを用いたもの S=: 5&o. NB.放物線(Hyperbolic sine) C=: 6&o. NB.放物線(Hyperbolic cosine) SCT=: 5 6&o."0@(,"0) NB.Sinh and Cosh table t12=: S@+ -: perm@SCT NB.Addition theorem for sinh SINH=: ^ .: - NB.Odd part of exponential COSH=: ^ .. - NB.Even part of exponential t13=: SINH -: S NB.Sinh is odd part of exponential t14=: COSH -: C NB.Cosh is the even part of exponential sine=: ^&.j. .: - NB.Sine is the odd part of exponential t15=: sine -: s NB.under multiplication by 0j1
27.6 下記の表現についてコメントを加えよ。
g=: + > >. NB.Test if sum exceeds maximum 5 g 2 NB.True for positive arguments 5 g _2 _1 0 1 2 NB.but not true in general f=: *.&(0&<) NB.Test if both arguments exceed 0 theorem=: f