SkOperatorNorm

SkOperatorNorm is a function that computes the S(k)-norm of an operator : $$ \|X\|_{S(k)} := \sup_{|v\rangle, |w\rangle } \Big\{ \big| \langle w| X |v \rangle \big| : SR(|v \rangle), SR(|v \rangle) \leq k, \big\||v \rangle\big\| = \big\||w \rangle\big\| = 1 \Big\}, $$ where $SR(\cdot)$ refers to the Schmidt rank of a pure state.

Syntax

 * LB = SkOperatorNorm(X)
 * LB = SkOperatorNorm(X,K)
 * LB = SkOperatorNorm(X,K,DIM)
 * LB = SkOperatorNorm(X,K,DIM,STR)
 * LB = SkOperatorNorm(X,K,DIM,STR,TARGET)
 * LB = SkOperatorNorm(X,K,DIM,STR,TARGET,TOL)
 * [LB,~,UB] = SkOperatorNorm(X,K,DIM,STR,TARGET,TOL)
 * [LB,LWIT,UB,UWIT] = SkOperatorNorm(X,K,DIM,STR,TARGET,TOL)</tt>

Input arguments

 * X</tt>: A square matrix acting on bipartite space. Generally, X</tt> should be positive semidefinite – the bounds produced otherwise are quite poor.
 * K</tt> (optional, default 1): A positive integer.
 * DIM</tt> (optional, by default has both subsystems of equal dimension): A 1-by-2 vector containing the dimensions of the subsystems that X</tt> acts on.
 * STR</tt> (optional, default 2): An integer that determines how hard the script should work to compute the lower and upper bounds (STR = -1</tt> means that the script won't stop working until the bounds match each other). Other valid values are 0, 1, 2, 3, ...</tt>. In practice, if STR >= 4</tt> then most computers will run out of memory and/or the sun will explode before computation completes.
 * TARGET</tt> (optional, default -1): A value that you wish to prove that the norm is above or below. If, at any point while this script is running, it proves that LB >= TARGET</tt> or that UB <= TARGET</tt>, then the script will immediately abort and return the best lower bound and upper bound computed up to that point. This is a time-saving feature that can be avoided by setting TARGET = -1</tt>.
 * TOL</tt> (optional, default eps^(3/8)</tt>): The numerical tolerance used throughout the script.

Output arguments

 * <tt>LB</tt>: A lower bound of the S(k)-operator norm of <tt>X</tt>.
 * <tt>LWIT</tt>: A witness that verifies that <tt>LB</tt> is indeed a lower bound of the S(k)-operator norm of <tt>X</tt>. More specifically, <tt>LWIT</tt> is a unit vector such that <tt>SchmidtRank(LWIT,DIM) <= K</tt> and <tt>LWIT'*X*LWIT = LB</tt>.
 * <tt>UB</tt>: An upper bound of the S(k)-operator norm of <tt>X</tt>.
 * <tt>UWIT</tt>: A witness that verifies that <tt>UB</tt> is indeed an upper bound of the S(k)-operator norm of <tt>X</tt>. More specifically, <tt>UWIT</tt> is a feasible point of the dual semidefinite program presented in Section 5.2.3 of.

Exact computation in small dimensions
When <tt>X</tt> lives in $M_2 \otimes M_2$, $M_2 \otimes M_3$, or $M_3 \otimes M_2$ (i.e., when <tt>prod(DIM) <= 6</tt>), the script is guaranteed to compute the exact value of $\|X\|_{S(1)}$:

The fact that this computation is correct is illustrated in Example 5.2.11 of, where it was shown that the S(1)-norm is exactly $(3 + 2\sqrt{2})/8 \approx 0.7286$. However, if we were still unconvinced, we could request witnesses that verify that 0.7286 is both a lower bound and an upper bound of the S(1)-norm:

Only interested in the lower and upper bounds; not the witnesses
If all you want are the lower and upper bounds, but don't require the witnesses <tt>LWIT</tt> and <tt>UWIT</tt>, you can use code like the following. Note that in this case, $\|X\|_{S(1)}$ is computed exactly, as the lower and upper bound are equal (though this will not happen for all <tt>X</tt>!). However, all we know about $\|X\|_{S(2)}$ is that it lies in the interval [0.3522, 0.3546]. It is unsurprising that $\|X\|_{S(3)}$ is the usual operator norm of <tt>X</tt>, since this is always the case when <tt>K >= min(DIM)</tt>.