Upgrade to Pro — share decks privately, control downloads, hide ads and more …

古典・量子ハイブリッドな高機能プログラミング言語の設計及び処理系の開発

terapoon
February 16, 2022

 古典・量子ハイブリッドな高機能プログラミング言語の設計及び処理系の開発

未踏ターゲット事業2021 成果報告会の資料です。
プロジェクトの概要は以下のリンクから閲覧できます。

Link: https://www.ipa.go.jp/jinzai/target/2021/gaiyou_fk-2.html

スライド中のデモ動画は以下のリンクから閲覧できます。
Link: https://www.youtube.com/watch?v=Dlt1ufYQZws

terapoon

February 16, 2022
Tweet

More Decks by terapoon

Other Decks in Programming

Transcript

  1. 古典・量子ハイブリッドな 高機能プログラミング言語の 設計及び処理系の開発 (2022/02/07 成果報告会) 平田 賢吾 (京都大学 数理解析研 M1)

    寺本 幸生 (東京大学 情報理工 CS専攻 M1) 米内 貴志 (株式会社 Flatt Security) 1
  2. 背景: 量子プログラミング 富岳 2 IBM Quantum IonQ Rigetti 古 典

    計 算 技 術 量 子 計 算 技 術 京 計算デバイス プログラミング言語 C++ Python Rust Go プログラム 記述 実行 古典デバイス同様、量子デバイス を利用する上でも量子プログラミ ング言語は必要
  3. 現状の量子プログラミング言語 3 低級 高級 ccx c[0], c[1], q[0]; x c[0];

    ccx c[0], c[1], q[1]; x c[1]; ccx c[0], c[1], q[2]; x c[0]; x c[1]; OpenQASM ✗ アセンブリ言語として設計 (原則プログラマは直接記述しない) ✗ 量子計算のみ記述可能 ❍ 実機動作が容易 (2017)
  4. 現状の量子プログラミング言語 4 ccx c[0], c[1], q[0]; x c[0]; ccx c[0],

    c[1], q[1]; x c[1]; ccx c[0], c[1], q[2]; x c[0]; x c[1]; if (c[0] && c[1]) { q[0] := X(q[0]); } else if (!c[0] && c[1]) { q[1] := X(q[1]); } else if (!c[0] && !c[1]){ q[2] := X(q[2]); } OpenQASM Silq 低級 高級 ❍ 古典-量子ハイブリッドな記述性 ❍ 量子非計算を隠蔽する設計 ❍ 型安全性によるプログラマの保護 △ 可読性(古典言語と比した場合) ✗ コンパイル不可(実機動作不可) (2017) (2020) ✗ アセンブリ言語として設計 (原則プログラマは直接記述しない) ✗ 量子計算のみ記述可能 ❍ 実機動作が容易
  5. 理想の量子プログラミング言語 5 ccx c[0], c[1], q[0]; x c[0]; ccx c[0],

    c[1], q[1]; x c[1]; ccx c[0], c[1], q[2]; x c[0]; x c[1]; match (c[0], c[1]) with | (1,1) -> q[0] := X(q[0]); | (0,1) -> q[1] := X(q[1]); | (0,0) -> q[2] := X(q[2]); | _ -> nop; OpenQASM if (c[0] && c[1]) { q[0] := X(q[0]); } else if (!c[0] && c[1]) { q[1] := X(q[1]); } else if (!c[0] && !c[1]){ q[2] := X(q[2]); } Silq 理想 ❍ 古典-量子ハイブリッド ❍ 自動量子非計算 ❍ 型安全性 ❍ より高い可読性 ❍ コンパイル可能(実機動作可) ❍ 古典-量子ハイブリッドな記述性 ❍ 量子非計算を隠蔽する設計 ❍ 型安全性によるプログラマの保護 △ 可読性(古典言語と比した場合) ✗ コンパイル不可(実機動作不可) 低級 高級 (2017) (2020) ✗ アセンブリ言語として設計 (原則プログラマは直接記述しない) ✗ 量子計算のみ記述可能 ❍ 実機動作が容易
  6. プロジェクト概要: 量子プログラミング言語 Qitten の開発 目標 ❍ ハイブリッドな記述 ❍ 自動量子非計算 ❍

    型安全性 ❍ 高い可読性 ❍ コンパイル可能 内容 古典-量子ハイブリッドな高機能言語 Qitten を設計・開発する 下図の塗りつぶし部分を作成する 6
  7. 言語設計 Rust ベースに作成 量子プログラム特有の要素 1. 量子ゲート操作 2. 測定 3. 量子

    if (式) fn main() { … let mut bit: qbool = qfalse; let bit = h(bit); … } fn h(mut bit: qbool) -> qbool { inline_qasm!(“Hadmard”, bit); bit } Qitten 量子ゲートを表す 特別な命令を用意 返り値は() 関数でラップして量子 ゲートライブラリのよ うに使用可能 ※ 量子ビットの型名はqbool qfalseは|0>を表す 7
  8. 言語設計 Rust ベースに作成 量子プログラム特有の要素 1. 量子ゲート操作 2. 測定 3. 量子

    if (式) fn main() -> bool { … let mut bit: qbool = qfalse; let bit: qbool = h(bit); … measure(bit) } Qitten コンパイラ実装の特別 な関数として用意 qbool -> bool の関数の ように扱う 8
  9. 言語設計 Rust ベースに作成 量子プログラム特有の要素 1. 量子ゲート操作 2. 測定 3. 量子

    if (式) fn main() { … qif flag { gates::X(targ) } …. } Qitten 制御付き量子操作に対応 (e.g. 制御ゲート) qif に続く表現の型は qbool qif のブロックの中で flag は使用できない qif は unit型 () を返り値にもつ式として扱う fn main() { … let mut n = 0; … qif flag { gates::X(targ); n = n + 1 } …. } Qitten ※ qif 内でのローカ ルでない古典変数 に対する代入、測 定は禁止する 9
  10. 言語設計 Rust ベースに作成 量子プログラム特有の要素 1. 量子ゲート操作 2. 測定 3. 量子

    if (式) fn main() { … qif flag1 { gates::Hadmard(targ) } else qif flag2 { gates::Y(targ) } …. } fn main() { … qif flag1 { gates::X(targ); qif flag2 { gates::Z(targ) } } else { gates::Y(targ) } …. } Qitten Qitten qif をネストさせること、qif を else で繋げることが可能 青で囲まれたブロック内の操作は2変数により制御された 量子操作に対応する qif のネストの例 else qif の例 10
  11. 内部のコンパイルフロー 11 文字列から実行ファイルまでの全行程

  12. Qitten の型システム fn main() { … let x : qbool

    = …; … let y = hadmard(x); let z = Rx_pi(x); … } Qitten 線形型システムを利用 Type Error: 変数 x は既に消費されています. • 量子複製不可能定理に基づき、量子状態の複製を禁止 • 一度 “消費” された変数は再使用できない H x y ? Rx(π ) 12
  13. 量子 if のコンパイル処理 cif A { プログラム1 } else {

    プログラム2 } 古典 if の場合 … A が true なら ブロック1へ A が false なら ブロック2へ … プログラム1を コンパイルしたもの 元のブロックへ プログラム2を コンパイルしたもの 元のブロックへ • どちらか一方のブロックが実行される • 並列に分岐させれば良い ブロック1 ブロック2 メインブロック 13
  14. 量子 if のコンパイル処理 qif A { プログラム1 } else {

    プログラム2 } 量子 if の場合 • A は量子制御ビット • 両方のプログラムが実行される • 直列に繋ぐ必要がある Aに対応する 量子ビット プログラム1 ※ イメージ図 プログラム2 14
  15. 量子 if のコンパイル処理 qif A { qif B { …

    量子ゲート1 量子ゲート2 … } } 量子 if の場合 • 量子 if のネストが深くなると制御ビットが多くなる • 量子ゲート一つ一つに対してこれを展開すると効率が悪い Aに対応する 量子ビット 量子ゲート1 ※ イメージ図 量子ゲート2 Bに対応する 量子ビット : : : : 最適化 補助ビットを導入してそこに制御条件をまとめる ことで、制御ビットの数を常に1に保つ 15
  16. 量子 if のコンパイル処理アルゴリズム (概要) qif A { プログラム1 qif B

    { プログラム2 } else { プログラム3 } プログラム4 } else qif C { プログラム5 } else { プログラム6 } [(A, true)] [(A, true), (B, true)] [(A, true), (B, false)] [(A, true)] [(A, false), (C, true)] [(A, false), (C, false)] 1. それぞれのスコープに対し、量子 的に制御している変数と制御の方法 (true or false) をスタックとして持つ。 量子制御のスコープに出入りするた びに情報を pop, push する。 [ ] [ ] スタック 16
  17. 量子 if のコンパイル処理アルゴリズム (概要) qif A { プログラム1 qif B

    { プログラム2 } else { プログラム3 } プログラム4 } else qif C { プログラム5 } else { プログラム6 } [(A, true)] [(A, true), (B, true)] [(A, true), (B, false)] [(A, true)] [(A, false), (C, true)] [(A, false), (C, false)] 2. プログラムが量子制御可能かど うかをチェックする。その後、 補助量子ビットを導入し、そこに 制御条件を一般化Toffoliゲートで 書き出す。 [ ] [ ] Aに対応する 量子ビット Bに対応する 量子ビット 補助量子ビット プログラムの 標的となる 量子ビット 17
  18. 量子 if のコンパイル処理アルゴリズム (概要) qif A { プログラム1 qif B

    { プログラム2 } else { プログラム3 } プログラム4 } else qif C { プログラム5 } else { プログラム6 } [(A, true)] [(A, true), (B, true)] [(A, true), (B, false)] [(A, true)] [(A, false), (C, true)] [(A, false), (C, false)] 3. プログラムをコンパイルし、量 子ゲートがあれば2で用意された補 助量子ビットを制御変数として制 御ゲートに変換する。 [ ] [ ] Aに対応する 量子ビット Bに対応する 量子ビット 補助量子ビット プログラムの 標的となる 量子ビット プログラム3 に含まれる 量子操作 18
  19. 量子 if のコンパイル処理アルゴリズム (概要) qif A { プログラム1 qif B

    { プログラム2 } else { プログラム3 } プログラム4 } else qif C { プログラム5 } else { プログラム6 } [(A, true)] [(A, true), (B, true)] [(A, true), (B, false)] [(A, true)] [(A, false), (C, true)] [(A, false), (C, false)] 4. 補助量子ビットを初期化する。 ※ 方法はいくつか考えられるが、Qitten ではスコープから出るタイミングで同じ 一般化Toffoliゲートを適用するという実 装になっている。 [ ] [ ] Aに対応する 量子ビット Bに対応する 量子ビット 補助量子ビット プログラムの 標的となる 量子ビット プログラム3 に含まれる 量子操作 19
  20. シミュレータについて シミュレーター シミュレーションの際は、中間表現まで落として それを用いて古典シミュレーションを行う。 20

  21. • 先行研究* をもとに実装する予定だったが、難航 線形型との整合性、プログラミング言語としての意味的な整合性、特定の基底への依存、など 量子非計算 (uncomputation) について 本プロジェクトでは量子非計算の実装はできなかった 結論 *

    [Bichsel, B., Baader, M., Gehr, T., & Vechev, M. (2020, June). Silq: A high-level quantum language with safe uncomputation and intuitive semantics. In Proceedings of the 41st ACM SIGPLAN Conference on Programming Language Design and Implementation (pp. 286-300).] 問題点 回路レベルでの設計 言語としての設計 Qitten への実装 最終報告書に問題点や回路レベルでの設計について、まとめて記載する予定 21
  22. デモ (ソースコードからIBMQ上での実行まで) 22

  23. 既存言語との比較 23 Silq Quipper Qitten 型システム 線形 線形でない 線形 非計算

    自動* + 隠蔽 自動 (明示的) なし 手続き or 関数 手続き 関数型 手続き ライブラリ なし Haskell のものを使える 今後整える ハイブリッド yes yes yes 量子 if がある yes no yes コンパイラ ない △ ある
  24. まとめ 古典・量子ハイブリッドな高級プログラミング言語Qittenを開発した - 高級かつハイブリッドな記述が可能な言語設計 - 実機での動作を可能にするコンパイラ - ローカルでテストするためのシミュレータ 利用者価値、社会的貢献価値 -

    初めて高級な文法を含むハイブリッド言語をコンパイルした - 量子プログラマの開発環境の改善、古典プログラマの量子プログラミングへ の参入障壁の低減に向けた第一歩を踏み出した 24
  25. 今後の展望 言語設計、コンパイラの拡張 - 文法の拡張 (パターンマッチ、バリアント、配列、etc…) - CFGレベルのプログラムに対する量子回路最適化の導入 - 自動量子非計算の導入 -

    量子アルゴリズムライブラリの整備 - インターフェースの改良 - シミュレーターの高速化 ユーザ or デベロッパー獲得へ向けた活動 - オープンソース化 - 研究会での発表や、量子人材育成活動との提携等 25