チューリング不完全

What are you afraid of? All you have to do is try.

Mathematica基礎文法最速マスター

Aizu Advent Calendar13日目の記事です。

さて、13期生というロートルがいったい何を書けばいいのかと思い悩んでいたのですが、TwitterのTLにたまにこんな文章が流れてきます。


会津大学の学部カリキュラムには関数型言語の授業がない」。今でもそうかどうかははっきりとは知りませんが、少なくとも僕の頃にはそのように言われていました。
しかしそこで僕は上の文章にNoを突きつけたい。
会津大学生は1年前期に関数型言語に触れているのですよ?
そう、僕達にはMathematicaがあるじゃないか!


しかし触れる期間はごくわずかで資料も至極残念と言わざるをえないものなので、99.99%の1年生は「わけのわからないもの」として記憶から即消し去ってしまいます。
この記事では会津大生へのMathematica啓蒙を目的として、基礎文法を書いてみたいと思います。*1



基礎

Mathematicaの実行形式にはノートブック、スクリプト実行があります。
ノートブック形式は対話式インタプリタをやりとりごと保存する、というものです。
以下ではノートブック形式での実行に絞って解説します。

式の実行
> 2 + 3
5

式を入力する部分を「セル」といい、複数行のコードを記述することができます。
Enterで改行、Shift+Enterでセルを評価します。
評価後も、カーソルをセルに合わせてShift+Enterを押すと何度でも評価させることができます。

計算結果の表示/非表示
> x = 3*2;
> y = x+3
> z = x+y;
9

文末にセミコロンをつけることで評価した結果を非表示にできます。

コメントアウト
> (* comment *)
> (*
> これも
> コメント
> *)

残念ながら1行コメントはありません。


基本演算

> 4*3
12
> 5-10
-5
> 9 * 0.3
2.7
> 10 / 4
5
-
2
> 2 + 3I
2+3i

除算した場合、分数になります。

未定義変数を含んだ計算

>Expand[(x+y)(x-y)]
x^2-y^2
>x = 3
3
>Expand[(x+y)(x-y)]
9-y^2

未評価の変数を含んだ計算をすることができます。
ノートブック上では、未評価の変数は青色、何らかの値が束縛されている変数は黒色で表示されます。

リスト

>{1,2} + {3,4}
{4,6}
>Norm[{3,4}]
5
>Transpose[{{a,b},{c,d}}]
{{a,c},{b,d}}

複数個の値はリストで表現する事ができます。
ネストさせることで行列、テンソルの表現も可能です。

関数

> zz /@ {1, {1}, {1,2}} (* Map *)
{zz[1], zz[{1}], zz[{1,2}]}

> zz @@ {1, {1}, {1,2}} (* Apply *)
zz[1, {1}, {1,2}]

> zz @@@ {1, {1}, {1,2}} (* Apply *)
{1, zz[1], zz[1,2]}

> Fold[zz, 0, {1, {1}, {1,2}}]
zz[zz[zz[0,1], {1}], {1,2}]

> Nest[zz, {1, {1}, {1,2}}]]]
zz[zz[zz[{1, {1}, {1,2}}]]]

MathematicaLispに大きく影響を受けている言語です。関数型プログラミングではおなじみの関数群が用意されています。
上記例ではzzが未定義ですが、関数を定義することで実際に適用させることができます。

> zz[x_]:=x+100

> zz /@ {1, {1}, {1,2}}
{101, {101}, {101, 102}}

パターンマッチ

前項でzz[x_]を定義しましたが、以下の例では関数が展開されていません。

> zz @@ {1, {1}, {1,2}}
zz[1, {1}, {1,2}]

これは、上記の場合3引数関数となっており、zzに3つの引数をとる関数が定義されていないためです。

> zz[x_, y_, z_]:= {100*x, 10*y, z}

> zz @@ {1, {1}, {1,2}}
{100, 10, {1,2}}

> zz[1, y_, z_]:= 0

> zz @@ {1, {1}, {1,2}}
0

引数の数だけでなく、パターンマッチさせることもできます。


可視化

基礎文法で可視化?と思われるかもしれませんが、簡単なグラフであればワンライナーで描画することができます。

> Plot[x^2==0, {x,-3,3}]

f:id:aomori-ringo2:20121213225933p:plain

アニメーション

基礎文法でアニメーションとかほんと気持ち悪いですね。でもワンライナーですし。

> Manipulate[Plot[y^3 + (x - y)^2 + x == 0, {x, -3, 3}], {y, -3, 3}]

f:id:aomori-ringo2:20121213230027p:plain
上部に表示されるスライドバーをマウスで操作することで、グラフが動く様子を見ることができます。




Q&A

  • 会津大生なのですが、大学の環境(Solaris)で"mathematica &"を実行すると未だにMathematica 5.2が出てきて困っています。

現在はどうかわかりませんが、後ろにバージョン番号をつけると幸せになれるかもしれません。"mathematica6 &"とか"mathematica8 &"とか。
2012年12月現在の最新版はver.9ですが、まだ入ってないと思います。


  • 書籍はありますか?

ver.6が最新版だったころは日本国内にver.6に対応した書籍は恐らく存在せず地獄のような状態でしたが、今はだいぶましになりました。
下に行くほど難しくなります。プログラミング言語を触ったことがある人なら、入門Mathematicaあたりがおすすめです。

はやわかりMathematica 第3版

はやわかりMathematica 第3版


入門Mathematica 【決定版】 Ver.7対応

入門Mathematica 【決定版】 Ver.7対応


Mathematicaクックブック

Mathematicaクックブック


「使えることがある」というぐらいです。Wolfram Alphaはパーサが狂っているので、シンタックスシュガーがあると正しく読み取ってくれなかったりします。
でも頑張ればFizzBuzzぐらいならいけます。


まとめ

1日で殴り書いたので、ボリュームが全然不足してますね。気が向いたら加筆します。
その他にもMathematicaは異常なまでの関数が用意されていますし、GUIコンポーネントもなぜか豊富です。
PS3のコントローラ挿して3Dモデルを回転させたりとかできますよ。しかもその辺の情報がMathematicaのヘルプから見れるので結構楽しいと思うので、ぜひお試しあれ。
Aizu Advent Calendarは14日目、@tyageさんに続きます。

*1:「基礎文法最速マスター」というフォーマットが現れてから2年も経つのにMathematicaについての当該記事がないあたり、Mathematicaの荒地具合がご推察いただけると思う