APL/J言語:オブバース(obverse)その2

Jボキャブラリーの:.(コロンドット、オブバース)のところを読みます。

(翻訳)
u :. vの結果がuでありかつオブバースをとるとvである、というように使う。接続詞&.(アンドドット、アンパーサンドドット)および^:(キャレットコロン、繰返し)においてはインバースと同値
(翻訳終り)


むむぅ、わかりませんね。とりあえず例を見よう。

   y=: _4 0 4 3j4
   rp=: <@(%: , -@%:)"0   NB.自乗根のペアを求める
   rp y
 +--------+---+----+---------+
 |0j2 0j_2|0 0|2 _2|2j1 _2j_1|
 +--------+---+----+---------+
   I=: ^:_1
   rp I   NB.オブバースを求める動詞
 +--+--+--+
 |rp|^:|_1|
 +--+--+--+
   *: I *: i.5   NB.通常の整数ならOK
0 1 2 3 4
   rp I rp y   NB.複素数ではダメ
domain error
rp I rp y
inv=:*:@{.@,@> NB.符号対応した動詞を作成 inv rp y NB.これで元に戻ることを確認 _4 0 4 3j4 RP=: rp :. inv NB.:.(コロンドット、オブバース)動詞をつかう RP I RP y NB.機能する(RPの逆関数でもどる)ことを確認 _4 0 4 3j4 rc=:<@(,: +)@(, -)@%:"0 NB.ルートコンパニオン rc y +---------+---+----+----------+ | 0j2 0j_2|0 0|2 _2| 2j1 _2j_1| |0j_2 0j2|0 0|2 _2|2j_1 _2j1| +---------+---+----+----------+ RC=: rc :. inv RC I RC y NB.機能する(RPの逆関数でもどる)ことを確認 _4 0 4 3j4

えーと、こんなことかと想像。普通逆関数のあるものはインバースすなわち逆関数であるが、複素数まで広げると逆関数のないものが多い。しかし逆関数(オブバース)があることが前提の演算^:_1(キャレットドットアンダーバーいち)を使うためには、逆関数を定義し、:.(コロンドット)を使ってあらたに動詞を定義しなおしておくとちゃんと動く。

この理解で合ってるとすると、^:_1(キャレットドットアンダーバーいち)は使うけど、:.(コロンドット、オブバース)はあまり使い道が思いつかない。

以上