01
6

原作:Edison Zhou 恰童鞋骚年

一、Docker极简介绍

1.1 总体介绍
file
  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

简而言之> 容器是一个打包了应用服务的环境,它是一个轻量级的虚拟机,每一个容器由一组特定的应用和必要的依赖库组成。

  Docker和传统虚拟化之间最大的区别在于:容器是在操作系统层面上实现虚拟化,即直接复用本地主机的操作系统;而传统虚拟化则是在硬件层面实现,如VMware vShpere, Xen及Citrix等。

1.2 Docker结构
  Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
  Docker 容器通过 Docker 镜像来创建。
  容器与镜像的关系类似于面向对象编程中的对象与类。  
  Docker的架构如下图所示,Client 通过接口与Server进程通信实现容器的构建,运行和发布。Client和Server可以运行在同一台集群,也可以通过跨主机实现远程通信。
image-1590996351005
  具体详细内容,请浏览:《几张图帮你理解Docker基本原理及快速入门》

二、Docker的安装

  (1)准备一台Linux主机,这里以CentOS 7.2为例。当然,你也可以使用Windows,不过你得确保是Windows 10 pro版本及以上,且安装了Hyper-V等一系列的相关软件。

  (2)安装docker

  # yum install docker

  (3)启动docker服务

  # systemctl start docker.sevice
  (4)配置开机启动并验证
  # systemctl enable docker.service
  验证:查看docker版本信息
  # docker version
  (5)配置docker加速器 => 原因你懂得,不设置慢死你,云服务器除外

  # vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://d8b3zdiw.mirror.aliyuncs.com"]

}

  然后重启docker服务

  # systemctl daemon-reload

  # systemctl restart docker

  (6)Hello World

  # docker run hello-world

三、ASP.NET Core on Docker配置

  (1)拉取dotnet/aspnetcore的最新镜像,这里以aspnetcore 2.0为例

  # docker pull microsoft/aspnetcore:2.0

  PS:如果要拉取最新版本(比如.net core 2.1),可以将版本号改为aspnetcore:latest

  如果你想要拉取更多microsoft的镜像,那么搜索一下把:# docker search microsoft

  拉取了不想要的镜像,那么删除一个吧,如:# docker rmi imagesID

  拉取之后,验证一下是否拉取成功了:# docker images

  (2)现在我们进入VS中为我们的一个ASP.NET Core WebAPI编辑一个Dockerfile

父镜像

FROM microsoft/aspnetcore:2.0# 设置工作目录
WORKDIR /app

复制发布文件到/app下

COPY . /app

设置端口

EXPOSE 8810# 使用dotnet Manulife.DNC.MSAD.NB.AgentService.dll来运行ASP.NET Core项目,注意大小写
ENTRYPOINT ["dotnet", "Manulife.CD.MSAD.NB.AgentService.dll", "--server.urls", "http://*:8810"]

  (3)发布这个ASP.NET Core WebAPI,并将Release文件传送到Linux服务器中(你可以选择xFTP或者WinScp等工具)
image-1590996440439
  (4)进入上图的AgentService目录中,开始打包docker镜像

  # docker build -t agentservice-container:1.0 . => 不要忘记后面还有一个点.
  此刻再次验证:# docker images

  (5)万里长征最后一步:运行docker
  # docker run -name agentservice -d -p 8810:8810 agentservice-container:1.0

  这里的两个端口号分别是宿主机和容器的映射,前一个是你在外部访问的端口号,后一个是你要映射到docker容器中的端口号,切记和我们在Dockerfile中暴露出来的端口号保持一致。
  PS:这里如果docker run失败后再次运行会提示名称已存在,可以使用以下命令来删除容器
  # docker rm -f [dockername]
  如果想要docker容器在非正常退出后自动重启,可以加上--restart选项,例如下面:
  # docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0 --restart=always

  (6)验证docker运行效果

  方式一:在宿主机验证

  方式二:在远程客户端通过浏览器访问
image-1590996490761

四、Supervisor守护进程

image-1590996185800
  此部分主要针对于在Linux上的dotnet core应用程序,保证程序在异常或者是电脑重启的时候仍然能够正常访问。大家可以浏览杨晓东的《ASP.NET Core Linux下为dotnet创建守护进程》以及focus-lei的《在docker上运行.net core程序》来学习,这里就不再赘述了。
参考资料
(1)菜鸟教程,《Docker教程》
(2)杨晓东,《ASP.NET Core Docker部署》,《ASP.NET Core Linux下为dotnet创建守护进程》
(3)李朝强,《Docker打包ASP.NET Core应用,在CentOS上运行》
(4)圣杰,《.NET Core容器化@Docker》
(5)focus-lei,《在Docker上运行.net core程序》

01
6

用Windbg来分析.Net程序的dump

0
归档:2020年6月分类:C#和.NET

用Windbg来分析.Net程序的dump

1. 什么是Windbg

WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
Dump文件是进程的内存镜像, 可以把程序的执行状态通过调试器保存到dump文件中

2. Windbg可以解决以下问题

◆ 内存高
◆ CPU高
◆ 程序异常
◆ 程序Hang死

3. 使用windbg进行调试分析的两种方式

使用windbg调试器attach到需要调试的进程。(会暂停进程的运行)
抓取进程的dump文件,使用windbg分析dump

下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900

下载之后为压缩包,将文件解压。通过dos命令来生成dump文件。下面为一条语句为示例

procdump -ma -c 0 -s 3 -n 2 sqlservr.exe -o E:\dumps\

这条语句的意思为:当sqkservr.exe这个进程运行时间cpu的占用超过0%,时间超过3秒,则在E:\dumps下生成一个dump文件。一直到生成2个为止。下面为命令介绍

-ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息.
-c 在CPU使用率到达这个阀值的时候, 生成dump文件.
-s CPU阀值必须持续多少秒才抓取dump文件.
-n 在该工具退出之前要抓取多少个dump文件.
-o dump文件保存目录.
Sqlservr.exe可替换为进程的ID

01
6
以下文章来源于DotNET技术圈 ,作者RICKY LEEKS

1.小对象怎么处理的?

小型.NET对象被分配到小型对象堆(SOH)上。其中有3种:第0代,第1代和第2代。对象根据其寿命向上移动。

将新对象放在Gen 0上。当Gen 0充满时,.NET垃圾收集器(GC)运行,处理不再需要的对象,并将其他所有内容移至Gen1。如果Gen 1充满,则GC再次运行,也可以将Gen 1中的对象移动到Gen 2中。

