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

Commit

Permalink
Make reference implementations refer to each other
Browse files Browse the repository at this point in the history
  • Loading branch information
kurabirko committed Sep 30, 2021
1 parent 50c1661 commit f08cc68
Showing 1 changed file with 22 additions and 25 deletions.
47 changes: 22 additions & 25 deletions KeyDistribution_E91/ReferenceImplementation.qs
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,19 @@ namespace Quantum.Kata.KeyDistributionE91 {
return bases;
}


// Task 2.2 Measure Qubit Arrays
// Task 2.3 Measure Qubit Arrays
operation MeasureQubitArray_Reference (qs: Qubit[], basesIndices: Int[]) : Result[] {
// ...

mutable results = new Result[0];

for (q, b) in Zipped(qs, basesIndices) {
set results += [RotateAndMeasure(q,b)];
let outcome = RotateAndMeasure_Reference(q,b);
set results += [outcome];
}

return results;

}

// Task 2.3 Generate the shared key
// Task 2.4 Generate the shared key
function GenerateSharedKey_Reference (basesAlice: Int[], basesBob: Int[], results: Result[]) : Bool[] {
mutable key = new Bool[0];

Expand All @@ -98,19 +95,19 @@ namespace Quantum.Kata.KeyDistributionE91 {
// 1. Alice and Bob are distributed arrays of entangled pairs
let N = 10;
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
EntangledPairs(qsAlice, qsBob);
EntangledPairs_Reference(qsAlice, qsBob);

// 2. Alice and Bob choose random measurement bases
let basesAlice = RandomBasesArray([1,2,3], N);
let basesBob = RandomBasesArray([2,3,4], N);
let basesAlice = RandomBasesArray_Reference([1,2,3], N);
let basesBob = RandomBasesArray_Reference([2,3,4], N);

// 3. Measurements by Alice and Bob
let resultsAlice = MeasureQubitArray(qsAlice, basesAlice);
let resultsBob = MeasureQubitArray(qsBob, basesBob);
let resultsAlice = MeasureQubitArray_Reference(qsAlice, basesAlice);
let resultsBob = MeasureQubitArray_Reference(qsBob, basesBob);

// 4. Keys generated by Alice and Bob
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resultsAlice);
let keyBob = GenerateSharedKey(basesAlice, basesBob, resultsBob);
let keyAlice = GenerateSharedKey_Reference(basesAlice, basesBob, resultsAlice);
let keyBob = GenerateSharedKey_Reference(basesAlice, basesBob, resultsBob);
Message($"Alice's Key: {keyAlice}");
Message($"Bob's Key: {keyBob}\n");

Expand Down Expand Up @@ -160,8 +157,8 @@ namespace Quantum.Kata.KeyDistributionE91 {
operation Eavesdrop_Reference (qAlice : Qubit, qBob : Qubit, basis : Int) : (Result, Result) {
Fact(basis == 2 or basis == 3, "Eve should measure in one of Alice's and Bob's compatible basis");

let resultsAlice = RotateAndMeasure(qAlice, basis);
let resultsBob = RotateAndMeasure(qBob, basis);
let resultsAlice = RotateAndMeasure_Reference(qAlice, basis);
let resultsBob = RotateAndMeasure_Reference(qBob, basis);

return (resultsAlice, resultsBob);
}
Expand All @@ -171,29 +168,29 @@ namespace Quantum.Kata.KeyDistributionE91 {
// 1. Alice and Bob are distributed arrays of entangled pairs
let N = 10;
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
EntangledPairs(qsAlice, qsBob);
EntangledPairs_Reference(qsAlice, qsBob);

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

// 2. Alice and Bob choose random measurement bases
let basesAlice = RandomBasesArray([1,2,3], N);
let basesBob = RandomBasesArray([2,3,4], N);
let basesAlice = RandomBasesArray_Reference([1,2,3], N);
let basesBob = RandomBasesArray_Reference([2,3,4], N);

// 3. Measurements by Alice and Bob
let resultsAlice = MeasureQubitArray(qsAlice, basesAlice);
let resultsBob = MeasureQubitArray(qsBob, basesBob);
let resultsAlice = MeasureQubitArray_Reference(qsAlice, basesAlice);
let resultsBob = MeasureQubitArray_Reference(qsBob, basesBob);

// 4. Keys generated by Alice and Bob
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resultsAlice);
let keyBob = GenerateSharedKey(basesAlice, basesBob, resultsBob);
let keyAlice = GenerateSharedKey_Reference(basesAlice, basesBob, resultsAlice);
let keyBob = GenerateSharedKey_Reference(basesAlice, basesBob, resultsBob);
Message($"Alice's Key: {keyAlice}");
Message($"Bob's Key: {keyBob}\n");

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

// Reset all qubits to |0⟩
Expand Down

0 comments on commit f08cc68

Please sign in to comment.