《计算复杂性:现代方法》——1.5 不可计算性简介

1.5 不可计算性简介

下面的事情看起来似乎很“显然”:只要时间充分,任何函数均是可被计算的。然而,这已被证明是错误的。因为,存在这样的函数,它们在无穷步骤内不能被计算!本节简要介绍这一事实和由此引出的学科分支。21尽管严格地讲不可计算性对复杂性而言不是必需的,但它却构成了复杂性的知识背景。

下面的定理证明了不可计算函数的存在性。(事实上,该定理证明了值域为{0,1}的不可计算函数(即语言)的存在性。值域为{0,1}的不可计算函数也就是众所周知的不可判定语言。)定理的证明用到了对角线方法,这种方法在复杂性理论中也很有用;参见第3章。

1.5.1 停机问题

读者可能不禁要问,为什么我们要研究上面定义的函数UC是不是可计算的呢?什么样的人会关心到底如何计算这种刻意构造的函数呢?

现在我们展示一个更自然的不可计算函数。函数HALT以序对〈α,x〉为输入,它输出1当且仅当α表示的图灵机Mα在输入x上会在有限步骤内停机。这肯定是我们需要计算的函数。因为,给定一个计算机程序和输入之后,我们肯定希望知道该程序在该输入上是否会陷入无限循环。如果计算机能够计算函数HALT,则设计无bug的计算机软件和硬件将变得容易得多。遗憾的是,现在我们可以证明计算机计算不了这个函数,即使运行时间允许任意的长。

定理1.11证明过程中的技术称为归约。定理的证明已经表明,如果假设存在计算HALT的算法,则必存在计算UC的算法;这就将对UC的计算归约到了对HALT的计算。在本书中,我们将遇到许多归约。通常,归约技术用于证明问题B至少同问题A一样难,这正是通过证明“如果给定求解问题B的算法,则存在求解问题A的算法”来完成的。

还有许多有趣的不可计算(也称不可判定)函数,参见习题1.12。甚至,还有一些不可计算函数,它们看起来似乎与图灵机或算法毫无关系。例如,下面的问题不能被任何图灵机在有限时间内求解:给定一族整系数的多项式方程,问这些方程是否存在整数解(亦即,是否存在变量的整数赋值满足所有方程)。这就是著名的丢番图问题。1900年,希尔伯特曾将寻找丢番图方程的求解算法这一问题作为最难的23个开放数学问题之一提出。本章的注记提到了更多关于可计算理论的资源。

1.5.2 哥德尔定理

1900年,当年最卓越的数学家戴维·希尔伯特提出了一项雄心勃勃的研究计划。该计划旨在为所有数学建立严格的公理系统,以最终确保所有为真的结论均能被严格地证明。罗素(Russell)、怀特黑德(Whitehead)、策梅洛(Zermelo)、弗兰克尔(Fraenkel)等数学家在接下来的数十年中各自提出了自己的公理系统,但他们谁也不能证明他们的公理系统既是完备的(亦即,能证明所有正确的数学结论)又是可靠的(亦即,不会证明出错误的结论)。1931年,库尔特·哥德尔证明了所有这些努力都注定要失败,这震惊了整个数学界。因为他证明了:对于任意可靠的公理和推理规则的系统,23必存在正确的数论结论不能在中被证明。下面,我们给出这个结果的证明概要。注意,我们给出的讨论并不针对哥德尔的更强结论;亦即,数学上任何一个足够强的公理系统均不能证明其自身的一致性。采用下面的思想,要证明这个更强的结论也不是很难。

注意,上述构造最早是由图灵给出的。该构造过程还表明,所有正确数学结论构成的集合是不可判定的。这同时还表明,希尔伯特著名的判定问题无解。(希尔伯特曾提出用“机械过程”(现译作“算法过程”)来判定数学结论的真伪。)

时间: 2024-09-04 19:12:41

《计算复杂性:现代方法》——1.5 不可计算性简介的相关文章

《面向对象分析与设计》一1.5面向对象方法的发展史及现状简介

1.5面向对象方法的发展史及现状简介 在这里把面向对象方法的发展分为三个阶段:雏形阶段.完善阶段和繁荣阶段. (1) 雏形阶段 20世纪60年代挪威计算中心开发的Simula 67,首先引入了类的概念和继承机制,它是面向对象语言的先驱.该语言的诞生是面向对象发展史上的第一个里程碑.随后20世纪70年代的CLU.并发Pascal.Ada和Modula2等语言对抽象数据类型理论的发展起到了重要作用,它们支持数据与操作的封装.犹他大学的博士生Alan Kay设计出了一个实验性的语言Flex,该语言从

