APL/J言語

アッカーマン関数

アッカーマン関数(Ackermann's function)とは、非負整数 m と n に対し、 によって定義される関数のことである。 参考: tex:Ack(m, n)=\{\begin{array}n+1,&if\quad m=0\\Ack(m-1,1),&if\quad n=0\\Ack(m-1,Ack(m,n-1)),& otherwise\\\end{array}] というの…

三角形を描く

J言語にはグラフィックユーティリティが付いてきて、自由自在にフラクタルなどが描けるようです。それはそれですごいことなのだと思うのですが、とりあえず単純な不定形の三角形を描きたい、と思いました。 デモやLabsを見ると、フラクタルだけでなく、グラ…

コードゴルフ(素数を数えて落ち着くんだ)

あるところ(http://d.hatena.ne.jp/atomoharu/20090420/1240227378)でCode Golfをやっていて、面白い課題がありました。 2から任意の数までの中でランダムに5個素数を表示し合計も出す。 5個の中に重複した素数があってもよい。今回は100まで。プログラム中…

ForkとHookのまとめ

J言語やらない人にはなんだかわからないと思うけど、まとめです。 特に記憶しないと使えないということはないのですが、毎回試行錯誤してるのでメモしておきます。 (f g) y => y f (g y) cf.(+ tax) 50 x (f g) y => x f (g y) (f @: g) y => f (g y) x (f @…

コミュート(交換)

二項動詞のあとに~(チルダ)をつけると、右側引数と左側引数を交換できます。xとyを引数として、fを関数とすると、x f~ yはy f xと同じ意味である、というような説明になります。 }(右ブレイス、右波かっこ、アイテムアメンド)という動詞があって、配列の要素…

関数の作成

J言語の本を読んでいたら、次のような課題がありました。 f(n) = 5 n - 1 をJ言語で表現せよ。 1〜10 の数列について、実行し、一覧表にせよ。 回答は次のようなものでした。 N =: ] F =: (5: * N) - 1: i =: >: i.10 i ,: F i 1 2 3 4 5 6 7 8 9 10 4 9 14 …

ライフゲーム

APLで書かれたライフゲームをJ言語に翻訳しようとしています。 もとのプログラムはこれ。 life ← {↑1 ω∨.^3 4=+/,潤イ1 0 1∘.Θ潤イ1 0 1∘.Φ⊂ω} なにがなんだかわかりませんね。 しばらく放っておいたのですが、動画で検索したら、解説付きのところがあったので…

靴下問題

数学、パズルで、靴下問題と呼ばれる問題があって、黒と茶色の靴下が引き出しに入っているのを暗闇で取り出すのに最低何枚で同じ色がそろうか、というのがあります。答えは3枚です。3色ならば4枚、4色なら5枚ですね。これはこれでおもしろい。 さて、わたし…

2の100乗

昨日の2の64乗の記事に関連して、100乗までの一覧表を作りたいと思いました。 すぐできてしまったので、ご紹介。思いついてから1分。 hundred =:x: ,.>:i.100 hundred ; 2 ^ hundred +---+-------------------------------+ | 1 | 2 | | 2 | 4 | | 3 | 8 | |…

2^64はどれほど大きな数か?

APL/J言語の記事を読んでいて、「2^64はどれほど大きな数か?」というのがありました。 2^64 1.84467e19 2^64x 18446744073709551616 というような拡張数字(xつき整数)の話なのですが、なんで64乗なのかと考えると、チェス番が8x8で64マスなんですね。たしか…

重複のある順列

雑誌ニュートンに確率の特集がありました。その中に、「サイコロを3回振って、9になる確率と10になる確率のどちらが高いか?」というのがありました。むかしからギャンブラーを悩ませていた問題で、9になる場合の組合せ6通り(126 135 144 225 234 333)、10に…

曲の長さ

最近突然ピアノ教室に通うようになって、ちょうちょから始めたのですが、つぎが四季の歌で、なんと3曲目がバッハのメヌエットを練習しています。意外にと言ってはなんですが、練習が楽しくて、なんど繰り返していても飽きません。というか練習あるのみ! で…

演算の順序

APL/J言語では式は右から評価して行きます。これによって、いろんなことが簡単になっています。それはあちこちに書いてありますので、ここではひとまずおいて、演算の順序と言えば、逆ポーランド記法というのがありました。HP電卓などに入っていたもので、と…

誕生日が同じ確率

誕生日が同じ確率の計算方法についてはあちこちに書かれているのでそれを読んで頂くとして、やりたいのはせっかくのJ言語ですので実証です。?(クエスチョンマーク)というランダム動詞をつかって、40人の誕生日を作って、誕生日が同じ人がいるかどうか確認。4…

二次方程式

たとえば二次方程式の解の公式、というようなのを、texを使わないでJ言語表記もどきで書くと、a*x^2+b*x+c=0とか、x=(-b+( (b^2)-4*a*c)^(1r2))%(2*a))とかになると思います。さて、実験: a=:b=:c=:x=:1 NB.value errorにならないように変数になにかを入れ…

自然数

