Category Archives: 计算理论

简述百年计算机科学

计算机科学和数学的论文读起来向来很具有挑战性,但读完后收获也不小。我也并不总能够完全理解论文中的每一个批注,有时都无法完全明白作者的结论,但阅读它们仍然大大地开阔了我的眼界。

我是比较晚才开始意识到阅读学术论文的重要性的。当还是学生的时候,我记得我只读过两篇论文,其中一篇下面我会提到。作为程序员,我并没有很强的计算机理论背景。学术论文对我来说非常生涩和遥远。因而,我花了很长时间才意识到没有阅读这些论文对我的损失有多大。

我有些同事知道了我最近对学术论文有所研究后,都在问我建议他们从哪里开始。看了Michaels FeathersFogus做的一张类似的清单后,我也编辑了一份自认为代表了过去100年计算机科学发展历程的清单。在编辑的时候,我采用了如下的选择标准:

  • 这篇论文必须改变了世界
  • 这篇论文必须颠覆了我当时的既有观点
  • 每十年只能有一篇入选

这样的选择标准一定是非常苛刻也非常主观的。如果你认为我漏掉了什么,也许你也可以编辑一份你的论文清单。

论排中律在数学上,特别是函数理论中的重要性(1923)

直觉主义的建立早于“计算理论”,但前者对后者的建立至关重要。Luitzen Egbertus Jan Brouwer的早期构想其实是对证明法的一个批判,但是Arend Heyting在后来的工作中把直觉主义结合应用到了数理逻辑中。

我选择Brouwer的论文是因为它抛弃排中律强调价值的建设。Brouwer并不认为一个命题如果不为假,则必为真。他认为,命题必须要被严谨地正面证明为真才对。

作为一名程序员,计算一个值和仅仅表示这个值的存在两者之间之间的区别是非常紧密相关的。更重要的是,起源于Brouwer想法的构造数学在随后的类型论发展中起了至关重要的作用。

论可计算数及其在可判定性问题上的应用(1936)

Alan Turing之所以在编程社区之外被众所周知,是因为他在第二次世界大战中破解了密码系统,和他所遭到的迫害而且最后自杀身亡。这篇论文诞生于战争之前,当时他还是个年轻的博士生。

我发现自己很难用直觉来理解图灵所描述的一个现象——不可计算数。我对于认为计算本身有硬性限制,这种说法既让人费解,又充满魅力。

在著名的判定性问题上,尽管图灵机和Alonzo Church的λ演算都被证明了是不朽的模拟计算方法,Turing的文章还是因为勉强打败了Church提出的解决方案被出版。

通信的数学理论(1948)

我清楚得记得还在念大学的时候读到这篇论文时的震撼。我之前认为信息就跟幽默感和美感一样,是无形的。这篇论文让信息突然变成了准确而可量化的了。

Claude E. Shannon是信息论的鼻祖,他让现代信息和通讯技术成为了可能。

非合作博弈(1950)

这篇并不是跟计算相关的,严格意义上它甚至都不能算作一篇论文。John Nash的博士学位论文整整26页却只有2个引用,其中一个还是引用他自己以前的一篇论文。在这篇文章中,Nash阐述了一个基于非合作博弈的数学理论。这个理论在经济学和冷战策略上有着深远的影响,并且最终带给了Nash诺贝尔经济学奖。

就算你仅仅想看看Nash因为无法用当时的打字机打出来而手写的那些数学符号,这篇论文已经很值得一读了。

递归函数下的符号表达式及计算机器(第一部分)(1960)

给出John McCarthy)这篇Lisp的开山之作不足为奇。这篇文章把编程原理讲解地细致到了原子级别。

Carl Sagan说过要想完完全全从零开始做一个苹果派,你先得创造一个宇宙。McCarthy在这篇文章告诉我们,要想完完全全从零开始做计算,你只需要先创造S表达式。

分布式系统中的时间,时钟和事件顺序(1978)

Leslie Lamport在这篇文章里研究了同步和因果关系的极限,可以说能让人想起爱因斯坦的相对论。虽然他的文章在互联网出现之前就有了(论文参考了ARPA net),但是这篇论文开始谈及到与现代分布式系统密切相关的协调问题。

Lamport在2013年获得了图灵奖。有个笑话是:每个人都知道他早就该得图灵奖了,但大家用了很长时间才达成了“同步”一致。

概率加密(1983)

