对于错误,一般有两种:

  • random: 错误以一定的概率发生在每个比特上(对这种问题的研究一般是信息论中,信道熵一类的问题)
  • worst case: 错误发生在某个比特上,这也是纠错码襄阳解决的问题

经典线性码:

主要是利用了定义在有限域\(\mathbb{F}_{2}\)上的线性代数,\(\mathbb{F}_{2}=\{0,1\}\),然后定义了两个操作,\(+\) 和 \(\cdot\)。

\(\cdot\)和正常的乘法一样,只有在\(1 \cdot1\)的时候结果为1,其余都为0,而\(+\)则有一点小不同,因为这是一个封闭的有限域,所以\(1+1\)不等于2而是等于0,计算结果模2。

现在已经有了\(\mathbb{F}_{2}\),每一个比特都是这么的一个空间,如果我们有n比特,那么我们的空间就是\(\mathbb{F}_{2}^{n}\),在这个空间上我们可以定义向量。

假定我有了线性独立向量\(g_1,...,g_k\)我们把写着称之为generator of the code,由他们我们可以张成封闭子空间 \(C\),\(C \geq \mathbb{F}_{2}^{n}\),这个空间的中的向量都可以由\(a_1g_1+a_2g_2+...+a_kg_k\)表达,其中\(a_1,...,a_k\)也都属于\(\mathbb{F}_{2}\),这个空间的维度为k。

这里我们定义一个矩阵G,他的每一列都由generator \(g_1,...,g_k\)表示,所以这是一个\(n*k\)的矩阵。如果用属于\(\mathbb{F}_{2}^{k}\)的向量来表示\(a_1,...,a_k\),则上面的式子就可以变成\(Ga\),这相当于是一个映射,把空间\(\mathbb{F}_{2}^{k}\)映射成了\(C\)。

这相当于就是一个编码方法了,把\(\mathbb{F}_{2}^{k}\)空间里的k位向量,编码成\(C\)空间里的n位向量,我们只需要做一个矩阵和向量的乘法即可。

用一个例子来说明一下:

多数码:我们的码字空间就是\(C=\{0^n,1^n\}\),用n个0来表示0,n个1来表示1,G就是一个简单的全1的列向量。

现在来看我们的编码结果,\(\begin{pmatrix} 1\\1\\...\\1\end{pmatrix}a=\begin{pmatrix} x_1\\x_2\\...\\x_n\end{pmatrix}\)。

对于向量x有什么是要满足的吗?

如果我们的编码计算没有问题的话,我们的\(x_1=x_2\),\(x_2=x_3\),……,\(x_{n_1}=x_n\),这个永也可以用另一个种方式表达,\(x_1+x_2=0\)因为只有在他们同时为1或者同时为0的时候才会加起来为0。

为此,我们可以定义一个新的矩阵H,\(H= \begin{pmatrix} 1 &1 & 0& ... & 0 \\ 0 & 1 & 1 & ... & 0 \\ ... \\ 0 & 0 & ... & 1& 1 \end{pmatrix}\)只有对角线上两个1,其他都是0.

有这个矩阵有什么用呢?

如果我们有了这个矩阵,我们可以用来验证我们的编码是不是对的,通过计算\(Hx=0\)如果等于0,那么我们的编码就是对的,如果不等于0,那么我们的编码就发生了错误。

H也就是我们的检测矩阵 check matrix,如果G是n*k 的矩阵的话,H就是(n-k)*n的矩阵。

我们聊这么久的线性码的意义何在?

因为我们可以把H 也就是 check matrix 拓展到量子的领域,也就是我们的Stabilzer code。

经典线性码,有两种等价的描述,\(C_{c l}=\operatorname{Im}(G)=\operatorname{ker}(H) \leq \mathbb{F}_{2}^{n}\)

对H来说,C空间里的任意一个向量都和H的每一个行向量的内积都是0,\(H x=0 \Longleftrightarrow\langle x, h\rangle = 0 \forall h \in \operatorname{Im}(H^{\dagger})\)

从量子的角度来看,我们的量子码字空间\(C=span\{|x\rangle: x \in C_{cl}\}\)和它对应的check aatrix H。