当Gen 2变满时,将发生GC完全运行。这将清除不需要的Gen 2对象,将Gen 1对象移至Gen 2,然后将Gen 0对象移至Gen 1,最后清除所有未引用的内容。每次运行GC之后,都会压缩受影响的堆,以将仍在使用的内存保持在一起。

这种代代相传的方法可确保事情高效运行-耗时的压缩过程仅在绝对必要时才会发生。

注意:如果您在Gen 2中看到大量的内存,则表明内存已被保留很长时间,并且可能存在内存问题。这是内存分析工具可以派上用场的地方。

2.较大的对象会怎样?

大于85 KB的对象被分配到大对象堆(LOH)。由于复制大块内存的开销,它们没有被压缩。当发生完整的GC时,未使用的LOH对象的地址范围将记录在可用空间分配表中。

分配新对象后,将在此可用空间表中检查足以容纳该对象的地址范围。如果存在,则将对象分配到那里,如果不存在,则将对象分配到下一个可用空间。

由于对象不太可能是空地址范围的确切大小,因此对象之间几乎总是会留有小块内存,从而导致碎片。如果这些块小于85 KB,则根本没有重用的可能性。因此,随着分配需求的增加,即使碎片空间仍然可用,也会保留新的段。

此外,当需要分配大对象时,.NET还是倾向于将对象附加到末尾,而不是运行昂贵的Gen 2 GC。这对性能有好处,但是是导致内存碎片的重要原因

3.垃圾收集器可以在不同的模式下运行以优化性能

.NET通过为GC提供多种模式来解决性能与堆效率之间的权衡问题。

工作站模式为用户提供了最大的响应速度,并减少了由于GC造成的暂停。它可以作为“并发”或“非并发”运行,指的是运行GC的线程。默认值为并发,它为GC使用单独的线程,因此应用程序可以在GC运行时继续执行。

服务器模式可为服务器环境提供最大的吞吐量,可伸缩性和性能。在服务器模式下,段大小和生成阈值通常比工作站模式大得多,这反映了对服务器的更高要求。

服务器模式在多个线程上并行运行垃圾回收,为每个逻辑处理器分配一个单独的SOH和LOH,以防止线程相互干扰。

.NET框架提供了一种交叉引用机制,因此对象仍然可以在堆之间相互引用。但是,由于应用程序响应能力不是服务器模式的直接目标,因此在GC期间,所有应用程序线程都将被挂起。

4.引用不足会在性能和内存效率之间折衷

弱对象引用了GC根的替代来源,使您可以保留对象,同时在GC需要时可以收集对象。它们是代码性能和内存效率之间的折衷。创建对象需要占用CPU时间,但保持加载状态需要占用内存。

弱引用特别适用于大型数据结构。例如,假设您有一个允许用户浏览大型数据结构的应用程序,他们可能会返回其中的一些数据。您可以将任何强引用转换为他们浏览的结构为弱引用。如果用户返回到这些结构,则可以使用它们,但如果没有,GC可以根据需要回收内存。

5.对象固定可以创建在托管和非托管代码之间传递的引用

.NET使用一种称为GCHandle的结构来跟踪堆对象。GCHandle可用于在托管域和非托管域之间传递对象引用,.NET维护一个GCHandles表以实现此目的。GCHandle有四种类型,包括固定的,用于将对象固定在内存中的特定地址。

对象固定的主要问题是它可能导致SOH碎片化。如果将对象固定在GC期间,则根据定义,该对象无法重定位。根据您使用固定的方式,它会降低压缩的效率,在堆中留下间隙。避免这种情况的最佳策略是在很短的时间内锁定,然后释放。

28
5

数学模型概述

0
归档:2020年5月分类:数海泛舟

这一个多月以来,我投入了大量的时间回顾和复习本科基础数学课程,重点是《数学分析》、《高等代数》、《解析几何》、《概率论与数理统计》、《数值分析》、《数学模型》,并且延申阅读了这几个学科的历史。我最关心的是数学模型,这个也是我大学里除了三门基础课程之外学得最好的一门课程,而且我投入了大量时间数学模型的学习,并且参加了校级、国级和美国数学建模比赛,分别获得一等奖、二等奖和一等奖。

所谓数学模型,其实简单地说就是:使用数学方法解决实际应用问题。除了常见的数学模型,还有其他大量地借用数学方法来解决实际问题的例子,比如爱因斯坦的相对论,其实就是借用非欧几何的数学理论来解决物理问题。关于常见的数学模型,已经有人进行了非常好的整理:线性规划、整数规划、非线性规划、 图与网络模型、插值与拟合、微分方程建模、数理统计、时间序列、支持向量机、多元分析、偏最小二乘回归分析、现代优化算法(模拟退火、遗传算法)、数字图像处理、 综合评价与决策方法、预测方法(微分方程、灰色度预测、差分方程、马尔可夫预测、插值与拟合、神经网络)。

我后续会比较深入地重新捡起这些算法和模型,并且运用到实际生活中,我这里的实际生活,就是针对实实在在发生和进行的事情。

24
5

疫情期间的一些阅读

0
归档:2020年5月分类:政治哲学

三百五十多年前,牛顿为躲避瘟疫回到老家,酝酿出了《自然哲学之数学原理》。2020年初,我因新冠疫情躲在北京郊区近两个月,闲暇之余却只是建了几个模、(重)读了几本书。从先哲们那里获取心力,只是为了让自己思想变得更坚定。

21
5

关于所学的数学学科介绍

0
归档:2020年5月分类:数海泛舟

一、前言

我已经毕业十多年了,大学本科数学四年,前两年我的大部分精力都投入到数学学习,特别是数学分析、高等代数和解析几何,这三门课程我学得非常好,另外运筹学和数学模型学得也还可以,复变函数我自认为理解很好,但是考试分数很差。后两年我开始对编程感兴趣,只有一半多的时间放在专业课上,专业课程包括概率论、实变函数、数值分析、抽象代数、数学物理方程、数论基础、应用数理统计、最优化原理与算法、偏微分方程数值解和泛函分析,这些课程里除了概率论和数理统计,其他的课程学得就没有前两年那么深入。

这段时间重新翻了翻大学的课程,印象最深的还是那三大基础课程:数学分析、高等代数和解析几何,加上概率论和数学模型,我基本都还能捡回来。我感叹大学的自己曾经一只脚迈进现代数学大门,后来抽身离开;现在还想打开这扇门,虽然里面风景独好,但是发现已经迈不进去了。我重新阅读这些图书,一方面是促进自己在算法和建模方面的工作,另一方面是希望对数学史了解更深刻。

