## Courses

### Computer Science 121 - Computer Science Fundamentals I

Full course for one semester. An introduction to computer science, covering topics including elementary algorithms and data structures, functional and procedural abstraction, data abstraction, object orientation, logic, and the digital representations of numbers. Emphasis is on mathematical problems and calculations and on recursive algorithms and data structures. The course includes a significant programming laboratory component where students will solve computational problems using a high-level language. The mechanisms for processing and executing programs will be surveyed. Prerequisite: three years of high school mathematics. Lecture-laboratory. *Previously numbered Mathematics 121.*

### Computer Science 221 - Computer Science Fundamentals II

Full course for one semester. A second course in computer science, an introduction to advanced structures and techniques. The course will develop the foundations of computing, providing an introduction to theoretical models of computation and also to practical computer system construction. Selected topics include digital design, from gates to processors; the construction of interpreters, including language parsing and run-time systems; parallelism and concurrency; and universality. There will be significant programming projects exploring a number of these topics, and students will be introduced to the advanced programming techniques and data structures that support their construction. Prerequisite: Computer Science 121 or equivalent. Lecture-laboratory. *Previously numbered Mathematics 221.*

### Computer Science 382 - Algorithms and Data Structures

Full course for one semester. An introduction to computer science covering the design and analysis of algorithms. The course will focus on various abstract data types and associated algorithms. The course will include implementation of some of these ideas on a computer. Prerequisite: Computer Science 121 or equivalent, and one of Mathematics 112 or 113. Conference. Cross-listed as Mathematics 382. *Numbered solely as Mathematics 382 prior to 2017—18.*

### Computer Science 384 - Programming Language Design and Implementation

Full course for one semester. A study of the organization and structure of modern programming languages. This course will survey key programming language paradigms, including functional, object-oriented, and logic- and constraint-based languages. A formal approach will be taken to understanding the fundamental concepts underlying these paradigms, including their syntax, semantics, and type systems. The course will cover selected topics in the implementation of language systems such as parsers, interpreters, and compilers, and of run-time support for high-level languages. Prerequisite: Computer Science 221, and one of Mathematics 112 or 113. Lecture-conference. *Previously numbered Mathematics 384.*

Not offered 2017–18.

### Computer Science 385 - Computer Graphics

Full course for one semester. Introduction to computer image synthesis and mathematical modeling for computer graphics applications. Topics include image processing, 2-D and 3-D modeling techniques such as curve and surface representation, geometric algorithms for intersection and hidden surface removal, 3-D rendering, and animation. Prerequisite: Computer Science 121 and Mathematics 201. Lecture-conference. *Previously numbered Mathematics 385.*

### Computer Science 387 - Computability and Complexity

Full course for one semester. Introduction to models of computation including finite automata, formal languages, and Turing machines, culminating in universality and undecidability. An introduction to resource-bounded models of computation and algorithmic complexity classes, including NP and PSPACE, and the notions of relative hardness and completeness. Prerequisite: Computer Science 121 or equivalent, and Mathematics 112 and 113. Lecture-conference. Cross-listed as Mathematics 387. *Numbered solely as Mathematics 387 prior to 2017—18.*

### Computer Science 388 - Cryptography

Full course for one semester. An introduction to modern cryptography. Topics include private- and public-key encryption, message authentication codes, pseudorandomness, and digital signatures. Emphasis is placed on formal definitions of security, proofs of security, and key constructions. Prerequisite: Computer Science 382, 387, or Mathematics 382, 387, or 332. Lecture-conference. Cross-listed as Mathematics 388. *Numbered solely as Mathematics 388 prior to 2017—18.*

Not offered 2017–18.

### Computer Science 389 - Computer Systems

Full course for one semester. A study of the design and implementation of computing systems, focusing on aspects whose underpinnings are firmly based in algorithms and applied logic or whose implementation offers interesting problems in those areas. A survey of computer architecture and the hardware-software interface, compilation and run time, and concurrent and networked programming. An introduction to theoretical approaches to problems related to the synchronization and coordination of independently executing processes. Prerequisite: Computer Science 221. Lecture-conference. *Previously numbered Mathematics 389.*

### Computer Science 394 - Principles of Compiler Design

Full course for one semester. This course covers the design and construction of programming language compilers. It covers the basic phases of the compilation process, including syntactic analysis and parsing, semantic analysis, intermediate representations of code, dataflow analysis, register allocation, code generation, and other optimizations. The end product of the course is a working compiler for a programming language. Time permitting, the course surveys advanced techniques such as compilation of functional programming languages or compilation for high-performance hardware. Prerequisite: Computer Science 389 or consent of the instructor. Lecture-conference.

### Computer Science 395 - Advanced Computer Architecture

Full course for one semester. A course that explores the implementation of computer processors, with focus on techniques and designs that seek high performance. We look at pipelining, superscalar designs, multiprocessor systems, cache coherence in multiprocessors, graphics processing units, embedded systems, and network processors. Material includes reading and discussion of technical papers as well as programming projects on several different architectures. Prerequisite: Computer Science 389 or consent of the instructor. Lecture-conference.

### Computer Science 441 - Topics in Computer Science Theory

Full course for one semester. Exploration of topics from advanced algorithm design and theoretical computer science including complexity theory, cryptography, computational geometry, and randomized algorithms, as selected by the instructor. Prerequisite: Computer Science or Mathematics 387 or consent of the instructor. Lecture-conference. Offered in alternate years. Cross-listed as Mathematics 441. *Numbered solely as Mathematics 441 prior to 2017—18.*

### Computer Science 442 - Topics in Computer Science Systems

Full course for one semester. A study of the design and implementation techniques used in a particular area of computer science as selected by the instructor. Students will implement a working system in that area. Recent offerings have covered distributed and networked systems, compilers, and computer game design. Prerequisite: Computer Science 389 or consent of the instructor. Lecture-conference. Offered in alternate years. *Previously numbered Mathematics 442.*

Not offered 2017–18.

### Computer Science 470 - Thesis (Computer Science)

Full course for one year.

### Computer Science 481 - Independent Study

One-half course for one semester. Primarily for juniors and seniors. Prerequisite: approval of the instructor and the division.