必要ライブラリ : https://github.com/r1chardj0n3s/parse
ここで扱う、QASMの仕様について
QASMの一部の文法に対応して、さらに行列形式の独自拡張をしたものです。
対応するゲートは、CNOT,CZ,SWAP,I,X,Y,Z,H,S,Sdag,T,Tdag,sqrtX,sqrtXdag,RX,RY,RZ,U,U1,U2,U3,DenseMatrixです。
バージョン名はQulacsdQASM Q.9 としてあります。
ベースはqulacs2.0ですが、ゲートを定義する機能は利用できません。
Qubit名はq の配列のみ受け付けます。
一つのゲートに対して1行で記述してください。
非対応のゲートも、ゲート行列が取得できれば、DenseMatrixに変換されます。 逆に、ゲート行列が取得不可能なゲートを含む回路は対応していません。 DenseMatrixのcontrol_valueはすべて1にしてください。これは、qulacs 0.3.0にcontrol_valueを取得する関数がないのが原因です。
nビットの場合、 DenseMatrix(ターゲットビット数、コントロールビット数, 行列の内容 ,コントロールバリュー) ターゲット、コントロール; という風に書く。 例: DenseMatrix(2,1,0.707107,0,0,0,-0,-0.707107,0,0,0,0,0.707107,0,0,0,0,0.707107,-0,-0.707107,0,0,0.707107,0,0,0,0,0,0,0.707107,0,0,0.707107,0,1) q[0],q[1],q[2]; この場合、ターゲット2bitで、コントロール1bit。 そのあとはmat[0][0]の実数、虚数,mat[0][1]… のように続く32個の数が行列を表し、 そのあとはコントロールバリューを表す。 ターゲットビットはq[0]とq[1] コントロールビットはq[2]バリューは1 である。
標準のprint関数と同じです。
それを読みこみます。