### James D. Fix

Parallel algorithms and programming language theory.

### Adam Groce

Cryptography and private data analysis. On sabbatical 2022–23.

### Charles McGuffey

Algorithms, memory management, and emerging technologies.

### Dylan McNamee

Computer science, operating systems.

### Chanathip (Meaw) Namprempre

Cryptography.

Reed offers a computer science major and a standing mathematics–computer science interdisciplinary major. The Computer Science Fundamentals I and II courses introduce students to the discipline, each providing a significant foundation in programming and each preparing students for the core coursework in algorithms, theory of computation, and computing systems. These core courses lead to a variety of subdisciplines of computer science, surveyed in upper-level elective courses. Students are also expected to take several mathematics courses. Computer science is a very mathematical discipline and this skill in mathematics is used throughout the curriculum.

**Requirements for the Computer Science Major**

- Mathematics 111 or the equivalent, 112, 113, and 201.
- Computer Science 121 and 221.
- Computer Science 382, 387, and 389.
- Four additional computer science units numbered higher than 300 (excluding Computer Science 470).
- Computer Science 470.

For students who wish to pursue the standing mathematics–computer science interdisciplinary major, please refer to the requirements in the interdisciplinary section of this catalog.

**A Minor in Computer Science**

The goal of the computer science minor is to give students solid programming skills and an appreciation for the larger academic discipline. Students can use the skills they acquire in computer science classes to pursue goals in everything from ancient Mediterranean studies and history to physics and biology.

**Requirements for the minor**

All students will complete the following courses:

- Computer Science 121, 221, and 382;
- One additional unit of computer science numbered 250 or higher;
- Mathematics 111, 112, and 113.

### Computer Science 121 - Computer Science Fundamentals I

One-unit semester course. 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.

### Computer Science 122 - Intermediate Computer Science Fundamentals I

One-half-unit semester course. 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. This is an accelerated version of Computer Science 121 for students with significant programming experience. Prerequisite: three years of high school mathematics. Lecture-laboratory.

### Computer Science 221 - Computer Science Fundamentals II

One-unit semester course. 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.

### Computer Science 315 - Ethics and Public Policy

One-unit semester course. This course examines the ethical and public policy questions raised by new computer technologies. Topics vary by year but usually include criminal hacking and cyber warfare, intellectual property laws, data privacy, and fairness of algorithmic decision-making. Prerequisite: Computer Science 221 and Humanities 110 or equivalent. Lecture-conference.

Not offered 2022–23.

### Computer Science 351 - Software Engineering

One-unit semester course. This course explores the process of designing and implementing software. The course will cover software design methodologies, requirements design, design patterns, software design diagrams, testing strategies, code reviews, project plans, and software presentation. Students will work in groups on both writing and programming assignments. Prerequisite: Computer Science 221. Lecture-conference.

### Computer Science 361 - Parallelism and Concurrency

One-unit semester course. We investigate the theory behind achieving high performance on high-throughput multiprocessor systems. In the first half of the course we develop and analyze parallel algorithms for tightly coupled synchronous systems that use either shared memory or message passing to communicate. In the second half we look at loosely coupled systems, studying efficient mechanisms for synchronizing access to shared data structures, and focusing particularly on proving their correctness. Though we look at abstract models of these systems throughout, students will also be asked to implement their ideas on current multiprocessor hardware. Prerequisites: Computer Science 221 and 382. Lecture-conference.

Not offered 2022–23.

### Computer Science 377 - Artificial Intelligence

One-unit semester course. This course is an introduction to the construction of software systems that emulate intelligent behavior. Topics include knowledge representation, reasoning under uncertainty, logic programming, planning, and algorithmic strategies for large-scale combinatorial search. Students will explore these topics with a series of implementation projects. Prerequisite: Computer Science 382. Lecture-conference.

Not offered 2022–23.

### Computer Science 378 - Deep Learning

One-unit semester course. This course is an introduction to deep neural architectures and their training. Beginning with the fundamentals of regression, optimization, and regularization, the course will then survey a variety of architectures and their associated applications. Students will develop projects that implement deep-learning systems to perform various tasks. Prerequisites: Mathematics 201 and Computer Science 121. Lecture-conference.

Not offered 2022–23.

### Computer Science 379 - Natural Language Processing

One-unit semester course. This course is an introduction to natural language processing and computational linguistics. Topics include computational approaches to text categorization, syntactic analysis, semantic analysis, and machine translation. The course emphasizes modern techniques that leverage deep learning models. Prerequisite: Computer Science 378. Lecture-conference.

Not offered 2022–23.

### Computer Science 381 - Algorithms Programming Seminar

