-
Notifications
You must be signed in to change notification settings - Fork 29
/
IsAbskIncoh.m
152 lines (135 loc) · 3.98 KB
/
IsAbskIncoh.m
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
%% ISABSKINCOH Determines whether or not a quantum state is absolutely k-incoherent
% This function has two required arguments:
% X: a density matrix
% k: a positive integer, the absolute coherence level to check for
%
% IAKI = ISABSKINCOH(X, K) returns 1 if X is absolutely k-incoherent,
% 0 if X is not absolutely k-incoherent, and -1 if the function cannot
% determine if X is absolutely k-incoherent or not.
%
% URL: http://www.qetlab.com/IsAbskIncoh
%
% References:
% [1] N. Johnston, S. Moein, R. Pereira, and S. Plosker. Absolutely
% k-Incoherent Quantum States and Spectral Inequalities for Factor Width of
% a Matrix. Physical Review A, 106:052417, 2022.
% requires: CVX (cvxr.com/cvx/)
% author: Benjamin Talbot, with code from Nathaniel Johnston (nathaniel@njohnston.ca)
% package: QETLAB
% last updated: August 26, 2024
function iaki = IsAbskIncoh(X, k)
iaki = -1;
tol = 1e-15;
% first check for valid quantum state
if ~(IsPSD(X) && (trace(X) == 1))
iaki = 0;
end
% trivial: every density matrix is absolutely n-incoherent
n = size(X, 1);
if k == n
iaki = 1;
return
end
eigvals = eig(X);
rankX = rank(X);
lmax = max(eigvals);
% trivial: only the maximally mixed state is absolutely 1-incoherent
if k == 1
if all(abs(eigvals - ones(n, 1)/n) <= tol)
iaki = 1;
return
else
iaki = 0;
return
end
end
% [1] Theorem 4
if rankX <= n - k
iaki = 0;
return
elseif rankX == n - k + 1
if eqnonzeigvals(eigvals)
iaki = 1;
return
end
end
% [1] Theorem 5
if lmax <= 1/(n-k+1)
iaki = 1;
return
end
if k == 2
% [1] Theorem 7
if norm(X,'fro')^2 <= 1/(n-1)
iaki = 1;
return
else
if n <= 3
iaki = 0;
return
end
end
elseif k == n - 1
% [1] Corollary 1
if lmax > 1 - 1/n
iaki = 0;
return
else
% [1] Theorem 8
iaki = IsAbsn1Incoh(eigvals);
end
end
%% IsAbsn1Incoh Determines whether or not a vector of eigenvalues corresponds to an absolutely (n-1)-incoherent matrix
% This function has one required argument:
% LAM: A vector of eigenvalues of the quantum state being tested.
% Assumed to be real, but does not have to be sorted.
%
% Returns either 1 or 0, indicating "yes" or "no".
%
% See paper "Absolutely k-Incoherent Quantum States and Spectral
% Inequalities for Factor Width of a Matrix" by Johnston et al for
% details.
% requires: CVX (cvxr.com/cvx/)
% author: Nathaniel Johnston (nathaniel@njohnston.ca)
% last updated: April 28, 2022
function iai = IsAbsn1Incoh(lam)
n = length(lam);
lam = sort(real(lam),'descend');
cvx_begin sdp quiet
cvx_precision best;
variable L(n,n) symmetric;
minimize 1;
subject to
L(1,1) == -lam(1) - sum(L(1,2:n)) - sum(L(2:n,1));
for j = 2:n
L(j,j) == lam(j);
end
L >= 0;
cvx_end
if(cvx_optval == 1)
iai = 1;
else
iai = 0;
end
end
% Helper function to check if all non-zero eigenvalues are equal
function allequal = eqnonzeigvals(lam)
prevlam = lam(1);
i = 2;
while prevlam < tol
prevlam = lam(i);
i = i + 1;
end
allequal = 1;
for j = i:length(lam)
if lam(j) > tol % if lam(j) ~= 0
if lam(j) - prevlam > tol
allequal = 0;
break
else
prevlam = lam(j);
end
end
end
end
end