现代加密方法往往依赖于陷门函数 —— 它们的计算量不大,但几乎无法被逆推。这使得人们可以花费很小的代价加密数据,并且可以很有信心的说这是不可逆转的过程,而且在不知道关键信息的情况下解密数据是不可能的。RSA非对称密码体系)就是一个著名的例子。

但这类方法有个漏洞,即它们仍然允许密码破译者获得加密数据的部分信息。在这篇文章中, Shafi GoldwasserSilvio Micali提出且证明了一种弥补这个漏洞的方法——用随机的方式使加密过程不确定。

编写自成长的语言(1998)

编写代码是非常有意思的,开发一门语言同样如此。在这篇论文中,Guy Steele一开始让单词只有一种意思,然后再让单词同时具有多种意思。他提出了一个很好的观点,成长是一门语言的关键,其能力应该能随着时间的推移而改变,在人们编写代码的时候就能够诞生新的特性。

这个论点最先是在一次演讲中被人们所知道的。

实用的拜占庭容错和实时恢复(2002)

互联网是个很可怕的地方。网络和服务不仅可能完全无法使用,有时也会出现各种奇怪或恶意的行为,甚至互相损害。

做一个可容错的分布式系统常常会被称为“拜占庭将军难题”——意思是假想好几只军队需要协同合作才能成功攻城,但领导他们的将军们却并不完全可靠。

在这篇文章里,Miguel CastroBarbara Liskov描述了一个很有效率的算法,来保证即使三分之一的节点以任何恶意的形式失效,系统仍然是健康的。

对今天的分布式系统而言,这类算法非常有用。比如比特币系统,用了这种算法它只要没失去一半以上的计算能力,都可保证可用。

命题类型(2014)

Philip Wadler的任何一篇论文都可以上榜。这篇论文在我写作的时候仍然是草稿,却可谓是新的经典之作,论文中Walder的引用范围从电影独立日乐团双杰,他揭露了Curry-Howard同构性这种精妙对称性的本质。

同构性记录了逻辑命题和函数式程序种类之间非同寻常的关系。更重要的是,论文的开篇引用了Brouwer在1923年的论文中提出的直觉主义,作为函数对应于传统的直觉主义的构造性证明,这篇论文验证了直觉主义的重要性。

本文在我心中占有特殊的地位,因为在Wadlerd发布最新起草的文章的那个早上,我正好在做关于Curry-Howard同构性的演讲。但幸运的是,其内容没有什么实质性的改变,因而我没有给观众过时的信息。)

总结

我开始写这篇文章的时候正在抱怨我所在行业的短视。尽管我们这个行业的历史不长,从业者仍然对历史很不熟悉。我之前听说,有人问Bjarne Stroustrup,把lambda表达式引入C++是不是因为lambda表达式是个新潮的玩意儿——lambda演算可以追溯到20世纪30年代,比C++要年纪大多了。

但当回顾这份清单上的计算机科学家们的背景时,我不得不为自己的短视感到惊讶。上面说的这12个科学家中,有10个都是男性,且为白人。

因此,我想总结说,除非我有严重的偏见,我们仅仅用到了人类才华总和中很小的一部分。当我思考过去百年我们在计算机科学里走了多远的时候,我无法想象如果能调用更多的聪明才智,下个百年我们会有多么伟大的成就。

from:http://www.techug.com/100-years-of-computer-science

【待整理】Type

Value Types and Reference Types