二、数学分析

这门学科可以追溯到古希腊欧多克索斯,他提出的穷竭法第一次引出极限理论,另一位伟大的数学家阿基米德则真正让微积分初现萌芽,他是用穷竭法求出了抛物线弓形的面积。由于欧洲罗马帝国和中世纪对古希腊文明的摧残,一直到17世纪文艺复兴之后,微积分才开始得到发展,帕斯卡、费马、沃利斯和巴罗都触及到了微积分的边缘,他们的一些工作其实已经反映出了微积分思想。

真正创立微积分的人是牛顿和莱布尼茨,牛顿为了研究物理发明微积分,他采用的是流数术;莱布尼茨则采用更加数学的方法创立了微积分,他的方法一直保留至今。客观公正的说,他们两位都是分别独立创立了微积分。这时候的微积分是建立在不严密的基础之上,特别是对于无穷量小这个概念非常模糊,虽然如此,但是基于不严密的微积分,欧拉、拉格朗日、拉普拉斯、勒让德和傅立叶深刻发展了微积分,并且获得了大量原创性成果。

微积分严密化工作一直到了19世纪才完成,从波尔查诺、阿贝尔和柯西开始,一直到维尔斯特拉斯、戴德金、黎曼和达布,他们先摆脱了无穷小量的幽魂,建立实数理论,完成极限的严格定义和证明,最终完成现代数学分析体系的建立。大学本科的数学分析也只是讲到了19世纪末。

20世纪的分析学最深刻的变革是勒贝格开创测度论,以此发展出了实变函数,以此衍生了理论化的概率论和随机过程,同时复数的引入,也发展出了基于复变函数的复分析。而以函数空间为基础的泛函和算子理论,则发展出了泛函分析,泛函分析里的希尔伯特空间、巴拿赫空间和广义函数论在物理学获得应用。三角级数发展成傅立叶分析。多变量函数和多维空间的曲面的研究,则发展出了微分几何学、偏微分方程和流形分析。一元线性空间(即线性方程组)理论问题基本都被解决,非线性分析则成为最活跃的数学分析分支之一。这里值得一提的是:罗宾逊将实数推广到超实数,引出了非标准分析。目前,无穷维的微积分理论并没有建立,注意:这里的无穷维并不是指N维空间,因为一般意义上的N维空间并不是无穷维。

现在活跃的纯数学分析研究方向主要是非线性分析和偏微分方程,这个方向可以产生大量的论文,但是很难产出原创性的理论。另外一方向就是无限维微积分的研究,但也仅限于巴拿赫空间的大量研究,更普遍的无限维微积分似乎已经超出人类的智力范围。非纯粹的数学分析主要就是和其他数学学科的混合研究,比如调和分析。

三、高等代数

代数是数学史上最古老的一门学科之一,甚至可以说曾经的代数就代表数学,从最基础的整数和算术到方程,再到统一的线性代数,直至抽象代数,代数的发展一直伴随着人类文明的历史。人类最开始结绳计数就开始和代数(即算术)打交道,而5000多年之前的两河流域文明就出现算术系统,特别是巴比伦文明已经开始研究代数方程。古埃及人、古希腊人和古代中国从几何角度去探讨过方程求解,毕达哥拉斯则认为“万物皆数”,欧几里德证明素数无限。一直到了古罗马时期,被誉为“代数之父”之一的丢番图正式研究不定方程。

波斯帝国诞生了另外一位也被尊为“代数之父”的花拉子米,他的《代数学》是第一本解决一次方程及一元二次方程的系统著作。中世纪的欧洲,东方数学家在代数方面取得辉煌成就。古波斯的欧玛尔·海亚姆发展出代数几何,并且且找出了三次方程的一般几何解法;古印度的摩诃吠罗和婆什迦罗与古中国的朱世杰解出了许多特定的三次、四次、五次方程的解;古中国的秦九韶甚至证明了中国剩余定理,即关于互素和模的定理。

文艺复兴之后的欧洲开始研究从东方传来的方程求解,逐渐打开代数大门,特别是对高次方程的一般解法的研究,阿贝尔和迦罗华做出突出贡献,阿贝尔证明五次方程的根式解的不可能性并在椭圆函数的研究中提出阿贝尔方程式,英年早逝的迦罗华则发展出了群论。莱布尼茨继续发展了日本数学家关孝和提出的行列式概念,并通过矩阵来解出线性方程组,加布里尔·克拉默则在更一般情景研究矩阵和行列式上。到了埃米诺特,基于迦罗华理论引伸出了更抽象更一般的群、环、域,并提出了抽象代数。

抽象代数是人类智慧的集中体现,它使得“代数”这个词在数学世界的意义,从“方程理论”换变成“代数结构理论”,大量天才数学家对抽象代数进行研究。恩斯特·斯坦尼兹研究过一般的域、大卫·希尔伯特、埃米尔·阿廷与埃米·诺特研究过可交换群与一般的环,恩斯特·库默尔、利奥波德·克罗内克与理察·戴德金研究过可交换环的理想,以及费迪南德·格奥尔格·弗罗贝尼乌斯与伊赛·舒尔研究过群的表示理论。

数论其实也算是代数的一个分支,数论被认为是最纯粹的数学,而数量的核心研究对象是素数,真正让数论成为一们学科是由费马、梅森、欧拉、高斯、勒让德、黎曼、希尔伯特等人发展而来。目前数论的研究围绕几个大的猜想,特别是黎曼猜想,黎曼猜想不仅涵盖了素数分布,还包含了复分析、解析数论等知识。

我大学所学的高等代数,由一元线性方程组的研究,先引出了向量空间、矩阵,接着探讨线性空间和线性变换,然后抽象出欧氏空间和酉空间,最后从抽象的角度探讨线性代数、几何和分析三者的关联。下图高度概括这种关系:

 

微信图片_20200522090050

 

四、解析几何

几何的诞生和人类文明同时发展,无论是尼罗河边上的古埃及人、古希腊哲人,还是两河流域的巴比伦人和古代中国人,都对几和进行了或多或少的研究,但是真正数学意义上的几何则来自古希腊人。公元前六世纪泰勒斯的时代,西方世界开始将几何学视为数学的一部分。公元前三世纪,几何学中加入欧几里德的公理,产生的欧几里得几何是往后几个世纪的几何学标准。阿基米德发展了计算面积及体积的方法,许多都用到积分的概念。阿波罗尼奥斯完成圆锥曲线理论,这些工作为一千八百多年后开普勒、牛顿、哈雷等数理天文学家研究行星和彗星轨道提供了数学基础。