\(\forall h \in \operatorname{Im}(H^{\dagger})\)我们选择这么一个操作\(Z^{h}=Z_{1}^{h_{1}} \ldots Z_{n}^{h_{n}}\)作用在 $|x\rangle $ 上,得到\(Z^{h}|x\rangle=Z_{1}^{h_{1}}\left|x_{1}\right\rangle \otimes \ldots \otimes Z_{n}^{h_{n}}\left|x_{n}\right\rangle=(-1)^{\langle h, x\rangle}|x\rangle\)。因为\(\langle h, x\rangle=0\),所以\(Z^h|x\rangle=|x\rangle\)。

也就是说,\(|x\rangle\)是\(Z^h\)特征值为1的特征向量。

\(C=\left\{|\psi\rangle: Z^{h}|\psi\rangle=|\psi\rangle \forall h \in \operatorname{Im} H\right\}\)这个条件的另一种描述方法就是\(|\psi\rangle\) is stabilized by\(Z^h\)。

Stabilizer是什么?

定义

Stabilizer group(S)是什么?

简单来说,stabilizer group(S)就是满足了以下两个条件的Pauli群的子群。

Pauli群是什么?

\(\left\{\omega^{c} X_{j}^{a_{j}} Z_{j}^{b_{j}}\right\}_{j=1, \ldots, N}^{a_{j}, b_{j}, c=0, \ldots, d-1}\)其中 \(w=e^{2\pi i/d}\) ,并且这个群是封闭的。

那么需要满足的两个条件是什么呢?

  1. S里面的所有的元素都是对易的,即可以交换,S is an abelian subgroup of \(P_n\)
  2. -I不在S里面

这两个条件其实是统一的,可以相互推导,在S里没有-I很容易理解,如果有了-I,那么满足\(-I |x \rangle = |x\rangle\)的\(|x\rangle\)就只有0向量了。

如果在S里面没有-I,那么反对易的元素也不在S里面,Pauli矩阵要么是对易要么反对易,如果它们是反对易的,则存在\(S \ni g h g h=-g h h g=-I\),与第二个要求矛盾。

Stabilizer 子空间

Stabilizer 子空间就是\(V_S=\{|\psi\rangle: g|\psi\rangle=|\psi\rangle, \forall g \in S\}\)。

一个stabilizer group(S)就有一个对应的stabilizer subspace,S里面的任意一个操作作用在这个子空间里都不会有什么变化。

例子
  • \(V_{S}=\operatorname{span}\{|00\rangle\}\),对于这个子空间,\(S=\{I I, I Z, Z I, Z Z\}=\langle I Z, Z I\rangle\),之所以后面还划出来了一个IZ和ZI,那么是因为II和ZZ可以通过这两个相乘得到,我们也说, S is generated by IZ,ZI。
  • \(V_{S}=\operatorname{span}\{|000\rangle,|111\rangle\}\)这就是我们先前说的重复编码,对于这个子空间,他的S就是\(S=\langle Z Z I, I Z Z\rangle\)前面的两个ZZ保证的是第一个比特和第二个比特是相同的,后面两个ZZ保证的是第二个比特和第三个比特是相同的。
  • \(V_{S}=\operatorname{span}\{|+++\rangle,|---\rangle\}\)对于这种情况,找他的S也很容易,因为就是一个换基的过程\(S=\langle X X I, I X X\rangle\)。
投影算子

现在我们还可以来描述这个子空间的投影算子,我们可以先定义一个\(\Pi_{S}\)使得\(\Pi_{S}=\frac{1}{|S|} \sum_{g \in S} g\)

如果\(g \in S\),那么\(g \Pi_{S}=\Pi_{S}\),证明这一点很容易,因为:

\(g \sum_{h \in S} h=\sum_{h \in S} g h=\sum_{h^{\prime}=g h \in S} h^{\prime}\)

\(g \in S\)同样也可以导出\(g^{\dagger} \in S\),因为S是一个封闭可逆的群,那么我们可以得出么\(g^{\dagger} \Pi_{S}=\Pi_{S}\),即么\(\Pi_{S}^{\dagger} \Pi_{S}=\Pi_{S}\)

这说明了\(\Pi_{S}\)是一个投影算子。

接下来要说明\(\Pi_{S}\)投影的子空间就是我们想要的\(V_S\),这个分为两方面:

  1. 对任意的\(|\psi\rangle\)和\(g \in S\)来说,\(g \Pi_{S}|\psi\rangle=\Pi_{S}|\psi\rangle\),也就是\(\Pi_{S}|\psi\rangle \in V_{S}\)。
  2. 如果\(|\psi\rangle \in V_{S}\),则\(\Pi_{S}|\psi\rangle=|\psi\rangle\),即\(V_{S} \subseteq \Pi_{S}\)。

