美文网首页
量子编程-Q#-02-量子基础

量子编程-Q#-02-量子基础

作者: 西海岸虎皮猫大人 | 来源:发表于2020-04-12 18:07 被阅读0次

贝尔态,演示量子纠缠

1 概念

传统bit只能表示0或1,量子位可以同时为0和1的叠加,可以从概念上理解为矢量
两个经典状态是两个方向,100%为0或100%为1
测量行为产生一个二级制结果(0或1)改变量子位状态,量子位由叠加态变为经典状态
此后,相同的无干预测量产生相同的二进制结果
多个量子位可以纠缠
当测量一个被纠缠的量子位时,另一个状态也被更新

2 Q#运算

2.1 目标

准备两个特定量子态的量子位,使用Q#改变其状态并演示叠加和纠缠
演示量子位\运算和测量

2.2 代码

Bell.qs

namespace Quantum.Bell {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;

    // 参数q1表示一个量子位, 参数desired表示我们希望量子位所处的状态
    operation Set(desired : Result, q1 : Qubit) : Unit {
        // 使用M操作对量子位进行测量
        // 量子位测量总是返回0或1
        // 如果测量结果不是期望的结果,则使用X操作进行反转,0到1或1到0
        if (desired != M(q1)) {
            X(q1);
        }
    }

    operation TestBellState(count : Int, initial : Result) : (Int, Int) {

        mutable numOnes = 0;
        using (qubit = Qubit()) {

            for (test in 1..count) {
                Set(initial, qubit);
                let res = M(qubit);

                // 计算1的次数
                if (res == One) {
                    set numOnes += 1;
                }
            }
            Set(Zero, qubit);
        }

        // 返回1的次数和0的次数
        return (count-numOnes, numOnes);
    }
}

host.py

import qsharp

from qsharp import Result
from Quantum.Bell import TestBellState

initials = (Result.Zero, Result.One)

for i in initials:
  res = TestBellState.simulate(count=1000, initial=i)
  (num_zeros, num_ones) = res
  print(f'Init:{i: <4} 0s={num_zeros: <4} 1s={num_ones: <4}')

执行结果:

Init:0    0s=1000 1s=0
Init:1    0s=0    1s=1000
2.3说明

Q#中的变量总是不可变的,变量的值被绑定前不能改变
let关键字声明变量的绑定
可变的变量使用mutable 关键字声明
不可变变量可使用set语句改变值
变量类型由编译器推断,无需声明类型
using语句用于在一段代码中分配量子位
所有量子位被动态分配和释放

2.4 异常

如果在vscode中创建子文件夹存放Bell.qs和Host.py,会报异常:

ModuleNotFoundError: No module named 'Quantum'

3 叠加

使用Hadamard运算
如果一个量子位处于0或1的状态,H运算将使得量子位处于50%的测量为1,50%的测量为0的状态
修改上述Bell.qs

H(qubit);
let res = M(qubit);

执行结果:

Init:0    0s=524  1s=476
Init:1    0s=512  1s=488

4 纠缠

使第一个量子位处于叠加态,在测量第一个量子位之前,使用CNOT运算,如果第一个量子位是1则反转第二个量子位

代码

Bell.qs

namespace Quantum.Bell {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;

    operation Set(desired : Result, q1 : Qubit) : Unit {
        if (desired != M(q1)) {
            X(q1);
        }
    }    
    
    operation TestBellState(count : Int, initial : Result) : (Int, Int, Int) {
        mutable numOnes = 0;
        mutable agree = 0;
        using ((q0, q1) = (Qubit(), Qubit())) {
            for (test in 1..count) {
                Set(initial, q0);
                Set(Zero, q1);
                // q0叠加
                H(q0);
                // 如果q0为1则反转q1
                CNOT(q0, q1);
                // 测量q0
                let res = M(q0);
                // 如果q1和q0的结果相同
                if (M(q1) == res) {
                    set agree += 1;
                }

                // Count the number of ones we saw:
                if (res == One) {
                    set numOnes += 1;
                }
            }
            
            Set(Zero, q0);
            Set(Zero, q1);
        }

        // Return number of times we saw a |0> and number of times we saw a |1>
        return (count-numOnes, numOnes, agree);
    }
}

Host.py

import qsharp

from qsharp import Result
from Quantum.Bell import TestBellState

initials = {Result.Zero, Result.One} 

for i in initials:
    res = TestBellState.simulate(count=1000, initial=i)
    (num_zeros, num_ones, agree) = res
    print(f'Init:{i: <4} 0s={num_zeros: <4} 1s={num_ones: <4} agree={agree: <4}')

执行结果:

Init:0    0s=480  1s=520  agree=1000
Init:1    0s=511  1s=489  agree=1000

相关文章

网友评论

      本文标题:量子编程-Q#-02-量子基础

      本文链接:https://www.haomeiwen.com/subject/ujkbmhtx.html