#Julia言語 【one(x)は多くの場合にxと同じ型の1になる】

公式ドキュメント docs.julialang.org/en/v1/base/num… にもあるようにone(x)がxと違う型になる場合があります。

one(x)はxの型に関する乗法的な1になり、加法的な(次元を持つ)1が欲しければoneunit(x)を使う。

環上の加群を思い浮かべるとよいです。
#Julia言語 数学の習慣では、乗法の単位元を1と書き、加法の単位元を0と書くことが多い。

Juliaでは、xと同じ型もしくは型xに関する乗法的な単位元をone(x)と書き、加法的な単位元をzeto(x)と書く習慣。

単位としての加法的な1はoneunit(x)と書かれる。

数学を知っていれば納得し易い。
#Julia言語 例えば、Aが数を成分とする正方行列のとき、Juliaにおいてone(A)は単位行列になってくれます。

one(x)という書き方を知っていれば「どの型の乗法的1なのか」を型を明示せずに型の伝搬スタイルで記述できるわけですが。

数学でも「これはxが含まれる環の1です」などと言える。これと同じ。
#Julia言語 注意:数の型については、promotion docs.julialang.org/en/v1/manual/c… のルールが適切に定められているので、Float64型の数値の計算の中で one(Float64) のように書く必要はほぼないです。

単に1と書いてよい。

promotion規則に基いて、整数の1は浮動小数点数の1.0に変換されます。
#Julia言語

Juliaではxが「環」の要素なら、one(x)はその「環」の1になる。

xが「環」上の「加群」の要素なら、one(x)は「環」の側の1になる。

xが「環」上の基底uが固定されたランク1の自由加群ならば、oneunit(x)は数学的には1uになる。

Juliaの型伝搬を支える基本函数達は非常に数学的。
#Julia言語 通常の数学の慣習では、実数、複素数、実行列、複素行列の指数函数を全部exp(x)と書ける。

Juliaでは、Float64, ComplexF64, Matrix{Float64}, Matrix{ComplexF64}の指数函数を全部exp(x)と書く。

私は「多重ディスパッチのスタイルは普通の数学のスタイルと同じ」と思った。
#Julia言語 多重ディスパッチの仕組みで「すべてを済ます」スタイルを知って、ℤをℝの部分集合と同一視することについてのイメージも膨らませることができた。

Juliaでは、Int型の数値はFloat型の数値だと自動的にみなされることは、言語の機能としてはない。

しかし、ユーザー側に~続く
#Julia言語 続き。しかし、ユーザー側にInt型の数値がFloat64型の数値に自動的に読み換えられているように見える機能がないと、ユーザー側のコードを書く手間が増えて、実用的とは言えない道具になってしまう。

Juliaではこの問題も多重ディスパッチで処理している。
#Julia言語 多重ディスパッチとは、(例えば)同一の記号列 f(x, y) で実行されるメソッドが x, y の型の組み合わせごとに別に設定できることである。

2 + 3 = +(2, 3) はInt型の2と3の和。

2.0 + 3.0 = +(2.0, 3.0) はFloat64型の2.0と3.0の和。

どちらも同じ + 記号で書かれている。続く

続く
#Julia言語 2 + 3.0 のようなInt型とFloat64型の和では、Int型の側がFloat64型に昇格させられて、結果的に 2.0 + 3.0 が実行されるようになっています。

x + y で何が実行されるかを x, y の型の組み合わせごとに変えられることをここで上手に利用しているわけです。

私はこういう話が楽しい。
#Julia言語 a∈A, b∈Bのとき、A⊂C⊃B を満たすCでたし算が定義されているものがあるならば、a,bをCの要素とみなすことによってa+bを定義できる。

Juliaでのたし算は実際にそのように実装されている。

例えばaがBigIntでbがFloat64のとき、a+bにおけるa,bはBigFloatに変換後に足される。
#数楽 数学の教科書で厳密には異なるものを同じ記号で表されていることが気に入らない人が、自分でノートを作るときに、厳密には異なるものにすべて違う記号列を割り振ろうとすると、結果的に可読性の低いノートができあがる。

数学における「多重ディスパッチ」も結構重要な役割を果たしている。
#数楽 数学のノートを作るときに厳密には異なるものに違う記号列を割り振ろうとして、細かい記号がごちゃごちゃしている読みにくいノートを作りがちな人は、#Julia言語 の「多重ディスパッチ」の使い方について学べば、異なるものにすべて違う記号列を割り振ることへのこだわりが解消するかも。
#数楽 ヒトに読ませることが前提の数学における記号法の運用と、コンピュータに正確に命令するために使われるプログラミングにおける記号法の運用の厳密さを比較すると、相対的に、前者は緩くイーカゲンで、後者はものすごく厳密である。
#数楽 プログラミング言語での記号法の運用は単に厳密であればよいだけではなく、ヒトが書きやすいものでなければいけない。

計算効率を支える厳密さとヒトにとっての書き易さの調和は #Julia言語 の重要なテーマ。

数学好きならば、プログラミングに興味がない人も勉強する価値があります。
#Julia言語 の稀有なスタイルは、人類が発展・普及させた記号法の文化に相性がよい記号法をプログラミングでも使えるようにしようとしていることです。

そのための地道な力仕事がどのように遂行されたかを知ることは、数学のノートを作るときにも役に立つと思われます。

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

19 Mar
#統計 ものすごく基本的な話題

サンプルサイズNで割る標本分散とN-1で割る不偏分散を比較してみました。

#Julia言語
nbviewer.jupyter.org/gist/genkuroki…

①不偏分散の期待値は真の分散に一致し、標本分散の期待値のずれの大きさは1/Nに比例する。

