内容简介
不同于以往的编程类书籍,《数学与泛型编程:高效编程的奥秘》将编程和数学有机地结合在一起,从历史的角度来分析现代编程的发展历程,有助于读者进一步了解C++、Java等程序语言。虽然书中含有一些复杂难懂的数学原理,但是通过结合现代通用编程的实例,使得两者和谐自然地呈现在读者眼前。目录
译者序
致谢
作者简介
作者附言
第1章 内容提要1
1.1 编程与数学1
1.2 从历史的角度来讲解2
1.3 阅读准备3
1.4 各章概述3
第2章 算法初谈5
2.1 埃及乘法算法6
2.2 改进该算法9
2.3 本章要点12
第3章 古希腊的数论13
3.1 整数的几何属性13
3.2 筛选素数15
3.3 实现该算法并优化其代码18
3.4 完美数23
3.5 毕达哥拉斯学派的构想26
3.6 毕氏构想中的严重缺陷28
3.7 本章要点31
第4章 欧几里得算法33
4.1 雅典与亚历山大33
4.2 欧几里得的最大公度量算法36
4.3 缺乏数学成就的一千年40
4.4 奇怪的042
4.5 求余及求商算法44
4.6 用同一份代码来实现求余及求商47
4.7 对最大公约数算法进行验证49
4.8 本章要点51
第5章 现代数论的兴起52
5.1 梅森素数与费马素数52
5.2 费马小定理57
5.3 消去59
5.4 证明费马小定理63
5.5 欧拉定理65
5.6 模运算的应用69
5.7 本章要点69
第6章 数学中的抽象71
6.1 群71
6.2 幺半群与半群74
6.3 与群有关的定理77
6.4 子群及循环群80
6.5 拉格朗日定理82
6.6 理论与模型86
6.7 举例说明范畴理论与非范畴理论89
6.8 本章要点92
第7章 推导泛型算法94
7.1 厘清算法所应满足的要求94
7.2 对模板参数A提出要求95
7.3 对模板参数N提出要求98
7.4 提出新的要求100
7.5 将乘法算法改编为幂算法102
7.6 对运算本身加以泛化103
7.7 计算斐波那契数106
7.8 本章要点109
第8章 更多代数结构110
8.1 斯蒂文、多项式及最大公约数110
8.2 哥廷根与德国数学115
8.3 埃米·诺特与抽象代数的诞生120
8.4 环121
8.5 矩阵乘法与半环124
8.6 半环的运用:社交网络与最短路径125
8.7 欧几里得整环127
8.8 域及其他的代数结构128
8.9 本章要点129
第9章 整理数学知识132
9.1 证明132
9.2 数学史上的第一个定理135
9.3 欧几里得与公理化方法137
9.4 与欧氏几何并立的其他几何学139
9.5 希尔伯特的形式化方法141
9.6 皮亚诺与他的公理144
9.7 用皮亚诺公理来构建算术体系147
9.8 本章要点149
第10章 编程的基本概念150
10.1 亚里士多德与抽象150
10.2 值与类型152
10.3 concept153
10.4 迭代器156
10.5 迭代器的种类、所支持的操作及所具备的特性157
10.6 区间160
10.7 线性搜索162
10.8 二分搜索163
10.9 本章要点167
第11章 置换算法169
11.1 置换与换位169
11.2 交换两个区间内的元素172
11.3 旋转175
11.4 利用循环来执行旋转178
11.5 倒置182
11.6 空间复杂度186
11.7 内存自适应算法187
11.8 本章要点188
第12章 再论最大公约数算法189
12.1 硬件的限制催生出更为高效的算法189
12.2 Stein算法的推广192
12.3 贝祖等式194
12.4 扩展最大公约数算法198
12.5 最大公约数算法的运用202
12.6 本章要点203
第13章 实际运用204
13.1 密码学204
13.2 素数测试206
13.3 米勒–拉宾素数测试209
13.4 RSA算法的步骤及原理211
13.5 本章要点214
第14章 《数学与泛型编程:高效编程的奥秘》总结215
延伸阅读217
附录A 记法222
附录B 常用的证明办法225
附录C 写给非C++程序员看的C++知识228
参考文献237
中英文词汇对照表241精彩书摘
《数学与泛型编程:高效编程的奥秘》:
迭代器可以理解为一种能够在线性时间内执行线性搜索的东两,其关键在于后继(successor)这一概念,其实迭代器可以直接自得皮亚诺公理,因为这个名叫Iterator的concept,实际上就是“一种具备后继概念的理论”。然而编程中的迭代器并没有这么严格,因为我们并不要求每一条皮亚诺公理都必须成立。例如在皮亚诺算术中,所有的数都有后继元素,然而这对于迭代器来说,则未必成立,因为我们有可能已经处在整套数据的末端了此外,皮亚诺公理还说:相等的后继元素所对应的前趋元素也必定相等,这就足说,不允许出现循环结构。这条要求同样不适用于编程工作,因为我们可能要用到那种可以链接到早前元素并构成循环的数据结构,而且有时恰恰需要用这种结构来高效地进行计算。
除了可以移动到后继位置之外,我们还能对迭代器执行解引用(dereferencing)操作,以便获取其所指向的元素值。解引用对时间复杂度是有要求的,也就是说,它应该是一种快速的(fast)操作才对,这意味着:其他的数据获取方式都不如通过迭代器来获取数据更快。
……