-
Notifications
You must be signed in to change notification settings - Fork 1
/
qcLec04-bomb.R
114 lines (97 loc) · 2.65 KB
/
qcLec04-bomb.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# ----------------------
# ---------- AD S. Aaronson, Introduction to Quantum Information Science Lecture Notes
# ---------- https://www.scottaaronson.com/qclec.pdf
# ----------------------
#
# This script is designed to run line by line --> RStudio and Ctrl + Enter
#
# Author: Mariusz Krej
#
# ----------------------
if("rstudioapi" %in% rownames(installed.packages()) && rstudioapi::isAvailable())
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
getwd()
if (FALSE)
rm(list=ls())
source("quSimLib.R")
source("modpow.R")
# ----- AD lecture 4
# eq. (4.2) Hadamard
matrix(c(1,1,1,-1), nrow=2) / sqrt(2)
H
t(t(1:0)) # |0〉
q0
t(t(0:1)) # |1〉
q1
H %*% q0
round(H %*% (H %*% q0), 10)
H %*% q1
round(H %*% (H %*% q1), 10)
H %*% (H %*% (H %*% q1))
# --------- ad bomb
N = 10
step1_dud = kronecker(ROT(pi/2/N) %*% q0, q0)
step1_bomb = CNOT %*% step1_dud
step1_bomb
step1_dud
all(step1_dud == CNOT %*% CNOT %*% step1_dud) # $$$
# after step 1
#
# |C〉 - control bit, |P〉 - probe bit
#
# | before meas | after meas, if P=|0〉 eq. (5.1)
# |----------------------|---------------------------------
# | |CP〉| bomb | dud | | bomb | dud
# |------|-------|-------|---|--------------|-------------
# | |00〉| 0.988 | 0.988 | * | 0.988/0.988 | 0.988/1
# | |01〉| 0.000 | 0.000 | | 0 | 0
# | |10〉| 0.000 | 0.156 | * | 0.000/0.988 | 0.156/1
# | |11〉| 0.156 | 0.000 | | 0 | 0
round(postmeas(step1_bomb, q00, q10), 3)
round(postmeas(step1_dud, q00, q10), 3)
round(postmeas(step1_bomb, list(q00, q10)), 3)
# bomb "simulation"
bomb = CNOT %*% kronecker(ROT(pi/2/N), diag(1,2))
dud = kronecker(ROT(pi/2/N), diag(1,2))
qcirc = dud
qcirc = bomb
{
ctl = q0
probe = q0
state = kronecker(ctl, probe)
for(i in 1:N)
{
state = qcirc %*% state
# we assume that the bomb did not explode:
state = postmeas(state, q00, q10)
}
round(state, 3)
}
# -----------------
# -- bomb - swaped bits - ok
# |αC〉
# |00〉
# |01〉
# |10〉
# |11〉
# error: swCNOT = kronecker (q0 %*% t(q0), NOT) + kronecker (q1 %*% t(q1), diag(1,2))
swCNOT = SWAP %*% CNOT %*% SWAP
all(swCNOT == kronecker (diag(1,2), q0 %*% t(q0)) + kronecker (NOT, q1 %*% t(q1)) )
qcirc = swCNOT %*% kronecker(diag(1,2), ROT(pi/2/N))
# --
alfa = q0
meas = list(q00, q01)
meas = list(kronecker(alfa, q0), kronecker(alfa, q1))
# --
alfa = q1
meas = list(q10, q11)
# --
{
ctl = q0
state = kronecker(alfa, ctl)
for(i in 1:N)
state = postmeas(qcirc %*% state, meas)
state
all(state == kronecker(alfa, q0))
}
sum(Mod(state)^2)