This text is the result of work by mathematics and information technology professors at Georgia Gwinnett College working under an Affordable Learning Georgia (ALG) textbook transformation grant. ALG is a University System of Georgia sponsored organization that promotes free and low-cost educational resources. This textbook is licensed under Creative Commons Attribution License v4.0 Attribution-NonCommercial https://creativecommons.org/licenses/by-nc/4.0/ (CC BY-NC)].

Additional instructional materials, including guided notes, applets, and links to pre-built homework assignments using Edfinity are available in the book’s GitHub readme page .

1.2. Course Objectives

At Georgia Gwinnett College, students who have successfully completed the Discrete Mathematics course will,

1. Reason mathematically and use mathematical language appropriately to demonstrate an understanding of comprehending and constructing mathematical arguments.

2. Perform combinatorial analysis to solve counting problems and analyze algorithms.

3. Demonstrate an understanding of discrete structures including sets, permutations, relations, graphs, and trees.

4. Demonstrate algorithmic thinking using mathematical creativity and critical thinking by specifying algorithms, verifying that algorithms work, and analyzing the time required to perform specific algorithms.

5. Use appropriate technology in the evaluation, analysis, and synthesis of information in problem-solving situations.

These course goals help structure the content of this class, which is aimed at students of information technology, computer science, and applied mathematics. The focus is on applying discrete math techniques from the two broad component areas of discrete math, namely combinatorics or enumerative techniques, and graph theory.

To that end, algorithmic thinking figures prominently in this course. Designing algorithms, particularly algorithms applied to networks, involves the use of graph theory methods. Implementing algorithms requires a careful understanding of logical structures, and usually a top down implementation approach, beginning with a specifications description, and then proceeding to a pseudocode implementation and finally a language dependent coding implementation. Moreover, analyzing the complexity of algorithms requires a knowledge of functions, the growth of functions, and counting techniques from combinatorial analysis. Similarly, mathematical induction and recursive definitions are used in a cohesive way to understand algorithms and the options in implementing these recursively versus iteratively.

The approach we take is one with an integrative incorporation of programming and algorithms into the course. The aim is to help improve students success with their broad programming curricula in courses like Intermediate and Advanced Programming.