[Julia] UTF-8 表記の演算子たち

Julia ミニパターン。Julia 独特の構文を、不定期に紹介したいと思います。
2回目は、半角英字 **ではない** 演算子について。

識別子 (変数や関数の名前) に漢字を使える言語はいくつかあります。Julia は、識別子に UTF-8 を使えます。さらに、UTF-8で表記する 2項演算子(中置き演算子)が、いくつかあります。大胆ですね。

# Unicode の TAB入力補完

Julia の REPL(コマンドライン) を使うときには、TABキーによる入力補完の機能を使って、Unicode 文字を楽に入力できます。 特定の文字列を打ち込んでから直後に TAB を入力すると、該当の文字に置き換わります。例えば、\alpha[TAB] と打ち込むと α に変換されます。
TAB補完文字列の一覧は、こちらにあります。LaTeX 利用者には馴染みの文字列が多いですね → 
http://docs.julialang.org/en/stable/manual/unicode-input/


# 比較演算子など

下の表。左列は UTF-8 を含む表記、右列は同じ働きをする 半角英字の表記です。最右列は TAB補完文字列です。

| UTF な表記 | non-UTF な表記 | TAB補完文字列 |
|:---:|:---:|:---|
| [a ≤ b](http://docs.julialang.org/en/stable/stdlib/math/#Base.≤) | `a <= b` | \le |
| [a ≥ b](http://docs.julialang.org/en/stable/stdlib/math/#Base.≥) | `a >= b` | \ge | 
| [a ≠ b](http://docs.julialang.org/en/stable/stdlib/math/#Base.≠) | `a != b` | \ne |
| [`a ≡ b`](http://docs.julialang.org/en/stable/stdlib/base/#Base.≡) | `a === b`, `is(a, b)` | \equiv |
| [`a ≢ b`](http://docs.julialang.org/en/stable/stdlib/math/?highlight=%E2%89%A1#Base.≢) | `a !== b`, `!is(a, b)` | \nequiv |
| `a ≈ b` | [isapprox(a,b)](http://docs.julialang.org/en/stable/stdlib/math/#Base.isapprox) | \approx |


* 「大きい、または、等しい」は、高校までは、不等号の下に等号を表記「 ≧ 」( [U+2267](http://www.fileformat.info/info/unicode/char/2267/index.htm) ) しますが、大学に入ると、等号を横棒一本で表記「 ≥ 」( [U+2265](http://www.fileformat.info/info/unicode/char/2265/index.htm) ) します。Julia は、前者の表記をとらないので、大人の言葉だというわけです (末尾は余談)。
* `a == b` は値が等しい。`a ≡ b` はオブジェクトが等価。 
* [`isapprox(a,b)`](http://docs.julialang.org/en/stable/stdlib/math/#Base.isapprox) は近似比較の演算子です。

# 数や集合の演算

| UTF な表記 | non-UTF な表記 | TAB補完文字列 |
|:---:|:---:|:---|
| [`a \ b`](http://docs.julialang.org/en/stable/stdlib/math/#Base.\\) | `b / a` |  |
| `a ÷ b` | [div(a,b)](http://docs.julialang.org/en/stable/stdlib/math/#Base.div) | \div |
| `∪(a, b...)` | [union(a,b...)](http://docs.julialang.org/en/stable/stdlib/collections/#Base.union) | \cup |
| `a ∩ b` | [intersect(a,b...)](http://docs.julialang.org/en/stable/stdlib/collections/#Base.intersect) | \cap |

* [`a \ b`](http://docs.julialang.org/en/stable/stdlib/math/#Base.\\) は左除算 (left division) というそうです。

# 要素がコレクションに属するかの判定

| UTF な表記 | non-UTF な表記 | TAB補完文字列 |
|:---:|:---:|:---|
| `item ∈ collection` | `in(item, collection)` | \in |
| `collection ∋ item` | `in(item, collection)` | \ni | 
| `item ∉ collection`  | `! in(item, collection)` | \notin |
| collection ∌ item | `! in(item, collection)` | \nni |

全て [`in(item, collection)`](http://docs.julialang.org/en/release-0.4/stdlib/collections/#Base.in) の別の表記です。


# 線形代数の演算子たち

行列、ベクトルに対する演算です。

| UTF な表記 | non-UTF な表記 | TAB補完文字列 |
|---|---|---|
| [a ⋅ b](http://docs.julialang.org/en/stable/stdlib/linalg/#Base.⋅), ⋅(a, b) | `dot(x, y)` | \cdot |
| [`a × b`](http://docs.julialang.org/en/stable/stdlib/linalg/#Base.×), `×(a, b)` | `cross(a, b)` | \times | 
| [`A \ B`](http://docs.julialang.org/en/stable/stdlib/linalg/#Base.\\), `\(A, B)` |  |  |  

* a ⋅ b は、ベクトルの内積 (inner product)です。ベクトル a が複素数なら、複素共役がとられます。ですから、a ⋅ a は実数の値となります
* `a × b` は、3次元ベクトル同士の外積 (クロス積)です。
* `A \ B` は、行列の商といいます。$A$ が正方行列なら左から逆行列を乗ずること $A^{-1}B$ に相当します。正方行列ではない場合は、最小二乗ノルム解を計算します。これを使うと、任意の基底を用いて、ベクトルを表すことができます。こちらに詳しく書きました → [[Julia] 特定の基底におけるベクトルの表示を求める + 基底変換](http://qiita.com/tenfu2tea/items/05efa88f06607c263db5)

## 例: 逆格子ベクトル
私の専門分野では、三つのベクトル $a_1, a_2, a_3$ に対して、$b_1 = 2\pi \frac{a_2 \times a_3}{a_1\cdot(a_2 \times a_3)} $ などを計算しますが、上の表記を使うと、式通りに書けます。すごく便利。(以下、係数 $2\pi$は省略)。

```Julia
julia> a1 = [1,1,-1] /2.0
3-element Array{Float64,1}:
  0.5
  0.5
 -0.5

julia> a2 = [1,-1,1] /2.0
3-element Array{Float64,1}:
  0.5
 -0.5
  0.5

julia> a3 = [-1,1,1] /2.0
3-element Array{Float64,1}:
 -0.5
  0.5
  0.5

julia> b1 =  (a2 × a3) / ( a1 ⋅ (a2 × a3))
3-element Array{Float64,1}:
  1.0
  1.0
 -0.0

julia> b2 =  (a3 × a1) / ( a2 ⋅ (a3 × a1))
3-element Array{Float64,1}:
  1.0
 -0.0
  1.0

julia> b3 =  (a1 × a2) / ( a3 ⋅ (a1 × a2))
3-element Array{Float64,1}:
 -0.0
  1.0
  1.0
```

# Unicode プログラミング

@bicycle1885 さんの、こちらの記事もどうぞ。
* Unicodeプログラミングのすゝめ http://bicycle1885.hatenablog.com/entry/2014/12/05/011256

上の記事の末尾で紹介されているプログラムを、下に示します。Atom Editor 上で、[Fira Code](http://qiita.com/shuntksh/items/1995e87fe5c1ac88296f) フォントで表示したスクリーンショットです。まるで、地の文ですよね。

![スクリーンショット 2017-02-01 23.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/103217/99375fc5-17eb-2bc9-d8e2-4ccfd4b8eac7.png)