②真の値との誤差の二乗の期待値は不偏分散の方が大きい。 Image
#統計 サンプル達は標準正規分布で生成しています。

横軸はサンプルサイズNの逆数。右に行くほどサンプルサイズが小さくなる。

不偏分散は期待値は真の値に一致するのですが、二乗誤差は標本分散よりも大きくなります。

不偏分散が標本分散よりも一方的に優れているという思い込みは誤りです。 Image
#統計 たとえば、あなたと私でランダムに生成されたサンプルから分散を推定するゲームをやったとします。

真の値との差の二乗が大きい方が小さい方に差に比例した罰金を支払うというルールなら、不偏分散を推定法として採用した人は負け組になってしまいます。
Read 13 tweets
18 Mar
#超算数 【「1セットあたりの量」と「○セット」という概念の定着を目的にあえて縛りを設けていると考えれば納得.】とか言うお馬鹿さん達が継続して出て来ることが昔からよく知られています。

かけ算順序固定強制指導が実際に有害であることの間接的な証拠とみなせると思う。続く
#超算数 現実の子供に関しては、同じ数を含む集まりが何セットあるかの状況把握と掛け算順序マスターであることは、現場の教師の調査で関係ないことが分かっています。

そして、その教師は、関係ないことを認めた上で、掛け算順序強制指導を強化しなければいけないと主張しています。

これが現実。
#超算数 掛け算順序が逆なら誤りとみなしたり、掛け算順序が逆なら理解していないとみなす行為は、算数教育の世界では100年以上の伝統を持っています。

これだけの伝統があると、掛け算順序指導が社会的に否定されると困る人達が沢山いることもよく分かる。

しかし、被害者は次世代を担う子供達。
Read 10 tweets
17 Mar
#Julia言語 Juliaの型について十分な理解がない段階でJuliaで型を明示的に書くと、大抵の場合ろくなことにならないし(バグの原因になる)、理解が進むと、型を明示的に書いた方が良いという考え方自体が技術的に劣っている考え方だと気付きます。

Juliaでは型を明示せずに、型の伝搬で考える。続く
#Julia言語 私自身がやらかした失敗の例

① function f(x::Vector{Float64}) ~ end

のように引数の型を明示した函数を定義し、その函数を使ったプログラムが正常に動作していた。

② @ viewマクロを使った最適化を行った。

③その途端に正常に動いていたプログラムが動かなくなった!😭

続く
#Julia言語 その原因は

function f(x::Vector{Float64}) ~ end

と函数の引数の型を Vector{Float64} に明示的に宣言してしまっていたことが原因です。その「@ viewによる最適化で動かなくなった」という問題は

function f(x) ~ end

に書き直せば解決しました。続く
Read 42 tweets
16 Mar
#Julia言語 Julia言語で10行

nbviewer.jupyter.org/gist/genkuroki…

(1/5) 二項分布モデル内の標本分布で測った95%信頼区間にモデルのパラメーター値が含まれる確率のプロット。95%以上になる。ほとんどのパラメーターで95%より真に大きい。
#Julia言語

nbviewer.jupyter.org/gist/genkuroki…

(2/5) 二項分布モデルの95%信頼区間 [CI_min, CI_max] を平面上の座標 (CI_min, CI_max) にプロット。丸の大きさはモデル内でその信頼区間が生じる確率の大きさに比例。赤の十字の左上側の領域ではパラメータの真の値が信頼区間に含まれている。
#Julia言語

nbviewer.jupyter.org/gist/genkuroki…

(3/5) 3次元のランダムウォーク
Read 54 tweets
16 Mar
#Julia言語

using Statistics, StatsBase
f(x) = (mean(x), geomean(x), median(x))
[∘(fill(f, n)...)((1, 1, 2, 3, 5)) for n in 30:35]

6-element Vector{~}:

(2.0890579497368598, 2.0890579497368598, 2.0890579497368598)


gist.github.com/genkuroki/e69a…

xkcd.com/2435/
#Julia言語

∘(fill(f, 4)...)((1, 1, 2, 3, 5))



f∘f∘f∘f(1, 1, 2, 3, 5)

と同じで、∘は函数の合成なので、

f(f(f(f(1, 1, 2, 3, 5))))

と同じ意味になる。

函数fのn個の合成は

∘(fill(f, n)...)

と書ける。Juliaを超高級電卓として使うときにはこれを知っているとちょっと便利。
#Julia言語 による解答例のスクショ

もとの問題文の数学的内容がほとんどそのままJuliaのコードに翻訳されていることがわかる。

難しいのはn個の函数fの合成が ∘(fill(f, n)...) と書けること。

φ(fill(f, 3)...)はφ(f, f, f) と同じ意味に、∘(f, g, h)(x,y)はf(g(h(x,y)))と同じ意味になる。
Read 6 tweets
16 Mar
NASAでは普通に #Julia言語 を使っているようですが、日本ではどうなっているんですかね?

Juliaの良い点をNASAがどのように活かしているか分かる動画


Modeling Spacecraft Separation Dynamics in Julia
Jonathan Diegelman
#Julia言語 あらためてNASA JuliaLangでググったら、こんな素敵な動画も見つかりました。


The Julia Language 1.0 Ephemeris and Physical Constants Reader for Solar System Bodies

github.com/JuliaAstro/JPL…
#Julia言語 NASA関連

Pluto.jl
DifferentialEquations.jl
Optim.jl
GlobalSensitivity.jl
MonteCarloMeaurements.jl
ComponentArrays.jl
Unitful.jl

などを使っているみたい。
Read 15 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!