The official prerequisite courses for CS 555 are CS 251 Data structures CS 381 Analysis of algorithms CS 426 Introduction to computer security MA 351 Linear algebra If you are an undergraduate student at Purdue, then you may enroll in CS 555 if and only if you have taken these 4 courses (and passed them). If you are a graduate student, these prerequisites are not enforced. If you are a graduate student in Computer Science, then you have the proper background for CS 555 (but keep reading). If you are a graduate student in some other department or program, please consider the following "real prerequisites" to determine whether you are ready to take CS 555. To succeed in CS 555 you will need the following knowledge and skills: Calculus: Can integrate and differentiate polynomials, e^x and log x. Can find extreme values of functions. Can graph functions and find lines of symmetry. Have seen the epsilon-delta definition of limit. Know simple approximations, such as e^x is approximately 1 + x when x is near 0. Have seen implicit differentiation. Probability: Understand equally likely events, mutually exclusive events, conditional probability, coin tossing, dice, the standard deck of playing cards, random variables, probability distribution functions, mean, median, uniform distribution, factorial, binomial coefficients. Arithmetic: Know what even and odd integers are. Understand the mod function and greatest common divisor. Understand divisibility (of integers) and the division algorithm with quotient and remainder. Know about prime and composite numbers and factoring (small) integers. Know about positional number systems: binary and decimal, at least, and arithmetic with such numbers. Data structures: Understand trees, traversals, Huffman codes and logical bit operations: AND, OR, NOT, EXCLUSIVE-OR. Networks: Have seen the network protocol layers in some model of peer-to-peer correspondence. Understand some network addressing and routing scheme, network topologies and network vulnerabilities. Know what routers and name servers do. Operating systems: Understand protection of files, memory and general objects. Understand user authentication via passwords. Linear algebra: Can multiply matrices. Can solve n linear equations in n unknowns by an efficient algorithm. Understand vectors: addition, scalar and dot products. Know what groups and fields are. Have heard of the field with 2 elements. Analysis of algorithms: Know big-Oh, big-Theta and big-Omega notations for asymptotic time and space complexity as a function of input size. Know how to sort n things in O(n log n) time. Understand deterministic versus probabilistic algorithms. Have heard of polynomial time (P) algorithms, NP-hard and NP-complete problems. Can easily see what this function does and find its time complexity: real f(real x, positive integer n) { real y, z; integer m; y = 1.0; z = x; m = n; while (m > 0) { if ((m AND 1) == 1) y = y*z; z = z*z; m = floor(m/2); } return y; }