当前位置: 华文问答 > 科学

数学到底在哪里支撑着编程?

2022-07-17科学

这个问题挺好的,因为在我们身边「绝大多数人认为程序员非常擅长修电脑」的环境下,编程和数学到底有哪些联系,或者说数学给了哪些支撑?相信你读完本文就会有一个大致的轮廓了。

有句话这么讲的,「计算机是数学家一次思考失败的产物」。

为什么这么说?如果去翻一下计算机的发展史,在第一台计算机ENIAC诞生之前,计算机的先驱,图灵,他是一位数学家...

我们先简单来捋一下编程的发展,这里我们先暂不讨论我们经常说的算法,程序内在的逻辑必然是由算法支撑的,这一点毫无疑问,而算法的内在就是数学。

图灵提出了图灵机模型,可以视为抽象意义上的」计算机「(一种概念)。

什么是图灵机呢?

图灵机:

图灵机(Turing machine)是一种理论上的抽象计算模型,由英国数学家和逻辑学家阿兰·图灵(Alan Turing)于1936年提出。它被认为是计算机科学的基础,用于理解计算的本质和计算问题的可解性。

图灵机包含以下几个要素:

无限长的纸带(Tape) :图灵机使用一条无限长的纸带,纸带上划分成一个一个的格子,每个格子上可以写上一个符号,这些符号可以是有限的字符集。

读写头(Head) :图灵机拥有一个读写头,它能够在纸带上左右移动,并且可以读取当前所在格子上的符号,也可以写入新的符号。

状态集合(States) :图灵机具有一系列状态,每个状态对应着不同的操作。图灵机根据当前状态和读取头所在格子的符号来决定下一步要执行的操作,然后切换到新的状态。

转移规则(Transition Rules) :图灵机的行为由一组转移规则定义,每个转移规则指定了在特定状态下读取头所在格子的符号以及当前状态的情况下,应该执行什么操作(如写入新符号、移动读写头、切换状态)。

图灵机的工作方式是,它从初始状态开始,根据当前状态和读取头所在格子的符号,查找相应的转移规则,执行规则所定义的操作,然后切换到新的状态。这个过程一直持续下去,直到图灵机进入一个特定的终止状态,或者执行无限多次操作。

它被证明能够模拟任何其他形式的计算,因此它被认为是通用计算模型。 模拟的这种计算,就是我们日常生活中的编程。

图灵是一位逻辑学家,数学家,当一门学科的创始人是数学家的话,那么我们是不是可以认为这门学科的基础就是数学?这一门学科就是计算机科学。

图灵

接下来我会继续讨论计算机科学中的一些人物,他们在整个计算机发展史起到了重要的作用,而他们无一例外都在数学上有很高的造诣,直到后来计算机科学慢慢成熟起来,我们才开始用计算机科学家来称呼他们。

约翰·麦卡锡

不是那个」麦卡锡主义「的麦卡锡。

麦卡锡发明了Lisp语言,这门编程语言不同于其他编程语言,他是属于一个新的编程范式,不同于我们常用的命令式编程。

我们把它称为函数式编程,或者泛函编程。

函数式编程或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算为该语言最重要的基础。而且,λ演算的函数可以接受函数当作输入和输出。

—以上来自wiki

而前面提到的λ演算的提出者也是一位著名的数学家-丘奇。

对函数式编程感兴趣的可以参考:

在大学专业课程中,我们会接触到一门学科:布尔代数。

这门学科给我们在程序中编写各种分支,判断,循环结构提供了数学上的支撑。

简单来说,if(condition)中的condition,就是以它为基础 (如&&,||,!)

基本理论
在布尔代数上的运算被称为AND(与)、OR(或)和NOT(非)。代数结构要是布尔代数,这些运算的行为就必须和两元素的布尔代数一样(这两个元素是TRUE(真)和FALSE(假))。亦称逻辑代数.布尔(Boole,G.)为研究思维规律(逻辑学)于1847年提出的数学工具.布尔代数是指代数系统B=〈B,+,·,′〉
它包含集合B连同在其上定义的两个二元运算+,·和一个一元运算′,布尔代数具有下列性质:对B中任意元素a,b,c,有:
1.a+b=b+a, a·b=b·a.
2.a·(b+c)=a·b+a·c,
a+(b·c)=(a+b)·(a+c).
3.a+0=a, a·1=a.
4.a+a′=1, a·a′=0.

随着计算机、通信的发展,信息的安全可靠越来越重要。

密码学,是一门很古老的学科,古代就被运用于校验身份等(大将军调兵,虎符)

我们这里简单说一下一个很重要的加密算法,他也是HTTPS协议的一个底层基础算法。

RSA加密算法,它是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)共同提出的一种加密算法,RSA就是他们三人姓氏开头字母拼在一起组成。

RSA加密算法的原理是基于数论中的两个重要问题:质因数分解问题和离散对数问题。

具体来说,RSA算法的加密过程如下:
选择两个大素数p和q,计算N=p*q。
计算φ(N)=(p-1)*(q-1)。
选择一个整数e,1<e<φ(N),且e与φ(N)互质。
计算d,使得e*d=1 mod φ(N)。
将N和e作为公钥,N和d作为私钥。
加密数据时,将明文转换为整数M,计算C=M^e mod N。
解密数据时,将密文转换为整数C,计算M=C^d mod N。

又是一门数学的分支学科。

另外还有图论等等这些,都支撑着编程。

比如:

单源最短路径,最小生成树,网络流... 想一下高德地图,如果没有这些图算法,导航还会存在吗?

不仅是编程,很多学科在深入挖掘底层根本原理时,可能最终都会回到数学层面。