对于普通消费者来说,购买量子计算机还遥不可及,至少如果你想拥有一个,因为IBM提供了通过云服务进行访问的量子计算服务。目前最接近消费者端的量子计算机是(SpinQ的Triangulum);然而,它仍然价格不菲,买得起的消费者只能处理三个量子位。
因为我无法拥有自己的量子计算机,这让我开始好奇最便宜的量子技术是否能在更合理的消费者价格范围内买到。经过一番研究,我发现了量子随机数生成器,利用量子光学效应生成真正的随机数。这种设备可以在PCie卡上以2000美元的价格买到,虽然价格不菲,但还是在我的预算范围内。
ID Quantique SA Quantis-PCIe-40M
仅靠量子随机数生成器本身就可以用于量子加密,其实就是一次性密码本算法,但使用的是真正的随机数。不过,我有个更好的主意,能更充分地利用这张卡。
量子力学允许你利用一种称为玻恩规则(也叫玻恩定律)的理想概率分布来预测实验结果。例如,如果你对一个量子比特应用了一个_哈达玛门_后立刻再次测量它,玻恩规则预测它有50%的概率是0,50%的概率是1。如果你反复做这个实验,每一个测量结果(在量子计算术语中通常称为拍次),最终会趋向于50%的0和50%的1。
如果我想模拟一个真正的量子计算机,我首先需要根据波恩规则计算给定程序的理想概率分布。然而,这还不足以进行正确的模拟,因为在现实世界中,你不会从量子计算机的输出中得到理想概率分布。你需要反复运行同一程序,运行几千次甚至几万次的shots,然后形成一个结果分布,这个分布应该随着你运行次数的增加而_收敛_到波恩规则预测的理想分布。
因此,如果我想模拟一个真正的量子计算机,我可以计算理想的概率分布,然后从该分布中 取样。如果理想的分布是75%的概率为0和25%的概率为1,如果你在这个分布上取样10000次,那么模拟器需要进行10000次类似掷一个75%:25%偏好的骰子的操作,你的结果将是这10000次随机取样的结果。你可能运行一次发现结果为7532:2468,再运行一次结果可能为7498:2502,等等,每次运行你都应该得到一个略有不同的分布,但所有结果都应大致接近理想的分布。
这种采样正是量子随机数生成器发挥作用的地方:随机的骰子投掷可以由量子随机数生成器驱动,这样采样就是真正随机的。因此,你可以拥有一个量子计算机模拟器,虽然它在技术上是一个模拟器,而不是真正的量子计算机,它不仅会输出与真实量子计算机相同的结果,而且由于这些结果是基于量子光学效应的选择,所以它们也是真正随机的。
计算理想化的概率分布是一个相当计算密集的任务,因为随着量子比特数量的增加,它的复杂性呈指数级增长。有了8GB的内存,我可以轻松地将一个14量子比特的模拟装进8GB内存,因此通过添加至少8GB内存的GPU,我可以使模拟器运行到14量子比特的速度变得相当快。幸运的是,与量子随机数生成器不同,拥有这么多内存的GPU价格相当便宜。我买了一个二手的,只花了80美元,非常划算,对于这个任务来说非常合适。
Radeon RX 580 2048SP (8 GB) 显卡
软件界面软件方面,整个核心应用程序是用C语言编写的,并使用OpenCL进行GPU加速。我将其分为两个部分。第一部分是模拟器的核心,它仅从命令行接收程序输入,并在命令行上输出结果到标准输出。第二部分是一个基于Web的图形用户界面,可以通过API密钥向我的家庭服务器发送ping请求来运行程序并获取结果,从而使我能够随时随地使用它。
命令行接口如前所述,命令行接口仅期望通过标准输入提供给它的程序。这些程序的语法基本参照了OpenQASM 2.0。我个人对Qiskit有些批评,因为我认为让别人先学Python再去学量子计算有点荒谬。这就像如果有人想学如何为RISC-V编程,所以他们拿到了一个模拟器,但模拟器却要求他们用Python编写函数来调用每条指令。
我觉得这有点傻,我宁愿模拟器直接让我用直接以汇编代码形式编写指令。OpenQASM就是这么做的,作为学习平台,它更加直观易懂,而且在IBM的云量子计算网站上也是个选项。下面是一个使用这种语法编写的简单程序示例,该程序创建两个贝尔态纠缠量子比特,并返回其理想化的概率分布。
$ ./bin/QAnsel <<EOF
输入:qreg q[2]; # 初始化两个量子比特
输入:h q[0]; # 对第一个量子比特进行Hadamard门操作
输入:cx q[0], q[1]; # 使用CNOT门将第一个量子比特的状态转移到第二个量子比特
输入:born q; # 创建量子态
输入:EOF
00 50% # 二进制字符串00的概率为50%
01 0% # 二进制字符串01的概率为0%
10 0% # 二进制字符串10的概率为0%
11 50% # 二进制字符串11的概率为50%
QREG 指令只是告诉模拟器需要分配多少量子位的内存空间。模拟器技术上允许最多 16 个量子位,但超过 14 个量子位无法放入 GPU 中,并且实际上,除非你使用 5 个或更多量子位,否则加载数据到 GPU 的开销大于实际计算收益,因此模拟器不会使用 GPU。接下来的 H 指令对第一个量子位应用了 Hadamard 门,将其置于 0 和 1 的叠加状态。接下来的 CX 指令是受控非门(如果第一个量子位是 1,则翻转第二个量子位;否则不做任何改变)。BORN 指令显示 Born 规则的结果,如下所示,量子位的值是完全相关的,彼此一致,如你所见。
这是一个理想化的结果,在真实的量子计算机上你不会得到这样的结果。如果我们想要更接近现实的结果,首先需要通过CREG指令引入经典比特。然后,我们需要使用测量指令MEASURE,该指令会测量一个量子比特,并将测量结果存储到一个经典比特中。最后,我们还需要在这些经典比特上执行SAMPLE指令。该指令只能在程序的最后调用一次,相当于告诉模拟器要反复运行该程序,并返回结果的分布。
下面是一个使用QAnsel工具运行的量子计算代码示例及其结果:
$ ./bin/QAnsel <<EOF
qreg q[2]; // 定义一个有两个量子位的量子寄存器
creg c[2]; // 定义一个有两个经典位的经典寄存器
h q[0]; // 对第一个量子位应用Hadamard门
cx q[0], q[1]; // 对第一个量子位和第二个量子位应用CNOT门
measure q[0] -> c[0]; // 测量第一个量子位并将结果存储在第一个经典位
measure q[1] -> c[1]; // 测量第二个量子位并将结果存储在第二个经典位
sample c; // 采样经典寄存器中的值
EOF
00 5033 50.33% // 结果 00 出现了 5033 次,占 50.33%
01 0 0.00% // 结果 01 出现了 0 次,占 0.00%
10 0 0.00% // 结果 10 出现了 0 次,占 0.00%
11 4967 49.67% // 结果 11 出现了 4967 次,占 49.67%
从结果可以看出,测量结果主要集中在00和11两个状态上。
这实际上会利用量子随机数生成器来采样这些结果,因此你最终得到的具体样本是真正随机的,这更贴近真正的量子计算机的实际输出。默认情况下,它使用最大采样数量,即10000。然而,你可以使用“-s”命令行选项来更改最大采样数量,或者你可以通过SHOTS后跟一个数字来设置低于最大值的采样数量。
我甚至可以把这些测量简化为一次,并将一个量子比特置于0和1的叠加态。每次我跑这个程序,它就会给我一个0或者1的结果。再次强调,这实际上是通过量子随机数生成器来计算的,所以我可以将这个程序用作真正的量子硬币(量子随机数生成器)。
$ ./bin/QAnsel -r <<EOF
shots 1;
qreg q[1];
creg c[1];
h q[0];
measure q[0] -> c[0];
sample c;
EOF
0 1 100.00%
1 0 0.00%
运行量子程序并查看结果
$ ./bin/QAnsel -r <<EOF
shots 1;
qreg q[1];
creg c[1];
h q[0];
measure q[0] -> c[0];
sample c;
EOF
0 0 0.00%
1 1 100.00%
注意我添加了“-r”参数。这是因为如果你在一个没有量子随机数生成器的电脑上运行这个程序,我仍然希望程序能够正常工作,因此默认情况下,它不会使用量子随机数生成器,而是使用C语言中的_rand()函数。添加“-r”参数会让程序尝试寻找硬件随机数生成器,并根据优先级规则选择一个。当前的优先级规则如下:(1)Quantis-PCIe-40M,(2)TrueRNG V3,(3)Intel Secure Key。第一个是量子随机数生成器,第二个是非量子的硬件随机数生成器,第三个则利用CPU上的热噪声,大多数现代Intel CPU支持这一点,而较旧的CPU可能不支持。
它实际上默认也不会使用 GPU。它默认不使用任何特殊硬件,这使得它几乎可以在任何平台上轻松运行,即使是最基本的平台。我甚至在MIPS路由器和我的Sega Dreamcast上也成功运行了这个模拟器。如果你想要利用专用硬件,需要使用“-o”选项并设置优化级别。优化级别采用八进制,数值范围为0到7,它们代表开启不同的功能。最低有效位控制“智能”优化的开启或关闭,比如指令重排序;次低位开启多线程;最高有效位开启GPU加速,因此,优化级别7表示所有优化功能均开启。
如果你之前在真正的量子计算机上运行过程序的话,你会注意到上面的贝尔态示例看起来与实际量子计算机的输出有所不同,主要原因是真正的量子计算机会有噪声。因为根据玻恩规则的理想概率分布,01和10的结果概率为0%,所以在实际采样中不会出现这些结果,但在实际的量子计算机中,由于噪声的影响,你有时可能会看到01和10的结果。你还可以通过添加NOISE指令并输入一个表示噪声程度的数字来模拟噪声。
$ ./bin/QAnsel <<EOF
设置噪声为0.01; # Set noise to 0.01
qreg q[2];
creg c[2];
h q[0];
cx q[0], q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
sample c;
EOF # 结束输入 (End input)
00 出现4964次,占49.64%
01 出现5次,占0.05%
10 出现2次,占0.02%
11 出现5029次,占50.29%
图形用户界面(通常称为GUI)
我决定用HTML5编写界面,这样我就可以在任何地方托管它,然后可以从任何有网络连接的设备上访问我的模拟器,因为只需向我的服务器发送一个简单的ping请求即可获取结果。服务器中包含一个量子随机数生成器,用于获取结果。这也使得将模拟器变成Android应用变得非常简单,因为我只需将HTML5页面嵌入WebView即可。
界面采用了拖放式设计。指令假定从左至右依次执行。没有“屏障”这样的指令,因为模拟器绝不会以相反顺序执行指令。它会尝试将指令分组以优化它们,甚至会重新排列您的指令以更高效地分组,但如果重新排列可能导致程序流程混乱,模拟器就不会重新排列。因此,您可以确信指令将始终按照从左到右的顺序执行。
以下你可以看到贝尔态是通过拖拽和放置界面设置的。当你拖放指令时,它会在左下角构建出类似于OpenQASM的代码。当你按下播放按钮时,它会使用你的API密钥将代码发送到我的服务器。如果API密钥有效,它将运行代码并返回结果数据。结果会以图表的形式在右下角显示。
图形按钮可以生成程序结果的 CSV 文件,这个文件可以在 Excel 或 WPS表格中打开。截图按钮可以让你获取截图,这些截图可以很容易地复制到文章或书籍中。以下是一个演示如何截图贝尔态程序的例子。
下例例子
GHZ 实验在这篇文章中,我讲解了GHZ实验,这是证明量子干涉效应无法通过局域隐变量理论解释的最简单实验,并讨论了在不同个轴上测量粒子的方法。
在量子力学中,概率不是粒子本身的固有属性,而是粒子与测量装置之间的一种关系。这意味着如果你想从不同的轴测量粒子,你可以旋转测量装置,或者旋转粒子本身,两种做法的效果是一样的。如果你熟悉 Bloch 球的表示,不要认为这代表的是粒子的固有状态,因为即使没有改变粒子本身,旋转测量装置也会改变 Bloch 球上的方向。
因此,我们可以沿不同轴测量我们的量子比特,就像在GHZ实验中那样,通过应用适当的指令来旋转它。不应用任何逻辑门相当于沿着Z轴测量,应用Hadamard门相当于沿着X轴测量,而先应用s- dagger门再应用Hadamard门相当于沿着Y轴测量。
我们因此可以执行如下的GHZ实验中的前三个测量步骤。这些描述会用布尔代数来表示测量结果,其中0+0=0,0+1=1,1+0=1,1+1=0。需要注意的是,这就是布尔代数中加法运算的定义。
X₁+Y₂+Y₃=1
Y₁+X₂+Y₃=1
Y₁+Y₂+X₃=1
我们可以在不进行实验的情况下,通过将这三个方程相加来提前预测X₁X₂X₃的结果。当这些值相等时,输出总是为0,因为0+0=0且1+1=0,因此,我们可以将这些相等的情况相互抵消。
- (X₁+Y₂+Y₃)+(Y₁+X₂+Y₃)+(Y₁+Y₂+X₃)=1+1+1
- X₁+X₂+X₃+Y₁+Y₁+Y₂+Y₂+Y₃+Y₃=1
- X₁+X₂+X₃=1
不过,如果我们真的做这个实验,这就是我们的结果。
这三个变量的和为零:X₁+X₂+X₃=0
每个实验都始于除了测量设置不同之外相同的初始条件,因为你是在不同的轴上测量量子位。你无法以一种数学上与实际测量结果一致的方式同时预先设定所有值,这表明结果不能被预先确定。
虽然我说过初始条件并非完全相同,因为你改变了测量设置,但如果你假设改变测量设置会改变初始值,你就可以预先分配所有的值。这样做的话,存在的问题是,由于你涉及的是三个量子比特,原则上可以将它们分隔很远的距离,因此你必须假设其中一个量子比特能瞬间知道其他量子比特的测量轴,不论它们相隔多远。这无法与狭义相对论相容。
德祖萨-约萨算法德-乔扎算法开始定义了四类不同的函数:“常量”和“平衡”。这两类函数都接受一个量子位输入,并输出一个量子位。“常量”函数总是输出固定的0或1,而“平衡”函数则输出的0和1数量相同。
你不能用这种方式在量子力学中实现这些函数,因为量子逻辑门必须是幺正的,而幺正操作总是可逆的。你虽然可以仅根据输出来确定平衡型函数的输入,却不能仅根据输出来确定常数型函数的输入。
你可以添加辅助(ancilla)量子比特来实现这一点。这些额外的量子比特携带一个额外的信息位,使得函数变为可逆。这使得我们可以将原本一个输入和一个输出的函数扩展到两个输入和两个输出。假设输入为 x,辅助量子比特为 y,那么我们可以创建四个新的函数集,输出分别为 x 和 y xor f(x)。这样编码后,我们得到四个新的函数,如下面所示。
在量子算法中实现这些功能会非常简单。实际上,左上角的功能不做任何事情,因为输入和输出是相同的,因此不需要任何指令。左下角的功能只是翻转最高有效比特,只需对它使用X指令即可完成。右上角的功能相当于CX指令,也叫受控非门(Controlled-NOT gate),在此,最低有效量子位充当控制量子位的角色。右下角的功能可通过先对最低有效量子位应用X门,以该位作为控制位施加CX门,再对该位施加一次X门来实现。
假设你有一个黑盒函数,有时被称为一个 oracle,你并不知道这个函数是如何工作的。你所能做的只是通过给它一个 输入值 来 查询 函数并观察它的 输出。假设这个 oracle 是上述四个函数之一,你的任务是仅通过你的询问来尝试判断这个 oracle 是否为 恒定 或 均衡 类型。
如果你只被允许进行一次查询,乍一看似乎不可能实际判断这是一个常数函数还是一个平衡函数。为什么呢?注意,在常量函数这边的每个输入输出组合,在平衡函数那边都有一个对应的组合,这意味着这样的查询实际上无法让你得到确切的答案。
然而,事实证明,实际上可以通过干扰效应仅用一次查询来判断它是常量还是平衡的。为此,你只需要对最重要的量子位应用X指令,对两个量子位都执行H门操作,然后将两个量子位传递给函数,再对两个输出再次执行H门操作。结果将出现在最右边的量子位上,因此,你无需关注最左边的量子位。
常量,(左上方)
常量(左下角)
平衡的(右上)
平衡的(右下)
因此,只需一次查询,你就能准确判断该函数是否恒定或平衡。
其他相关信息 Android应用程序因为界面只是用HTML5与外部服务器通信,还有一个Android版本,您可以通过点击下载按钮来获取它。
布洛赫球可视化器模拟器还内置了一个布洛赫球可视化工具,让你更直观地了解逻辑门是如何工作的。这与模拟本身是分开的,因为它不需要向外部服务器发送请求来显示布洛赫球。这个球只用于展示逻辑门的工作原理,并不反映模拟的实际状态。你可以点击球形按钮来查看布洛赫球可视化器,然后点击逻辑门按钮,看看状态变化是如何反映在布洛赫球上的。
我在这篇文章里提到过如何为量子计算中的“薛定谔方程”搭建这个可视化器,可以看看这篇文章。
我能用它吗?也许可以这么说。它现在可以在这个链接找到: 链接。不过,因为我经常停用它来进行维护,它可能根本无法使用。这里有一个可用的API密钥,但是,如果公众请求变得太多,我可能会随时取消这个密钥。如果你在点击播放按钮时看到类似“未知服务器错误”的信息,那可能是因为服务器已经关闭了。
cHVibGljOjdlNjlmMzZhMWE4OWVhNzBlYzRhNDIwZmI5YjgzMGM0MjBhYjkzZTE0ZTlhMmY2ZGE2OGJjMWQzNTVjNjExZWY6Zm9sZW9hcGkuY29tL3FhbnNlbA
目前核心命令行应用的源代码尚不可用,因为目前还不太成熟,不足以分享,但以后可能会开放。如果有提供的话,可以在下载按钮的下拉菜单中找到。我还打算做一个库版本。库将提供一个功能,可以接受伪OpenQASM代码作为输入,并编译成字节码,之后你就可以用这个字节码来模拟。
共同学习,写下你的评论
评论加载中...
作者其他优质文章