前情回顾:

简单的量子算法(一):Hadamard 变换、Parity Problem

好的,现在开始正版的故事,Simon’s Algorithm

问题:

有一个secret string,是n位的0,1串 \(s \in \{0,1 \} ^n\)

现在有一个黑盒子,f(x),我们对他唯一的了解就是 \(f(x)=f(x \oplus s)\) ,输入的x也是n位的0,1串 \(x \in \{0,1 \} ^n\)

请问,要多少次,我们可以找到这个secret string?

经典解法:

如果我们能找到 \(x\) 和 \(x \oplus s\) ,那么非常容易,就可以得到s,只要 \(x\oplus x\oplus s\) 。

那么如果找到两个输入拥有相同的输出呢?

这个问题其实是另一个大家都很熟悉的问题的变形,一群人中,要多少人就有两个人的生日是相同的,印象中,23人两个人的生日是相同的概率就大于50%了,如果有60个人,那么两个人生日相同的概率就超过99%了。

这个问题和生日问题的解法是一样的,就不再累述了,想要知道的请搜索生日问题,在这里,我们给出一个大概的答案,是 \(2^{n/2}\) c次。

量子解法:

量子解法一共有三步:

  • set up random superposition $ \frac{1}{\sqrt2} |r\rangle +\frac{1}{\sqrt2} |r \oplus s \rangle$
  • Fourier Sample to get a random y: \(y·s=0 (\mod 2)\)
  • repeat step n-1 times to generate n-1 linear equation.

接下来,我们来一步一步的看每个步骤在做什么,以及怎么做:

第一步,制造叠加态 $ \frac{1}{\sqrt2} |r\rangle +\frac{1}{\sqrt2} |r \oplus s \rangle$ ,这个可以通过图a实现。

首先通过第一个\(H ^{\otimes n}\) 门,我们n比特的 \(|0\rangle\) 就成功的变成了叠加态 $\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle $

和 \(|b\rangle\) 一起通过 \(U_f\) ,得到的结果是 $\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle|b\oplus f(x) \rangle $

测量 \(|b\oplus f(x) \rangle\) ,只有结果是测量结果的 \(|x\rangle\)还在,其他的 \(|x\rangle\) 都会坍缩,基于这个黑盒子的特性,那么只有 $|r\rangle $ 和 \(|r \oplus s \rangle\) 会留下来,因为他们的f(x)是一样的,r是任意的一个序列,测量的结果对应哪个r就是哪个r。

至此我们得到了想要的叠加态 $ \frac{1}{\sqrt2} |r\rangle +\frac{1}{\sqrt2} |r \oplus s \rangle$

第二步,Fourier Sampling

对我们得到的叠加态 $ \frac{1}{\sqrt2} |r\rangle +\frac{1}{\sqrt2} |r \oplus s \rangle$ Fourier Sampling

再次通过\(H ^{\otimes n}\) 我们能得到什么?

依照我们在简单的量子算法(一)中的结论,我们知道 \(H^{\otimes n} |u\rangle = \sum_x \frac{-1^{u·x}}{2^{\frac{n}{2}}} |x\rangle\) 。

那么

\[\begin{align} H^{\otimes n} ( \frac{1}{\sqrt2} |r\rangle +\frac{1}{\sqrt2} |r \oplus s \rangle) &= \frac{1}{\sqrt2}\sum_x \frac{-1^{r·x}}{2^{n/2}} |x\rangle+\frac{1}{\sqrt2}\sum_x \frac{-1^{(r\oplus s)·x}}{2^{n/2}} |x\rangle \\ &=\sum_x (\frac{-1^{r·x}}{2^{(n+1)/2}}+\frac{-1^{(r\oplus s)·x}}{2^{(n+1)/2}}) |x\rangle \\ &= \sum_x\frac{1^{r·x}+(-1)^{(r\oplus s)·x}}{2^{(n+1)/2}}|x\rangle \end{align}\]

此时,我们的问题已经集中在了 \(1^{r·x}+(-1)^{(r\oplus s)·x}\) 上。