欧洲中世纪期间因为对天文学的研究,所以保留了几何知识的学习,但都是掌握在神父手上,并没有取得任何进展。天文学中有关恒星和行星在天球上的相对位置,以及其相对运动的关系,都是后续一千五百年中探讨的主题。几何和天文都列在西方博雅教育中的四术中,是中古世纪西方大学教授的内容之一。

勒内·笛卡儿发明的坐标系以及当时代数的发展让几何学进入新的阶段,像平面曲线等几何图形可以由函数或是方程等解析的方式表示。这对于十七世纪微积分的引入有重要的影响。透视投影的理论让人们知道,几何学不只是物体的度量属性而已,透视投影后来衍生出射影几何。欧拉及高斯开始有关几何物件本体性质的研究,使几何的主题继续扩充,最后产生了拓扑学及微分几何。现代概念上的几何其抽象程度和一般化程度大幅提高,并与分析、抽象代数和拓扑学紧密结合。

这里重点提出非欧几何(或者叫罗巴切夫斯基几何),这是人类颠覆传统欧几里德几何观念的一次巨大思维飞跃,也是几何学发展的新里程碑。非欧几何曾经在高斯的脑子里酝酿,但他没有深入研究,最终是波约尔和罗巴切夫斯基创立,而因为罗巴切夫斯基的方式更完美,做的工作也更多,所以也叫罗巴切夫斯基几何。非欧几何后续又由黎曼、庞加莱等数学家发展和改进,并且需求数学逻辑上的理论支持,最终在20世纪初被爱因斯坦运用于广义相对论,非欧几何的应用于广义相对论与微积分应用于经典物理学一样值得称颂。

解析几何是欧几里德几何的现代版本,20世纪下半叶中有大幅的进展,主要是因为让-皮埃尔·塞尔及亚历山大·格罗森迪克的贡献,这也产生了概形以及代数拓扑学一些方法的重视,包括许多的上同调理论。千禧年大奖难题中的霍奇猜想就是解析几何学的问题。

低维度代数簇、代数曲线及代数曲面的研究以及三维代数簇(algebraic threefolds)的研究都有很多进展。Gröbner基理论及实代数几何应用在现在解析几何的一些子领域中。算术几何(Arithmetic geometry)是结合了解析几何及数论的一个新的领域。另外一个研究方向是模空间及复几何。代数几何的方法广泛的用在弦理论及膜宇宙理论中。

我所学习的解析几何主要是先从向量代数出发,建立仿射坐标系,并研究空间的直线、平面和曲面,同时学习仿射坐标变换、二次曲面的仿射理论,放射变化和保距变换。最后还学习了射影几何的基本知识。

 

14
5

【转】数学体系解读

0
归档:2020年5月分类:数海泛舟

这篇文章作者是机器学习方面的专家爱林达华先生,他不是数学科班出身,但是能从深入了解数学各个体系,并且意识到数学是获得计算机突破的理论基础,还是挺不错的。他这篇文章里提到的体系有一定的缺陷,但是可以为非数学专业学生提供一个直观的视角。

数学体系解读

by MIT 林达华

目录 (Contents)

1 为什么要深入数学的世界

2 集合论:现代数学的共同基础

3 分析:在极限基础上建立的宏伟大厦

3.1 微积分:分析的古典时代——从牛顿到柯西

3.2 实分析:在实数理论和测度理论上建立起现代分析

3.3 拓扑学:分析从实数轴推广到一般空间——现代分析的抽象基础

3.4 微分几何:流形上的分析——在拓扑空间上引入微分结构

4 代数:一个抽象的世界

4.1 关于抽象代数

4.2 线性代数:“线性”的基础地位

4.3 泛函分析:从有限维向无限维迈进

4.4 继续往前:巴拿赫代数,调和分析,和李代数

5 现代概率论:在现代分析基础上再生

为什么要深入数学的世界

作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appearance和motion建立一个unified的model。这个题目在当今Computer Vision中百花齐放的世界中并没有任何特别的地方。事实上,使用各种Graphical Model把各种东西联合在一起framework,在近年的论文中并不少见。

我不否认现在广泛流行的Graphical Model是对复杂现象建模的有力工具,但是,我认为它不是panacea,并不能取代对于所研究的问题的深入的钻研。如果统计学习包治百病,那么很多 “下游”的学科也就没有存在的必要了。事实上,开始的时候,我也是和Vision中很多人一样,想着去做一个Graphical Model——我的导师指出,这样的做法只是重复一些标准的流程,并没有很大的价值。经过很长时间的反复,另外一个路径慢慢被确立下来——我们相信,一个 图像是通过大量“原子”的某种空间分布构成的,原子群的运动形成了动态的可视过程。微观意义下的单个原子运动,和宏观意义下的整体分布的变换存在着深刻的 联系——这需要我们去发掘。

在深入探索这个题目的过程中,遇到了很多很多的问题,如何描述一个一般的运动过程,如何建立一个稳定并且广泛适用的原子表达,如何刻画微观运动和宏观分布变换的联系,还有很多。在这个过程中,我发现了两个事情:

我原有的数学基础已经远远不能适应我对这些问题的深入研究。
在数学中,有很多思想和工具,是非常适合解决这些问题的,只是没有被很多的应用科学的研究者重视。
于是,我决心开始深入数学这个浩瀚大海,希望在我再次走出来的时候,我已经有了更强大的武器去面对这些问题的挑战。

我的游历并没有结束,我的视野相比于这个博大精深的世界的依旧显得非常狭窄。在这里,我只是说说,在我的眼中,数学如何一步步从初级向高级发展,更高级别的数学对于具体应用究竟有何好处。

集合论:现代数学的共同基础

现代数学有数不清的分支,但是,它们都有一个共同的基础——集合论——因为 它,数学这个庞大的家族有个共同的语言。集合论中有一些最基本的概念:集合(set),关系(relation),函数(function),等价 (equivalence),是在其它数学分支的语言中几乎必然存在的。对于这些简单概念的理解,是进一步学些别的数学的基础。我相信,理工科大学生对于 这些都不会陌生。

