L. 量子计算程序设计

传统 1000 ms 256 MiB
标准 IO
Special Judge

题目描述

本题没有输入,你的代码只需输出解决方案。

形式上,一个量子比特 ψ\vert\psi\rangle 的状态可表示为 α0+β1\alpha\vert0\rangle+\beta\vert1\rangle。其中,α,β\alpha,\beta 是复数,且满足 α2+β2=1\vert\alpha\vert^2+\vert\beta\vert^2=1。在这里,我们仅将其视为抽象的数学对象,而不探讨其物理意义。

若对 ψ\vert\psi\rangle 进行测量:

  • α2\vert\alpha\vert^2 的概率测得 00,且 ψ\vert\psi\rangle 将坍缩为 0\vert0\rangle(即 10+011\cdot\vert0\rangle+0\cdot\vert1\rangle)。
  • β2\vert\beta\vert^2 的概率测得 11,且 ψ\vert\psi\rangle 将坍缩为 1\vert1\rangle(即 00+110\cdot\vert0\rangle+1\cdot\vert1\rangle)。

对于多个量子比特,例如 ψ1=α0+β1\vert\psi_1\rangle=\alpha\vert0\rangle+\beta\vert1\rangleψ2=γ0+δ1\vert\psi_2\rangle=\gamma\vert0\rangle+\delta\vert1\rangle,其复合系统的状态是

ψ1ψ2=(α0+β1)(γ0+δ1)=αγ00+αδ01+βγ10+βδ11\begin{aligned} \vert\psi_1\rangle\vert\psi_2\rangle&=(\alpha\vert0\rangle+\beta\vert1\rangle)(\gamma\vert0\rangle+\delta\vert1\rangle)\\ &=\alpha\gamma\vert0\rangle\vert0\rangle+\alpha\delta\vert0\rangle\vert1\rangle+\beta\gamma\vert1\rangle\vert0\rangle+\beta\delta\vert1\rangle\vert1\rangle \end{aligned}

容易发现,αγ2+αδ2+βγ2+βδ2=1\vert\alpha\gamma\vert^2+\vert\alpha\delta\vert^2+\vert\beta\gamma\vert^2+\vert\beta\delta\vert^2=1

不同的量子比特之间并非总是可分离的。考虑一般的双量子比特系统的状态

ψ1ψ2=α0000+α0101+α1010+α1111\vert\psi_1\rangle\vert\psi_2\rangle=\alpha_{00}\vert0\rangle\vert0\rangle+\alpha_{01}\vert0\rangle\vert1\rangle+\alpha_{10}\vert1\rangle\vert0\rangle+\alpha_{11}\vert1\rangle\vert1\rangle

其中,α002+α012+α102+α112=1\vert\alpha_{00}\vert^2+\vert\alpha_{01}\vert^2+\vert\alpha_{10}\vert^2+\vert\alpha_{11}\vert^2=1。若上式无法被分解为 (α0+β1)(γ0+δ1)(\alpha\vert0\rangle+\beta\vert1\rangle)(\gamma\vert0\rangle+\delta\vert1\rangle),则称 ψ1\vert\psi_1\rangleψ2\vert\psi_2\rangle 处于纠缠态。纠缠态形成后,即使两个量子比特在空间上远离,它们之间的关联也仍然存在。

若对该系统中的 ψ1\vert\psi_1\rangle 进行测量:

  • α002+α012\vert\alpha_{00}\vert^2+\vert\alpha_{01}\vert^2 的概率测得 00,且系统将坍缩为 0(α000+α011)α002+α012\dfrac{\vert0\rangle(\alpha_{00}\vert0\rangle+\alpha_{01}\vert1\rangle)}{\sqrt{\vert\alpha_{00}\vert^2+\vert\alpha_{01}\vert^2}}
  • α102+α112\vert\alpha_{10}\vert^2+\vert\alpha_{11}\vert^2 的概率测得 11,且系统将坍缩为 1(α100+α111)α102+α112\dfrac{\vert1\rangle(\alpha_{10}\vert0\rangle+\alpha_{11}\vert1\rangle)}{\sqrt{\vert\alpha_{10}\vert^2+\vert\alpha_{11}\vert^2}}

