스파스 시뮬레이터는 양자 상태 벡터의 스파스 표현을 사용합니다. 스파스 양자 상태는 진폭 계수의 대부분이 0인 상태입니다. 스파스 표현을 사용하면 스파스 시뮬레이터가 양자 상태를 나타내는 데 필요한 메모리 공간을 최소화할 수 있으므로 더 많은 수의 큐비트에 대한 시뮬레이션이 가능합니다. 스파스 시뮬레이터는 계산 기준으로 스파스인 양자 상태를 사용하는 프로그램에 효율적입니다. 스파스 시뮬레이터를 사용하면 전체 상태 시뮬레이터가 지수적으로 많은 수의 0 진폭에서 메모리와 시간을 낭비하기 때문에 사용자는 전체 상태 시뮬레이터보다 더 큰 애플리케이션을 탐색할 수 있습니다.
스파스 시뮬레이터에 대한 자세한 내용은 Jaques 및 Häner(arXiv:2105.01533)를 참조하세요.
스파스 시뮬레이터 호출
스파스 시뮬레이터는 Microsoft(퀀텀 개발 키트)에 대한 QDKVisual Studio Code(VS Code) 확장의 기본 로컬 시뮬레이터입니다. 스파스 시뮬레이터를 사용하는 방법은 개발 환경에 따라 달라집니다.
| 개발 환경 | 스파스 시뮬레이터를 호출하는 방법 |
|---|---|
| VS Code에서의 Q# 또는 OpenQASM 프로그램 | Q# 또는 OpenQASM 파일 실행 |
Python 프로그램과 qdk 라이브러리 사용 |
qsharp.run또는 openqasm.run또는 qiskit.QSharpBackend |
Notebook 셀에서 %%qsharp |
프로그램 진입 작업을 호출합니다. 예를 들어Main() |
스파스 시뮬레이터에 Pauli 노이즈를 VS Code에 추가하세요.
스파스 시뮬레이터는 VS Code 확장을 통해 Pauli 노이즈를 프로그램의 시뮬레이션에 Q# 추가할 수 있도록 지원합니다. 이 기능을 사용하면 양자 작업 및 측정에 대한 노이즈가 미치는 영향을 시뮬레이션할 수 있습니다. 프로그램에서 노이즈 모델을 Q# 지정하려면 함수를 ConfigurePauliNoise 사용합니다. 이 함수는 연산자Pauli, X, Y 및 Z 노이즈가 발생할 확률을 설정합니다. 확장 설정에서 전역 노이즈 모델을 구성할 수도 있습니다.
Pauli 노이즈를 추가하려면 VS Code 설정을 사용하십시오.
전역 Pauli 노이즈를 프로그램 내에서 설정하려면 QDK 확장의 Q#> 시뮬레이션:Pauli 노이즈 사용자 지정 설정을 구성합니다.
VS Code 내의 모든 프로그램에서 모든 게이트, 측정값, 큐비트의 히스토그램 결과에 Q# 노이즈 설정이 적용됩니다.
예를 들어 노이즈를 구성하지 않은 다음 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% 비트 전환 노이즈를 Hadamard 게이트에 설정하고, 그 다음 나머지 프로그램 부분에는 노이즈를 설정하지 않습니다.
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 |
시뮬레이션 중에 구성된 노이즈를 단일 큐비트에 적용합니다. | ...use q = Qubit[2];ConfigurePauliNoise(0.1, 0.0, 0.0);ApplyIdleNoise(q[0]);... |