\((-1)^{(r\oplus s)·x}\) 可以写成\((-1)^{s·x}*(-1)^{r·x}\) (至于为什么可以,大家可以试一下都是按位操作,一共也就4种可能

那么每种可能的概率的公式就可以写成\(\frac{((-1)^{s·x}+1)*(-1)^{r·x}}{2^{(n+1/2)}}\)

如果 \(s·x=0\) 那么,这个概率正好为 \(\frac{(-1)^{r·z}}{2^{(n-1)/2}}\)

如果 \(s·x=-1\) 那么,这个概率正好为0

那么这又说明了什么呢?

这个说明只要我们测量 \(|x\rangle\) ,那么我们得到的x一定是 \(s·x=0\) 的,因为不为0的都被抵消了。

那么得到了x,又意味着什么呢?

\(s·x=0\) 事实上我们是得到了一个等式 $s_1x_1+s_2x_2+……+s_nx_n =0 \mod 2 $

第三步:

如果我们把第一次测量得到的x编号为 \(x^1\) ,那么我们得到了等式 $s_1x_1^1+s_2x_2^1+……+s_nx_n^1 =0 \mod 2 $

第二次测量,得到等式 $s_1x_1^1+s_2x_2^1+……+s_nx_n^1 =0 \mod 2 $

以此类推,测量n-1次,得到了n-1个等式的方程式组。

$s_1x_1^1+s_2x_2^1+……+s_nx_n^1 =0 \mod 2 $

$s_1x_1^1+s_2x_2^1+……+s_nx_n^1 =0 \mod 2 $

……

$s_1x_1^{n-1}+s_2x_2^{n-1}+……+s_nx_n^{n-1} =0 \mod 2 $

n-1个等式,n个未知数( \(s_1,s_2,……,s_n\) ),一般来说会有两组解,一组是全零的平凡解,这个是我们不要的,而另一组解就是我们的答案 \(s\) 。

成功的概率:

上述的解方程有一个前提,那就是这是一个线性方程组,如果这个不是线性的,那么测量n-1次是不可能得答案的。

那么我测量得到的x组成的方程是线性方程的概率是多少呢?

我们可以列一个表格来看看:

失败的情况 失败的概率 成功的概率
\(x^1\) 0 \(\frac{1}{2^{n-1}}\) \(1-\frac{1}{2^{n-1}}\)
\(x^2\) 0、 \(x^1\) \(\frac{2}{2^{n-1}}\) \(1-\frac{1}{2^{n-2}}\)
\(x^3\) 0 、 \(x^1\) 、\(x^2\) 、\(x^1+x^2\) \(\frac{4}{2^{n-1}}\) \(1-\frac{1}{2^{n-3}}\)
…… …… ………… \(1-\frac{1}{2^{n-1}}\)
\(x^{n-1}\) 0 、 \(x^1\) ……\(x^1+x^2\)……\(x^1+x^2+……+x^n-2\) \(\frac{2^{n-2}}{2^{n-1}}\) \(1-\frac{1}{2}\)

每次的测量失败的情况分为以下三种情况:

  • 测量出来全是0
  • 测量出来结果和前面的是一样的
  • 测量出来的结果是前面测量结果的线性组合

因为这里算的成功概率都是独立的成功概率,所以要算整体的成功概率是他们的乘积

\(\frac{1}{2}*\frac{3}{4}*\frac{7}{8}*……*\frac{2^{n-1}-1}{2^{n-1}}\)

上面这个式子求极限是一个q series的问题,感兴趣的朋友可以去查一下怎么求解,这里直接给出概率,约等于0.28878

注意:

大家是不是以为这样子就万事大吉了?

No,这里还有一个需要注意的地方,可能很多朋友已经意识到了,量子态不是测量完就坍塌吗?为什么可以测量n-1次?

事实上,这是把第一部分给做了n-1次,这样你才可以有n-1个 \(|x\rangle\) 给你测量找出满足线性条件的x。

参考资料:

Quantume Mechanics & Quantume Computation Lecture 8

简单的量子算法(二):Simon's Algorithm的更多相关文章

  1. 简单的量子算法(一):Hadamard 变换、Parity Problem

    Hadamard Transform Hadamard 变换在量子逻辑门中提过,只不过那时是单量子的Hadamard门,负责把\(|1\rangle\)变成\(|-\rangle\),\(|0\ran ...

  2. 一文读懂 深度强化学习算法 A3C (Actor-Critic Algorithm)

    一文读懂 深度强化学习算法 A3C (Actor-Critic Algorithm) 2017-12-25  16:29:19   对于 A3C 算法感觉自己总是一知半解,现将其梳理一下,记录在此,也 ...

  3. [转]EM算法(Expectation Maximization Algorithm)详解

    https://blog.csdn.net/zhihua_oba/article/details/73776553 EM算法(Expectation Maximization Algorithm)详解 ...

  4. Floyd判圈算法 Floyd Cycle Detection Algorithm

    2018-01-13 20:55:56 Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm) ...

  5. 如何简单解释 MapReduce算法

    原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...

  6. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  7. 机器学习算法-K-NN的学习 /ML 算法 (K-NEAREST NEIGHBORS ALGORITHM TUTORIAL)

    1为什么我们需要KNN 现在为止,我们都知道机器学习模型可以做出预测通过学习以往可以获得的数据. 因为KNN基于特征相似性,所以我们可以使用KNN分类器做分类. 2KNN是什么? KNN K-近邻,是 ...

  8. sklearn简单实现机器学习算法记录

    sklearn简单实现机器学习算法记录 需要引入最重要的库:Scikit-learn 一.KNN算法 from sklearn import datasets from sklearn.model_s ...

  9. 史上最简单的排序算法?看起来却满是bug

    大家好,我是雨乐. 今天在搜论文的时候,偶然发现一篇文章,名为<Is this the simplest (and most surprising) sorting algorithm ever ...

随机推荐

  1. Qt-vs-addin失效的问题

    Qt-vs-addin的小问题 使用Visual Studio进行Qt开发的时候,需要安装一个插件.然而有时候这个插件的一些工具却莫名其妙的失效: 其中qt5appwrapper.exe用于编辑Qt工 ...

  2. TThread类详解

    TThread是一个抽象类,可以创建几个独立的线程.类关系 TObject在一个多线程的应用程序中创建一个TThread的后子类代表一个线程.每一新子类的TThread对象的实例是一个新的线程.从TT ...

  3. 大数据基础之Kafka(1)简介、安装及使用

    kafka2.0 http://kafka.apache.org 一 简介 Kafka® is used for building real-time data pipelines and strea ...

  4. c++汉诺塔相关知识总结1

    困扰已久,难以攻克的汉诺塔总结来啦 Part One 汉诺塔到底是什么呢? 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金 ...

  5. Java虚拟机详解(一)------简介

    本系列博客我们将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机.以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Oracle官网以及各种文献进行整理,并加以验证 ...

  6. 《Spring Cloud》学习(一) 服务治理!

    前言:之前网上学习过Spring Cloud,对于工作上需要是足够了,总归对于一些方面一知半解,最近难得有些闲暇时间,有幸读了崔永超先生的<Spring Cloud 微服务实战>,一方面记 ...

  7. ph模拟登录获取信息

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

  8. Go - Slice 切片

    概述 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除. len() 和 cap() 返回结果可相同和不同. 声明切片 //demo_7.go package main impo ...

  9. CSS3边框与圆角

    1. CSS3 圆角 border-radius 属性 一个最多可指定四个border -*- radius属性的复合属性,这个属性允许你为元素添加圆角边框!语法:border-radius: 1-4 ...

  10. 深度优先(DFS)和广度优先(BFS)

    深度优先(Depth-First-Search)和广度优先(Breadth-First-Search)是我们遍历图的两种方式,它们都属于穷举法,用来系统的遍历图中的所有顶点 关于如何再一个有向图/无向 ...