Application Center - Maplesoft

App Preview:

Simulation of a five qubits convolutional code

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application




Simulation of a five qubits convolutional code

1Aziz Mouzali, 2Fatiha Merazka

1Departement of physics, ENPEI, Rouiba, Algeria.

2 Computer Engineering Faculty, USTHB, Algeria.

Introduction

      We describe in this work a five-qubit quantum convolutional error correcting code and its implementation on a classical computer.  The encoding and decoding circuits and an error correction procedure are presented.  We will verify that if any  X, Y, Z error or any product of them occurs on one or two qubit, this correction always  allows  to  recover the useful information or  to  obtain a list of possible errors. The originality in  this correction is the winning time obtained by looking at only the required syndromes for each error,   thus avoiding the decoherence phenomenon.   Also,  we give the  average fidelity  for double errors recovered  as single  errors  having same syndrome.  This work is described in more detail in  convo2012.pdf , included with this application.  

 

NOTE: 
a)  This application requires the use of the Feynman package, by T.Radtke and S.Fritzsche. This Maple package is available from the CPC Program Library from Queen’s University in Belfast, as
http://cpc.cs.qub.ac.uk/summaries/ADWE_v4_0.html.  You must install that package first before running this application.  
b) The running time is very short for the coding circuit but can be much more higher for the orthers parts of the application.

 

Acknowledgement

  We would like to thank very much Mrs S.Fritzsch and T.Radtke for providing us with the version 4 (2008) of Feynman Program.

 

Coding Circuit

This circuit is schematized in figure 11 , page 22 of the ref[4] (see the included file convo2012.pdf).

with(Feynman); with(LinearAlgebra); Digits := 20; Z := Feynman_quantum_operator("Z"); H := Feynman_quantum_operator("H"); Qo := Feynman_evaluate("Kronecker product", Z.H.`<,>`(1, 0), Z.H.`<,>`(1, 0), H.`<,>`(1, 0), `<,>`(a1, b1), H.`<,>`(1, 0)); Q1 := Feynman_quantum_operator(5, "cn", [5, 4]).Qo; Q2 := Feynman_quantum_operator(5, "cz", [1, 4]).Q1; Q31 := I.Feynman_quantum_operator(5, "cn", [1, 4]).Q2; Q3 := I.Feynman_quantum_operator(5, "cz", [1, 5]).Q31; Q4 := Feynman_quantum_operator(5, "cz", [2, 1]).Q3; Q5 := Feynman_quantum_operator(5, "cz", [2, 4]).Q4; Q6 := I.Feynman_quantum_operator(5, "cn", [2, 4]).Q5; Q7 := Feynman_quantum_operator(5, "cz", [3, 2]).Q6; Q8 := Feynman_quantum_operator(5, "cn", [3, 4]).Q7; Q9 := Feynman_evaluate("Kronecker product", Z.H.`<,>`(1, 0), Z.H.`<,>`(1, 0), H.`<,>`(1, 0), `<,>`(a2, b2), H.`<,>`(1, 0), Z.H.`<,>`(1, 0)); Q10 := Feynman_quantum_operator(6, "cn", [5, 4]).Q9; Q11 := Feynman_quantum_operator(6, "cz", [6, 5]).Q10; Q12 := Feynman_quantum_operator(6, "cz", [1, 4]).Q11; Q13 := I.Feynman_quantum_operator(6, "cn", [1, 4]).Q12; Q14 := Feynman_quantum_operator(6, "cz", [1, 5]).Q13; Q15 := Feynman_quantum_operator(6, "cz", [2, 4]).Q14; Q16 := I.Feynman_quantum_operator(6, "cn", [2, 4]).Q15; Q17 := Feynman_quantum_operator(6, "cz", [2, 5]).Q16; Q18 := Feynman_quantum_operator(6, "cz", [3, 2]).Q17; Q19 := Feynman_quantum_operator(6, "cn", [3, 4]).Q18; Q20 := Feynman_quantum_operator(6, "cz", [3, 5]).Q19; Q21 := Feynman_evaluate("Kronecker product", Q8, Q20); Q22 := Feynman_quantum_operator(11, "cz", [6, 5]).Q21; Q23 := Feynman_quantum_operator(11, "cz", [2, 5]).Q22; Q24 := Feynman_quantum_operator(11, "cz", [7, 6]).Q23; Q25 := Feynman_quantum_operator(11, "cz", [3, 5]).Q24; Q255 := Feynman_print(Q25)

``

Stabilisation of the coded state Q25
We verify that the obtained coded state Q25 is correct.

