本日は
アドベントカレンダーの季節がやってまいりました.
この記事は プログラミング言語 Julia のアドベントカレンダー $N=6$ 日目の記事です.(体調が悪かったので初日に投稿することができませんでした.とほほ...)
投稿者を募集しています.The Julia Programming Languageに関する内容なら何でもどうぞ
過去のカレンダーはこちら:
Julia Advent Calendar 2024
Julia Advent Calendar 2023
Julia Advent Calendar 2022
Julia Advent Calendar 2021
Julia Advent Calendar 2020
Julia Advent Calendar 2019
Julia Advent Calendar 2018
Julia Advent Calendar 2017
Julia Advent Calendar 2016
Julia Advent Calendar 2015
Julia Advent Calendar 2014
Julia について
プログラミング言語の一つです.Python,Ruby のような高級言語のように記述でき,JIT コンパイルで動作し実行速度は(ちゃんと書けば) C/C++/Fortran のような性能を引き出すことができる言語です.
インストールしよう
Julia の公式サイトに行ってインストール方法を確認します.
macOS または Linux 環境であれば下記のコマンドを実行することで Julia をインストールすることができます.
$ curl -fsSL https://install.julialang.org | sh
Windows ユーザであれば PowerShell を開いて次を実行します.
PS> winget install --name Julia --id 9NJNWW8PVKMN -e -s msstore
確認
正常にインストールできれば julia と juliaup というコマンドが使えるようになります.
$ julia --version
julia version 1.12.2
$ juliaup --version
Juliaup 1.18.9
juliaup の役目
Julia は常に進化し続けます(ソフトウェアのバージョンが上がり続けます).juliaup は手元のマシンにある Julia のバージョンと最新安定版の Julia が出ているかを監視する役割を果たします.新しいバージョンが公式からリリースされればその旨を通知してくれます.
例えば,筆者のマシンには Julia 1.12.1 がインストールされています.本日 (2025/12/06 現在) では Julia 1.12.2 がリリースされています.パッチアップデートはいくつかの不具合の修正・パフォーマンス改善がされているので更新しておくべきです.
古いバージョンを使ってると下記のようなメッセージがやってきます.
Info The latest version of Julia in the `release` channel is 1.12.2+0.aarch64.apple.darwin14. You currently have `1.12.1+0.aarch64.apple.darwin14` installed. Run:
juliaup update
in your terminal shell to install Julia 1.12.2+0.aarch64.apple.darwin14 and update the `release` channel to that version.
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.12.1 (2025-10-17)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org release
|__/ |
julia>
つまり,「君の環境は Julia 1.12.1 だ, 最新安定版は 1.12.2 があるぞ!, juliaup update を実行しろ」と教えてくれます.ターミナルで juliaup update をすると次のように出力されます.
$ juliaup update
Checking for new Julia versions
Checking for new version on channel 'nightly' is taking a while... This can be slow due to server caching
Updating channel nightly
Updating channel release
Installing Julia 1.12.2+0.aarch64.apple.darwin14
Checking standard library notarization.................................................Precompi
Precompiling SuiteSparse finished.
1 dependency successfully precompiled in 1 seconds
............done.
Tidyup Removed Julia 1.12.1+0.aarch64.apple.darwin14
Hello World を実行
ターミナルで julia と入力すると下記のように 1.12.2 の Julia がインストールされている様子がわかります.
$ julia
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.12.2 (2025-11-20)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org release
|__/ |
julia>
また,対話環境である REPL が使えるようになります.プログラミング言語入門でお馴染みの Hello World を入力してみましょう.
julia> # これはコメント
julia> println("Hello World") # 入力後エンターキーを押す
Hello World
julia>
余談ですが,julia> の部分 (prompt) も含めて上記のコードをコピーして作業中の REPL に貼り付けても Julia の REPL は julia> の部分をうまく解釈して println("Hello World") の部分を認識して実行してくれます.
電卓
2 の平方根 $\sqrt{2}$ の値が欲しいとします.Julia のREPL は簡易電卓としても利用することができます.
julia> sqrt(2)
1.4142135623730951
これでも良いですが,\sqrt を入力して Tab キーを入力してみましょう.そうすると √ という文字が出るはずです.すかさず 2 を入力しエンターキーを押すと
julia> √2
1.4142135623730951
ジャーン.√2 で 2 の平方根を得ることができました.見た目が数式と似せるように書くことができる・入力支援の仕組みがあるのは Julia の良いところです.TeX を知っている読者であれば他の記号も打てるか確認してみましょう.
- 円周率 $\pi$ は
piまたは\pi+ タブキーでπで利用することができます - 自然対数の底 $e$ は
\euler+ タブキーでℯを入力して利用することができます.面倒であれば指数関数expを使ってexp(1)を使えばいい気がします - 3 乗根は
\cbrtの後,タブキーを押して∛を入力することができます.2 ^ (1/3),cbrt(2)などでも良いです
ヘルプモード
たまに ≈ という記号が出てきます.これは左辺と右辺がほぼ等しいことを表す isapprox 関数のエイリアスです.
julia>? # ? を入力
help?> # プロンプトが変化する
help?>≈ # ≈ を入力する
help?> ≈
"≈" can be typed by \approx<tab>
search: ≈
isapprox(x; kwargs...) / ≈(x; kwargs...)
Create a function that compares its argument to x using ≈, i.e.
a function equivalent to y -> y ≈ x.
The keyword arguments supported here are the same as those in
the 2-argument isapprox.
│ Julia 1.5
│
│ This method requires Julia 1.5 or later.
────────────────────────────────────────────────────────────────
isapprox(x, y; atol::Real=0, rtol::Real=atol>0 ? 0 : √eps, nans::Bool=false[, norm::Function])
Inexact equality comparison. Two numbers compare equal if their
relative distance or their absolute distance is within tolerance
bounds: isapprox returns true if norm(x-y) <= max(atol,
rtol*max(norm(x), norm(y))). The default atol (absolute
tolerance) is zero and the default rtol (relative tolerance)
depends on the types of x and y. The keyword argument nans
determines whether or not NaN values are considered equal
(defaults to false).
(長いので省略)
このようにしてマニュアルを参照することができます.また ≈ の入力する方法もわかりますね.
ライブラリの利用
「与えられた整数,例えば,$2011$ って素数だっけ?」と確かめたくなる時がたまにあります.Julia 標準ではその機能がないのでライブラリの力を借ります.Primes.jl というパッケージがその機能を持っているのでインストールします.
REPL を開いて次を実行します.
julia> using Pkg; Pkg.add("Primes")
Resolving package versions...
Installed IntegerMathUtils ─ v0.1.3
Updating `~/.julia/environments/v1.12/Project.toml`
[27ebfcd6] + Primes v0.5.7
Updating `~/.julia/environments/v1.12/Manifest.toml`
[18e54dd8] + IntegerMathUtils v0.1.3
[27ebfcd6] + Primes v0.5.7
いろいろログが出てきますが,Primes パッケージがインストールされます.続けて下記のように REPL に入力します:
julia> using Primes
julia> isprime(2011)
true
using Primes によって isprime 関数が利用できるようになります.これは Primes.jl パッケージの中で isprime を export すると宣言してるからです.
同様の理由により素因数分解する factor 関数も使えます.
julia> factor(345)
3 * 5 * 23
julia> 3 * 5 * 23 # 検算
345
このように using Primes をすることで使える名前が増えてきます.が,名前空間を不必要に汚染したくない, 必要な名前だけを導入したい場合は一旦 REPL を再起動 (REPL に exit() を入力してセッションを終了してから julia をターミナルで実行)して下記を試してください.
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.12.2 (2025-11-20)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org release
|__/ |
julia> using Primes: isprime
julia> isprime
isprime (generic function with 4 methods)
julia> factor
ERROR: UndefVarError: `factor` not defined in `Main`
Suggestion: check for spelling errors or missing imports.
Hint: a global variable of this name also exists in Primes.
上記の例は isprime のみを Primes.jl からロードする例です.factor などは使えません.このようにして Main セッションに導入する必要かつ十分な名前をロードすることができます.
セミコロン ; で一行で表現する.
読者の中にはワンライナーやシェル芸が好きな人がいるかもしれません.Julia ではセミコロン ; で式をつなげることができます.例えば,上記でやったような
- Primes.jl パッケージをインストール
- Primes をロード
- factor 関数を使って数を素因数分解する
を一行で書くことができます.
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.12.2 (2025-11-20)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org release
|__/ |
julia> using Pkg; Pkg.add("Primes"); using Primes; factor(345)
Resolving package versions...
Project No packages added to or removed from `~/.julia/environments/v1.12/Project.toml`
Manifest No packages added to or removed from `~/.julia/environments/v1.12/Manifest.toml`
3 * 5 * 23
REPL を起動する必要もなくターミナルから直接 -E option を使って文字列をJuliaの式として解釈させることもできます.
$ julia -e 'using Pkg; Pkg.add("Primes"); using Primes; display(factor(345))'
下記のような出力が得られます.
Resolving package versions...
Project No packages added to or removed from `~/.julia/environments/v1.12/Project.toml`
Manifest No packages added to or removed from `~/.julia/environments/v1.12/Manifest.toml`
3 * 5 * 23
julia -e "..." のような使い方は GitHub Actions などの CI パイプラインを構築するときによく使うので覚えておくと良いでしょう.
グラフを描いてみよう
Plots.jl パッケージを入れます.
julia> using Pkg; Pkg.add("Plots")
としてもOKですが,Pkg REPL を使って入れることもできます.
julia>] # ここで ] を入力する
(@v1.12) pkg> # prompt が変化する
(@v1.12) pkg> add Plots
ここでは閉区間 $[0, 1] \subset \mathbb{R}$ の範囲で 関数 $x \mapsto x ^ n$ の様子を描画してみましょう.複素関数論の講義で関数列の一様収束を扱うときに出てくる例ですね.
using Plots
# 実際には collect はつけなくても良いが説明の都合上つけている.
# x = 0:0.01:1
#
xs = collect(0:0.01:1)
f(x, n) = x ^ n
y1 = f.(xs, 1)
y2 = f.(xs, 2)
y3 = f.(xs, 3)
y10 = f.(xs, 10)
y100 = f.(xs, 100)
plot(xs, hcat(y1, y2, y3, y10, y100), aspectratio=:equal)
実行すると下記のような画像が出てくると思います.電卓にもなるし描画も簡単にできちゃいますね.
0:0.01:1 は 0 から 0.01 刻みで 1 までの値を表すレンジオブジェクトです.collect(0:0.01:1) とすると下記のような配列が生成されます.
0.0, 0.01, 0.02, 0.03, 0.04, 0.05 ...
f(x, n) = x ^ n は x と n を入力として x の n 乗である x ^ n を計算する関数を定義しています.一般に,Juliaの関数の定義は下記のようにfunction キーワードを使って定義します.
function f(x, n)
return x ^ n
end
ただし,今回は一行で定義できるので f(x, n) = x ^ n のようにして f を定義することができます.
f.(xs, 2) の右下にあるドット . は誤植ではなく,ブロードキャストしていることを表しています.つまりy2 = f.(xs, 2) によって xs の各要素 x に対して x ^ 2 を計算をしています.もしかしたら下記の方が理解しやすいかもしれません.
# これでも良い
y2 = [f(x, 2) for x in xs]
REPL上だと y2 は下記のように出力されます.
julia> y2
101-element Vector{Float64}:
0.0
0.0001
0.0004
0.0009
0.0016
0.0025000000000000005
0.0036
0.004900000000000001
0.0064
0.0081
⋮
0.8464
0.8649000000000001
0.8835999999999999
0.9025
0.9216
0.9409
0.9603999999999999
0.9801
1.0
hcat(y1, y2, y3, y10, y100) によって縦ベクトル y1, y2, y3, y10, y100 たちを横方向に結合します.REPL では次のようになります.
julia> hcat(y1, y2, y3, y10, y100)
101×5 Matrix{Float64}:
0.0 0.0 0.0 0.0 0.0
0.01 0.0001 1.0e-6 1.0e-20 1.0e-200
0.02 0.0004 8.0e-6 1.024e-17 1.26765e-170
0.03 0.0009 2.7e-5 5.9049e-16 5.15378e-153
0.04 0.0016 6.4e-5 1.04858e-14 1.60694e-140
0.05 0.0025 0.000125 9.76563e-14 7.88861e-131
0.06 0.0036 0.000216 6.04662e-13 6.53319e-123
0.07 0.0049 0.000343 2.82475e-12 3.23448e-116
0.08 0.0064 0.000512 1.07374e-11 2.03704e-110
0.09 0.0081 0.000729 3.48678e-11 2.65614e-105
⋮
0.92 0.8464 0.778688 0.434388 0.000239212
0.93 0.8649 0.804357 0.483982 0.000705172
0.94 0.8836 0.830584 0.538615 0.00205487
0.95 0.9025 0.857375 0.598737 0.00592053
0.96 0.9216 0.884736 0.664833 0.0168703
0.97 0.9409 0.912673 0.737424 0.0475525
0.98 0.9604 0.941192 0.817073 0.13262
0.99 0.9801 0.970299 0.904382 0.366032
読者が伝統的な数学の線形代数学の講義を受けている場合,実ベクトル空間 $\mathbb{R}^n$ の要素は縦ベクトルであると習うと思います.それを横に並べた行列を扱うことはよくあることだと思いますが,hcat はまさにその役目を果たしています.
Plots.jl では y 座標に相当するデータが Matrix 型で来た場合,列ごとに数値データを解釈しそれをシリーズ(series)とみなしプロットします.
逐次プロットしたい場合は下記のようにして plot! 関数を使う方法もあります.
using Plots
xs = collect(0:0.01:1)
f(x, n) = x ^ n
y1 = f.(xs, 1)
y2 = [f(x, 2) for x in xs]
y3 = f.(xs, 3)
y10 = f.(xs, 10)
y100 = f.(xs, 100)
p = plot(aspectratio=:equal)
plot!(p, xs, y1)
plot!(p, xs, y2)
plot!(p, xs, y3)
plot!(p, xs, y10)
plot!(p, xs, y100)
最初に p = plot(aspectratio=:equal) で何も描画されない空のキャンバスを用意して plot! で p オブジェクトにグラフを追加していく感じです.
最後に ! があるのは副作用がある関数であることを表します.この表記はJuliaの慣習です.例えば,配列をソートする sort, sort! 関数は典型的な例です.ヘルプモードで調べてみてください.
まとめ
Julia の導入から,REPL での操作を通じていろいろ例を出してきました.
簡易電卓だけでなく,グラフの描画もできる便利ツールとして使うこともできます.
もちろん Python, R のように Jupyter Notebook で対話的環境で本格的にコーディングすることもできます.国内の計算物理の領域では Julia を使うユーザが増えているので計算機を通じて物理を理解したい方は Julia を学ぶと良いでしょう.また,数学を学んできた人もちょっと何か触ってみたいという場合に便利だと思います.代数学,数論パッケージもあります.
皆さんも Julia を導入して人生を N ≥ 1 進めてみてはいかがでしょうか?
(ちなみに ≥ は \geq で入力できます.)
以上