Java的方法重载与变量作用域简介_java

方法的重载上面使用的max方法仅仅适用于int型数据.但如果你想得到两个浮点类型数据的最大值呢? 解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示: public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } 如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用: 如果传递的事double型参数,则doubl

《计算复杂性:现代方法》——导读

前 言 计算复杂性理论在过去三十多年中发展迅速.自1990年以来取得的出人意料的结果和基础性的结果本身就可以写出一部书.这些结果涉及的领域非常广泛,包括:经典复杂性类的概率型新定义(IP=PSPACE和各种PCP定理)以及它们在近似算法中的应用,肖尔(Shor)为量子计算机设计的整数因数分解算法,对人们目前处理著名的P?=NP问题 译文用"P?=NP"来表示原文中的"P versus NP".--译者注的各种方法为什么未能获得成功的理解,去随机化理论和基于计算难

Java设计模式之模版方法模式简介_java

Java设计模式的模板方法模式定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.属于行为类模式 如下图所示: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract cla

排序研究前戏_计算复杂性

计算复杂性理论(Computational complexity theory)是理论计算机科学和数学的一个分支,它致力于将可计算问题根据它们本身的复杂性分类,以及将这些类别联系起来.一个可计算问题被认为是一个原则上可以用计算机解决的问题,亦即这个问题可以用一系列机械的数学步骤解决,例如算法. 如果一个问题的求解需要相当多的资源(无论用什么算法),则被认为是难解的.计算复杂性理论通过引入数学计算模型来研究这些问题以及定量计算解决问题所需的资源(时间和空间),从而将资源的确定方法正式化了.其他复杂

排序研究前戏-计算复杂性

计算复杂性理论(Computational complexity theory)是理论计算机科学和数学的一个分支,它致力于将可计算问题根据它们本身的复杂性分类,以及将这些类别联系起来.一个可计算问题被认为是一个原则上可以用计算机解决的问题,亦即这个问题可以用一系列机械的数学步骤解决,例如算法. 如果一个问题的求解需要相当多的资源(无论用什么算法),则被认为是难解的.计算复杂性理论通过引入数学计算模型来研究这些问题以及定量计算解决问题所需的资源(时间和空间),从而将资源的确定方法正式化了.其他复杂

YUM解决RPM包安装依赖关系及yum工具介绍本地源配置方法详解_Linux

1.背景概述 在实际生产环境下,对于在linux系统上安装rpm包,主要面临两个实际的问题 1)安装rpm包过程中,不断涌现的依赖关系问题,导致需要按照提示或者查询资料,手工安装更多的包 2)由于内外网的隔离,无法连接外网的yum源 鉴于上述因此,本文将详细介绍,yum工具以及配置本地yum源的方法 2.yum工具简介 •yum工具作为rpm包的软件管理器,可以进行rpm包的安装.升级以及删除等日常管理工作,而且对于rpm包之间的依赖关系可以自动分析,大大简化了rpm包的维护成本. •yum工具

因子分解机模型简介

Steffen Rendle于2010年提出Factorization Machines(下面简称FM),并发布开源工具libFM. 一.与其他模型的对比 与SVM相比,FM对特征之间的依赖关系用factorized parameters来表示.对于输入数据是非常稀疏(比如自动推荐系统),FM搞的定,而SVM搞不定,因为训出的SVM模型会面临较高的bias.还有一点,通常对带非线性核函数的SVM,需要在对偶问题上进行求解:而FM可以不用转为对偶问题,直接进行优化. 目前还有很多不同的factor

面向 Java 开发人员的 Ajax: Google Web Toolkit 入门

简介: Ajax 被用于创建更加动态和交互性更好的 Web 应用程序.Google Web Toolkit (简称GWT) 是 Google 推出的 Ajax 应用开发包,GWT 支持开发者使用Java 语言开发 Ajax 应用.本文中作者将介绍如何使用 GWT 开发 Ajax 应用的基本方法和步骤. ## Ajax简介 ## Ajax是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写,由XHTML.CSS.JavaScript.XMLHttpReq