不过,有一个很重要的东西就不见得那么家喻户晓了——那就是“选择公理” (Axiom of Choice)。这个公理的意思是“任意的一群非空集合,一定可以从每个集合中各拿出一个元素。”——似乎是显然得不能再显然的命题。不过,这个貌似平常 的公理却能演绎出一些比较奇怪的结论,比如巴拿赫-塔斯基分球定理——“一个球,能分成五个部分,对它们进行一系列刚性变换(平移旋转)后,能组合成两个一样大小的球”。正因为这些完全有悖常识的结论,导致数学界曾经在相当长时间里对于是否接受它有着激烈争论。现在,主流数学家对于它应该是基本接受的,因为很多数学分支的重要定理都依赖于它。在我们后面要回说到的学科里面,下面的定理依赖于选择公理:

拓扑学:Baire Category Theorem
实分析(测度理论):Lebesgue 不可测集的存在性
泛函分析四个主要定理:Hahn-Banach Extension Theorem, Banach-Steinhaus Theorem (Uniform boundedness principle), Open Mapping Theorem, Closed Graph Theorem
在集合论的基础上,现代数学有两大家族:分析(Analysis)和代数(Algebra)。至于其它的,比如几何和概率论,在古典数学时代,它们是和代数并列的,但是它们的现代版本则基本是建立在分析或者代数的基础上,因此从现代意义说,它们和分析与代数并不是平行的关系。

分析:在极限基础上建立的宏伟大厦

微积分:分析的古典时代——从牛顿到柯西

先说说分析(Analysis)吧,它是从微积分(Caculus)发展起来 的——这也是有些微积分教材名字叫“数学分析”的原因。不过,分析的范畴远不只是这些,我们在大学一年级学习的微积分只能算是对古典分析的入门。分析研究 的对象很多,包括导数(derivatives),积分(integral),微分方程(differential equation),还有级数(infinite series)——这些基本的概念,在初等的微积分里面都有介绍。如果说有一个思想贯穿其中,那就是极限——这是整个分析(不仅仅是微积分)的灵魂。

一个很多人都听说过的故事,就是牛顿(Newton)和莱布尼茨 (Leibniz)关于微积分发明权的争论。事实上,在他们的时代,很多微积分的工具开始运用在科学和工程之中,但是,微积分的基础并没有真正建立。那个 长时间一直解释不清楚的“无穷小量”的幽灵,困扰了数学界一百多年的时间——这就是“第二次数学危机”。直到柯西用数列极限的观点重新建立了微积分的基本 概念,这门学科才开始有了一个比较坚实的基础。直到今天,整个分析的大厦还是建立在极限的基石之上。

柯西(Cauchy)为分析的发展提供了一种严密的语言,但是他并没有解决微积分的全部问题。在19世纪的时候,分析的世界仍然有着一些挥之不去的乌云。而其中最重要的一个没有解决的是“函数是否可积的问题”。我们在现在的微积分 课本中学到的那种通过“无限分割区间,取矩阵面积和的极限”的积分,是大约在1850年由黎曼(Riemann)提出的,叫做黎曼积分。但是,什么函数存 在黎曼积分呢(黎曼可积)?数学家们很早就证明了,定义在闭区间内的连续函数是黎曼可积的。可是,这样的结果并不令人满意,工程师们需要对分段连续函数的 函数积分。

实分析:在实数理论和测度理论上建立起现代分析

在19世纪中后期,不连续函数的可积性问题一直是分析的重要课题。对于定义在 闭区间上的黎曼积分的研究发现,可积性的关键在于“不连续的点足够少”。只有有限处不连续的函数是可积的,可是很多有数学家们构造出很多在无限处不连续的 可积函数。显然,在衡量点集大小的时候,有限和无限并不是一种合适的标准。在探讨“点集大小”这个问题的过程中,数学家发现实数轴——这个他们曾经以为已 经充分理解的东西——有着许多他们没有想到的特性。在极限思想的支持下,实数理论在这个时候被建立起来,它的标志是对实数完备性进行刻画的几条等价的定理 (确界定理,区间套定理,柯西收敛定理,Bolzano-Weierstrass Theorem和Heine-Borel Theorem等等)——这些定理明确表达出实数和有理数的根本区别:完备性(很不严格的说,就是对极限运算封闭)。随着对实数认识的深入,如何测量“点 集大小”的问题也取得了突破,勒贝格创造性地把关于集合的代数,和Outer content(就是“外测度”的一个雏形)的概念结合起来,建立了测度理论(Measure Theory),并且进一步建立了以测度为基础的积分——勒贝格(Lebesgue Integral)。在这个新的积分概念的支持下,可积性问题变得一目了然。

上面说到的实数理论,测度理论和勒贝格积分,构成了我们现在称为实分析 (Real Analysis)的数学分支,有些书也叫实变函数论。对于应用科学来说,实分析似乎没有古典微积分那么“实用”——很难直接基于它得到什么算法。而且, 它要解决的某些“难题”——比如处处不连续的函数,或者处处连续而处处不可微的函数——在工程师的眼中,并不现实。但是,我认为,它并不是一种纯数学概念 游戏,它的现实意义在于为许多现代的应用数学分支提供坚实的基础。下面,我仅仅列举几条它的用处:

黎曼可积的函数空间不是完备的,但是勒贝格可积的函数空间是完备的。简单的 说,一个黎曼可积的函数列收敛到的那个函数不一定是黎曼可积的,但是勒贝格可积的函数列必定收敛到一个勒贝格可积的函数。在泛函分析,还有逼近理论中,经 常需要讨论“函数的极限”,或者“函数的级数”,如果用黎曼积分的概念,这种讨论几乎不可想像。我们有时看一些paper中提到Lp函数空间,就是基于勒 贝格积分。
勒贝格积分是傅立叶变换(这东西在工程中到处都是)的基础。很多关于信号处理的初等教材,可能绕过了勒贝格积分,直接讲点面对实用的东西而不谈它的数学基础,但是,对于深层次的研究问题——特别是希望在理论中能做一些工作——这并不是总能绕过去。
在下面,我们还会看到,测度理论是现代概率论的基础。

拓扑学:分析从实数轴推广到一般空间——现代分析的抽象基础

随着实数理论的建立,大家开始把极限和连续推广到更一般的地方的分析。事实 上,很多基于实数的概念和定理并不是实数特有的。很多特性可以抽象出来,推广到更一般的空间里面。对于实数轴的推广,促成了点集拓扑学(Point- set Topology)的建立。很多原来只存在于实数中的概念,被提取出来,进行一般性的讨论。在拓扑学里面,有4个C构成了它的核心:

Closed set(闭集合)。在现代的拓扑学的公理化体系中,开集和闭集是最基本的概念。一切从此引申。这两个概念是开区间和闭区间的推广,它们的根本地位,并不是 一开始就被认识到的。经过相当长的时间,人们才认识到:开集的概念是连续性的基础,而闭集对极限运算封闭——而极限正是分析的根基。
Continuous function (连续函数)。连续函数在微积分里面有个用epsilon-delta语言给出的定义,在拓扑学中它的定义是“开集的原像是开集的函数”。第二个定义和第 一个是等价的,只是用更抽象的语言进行了改写。我个人认为,它的第三个(等价)定义才从根本上揭示连续函数的本质——“连续函数是保持极限运算的函数” ——比如y是数列x1, x2, x3, … 的极限, 那么如果 f 是连续函数,那么 f(y) 就是 f(x1), f(x2), f(x3), …的极限。连续函数的重要性,可以从别的分支学科中进行类比。比如群论中,基础的运算是“乘法”,对于群,最重要的映射叫“同态映射”——保持“乘法”的 映射。在分析中,基础运算是“极限”,因此连续函数在分析中的地位,和同态映射在代数中的地位是相当的。
Connected set (连通集合)。比它略为窄一点的概念叫(Path connected),就是集合中任意两点都存在连续路径相连——可能是一般人理解的概念。一般意义下的连通概念稍微抽象一些。在我看来,连通性有两个重 要的用场:一个是用于证明一般的中值定理(Intermediate Value Theorem),还有就是代数拓扑,拓扑群论和李群论中讨论根本群(Fundamental Group)的阶。
Compact set(紧集)。Compactness似乎在初等微积分里面没有专门出现,不过有几条实数上的定理和它其实是有关系的。比如,“有界数列必然存在收敛子 列”——用compactness的语言来说就是——“实数空间中有界闭集是紧的”。它在拓扑学中的一般定义是一个听上去比较抽象的东西——“紧集的任意 开覆盖存在有限子覆盖”。这个定义在讨论拓扑学的定理时很方便,它在很多时候能帮助实现从无限到有限的转换。对于分析来说,用得更多的是它的另一种形式 ——“紧集中的数列必存在收敛子列”——它体现了分析中最重要的“极限”。Compactness在现代分析中运用极广,无法尽述。微积分中的两个重要定 理:极值定理(Extreme Value Theory),和一致收敛定理(Uniform Convergence Theorem)就可以借助它推广到一般的形式。
从某种意义上说,点集拓扑学可以看成是关于“极限”的一般理论,它抽象于实数理论,它的概念成为几乎所有现代分析学科的通用语言,也是整个现代分析的根基所在。

微分几何:流形上的分析——在拓扑空间上引入微分结构

拓扑学把极限的概念推广到一般的拓扑空间,但这不是故事的结束,而仅仅是开 始。在微积分里面,极限之后我们有微分,求导,积分。这些东西也可以推广到拓扑空间,在拓扑学的基础上建立起来——这就是微分几何。从教学上说,微分几何 的教材,有两种不同的类型,一种是建立在古典微机分的基础上的“古典微分几何”,主要是关于二维和三维空间中的一些几何量的计算,比如曲率。还有一种是建 立在现代拓扑学的基础上,这里姑且称为“现代微分几何”——它的核心概念就是“流形”(manifold)——就是在拓扑空间的基础上加了一套可以进行微 分运算的结构。现代微分几何是一门非常丰富的学科。比如一般流形上的微分的定义就比传统的微分丰富,我自己就见过三种从不同角度给出的等价定义——这一方 面让事情变得复杂一些,但是另外一个方面它给了同一个概念的不同理解,往往在解决问题时会引出不同的思路。除了推广微积分的概念以外,还引入了很多新概 念:tangent space, cotangent space, push forward, pull back, fibre bundle, flow, immersion, submersion 等等。

近些年,流形在machine learning似乎相当时髦。但是,坦率地说,要弄懂一些基本的流形算法, 甚至“创造”一些流形算法,并不需要多少微分几何的基础。对我的研究来说,微分几何最重要的应用就是建立在它之上的另外一个分支:李群和李代数——这是数 学中两大家族分析和代数的一个漂亮的联姻。分析和代数的另外一处重要的结合则是泛函分析,以及在其基础上的调和分析。

代数:一个抽象的世界

关于抽象代数

回过头来,再说说另一个大家族——代数。

如果说古典微积分是分析的入门,那么现代代数的入门点则是两个部分:线性代数(linear algebra)和基础的抽象代数(abstract algebra)——据说国内一些教材称之为近世代数。

代数——名称上研究的似乎是数,在我看来,主要研究的是运算规则。一门代数, 其实都是从某种具体的运算体系中抽象出一些基本规则,建立一个公理体系,然后在这基础上进行研究。一个集合再加上一套运算规则,就构成一个代数结构。在主 要的代数结构中,最简单的是群(Group)——它只有一种符合结合率的可逆运算,通常叫“乘法”。如果,这种运算也符合交换率,那么就叫阿贝尔群 (Abelian Group)。如果有两种运算,一种叫加法,满足交换率和结合率,一种叫乘法,满足结合率,它们之间满足分配率,这种丰富一点的结构叫做环(Ring), 如果环上的乘法满足交换率,就叫可交换环(Commutative Ring)。如果,一个环的加法和乘法具有了所有的良好性质,那么就成为一个域(Field)。基于域,我们可以建立一种新的结构,能进行加法和数乘,就 构成了线性代数(Linear algebra)。

代数的好处在于,它只关心运算规则的演绎,而不管参与运算的对象。只要定义恰 当,完全可以让一只猫乘一只狗得到一头猪:-)。基于抽象运算规则得到的所有定理完全可以运用于上面说的猫狗乘法。当然,在实际运用中,我们还是希望用它 干点有意义的事情。学过抽象代数的都知道,基于几条最简单的规则,比如结合律,就能导出非常多的重要结论——这些结论可以应用到一切满足这些简单规则的地 方——这是代数的威力所在,我们不再需要为每一个具体领域重新建立这么多的定理。

抽象代数有在一些基础定理的基础上,进一步的研究往往分为两个流派:研究有限 的离散代数结构(比如有限群和有限域),这部分内容通常用于数论,编码,和整数方程这些地方;另外一个流派是研究连续的代数结构,通常和拓扑与分析联系在 一起(比如拓扑群,李群)。我在学习中的focus主要是后者。

线性代数:“线性”的基础地位

对于做Learning, vision, optimization或者statistics的人来说,接触最多的莫过于线性代数——这也是我们在大学低年级就开始学习的。线性代数,包括建立在它 基础上的各种学科,最核心的两个概念是向量空间和线性变换。线性变换在线性代数中的地位,和连续函数在分析中的地位,或者同态映射在群论中的地位是一样的 ——它是保持基础运算(加法和数乘)的映射。

