ScalaMatsuriで量子コンピュータ系の発表をしてきました＆補足とか

[ScalaMatsuri 2018](http://2018.scalamatsuri.org/)で、量子コンピュータの簡易シミュレータを作りましたよーという発表をしてきました。
ScalaMatsuriは2014年の初回から参加していて、その刺激を受けて今のエンジニアとしての自分がいたりするので、前回の帰る道すがら今度は発表者側に立ちたいなーと憧れ半分お返し半分の気持ちを抱いたのを覚えています。そのため発表機会いただけて嬉しかったです。ありがとうございました。

# 発表したこと

[<img width="640" alt="lets-simulate-a-quantum-computer-with-pretty-scala" src="https://qiita-image-store.s3.amazonaws.com/0/55208/56de5c56-f3f6-5864-0331-53aec7050b44.jpeg">](https://www.slideshare.net/TaokatomoTorigoe/lets-simulate-a-quantum-computer-with-pretty-scala)
[量子コンピュータをScalaでかわいくシミュレーションしてみよう | SlideShare](https://www.slideshare.net/TaokatomoTorigoe/lets-simulate-a-quantum-computer-with-pretty-scala)

発表内容は、右上の量子フーリエ変換回路をそのまま左上のScalaコードとして実装するというお題で、Scalaにおける数値計算DSLのテクニックを紹介していった感じです。これはかわいいですね！　かわいくない？
作ったライブラリは、Qlioneというかわいい名前でGitHubに公開しているので、よかったら覗いたり遊んだりしてみてください。
[Qlione | GitHub](https://github.com/piyo7/qlione)

# 聴いてくださった方々のメモ

だいぶスライド切り詰めたつもりではありましたが、40分枠で量子コンピュータにおける計算モデルの紹介から始めたため、わりと駆け抜ける発表になってしまったかと思います。
そのため独りよがりになってないか不安だったのですが、Twitterとかの反応を見てる感じ、要所きちんと伝わっていたみたいで一安心です。というか、皆様メモ力高い……！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/ScalaMatsuri?src=hash&amp;ref_src=twsrc%5Etfw">#ScalaMatsuri</a> <a href="https://twitter.com/hashtag/sm_c?src=hash&amp;ref_src=twsrc%5Etfw">#sm_c</a><br>ありがとうございました！<br>勉強になりました。 <a href="https://t.co/ItBRPhHkUz">pic.twitter.com/ItBRPhHkUz</a></p>&mdash; zuv (@zuvizudar) <a href="https://twitter.com/zuvizudar/status/974827522092277760?ref_src=twsrc%5Etfw">2018年3月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[ScalaMatsuri 2018 1日目 備忘録](https://qiita.com/mopinfish/items/573fcad26b37ba1d9398)
[量子コンピュータをScalaでかわいくシミュレーションしてみよう♪ のメモ](https://scrapbox.io/yakimelon/%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%92Scala%E3%81%A7%E3%81%8B%E3%82%8F%E3%81%84%E3%81%8F%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E2%99%AA_%E3%81%AE%E3%83%A1%E3%83%A2)

# いくつか補足

## 量子コンピュータ

量子コンピュータは方式がいくつかあって、今回ネタにしたのはゲート方式です。昔から知られている汎用的なものですね。
対して、離散最適化に特化しているアニーリング方式については「[Recursive Schemeを用いた量子アニーリングマシン専用言語(DSL)の開発](http://2018.scalamatsuri.org/ja/candidates/KotaroTanahashi_YoshihitoHotta_1/)」というLTがありました。
量子コンピュータは話題になれど、まだまだ研究段階のマニアックな技術だと思うのですが、2018年に枠2つも用意してくれるScalaMatsuriは懐深いなぁと思います。

## 型レベルプログラミング

型レベル自然数の実装手法は、おおむね[Shapeless](https://github.com/milessabin/shapeless)から借りてきました。今回はそれを雑にOption化しています。
ちなみに型レベルプログラミングは面白くて便利なのですが、やはり底知れない沼です。昔、C++の[Boost.Units](https://boostjp.github.io/tips/units.html)みたいな次元型ライブラリを作ろうとしたことがあるのですが、型レベルMapの実装途中に匙を投げました。
Scalaは言語として依存型をサポートしているわけではないので、型レベル型も型レベル値も型としてエンコーディングして、その関係性を継承関係で扱うわけですが、じゃあ型レベル型パラメータの変位とかどうなるの、とか考えだすと頭がおかしくなります。
ということでScalaで型レベルプログラミングするときは、欲しいものを欲しいぶんだけ実装して汎用性は目指さない、というスタイルをお勧めします……。

## 行列計算

疎行列のデータ構造も今回はさくっとMapで済ませましたが、パフォーマンス出したいなら[BLAS](http://www.netlib.org/blas/)や[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)などの線形代数ライブラリを使うべきです。Scalaだと、[Breeze](https://github.com/scalanlp/breeze/)がありますね。
今回使っていないのは、全て自前で用意することで実装の透明性を高くしたかったからです。それに、いくら古典コンピュータで頑張っても、どうせ量子ビット数増えたらシミュレーションできないですからね（ぁ

## パイプライン演算子

パイプライン演算子 `|>` ですが、これはF#やElixirにある記号を借りてきたもので、最近ではJavaScriptでも提案されているみたいです。
[パイプライン演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Pipeline_operator)

## かわいさ

なぜ発表タイトルで「かわいい」なんてフレーズを入れたかというと、これは元チームメンバーの影響だったりします。
その方はよく「このライブラリかわいくないですか？」「このコードはかわいくないので作りなおしたい！」なんて言っていて、とてもいい表現だなぁと感心していました。ソフトウェアは論理的な世界ですが、それにも増して感覚的な筋の良さというものが重要です。ただ、そのあたりの話は唯一の正解があるわけではないため、いわゆる不毛な宗教戦争になりやすいのですが、その点「かわいい」という言葉は「私はこれを良いと信じているけれど、それを貴方に押し付けるつもりはないよ、でも共感してくれたら嬉しいな」というニュアンスを含意している気がして、素敵だなぁと思うのです。

# いままでのあらすじ

実は、今回発表したテクニックたちは、これまでQiitaに投稿してきたものの集合体だったりします。
投稿はじめて3年半になりますが、身になってるんだなぁ……と少し感慨にふけってみたり。

[Scalaで高速フーリエ変換の簡易実装](https://qiita.com/piyo7/items/d942c6e15c988bb5fa9f)
[コンパイル時に型レベルで整数を四則演算してみた](https://qiita.com/piyo7/items/1216ad44cae2b2aacece)
[型に数値を埋めこんでみよう](https://qiita.com/piyo7/items/5df3ad7e53216df5f65f)
[シミュレータ開発のプラクティス](https://qiita.com/piyo7/items/58a3b062683462ca178e)
[おてがる単位型パターン　〜不正な単位演算はコンパイルエラーにしよう〜](https://qiita.com/piyo7/items/df002e4fa9ec832ea0a2)
[量子コンピュータでフーリエ変換すると高速フーリエ変換より高速な件](https://qiita.com/piyo7/items/d6f95876c7ec0188f991)
[Scalaでも量子計算がしたい！　〜のでブラケット演算のDSLを作ってます〜](https://qiita.com/piyo7/items/0d029b90601c85fd1c6f)