基本量子门kata是Q#中为了让大家熟悉基本量子门的一系列的练习,它有以下几个主题:
基本的单量子门和多量子门
Adjoint和操控
使用量子门去改变量子位的状态
这些示例是按难度递增的顺序进行的,较难的示例会用星号标出。
输入:
1.一个量子位状态,|ψ〉 = α|0〉 + β|1〉
目标:
量子位的状态转变为α|1〉 + β|0〉
operation StateFlip (q : Qubit) : Unit is Adj+Ctl {
// The Pauli X gate will change the |0⟩ state to the |1⟩ state and vice versa.
X(q);
}
输入:
1.一个量子位状态,|ψ〉 = α|0〉 + β|1〉
目标:
按如下方式改变量子位的状态:
如果量子位处于叠加状态,根据对基础向量的影响改变其状态。
注意:|+〉 和|−〉为单个量子位形成不同的基底,称之为X基底。|0〉 和|1〉称为Z基底。
operation BasisChange (q : Qubit) : Unit is Adj+Ctl {
H(q);
}
输入:
1.一个量子位状态,|ψ〉 = α|0〉 + β|1〉
目标:
将量子状态转变为α|0〉 − β|1〉(翻转 |1〉的符号)
operation SignFlip (q : Qubit) : Unit is Adj+Ctl {
Z(q);
}
输入:
1.类型为double的表示弧度的角度α
2.一个量子位状态,|ψ〉 = β|0〉 + γ|1〉
目标:
按如下方式改变量子位的状态:
如果状态是|0〉,则转变为cosα|0〉 + sinα|1〉
如果状态是|1〉,则转变为-cosα|0〉 + sinα|1〉
如果量子位处于叠加状态,根据对基础向量的影响改变其状态。
operation AmplitudeChange (alpha : Double, q : Qubit) : Unit is Adj+Ctl {
Ry(2 * alpha, q);
}
输入:
1.类型为double的表示弧度的角度α
2.一个量子位状态,|ψ〉 = β|0〉 + γ|1〉
目标:
按如下方式改变量子位的状态:
如果状态是|0〉,不转变状态
如果状态是|1〉,则转变为
如果量子位处于叠加状态,根据对基础向量的影响改变其状态:
operation PhaseChange (alpha : Double, q : Qubit) : Unit is Adj+Ctl {
R1(alpha, q);
}
输入:
1.一个量子−β|0〉−γ|1〉.状态,|ψ〉 = β|0〉 + γ|1〉
目标:
修改量子位状态为−β|0〉 − γ|1〉
注意:这个改变本身是不可观察的——你不能在一个独立的量子位上做实验来弄清楚它是否改变了全局相位。但是,可以使用一个可控的操作去观察它的全局相位,在以后katas复杂的任务中,会使用到这种方法。
分析:应用Z门后得到β|0〉 − γ|1〉,再应用X门得到β|1〉 − γ|0〉,再应用Z门得到−β|1〉 − γ|0〉,再应用X门得到−β|0〉 − γ|1〉
operation GlobalPhaseChange (q : Qubit) : Unit is Adj+Ctl {
Z(q);
X(q);
Z(q);
X(q);
}
输入:
目标:
operation BellStateChange2 (qs : Qubit[1]) : Unit is Adj+Ctl {
Z(qs[1]);
}
输入:
目标:
operation BellStateChange2 (qs : Qubit[1]) : Unit is Adj+Ctl {
X(qs[1]);
}
输入:
目标:
operation BellStateChange3 (qs : Qubit[1]) : Unit is Adj+Ctl {
X(qs[1]);
Z(qs[1]);
}
在Q#中有介绍使用Adjoint和操控,可以查看资料:类型模型
输入:
1.两个未纠缠的量子位(储存在一个长度为2的数组中),第一个量子位态处于|ψ〉 = α|0〉 + β|1〉,第二个量子位态为|0〉,也可以写成双量子位态(α|0〉 + β|1〉) ⊗ |0〉 = α|00〉 + β|10〉
目标:
改变双量子位态为α|00〉 + β|11〉
注意:除非第一个量子位的状态为|0〉 或 |1〉,否则双量子位的状态不再能用两个量子位状态的张量积表示。从而量子位元就纠缠在一起了。
operation TwoQubitGate1 (qs : Qubit[1]) : Unit is Adj {
Controlled X(qs[0], qs[1]);
}
输入:
目标:
注意:虽然开始状态可以表示为单量子状态的一个张量积,但是得到的双量子位状态不能用这种方式表示。
operation TwoQubitGate2 (qs : Qubit[1]) : Unit is Adj {
Controlled Z(qs[0], qs[1]);
}
输入:
1.任意两量子位状态下的两个未纠缠的量子位(储存在一个长度为2的数组中): α|00〉 + β|01〉 + γ|10〉 + δ|11〉
目标:
改变双量子位态为 α|00〉 + β|10〉 + γ|01〉 + δ|11〉
operation TwoQubitGate3 (qs : Qubit[]) : Unit is Adj {
SWAP(qs[0], qs[1]);
}
输入:
1.三个量子位状态下的三个为纠缠的量子位(储存在一个长度为3的数组中): α|000〉 + β|001〉 + γ|010〉 + δ|011〉 + ϵ|100〉 + ζ|101〉 + η|110〉 + θ|111〉
目标:
改变双量子位态为 α|000〉 + β|001〉 + γ|010〉 + δ|011〉 + ϵ|100〉 + ζ|101〉 + η|111〉 + θ|110〉
输入:
1.三个量子位状态下的三个为纠缠的量子位(储存在一个长度为3的数组中): α|000〉 + β|001〉 + γ|010〉 + δ|011〉 + ϵ|100〉 + ζ|101〉 + η|110〉 + θ|111〉
目标:
改变双量子位态为 α|000〉 + β|001〉 + γ|010〉 + δ|011〉 + ϵ|100〉 + ζ|110〉 + η|101〉 + θ|111〉
operation FredkinGate (qs : Qubit[2]) : Unit is Adj {
Controlled SWAP(qs[0], (qs[1], qs[2]));
}
因为对Q#语法还不太熟悉,对量子门使用的语法可能存在差错。大家可以看对这些量子门的应用的原理,至于语法,等后期学习完Q#语言再来修改。