第六个知识点:我们怎么把NP问题解释成一组可以在多项式内证明的命题

原文地址:http://bristolcrypto.blogspot.com/2014/11/52-things-number-6-how-can-we-interpret.html

这是密码学52件事的第六篇,我们继续解释复杂性理论,这篇我们给NP问题另一个定义。(注:就是说这节中,我们把"问题是否为NP的"转换为另一组可以在多项式时间内判定的定理)。

这个问题是紧接着上一周的问题的。上周我们回答了什么是复杂NP类问题。这周我们回答一个相关的问题---我们怎么把NP解释成一组能被多项式时间检查的命题。

现在我们看一个直觉上的"一个问题是NP的"这意味着什么?他不仅仅是一个直观的定义,更是清晰的说明了为什么这类复杂性问题对密码学和世界上其他问题那么重要。现在在我们讨论怎么用之前,我们先给出定义:

NP 是一类能在多项式时间内确定的问题

NP 是存在多项式时间运行的Verifier

这到底啥意思?首先我们有一个元素\(x\),我们想要知道是否\(x \in L\)(\(L\)是NP语言)。我们有一个证明\(P\)对\(x\)输出一个证据\(w\),这可能需要要给多项式时间在给定\(x\)寻找\(w\)。然后如果我们给出\(x\)和\(w\)到我们的验证器\(V\),\(V\)能够在多项式时间内输出是否\(x \in L\)。

我在看到这里的时候以我的知识有点不懂。 这里就是交互式证明系统,限制了交互的时间复杂度。那为什么非要给出一个V,然后给出一个P呢。这个是交互式证明系统定义的一部分。在这种计算模型(交互式证明系统)下,限制一下计算时间,就可以给出了NP问题的定义。 这里我十分推荐读下这节Sipser's Introduction to the Theory of Computation, section 7.3.

这个定义似乎和上一周给出的不同,但是实际上他们是等价的。(Sipser的书中有精确的定义)。非正式的说,他们的等价性是因为\(w\)可以是NDT在每个分支节点做出的决定的序列,这样就从非确定的降级成确定的自动机了。(上面的那节也给出了精确的证明)。

因此为什么这个问题在密码学中那么有用呢?本质上,我们有一类这样的原因,如果你没有witness(凭据?密钥?)可以用指数时间来检查,但是如果你有这个witness那么你就可以用多项式时间来完成。这是很多密码学算法的feel。(23333)。如果你不知道key那么你就很难解密这个消息,如果你知道key那么你很快就能解密出消息。

一个警告:虽然密码学中使用NP问题看起来是个不错的做法。但是它可能不是那么简单。因为NP问题的语言是基于最坏时间的。然而密码学中的算法是基于平均时间的。例如,我们有一种NP语言,一个元素需要指数级的时间求解,其他元素都非常快。这不是好的加密方案。我们希望对所有的消息都是安全的。而不是仅仅一个。

现在我们知道整数因子分解不知道是不是NP完全的,也不知道是不是P类问题。但是它是一个例子。说明我想要说的关于仔细选择NP实例的问题。一般来说,找到一个数的因数很容易。其中一半能被2整除。但是如果我们选择一个特定的我们将会很难分解。让我们集中思路在形式\(N = p * q\)对\(p,q\)素数。现在如果这两个数字有一个很小,那么分解它也是容易的,我们希望这两个数字大小相同。由此我们可以根据这个构建加密方案(RSA)。

[1] Equivalence_of_definitions

第六个知识点:我们怎么把NP问题解释成一组可以在多项式内证明的命题的更多相关文章

  1. 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么

    第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...

  2. 第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证

    第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证 这是密码学52件事系列中第16篇,这周我们描述关于DSA,Schnorr和RSA-FDH的密钥生成,签名和验证. 1. ...

  3. 第二十六个知识点:描述NAF标量乘法算法

    第二十六个知识点:描述NAF标量乘法算法 NAF标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间.下面是具体细节: 让\ ...

  4. 第三十六个知识点:Index Calculus算法

    第三十六个知识点:Index Calculus算法 我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法. 注意这里Index Calculus算法没有找到合适 ...

  5. python基础知识第六篇(知识点总结)

    ####################### 整理 ################# # 一.数字# int(..) # 二.字符串# replace(替换)/find/join/strip(移除 ...

  6. Cassandra学习六 一些知识点

    http://www.flyml.net/2016/09/08/cassandra-tutorial-java-api-example/ Cassandra对查询的支持很弱,只支持主键列及索引列的查询 ...

  7. SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数

    概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...

  8. Scipy的stats模块包含了多种概率分布的随机变量,随机变量分为连续和离散两种。+忽略程序中警告信息+np.newaxis解释

  9. linux运维工程师面试题收集

    面试必考 mysql5和mysql6 有什么区别 mysql-server-5.5:默认引擎改为Innodb,提高了性能和扩展性,提高实用性(中继日志自动恢复) mysql-server-5.6:In ...

随机推荐

  1. MPI 学习笔记

    目录 MPI学习笔记 MPI准备 概述 前置知识补充 环境部署 1.修改IP及主机名 2.关闭防火墙 3.实现免密码SSH登录 4.配置MPI运行环境 5.测试 程序的执行 编译语句 运行语句 MPI ...

  2. LeetCode 从头到尾打印链表

    LeetCode 从头到尾打印链表 题目描述 输入一个链表头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 一得之见(Jav ...

  3. Vue相关,vue.nextTick

    vue中有一个较为特殊的API,nextTick.根据官方文档的解释,它可以在DOM更新完毕之后执行一个回调,用法如下: // 修改数据 vm.msg = 'Hello' // DOM 还没有更新 V ...

  4. 一份不错的Java就业指导

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢? 本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些 ...

  5. Classs类

    Classs类如何获得 获得Class对象 方式一: 通过Object类中的getClass()方法 方式二: 通过 类名.class 获取到字节码文件对象( 方式三: 通过Class类中的方法(将类 ...

  6. Linux上用Jexus部署Asp.Net网站:常规部署与Docker部署

    (一)常规部署 一.把 jexus压缩包下载到linux临时文件夹中. cd /tmp wget linuxdot.net/down/jexus-6.2.x-arm64.tar.gz (不同的操作系统 ...

  7. SQLServer和java数据类型的对应关系

    转载自:https://www.cnblogs.com/cunkouzh/p/5504052.html SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 ...

  8. Jenkins代码检查

    目录 一.静态代码分析 二.规范检查 PMD进行检查 分析器区别 三.持续代码质量检测 Maven与SonarQube集成 Jenkins与SonarQube集成 代码扫描 SonarQube集成p3 ...

  9. 搞IT的应届生如何写好简历?

    本人在互联网大厂和外企做过技术面试官,也有过校招和招聘应届毕业生的经验,所以自认为在这个问题上有一定的发言权.   应届毕业生(其实其他求职者也一样)首先要知道,面试官凭什么决定这份简历有面试机会?而 ...

  10. Table.FillDown填充Table.Fill…(Power Query 之 M 语言)

    数据源: 任意列中包含空单元格 目标: 将空单元格填充为其上或其下单元格中的内容 操作过程: 选取指定列>[转换]>[填充]>[向下] 选取指定列>[转换]>[填充]&g ...