对该系统中的 ψ2\vert\psi_2\rangle 进行测量同理。ψ1\vert\psi_1\rangleψ2\vert\psi_2\rangle 的地位平等。

量子门是操作量子比特的基本工具。

在本题中,可能用到且只能使用 H 门、X 门、Z 门、CNOT 门。

使用 H 门、X 门、Z 门须选定一个目标比特 ψ\vert\psi\rangle,设操作前 ψ=α0+β1\vert\psi\rangle=\alpha\vert0\rangle+\beta\vert1\rangle,则:

  • H 门会使 ψ=α0+12+β012\vert\psi\rangle=\alpha\dfrac{\vert0\rangle+\vert1\rangle}{\sqrt2}+\beta\dfrac{\vert0\rangle-\vert1\rangle}{\sqrt2}
  • X 门会使 ψ=α1+β0\vert\psi\rangle=\alpha\vert1\rangle+\beta\vert0\rangle
  • Z 门会使 ψ=α0β1\vert\psi\rangle=\alpha\vert0\rangle-\beta\vert1\rangle

使用 CNOT 门须选定一个控制比特 ψ1\vert\psi_1\rangle 和一个目标比特 ψ2\vert\psi_2\rangle,两者不能是同一个比特,设操作前

ψ1ψ2=α0000+α0101+α1010+α1111\vert\psi_1\rangle\vert\psi_2\rangle=\alpha_{00}\vert0\rangle\vert0\rangle+\alpha_{01}\vert0\rangle\vert1\rangle+\alpha_{10}\vert1\rangle\vert0\rangle+\alpha_{11}\vert1\rangle\vert1\rangle

那么 CNOT 门会使

ψ1ψ2=α0000+α0101+α1011+α1110\vert\psi_1\rangle\vert\psi_2\rangle=\alpha_{00}\vert0\rangle\vert0\rangle+\alpha_{01}\vert0\rangle\vert1\rangle+\alpha_{10}\vert1\rangle\vert1\rangle+\alpha_{11}\vert1\rangle\vert0\rangle

需要注意的是,使用量子门对所涉及的量子比特与其它量子比特之间的纠缠情况不作要求。例如,假设

ψ1ψ2ψ3=001+110\vert\psi_1\rangle\vert\psi_2\rangle\vert\psi_3\rangle=\vert0\rangle\vert0\rangle\vert1\rangle+\vert1\rangle\vert1\rangle\vert0\rangle

若以 ψ3\vert\psi_3\rangle 为控制比特、ψ1\vert\psi_1\rangle 为目标比特使用 CNOT 门,则结果是

ψ1ψ2ψ3=101+110\vert\psi_1\rangle\vert\psi_2\rangle\vert\psi_3\rangle=\vert1\rangle\vert0\rangle\vert1\rangle+\vert1\rangle\vert1\rangle\vert0\rangle

小 L 学习量子计算的初步知识后,暗想:何意味?

于是,他设计了 HYW\mathcal{HYW} 语言——一种极其简单的量子计算程序设计语言。

一个 HYW\mathcal{HYW} 程序由若干条语句构成,每条语句占据一行。解释器将从前到后依次执行语句。

语句分为测量语句和操作语句。

测量语句的格式是 measure x\texttt{measure }x,表示对 ψx\vert\psi_x\rangle 进行测量,结果为 0011

操作语句分两种:

格式 含义
<statement>\texttt{<statement>} 执行 <statement>\texttt{<statement>}
if <condition> then <statement>\texttt{if <condition> then <statement>} <condition>\texttt{<condition>} 为真,执行 <statement>\texttt{<statement>}

