はじめに
量子コンピュータでは状態ベクトルというベクトルを操作することで、ビット本体ではなく、組み合わせを操作することができます(????)
その際の操作方法としてZゲートやCZゲートを使うことで簡単に操作ができます。みてみます。ちょっとみにくいですが、[]は行列のかっこを表してるとします。
状態ベクトル
状態ベクトルは量子ビットの数に対応して、その組み合わせを状態として表記したものです。
例えば、2量子ビットは
[a] >>00
[b] >>01
[c] >>10
[d] >>11
のように、縦ベクトルの要素それぞれが、00,01,10,11のように組み合わせの数が対応します。
3量子ビットになると、
[a] >>000
[b] >>001
[c] >>010
[d] >>011
[e] >>100
[f] >>101
[g] >>110
[h] >>111
このように組み合わせの数は8通りとなり、状態ベクトルは量子ビットが1増えるごとに2倍の大きさになっていきます。その際に、この状態ベクトル自体を任意で操作できるのが量子コンピュータとなり、このような性質を使って認識回路を作ったりしてます。
状態ベクトルの準備
量子ビットは初期状態では全ての量子ビットの値は0です。表現される状態ベクトルは、
[1]
[0]
[0]
[0]
のように、特定のビットの組み合わせの要素が1になります。ちなみに状態ベクトルの要素の絶対値の2乗が対応するビットの組み合わせの出現確率に対応します。
上記は2量子ビットの初期状態のテンソル積となり、00が100%で出現すると読めます。
Hゲートを適用
アダマールゲートHを全ての量子ビットに適用することで、状態ベクトルを揃えることができます。
[1]
[1]
[1]
[1]
すべての状態ベクトルの要素を1にできます。これで準備完了です。
2量子ビットの際の状況見てみる
今回やりたいのは、ビットそのものの操作ではなく、ビットの組み合わせをビットと見立てて、それを操作するです。
それによって、2量子ビットだけで、4つの状態を作ることができて、さらにそれぞれの状態を操作することで、16パターンを作り出すことができました。
0000から1111は、状態ベクトルの、
[-1]
[-1]
[-1]
[-1]
から、
[1]
[1]
[1]
[1]
までの16パターンに対応します。0を-1に読み替えて、1と-1を任意で切り替えられればパターンが作り出せます。
Zゲート、CZゲートを使う。
ZゲートとCZゲートを使います。Zゲートは2*2のゲートです。
Z = [1 0]
[0 -1]
CZゲートは4*4のゲートです。コントロールビットとターゲットビットがあり、多少形が変わります。
CZ = [1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 -1]
早速順番にパターンを
簡単なものから順番にやってみます。
1111 bin(15)
1111は簡単です。初期状態の00の量子ビットの両方にHゲートをかけます。これは今回の初期状態に近いので、一番基本的な形です。10進数で15に対応します。
[1]
[1]
[1]
[1]
量子回路はこれだけ。
|0> --H--
|0> --H--
1110 bin(14)
これを作るには最後の量子ビットだけを-1にします。(0を-1に読み替え流必要があります)。これは簡単です。CZゲートそのものです。
[1 0 0 0] [1] = [ 1]
[0 1 0 0] [1] [ 1]
[0 0 1 0] [1] [ 1]
[0 0 0 -1] [1] [-1]
量子回路は、
|0> --H--*--
|
|0> --H--*--
どんどんいきます
1100 bin(12)
Zゲートを1番目の量子ビットにかけます。まずテンソル積というもので、Zゲートと単位行列Iを計算ののち、、、
[1 0]⊗[1 0] = [1 ]
[0 -1] [0 1] [ 1 ]
[ -1 ]
[ -1]
量子回路は、
|0> --H--Z--
|0> --H-----
1010 bin(10)
これはZゲートを2番目の量子ビットにかけます。こちらは、まずテンソル積というもので、単位行列IとZゲートを計算ののち、、、
[1 0]⊗[1 0] = [1 ]
[0 1] [0 -1] [ -1 ]
[ 1 ]
[ -1]
量子回路は、
|0> --H-----
|0> --H--Z--
1001 bin(9)
両方にZゲートかけます。
[1 0]⊗[1 0] = [1 ]
[0 -1] [0 -1] [ -1 ]
[ -1 ]
[ 1]
量子回路は、
|0> --H--Z--
|0> --H--Z--
1101 bin(13)
これは1100のパターンにCZかければいけそう
[1 ][ 1] = [ 1]
[ 1 ][ 1] [ 1]
[ 1 ][-1] [-1]
[ -1][-1] [ 1]
量子回路は、
|0> --H--Z--*--
|
|0> --H-----*--
1011 bin(11)
これは、1010にCZでいけそう。
[1 ][ 1] = [ 1]
[ 1 ][-1] [-1]
[ 1 ][ 1] [ 1]
[ -1][-1] [ 1]
量子回路は、
|0> --H-----*--
|
|0> --H--Z--*--
1000 bin(8)
これは1001にCZでいけそう
両方にZゲートかけます。
[1 ][ 1]
[ 1 ][-1]
[ 1 ][-1]
[ -1][ 1]
量子回路は、
|0> --H--Z--*--
|
|0> --H--Z--*--
0100 bin(4)
1000のパターンの最初の2つの状態ベクトルを入れ替えればいけそうです。2番目の量子ビットにXをかけます。
[1 0]⊗[0 1] = [0 1 ]
[0 1] [1 0] [1 0 ]
[ 0 1]
[ 1 0]
こちらを準備すれば、
[0 1 ][ 1]
[1 0 ][-1]
[ 0 1][-1]
[ 1 0][-1]
量子回路は、
|0> --H--Z--*-----|
|0> --H--Z--*--X--
0101 bin(5)
1010からいけそうです。1と0を入れ替えればOK
[0 1 ][ 1]
[1 0 ][-1]
[ 0 1][ 1]
[ 1 0][-1]
量子回路は、
|0> --H--------
|0> --H--Z--X--
0011 bin(3)
1100で、1と0を入れ替えればいけそう。
[0 1]⊗[1 0] = [ 1 0]
[1 0] [0 1] [ 0 1]
[1 0 ]
[0 1 ]
から、
[ 1 0][ 1]
[ 0 1][ 1]
[1 0 ][-1]
[0 1 ][-1]
量子回路は、
|0> --H--Z--X--
|0> --H--------
0111 bin(7)
1101をいれかえれば。。。
[ 1 0][ 1]
[ 0 1][ 1]
[1 0 ][-1]
[0 1 ][ 1]
量子回路は、
|0> --H--Z--*--X--
|
|0> --H-----*-----
0110 bin(6)
1001をいれかえれば、、、
[ 1 0][ 1]
[ 0 1][-1]
[1 0 ][-1]
[0 1 ][ 1]
量子回路は、
|0> --H--Z--X--
|0> --H--Z-----
0010 bin(2)
1000を並びかえれば、
[ 1 0][ 1]
[ 0 1][-1]
[1 0 ][-1]
[0 1 ][-1]
|0> --H--Z--*--X--
|
|0> --H--Z--*-----
0001 bin(1)
これも1000を並び替えれば、両方にXをかけると、
[0 1]⊗[0 1] = [ 0 1]
[1 0] [1 0] [ 1 0]
[0 1 ]
[1 0 ]
これより、
[ 0 1][ 1]
[ 1 0][-1]
[0 1 ][-1]
[1 0 ][-1]
回路は、
|0> --H--Z--*--X--
|
|0> --H--Z--*--X--
0000 bin(0)
多分0001にCZかければ、
[1 ][-1]
[ 1 ][-1]
[ 1 ][-1]
[ -1][ 1]
回路は、
|0> --H--Z--*--X--*--
| |
|0> --H--Z--*--X--*--
一通りできた
とりあえずできました。より効率的な形もあると思うので、探してみてください。パズルみたいで面白かったです。