読者です 読者をやめる 読者になる 読者になる

Brace, Paren, Semicolon.

脳科学を勉強しているエンジニアのようなもの

#maths4pg 「第6回 プログラマのための数学勉強会」にブログまとめ枠で参加してきた

f:id:oimou:20160320190725j:plain

プログラマのための数学勉強会に参加してきました。

自分はブログまとめ枠ということなので、勉強会の内容をまとめていきたいと思います。 感想をまとめるにあたって参考にしたサイトや資料のリンクを貼っていますが、必ずしも発表者の方がプレゼン中に使った資料ではありませんので、ご了承くださいませ。 詳細な内容については、公開される資料や動画を見ていただくのが良さそうです。

Togetterはこちらにまとめていただいているようです。

発表内容

f:id:oimou:20160319131241j:plain

「心地よさと数学」矢崎 裕一

図形やアニメーションから生み出される「心地よさ」の裏には数学が潜んでいます。 そんな数学の考え方について、ビジュアライゼーションという切り口から紹介されていました。

データビジュアライゼーションでは「データ」をいかにして「実体化」するかがカギとなります。 つまり、目的にあわせてデータを視覚的要素(図形や色など)にマッピングしていく作業が、まさにデータビジュアライゼーションなのです。ビジュアル変数の考え方は下記の記事にもありますね。

個人的には、ソル・ルウィットというアーティストの事例が印象に残りました。

ソル・ルウィットのアートの形式の1つに、ウォールドローイングがあります。 彼は作品を作り上げる際に、自分で壁に作品を描くのではなく、作品を描くための指示書をドラフトマンと呼ばれる第三者に渡し、ドラフトマンに描かせるそうです。 D3.jsでも、予め決められたプログラムにデータを流し込んで「データドリブン」な可視化をするという考え方があります。両者の考え方には近いものがありそうですね。

すでに完成していると思われるものを疑い、心地よさって何だろう、というポイントに立ち返って考えてみるのが重要だということです。

「数学がデジタルアートに! 高速なシェーダで可視化する数学の世界」@h_doxas

doxas氏はWebGL関連の活動を精力的に続けていらっしゃる方で、WebGL開発支援サイトなども運営されています。 自分もWebGLの基礎を学んだのはこのサイトでした。

WebGLを使うと、GPUパワーを活用して高速な可視化ができるようになります。 今回はシェーダとGLSLを用いた可視化について、ライブコーディングと共に紹介されていました。

GLSL editorというGLSLエディタツールを開発されたそうで、ブラウザ上で簡単にGLSLを書いて試すことができます。

エディタを開くと、初期状態ではジュリア集合の可視化コードが動くようになっています。 こんなにヘビーな可視化でも、シェーダを使えばサクサク動かすことができるというのは素晴らしいですね。

最近はモバイル端末でもWebGLが動くようになっており、誰でもすぐに作品を見られるようになっています。 数学の教育コンテンツの1つとして、WebGLを用いた可視化が広まっていくと良いですね。

GLSL editorを使ったチュートリアルもQiitaで紹介されています。

「Wolfram Language コトハジメ 〜 Wolfram Alpha って聞いたことあります?」若林 登

Mathematicaは科学技術計算などの分野で広く使われている数式処理システムです。 そのMathematicaに命令を伝えるための言語がWolfram Languageであり、数多くの関数が実装されています。

科学技術計算のためのもう少しカジュアルな環境として、Pythonでnumpyやscipyを使っている人は多いのではないでしょうか。 Pythonと比較すると、Wolfram Languageは予め用意されている関数の数が桁違いに多いです。 あまりにも関数が多すぎて全てを記憶しておくのは困難だそうですが、その分特殊な計算でも短い記述で済ませられるので、本質的な記述にフォーカスできて思考の邪魔をしないというメリットがあります。 プログラミングの道具というよりは数学的思考の道具という位置づけなんでしょう。

Wolfram Alphaというサービスを使うと、Wolfram Languageを少しだけ(とはいってもかなりインテリジェントで驚きますが)試してみることができます。試しに"cheeseburger"などと入力してみると、チーズバーガーの栄養価などの数値情報が返ってきます。

Pythonスクリプト形式でソースコードを記録するのとは対照的に、Mathematicaでは「ノートブック」という形式で思考と実証の過程を記録していきます。思考の過程を記録するというコンセプトは個人的に興味深いですね。 ちなみにPythonでも、IPython Notebookというものを使うとノートブック形式の記録ができるようになります。

「暗号文のままで計算しよう - 準同型暗号入門 -」光成 滋生

光成氏は「午後のこ〜だ」や暗号技術関連の著作で有名な方です。最近だと「クラウドを支えるこれからの暗号技術」などの書籍を出していらっしゃいます。 これはつい最近読んだばかりだったので、こんな所で著者にお会いできるとは驚きました。

「データを暗号化されたまま計算できる!」という触れ込みでにわかに盛り上がっている準同型暗号ですが、 実際にはどのような原理になっているのか、デモを交えて紹介されていました。