综上,我们可以说,\(\Pi_{S}=\operatorname{Proj}\left(V_{S}\right)\)是子空间上的投影算子。

我们现在可以来计算子空间的维度,让\(|S|=2^{\ell}\),generator \(S=\left\langle s_{1}, \ldots, s_{\ell}\right\rangle\),

子空间的维度说起来简单,就是所有stabilizer特征值为1所对应的特征空间的交集,但是谁知道他们是怎么相交的呢?还好我们有投影算子。

我们可以说,\(\operatorname{dim} V_{S}=\operatorname{tr} \Pi_{S}\),这里的特征值只有0和1,而trace会把1给累加起来。

\(\operatorname{tr} \Pi_{S}=\frac{1}{|S|} \sum_{g \in S} \operatorname{tr} g=\frac{1}{2^{\ell}} \sum_{g \in S} 2^{n} \delta_{g, I}=2^{n-\ell}\)

只有\(g=I\)的时候trace才有值,其他情况就是普通的Pauli,trace为0,而什么情况\(g=I\)呢?事实上只有一种情况,那就是所有的a都为0,因为他们是线性独立的,所以我们子空间的维度是\(2^{n-l}\)

错误检测

回顾我们经典的检测矩阵H,我们有\(x \in C_{c l} \Longleftrightarrow H x=0\),并不是所有的错误我们都能检测,如果这个错误是把一个可能的码字,变成另一个可能的码字,那么H怎么能知道这个是错误而不是一个正确的操作的?

如果错误正好是\(H(x+e)=H e=0\),那么这种错误就是不可检测的错误。

量子版本的stabilizer code也是如此。

那么,哪些错误是不能检测的呢?

那就是如果我犯了这个错误,但是我依旧在这组stabilizer的子空间里,这种错误就是不可检测的,因为我分不出来这究竟是错误还是操作。

假设\(|\psi\rangle \in V_{S}\),\(E \in P_{n}\),则:\(E|\psi\rangle \in V_{S} \quad \Leftrightarrow \quad g E|\psi\rangle=E|\psi\rangle \forall g \in S\)

\(g E|\psi\rangle=E|\psi\rangle\)意味着\(g E|\psi\rangle=Eg|\psi\rangle\),则Eg和gE是相等的,E和g对易。

如果我们的错误和我们的stabilizer对易,那么这种错误就是我们不能检测出来的错误。

问题接下来就变成了,如何判断Pauli算子是否对易。

首先,所有的Pauli都可以写成\(p=(-1)^{a} X^{b} Z^{c}\)的形式,对于\(a \in \mathbb{F}_{2}, b, c \in \mathbb{F}_{2}^{n}\)

那么假定我们有另一个Pauli \(q=(-1)^{a^{\prime}} X^{b^{\prime}} Z^{c^{\prime}}\)

则\(p q=(-1)^{a+a^{\prime}} X^{b} Z^{c} X^{b^{\prime}} Z^{c^{\prime}}\)

对于中间的\(Z^{c} X^{b^{\prime}}=Z_{1}^{c_{1}} \cdots Z_{n}^{c_{n}} X_{1}^{b_{1}^{\prime}} \cdots X_{n}^{b_{n}^{\prime}}=X^{b^{\prime}} Z^{c}(-1)^{\left\langle b^{\prime}, c\right\rangle}\),即,如果Z和X在这一位上都有,那么就会有一个-1.

那么现在pq就变成了,\(p q=(-1)^{a+a^{\prime}+\left\langle b^{\prime}, c\right\rangle} X^{b+b^{\prime}} Z^{c+c^{\prime}}\)

同理,qp可以写成\(q p=(-1)^{a+a^{\prime}+\left\langle b, c^{\prime}\right\rangle} X^{b+b^{\prime}} Z^{c+c^{\prime}}\)

很容易发现,\(p q=(-1)^{\left\langle c, b^{\prime}\right\rangle+\left\langle b, c^{\prime}\right\rangle} q p\),如果-1上面的指数是0,那么他们就对易,反之,如果上面的指数是1,那么他们就反对易。