这其中的 <statement>\texttt{<statement>} 分四种:

格式 含义
H x\texttt{H x} ψx\vert\psi_x\rangle 为目标比特,使用 H 门
X x\texttt{X x} ψx\vert\psi_x\rangle 为目标比特,使用 X 门
Z x\texttt{Z x} ψx\vert\psi_x\rangle 为目标比特,使用 Z 门
CNOT x y\texttt{CNOT x y} ψx\vert\psi_x\rangle 为控制比特,ψy\vert\psi_y\rangle 为目标比特,使用 CNOT 门

<condition>\texttt{<condition>} 的格式是 mx=y\texttt{m}x\texttt{=}y,表示「第 xx 次测量(measure\texttt{measure})的结果是 yy」。

例如,初始时 ψ1ψ2=00\vert\psi_1\rangle\vert\psi_2\rangle=\vert0\rangle\vert0\rangle,要使 ψ1ψ2=00+112\vert\psi_1\rangle\vert\psi_2\rangle=\dfrac{\vert0\rangle\vert0\rangle+\vert1\rangle\vert1\rangle}{\sqrt2}HYW\mathcal{HYW} 程序可以是

H 1
CNOT 1 2

执行每条语句后的情况如下:

  1. ψ1ψ2=0+120\vert\psi_1\rangle\vert\psi_2\rangle=\dfrac{\vert0\rangle+\vert1\rangle}{\sqrt2}\vert0\rangle
  2. ψ1ψ2=00+112\vert\psi_1\rangle\vert\psi_2\rangle=\dfrac{\vert0\rangle\vert0\rangle+\vert1\rangle\vert1\rangle}{\sqrt2}

此后,要使 ψ1ψ2\vert\psi_1\rangle\vert\psi_2\rangle 变回 00\vert0\rangle\vert0\rangleHYW\mathcal{HYW} 程序可以是

measure 1
if m1=1 then X 1
if m1=1 then X 2

执行每条语句后的情况如下:

  1. 可能是 ψ1ψ2=00\vert\psi_1\rangle\vert\psi_2\rangle=\vert0\rangle\vert0\rangle(测得 00),也可能是 ψ1ψ2=11\vert\psi_1\rangle\vert\psi_2\rangle=\vert1\rangle\vert1\rangle(测得 11)。
  2. 可能是 ψ1ψ2=00\vert\psi_1\rangle\vert\psi_2\rangle=\vert0\rangle\vert0\rangle,也可能是 ψ1ψ2=01\vert\psi_1\rangle\vert\psi_2\rangle=\vert0\rangle\vert1\rangle
  3. ψ1ψ2=00\vert\psi_1\rangle\vert\psi_2\rangle=\vert0\rangle\vert0\rangle

现在,考虑这样一个问题:

初始时,ψ1=α0+β1\vert\psi_1\rangle=\alpha\vert0\rangle+\beta\vert1\rangleψ2=0\vert\psi_2\rangle=\vert0\rangleψ3=0\vert\psi_3\rangle=\vert0\rangle

我们的目标是使 ψ1=0\vert\psi_1\rangle=\vert0\rangleψ2=0\vert\psi_2\rangle=\vert0\rangleψ3=α0+β1\vert\psi_3\rangle=\alpha\vert0\rangle+\beta\vert1\rangle

你需要设计一个不超过 1616 条语句的 HYW\mathcal{HYW} 程序,来实现这一目标。

输入格式

本题没有输入。

输出格式

输出你的解决方案。不要输出多余的内容。

样例

假设你的 HYW\mathcal{HYW} 程序是

H 1
CNOT 1 2

你可以提交以下 C++ 代码:

#include <bits/stdc++.h>
int main() {
  puts("H 1");
  puts("CNOT 1 2");
  return 0;
}

当然,如果这样,你将得到 Wrong Answer。