Link
Warmup
又被神仙 \(\texttt{LMOliver}\) 带入坑.
A1. Generate state |00⟩ + |01⟩ + |10⟩
Descripition
给出量子态 \(\left|00\right>\) ,构造 \(\frac{1}{\sqrt{3}}\left(\left|00\right>+\left|10\right>+\left|01\right>\right)\).
Solution
对两个量子位进行 H
操作.
再 CCNOT(qs[0], qs[1], tmp)
.
观测 tmp
,显然若 tmp
为 \(One\) ,则 qs[]
不满足条件, 将其重置并重复上述操作; 否则满足要求.
易知每次成功的概率为 \(\frac{3}{4}\) ,所以只要多试几次就好了.
Code
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
using (tmp = Qubit()) {
repeat {
H(qs[0]);
H(qs[1]);
Controlled X(qs[0 .. 1], tmp);
let result = M(tmp);
} until (result == Zero)
fixup {
ResetAll(qs[0 .. 1]);
Reset(tmp);
}
}
}
}
A2. Generate equal superposition of four basis states
Descripition
给出四个经典态 \(\psi_0,\psi_1,\psi_2,\psi_3\), 构造 \(\left|S\right>=\frac{1}{2}\left(\left|\psi_0\right>+\left|\psi_1\right>+\left|\psi_2\right>+\left|\psi_3\right>\right)\).
Solution
考虑构造一个映射 \(f\):
\[ \left|00\right>\mapsto\left|\psi_0\right> \]
\[ \left|10\right>\mapsto\left|\psi_1\right> \]
\[ \left|01\right>\mapsto\left|\psi_2\right> \]
\[ \left|11\right>\mapsto\left|\psi_3\right> \]
也就是说这要构造出 \(\left|S'\right>=\frac{1}{2}(\left|00\right>+\left|10\right>+\left|01\right>+\left|11\right>)\).相信大家都会
那么如何构造映射 \(f\) .
用 ControlledOnBitString
可以很好地解决这个问题.
Code
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Do(N : Int, qs : Qubit[], bits : Bool[]) : Unit {
body (...) {
for (i in 0 .. N - 1) {
if (bits[i] == true) {
X(qs[i]);
}
}
}
adjoint auto;
controlled auto;
controlled adjoint auto;
}
operation Clear(bits : Bool[], tmp : Qubit[]) : Unit {
body (...) {
for (i in 0 .. 1) {
if (bits[i] == true) {
X(tmp[i]);
}
}
}
adjoint auto;
controlled auto;
controlled adjoint auto;
}
operation Solve (qs : Qubit[], bits : Bool[][]) : Unit {
let N = Length(qs);
using (tmp = Qubit[2]) {
H(tmp[0]); H(tmp[1]);
(ControlledOnBitString([false, false], Do))(tmp[0 .. 1], (N, qs, bits[0]));
(ControlledOnBitString([false, true], Do))(tmp[0 .. 1], (N, qs, bits[1]));
(ControlledOnBitString([true, false], Do))(tmp[0 .. 1], (N, qs, bits[2]));
(ControlledOnBitString([true, true], Do))(tmp[0 .. 1], (N, qs, bits[3]));
(ControlledOnBitString(bits[0], Clear))(qs, ([false, false], tmp));
(ControlledOnBitString(bits[1], Clear))(qs, ([false, true], tmp));
(ControlledOnBitString(bits[2], Clear))(qs, ([true, false], tmp));
(ControlledOnBitString(bits[3], Clear))(qs, ([true, true], tmp));
}
}
}
B
B 系列的题完全不会.那就咕了吧
C1. Alternating bits oracle
Descripition
判断一个量子串是否 \(01\) 交替.
Solution
翻转奇数位判断是否全为 \(\left|1\right>\) ,再对偶数位做同样处理.
Code
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (x : Qubit[], y : Qubit) : Unit {
body (...) {
let N = Length(x);
if (N == 1) {
X(y);
} else {
MultiX(x[0 .. 2 .. (N - 1)]);
Controlled X(x, y);
MultiX(x[0 .. 2 .. (N - 1)]);
MultiX(x[1 .. 2 .. (N - 1)]);
Controlled X(x, y);
MultiX(x[1 .. 2 .. (N - 1)]);
}
}
adjoint auto;
}
}
C2. "Is the bit string periodic?" oracle
Descripition
判断一个量子串是否是周期串.
Solution
本题借 \(6\) 个量子位不会 \(TLE\).
用 tmp[i]
表示 \(i+1\) 是否为循环节,最后只要判断 tmp[]
中是否有 \(\left|1\right>\) 即可.
如何判断 \(i\) 是否为循环节?
对于 \(x[]\) ,其循环节为 \(k\) 当且仅当 \(\forall i\in\left[1,n-k\right],x[i]==x[i+k]\).
又是判断相等,用老套路就珂以了 \(\texttt{QAQ}\).
Code
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Do(N : Int, p : Int, x : Qubit[], tmp : Qubit) : Unit {
body (...) {
for (i in 0 .. N - p - 1) {
CNOT(x[i + p], x[i]);
}
MultiX(x[0 .. N - p - 1]);
Controlled X(x[0 .. N - p - 1], tmp);
MultiX(x[0 .. N - p - 1]);
for (i in N - p - 1 .. -1 .. 0) {
CNOT(x[i + p], x[i]);
}
}
adjoint auto;
}
operation Solve (x : Qubit[], y : Qubit) : Unit {
body (...) {
let N = Length(x);
if (N != 1) {
using (tmp = Qubit[N - 1]) {
for (i in 1 .. N - 1) {
Do(N, i, x[0 .. N - 1], tmp[i - 1]);
}
X(y);
(ControlledOnInt(0, X))(tmp, y);
for (i in 1 .. N - 1) {
Do(N, i, x[0 .. N - 1], tmp[i - 1]);
}
}
}
}
adjoint auto;
}
}
C3. "Is the number of ones divisible by 3?" oracle
Descripition
判断一个量子串中 \(\left|1\right>\) 的个数是否为 \(3\) 的倍数
Solution
构造一个门 Rorate(A, B, C)
.
使得 \(\left(A,B,C\right)\rightarrow\left(B,C,A\right)\).
则 \(\left|1\right>\) 的个数为 \(3\) 的倍数当且仅当 \(A\) 为 \(\left|1\right>\).
这个 Rorate
门只要两个 SWAP
就能轻松解决惹.
因为 Rorate
中的 SWAP
可以使用 Controlled
门来控制,辣么 Rorate
门当然也珂以啦.
那么只要用每一个量子位来控制是否执行 Rorate
操作即可.
Code
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Rorate (A : Qubit, B : Qubit, C : Qubit) : Unit {
body (...) {
SWAP(A, B);
SWAP(B, C);
}
adjoint auto;
controlled auto;
controlled adjoint auto;
}
operation Solve (x : Qubit[], y : Qubit) : Unit {
body (...) {
let N = Length(x);
using (tmp = Qubit[3]) {
X(tmp[0]);
for (i in 0 .. N - 1) {
Controlled Rorate(x[i .. i], (tmp[0], tmp[1], tmp[2]));
}
CNOT(tmp[0], y);
for (i in 0 .. N - 1) {
Controlled Rorate(x[i .. i], (tmp[0], tmp[1], tmp[2]));
}
for (i in 0 .. N - 1) {
Controlled Rorate(x[i .. i], (tmp[0], tmp[1], tmp[2]));
}
X(tmp[0]);
}
}
adjoint auto;
}
}
D
懒得写,直接放代码.(只有D1-D4)
D1
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
H(qs[0]);
}
}
D2
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
let N = Length(qs);
for (i in 0 .. N - 1) {
MultiX(qs[i + 1 .. N - 1]);
for (j in 0 .. i - 1) {
Controlled H(qs[i .. N - 1], qs[j]);
}
MultiX(qs[i + 1 .. N - 1]);
}
}
}
D3
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
let N = Length(qs);
for (i in 1 .. N - 1) {
CNOT(qs[0], qs[i]);
}
H(qs[0]);
for (i in 1 .. N - 1) {
CNOT(qs[0], qs[i]);
}
}
}
D4
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (qs : Qubit[]) : Unit {
let N = Length(qs);
if (N != 2) {
Controlled MultiX([qs[N - 1]], qs[0 .. N - 2]);
MultiX(qs[0 .. N - 2]);
X(qs[0]);
for (i in 1 .. N - 2) {
Controlled X(qs[0 .. i - 1], qs[i]);
}
Controlled MultiX([qs[N - 1]], qs[0 .. N - 2]);
}
for (i in 1 .. N - 1) {
CNOT(qs[0], qs[i]);
}
H(qs[0]);
for (i in 1 .. N - 1) {
CNOT(qs[0], qs[i]);
}
}
}
D4 是建立在 D3 基础上的.
经过一波转换发现只要构造一个 "减一器"就可以啦.
什么?剩下的题目?鸽了!