Acknowledgments |
|
ix | |
About the Authors |
|
xi | |
Authors' Note |
|
xiii | |
1 What This Book Is About |
|
1 | (6) |
|
1.1 Programming and Mathematics |
|
|
2 | (1) |
|
1.2 A Historical Perspective |
|
|
2 | (1) |
|
|
3 | (1) |
|
|
4 | (3) |
2 The First Algorithm |
|
7 | (10) |
|
2.1 Egyptian Multiplication |
|
|
8 | (3) |
|
2.2 Improving the Algorithm |
|
|
11 | (4) |
|
2.3 Thoughts on the Chapter |
|
|
15 | (2) |
3 Ancient Greek Number Theory |
|
17 | (24) |
|
3.1 Geometric Properties of Integers |
|
|
17 | (3) |
|
|
20 | (3) |
|
3.3 Implementing and Optimizing the Code |
|
|
23 | (5) |
|
|
28 | (4) |
|
3.5 The Pythagorean Program |
|
|
32 | (2) |
|
3.6 A Fatal Flaw in the Program |
|
|
34 | (4) |
|
3.7 Thoughts on the Chapter |
|
|
38 | (3) |
4 Euclid's Algorithm |
|
41 | (22) |
|
4.1 Athens and Alexandria |
|
|
41 | (4) |
|
4.2 Euclid's Greatest Common Measure Algorithm |
|
|
45 | (5) |
|
4.3 A Millennium without Mathematics |
|
|
50 | (1) |
|
4.4 The Strange History of Zero |
|
|
51 | (2) |
|
4.5 Remainder and Quotient Algorithms |
|
|
53 | (4) |
|
|
57 | (2) |
|
4.7 Validating the Algorithm |
|
|
59 | (2) |
|
4.8 Thoughts on the Chapter |
|
|
61 | (2) |
5 The Emergence of Modern Number Theory |
|
63 | (22) |
|
5.1 Mersenne Primes and Fermat Primes |
|
|
63 | (6) |
|
5.2 Fermat's Little Theorem |
|
|
69 | (3) |
|
|
72 | (5) |
|
5.4 Proving Fermat's Little Theorem |
|
|
77 | (2) |
|
|
79 | (4) |
|
5.6 Applying Modular Arithmetic |
|
|
83 | (1) |
|
5.7 Thoughts on the Chapter |
|
|
84 | (1) |
6 Abstraction in Mathematics |
|
85 | (26) |
|
|
85 | (4) |
|
6.2 Monoids and Semigroups |
|
|
89 | (3) |
|
6.3 Some Theorems about Groups |
|
|
92 | (3) |
|
6.4 Subgroups and Cyclic Groups |
|
|
95 | (2) |
|
|
97 | (5) |
|
|
102 | (2) |
|
6.7 Examples of Categorical and Non-categorical Theories |
|
|
104 | (3) |
|
6.8 Thoughts on the Chapter |
|
|
107 | (4) |
7 Deriving a Generic Algorithm |
|
111 | (18) |
|
7.1 Untangling Algorithm Requirements |
|
|
111 | (2) |
|
|
113 | (3) |
|
|
116 | (2) |
|
|
118 | (1) |
|
7.5 Turning Multiply into Power |
|
|
119 | (2) |
|
7.6 Generalizing the Operation |
|
|
121 | (3) |
|
7.7 Computing Fibonacci Numbers |
|
|
124 | (3) |
|
7.8 Thoughts on the Chapter |
|
|
127 | (2) |
8 More Algebraic Structures |
|
129 | (26) |
|
8.1 Stevin, Polynomials, and GCD |
|
|
129 | (6) |
|
8.2 Gottingen and German Mathematics |
|
|
135 | (5) |
|
8.3 Noether and the Birth of Abstract Algebra |
|
|
140 | (2) |
|
|
142 | (3) |
|
8.5 Matrix Multiplication and Semirings |
|
|
145 | (2) |
|
8.6 Application: Social Networks and Shortest Paths |
|
|
147 | (3) |
|
|
150 | (1) |
|
8.8 Fields and Other Algebraic Structures |
|
|
151 | (1) |
|
8.9 Thoughts on the Chapter |
|
|
152 | (3) |
9 Organizing Mathematical Knowledge |
|
155 | (22) |
|
|
155 | (4) |
|
|
159 | (2) |
|
9.3 Euclid and the Axiomatic Method |
|
|
161 | (3) |
|
9.4 Alternatives to Euclidean Geometry |
|
|
164 | (3) |
|
9.5 Hilbert's Formalist Approach |
|
|
167 | (2) |
|
|
169 | (4) |
|
|
173 | (3) |
|
9.8 Thoughts on the Chapter |
|
|
176 | (1) |
10 Fundamental Programming Concepts |
|
177 | (20) |
|
10.1 Aristotle and Abstraction |
|
|
177 | (3) |
|
|
180 | (1) |
|
|
181 | (3) |
|
|
184 | (1) |
|
10.5 Iterator Categories, Operations, and Traits |
|
|
185 | (3) |
|
|
188 | (2) |
|
|
190 | (1) |
|
|
191 | (5) |
|
10.9 Thoughts on the Chapter |
|
|
196 | (1) |
11 Permutation Algorithms |
|
197 | (22) |
|
11.1 Permutations and Transpositions |
|
|
197 | (4) |
|
|
201 | (3) |
|
|
204 | (3) |
|
|
207 | (5) |
|
|
212 | (3) |
|
|
215 | (1) |
|
11.7 Memory-Adaptive Algorithms |
|
|
216 | (1) |
|
11.8 Thoughts on the Chapter |
|
|
217 | (2) |
12 Extensions of GCD |
|
219 | (18) |
|
12.1 Hardware Constraints and a More Efficient Algorithm |
|
|
219 | (3) |
|
12.2 Generalizing Stein's Algorithm |
|
|
222 | (3) |
|
|
225 | (4) |
|
|
229 | (5) |
|
|
234 | (1) |
|
12.6 Thoughts on the Chapter |
|
|
234 | (3) |
13 A Real-World Application |
|
237 | (12) |
|
|
237 | (3) |
|
|
240 | (3) |
|
13.3 The Miller-Rabin Test |
|
|
243 | (2) |
|
13.4 The RSA Algorithm: How and Why It Works |
|
|
245 | (3) |
|
13.5 Thoughts on the Chapter |
|
|
248 | (1) |
14 Conclusions |
|
249 | (2) |
Further Reading |
|
251 | (6) |
A Notation |
|
257 | (4) |
B Common Proof Techniques |
|
261 | (4) |
|
B.1 Proof by Contradiction |
|
|
261 | (1) |
|
|
262 | (1) |
|
B.3 The Pigeonhole Principle |
|
|
263 | (2) |
C C++ for Non-C++ Programmers |
|
265 | (10) |
|
|
265 | (1) |
|
|
266 | (1) |
|
C.3 Declaration Syntax and Typed Constants |
|
|
267 | (1) |
|
|
268 | (1) |
|
C.5 Preconditions, Postconditions, and Assertions |
|
|
269 | (1) |
|
C.6 STL Algorithms and Data Structures |
|
|
269 | (1) |
|
|
270 | (2) |
|
C.8 Type Aliases and Type Functions with using in C++11 |
|
|
272 | (1) |
|
C.9 Initializer Lists in C++11 |
|
|
272 | (1) |
|
C.10 Lambda Functions in C++11 |
|
|
272 | (1) |
|
|
273 | (2) |
Bibliography |
|
275 | (6) |
Index |
|
281 | |