「CF1116」Microsoft Q# Coding Contest

Warmup

又被神仙 ( exttt{LMOliver}) 带入坑.

A1. Generate state |00⟩ + |01⟩ + |10⟩

Descripition

给出量子态 (left|00 ight>) ,构造 (frac{1}{sqrt{3}}left(left|00 ight>+left|10 ight>+left|01 ight> ight)).

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 ight>=frac{1}{2}left(left|psi_0 ight>+left|psi_1 ight>+left|psi_2 ight>+left|psi_3 ight> ight)).

Solution

考虑构造一个映射 (f):

[left|00 ight>mapstoleft|psi_0 ight> ]

[left|10 ight>mapstoleft|psi_1 ight> ]

[left|01 ight>mapstoleft|psi_2 ight> ]

[left|11 ight>mapstoleft|psi_3 ight> ]

也就是说这要构造出 (left|S' ight>=frac{1}{2}(left|00 ight>+left|10 ight>+left|01 ight>+left|11 ight>)).相信大家都会

那么如何构造映射 (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 ight>) ,再对偶数位做同样处理.

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 ight>) 即可.

如何判断 (i) 是否为循环节?


对于 (x[]) ,其循环节为 (k) 当且仅当 (forall iinleft[1,n-k ight],x[i]==x[i+k]).

又是判断相等,用老套路就珂以了 ( exttt{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 ight>) 的个数是否为 (3) 的倍数

Solution

构造一个门 Rorate(A, B, C).

使得 (left(A,B,C ight) ightarrowleft(B,C,A ight)).

(left|1 ight>) 的个数为 (3) 的倍数当且仅当 (A)(left|1 ight>).

这个 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 基础上的.

经过一波转换发现只要构造一个 "减一器"就可以啦.

什么?剩下的题目?鸽了!

原文地址:https://www.cnblogs.com/realSpongeBob/p/CF1116.html