One-half-unit semester course. This course is a natural companion to the study of algorithms and data structures as covered in Computer Science 382, the required companion to this course, building from the implementation experience gained in Computer Science Fundamentals I and II. In weekly sessions, students work on programming problems together and discuss their solutions. Group work is strongly emphasized and encouraged. The goal of the course is to give students more programming practice with the material they are learning in Computer Science 382. Prerequisite: Computer Science 221. Corequisite: Computer Science 382. Conference.

Not offered 2022–23.

### Computer Science 382 - Algorithms and Data Structures

One-unit semester course. An introduction to 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 Mathematics 112 and 113. Lecture-conference. Cross-listed as Mathematics 382.

### Computer Science 383 - Advanced Programming Seminar

One-half-unit semester course. This course is an advanced follow-up to the study of algorithms and data structures, as covered in Computer Science Fundamentals I and II and in Computer Science 382, with emphasis on the problem-solving and implementation related to the concepts learned in those courses. In weekly sessions, students work on programming problems together and discuss their solutions. Group work is strongly emphasized and encouraged. The goal of the course is to give students exposure to a variety of programming puzzles and to give them practice carrying their algorithmic ideas into working code. Prerequisites: Computer Science 221 and 382. Conference.

Not offered 2022–23.

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

One-unit semester course. 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-based languages, with particular focus on the fundamental concepts underlying them, including their syntax, semantics, and type systems. It will take a mathematical approach, examining several strong ties with formal logic and the mechanization of proof, especially logics and proof methods related to the properties of programs. Prerequisites: Computer Science 221 and one of Mathematics 112 or 113. Lecture-conference.

Not offered 2022–23.

### Computer Science 385 - Computer Graphics

One-unit semester course. 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.

### Computer Science 387 - Computability and Complexity

One-unit semester course. 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. Prerequisites: Computer Science 121 or equivalent and Mathematics 112 and 113. Lecture-conference. Cross-listed as Mathematics 387.

### Computer Science 388 - Cryptography

One-unit semester course. 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 or 387 or Mathematics 382, 387, or 332. Lecture-conference. Cross-listed as Mathematics 388.

### Computer Science 389 - Computer Systems

One-unit semester course. A study of the design and implementation of computing systems, surveying computer architecture, machine organization, the hardware-software interface, memory and storage subsystems, compilation and run time, and concurrent and networked programming. Students learn to pay particular attention to the underlying factors that affect a program’s performance. An introduction to approaches to problems related to the synchronization and coordination of independently executing processes, and also to the structure of distributed and network-based services. Prerequisite: Computer Science 221. Lecture-conference.

### Computer Science 393 - Operating System Design and Implementation

One-unit semester course. This course covers the low-level details of the software that drives computing hardware, spanning such disparate systems as supercomputers, the internet backbone, laptops, and smartphones. Topics include kernel architectures, scheduling, memory management, security policies and mechanisms, assurance, file systems, networking, virtualization, real time, safety-critical and security-critical systems. Students will implement several operating system components. Prerequisite: Computer Science 389. Lecture-conference.

### Computer Science 394 - Principles of Compiler Design

One-unit semester course. An in-depth look at the design and construction of programming language compilers, covering 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. Students will develop a working compiler and run-time system 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 - Computer Architecture

One-unit semester course. 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. Prerequisite: Computer Science 389 or consent of the instructor. Lecture-conference.

Not offered 2022–23.

### Computer Science 396 - Computer Networks

One-unit semester course. A broad-ranging exploration of topics in computer networks that includes history, communications theory, network architectures, internet protocols, client-server models, strategies for improving network security, and the social impact of modern networking. The course emphasizes both theory and practice and therefore includes both mathematical analysis and programming projects written in Python. Prerequisites: Computer Science 221 and one of Mathematics 112 or 113. Lecture-conference.

### Computer Science 421 - Computing Theory Research Seminar

One-half-unit semester course. This course is an exploration of research in an area of theoretical computer science. Example topics include randomized or parallel algorithms, approximation algorithms, quantum computation or complexity, and zero-knowledge proof systems. Offered alternate years. Prerequisites: Computer Science 382 and 387. Lecture-conference. May be repeated for credit.

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

One-unit semester course. Exploration of topics from advanced algorithm design and theoretical computer science including complexity theory, quantum computation, and approximation algorithms, as selected by the instructor. Prerequisites: Mathematics 201 and Computer Science or Mathematics 382 and 387, or consent of the instructor. Lecture-conference. May be repeated for credit. Offered in alternate years. Cross-listed as Mathematics 441.

Not offered 2022–23.

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

One-unit semester course. 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. May be repeated for credit. Offered in alternate years.

Not offered 2022–23.

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

Two-unit yearlong course; one unit per semester.

### Computer Science 481 - Independent Study

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