``

NULL

S1a := Feynman_quantum_operator(11, "X", [1]).Q25; S1 := Feynman_quantum_operator(11, "XZ", [2, 3]).S1a; if evalb(Equal(S1, Q25)) = true then print("M1 true") else print("M1 false") end if; S2a := Feynman_quantum_operator(11, "ZX", [1, 2]).Q25; S2 := Feynman_quantum_operator(11, "XZ", [3, 4]).S2a; if evalb(Equal(S2, Q25)) = true then print("M2 true") else print("M2 false") end if; S3a := Feynman_quantum_operator(11, "ZX", [2, 3]).Q25; S3 := Feynman_quantum_operator(11, "XZ", [4, 5]).S3a; if evalb(Equal(S3, Q25)) = true then print("M3 true") else print("M3 false") end if; S4a := Feynman_quantum_operator(11, "ZX", [3, 4]).Q25; S4 := Feynman_quantum_operator(11, "XZ", [5, 6]).S4a; if evalb(Equal(S4, Q25)) = true then print("M4 true") else print("M4 false") end if; S5a := Feynman_quantum_operator(11, "ZX", [5, 6]).Q25; S5 := Feynman_quantum_operator(11, "XZ", [7, 8]).S5a; if evalb(Equal(S5, Q25)) = true then print("M5 true") else print("M5 false") end if; S6a := Feynman_quantum_operator(11, "ZX", [6, 7]).Q25; S6 := Feynman_quantum_operator(11, "XZ", [8, 9]).S6a; if evalb(Equal(S6, Q25)) = true then print("M6 true") else print("M6 false") end if; S7a := Feynman_quantum_operator(11, "ZX", [7, 8]).Q25; S7 := Feynman_quantum_operator(11, "XZ", [9, 10]).S7a; if evalb(Equal(S7, Q25)) = true then print("M7 true") else print("M7 false") end if; S8a := Feynman_quantum_operator(11, "ZX", [8, 9]).Q25; S8 := Feynman_quantum_operator(11, "XZ", [10, 11]).S8a; if evalb(Equal(S8, Q25)) = true then print("M8 true") else print("M8 false") end if

NULL

Channel error
We introduce here an example of error affecting some qubits during the transmission in the channel.

 

NULL

Q27 := Feynman_quantum_operator(11, "ZX", [2, 5]).Q25

``

Syndrome extraction
      The syndrome extraction is explained in convo2012.pdf. It is a non-destructive measure on qubits which allow us to know if the qubits states are affected or not whithout changing them. For example, the symbol "c" in the instruction Q281a  means that the operator X is applied on qubits 2 only if the first one has the value 1. We have added the symbol # next to the instruction which are not rewuired for detection the error introduced in  Q27 as  example.  One can change  the position  of  this  symbol next to the  required instructions  upon on the generators M to be measured to detect the choosen error. This procedure allow us to reduce the running time.  

``

NULL

NULL

Q28 := Feynman_evaluate("Kronecker product", H.`<,>`(1, 0), Q27); Q281a := Feynman_quantum_operator(12, "c", "X", [1, 2]).Q28; Q281b := Feynman_quantum_operator(12, "c", "XZ", [1, 3, 4]).Q281a; Q281c := Feynman_quantum_operator(12, "H", [1]).Q281b; Q281 := Feynman_quantum_operator(12, "Z", [1]).Q281c; Q282a := Feynman_quantum_operator(12, "c", "ZX", [1, 2, 3]).Q28; Q282b := Feynman_quantum_operator(12, "c", "XZ", [1, 4, 5]).Q282a; Q282c := Feynman_quantum_operator(12, "H", [1]).Q282b; Q282 := Feynman_quantum_operator(12, "Z", [1]).Q282c; Q283a := Feynman_quantum_operator(12, "c", "ZX", [1, 3, 4]).Q28; Q283b := Feynman_quantum_operator(12, "c", "XZ", [1, 5, 6]).Q283a; Q283c := Feynman_quantum_operator(12, "H", [1]).Q283b; Q283 := Feynman_quantum_operator(12, "Z", [1]).Q283c; Q285a := Feynman_quantum_operator(12, "c", "ZX", [1, 6, 7]).Q28; Q285b := Feynman_quantum_operator(12, "c", "XZ", [1, 8, 9]).Q285a; Q285c := Feynman_quantum_operator(12, "H", [1]).Q285b; Q285 := Feynman_quantum_operator(12, "Z", [1]).Q285c

NULL

Error detection and correction
The syndrome extraction allow us to identify the channel error and then to correct it. See table 2 in convo2012.pdf to understand the procedure.

