スパース シミュレーターは、量子状態ベクトルのスパース表現を利用します。 スパース量子状態は、振幅係数の大部分がゼロである状態です。 スパース表現を使用すると、スパース シミュレーターは量子状態を表すために必要なメモリ占有領域を最小限に抑えることができます。これにより、より多くの量子ビットに対するシミュレーションが可能になります。 スパース シミュレーターは、計算ベースで疎な量子状態を持つプログラムに対して効率的です。 スパース シミュレーターを使用すると、フルステート シミュレーターは指数関数的に多くのゼロ振幅でメモリと時間を無駄にするため、フルステート シミュレーターよりも大きなアプリケーションを探索できます。
スパース シミュレーターの詳細については、 Jaques と Häner (arXiv:2105.01533) を参照してください。
スパース シミュレーターを呼び出す
スパース シミュレーターは、Microsoft (Quantum Development Kit) の QDKVisual Studio Code (VS Code) 拡張機能の既定のローカル シミュレーターです。 スパース シミュレーターの使用方法は、開発環境によって異なります。
| 開発環境 | スパース シミュレーターを呼び出す方法 |
|---|---|
| あるQ#またはOpenQASMのプログラムでは、VS Code | Q#またはOpenQASM ファイルを実行する |
Python ライブラリを使用した qdk プログラム内 |
qsharp.runまたは openqasm.runまたは qiskit.QSharpBackend |
%%qsharp ノートブック内のセル |
プログラム入力操作を呼び出します。次に例を示します。Main() |
スパース シミュレーターに Pauli ノイズを追加する VS Code
スパース シミュレーターでは、Pauli プログラムのシミュレーションにQ# ノイズを追加し、VS Code拡張機能を使用できます。 この機能を使用すると、量子演算と測定に対するノイズの影響をシミュレートできます。
Q# プログラムでノイズ モデルを指定するには、ConfigurePauliNoise関数を使用します。 この関数は、ノイズの発生Pauli、X、およびYZ演算子の確率を設定します。 拡張設定でグローバル ノイズ モデルを構成することもできます。
Pauli設定VS Code使用してノイズを追加する
PauliでQ#プログラムのグローバルVS Codeノイズを設定するには、Q#> Simulation:Pauli Noise ユーザー設定をQDK拡張機能用に構成します。
ノイズ設定は、Q#のすべてのVS Codeプログラムのすべてのゲート、測定、および量子ビットのヒストグラム結果に適用されます。
たとえば、ノイズが構成されていない次の GHz サンプル プログラムのヒストグラムは、約半分の測定値の場合は $\ket{00000}$、残りの半分は $\ket{11111}$ の結果を示します。
import Std.Diagnostics.*;
import Std.Measurement.*;
operation Main() : Result []{
let num = 5;
return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
H(qs[0]);
ApplyCNOTChain(qs);
let results = MeasureEachZ(qs);
ResetAll(qs);
return results;
}
ビット フリップ ノイズ レートを 1% 追加しても、結果は拡散し始めます。 ビット フリップ ノイズ% 25 個の場合、ヒストグラムは純粋なノイズと区別できません。
個々のPauli プログラムにQ#ノイズを追加する
ConfigurePauliNoise関数を使用して、個々のQ# プログラムのノイズ モデルを設定または変更します。
ConfigurePauliNoise関数を使用すると、Q# プログラムでノイズが発生するタイミングと場所を制御できます。
注
VS Code設定でノイズを構成した場合、ノイズはすべてのQ#プログラムに適用されます。 ただし、 ConfigurePauliNoise 関数は、関数を呼び出すプログラムの VS Code ノイズ設定をオーバーライドします。
たとえば、前のプログラムでは、量子ビットの割り当ての直後にノイズを追加できます。
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
// 5% bit-flip noise applies to all operations
ConfigurePauliNoise(0.05, 0.0, 0.0);
H(qs[0]);
ApplyCNOTChain(qs);
let results = MeasureEachZ(qs);
ResetAll(qs);
return results;
}
または、測定操作のみにノイズを追加できます。
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
H(qs[0]);
ApplyCNOTChain(qs);
// Noise applies to only the measurement operation
ConfigurePauliNoise(0.05, 0.0, 0.0);
let results = MeasureEachZ(qs);
ResetAll(qs);
return results;
}
プログラムのさまざまなポイントでノイズ構成を変更またはクリアするには、 ConfigurePauliNoise を複数回呼び出します。 たとえば、ハダマード ゲートに 5% のビット フリップ ノイズを設定し、プログラムの残りの部分にはノイズを設定しないことができます。
operation GHzSample(n: Int) : Result[] {
use qs = Qubit[n];
// Noise applies to the H operation
ConfigurePauliNoise(0.05, 0.0, 0.0);
H(qs[0]);
// Clear the noise settings
ConfigurePauliNoise(0.0, 0.0, 0.0);
ApplyCNOTChain(qs);
let results = MeasureEachZ(qs);
ResetAll(qs);
return results;
}
その他の Q# ノイズ機能
ConfigureNoiseFunction関数は、プログラム内の任意の種類のPauliノイズをモデル化するのに十分ですが、Q#には、使用できる他のノイズ関数もあります。
Std.Diagnostics ライブラリでは、Q# プログラムのノイズを構成するために、次の関数を使用できます。
| 機能 | Description | Example |
|---|---|---|
ConfigurePauliNoise |
シミュレーター実行のためにPauliノイズを構成します。 パラメーターは、X、Y、Z ゲート Pauli ノイズの確率を表します。 ノイズ構成は、 Q# プログラム内の後続のすべてのゲート、測定、および量子ビットに適用されます。
VS Code拡張ノイズ設定をオーバーライドします。
ConfigurePauliNoiseへの後続の呼び出しは、前の呼び出しによって設定されたノイズをオーバーライドします。 |
ConfigurePauliNoise(0.1, 0.0, 0.5)または ConfigurePauliNoise(BitFlipNoise(0.1)) |
BitFlipNoise |
指定した確率で X ゲート ノイズのみを構成します。 | 10% ビット フリップ ノイズ:ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0) |
PhaseFlipNoise |
指定した確率で Z ゲート ノイズのみを構成します。 | 10% 位相反転ノイズ:ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1) |
DepolarizingNoise |
確率が等しい X、Y、または Z ゲートになるようにノイズを構成します。 | 6% 脱分極ノイズ:ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2) |
NoNoise |
ノイズなしの状態にノイズモデルをリセットします。 |
ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0) |
ApplyIdleNoise |
シミュレーション中に構成済みのノイズを 1 つの量子ビットに適用します。 | ...use q = Qubit[2];ConfigurePauliNoise(0.1, 0.0, 0.0);ApplyIdleNoise(q[0]);... |