热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《数学与泛型编程:高效编程的奥秘》一3.5毕达哥拉斯学派的构想

3.5毕达哥拉斯学派的构想对于毕达哥拉斯学派的人来说,数学并不像今天这样,是对抽象符号所做的运算,而是一种关于数字和空间的科学。在可以感

3.5 毕达哥拉斯学派的构想

对于毕达哥拉斯学派的人来说,数学并不像今天这样,是对抽象符号所做的运算,而是一种关于数字和空间的科学。在可以感知的现实世界中,数字和空间正是两个最为基本的方面。毕氏学派除了关注正方形数、长方形数及三角形数等有形数(figurate number)之外,他们还认为,空间有着离散的结构(discrete structure),于是他们试图提供一套以数字为基础的理论,使得几何学可以建立在该理论之上。这种想法实际上就相当于要创建一套基于正整数的统一数学理论。
为此,他们提出一个概念,说一条线段可以用另一条线段来“度量”(be measured):
定义3.1 当且仅当线段A可以通过有限个连续的线段V来表示时,线段V才能用作线段A的量度。
这个量度必须选取得足够小,使我们可以通过整数次的拼接来产生所需的线段,没有“分数”(fractional)量度这一说法。测量不同的线段时,当然可以分别使用不同的量度,但如果想用同一种量度来测量两条线段,那么该量度必须是二者的公度:
定义3.2 当且仅当线段V可以同时成为线段A与线段B的量度时,它才能用作二者的公度。
毕氏学派认为,对于任何一个给定的情境来说,都能找到适用于其中所有相关物件的公度,因此,空间就可以离散地进行表示了。

    • *
      由于公度可能有很多个,因此,他们提出最大公度量(greatest common measure)这一概念。

定义3.3 如果线段V是线段A和线段B的公度,而且比两者的其他公度都要大,那么V就是A和B的最大公度量。
毕氏学派还意识到了最大公度量(GCM)所具备的很多性质,这些性质用现代的记法可以表示为:
gcm(a, a) = a(3.7)
gcm(a, b) = gcm(a, a + b)(3.8)
b<a gcm(a, b) = gcm(a-b, b)(3.9)
gcm(a, b) = gcm(b, a)(3.10)
根据这些性质,他们提出了古希腊数学中最为重要,或许也是整个数学中最为重要的算法,那就是如何计算两条线段的最大公度量。古希腊人所使用的计算器具是可以对线段进行操作的直尺和圆规。如果用C++代码来表示该算法,并把line_segment视为一种类型,那么我们可以将其写为:
screenshot

上面这段代码借助了三分律(trichotomy law),也就是说,如果a与b这两个变量是同一种类型,并且该类型的所有取值都是可以比较大小的(totally ordered),那么a与b的关系只可能是a = b、a<b或a>b这三种情况之一。
我们以gcm(196, 42)为例来演示该算法的计算过程:
a b
196>42, gcm(196, 42) = gcm(196-42, 42) = gcm(154, 42)
154>42, gcm(154, 42) = gcm(154-42, 42) = gcm(112, 42)
112>42, gcm(112, 42) = gcm(112-42, 42) = gcm(70, 42)
70>42, gcm(70, 42) = gcm(70-42, 42) = gcm(28, 42)
28<42, gcm(28, 42) = gcm(28, 42-28) = gcm(28, 14)
28>14, gcm(28, 14) = gcm(28-14, 14) = gcm(14, 14)
14 = 14, gcm(14, 14) = 14
由此可见,gcm(196, 42) = 14。
我们这里所说的gcm(196, 42),意思当然是指长度为196和长度为42的两条线段所具备的最大公度量,然而本章在举例时为了简单起见,会直接用代表线段长度的那个整数来表示该线段本身。
在接下来的几章中,我们还要使用该算法的各种版本,因此大家一定要理解这个算法,并明白它的计算原理。你可以自己用手算上几轮,以便获得更加确切的印象。



推荐阅读
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 苹果官方在线商店(中国)提供了关于MacBook Pro的详细信息。通过先进的工厂校准技术,新MacBook Pro能够精确地适应多种色彩空间标准,如sRGB、BT.601、BT.709及P3-ST.2084(HDR),确保用户获得最佳视觉效果。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 深入解析C语言中的关键字及其分类
    本文将全面介绍C语言中的关键字,并按照功能将其分为数据类型关键字、控制结构关键字、存储类别关键字和其他关键字四大类,旨在帮助读者更好地理解和运用这些基本元素。C语言中共有32个关键字。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
author-avatar
mobiledu2502887493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有