@@ -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