In general, this book alternates between theory and applications, i.e. one or two chapters of purely mathematical concepts are followed by one or two chapters on algorithms and applications. The mathematics covered here includes basic number theory (unique factorization, congruences, distribution of primes and quadratic reciprocity) and abstract algebra (groups, rings, fields and vector spaces). It also contains an introduction to discrete probability theory. The choice of topics is motivated primarily by their applicability to computing and communications, especially to specific areas of cryptography, coding theory, automata and complexity theory. The material beyond basic calculus presented in the book is developed from scratch. On general grounds, the book could serve as a course of discrete mathematics for computer science students.