zoukankan      html  css  js  c++  java
  • 「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 基础上的.

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

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

  • 相关阅读:
    某直聘python岗位 Python爬虫
    出生率创40年来最低,人口几近负增长,微博爬虫爬评论
    关于jieba分词 Python
    爬取某东商品数据 Python基于selenium
    Putty连Ubuntu
    下载些音乐 Python
    抓一下严禁失德艺人曲线复出的评论 Python
    几种方式保存爬虫爬取的数据 Python
    冬天来了,用Python看看哪里的人最喜欢吃火锅
    Pyecharts绘制精美图标并做成可视化大屏 Python
  • 原文地址:https://www.cnblogs.com/realSpongeBob/p/CF1116.html
Copyright © 2011-2022 走看看