``

NULL

if `and`(`and`(`and`(evalb(Equal(Q281, -Q281c)) = true, evalb(Equal(Q282, -Q282c)) = true), evalb(Equal(Q283, -Q283c)) = true), evalb(Equal(Q285, -Q285c)) = true) then Q29 := Feynman_quantum_operator(11, "ZX", [2, 5]).Q27 end if; if evalb(Equal(Q29, Q25)) = true then print("Error Z2X5 corrected") end if

``

Decoding circuit
It is the inversed coding circuit. This part of the simulation could have a very high running time or to get stuck . Then it is advisable to run the application part by part.  We do not know if Feynman program needs some modifications or if it contains others properties that we ignore and allowing a better decoding procedure with a smaller execution time.

``

NULL

NULL

Q30 := Feynman_quantum_operator(11, "cz", [3, 2]).Q29; Q31 := Feynman_quantum_operator(11, "cn", [3, 4]).Q30; Q32 := Feynman_quantum_operator(11, "cz", [3, 5]).Q31; Q33 := Feynman_quantum_operator(11, "cz", [8, 7]).Q32; Q34 := Feynman_quantum_operator(11, "cn", [8, 9]).Q33; Q35 := Feynman_quantum_operator(11, "cz", [8, 10]).Q34; Q36 := Feynman_quantum_operator(11, "cz", [2, 1]).Q35; Q37 := Feynman_quantum_operator(11, "cz", [2, 4]).Q36; Q38 := -I.Feynman_quantum_operator(11, "cn", [2, 4]).Q37; Q39 := Feynman_quantum_operator(11, "cz", [2, 5]).Q38; Q40 := Feynman_quantum_operator(11, "cz", [7, 6]).Q39; Q41 := Feynman_quantum_operator(11, "cz", [7, 9]).Q340; Q42 := -I.Feynman_quantum_operator(11, "cn", [7, 9]).Q41; Q43 := Feynman_quantum_operator(11, "cz", [7, 10]).Q42; Q44 := Feynman_quantum_operator(11, "cz", [6, 5]).Q43; Q45 := Feynman_quantum_operator(11, "cz", [6, 9]).Q44; Q46 := -I.Feynman_quantum_operator(11, "cn", [6, 9]).Q45; Q47 := Feynman_quantum_operator(11, "cz", [6, 10]).Q46; Q48 := Feynman_quantum_operator(11, "cz", [1, 4]).Q47; Q49 := -I.Feynman_quantum_operator(11, "cn", [1, 4]).Q48; Q50 := Feynman_quantum_operator(11, "cz", [1, 5]).Q49; Q51 := Feynman_quantum_operator(11, "cz", [11, 10]).Q50; Q52 := Feynman_quantum_operator(11, "cn", [5, 4]).Q51; Q53 := Feynman_quantum_operator(11, "cn", [10, 9]).Q52; Q54 := Feynman_quantum_operator(11, "Z", [1]).Q53; Q55 := Feynman_quantum_operator(11, "Z", [2]).Q54; Q56 := Feynman_quantum_operator(11, "Z", [6]).Q55; Q57 := Feynman_quantum_operator(11, "Z", [7]).Q56; Q58 := Feynman_quantum_operator(11, "Z", [11]).Q57; Q59 := Feynman_quantum_operator(11, "H", [1]).Q58; Q60 := Feynman_quantum_operator(11, "H", [2]).Q59; Q61 := Feynman_quantum_operator(11, "H", [3]).Q60; Q62 := Feynman_quantum_operator(11, "H", [5]).Q61; Q63 := Feynman_quantum_operator(11, "H", [6]).Q62; Q64 := Feynman_quantum_operator(11, "H", [7]).Q63; Q65 := Feynman_quantum_operator(11, "H", [8]).Q64; Q66 := Feynman_quantum_operator(11, "H", [10]).Q65; Q67 := Feynman_quantum_operator(11, "H", [11]).Q66; Q68 := Feynman_evaluate("Kronecker product", `<,>`(1, 0), `<,>`(1, 0), `<,>`(1, 0), `<,>`(a1, b1), `<,>`(1, 0), `<,>`(1, 0), `<,>`(1, 0), `<,>`(1, 0), `<,>`(a2, b2), `<,>`(1, 0), `<,>`(1, 0)); Q688 := Feynman_print(Q68); Q677 := Feynman_print(Q67); if evalb(Equal(Q688, Q677)) = true then print("Successful decoding") else print("decoding failed") end if

NULL