SOQCS Example 8: Entanglement swapping protocol using a physical quantum dot as a non-ideal Bell emitter.

In the entanglement swapping protocol two pairs of photons are emitted in entangled Bell states. One photon of each pair is sent to a beamsplitter and the result at the output of the beamsplitter is measured. If one photon is detected in each output channel of the beamsplitter then the remaining two photons are also entangled. However, if the two pairs are not ideal Bell states misdetections can happen and the resulting density matrix of the two photons not traveling by the beamsplitter will not be the one of a pure state of a perfectly entangled pair of photons. In this simulation we will perform the protocol in the same way as depicted in [1]. This is, the two photons not traveling trough the beamsplitter will arrive at the detector through the same channel but at different times that here are labeled as 0 and 1. The calculation is repeated with different instances of the state of the QD emitter to capture the effect on the output of the distribution of noise in the input. We consider random noise, cross-dephasing noise and FSS effects on the photons that may give different imperfections to the input state in each emission. The result is compared with the analytical result for the current parameters. Note that we are neglecting pure dephasing effects in this example (this is T2* = 0)

[1] F. Basso Basset et Al. Entanglement swapping with photons generated on demand by a quantum dot. Phys. Rev. Lett., 123:160501 (2019)

[1]:
import soqcs

Simulation constant

[2]:
N      =  10000  # Number of outputs to calculate the density matrix
prntn  =   1000  # Print a message each 1000

Perform the simulation.

[3]:
# Initialize variables
V=0.0;
sim = soqcs.simulator()
apd = soqcs.dmatrix()

# Main loop
print("Start run of: ",N)
for i in range(0,N,1):
    if(i%prntn==0):
        print("Running:", i)

    example = soqcs.qodev(nph  = 4,  # Number of photons
                          nch  = 3,  # Number of channels
                          nm   = 2,  # number of polarization modes
                          ns   = 4,  # Number of packets
                          clock= 1,  # Detectors have a clock
                          ckind='E') # Exponential wavepackets
    # First QD cascade
    example.add_QD(0, 1,
                   t1 =  0.0,  # Time of bi-exciton XX photon
                   f1 =  1.0,  # Frequency of bi-exciton XX photons
                   w1 =  1.0,  # Characteristic decay time of bi-exciton XX photon
                   t2 =46.71,  # Time of exciton X photon
                   f2 =  1.0,  # Frequency of bi-exciton X photons
                   w2 =  1.0,  # Characteristic decay time of bi-exciton X photon
                   S  =  1.0,  # Fine Structure Splitting
                   k  =  0.8,  # Ratio of photons that are not due to noise
                   tss=  1.0,  # Characteristic coherence time.
                   thv=  1.0)  # Characteristic cross-dephasing time.
    example.add_QD(0, 2,
                   t1 = 16.0,  # Time of bi-exciton XX photon
                   f1 =  1.0,  # Frequency of bi-exciton XX photons
                   w1 =  1.0,  # Characteristic decay time of bi-exciton XX photon
                   t2 = 46.5,  # Time of exciton X photon
                   f2 =  1.0,  # Frequency of bi-exciton X photons
                   w2 =  1.0,  # Characteristic decay time of bi-exciton X photon
                   S  =  1.0,  # Fine Structure Splitting
                   k  =  0.8,  # Ratio of photons that are not due to noise
                   tss=  1.0,  # Characteristic coherence time.
                   thv=  1.0)  # Characteristic cross-dephasing time.
    # Circuit
    example.beamsplitter(1,2,45.0,0.0);
    # Detectors
    example.detector(0)
    example.detector(1,1)
    example.detector(2,1)

    # Run simulation
    inputst=example.input()               # Obtain input stste
    circuit=example.circuit()             # Obtain circuit
    outputst=sim.run_st(inputst,circuit)  # Run the simulation

    # Add state to the density matrix
    apd.add_state(outputst,example)

    # Calculate average photon overlapping
    V=V+example.emitted_vis(1,3)
Start run of:  10000
Running: 0
Running: 1000
Running: 2000
Running: 3000
Running: 4000
Running: 5000
Running: 6000
Running: 7000
Running: 8000
Running: 9000

Print average overlapping.

[4]:
print("V: ",V/N,"\n")
V:  0.8105842459701214

Print density matrix. First we must apply post-selection manually because we have used run_st.

[5]:
apd.normalize();                    # Normalize
partial=apd.calc_measure(example);  # Calculate post-selection
partial.prnt_mtx(3,0.01,example);   # Print the matrix
 | H(2)0, V(0)0 >  0.2766  0.0000  0.0000 -0.0214
 | V(0)0, V(2)0 >  0.0000  0.2272  0.0000  0.0000
 | H(0)0, H(2)0 >  0.0000  0.0000  0.2190  0.0000
 | H(0)0, V(2)0 > -0.0214  0.0000  0.0000  0.2773

THIS CODE IS PART OF SOQCS

Copyright: Copyright © 2023 National University of Ireland Maynooth, Maynooth University. All rights reserved. The contents and use of this document and the related code are subject to the licence terms detailed in LICENCE.txt