「CF1116」Microsoft Q# Coding Contest - Winter 2019

Warmup

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

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

Intention

给出量子态 \(\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

Intention

给出四个经典态 \(\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

Intention

判断一个量子串是否 \(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

Intention

判断一个量子串是否是周期串.

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

Intention

判断一个量子串中 \(\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 基础上的.

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

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

猜你喜欢

转载自www.cnblogs.com/realSpongeBob/p/10502173.html