在learning中有这样的一种倾向——鄙视线性算法,标榜非线性。也许在 很多场合下面,我们需要非线性来描述复杂的现实世界,但是无论什么时候,线性都是具有根本地位的。没有线性的基础,就不可能存在所谓的非线性推广。我们常 用的非线性化的方法包括流形和kernelization,这两者都需要在某个阶段回归线性。流形需要在每个局部建立和线性空间的映射,通过把许多局部线 性空间连接起来形成非线性;而kernerlization则是通过置换内积结构把原线性空间“非线性”地映射到另外一个线性空间,再进行线性空间中所能 进行的操作。而在分析领域,线性的运算更是无处不在,微分,积分,傅立叶变换,拉普拉斯变换,还有统计中的均值,通通都是线性的。

泛函分析:从有限维向无限维迈进

在大学中学习的线性代数,它的简单主要因为它是在有限维空间进行的,因为有 限,我们无须借助于太多的分析手段。但是,有限维空间并不能有效地表达我们的世界——最重要的,函数构成了线性空间,可是它是无限维的。对函数进行的最重 要的运算都在无限维空间进行,比如傅立叶变换和小波分析。这表明了,为了研究函数(或者说连续信号),我们需要打破有限维空间的束缚,走入无限维的函数空 间——这里面的第一步,就是泛函分析。

泛函分析(Functional Analysis)是研究的是一般的线性空间,包括有限维和无限维,但是很多东西在有限维下显得很trivial,真正的困难往往在无限维的时候出现。在 泛函分析中,空间中的元素还是叫向量,但是线性变换通常会叫作“算子”(operator)。除了加法和数乘,这里进一步加入了一些运算,比如加入范数去 表达“向量的长度”或者“元素的距离”,这样的空间叫做“赋范线性空间”(normed space),再进一步的,可以加入内积运算,这样的空间叫“内积空间”(Inner product space)。

大家发现,当进入无限维的时间时,很多老的观念不再适用了,一切都需要重新审视。

所有的有限维空间都是完备的(柯西序列收敛),很多无限维空间却是不完备的(比如闭区间上的连续函数)。在这里,完备的空间有特殊的名称:完备的赋范空间叫巴拿赫空间(Banach space),完备的内积空间叫希尔伯特空间(Hilbert space)。
在有限维空间中空间和它的对偶空间的是完全同构的,而在无限维空间中,它们存在微妙的差别。
在有限维空间中,所有线性变换(矩阵)都是有界变换,而在无限维,很多算子是无界的(unbounded),最重要的一个例子是给函数求导。
在有限维空间中,一切有界闭集都是紧的,比如单位球。而在所有的无限维空间中,单位球都不是紧的——也就是说,可以在单位球内撒入无限个点,而不出现一个极限点。
在有限维空间中,线性变换(矩阵)的谱相当于全部的特征值,在无限维空间 中,算子的谱的结构比这个复杂得多,除了特征值组成的点谱(point spectrum),还有approximate point spectrum和residual spectrum。虽然复杂,但是,也更为有趣。由此形成了一个相当丰富的分支——算子谱论(Spectrum theory)。
在有限维空间中,任何一点对任何一个子空间总存在投影,而在无限维空间中, 这就不一定了,具有这种良好特性的子空间有个专门的名称切比雪夫空间(Chebyshev space)。这个概念是现代逼近理论的基础(approximation theory)。函数空间的逼近理论在Learning中应该有着非常重要的作用,但是现在看到的运用现代逼近理论的文章并不多。
继续往前:巴拿赫代数,调和分析,和李代数

基本的泛函分析继续往前走,有两个重要的方向。第一个是巴拿赫代数 (Banach Algebra),它就是在巴拿赫空间(完备的内积空间)的基础上引入乘法(这不同于数乘)。比如矩阵——它除了加法和数乘,还能做乘法——这就构成了一 个巴拿赫代数。除此以外,值域完备的有界算子,平方可积函数,都能构成巴拿赫代数。巴拿赫代数是泛函分析的抽象,很多对于有界算子导出的结论,还有算子谱 论中的许多定理,它们不仅仅对算子适用,它们其实可以从一般的巴拿赫代数中得到,并且应用在算子以外的地方。巴拿赫代数让你站在更高的高度看待泛函分析中 的结论,但是,我对它在实际问题中能比泛函分析能多带来什么东西还有待思考。

最能把泛函分析和实际问题在一起的另一个重要方向是调和分析 (Harmonic Analysis)。我在这里列举它的两个个子领域,傅立叶分析和小波分析,我想这已经能说明它的实际价值。它研究的最核心的问题就是怎么用基函数去逼近 和构造一个函数。它研究的是函数空间的问题,不可避免的必须以泛函分析为基础。除了傅立叶和小波,调和分析还研究一些很有用的函数空间,比如Hardy space,Sobolev space,这些空间有很多很好的性质,在工程中和物理学中都有很重要的应用。对于vision来说,调和分析在信号的表达,图像的构造,都是非常有用的 工具。

当分析和线性代数走在一起,产生了泛函分析和调和分析;当分析和群论走在一 起,我们就有了李群(Lie Group)和李代数(Lie Algebra)。它们给连续群上的元素赋予了代数结构。我一直认为这是一门非常漂亮的数学:在一个体系中,拓扑,微分和代数走到了一起。在一定条件下, 通过李群和李代数的联系,它让几何变换的结合变成了线性运算,让子群化为线性子空间,这样就为Learning中许多重要的模型和算法的引入到对几何运动 的建模创造了必要的条件。因此,我们相信李群和李代数对于vision有着重要意义,只不过学习它的道路可能会很艰辛,在它之前需要学习很多别的数学。

现代概率论:在现代分析基础上再生

最后,再简单说说很多Learning的研究者特别关心的数学分支:概率论。 自从Kolmogorov在上世纪30年代把测度引入概率论以来,测度理论就成为现代概率论的基础。在这里,概率定义为测度,随机变量定义为可测函数,条 件随机变量定义为可测函数在某个函数空间的投影,均值则是可测函数对于概率测度的积分。值得注意的是,很多的现代观点,开始以泛函分析的思路看待概率论的 基础概念,随机变量构成了一个向量空间,而带符号概率测度则构成了它的对偶空间,其中一方施加于对方就形成均值。角度虽然不一样,不过这两种方式殊途同 归,形成的基础是等价的。