Types (C# Programming Guide) https://msdn.microsoft.com/en-us/library/vstudio/ms173104.aspx

类型系統http://zh.wikipedia.org/wiki/%E9%A1%9E%E5%9E%8B%E7%B3%BB%E7%B5%B1

协变(Covariance)与逆变(contravariance)

许多程序设计语言类型系统支持子类型。例如,如果CatAnimal的子类型,那么Cat类型的表达式可用于任何出现Animal类型表达式的地方。所谓的变型(variance)是指如何根据组成类型之间的子类型关系,来确定更复杂的类型之间(例如Cat列表之于Animal列表,回传Cat的函数之于回传Animal的函数…等等)的子类型关系。当我们用类型构造出更复杂的类型,原本类型的子类型性质可能被保持、反转、或忽略───取决于类型构造器英语type constructor的变型性质。例如在C#中:

  • IEnumerable<Cat>IEnumerable<Animal>的子类型,因为类型构造器IEnumerable<T>是协变的(covariant)。注意到复杂类型IEnumerable的子类型关系和其接口中的参数类型是一致的,亦即,参数类型之间的子类型关系被保持住了。
  • Action<Cat>Action<Animal>的超类型,因为类型构造器Action<T>是逆变的(contravariant)。(在此,Action<T>被用来表示一个参数类型为Tsub-T一级函数英语First-class function)。注意到T的子类型关系在复杂类型Action的封装下是反转的,但是当它被视为函数的参数时其子类型关系是被保持的。
  • IList<Cat>IList<Animal>彼此之间没有子类型关系。因为IList<T>类型构造器是不变的(invariant),所以参数类型之间的子类型关系被忽略了。

编程语言的设计者在制定数组、继承、泛型数据类等的类型规则时,必须将“变型”列入考量。将类型构造器设计成是协变、逆变而非不变的,可以让更多的程序俱备良好的类型。另一方面,程序员经常觉得逆变是不直观的;如果为了避免运行时期错误而精确追踪变型,可能导致复杂的类型规则。为了保持类型系统简单同时允许有用的编程,一个编程语言可能把类型构造器视为不变的,即使它被视为可变也是安全的;或是把类型构造器视为协变的,即使这样可能会违反类型安全。

在一门程序设计语言的类型系统中,一个类型规则或者类型构造器是:

  • 协变(covariant),如果它保持了子类型序关系≦。该序关系是:子类型≦基类型。
  • 逆变(contravariant),如果它逆转了子类型序关系。
  • 不变(invariant),如果上述两种均不适用。

C#

Java

Scala

Arrays covariance

+

(unsafe at runtime)

+

(unsafe at runtime)

_

(arrays are invariant by design)

Though, there is support for Java’s “covariant” arrays, of course.

Arrays contravariance

_

_

_

Generics variance

(covariance/contravariance)

+

Defined by a generic type creator (definition-site).

(Restricted to generic interfaces and generic delegates)

+

Defined by clients of generic type using wildcards (use-site).

+

Defined by a generic type creator (definition-site).

Also, there are existential types that cover Java’s wildcards functionality.

Overriding: return type covariance

_

+

+

Overriding: parameter type contravariance

_

_

_

【参见】

Covariance and contravariance http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

http://zh.wikipedia.org/wiki/%E9%A1%9E%E5%9E%8B%E7%B3%BB%E7%B5%B1

Comparing covariance/contravariance rules in C#, Java and Scala
http://www.codeproject.com/Articles/899319/Comparing-covariance-contravariance-rules

 

P NP问题理解

P和NP的定义

要理解P和NP问题,让我们首先来看看P和NP的定义:

P: The complexity class of decision problems that can be solved on a deterministic Turing machine in polynomial time.

NP: The complexity class of decision problems that can be solved on a non-deterministic Turing machine in polynomial time

翻译一下就是:

P类问题是指确定型图灵机可以在多项式时间内解决的问题

NP类问题是指非确定型图灵机可以在多项式时间内解决的问题

关键词:确定型/非确定型图灵机、多项式时间,要理解P和NP问题,还得先搞清楚这两个关键词的含义。

多项式时间

要理解多项式时间,把多项式时间指数时间一起看会比较容易理解

多项式时间: m(n) = O(n^k),k为常数

指数时间: m(n) = O(k^n),k为大于1的常数

之前一直理解错误,认为O(n^2)这种属于指数时间。

确定型和非确定型图灵机

图灵机是一个抽象模型,由以下几个组成部分:

  1. 一条无限长的纸带
  2. 一个读写头,可以在纸带上左右移动并读写内容
  3. 一个状态寄存器,用来存储图灵机当前的状态
  4. 一套控制规则,根据图灵机当前状态和纸带当前内容来确定下一步操作

简直就是一个终极简化版的计算机,或者可以认为是一个状态机+input/output。这是确定型状态机,一般我们提到图灵机就是指这个。

而非确定型图灵机和确定型图灵机只有一点差别,就是:控制规则这里,根据当前状态和纸带内容确定下一步操作的时候,都可能有N个分支,N个分支中只有一个可以得到最终结果或者告知输入有错。

而对于确定型图灵机,特定的状态和纸带内容,下一步操作只能有一个。

理解P和NP

看完P和NP、多项式时间和指数时间的定义,了解了什么是确定型和非确定型图灵机,现在对理解P和NP还是没有太直观的感觉。

那么再看看NP的另外一个定义:

the class NP consists of all those decision problems whose positive solutions can be verified in polynomial time given the right information, or equivalently, whose solution can be found in polynomial time on a non-deterministic machine.

翻译一下就是:

NP类问题是指 解的正确性可以在多项式时间内(在确定型图灵机上)被验证的决定性问题,或者说,在非确定型图灵机上可以在多项式时间内求解的问题

这里涉及到一个新概念:决定性问题。那让我们先来了解一下什么是决定性问题。

决定性问题是指那些可以用是或者否可以回答的问题,比如:

x可以被y整除吗?

x是质数吗?

从A点到B点有长度小于10的路径吗?

与决定性问题相对应的是功能性问题function problem,这类问题的答案不能是简单的YES or NO,比如:

x除以y的商和余数是多少?

x的质因子有哪些?

从A点到B点最短的路径是什么?

因为已经存在标准的方法可以将功能性问题和决定性问题相互转化而且不会显著改变其计算的复杂度,因此,计算性的理论性研究集中在决定性问题上面。

Wiki 原文如下:

There are standard techniques for transforming function and optimization problems into decision problems, and vice versa, that do not significantly change the computational difficulty of these problems. For this reason, research in computability theory and complexity theory have typically focused on decision problems.

这一句很重要:

已经存在标准的方法可以将功能性问题和决定性问题相互转化而且不会显著改变其计算的复杂度

因为后面在举例说明NP问题的时候,我们需要将问题先转化为决定性问题。

比如背包问题

有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

改为决定性问题可以是:

有N件物品和一个容量为W的背包。第i件物品的费用是w[i],价值是v[i]。在总容量不超过W的情况下,总价值能否达到V?

对于改为决定性问题后的背包问题我们要验证一个解是不是正确的,很简单,只要把一个解的总容量和价值算出来,看看是否满足总容量小于等于W且总价值大于等于V。O(n)时间(多项式时间)内可以验证,所以它属于NP类问题(解的正确性在多项式时间内被验证)。

但是如果我们要计算这个解呢?如果有个算法可以在多项式时间内计算出在总容量不超过V的情况下,总价值能否达到V?这个问题的解,那么这就是P类问题了。这个算法目前还没找到,找到就不得了,因为背包问题还是个NPC问题,如果这个问题被证明为P类问题,那么就可以证明NP=P了。至于什么是NPC问题,下次再仔细掰扯掰扯~

from:http://www.708luo.com/posts/2014/12/p-np/

【待整理】计算的本质

计算范式:

 http://www.absolutely-free-hosting.com/free_hosts_01.php

在计算这个问题上有两种范式,一种是计算理论的研究,侧重于从数学角度证明表达能力和正确性,比较典型的图灵机、lambda演算、pi演算这些都属于这个范畴。

另一种是计算模型的研究,侧重于对真实系统的建模和刻画,比如冯诺伊曼模型、BSP模型、LogP模型等等。

编程语言的切入点不同,同时可能会是两种范式之一或混合,比如 Lisp 更侧重于前者,C 更注重后者,而更多的语言都在寻求某种折衷。

题主可以看一看皮亚诺的自然数公理体系,最好结合着lambda演算一起看,很简单普适的模型,可以从这个角度去看计算。

另,在这个公理体系的基础上1+1=2,1+2=3是可以被证明的,皮亚诺给出了详细证明,邱奇数可以看作是在lambda演算的基础上建立起来的一个具体实现。

计算到底是什么,目前没有准确说法,人们连数学是什么也还有争论。就计算来讲,从图灵机和lambda算子看过去,就已经是两个世界了,更何况完备的计算模型远不止这两个。

计算模型:

  1. 图灵机
  2. Lambda算子

除了图灵机以外,人们还发明了很多其它的计算模型。包括:

机械计算的本质:

  数学基础或者逻辑基础:  布尔代数  0,1  

  任何有规律的输入,能够出现既定的输出。就可以作为计算设计的基础。

  比如电路  可以利用电子管晶体管集成电路实现

  那是否可以利用其他的物质     脑波、神经波、DNA状态转换、细胞状态变化…..   量子状态变化   其他自然现象等

  只要按照固定规律进行变化,给定相同的输入,一定出相同的输出。那是否就可以作为计算的基础。

四位计算机的原理及其实现

计算能力:

   但是计算能力最多等价于图灵机,能否超越图灵机?

多项式时间英语Polynomial time)在计算复杂度理论中,指的是一个问题的计算时间不大于问题大小的多项式倍数。任何抽象机器都拥有一复杂度类,此类包括可于此机器以多项式时间求解的问题。

