量子コンピューティングの基礎に精通したいと思います。
それに慣れるための良い方法は、非常に基本的な仮想量子コンピューター マシンを作成することです。私が理解していることから、単一量子ビットを実装する努力は、単純に複製して 2 量子ビット システムを実装することはできません。しかし、単一のキュービットを実装する方法もわかりません。
量子ビットを実装するにはどうすればよいですか? キュービットのセットを実装するにはどうすればよいですか?
量子コンピューティングの基礎に精通したいと思います。
それに慣れるための良い方法は、非常に基本的な仮想量子コンピューター マシンを作成することです。私が理解していることから、単一量子ビットを実装する努力は、単純に複製して 2 量子ビット システムを実装することはできません。しかし、単一のキュービットを実装する方法もわかりません。
量子ビットを実装するにはどうすればよいですか? キュービットのセットを実装するにはどうすればよいですか?
サンプルコード
シンプルだが機能するものから始めたい場合は、jsfiddle でこの基本的な量子回路シミュレーターをいじることができます(約 2,000 行ですが、そのほとんどは UI のもの [描画とクリック] と数学のもの [複素数と行列の定義] ]))。
州
量子コンピューターの状態は、振幅と呼ばれる一連の複雑な重みです。考えられる古典的な状態ごとに 1 つの振幅があります。量子ビットの場合、古典的な状態は、通常のビットが取り得るさまざまな状態です。
たとえば、3 ビットの場合、000
、001
、010
、011
、100
、101
、110
および111
状態の複素重みが必要です。
var threeQubitState = new Complex[8];
振幅は次の制約を満たす必要があります。振幅の 2 乗を合計すると、結果は 1 になります。古典的な状態は、1 つの振幅が振幅 1 で、他の振幅はすべて 0 に対応します。
threeQubitState[3] = 1; // the system is 100% in the 011 state
オペレーション
量子状態の操作では、古典的な状態間で振幅をフローすることによって振幅を再分配できますが、選択したフローは、すべてのケースで2 乗振幅加算 - 1 のプロパティを保持する必要があります。より技術的には、操作はユニタリ行列に対応する必要があります。
var myOperation = state => new[] {
(state[1] + state[0])/sqrt(2),
(state[1] - state[0])/sqrt(2),
state[2],
state[3],
state[4],
state[5],
state[6],
state[7]
};
var myNewState = myOperation(threeQubitState);
...そしてそれらが基本です。状態は単位 2 ノルムの複素数のリストであり、演算はユニタリ行列であり、状態を測定する確率は振幅の 2 乗です。
等
あなたがおそらく考慮する必要がある他のこと:
@Qwertie が引用する記事は、非常に優れた紹介です。これらをコンピュータに実装したい場合は、C ライブラリに洗練された量子操作を実装するlibquantumシミュレータで遊ぶことができます。この例を見て、コードの使用がどのようなものかを確認できます。
実際には答えはわかりませんが、キュービットについて読み始めるのに興味深い場所は、この記事です。絡み合った量子ビットがどのように機能するかについては詳しく説明していませんが、関連する複雑さを示唆しています。
量子ビットが 2 つだけでこれがどれだけ複雑になるかというと、3 つ、4 つ、または 100 の場合はどれくらい複雑になるでしょうか? N キュービット量子コンピューターの状態は、(4^N-1) 次元の空間内の点としてプロットされた場合にのみ完全に定義できることがわかりました。つまり、それをシミュレートするには、4^N 個の古き良き古典的な数が必要です。
これは最大空間の複雑さであることに注意してください。たとえば、15 キュービットの場合、約 10 億の数 (2^30=4^15) です。シミュレーションの時間の複雑さについては何も言いません。