Skip to content
This repository was archived by the owner on Aug 21, 2024. It is now read-only.

Commit

Permalink
Add tests for the last two tasks.
Browse files Browse the repository at this point in the history
  • Loading branch information
kurabirko committed Oct 12, 2021
1 parent 4db4659 commit 776dd9e
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 12 deletions.
6 changes: 3 additions & 3 deletions KeyDistribution_E91/KeyDistribution_E91.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@
{
"cell_type": "markdown",
"source": [
"#### Task 3.1 CHSH Correlation Check\n",
"#### Task 3.1 CHSH Correlation Value\n",
"\n",
"**Inputs:**\n",
"1) `basesAlice`: Alice's measurement bases indices,\n",
Expand All @@ -293,9 +293,9 @@
"cell_type": "code",
"execution_count": null,
"source": [
"%kata T31_CorrelationCheck\n",
"%kata T31_CorrelationValue\n",
"\n",
"function CorrelationCheck(basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {\n",
"function CorrelationValue(basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {\n",
" // ...\n",
"\n",
" return 0.0;\n",
Expand Down
8 changes: 4 additions & 4 deletions KeyDistribution_E91/ReferenceImplementation.qs
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ namespace Quantum.Kata.KeyDistributionE91 {
// Part III. Eavesdropping
//////////////////////////////////////////////////////////////////

// Task 3.1 CHSH Correlation Check
function CorrelationCheck_Reference (basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {
// Task 3.1 CHSH Correlation Value
function CorrelationValue_Reference (basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {
mutable expectationValues = new Double[0];

for (i, j) in [(1,2), (1, 4), (3, 2), (3, 4)] {
Expand Down Expand Up @@ -172,7 +172,7 @@ namespace Quantum.Kata.KeyDistributionE91 {

// Eve eavesdrops on all qubits, guessing the basis at random
for (qAlice, qBob) in Zipped(qsAlice, qsBob) {
let _ = Eavesdrop_Reference(qAlice, qBob, DrawRandomInt(1,2));
let _ = Eavesdrop_Reference(qAlice, qBob, DrawRandomInt(2,3));
}

// 2. Alice and Bob choose random measurement bases
Expand All @@ -190,7 +190,7 @@ namespace Quantum.Kata.KeyDistributionE91 {
Message($"Bob's Key: {keyBob}\n");

// 5. Compute the CHSH correlation value
let s = CorrelationCheck_Reference(basesAlice, basesBob, resultsAlice, resultsBob);
let s = CorrelationValue_Reference(basesAlice, basesBob, resultsAlice, resultsBob);
Message($"S = {s}");

// Reset all qubits to |0⟩
Expand Down
4 changes: 2 additions & 2 deletions KeyDistribution_E91/Tasks.qs
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ namespace Quantum.Kata.KeyDistributionE91 {
// Part III. Eavesdropping
//////////////////////////////////////////////////////////////////

// Task 3.1. CHSH Correlation Check
function CorrelationCheck(basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {
// Task 3.1. CHSH Correlation Value
function CorrelationValue(basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {
// ...

return 0.0;
Expand Down
46 changes: 43 additions & 3 deletions KeyDistribution_E91/Tests.qs
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,53 @@ namespace Quantum.Kata.KeyDistributionE91 {
//////////////////////////////////////////////////////////////////

@Test("QuantumSimulator")
function T31_CorrelationCheck() : Unit {
// ...
operation T31_CorrelationValue() : Unit {
let N = 10;
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
EntangledPairs_Reference(qsAlice, qsBob);

for (qAlice, qBob) in Zipped(qsAlice, qsBob) {
let _ = Eavesdrop_Reference(qAlice, qBob, DrawRandomInt(2,3));
}

let basesAlice = RandomBasesArray_Reference([1,2,3], N);
let basesBob = RandomBasesArray_Reference([2,3,4], N);

let resultsAlice = MeasureQubitArray_Reference(qsAlice, basesAlice);
let resultsBob = MeasureQubitArray_Reference(qsBob, basesBob);

let actual = CorrelationValue(basesAlice, basesBob, resultsAlice, resultsBob);
let expected = CorrelationValue_Reference(basesAlice, basesBob, resultsAlice, resultsBob);

Fact(actual == expected, $"Correlation value {actual} does not match the expected value {expected}.");

ResetAll(qsAlice + qsBob);
}

@Test("QuantumSimulator")
operation T32_Eavesdrop() : Unit {
// ...
for basisIndex in 2..3 {
use (qAlice, qBob) = (Qubit(), Qubit());
EntangledPairs_Reference([qAlice], [qBob]);

let (r1, r2) = Eavesdrop(qAlice, qBob, basisIndex);

// Make sure entanglement was not disturbed until measurement
Fact(r1 == r2, "Measurement outcomes do not match for given qubits.");

for q in [qAlice, qBob] {
let rotationAngle = PI() * IntAsDouble(basisIndex - 1) / 4.0;

// Make sure of the wavefunction collapse
within {
Ry(rotationAngle, q);
} apply {
AssertQubitWithinTolerance(r1, q, 1e-5);
}
}

ResetAll([qAlice, qBob]);
}
}

}

0 comments on commit 776dd9e

Please sign in to comment.