以数学描述的话,则可说O,此为一常数值(依问题而定)。

http://zh.wikipedia.org/zh-cn/多項式時間

NP问题

   能否解决NR-hard的问题?解决的本质问题是什么

需要多项式时间内解决的

http://en.wikipedia.org/wiki/NP-hard

重要的复杂度类完整列表

易解复杂度类

DLOGTIME · AC0英语AC0 ·ACC0英语ACC0 ·L ·SL英语SL (complexity) ·RL ·NL ·NC英语NC (complexity) ·SC ·PP-完全 ·ZPP ·RP ·BPP ·BQP ·PolyL

怀疑难解复杂度类

UP · NPNP完全 ·NP困难 ·NP ·NP完全英语co-NP-complete ·AM英语Arthur–Merlin protocol ·PH ·PP ·#P#P-完全英语Sharp-P-complete ·IP ·PSPACEPSPACE完全英语PSPACE-complete

难解复杂度类

EXPTIME · NEXPTIME ·EXPSPACE ·ELEMENTARY ·PR ·R ·RE ·ALL

复杂度类的谱系

多项式谱系英语Polynomial hierarchy · 指数谱系 ·Grzegorczyk谱系英语Grzegorczyk hierarchy ·算术谱系

相关复杂度族

DTIME · NTIME ·DSPACE英语DSPACE ·NSPACE ·可能性核对证明英语Probabilistically checkable proof ·交互式证明系统

