### James D. Fix

Parallel algorithms and programming language theory.

### Eitan Frachtenberg

High-performance computer systems.

### Adam Groce

Cryptography and private data analysis.

### Mark Hopkins

Artificial intelligence, machine learning, and computational linguistics.

### David Ramirez

Performance, reliability, and security of wireless networks.

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. The two computer science majors are grounded in mathematics: students are trained to carefully justify computer system implementations, and several computer science electives take a mathematical approach to their topics.

**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.

### 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.

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

One-half 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. 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

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.

### Computer Science 315 - Ethics and Public Policy

One-half course for one semester. Primarily for majors entering computer-related fields. Ethical and social issues related to the development and use of computer technology will be discussed. The course will cover ethical theory and social, political, and legal considerations. Scenarios covered in class will include privacy, reliability and risks of complex systems, and responsibility of professionals for applications and consequences of their work. Prerequisite: Computer Science 221. Lecture-conference.

Not offered 2020–21.

### Computer Science 361 - Parallelism and Concurrency

Full course for one semester. 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.

### Computer Science 377 - Artificial Intelligence

Full course for one semester. 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.

### Computer Science 378 - Deep Learning

Full course for one semester. 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 2020–21.

### Computer Science 379 - Natural Language Processing

Full course for one semester. 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.

### Computer Science 381 - Algorithms Programming Seminar

One-half course for one semester. 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.

### Computer Science 382 - Algorithms and Data Structures

Full course for one semester. 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 course for one semester. This course is an advanced follow-up to the study of algorithms and data structures, as covered in Computer Science Fundamentals I & 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.

### 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-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 2020–21.

### 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.

Not offered 2020–21.

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

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

Not offered 2020–21.

### Computer Science 389 - Computer Systems

Full course for one semester. 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

Full course for one semester. 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 221. Lecture-conference-laboratory.

### Computer Science 394 - Principles of Compiler Design

Full course for one semester. 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.

Not offered 2020–21.

### 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.

Not offered 2020–21.

### Computer Science 396 - Computer Networks

Full course for one semester. 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 course for one semester. 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.

Not offered 2020–21.

### Computer Science 422 - Computer Systems Research Seminar

One-half course for one semester. This course is an exploration of recent research in the design, development, and implementation of computer systems. Example topics include high-performance architecture, highly available networked and distributed systems, software and hardware system verification. Offered in alternate years. Prerequisite: Computer Science 389. Lecture-conference. May be repeated for credit.

Not offered 2020–21.

### 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, 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. Offered in alternate years. Cross-listed as Mathematics 441.

### 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.

### 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.