準同型暗号は、ある代数系の数学的構造が写像によって維持されるという性質を用いた暗号方式です。 データが暗号化された状態でも加算を行うことができ、データの機密性を保持したまま計算処理ができるため、センシティブデータを扱うビッグデータ解析などへの活用が期待されています。 有名なものには、楕円曲線上の離散対数問題による困難性を用いた楕円曲線暗号などがありますね。

加法準同型暗号は加算のみ行うことができますが、更に乗算も行うことができる完全準同型暗号(Fully Homomorphic Encryption)というものが研究されています。 完全準同型暗号は、数学用語で言うと環準同型の性質を利用した暗号であり、平文と暗号文の両方が環になるようになっています。 しかし、今はまだ実用に耐えうるレベルの完全準同型暗号は出てきておらず、たった1bitの平文を暗号化するにも1GBの暗号文に膨れ上がってしまうということでした。 (ただし、制限付きで加算・乗算ができるSomewhat準同型暗号というものがあり、こちらはもう少し実用的のようです)

加算と乗算さえできれば全ての関数が実装可能になるため、実用的な完全準同型暗号ができれば更にセンシティブデータの解析が捗ることでしょう。

圏論Haskellは仲良し」大森 健児

大森氏は法政大学の教授をされている方です。まさか大学教授の方まで登壇されているとは! 「圏論Haskellは仲良し」という(大森氏によると「艶めかしい」)タイトルですが、 Haskellを使うと数学的な表現がしやすいというお話をされていました。

圏論は、数学の中でも最も抽象的な分野で、理解するのが非常に難しい分野でもあります。 しかし大森氏自身は68歳になってから圏論を学んだということで、何事も学び始めるのに遅すぎるということは無いんだなあと思い知らされます。 圏論に入門するには「自分の得意分野が圏でどう表現されているか?」というところから始めると分かりやすいとのこと。

Haskellには圏論の考え方が一部取り入れられており、その中に有名な関手(Functor)やモナドがあります。 また、Haskell(というか関数型プログラミング言語)の宣言的なシンタックスも、数学的な表現を容易にしてくれます。 命令的プログラミング言語は「どうするか(How)」でプログラムを記述しますが、宣言的プログラミング言語は「どういうものか(What)」でプログラムを記述するという違いがあります。

オススメ資料として、関手的データモデルで個人的に話題になったDavid Spivak氏の著書が紹介されていたので、リンクを貼っておきます。

LT

f:id:oimou:20160320191137j:plain

LT枠がこれまた濃ゆくて、話についていくのが精一杯でした。

√2をつくる @taketo1024

Swift演算子オーバーロードを利用し、代数的数である√2を定義するという試みです。 Swiftがこういう使い方をされるのは意外でしたが、言語の性質を考えると確かに適役かもしれない! 詳細はこちらのリンクから。

実践Scalaペアノの公理 @busterdayo

自然数の公理であるペアノの公理Scalaの型システムを用いて実装したという話です。 数学的にInvalidな計算がコンパイルエラーを返してくれるのは良いですね。Lintツールとしてあると便利そうです。

せいほうけい育成日記 @nekonenene

多角形を使ってフラクタルを作り上げるゲームを作ったという話です。 生SVGの操作が大変そうでした。Snap.jsとか使うと良いかもしれないですね。あるいはシェーダを!

packing にまつわるアレコレ @simizut22

微分幾何の知識がなさすぎてほとんど何も理解できませんでした\(^o^)/ リーマン幾何を学んで出直します。

Introducing PONS @dankogai

Swiftにおいて任意精度計算や複素数を扱うためのライブラリだそうです。 JavaのBigIntegerやRubyのprimeにも近いでしょうか。Swift人気ですね。

すべての図形を分類した男 @matsumoring

ナチュラルにジョジョ立ちする男すべての図形を分類した男、ルネ・トムの遺した功績についてです。 多様体の関係に「コボルダント」という関係を定義して分類できるようにしたということです。

かんたんベジェ曲線 @butchi_y

ベジェ曲線は通常は媒介変数表示で定義されますが、これを陽関数の形で表してプロットしてみたそうです。 4点以上の制御点を持つベジェ曲線はあまり使われていないらしいですね。確かに見たことがない。

ベータ分布の謎に迫る @kenmatsu4

ベータ分布とは一体どんな事象に当てはまる分布なのかという謎に迫ります。 ベータ分布は順序統計量と関わりが深く、ベイズ統計の分野でよく使われるそうです。バイオインフォマティクスでも使われる基本的な分布なので、個人的に結構アツいです。

始代数とCatamorphism Ryo Mikami

関数型プログラミング言語で言うところのfoldの考え方についての話です。 HaskellFRPライブラリreactive-bananaがなぜバナナなのか分かりました。

まとめ

色々な分野から150人近い参加者が集まり、数学を軸にした様々なテーマの発表を聞くことが出来るというのは非常に貴重な機会でした。 勉強会の主催を続けていらっしゃる佐野さんに感謝です!