自然数1 2 3 4 ...があって、n番目の数はnで、nがあれば必ずn+1がある。だから無限。 と言われてもなぁ、と感じる場合、実際に納得するまでやってみるしかありません。1の次は2、その次は3というように。 ためしに10を考えると10+1は11。なるほど。 次の次の…

1億番目の素数

R言語のこと調べていて、そう言えばと思い出したのがMathematica。マセマティカ自体は高いので企業や学校でしか使えないと思うけど、Wolframリサーチのサイトがすごいですよね。数学関係の記事の宝庫になっていると思う。Mathematicaを買わなくてもこのサイ…

素数リスト

J言語にはp:(ピーコロン)という関数があって、p: nでn番目の素数を出します。 p:i.5 2 3 5 7 11 これはp:を0 1 2 3 4に作用させた結果です。 さて、これはこれでいいのですが、100以下の素数のリストが欲しいというときはどうすればよいか。 J言語には^:_1(…

モンテカルロ法による円周率の近似

本屋に情報処理言語のR言語の本がたくさんあって立ち読みしてみたらベクトル処理言語とか書いてあって、あれJ言語みたいじゃんと思いました。 ウィキペディアにR言語での「モンテカルロ法による円周率の近似」という例が載っていました。 s 記事引用: 『さ…

配列の要素の取り出し

J言語では、配列を簡単に作れます。たとえば3行4列の配列が欲しいと思えば、次のようにします。 ]x=:i.3 4 0 1 2 3 4 5 6 7 8 9 10 11 文字列との混在はできませんが、複素数でも無理数でも大丈夫です。 ]x=:3 4$(^1), 3.2 , 2r3, (i.7) , o.1 2.71828 3.2 …

トランスポーズ再考

:(たてぼうコロン、パイプコロン,トランスポーズ)という動詞は、単項動詞としてテーブルに作用させると表のたてよこが入れ替わるのでわかりやすくて便利です。これを二項動詞として使うと、指定した軸(axis)が入れ替わるのですが、これについていろいろやっ…

数え上げ

0、1、2、3、4の5枚のカードから2枚を選んで並べ、2桁の数を作ります。次に、これらの2桁の数の中から1つを選ぶとき、1の位の数字と10の位の数字の差が1であるような数を選ぶ確率を求めましょう。 深川和久「ゼロからわかる確率・統計」より a=:i.5 NB.0、1…

樹形図

ABCDEの5人の中から、PTAの委員長1人と書記1人を抽選で選びます。ただし、委員長はAさん以外から選び、書記はBさん以外から選ぶものとします。 このとき、Cさんが委員長にならないでDさんが委員長か書記のどちらかに選ばれる確率を求めましょう。 ただし、あ…

コイントス

読んでいた本に、コインを5回投げて、オモテかウラが3回続けてでる確率は1/2と書いてありました。これをJ言語で確認してみました。 +/ +./"1 (0 0 0 E."1 (#: i.32)) 8 えっと、#:(シャープコロン)は右側引数を0と1の二進法のベクトルに変換しますので、#:i.…

円周率の計算(マチンの公式)

円周率の計算にマチンの公式というのがあって、次のようなものです。 J言語にo.(オードット)という動詞があって、左側引数の数字でサインとかコサインとかが計算されます。ボキャブラリーを見ると、数字の7をつけるとアークタンジェントの計算ができるらしい…

連立一次方程式

クラメールの公式により、J言語を用いて連立一次方程式を解く。 NB. 3x + 2y = 4 NB. 5x + 7y = 3 ]a=:2 2$3 2 5 7 3 2 5 7 ]b=:4 3 4 3 -/ . * a NB.aの行列式determinantを求める 11 ]x=: ( (-/ . *) b ,. 1{"1 a) % 11 2 ]y=: ( (-/ . *) (0{"1 a) ,. b) …

オイラーの公式

前述のエアハルト・ベーレンツ「5分でたのしむ数学50話」の第18話に最も美しい公式としてオイラーの公式が書かれています。 自然対数の底を複素数と円周率の積乗したものはマイナス1ということらしいのですが、これをみながらつらつら考えています。 自然対…

1001の素因数分解

エアハルト・ベーレンツ「5分でたのしむ数学50話」の最初の話が、3桁の整数を2回並べた数字(たとえば761761)が7で割り切れるという話です。これは1001を素因数分解すると7x11x13というところからきています。 さて、まず、101から初めて1000000001とかがどう…

スクリーンへのアウトプット(質問)

APLのテキストを読んでいると、スクリーンに一連のアウトプットを出すようなプログラムがあります。 ▽CHECK [1] A←10 45 23 68 [2] 'MAX : ' , ": >./ A [3] 'MIN : ' , ": APLの文字がない分はJ言語の記号でごまかしましたがこんな感じ。これをJ言語でやろ…

APL/J言語の記事置き場

最近、J言語に夢中で、J言語についてばかり書いていますが、これでは日記の意味がなくなりつつあるので、ちょっと工夫です。 はてなは過去日付で書けますので、今後2001年2月あたりにまとめて書くようにします。 APLやJ言語は数学に近くて、概念をどのように…