RISC-V 量子拡張 (1. 定義を考える)

RISC-V量子拡張は, 「RiscV.RV32IU」として @k_yamaz 蛙 が提案しています.
(詳しくは, 技術ブログ Qiita に投稿した RISC-Vの量子計算拡張 をご参照ください. )
思いつきなどをメモしていきます.

RISC-Vの定義に, 量子計算拡張を追加することを考えます.
拡張ですから, 考えるのは“拡張命令”としてその拡張部分だけです.
まずは, この拡張の呼び方を考えます. 量子を示すのに都合がよさそうなQuantumの頭文字「Q」は「4倍浮動小数点」として予約されていますので使えません.
そこで量子計算に欠かせない「ユニタリ」を表す「U」の記号を当てて, 量子計算拡張は「U」として提案します.

RISC-V ISA U Extension (RISC-V 量子拡張)

とします.

RISC-V の定義は Haskell で書かれています. これに習って定義します.

量子レジスタ

1
2
3
4
5
data QRegister
= Q0
| Q1
--| Q2 | Q3 | Q4 | ... 必要とする数だけ QRegister を定義します
deriving (Show, Eq, Ord)

この量子レジスタが, どれくらいの個数必要なのかはわかりません.
ただし, 定義するだけであれば, ある程度の個数だけ定義することができます.

ユニタリ演算を表す命令セット

任意のユニタリ行列を近似的に表せる必要最低限の量子ゲートは, アダマールゲート, $\pi/8$ ゲート, 制御NOTゲートの3つでよいことが知られています.
そこで, これらの3つのユニタリ演算子と, 量子ビットを「初期化する」操作の QLEAR を定義します.

1
2
3
4
5
6
7
8
9
10
11
12
data QRegisterInstr =
QInstr !QOpcode
!CSRegister -- Control and Status Classical Register
!QRegister
deriving (Show, Eq, Ord)

data QOpcode
= QLEAR -- 量子ビットの初期化
| HADAM -- アダマール(Hadamard)ゲート
| TGATE -- π/8 ゲート(またの名は Tゲート)
| CNOT -- 制御NOTゲート(2量子ビット演算)
deriving (Show, Eq, Ord)

演算子の数を軽減するためには, 3つのユニタリ操作でよいとして必要最低限の種類を提供するだけよりは,
他のユニタリ操作も使えるように定義しておいた方がよいかもしれません.

候補としては 1〜3量子ビット演算までの量子ゲート操作がある方が良いかもしれません.
但し, これらを追加すると制御用のビット数も足らない可能性もあり, それに応じて CSRegister を引数に増やす必要があるかもしれません.

測定を表す命令セット

測定は, 上記の QRegisterInstr と同じように扱うことはできません.
なぜなら, QRegister を測定すると, その値が確定してしまいます.
その確定した値を読み出して, 古典レジスタ Register へ情報を移す必要があるからです.
つまり, QRegisterInstr とは違う QMeasurementInstr 型を定義することを考えなければなりません.
さらに測定も制御レジスタを使う前提もあり, 引数に CSRegister も含めて次のような定義とします.

1
2
3
4
5
data QMeasurementInstr =
MEASURE !CSRegister -- Control and Status Classical Register
!QRegister
!Register
deriving (Show, Eq, Ord)

この定義も一概にこれで良いのかは悩ましいです.
下記のように CSQRType とタイプを表す識別子を追加した方がよいかもしれません.
この方が「測定」だけでない他の操作を扱えるため, 汎用性がありそうです.

1
2
3
data CSQRType  = MeasureOneQubit | MeasureAll
data CSQRInstr =
CSQRInstr !CSQRType !CSRegister !QRegister !Register

この辺りもどのような定義がよいか, 今後の検討が必要になってきます.