在现代概率论的基础上,许多传统的分支得到了极大丰富,最有代表性的包括鞅论 (Martingale)——由研究赌博引发的理论,现在主要用于金融(这里可以看出赌博和金融的理论联系,:-P),布朗运动(Brownian Motion)——连续随机过程的基础,以及在此基础上建立的随机分析(Stochastic Calculus),包括随机积分(对随机过程的路径进行积分,其中比较有代表性的叫伊藤积分(Ito Integral)),和随机微分方程。对于连续几何运用建立概率模型以及对分布的变换的研究离不开这些方面的知识。

[转载自:http://blog.jobbole.com/94591/]

06
5

中国古代数学家

0
归档:2020年5月分类:数海泛舟

一、写在前面的话

数学是一门非常悠久的学科,它和其他自然科学一样,诞生于人类文明发展过程之中;数学是一门利用符号语言研究数量、结构、变化以及空间等概念的一门学科,它是自然科学的工具和语言。

我第一次接触数学史是在初中,那时候第一本启蒙书是《数学演义》(作者不是王树和),目前已经找不到这本书。我很确定书名是“数学演义”,读这本书的时候大约是在1999年左右,里面讲了大量关于四大文明古国的数学史,包含了初等数学、微积分和数论的知识,从这本书我第一次听说了希尔伯特、费马、莱布尼茨、欧拉、高斯、庞加莱、黎曼等数学家。除了这本书,我还读了大百科全书里面的数学部分,以及其他图书馆能找到的数学科普书籍,从此以后我坚定了立志长大之后成为一名数学家。

中考结束后的暑假,我阅读了《费马大定理—一个困惑了世间智者358年的谜》,怀尔斯取代华罗庚成为我的偶像。高中时期我在县城的重点高中上学,读了大量数学史和数学家方面的书籍,期间还因此涉猎相对论和理论物理学等方面的知识,我甚至自己推到了洛伦茨变换——这是狭义相对立的基础。

高考之后,我如愿进入985大学的数学专业,期间系统地学习了本科数学,我自认为数学分析、高等代数、解析几何等基础课程我学得很好,只是没有彻底打开复变函数和泛函分析的大门(前两年已经补了一些回来)。我没有错过浩瀚无边的大学图书馆,阅读了大量数学史和数学思想方面的书籍。对我影响最大的是克莱因,特别是他的那本《数学:确定性的丧失》,这是一本介于数学和哲学的书,我读了好几遍,以前我也是抱着完美纯数学观点,这本书改变了我很多看法,深刻影响了我对数学的理解,甚至间接促成了我最终选择了设计算法和写代码。

大学阶段的后阶段,我徘徊在理想(数学)与现实(编程)之间。最终倾向理智的我皈依了现实,毕业后从事软件开发工作,十几年来,倒是也接触数学算法和数学模型。我一直觉得自己曾经一只脚迈进现代数学大门,后来抽身离开;现在回过头来还想打开这扇门,虽然里面风景独好,但是发现已经迈不进去了。

二、中国古代数学家

今年以来读(重读)了大量数学史方面的书籍:李约瑟的《中国科学技术史-数学》、李迪的《中国数学史简编》、吴文俊主编的《中国数学史大系》、克莱因的《古今数学思想》、斯科特的《数学史》、张奠宙《20世纪数学经纬》、李文林的《数学史概论》。读完书之后我对整个世界数学史和中国数学史有了更深刻的了解,这也是我重新系统地思考中国古代数学和数学家。

综合各类文献,如果以真正意义上的数学(即数学定义为:透过抽象化和逻辑推理的使用,由计数、计算、量度和对物体形状及运动的观察而产生),我觉得首位中国古代数学家是赵爽(赵君卿)或者刘徽(因两者生卒年不详所以很难定义谁是第一位),他们两位有比较详实的文献记载,并且所作的工作符合真正意义上的数学工作,赵爽在注解《周髀算经》中严格证明了毕达哥拉斯定理(或勾股定理),刘徽则在注解《九章算术》中做了大量原创新的数学发现,他还写了一部《海岛算经》。至于国内学者推断的张苍、桑弘羊、耿寿昌、许商、刘歆、郑玄,这些人要么在史书传略里没有提到他们的作品,要么只是作为政府官员参与编著古代算经,并没有可靠的历史文献证明他们的数学才华。当然,我并不完全否认这些人可能做出的数学贡献,有如我不否认公元4000年左右前为了修建埃及金字塔而做出数学贡献的无名氏,以及公元3000年左右前在巴比伦泥巴刻下勾股数和公式的无名氏。

这里我不得不提一下商高,看到一些研究者努力去证明商高是第一位数学家,或者商高证明了勾股定理,我对此完全不敢苟同。首先,商高和周公的对话是否真的证明了勾股定理,我还是抱怀疑态度;其次,周公和商高的对话首次出现在《周髀算经》,但是这本书大概率是成书于西汉年间(甚至更晚),我不否认《周髀算经》是汉代之前积累而成,但是具体源头到哪里目前没有任何实证,我更倾向于相信这本书和《九章算术》一样是在汉代经过多人汇集先前的知识汇编而成,并且大部分真正意义的数学知识是在汉代的时候产生。

中国古代数学真正繁荣时期是汉代(含三国魏晋)和宋代两个时期,这段时间产生大量原创性极高的数学,还有很有造诣的数学家,清代末期西方数学传入,加上西学东渐,中国人开始真正研究现代数学。历数中国古代数学家(标注红色是比较纯粹研究数学的数学家),除了上面提到的赵爽刘徽,还有:具有独创精神的王孝通,努力汇编算经、勉强可以称数学家的李淳风和的张丘建,有详细记载但著作失传的祖冲之和祖暅(只能怪动荡的南北朝),发明大衍术的僧一行,学会开三次方的贾宪,著作失传的刘益和蒋周,身兼科学家的沈括,古中国数论大师、证明中国剩余定理的秦九韶,精通算经的杨辉,发明天元术的李治,精于天文算术的王恂,善于解线性方程的朱世杰,编写《九章算法类比大全》的隐士吴敬和珠算先驱王文素,重新挖掘《九章算术》的珠算大师程大位,翻译《几何原本》的徐光启,接触西方数学的李子金和杜知耕,会通中西数学的梅文鼎,研究三角函数的明安图,研究古代算经的李锐,系统介绍和研究西方数学的李善兰华蘅芳,清代末期数学研究工作者夏鸾翔、丁取忠、时曰醇、黄宗宪、席淦、陈志坚,还有发掘古中国数学经书的刘彝程,发起和创建中国数学协会的周达

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。