量子コンピュータ
Q#

Q# とは

  • Microsoftが作成している量子プログラミング言語
  • とはいえ、生の量子ゲート操作を行う、回路シミュレータのような感じ
  • 例えるなら、AND / OR / NOT 回路を記述していくような言語っていう感じ
    • イメージ的にはVerilogとかがイメージ近い

Verilog(FPGA用言語ね)

module MY_XOR2(
  input IN_A , // 入力A
  input IN_B , // 入力B
  output O // 出力O
);

//---------------------------------------------------------
// XOR
//---------------------------------------------------------
wire IA; 
wire IB;
assign IA = IN_A & ~IN_B;
assign IB = ~IN_A & IN_B;
assign O = IA | IB;
endmodule

ではコードを見てみましょう


Q# でかく、量子テレポーテーション

    operation Teleport(msg : Qubit, there : Qubit) : () {
        body {

            using (register = Qubit[1]) {
                let here = register[0];

                H(here);
                CNOT(here, there);

                CNOT(msg, here);
                H(msg);

                if (M(msg) == One)  { Z(there); }
                if (M(here) == One) { X(there); }

                Reset(here);
            }

        }
    }

    // 関数宣言
    operation Teleport(msg : Qubit, there : Qubit) : () {

operation が量子計算操作、 function が古典的プログラミング操作


using (register = Qubit[1]) {
}

使用する量子ビットを確保する


let here = register[0];

確保した量子ビットを代入


   H(here);
   CNOT(here, there);
  • hereを重ね合わせの状態にする
  • here の状態によって、 there の状態が決定するようにしておく

    CNOT(msg, here);
    H(msg);

msgの状態によって、hereが変わるようにしている。


    if (M(msg) == One)  { Z(there); }
    if (M(here) == One) { X(there); }
  • M で量子を観測する!
  • そうすると、どうなるかというと・・・
    CNOT(msg, here);
    H(msg);
  • ここで、msgによってhereの状態を決定していて
   H(here);
   CNOT(here, there);
  • ここで、hereの状態によって thereの状態が決定していました。

つまり、

  • msgを観測することで、本来関係ない there の要素が決定する!!
  • (なんでZ回転 / X回転しているのかはわからん・・・)
    // 全然関係ない量子ビットなんだけど
    let here = register[0];

    // これを重ね合わせにして
    H(here);
    // この結果によってthereの値を変えるようにする
    // まだ観測していないから、結果はわからない
    CNOT(here, there);

    // そして、msgによって、hereの値を変えるようにする
    CNOT(msg, here);
    H(msg);

    // msg を観測すると、hereが決まる。 here が決まると、 there が決まる
    // という感じで、観測結果から連鎖的に値が決まっていく
    if (M(msg) == One)  { Z(there); }
    if (M(here) == One) { X(there); }

所管