人工智能:

作为丹尼尔·丹内特的粉丝,我针对这个话题推荐《意识的解释》和《达尔文的危险思想》两本书。前者直接讨论了AI的问题,后者则从演化的角度讨论了我们人脑这个“AI”的诞生为何是可以想象的。但如果只想走马观花看看他的观点,《直觉泵及其他思考工具》很不错。

来自物理学角度针对AI的讨论则有彭罗斯的《皇帝新脑》,虽然我不太赞同他的观点,但他讲了很多有趣的东西。

如果你对侯世达的路线有兴趣,《集异璧》当然是必推的作品,他的后续作品同样值得一看。

与他的中文名字同样精彩的,是侯世达的成名作“Gödel, Escher, Bach: an Eternal Golden Braid”的译名——《哥德尔、埃舍尔、巴赫:集异璧之大成》。侯世达的这本书在英文世界里被简称为“GEB——取哥德尔(Gödel)、埃舍尔(Escher)、巴赫(Bach)的首字母,而中文则以“集异璧”应对。

有了图灵机的组合,我们就能够从最简单的图灵机开始构造复杂的图灵机。那么最简单的图灵机是什么呢?我们知道最简单的信息就是01而最简单的计算就是对01进行布尔运算。而布尔运算本质上其实就三种:与、或、非。从最简单的逻辑运算操作最简单的二进制信息出发我们其实可以构造任意的图灵机!这点不难理解:任何图灵机都可以把输入、输出信息进行01的编码,而任何一个变换也可以最终分解为对01编码的变换,而对01编码的所有计算都可分解成前面说的三种运算。也许,现在你明白了为什么研究计算机的人都要去研究基本的布尔电路。奥秘就在于,用布尔电路可以组合出任意的图灵机!

历史上有哪些智商逆天的天才?

http://www.zhihu.com/question/23228706

细胞自动机

http://zh.wikipedia.org/wiki/%E7%B4%B0%E8%83%9E%E8%87%AA%E5%8B%95%E6%A9%9F

康威生命游戏

http://zh.wikipedia.org/wiki/%E5%BA%B7%E5%A8%81%E7%94%9F%E5%91%BD%E6%B8%B8%E6%88%8F

Showcase your language one vote at a time [experimental challenge]

http://codegolf.stackexchange.com/questions/44680/showcase-your-language-one-vote-at-a-time-experimental-challenge

Mathematica 到底有多厉害?

http://www.zhihu.com/question/27834147/answer/38337425

Wolfram Alpha

http://zh.wikipedia.org/wiki/Wolfram_Alpha

http://www.zhihu.com/question/21726594