diff --git a/docs/major/theory_of_computation/TCS25fa.pdf b/docs/major/theory_of_computation/TCS25fa.pdf
new file mode 100644
index 00000000..15ac1aa2
Binary files /dev/null and b/docs/major/theory_of_computation/TCS25fa.pdf differ
diff --git a/docs/major/theory_of_computation/TCS25fa.typ b/docs/major/theory_of_computation/TCS25fa.typ
new file mode 100644
index 00000000..50d1a6c1
--- /dev/null
+++ b/docs/major/theory_of_computation/TCS25fa.typ
@@ -0,0 +1,43 @@
+#show heading.where(level: 1): it => [
+ #set align(center)
+ #set text(size: 18pt, font: "FZXiaoBiaoSong-B05S")
+ #it.body
+]
+
+#set enum(numbering: "1.a)")
+#let poly = math.cal("P")
+#let np = math.cal("NP")
+#let bpp = math.cal("BPP")
+
+= Introduction to Theoretical Computer Science
+
+#align(center)[
+ #text(size: 13pt,font: "STZhongsong",[2025-2026 秋冬期末])
+]
+
+#align(center)[
+ #text(size: 13pt,font: "STZhongsong",[图灵回忆卷])
+]
+
+1. Write T if the statement is true, and F if it is false.
+
+ + [] If $A$ is computable, then $A^*$ is computable.
+ + [] $exists$ a boolean function $F: {0,1}^m -> {0,1}^n$, such that there exists a circuit with at least $Omega(m 2^n)$ gates that computes $F$.
+ + [] Gate set {OR, NOT} is universal, in the sense that any boolean function can be computed by a circuit using only these 2 kinds of gates.
+ + [] To simulate multiple TMs with $k$ states in total using one TM, the resulting TM needs $Omega(k)$ states.
+ + [] To convert an NFA with $k$ states to a DFA, the resulting DFA has $Theta(2^k)$ states.
+ + [] Let a DFA with $k$ states recognize a regular language $L$. $L$ contains an infinite number of strings if and only if $L$ contains a string of length at least $k$.
+ + [] There exists a randomized algorithm that computes some problem with error rate at most $1/3$ if and only if there exists a randomized algorithm that computes the same problem with error rate at most $1/2026$.
+ + [] Probablistic Turing Machine is more powerful than normal Turing Machine, in the sense that it can compute some functions that normal Turing Machine cannot compute.
+ + [] If $f,g in poly$ and they are not constant functions, then $f <=_p g$.
+ + [] If $f <=_p g$ and $g in bpp$, then $f in bpp$.
+
+2. (Regular Language and Automaton) Judge whether the following languages are regular. Prove your answer.
+ 1. $L_1 = { w x in {0,1}^* | x "as a binary number", x mod 3 = 2}$.
+ 2. $L_2 = { w 0 x in {0,1}^* | x "has strictly more 1s than" w}$.
+3. (Context-Free Language and Pushdown Automaton) Show that the language $L = { w 101 x in {0,1}^* | w^R "is a subsequence of" x}$ is a context-free language. (Note: *Subsequence* is not the same as *Substring*. For example, "abc" is a subsequence of "axbxc", but not a substring of it.)
+4. (Automaton) Let $A$ be a context-free language and $B$ be a regular language. Prove that $A \\ B = { w in {0,1}^* | w in A and w in.not B}$ is a context-free language. (Hint: You may conceptually run a PDA and a DFA in parallel.)
+5. (Reduction and Uncomputability) $f: {0,1}^* -> {0,1}$ is a function which takes 2 Turing Machines $M_1$ and $M_2$ as input, and $f(M_1, M_2) = 1$ if there exist at least 2026 strings on which $M_1$ and $M_2$ both halt. Prove that $f$ is uncomputable by reducing HALT to it. (Hint: You may let one of $M_1$ and $M_2$ halt on every input.)
+6. (存疑)(Time Complexity Classes) WSAT problem, based on SAT problem, is defined as follows: Given a boolean formula $phi$ in CNF form and every instance is OR of one to three literals (*Note: In WSAT literals are only allowed to be variables themselves and their negations are not allowed*), and an integer $k$, decide whether there exists a satisfying assignment to $phi$ such that *exactly* $k$ variables are assigned to 1.
+ 1. Prove that WSAT $in np$.
+ 2. Prove that VC $<=_p$ WSAT, where VC is the Vertex Cover problem.
\ No newline at end of file
diff --git a/docs/major/theory_of_computation/index.md b/docs/major/theory_of_computation/index.md
index 3e872fb0..929aa7c9 100644
--- a/docs/major/theory_of_computation/index.md
+++ b/docs/major/theory_of_computation/index.md
@@ -7,87 +7,125 @@ grave: https://zju-turing.github.io/TuringCoursesGrave/major_basic/theory_of_com
# 理论计算机科学导引
-!!! warning "21 级(23 秋冬)课程内容有较大变化,如需 20 级金小刚老师版本内容请查阅修改历史"
+本课程与计算机学院开设的另一门讲解理论计算机科学的课程“计算理论”在某些内容上有不小的区别;具体表现为,对**计算复杂度理论**的分析内容更多。且每年的教材、课程内容都有一些变化。
## 课程学习内容
-课程主要内容为计算理论的基础知识,包括:
+课程主要内容为计算理论的基础知识,研究脉络是这几个问题:
-- 语言、自动机与正则表达式
- - 课程基本概念、常用记号、语言的定义
- - **确定性**和**非确定性**的有限自动机(DFA 和 NFA)
- - DFA 和 NFA 的等价性,NFA 转 DFA 的方法
+- 问题怎么描述?(对应编码)
+- 如何计算问题?(对应各种计算模型,例如电路、自动机与图灵机)
+- 所有问题都可以被计算吗?(对应可计算性)
+- 对于可计算的问题,计算它们需要多少资源?(对应复杂度理论,函数复杂类)
+
+具体大纲如下:
+
+- 编码与电路
+ - 课程基本概念、常用记号、可数与不可数集合
+ - 如何对问题进行编码,编码与可数的关系
+ - 利用最初步的计算模型(布尔电路和对应的程序)进行计算,并研究其规模
+- 语言与自动机
+ - 介绍语言与函数的对应关系
+ - **确定性**和**非确定性**的**有穷自动机**(DFA 和 NFA)
+ - DFA 和 NFA 的等价性与互相转换的过程
- **正则语言**的定义,正则语言和 FA 的等价性,互相转换的方法
- - 正则语言封闭运算,**泵定理** (pumping theorem),如何证明不正则
- - DFA 的状态最小化方法
-- 上下文无关语言 (Context-Free Language, CFL)
- - 上下文无关**语法** (CFG) 的定义,CFG 和 CFL 的关系
- - Chomsky 范式 (CNF),转换 CNF 的方法
- - **下推自动机** (pushdown automata, PDA),PDA 和 CFG 等价性
- - CFL 封闭运算,**泵定理**,如何证明不是 CFL
-- 图灵机 (Turing Machine, TM) 基础
- - TM 定义、TM 构建、TM 的功能(**判定/半判定**语言,**计算函数**),递归函数
- - 变种图灵机、非确定性图灵机与标准确定性图灵机 (STM) 的等价性
-- 不可判定性 (Undecidability)
- - Church-Turing 论题
- - 可判定问题的图灵机构建方法与**规约**
- - **停机问题**,及可由停机问题规约出的其他问题的不可判定性证明
- - Rice 定理与通用的可/不可判定或半判定的证明方法
- - 程序的自输出问题与 Recursion 定理、语言的**枚举**和字典序枚举(略讲)
-- 函数的可计算性
- - 原始递归函数定义、μ 递归函数定义、μ 递归函数与可计算函数的等价性
+ - 正则语言封闭运算,**泵定理** (pumping theorem) 及其应用
+ - **下推自动机** (PDA) 相比普通 FA 的增强
+ - 上下文无关**语法** (CFG) 的定义,CFG 和 PDA 的等价性,互相转换的方法
+- 图灵机 (Turing Machine, TM)
+ - TM 的定义与基本概念、计算过程
+ - 图灵完备性 (Turing Completeness),NAND-TM/RAM 程序
+ - 通用图灵机 UTM 的构造与工作原理
+ - 函数可计算性
+ - Church-Turing 论题
+ - **停机问题**
+ - **归约**,如何利用归约证明某些问题的不可计算性
+ - 利用 Rice Theorem 证明不可计算性
+ - Recursion Theorem 和 Godel 不完备性定理
- 复杂度理论
- - 时间复杂度,P、NP、NP 完全问题的定义及与图灵机关系
- - SAT/3-SAT 问题、Clique 问题、Vertex Cover 问题属于 NP 完全问题的证明
- - 空间复杂度,PSPACE、NPSPACE、EXP 问题的定义与关系
- - Savitch's Theorem 与 Hierarchy Theorem
-
-为了向大家说明这门课内容看似少实际多、补天困难,我刻意把内容介绍写成了复习提纲的形式。
+ - 时间复杂度,空间复杂度
+ - Time Hierarchy Theorem
+ - **多项式时间归约**的定义
+ - 函数复杂类及其之间的关系:P、NP(采用“**多项式时间内可验证性**”作为定义)、EXP、P/poly etc.
+ - NP-Hard、NP-Complete 的定义
+ - 各复杂类的具体例子:SAT/3-SAT 问题、01 EQUATION 问题、SUBSET SUM 问题等,其之间的归约关系
+ - Cook-Levin 定理
+- 概率图灵机与随机算法(这部分是新加的)
+ - 概率图灵机的定义
+ - BPP 类的定义及其性质
+ - 伪随机数生成器
+
+这门课内容多、补天困难,作为一门 2 学分的课程,内容艰涩且难以速成,一定不能掉以轻心。
### 先修要求
- 离散数学理论基础
- 高级数据结构与算法分析
-有了这两门课的基础一些知识可以更容易理解,当然就算你这两门课学了个寂寞也没关系,跟着课听问题不大。
+有了这两门课的基础一些知识可以更容易理解,例如说 ADS 中的复杂度分析和复杂类函数会在这里以更本质的形象再次出现。
## 任课教师
-21 级图灵的计算理论课改为由毛宇尘老师教授。(20 级是只有金小刚老师教授)
+21 级开始,TCS 改为由毛宇尘老师教授(20 级是只有金小刚老师教授)。很有可能之后都由毛宇尘老师教授了。
-毛哥讲课十分清晰有逻辑,跟住老师一定可以学懂这门课的内容,毛哥全程使用 iPad 手写投屏(不过课后不会发布讲义,需要自己跟住记笔记),概念都会手写、证明过程也会一步一步推导。当然毛哥也有一些奇怪的要求,比如不允许前排同学使用电脑,所谓防止屏幕影响其他同学听课(不过一学期上下来这样效果确实还不错)。
+毛宇尘可以说是新式古法上课,全程使用 iPad 手写概念与证明过程并投屏,没有任何 Slides 和讲义参考,并且不允许除最后一排外的同学使用电脑,这也就要求在课后花很多时间消化内容,或是对着智云/教材反复学习概念。
-因为这门课只有图灵一个班,所以讲课内容、作业、小测、考试都由毛哥自己发挥,内容相比《计算理论》有一定拓展。作业比较偏向理论与证明,更多考察是否真的掌握了这些知识,而非只是知道做题方法,当然小测和考试也都是这个风格,只要掌握了课上讲的东西,是肯定能写出东西的。除此之外会有三次讨论的内容,说是讨论其实就是开放性且占分数的少量作业,好好完成就可以。
+这门课只有图灵一个班,所以讲课内容、作业、小测、考试都由毛哥自己发挥,内容相比计算理论有很大拓展。作业比较偏向理论与证明,更多考察是否真的掌握了这些知识,而非只是知道做题方法;小测和考试也都是这个风格,只要掌握了课上讲的东西,是肯定能写出东西的。
## 课程教材
-21 级无教材,全靠毛哥手写讲义。20 级曾用教材如下:
+23 级的教材是 Boaz Barak 的 [_Introduction to Theoretical Computer Science_](https://introtcs.org/)
-***《计算理论基础》Elements of the Theory of Computation***
+20 级曾用教材如下:
+
+**《计算理论基础》Elements of the Theory of Computation**
有中文版,但有一些小错误,英文版笔者未发现错误。中文版部分地方没有照抄英文版,做出了一些修改,经过笔者和一位 dl 的合力验证英文版部分地方确实太拗口,中文版做出了一些更易于理解的修改,所以需要批判性阅读。
-***Introduction to the Theory of Computation. Michael Sipser*** 亦是一本不错的参考教材。
+**Introduction to the Theory of Computation. Michael Sipser** 亦是一本不错的参考教材。
## 分数构成
-- 作业(0%)
- - 不占分数,也不会要求上交,每周会发一些题然后下一周发布答案,作业可以很好地了解老师的出题风格,因此对小测和考试的帮助还是很大的
-- 小测(20%)
- - 21 级进行了两次小测,虽然考验的是是否理解了课上的内容但难度并不算低,不过最后会开根号乘十来调分
-- 讨论(20%)
- - 21 级讨论有 3 次,一次是开放性的问题(问一个语言是不是正则的),一次是自学课外的定理(Ogden's Lemma)来证明,还有一次是写一个输出自身的程序,课上会抽同学起来讲,这部分的给分比较慷慨,只要认真完成了应该都能拿到满分
-- 期末考试(60%)
- - 期末考试的难度不会很大,如果平时跟上的话复习的东西也没有很多,如毛哥所说,“历年卷是没有用的”,因此主要参考的就是小测和作业的题目
-
-22 级的分数构成中,讨论部分的分数转移到了作业上,作业题包含算分的部分和额外不算分的部分,建议还是都好好做一下。
+=== "23 级"
+
+ - 作业(20%)
+ - 一共五次作业,虽然包含“算分的 Part1”和“不算分的 Part2”,但是不在作业中显式标出,所以每次作业还得全完成 [ac01]
+ - 手写完成,线下提交
+ - 在助教发布答案之前都可以进行补交,逾期不补
+ - 小测(20%)
+ - 2 次闭卷小测,很难
+ - 期末考试(60%)
+ - 10 道判断题,剩下全是大题
+ - 小测 + 作业的总分可以由期末分数覆盖(注意不是覆盖单项)
+
+=== "21 级"
+
+ - 作业(0%)
+ - 不占分数,也不会要求上交,每周会发一些题然后下一周发布答案,作业可以很好地了解老师的出题风格,因此对小测和考试的帮助还是很大的
+ - 小测(20%)
+ - 21 级进行了两次小测,虽然考验的是是否理解了课上的内容但难度并不算低,不过最后会开根号乘十来调分
+ - 讨论(20%)
+ - 21 级讨论有 3 次,一次是开放性的问题(问一个语言是不是正则的),一次是自学课外的定理(Ogden's Lemma)来证明,还有一次是写一个输出自身的程序,课上会抽同学起来讲,这部分的给分比较慷慨,只要认真完成了应该都能拿到满分
+ - 期末考试(60%)
+ - 期末考试的难度不会很大,如果平时跟上的话复习的东西也没有很多,如毛哥所说,“历年卷是没有用的”,因此主要参考的就是小测和作业的题目
## 参考资料
-- TonyCrane 的课程笔记:
-- HobbitQia 的课程笔记:
-- [ZhouTimeMachine 的笔记](https://zhoutimemachine.github.io/note/courses/toc/)(20 级的 jxg 版本)
+前人们的笔记:
+
+- (23 级)srk505 的笔记,写的有点近似讲义了:
+- (21 级)TonyCrane 的课程笔记:
+- (21 级)HobbitQia 的课程笔记:
+- (20 级)[ZhouTimeMachine 的笔记](https://zhoutimemachine.github.io/note/courses/toc/)
+
+和“计算理论”重合的部分,也可在 CC98 等地方搜索计算理论的相关资料参考。
+
+## 回忆卷
+
+- [25-26 学年秋冬学期期末回忆卷](./TCS25fa.pdf)
## 学习建议
-计院很少有毛哥这种能把理论课讲得非常流畅的老师,需要好好珍惜,课上跟住老师这门课可以说完全不成问题。而且毛哥给分也可以说非常慷慨,和之前的金小刚完全形成了鲜明对比(x)。同时考试也没有套路题,不需要靠历年卷,只要弄懂课上内容加上看一看作业和小测题就足够了。有任何问题也都可以在课后去找毛哥问,每次都会非常清晰地给出解答。
+在换新教材后,课程内容的难点更加偏向复杂度理论,然而这部分内容并没有在 23 级考试中占据特别大的比重。图灵机之前的内容相对容易理解一些,需要对每个概念都掌握扎实(例如 22 级期末考了一道用双栈 PDA 模拟图灵机,23 级考了一道同时跑 PDA 和 DFA 的题目,这都要求你对这些基本概念有清晰的理解),要掌握正则/非正则的判断和证明(怎么画/构造 FA),CFL 的判断和证明(怎么构造 CFG/PDA,虽然很多情况下写 CFG 会更方便,但是有些时候很难想,需要用 PDA)。在图灵机及之后的内容逐渐抽象,理解难度也会增加,重点是对(多项式时间)归约的掌握,要熟练掌握用莱斯定理和归约来证明不可计算性的问题(至少车轱辘话要会写 [ac01])。
+
+每次作业批改结束/小测结束后助教都会发布答案,一定要对着看看懂。平时作业和小测的题目是复习考试的最好资料,考试题目风格也和这些题目比较接近,但是第一眼看到容易使人发懵,弄懂课上内容加上看一看作业和小测题会有很大的帮助。有任何问题也都可以在课后去找毛哥问,每次都会非常清晰地给出解答。