而这个,我们又可以写成这样的形式\(\left\langle c, b^{\prime}\right\rangle+\left\langle b, c^{\prime}\right\rangle=\left(\begin{array}{ll}b^{T} & c^{T}\end{array}\right)\left(\begin{array}{cc}0_{n} & I_{n} \\ I_{n} & 0_{n}\end{array}\right)\left(\begin{array}{l}b^{\prime} \\ c^{\prime}\end{array}\right)=\left(\begin{array}{ll}b^{T} & c^{T}\end{array}\right) \Lambda\left(\begin{array}{l}b^{\prime} \\ c^{\prime}\end{array}\right)\)

所以泡利矩阵是否对易的关键记载于看\((b c)\)和\((b' c')\)之间是否垂直了,这里垂直的顶i的是定义是symplectic inner product

量子纠错码——Stabilizer codes的更多相关文章

  1. 量子纠错码——Clifford group

    Clifford code Clifford group是什么? 简单的公式来表达,就是 \(Cl_{n}=\left\{U: U P_{n} U^{\dagger} \in P_{n}\right\ ...

  2. Note: Clay Codes: Moulding MDS Codes to Yield an MSR Code

    Background Erasure Code 纠删码:与纠错码.检错码类似,均为线性分组码,通过编码可以在有限损失的前提下恢复丢失的数据.  假设每个磁盘存储w比特数据,设\(d_0,\cdots ...

  3. 使用python编写量子线路打印的简单项目,并使用Sphinx自动化生成API文档

    技术背景 该文章一方面从量子线路的打印着手,介绍了一个简单的python量子线路工程.同时基于这个简单的小工程,我们顺带的介绍了python的API文档自动化生成工具Sphinx的基本使用方法. 量子 ...

  4. UVA-146 ID Codes

    It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exerc ...

  5. Lattice Codes

    最近在做的一些关于lattice codes的工作,想记录下来. 首先,我认为lattice coding是一种联合编码调制技术,将消息序列映射到星座点.其中一个良好的性质是lattice point ...

  6. System Error Codes

    很明显,以下的文字来自微软MSDN 链接http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx M ...

  7. Windows Locale Codes - Sortable list(具体一个语言里还可具体细分,中国是2052,法国是1036)

    Windows Locale Codes - Sortable list NOTE: Code page is an outdated method for character encoding, y ...

  8. Bar codes in NetSuite Saved Searches(transport/reprint)

    THIS IS A COPY FROM BLOG Ways of incorporating Bar Codes into your Netsuite Saved Searches.    Code ...

  9. Secret Codes

    Secret Codes   This is a list of codes that can be entered into the dialer to output the listed info ...

随机推荐

  1. 生成3D多棱柱的方法(3D立体图片)

    先上一个效果图 主要运用的技术点就是 确认基点,确认每个盒子旋转的度数 3D变换  transform: rotateY(-360deg); 景深  perspective 3D舞台 transfor ...

  2. android学习笔记——计时器实现

    根据android疯狂讲义来写写代码,在博客里面将这些写过的代码汇总一下.实现的功能很简单:就是一个简单的计时器,点击启动按钮会开始计时,当计时到20秒时会自动停止计时. 界面如下: 界面代码: &l ...

  3. 第一节:python基础

    2020-03-29 python基础: 多种python版本,直接编码让c解释的是cpython,pypy是最快的python 编码:ascll码只能表示256种无法表示中文,utf8个根据字符长短 ...

  4. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  5. tortoise 设置beyond Compare比较工具

    1.桌面右击tortoiseSVN->setting->Diff Viewer面板,选择external,选中beyond Compare路径

  6. Springboot:logback日志管理(九)

    Springboot默认使用的日志框架就是logback 创建自定义的logback-spring.xml放在resources类目录下即可 logback-spring.xml: <?xml ...

  7. s2h-HTTP Status 404 - No result defined for action and result input错误解决

    今天做个小项目,用的是ssh,结果在运行的时候出现HTTP Status 404 - No result defined for action and result input的错误. 首先认真检查所 ...

  8. 去掉input阴影&隐藏滚动条&抛异常&预加载&curl传json

    1.隐藏滚动条:-webkit-scrollbar{ display:none; } 2.array_walk():数组里的每个元素执行一个自定义函数: array_map():数组里的每个元素执行一 ...

  9. docker配置dns与容器的访问控制(6)

    Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和DNS配置?秘诀就是它利用虚拟文件来挂载到容器的3个相关的配置文件. 进入容器内使用mount命令可以看到挂载信息,这种机制可 ...

  10. Openstack Keystone V3 利用 curl 命令获取 token

    curl -i \ -H "Content-Type: application/json" \ -d ' { "auth": { "identity& ...