-
Notifications
You must be signed in to change notification settings - Fork 0
/
qucompsys.py
193 lines (159 loc) · 5.24 KB
/
qucompsys.py
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 28 01:43:16 2021
@author: AndreaB.Rava
"""
import numpy as np
import qutip as qu
def n_rand_qubits(n_qubits):
"""
This method generates a list of random n qubits
Parameters
----------
n_qubits : int
number of qubits.
Raises
------
ValueError
if number of qubits is less than 1.
Returns
-------
list_n_rand_qubits : list
a list of n qubits.
"""
if n_qubits < 1:
raise ValueError('number of qubits must be > 0, but is {}'.format(n_qubits))
list_n_rand_qubits = []
i = 0
coeffs_real = np.random.random_sample((2,n_qubits))
coeffs_imm = np.random.random_sample((2,n_qubits))
basis_elem = np.random.randint(0,2,(2,n_qubits))
for i in range(n_qubits):
gen_qubit = (complex(coeffs_real[0][i],coeffs_imm[0][i])*qu.basis(2,basis_elem[0][i])
+ complex(coeffs_real[1][i],coeffs_imm[1][i])*qu.basis(2,basis_elem[1][i])).unit()
list_n_rand_qubits.append(gen_qubit)
return list_n_rand_qubits
def n_qeye(n_qubits):
"""
This method generates a tensor that apply identity on a state
of n-qubits
Parameters
----------
n_qubits : int
number of qubits the state is composed of.
Raises
------
ValueError
if number of qubits is less than 1.
Returns
-------
tensor (Qobj)
a tensor that apply the identity to a n-qubits state.
"""
if n_qubits < 1:
raise ValueError('number of qubits must be > 0, but is {}'.format(n_qubits))
return qu.tensor([qu.qeye(2)]*n_qubits)
def n_sigmax(n_qubits, qubit_pos):
"""
This method generates a tensor(Qobj) wich perform a single-qubit sigmax operation
on a state of n-qubits
Parameters
----------
n_qubits : int
number of qubits the states is composed of.
qubit_pos : int
qubit on which the sigmax operator acts (position starts at '0').
Raises
------
ValueError
if number of qubits is less than 2
ValueError
if qubit position is < 0 or > n_qubits-1
Returns
-------
n_sigmax: tensor (Qobj)
a tensor that apply sigmax on the nth-qubit of a n-qubits state.
"""
if n_qubits < 1:
raise ValueError('number of vertices must be > 0, but is {}'.format(n_qubits))
if qubit_pos < 0 or qubit_pos > n_qubits-1:
raise ValueError('qubit position must be > 0 or < n_qubits-1, but is {}'.format(qubit_pos))
list_n_sigmax = []
for i in range(n_qubits):
list_n_sigmax.append(qu.tensor([qu.qeye(2)]*i+[qu.sigmax()]+[qu.qeye(2)]*(n_qubits-i-1)))
return list_n_sigmax[qubit_pos]
def n_sigmay(n_qubits, qubit_pos):
"""
This method generates a tensor(Qobj) wich perform a single-qubit sigmay operation
on a state of n-qubits
Parameters
----------
n_qubits : int
number of qubits the states is composed of.
qubit_pos : int
qubit on which the sigmax operator acts (position starts at '0').
Raises
------
ValueError
if number of qubits is less than 2
ValueError
if qubit position is < 0 or > n_qubits-1
Returns
-------
n_sigmaz: tensor (Qobj)
a tensor that apply sigmay on the nth-qubit of a n-qubits state.
"""
if n_qubits < 1:
raise ValueError('number of vertices must be > 0, but is {}'.format(n_qubits))
if qubit_pos < 0 or qubit_pos > n_qubits-1:
raise ValueError('qubit position must be > 0 or < n_qubits-1, but is {}'.format(qubit_pos))
list_n_sigmay = []
for i in range(n_qubits):
list_n_sigmay.append(qu.tensor([qu.qeye(2)]*i+[qu.sigmay()]+[qu.qeye(2)]*(n_qubits-i-1)))
return list_n_sigmay[qubit_pos]
def n_sigmaz(n_qubits, qubit_pos):
"""
This method generates a tensor(Qobj) wich perform a single-qubit sigmaz operation
on a state of n-qubits
Parameters
----------
n_qubits : int
number of qubits the states is composed of.
qubit_pos : int
qubit on which the sigmax operator acts (position starts at '0').
Raises
------
ValueError
if number of qubits is less than 2
ValueError
if qubit position is < 0 or > n_qubits-1
Returns
-------
n_sigmaz: tensor (Qobj)
a tensor that apply sigmaz on the nth-qubit of a n-qubits state.
"""
if n_qubits < 1:
raise ValueError('number of vertices must be > 0, but is {}'.format(n_qubits))
if qubit_pos < 0 or qubit_pos > n_qubits-1:
raise ValueError('qubit position must be > 0 or < n_qubits-1, but is {}'.format(qubit_pos))
list_n_sigmaz = []
for i in range(n_qubits):
list_n_sigmaz.append(qu.tensor([qu.qeye(2)]*i+[qu.sigmaz()]+[qu.qeye(2)]*(n_qubits-i-1)))
return list_n_sigmaz[qubit_pos]
def comp_basis_prob_dist(qstate):
"""
This methos gives the probability distribution of a given state in the computational
basis state
Parameters
----------
qstate : a qobject, 1-D array-like
a tendor representing a n-qubits state.
Returns
-------
prob_dist : list
list of the probabilities distribution.
"""
prob_dist = []
for component in qstate.full():
prob_dist.append(float(abs(component))**2)
return prob_dist