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

Commit f1926f2

Browse files
committed
Split the MeasureQubitArray task into two
MeasureQubitArray used to implement both the random basis selection and measurement processes. Now there are two separate tasks for these: RandomBasesArray and MeasureQubitArray.
1 parent 83dfbdb commit f1926f2

File tree

4 files changed

+197
-210
lines changed

4 files changed

+197
-210
lines changed

KeyDistribution_E91/KeyDistribution_E91.ipynb

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"cell_type": "code",
3232
"execution_count": null,
3333
"source": [
34-
"operation EntangledPairs (qsAlice : Qubit[], qsBob : Qubit[]) : Unit {\n",
34+
"operation EntangledPairs (qsAlice : Qubit[], qsBob : Qubit[]) : Unit is Adj{\n",
3535
" Fact(Length(qsAlice) == Length(qsBob), \"Alice and Bob should have the same number of qubits\");\n",
3636
" // ...\n",
3737
"\n",
@@ -97,7 +97,7 @@
9797
"\n",
9898
"**Inputs:** \n",
9999
"1) `q`: the qubit to be measured\n",
100-
"2) `basis_index`: The index of measurement operator to be used\n",
100+
"2) `basisIndex`: The index of measurement operator to be used\n",
101101
"\n",
102102
"**Output:** The result of the measurement."
103103
],
@@ -107,7 +107,7 @@
107107
"cell_type": "code",
108108
"execution_count": null,
109109
"source": [
110-
"operation RotateAndMeasure(q : Qubit, rotationMultiplier: Int) : Result {\n",
110+
"operation RotateAndMeasure(q : Qubit, basisIndex: Int) : Result {\n",
111111
" // ...\n",
112112
"\n",
113113
" return Zero;\n",
@@ -131,29 +131,53 @@
131131
{
132132
"cell_type": "markdown",
133133
"source": [
134-
"#### Task 2.2 Measure Qubit Arrays\n",
134+
"#### Task 2.2. Random Bases Array\n",
135+
"\n",
136+
"Using a list of possible measurement basis indices, create a random array of $N$ measurement bases.\n",
137+
"\n",
138+
"**Inputs:** \n",
139+
"1) `basesIndices`: An array of possible bases indices,\n",
140+
"2) `N`: The length of the output aray.\n",
141+
"\n",
142+
"**Outputs:** An array of random bases indices."
143+
],
144+
"metadata": {}
145+
},
146+
{
147+
"cell_type": "code",
148+
"execution_count": null,
149+
"source": [
150+
"operation RandomBasesArray (basesIndices: Int[], N: Int) : Int[] {\n",
151+
" // ...\n",
152+
"\n",
153+
" return new Int[N];\n",
154+
"}"
155+
],
156+
"outputs": [],
157+
"metadata": {}
158+
},
159+
{
160+
"cell_type": "markdown",
161+
"source": [
162+
"#### Task 2.3 Measure Qubit Arrays\n",
135163
"Measure either Alice's or Bob's qubits in bases constructed using randomly selected bases.\n",
136164
"\n",
137165
"**Inputs:** \n",
138166
"1) `qs`: An array of qubits to be measured,\n",
139-
"2) `basisList`: A list of possible basis indices for choosing measurement operators.\n",
167+
"2) `basesIndices`: An array of random bases indices.\n",
140168
"\n",
141-
"**Outputs:**\n",
142-
"1) The list of basis choices,\n",
143-
"2) The list of measurement results."
169+
"**Outputs:** The list of measurement results."
144170
],
145171
"metadata": {}
146172
},
147173
{
148174
"cell_type": "code",
149175
"execution_count": null,
150176
"source": [
151-
"operation MeasureQubitArray (qs: Qubit[], basisList: Int[]) : (Int[], Result[]) {\n",
152-
" let results = new Result[0];\n",
153-
" let bases = new Int[0];\n",
177+
"operation MeasureQubitArray (qs: Qubit[], basesIndices: Int[]) : Result[] {\n",
154178
" // ...\n",
155179
"\n",
156-
" return (bases, results);\n",
180+
" return new Result[0];\n",
157181
"\n",
158182
"}"
159183
],
@@ -192,9 +216,9 @@
192216
{
193217
"cell_type": "markdown",
194218
"source": [
195-
"#### Task 2.4 Putting it all together \n",
219+
"#### Task 2.5 Putting it all together \n",
196220
"\n",
197-
"Implement the entire BB84 protocol using tasks 1.1 - 2.3 and following the comments in the operation template. This is an open ended task."
221+
"Implement the entire E91 protocol using tasks 1.1 - 2.4 and following the comments in the operation template. This is an open ended task."
198222
],
199223
"metadata": {}
200224
},
@@ -203,9 +227,9 @@
203227
"execution_count": null,
204228
"source": [
205229
"operation T24_E91Protocol () : Unit {\n",
206-
" // 1. Alice and Bob choose basis multipliers\n",
230+
" // 1. Alice and Bob are distributed arrays of entangled pairs\n",
207231
"\n",
208-
" // 2. Alice and Bob are distributed arrays of entangled pairs\n",
232+
" // 2. Alice and Bob choose random measurement bases\n",
209233
"\n",
210234
" // 3. Measurements by Alice and Bob\n",
211235
"\n",
@@ -259,7 +283,7 @@
259283
"cell_type": "code",
260284
"execution_count": null,
261285
"source": [
262-
"function CorrelationCheck(basesAlice: Int[], basesBob: Int[], resAlice: Result[], resBob: Result[]) : Double {\n",
286+
"function CorrelationCheck(basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {\n",
263287
" // ...\n",
264288
"\n",
265289
" return 0.0;\n",
@@ -289,7 +313,7 @@
289313
"**Inputs:** \n",
290314
"1) `qAlice`: a qubit that Alice will use,\n",
291315
"2) `qBob`: Bob's corresponding qubit,\n",
292-
"3) `basis`: Eve's guess of the basis she should use for measuring.\n",
316+
"3) `basisIndex`: Eve's guess of the basis she should use for measuring.\n",
293317
"\n",
294318
"**Output:** the bits encoded in given qubits."
295319
],
@@ -299,8 +323,8 @@
299323
"cell_type": "code",
300324
"execution_count": null,
301325
"source": [
302-
"operation Eavesdrop (qAlice : Qubit, qBob : Qubit, basis : Int) : (Result, Result) {\n",
303-
" Fact(basis == 2 or basis == 3, \"Eve should measure in one of Alice's and Bob's compatible basis\");\n",
326+
"operation Eavesdrop (qAlice : Qubit, qBob : Qubit, basisIndex : Int) : (Result, Result) {\n",
327+
" Fact(basisIndex == 2 or basisIndex == 3, \"Eve should measure in one of Alice's and Bob's compatible basis\");\n",
304328
" // ...\n",
305329
"\n",
306330
" return (Zero, Zero);\n",
@@ -314,7 +338,7 @@
314338
"source": [
315339
"#### Task 3.3. Catch the Eavesdropper\n",
316340
"\n",
317-
"Add an eavesdropper into Task 2.4, then try to detect them using a CHSH correlation check. This is an open-ended task and is not covered by a test."
341+
"Add an eavesdropper into Task 2.5, then try to detect them using a CHSH correlation check. This is an open-ended task and is not covered by a test."
318342
],
319343
"metadata": {}
320344
},
@@ -323,12 +347,12 @@
323347
"execution_count": null,
324348
"source": [
325349
"operation T33_E91ProtocolWithEavesdropper() : Unit {\n",
326-
" // 1. Alice and Bob choose basis multipliers\n",
327-
"\n",
328-
" // 2. Alice and Bob are distributed arrays of entangled pairs\n",
329-
"\n",
350+
" // 1. Alice and Bob are distributed arrays of entangled pairs\n",
351+
" \n",
330352
" // Eve eavesdrops on all qubits, guessing the basis at random\n",
331353
"\n",
354+
" // 2. Alice and Bob choose random measurement bases\n",
355+
"\n",
332356
" // 3. Measurements by Alice and Bob\n",
333357
"\n",
334358
" // 4. Keys generated by Alice and Bob\n",

KeyDistribution_E91/ReferenceImplementation.qs

Lines changed: 74 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ namespace Quantum.Kata.KeyDistributionE91 {
3939
//////////////////////////////////////////////////////////////////
4040

4141
// Task 2.1 Rotate and Measure
42-
operation RotateAndMeasure_Reference (q : Qubit, rotationMultiplier: Int) : Result {
42+
operation RotateAndMeasure_Reference (q : Qubit, basisIndex: Int) : Result {
4343
mutable result = Zero;
44-
let rotationAngle = PI() * IntAsDouble(rotationMultiplier) / 4.0;
44+
let rotationAngle = PI() * IntAsDouble(basisIndex - 1) / 4.0;
4545

4646
within {
4747
Ry(rotationAngle, q);
@@ -52,20 +52,31 @@ namespace Quantum.Kata.KeyDistributionE91 {
5252
return result;
5353
}
5454

55-
// Task 2.2 Measure Qubit Arrays
56-
operation MeasureQubitArray_Reference (qs: Qubit[], basisList: Int[]) : (Int[], Result[]) {
57-
mutable results = new Result[0];
55+
// Task 2.2. Random Bases Array
56+
operation RandomBasesArray_Reference (basesIndices: Int[], N: Int) : Int[] {
57+
// ...
5858
mutable bases = new Int[0];
5959

60-
for q in qs {
61-
let basis = basisList[DrawRandomInt(0,2)];
62-
let res = RotateAndMeasure(q, basis);
60+
for _ in 1..N {
61+
let randomIndex = DrawRandomInt(0, Length(basesIndices) - 1);
62+
set bases += [basesIndices[randomIndex]];
63+
}
64+
65+
return bases;
66+
}
67+
68+
69+
// Task 2.2 Measure Qubit Arrays
70+
operation MeasureQubitArray_Reference (qs: Qubit[], basesIndices: Int[]) : Result[] {
71+
// ...
6372

64-
set bases += [basis];
65-
set results += [res];
73+
mutable results = new Result[0];
74+
75+
for (q, b) in Zipped(qs, basesIndices) {
76+
set results += [RotateAndMeasure(q,b)];
6677
}
6778

68-
return (bases, results);
79+
return results;
6980

7081
}
7182

@@ -82,17 +93,47 @@ namespace Quantum.Kata.KeyDistributionE91 {
8293
return key;
8394
}
8495

85-
// Task 2.4 CHSH Correlation Check
86-
function CorrelationCheck_Reference (basesAlice: Int[], basesBob: Int[], resAlice: Result[], resBob: Result[]) : Double {
96+
// Task 2.5 Putting it all together
97+
operation T25_E91Protocol_Reference () : Unit {
98+
// 1. Alice and Bob are distributed arrays of entangled pairs
99+
let N = 10;
100+
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
101+
EntangledPairs(qsAlice, qsBob);
102+
103+
// 2. Alice and Bob choose random measurement bases
104+
let basesAlice = RandomBasesArray([1,2,3], N);
105+
let basesBob = RandomBasesArray([2,3,4], N);
106+
107+
// 3. Measurements by Alice and Bob
108+
let resultsAlice = MeasureQubitArray(qsAlice, basesAlice);
109+
let resultsBob = MeasureQubitArray(qsBob, basesBob);
110+
111+
// 4. Keys generated by Alice and Bob
112+
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resultsAlice);
113+
let keyBob = GenerateSharedKey(basesAlice, basesBob, resultsBob);
114+
Message($"Alice's Key: {keyAlice}");
115+
Message($"Bob's Key: {keyBob}\n");
116+
117+
// Reset all qubits to |0⟩
118+
ResetAll(qsAlice + qsBob);
119+
120+
}
121+
122+
//////////////////////////////////////////////////////////////////
123+
// Part III. Eavesdropping
124+
//////////////////////////////////////////////////////////////////
125+
126+
// Task 3.1 CHSH Correlation Check
127+
function CorrelationCheck_Reference (basesAlice: Int[], basesBob: Int[], resultsAlice: Result[], resultsBob: Result[]) : Double {
87128
mutable expectationValues = new Double[0];
88129

89-
for (i, j) in [(0,1), (0, 3), (2, 1), (2, 3)] {
130+
for (i, j) in [(1,2), (1, 4), (3, 2), (3, 4)] {
90131
mutable sum = 0;
91132
mutable counter = 0;
92133

93134
for idx in IndexRange(basesAlice) {
94135
if basesAlice[idx] == i and basesBob[idx] == j {
95-
if resAlice[idx] == resBob[idx] {
136+
if resultsAlice[idx] == resultsBob[idx] {
96137
set sum += 1;
97138
} else {
98139
set sum -= 1;
@@ -115,79 +156,44 @@ namespace Quantum.Kata.KeyDistributionE91 {
115156
return s;
116157
}
117158

118-
119-
// Task 2.5 Putting it all together
120-
operation T25_E91Protocol_Reference () : Unit {
121-
// 1. Alice and Bob choose basis multipliers
122-
let basisListAlice = [0, 1, 2];
123-
let basisListBob = [1, 2, 3];
124-
125-
// 2. Alice and Bob are distributed arrays of entangled pairs
126-
let N = 13;
127-
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
128-
EntangledPairs(qsAlice, qsBob);
129-
130-
// 3. Measurements by Alice and Bob
131-
let (basesAlice, resAlice) = MeasureQubitArray(qsAlice, basisListAlice);
132-
let (basesBob, resBob) = MeasureQubitArray(qsBob, basisListBob);
133-
134-
// 4. Keys generated by Alice and Bob
135-
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resAlice);
136-
let keyBob = GenerateSharedKey(basesAlice, basesBob, resBob);
137-
Message($"Alice's Key: {keyAlice}");
138-
Message($"Bob's Key: {keyBob}\n");
139-
140-
// 5. Compute the CHSH correlation value
141-
let s = CorrelationCheck(basesAlice, basesBob, resAlice, resBob);
142-
Message($"S = {s}");
143-
144-
// Reset all qubits to |0⟩
145-
ResetAll(qsAlice + qsBob);
146-
147-
}
148-
149-
//////////////////////////////////////////////////////////////////
150-
// Part III. Eavesdropping
151-
//////////////////////////////////////////////////////////////////
152-
153-
// Task 3.1. Eavesdrop!
159+
// Task 3.2. Eavesdrop!
154160
operation Eavesdrop_Reference (qAlice : Qubit, qBob : Qubit, basis : Int) : (Result, Result) {
155-
Fact(basis == 1 or basis == 2, "Eve should measure in one of Alice's and Bob's compatible basis");
161+
Fact(basis == 2 or basis == 3, "Eve should measure in one of Alice's and Bob's compatible basis");
156162

157-
let resAlice = RotateAndMeasure(qAlice, basis);
158-
let resBob = RotateAndMeasure(qBob, basis);
163+
let resultsAlice = RotateAndMeasure(qAlice, basis);
164+
let resultsBob = RotateAndMeasure(qBob, basis);
159165

160-
return (resAlice, resBob);
166+
return (resultsAlice, resultsBob);
161167
}
162168

163-
// Task 3.2. Catch the eavesdropper
169+
// Task 3.3. Catch the eavesdropper
164170
operation T32_E91ProtocolWithEavesdropper_Reference () : Unit {
165-
// 1. Alice and Bob choose basis multipliers
166-
let basisListAlice = [0, 1, 2];
167-
let basisListBob = [1, 2, 3];
168-
169-
// 2. Alice and Bob are distributed arrays of entangled pairs
170-
let N = 13;
171+
// 1. Alice and Bob are distributed arrays of entangled pairs
172+
let N = 10;
171173
use (qsAlice, qsBob) = (Qubit[N] ,Qubit[N]);
172174
EntangledPairs(qsAlice, qsBob);
173175

174176
// Eve eavesdrops on all qubits, guessing the basis at random
175177
for (qAlice, qBob) in Zipped(qsAlice, qsBob) {
176-
let n = Eavesdrop(qAlice, qBob, DrawRandomInt(1,2));
178+
let _ = Eavesdrop(qAlice, qBob, DrawRandomInt(1,2));
177179
}
178180

181+
// 2. Alice and Bob choose random measurement bases
182+
let basesAlice = RandomBasesArray([1,2,3], N);
183+
let basesBob = RandomBasesArray([2,3,4], N);
184+
179185
// 3. Measurements by Alice and Bob
180-
let (basesAlice, resAlice) = MeasureQubitArray(qsAlice, basisListAlice);
181-
let (basesBob, resBob) = MeasureQubitArray(qsBob, basisListBob);
186+
let resultsAlice = MeasureQubitArray(qsAlice, basesAlice);
187+
let resultsBob = MeasureQubitArray(qsBob, basesBob);
182188

183189
// 4. Keys generated by Alice and Bob
184-
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resAlice);
185-
let keyBob = GenerateSharedKey(basesAlice, basesBob, resBob);
190+
let keyAlice = GenerateSharedKey(basesAlice, basesBob, resultsAlice);
191+
let keyBob = GenerateSharedKey(basesAlice, basesBob, resultsBob);
186192
Message($"Alice's Key: {keyAlice}");
187193
Message($"Bob's Key: {keyBob}\n");
188194

189195
// 5. Compute the CHSH correlation value
190-
let s = CorrelationCheck(basesAlice, basesBob, resAlice, resBob);
196+
let s = CorrelationCheck(basesAlice, basesBob, resultsAlice, resultsBob);
191197
Message($"S = {s}");
192198

193199
// Reset all qubits to |0⟩

0 commit comments

Comments
 (0)