<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>http://junhoahn.kr/noriwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pinkgo</id>
	<title>noriwiki - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="http://junhoahn.kr/noriwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pinkgo"/>
	<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Pinkgo"/>
	<updated>2026-04-14T22:25:59Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6287</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6287"/>
		<updated>2025-12-04T02:40:22Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Encoding Turing Machine Using PCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines#Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], [\frac{t_2}{b_2}], \cdots, [\frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다. &lt;br /&gt;
&lt;br /&gt;
==Encoding Turing Machine Using PCP==&lt;br /&gt;
PCP 도미노로 [[Turing Machines|튜링머신]] 계산을 인코딩하기 위해서 top을 항상 bottom보다 뒤처지게(lag) 만든다. 이는 튜링머신의 계산이 (tape의 내용, 상태)를 바탕으로 결과를 만들기 때문이다. 즉, Bottom은 “튜링머신이 실제로 생성해야 하는 올바른 다음 configuration(계산 기록)”을 의미하고, Top은 “그 bottom이 정말 올바른 계산을 통해 만들어졌는지 검증하기 위해 따라오는 줄”을 의미한다. 따라서 bottom이 먼저 확장되고, top이 그 확장을 ‘따라잡는’ 것이다. 예를 들어, 아래와 같은 PCP 도미노 나열은 튜링머신 계산 인코딩의 예를 보여준다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{\#}{\#q_00100\#}]\,\,[\frac{q_0}{2q_7}]\,\,[\frac{1}{1}]\,\,[\frac{0}{0}]\,\,[\frac{0}{0}]\,\,[\frac{\#}{\#}]&amp;lt;/math&amp;gt;&lt;br /&gt;
위 예시에서 문자열들은 튜링머신의 계산 내용(현재 테이프, 상태 등)을 의미한다. 또한 위 예시는 매치를 이루기 위해서 추가적인 도미노를 요구한다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6286</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6286"/>
		<updated>2025-12-04T00:34:15Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Encoding Turing Machine Using PCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines#Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], [\frac{t_2}{b_2}], \cdots, [\frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다. &lt;br /&gt;
&lt;br /&gt;
==Encoding Turing Machine Using PCP==&lt;br /&gt;
PCP 도미노로 [[Turing Machines|튜링머신]] 계산을 인코딩하기 위해서 top을 항상 bottom보다 뒤처지게(lag) 만든다. 이는 튜링머신의 계산이 (tape의 내용, 상태)를 바탕으로 결과를 만들기 때문이다. 즉, Bottom은 “튜링머신이 실제로 생성해야 하는 올바른 다음 configuration(계산 기록)”을 의미하고, Top은 “그 bottom이 정말 올바른 계산을 통해 만들어졌는지 검증하기 위해 따라오는 줄”을 의미한다. 따라서 bottom이 먼저 확장되고, top이 그 확장을 ‘따라잡는’ 것이다. 예를 들어, 아래와 같은 PCP 도미노 나열은 튜링머신 계산 인코딩의 예를 보여준다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{\#}{\#q_00100\#}]\,\,[\frac{q_0}{2q_7}]\,\,[\frac{1}{1}]\,\,[\frac{0}{0}]\,\,[\frac{0}{0}]\,\,[\frac{\#}{\#}]&amp;lt;/math&amp;gt;&lt;br /&gt;
위 예시에서 문자열들은 튜링머신의 계산 내용(현재 테이프, 상태 등)을 의미한다. 또한 위 예시는 매치를 이루기 위해서 추가적인 도미노를 요구한다. 이때 bottom이 accept 상태에 도달하여 &amp;quot;완성된 전체 계산 기록&amp;quot;을 포함한다면, top은 bottom을 마저 따라잡기 위해서 finalization 도미노를 사용한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6285</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6285"/>
		<updated>2025-12-04T00:28:12Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines#Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], [\frac{t_2}{b_2}], \cdots, [\frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다. &lt;br /&gt;
&lt;br /&gt;
==Encoding Turing Machine Using PCP==&lt;br /&gt;
PCP 도미노로 [[Turing Machines|튜링머신]] 계산을 인코딩하기 위해서 top을 항상 bottom보다 뒤처지게(lag) 만든다. 이는 튜링머신의 계산이 (tape의 내용, 상태)를 바탕으로 결과를 만들기 때문이다. 즉, Bottom은 “튜링머신이 실제로 생성해야 하는 올바른 다음 configuration(계산 기록)”을 의미하고, Top은 “그 bottom이 정말 올바른 계산을 통해 만들어졌는지 검증하기 위해 따라오는 줄”을 의미한다. 따라서 bottom이 먼저 확장되고, top이 그 확장을 ‘따라잡는’ 것이다. 예를 들어, 아래와 같은 PCP 도미노 나열은 튜링머신 계산 인코딩의 예를 보여준다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{\#}{\#q_00100\#}]\,\,[\frac{q_0}{2q_7}]\,\,[\frac{1}{1}]\,\,[\frac{0}{0}]\,\,[\frac{0}{0}]\,\,[\frac{\#}{\#}]&amp;lt;/math&amp;gt;&lt;br /&gt;
위 예시에서 문자열들은 튜링머신의 계산 내용(현재 테이프, 상태 등)을 의미한다. 또한 위 예시는 매치를 이루기 위해서 추가적인 도미노를 요구한다. &lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6284</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6284"/>
		<updated>2025-12-04T00:27:58Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* PCP Formulation as a Language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines/Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], [\frac{t_2}{b_2}], \cdots, [\frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다. &lt;br /&gt;
&lt;br /&gt;
==Encoding Turing Machine Using PCP==&lt;br /&gt;
PCP 도미노로 [[Turing Machines|튜링머신]] 계산을 인코딩하기 위해서 top을 항상 bottom보다 뒤처지게(lag) 만든다. 이는 튜링머신의 계산이 (tape의 내용, 상태)를 바탕으로 결과를 만들기 때문이다. 즉, Bottom은 “튜링머신이 실제로 생성해야 하는 올바른 다음 configuration(계산 기록)”을 의미하고, Top은 “그 bottom이 정말 올바른 계산을 통해 만들어졌는지 검증하기 위해 따라오는 줄”을 의미한다. 따라서 bottom이 먼저 확장되고, top이 그 확장을 ‘따라잡는’ 것이다. 예를 들어, 아래와 같은 PCP 도미노 나열은 튜링머신 계산 인코딩의 예를 보여준다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{\#}{\#q_00100\#}]\,\,[\frac{q_0}{2q_7}]\,\,[\frac{1}{1}]\,\,[\frac{0}{0}]\,\,[\frac{0}{0}]\,\,[\frac{\#}{\#}]&amp;lt;/math&amp;gt;&lt;br /&gt;
위 예시에서 문자열들은 튜링머신의 계산 내용(현재 테이프, 상태 등)을 의미한다. 또한 위 예시는 매치를 이루기 위해서 추가적인 도미노를 요구한다. &lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6283</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6283"/>
		<updated>2025-12-04T00:10:44Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* PCP Formulation as a Language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines/Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], [\frac{t_2}{b_2}], \cdots, [\frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다.&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6282</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6282"/>
		<updated>2025-12-04T00:08:43Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Definition of PCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines/Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지(매치되는지) 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;매치(match)가 존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], \frac{t_2}{b_2}], \cdots, \frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다.&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6281</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6281"/>
		<updated>2025-12-04T00:08:08Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* PCP Formulation as a Language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines/Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
PCP의 [[NP-Completeness#Problems|인스턴스]]는 도미노들의 리스트이며, 아래와 같이 나타내어 진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;P=\{[\frac{t_1}{b_1}], \frac{t_2}{b_2}], \cdots, \frac{t_n}{b_n}]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위와 같은 인스턴스를 문자열로 [[Turing Machines#Encoding Objects as Strings|인코딩]]한 것은 &amp;lt;math&amp;gt;\langle P \rangle&amp;lt;/math&amp;gt;과 같이 나타내어진다. 이러한 정의를 통해 PCP를 언어로 정의하면 아래와 같다:&lt;br /&gt;
 PCP &amp;lt;math&amp;gt;= \{\langle P \rangle|P&amp;lt;/math&amp;gt;는 매치가 존재하는 PCP 인스턴스이다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이때, 위 튜링머신은 undecidable하다.&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6280</id>
		<title>Post Correspondence Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Post_Correspondence_Problem&amp;diff=6280"/>
		<updated>2025-12-04T00:02:17Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:계산 이론 개론 분류:컴퓨터 공학 상위 문서: Turing Machines  ==개요== 해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.  ==Definition of PCP== PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:  &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Turing Machines/Post Correspondence Problem|Turing Machines]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 Post Correspondence Problem(PCP)에 대해서 설명한다.&lt;br /&gt;
&lt;br /&gt;
==Definition of PCP==&lt;br /&gt;
PCP는 도미노 개념에 기반하여 조직된 문제이다. 도미노란 아래와 같은 “위 문자열(top string)”과 “아래 문자열(bottom string)” 쌍을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{b}{ca}]&amp;lt;/math&amp;gt;: 위 문자열은  &amp;quot;b&amp;quot;, 아래 문자열은 &amp;quot;ca&amp;quot;&lt;br /&gt;
PCP는 도미노를 원하는 순서로 반복을 허용하여 나열했을 때, 위 문자열 전체가 아래 문자열 전체와 같은지 확인하는 문제이다. 예를 들어:&lt;br /&gt;
 &amp;lt;math&amp;gt;[\frac{a}{ab}], [\frac{b}{ca}], [\frac{ca}{a}], [\frac{a}{ab}], [\frac{abc}{c}]&amp;lt;/math&amp;gt;&lt;br /&gt;
와 같은 도미노의 나열은 위, 아래 문자열이 &amp;quot;abcaaabc&amp;quot;로 같기 때문에 &amp;quot;존재한다&amp;quot;가 문제의 답이다.&lt;br /&gt;
&lt;br /&gt;
===PCP Formulation as a Language===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6173</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6173"/>
		<updated>2025-12-03T23:51:47Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Theorems about Undecidablity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal 튜링 머신이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 universal 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다. 따라서 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 실제로 존재할 수 없으며, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다.&lt;br /&gt;
&lt;br /&gt;
이때 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;가 decidable하기 위해서는 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;와 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;의 여집합이 모두 recognizable해야 한다. 이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 recognizable하므로, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;의 여집합은 unrecognizable하다.&lt;br /&gt;
&lt;br /&gt;
===Theorems about Undecidablity===&lt;br /&gt;
먼저, Halting 튜링 머신은 아래와 같은 튜링 머신을 의미한다.&lt;br /&gt;
 &amp;lt;math&amp;gt;HALT_{TM}=\{\langle M,m\rangle|M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에서 정지하는 모든 쌍&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 입력에 대해 튜링머신이 정지하는지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
다음으로 Emptiness 튜링 머신은 아래와 같은 튜링 머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;E_{TM}=\{\langle M\rangle|M&amp;lt;/math&amp;gt;의 언어 &amp;lt;math&amp;gt;L(M)=\empty\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 M이 만드는 언어가 공집합인지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
또한 ALL_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;ALL_{CFG}=\{\langle G\rangle|&amp;lt;/math&amp;gt;CFG &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt; 전체를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 문법이 가능한 모든 문자열을 모두 만드는지를 판단하는 튜링머신이며, undecidable하다.&lt;br /&gt;
&lt;br /&gt;
마지막으로, EQ_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;EQ_{CFG}=\{\langle G, H\rangle|&amp;lt;/math&amp;gt; 두 CFG &amp;lt;math&amp;gt;G, H&amp;lt;/math&amp;gt;가 같은 언어를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 문법 G, H가 완전히 같은 언어를 만드는지 판별하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
==[[Post Correspondence Problem]]==&lt;br /&gt;
[[Post Correspondence Problem|Post Correspondence Problem(PCP)]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6258</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6258"/>
		<updated>2025-12-03T21:14:36Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 마오쩌둥의 죽음 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
[[파일:Figure 1. 마오쩌둥.png|섬네일|208x208픽셀|Figure 1. 마오쩌둥]]&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
[[파일:Figure 2. 대장정 경로.png|섬네일|Figure 2. 대장정 경로]]&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁과 집단 농촌화===&lt;br /&gt;
[[파일:Figure 3. 자아비판.png|섬네일|200x200픽셀|Figure 3. 자아비판]]&lt;br /&gt;
1949년 건국 직후 공산당의 가장 중요한 초기 정책은 지주·부농 계급 제거였으며, 이를 위해 토지를 농민들에게 재분배하여 공산당의 농촌 지배력을 강화하는 토지개혁이 진행되었다. Figure 3는 당시 시기의 전형적인 자아비판의 모습을 보여준다. 이미지 중앙에 무릎을 꿇은 사람은 지주로, 중국공산당과 당시 농민들에게 악한 것으로 규정되었다. 이는 토지개혁이 단순한 정책 집행이 아니라 대중을 정치적으로 동원하는 혁명적 의례였다는 것을 보여준다. &lt;br /&gt;
&lt;br /&gt;
토지개혁의 결과 지주 계층이 완전히 소멸하고, 농업 정책의 방향은 대규모 집단농장의 형태로 빠르게 나아갔다. 이 과정에서 개혁의 속도를 조절하자는 의견도 있었지만, 마오쩌둥은 이를 비난하며 더 빠르고 더 급진적인 집단화를 요구하였다. 아래는 그의 주장을 담은 글이다:&lt;br /&gt;
 “새로운 사회주의 대중운동의 거대한 물결이 곧 전국 농촌 지역을 휩쓸게 될 것이다. 그러나 우리의 몇몇 동지들은 마치 전족(纏足)한 여인처럼 비틀거리며, 늘 다른 사람들에게 불평을 늘어놓는다. ‘너무 빨리 간다, 너무 빨리 간다’라고 말하면서 말이다. 그들은 사소한 흠을 트집 잡고, 근거 없는 불평을 하고, 끝없는 걱정과 수많은 금기만 만들어내며, 이런 태도가 농촌 사회주의 대중운동을 지도하는 올바른 방침이라고 여긴다. 아니다... 이것은 잘못된 방침이다.”&lt;br /&gt;
마오쩌둥은 위와 같은 말을 통해서 신중론, 점진주의는 모두 반혁명적 보수성에 해당하며, 대중은 혁명적 열망을 가지고 있으므로 지도층은 대중을 억제하는 것이 아니라 더 큰 집단화를 밀어붙여야 한다고 주장한 것이다. 이러한 논리는 대약진 운동으로도 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==반우파 운동==&lt;br /&gt;
1956년, 마오쩌둥은 지식인들의 자유발언을 허용하는 문제를 논의했고 4월 28일 정치국 확대회의에서는 &#039;백화제방(百花齊放)，백가쟁명(百家爭鳴)&#039;이라는 방침을 제시했다. 아래는 1956년 5월 26일, 중국공산당 선전부장 루딩이(陸定一)가 여러 지식인 2천여 명을 모아놓고 &#039;백화제방, 백가쟁명&#039;에 대해 강연한 내용의 일부이다:&lt;br /&gt;
 &amp;quot;독립적인 사고와 자유로운 토론이 장려되지 않는다면 학술발전은 정체될 수밖에 없다는 사실을 역사는 보여준다. 문학예술활동과 과학연구에 있어서 독립적인 사고의 자유, 논쟁의 자유, 창작과 비평의 자유, 자기의 의견을 발표, 견지, 유보할 수 있는 제유를 제창한다.&amp;quot;&lt;br /&gt;
물론 우호적 비판은 허용하되 &#039;비난&#039;은 철저히 용납하지 않겠다는 입장이었지만, 지식인들은 반신반의하면서도 한편으로는 기뻐했다. 지식인들은 그동안의 사상개조운동의 영향으로 폐쇄된 언로와 중국공산당의 독주에 불만을 품으면서도 은근히 개방을 바라고 있었기 때문이다. 그러나 마오쩌둥의 노력에도 불구하고, 그동안 공산당에게 호되게 시달려왔던 지식인들은 쉽사리 입을 열지 않았다.  하지만 중국 공산당이 마오쩌둥의 뜻에 따라 공산당 내부의 문제에 대한 정풍운동을 1957년 4월 25일부터 전개하고 모든 &#039;우호적&#039; 비판을 허용한다는 입장을 거듭 표명하면서 지식인들은 점차 용기를 얻었다. 아래는 중공중앙통일전선부가 1957년에 주최한 좌담회에서 좌담회를 주최한 리웨이한이 말한 내용이다:&lt;br /&gt;
 &amp;quot;이 회의를 소집한 목적은 여러분에게 우리가 진행하고 있는 정풍을 원조해달라는 것과 우리의 결점과 잘못을 고칠 수 있도록 도와달라는 것이다. 통일전선의 방법을 가지고 우리의 정풍을 추진하는 것은 처음 있는 일로서 여러분이 자세한 비판과 의견을 많이 제시해 줄 것을 희망한다.&amp;quot;&lt;br /&gt;
이렇듯 마오쩌둥과 공산당이 대놓고 &#039;마음껏 떠들어도 좋다&#039;. &#039;절대로 계급투쟁을 하지 않겠다.&#039;라고 부추기자, 지식인들은 마침내 가슴속에 품어왔던 불만을 쏟아내기 시작했다. 이는 공산당원의 특권인식과 공산당의 무능, 공산당의 법과 제도를 운용할 능력의 부재, 공산당의 독주 비판 등 중국 사회 전체와 지금까지 중국 공산당이 진행한 여러 전반적인 정책에 관한 것이었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥은 &#039;백화제방&#039;, &#039;백가쟁명&#039; 방침을 정하고 지식인들에게 자유롭게 발언할 기회를 제공한 후 상황이 자신이 원하는 대로 돌아가지 않는 것을 목격했다. 지식인들은 공산당이 허용할 수 없는 범위의 비판을 넘어서 공산당의 통치 전반에 걸쳐 비판 및 비난을 퍼부었고, 일부 대학생들은 더 나아가 &amp;quot;공산당을 탈퇴하고 자유시민이 되자&amp;quot;, &amp;quot;마오쩌둥은 물러가라!&amp;quot; 등의 구호를 외쳤다. 이에 마오쩌둥은 지식인들에게 철퇴를 가하기로 결심했다. 아래는 1957년 7월 1일, 인민일보에 개재된 사설의 일부이다:&lt;br /&gt;
 중국민주동맹이 백가쟁명과 정풍 과정에서 행한 역할은 매우 열악하며 그들의 조직, 계획, 강령, 노선은 모두 인민을 도외시하는 것이며, 반공반사회주의이자 반공 반민주의이다. 그리고 농공민주당도 똑같다. (중략) 중국의 하늘은 흑구름으로 뒤덮였고, 이것의 출처는 장보쥔, 뤄룽지, 장즈중 동맹이다. 그들은 죄가 있으며, &#039;말하는 사람은 무죄다&#039;라는 원칙이 그들에게는 적용되지 않는다.&lt;br /&gt;
백화제방에서 정부를 비판한 사람들은 곧 ‘우파분자(Rightists)’로 규정되어 숙청 대상이 되어 약 55만 명이 숙청, 재교육, 노동교화로 끌려갔다. 이로 인하여 교육·관료·지식인 계층이 큰 타격을 입었고, 중국에서 정치적인 비판의 공간은 완전히 붕괴되었다.&lt;br /&gt;
&lt;br /&gt;
이에 대해 학계에서는 마오가 처음부터 비판자를 드러내기 위해 유도했다는 견해와, 진심으로 비판을 허용했지만 예상보다 훨씬 많은 비판이 쏟아지자 공산당이 공포심을 느껴 탄압으로 선회했다는 두 가지의 주장이 존재한다. 하지만 공통된 결과는 정치적 자유는 짧게 열렸다가 더욱 강하게 폐쇄되었다는 것이다.&lt;br /&gt;
&lt;br /&gt;
==대약진 운동==&lt;br /&gt;
[[파일:Figure 4. 대약진 운동 선전 포스터.png|섬네일|200x200픽셀|Figure 4. 대약진 운동 선전물]]&lt;br /&gt;
대약진 운동(大跃进运动, &amp;quot;Great Leap Forward&amp;quot;)은 중국에서 중국공산당의 주도로 1958년부터 1962년경까지 실시되었던 경제, 사회 개발 운동이다. 이는 미국과의 체제 경쟁을 진행하던 소련의 노력을 보고 영감을 얻은 마오쩌둥이 영국을 따라잡을 목적으로 야심차게 준비한 경제 성장 계획이었으나, 결과적으로 중국의 성장을 수십 년 후퇴시켰던 역사적인 실책이다. 이는 농업/산업의 실제 생산 능력이 아니라 혁명적 낙관주의&amp;lt;ref&amp;gt;“혁명을 위한 의지와 열정만 있으면 자연도, 경제도, 과학도 이겨낼 수 있다”는 신념을 의미한다.&amp;lt;/ref&amp;gt;를 기반으로 하였으나, 기획 자체의 모순과 결함, 기술의 미비, 일의 순서를 무시한 강압적 추진 태도, 부정부패 등으로 처참히 실패하였다.&lt;br /&gt;
&lt;br /&gt;
===인민공사===&lt;br /&gt;
[[파일:Figure 5. 인민공사.png|섬네일|200x200픽셀|Figure 5. 인민공사]]&lt;br /&gt;
대약진 운동의 핵심 제도 중 하나는 인민공사(人民公社, Communes)였다. 이는 1958년 이후 기존의 작은 협동조합을 수천~수만 명 단위의 초대형 농업·사회 단위로 통합한 조직이었다. 하지만 이는 단순한 농업 단위가 아니라 행정 단위, 군사 단위, 생산 단위, 생활 단위로서 기능하는 하나의 작은 사회였다. 또한 해당 공동체 내에서는 모두가 함께 생활하였는데, figure는 당시 인민공사 내의 인민공사 생활이 어떻게 운영되었는지 보여준다. 사람들은 개인 요리를 하지 않고 모두 집단 식당에서 무료로 배식받았으며, 공동 생활은 사회주의적 연대와 같다고 강하게 선전되었다. &lt;br /&gt;
&lt;br /&gt;
그러나 인민공사는 많은 문제점을 낳았다. 사람들이 공동식당에 의존함에 따라 배급이 줄자 곧바로 기근이 발생하는 상황이 고착화되었다. 또한 성과에 목을 맨 관료들이 경쟁적으로 자신이 속한 인민공사의 생산량을 과장하여 보고하였고, 이에 따라 국가가 실제보다 훨씬 많은 곡물을 징발하였다. 또한 개인의 토지와 수확이 없어져 농민의 노동 동기가 하락하였다.  &lt;br /&gt;
&lt;br /&gt;
===토법고로===&lt;br /&gt;
[[파일:Figure 6. 토법고로.png|섬네일|299x299픽셀|Figure 6. 토법고로]]&lt;br /&gt;
토법고로란 대약진 운동 시기, 중국 각지에서 &#039;재래식 용광로를 이용해 강철을 대량 생산하려 했던 정책&#039; 또는 &#039;그때 쓰인 용광로&#039;를 이르는 명칭이다. 이는 마오쩌둥에 의해서 강력하게 추진되었는데, 그의 주장은 몇 년 안에 영국을 따라잡으려면 철강 생산량을 폭발적으로 늘려야 한다는 것이었다. 하지만 문제는 농촌에 산업시설이 없었기 때문에, 그는 각 마을에서 재래식 용광로를 통해서 직접 철을 만들 것을 명령했다. &lt;br /&gt;
&lt;br /&gt;
이에 따라 농민과 주민들은 조잡한 용광로를 만들고 집에서 쓰던 금속 기구(냄비, 농기구 등)를 모아 녹여 &#039;강철&#039;을 만들었다. 문제는 당시 농민들은 강철 생산 기술은커녕 열처리나 단조가 뭔지조차 몰랐다는 것이다. 전통 방식으로(토법고로를 포함하여) 강철을 만들기 위해서는 대장장이같은 야금 전문가들이 불순물을 걸러내고 석탄과 풀무를 이용해 철을 환원시킨 후 철을 두드려서 탄소를 일정량 제거하고[6] 담금질을 비롯한 열처리까지 하는 기나긴 과정을 거쳐야 한다. 하지만 평범한 농민들은 이러한 공정에 대해서 하나도 몰랐고, 억지로 고철과 철광석을 녹여내 굳힌 결과 무려 60%가 다시 재처리하지 않으면 사용 자체가 불가능한 폐품급 철로 만들어 졌다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고로가 설치되면서 윗선에서는 매달 강철 얼마씩을 만들라고 할당량을 정해줬고, 못 채운 마을은 배급 감소를 비롯한 여러 불이익이 가해졌다. 농업을 죄다 집단화하여 사식의 개념이 폐지된 대약진 운동 당시엔 절대 무시할 수 없는 불이익이었다. 또한 이러한 목표치는 전례 없는 발전이라는 명목 하에 터무니 없이 높게 잡혔다. 이 때문에 수많은 농민들이 명예는 몰라도 굶어죽기는 싫어서 눈에 띄는 금속이란 금속은 전부 토법고로에 집어넣었다. 이때 녹이는 데에 사용된 금속들은 멀쩡한 각종 농기구와 트랙터 같은 농기계들, 식기구들, 양철 지분, 철도 등이 포함되었다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고소가 전국적으로 장기적으로 운용되었으니 당연히 토법고로가 제철을 하기 위해 필요로 하는 연료의 양은 상상을 초월했다. 농민들은 토법고로를 온전히 돌리기 위해 코크스가 아니라 인근 산천의 나무란 나무들을 모두 벌목해 땔감으로 썼으며, 그래도 모자라자 과수원의 과수들까지 싸그리 벌목해 땔감으로 썼다. 이렇게 토법고로가 전국적으로 활성화되자 산림이 씨가 마르기 시작했고 이렇게 생겨난 민둥산들은 비가 오면 토사가 씻겨 나가 산사태를 일으켰다. 이 과정에서 계단식 논이 직접적으로 피해를 입었고 흘러간 토사는 저수지로 유입되어 이를 메워버리면서 농업 용수가 부족해져 결국 농업까지 초토화되기 시작했다.&lt;br /&gt;
&lt;br /&gt;
===대기근===&lt;br /&gt;
인민공사와 토법고로 같은 마오쩌둥의 대실책의 결과, 1959년에서 1961년까지 중국은 대기근이라는 대재난을 겪었다. 이는 표면적으로 자연 재해에 의한 것이었지만, 사실은 토법고로를 만들기 위해 나무를 캐서 숲을 모두 민둥산으로 만든 탓에 생태계 순환 시스템 자체가 무너진 결과였다. 결국 대약진 운동으로 인하여 발생한 여러 문제점들이 근대사 이래 역사적인 대기근을 발생시켜 무려 3천만~5천만 명이 아사하는 사태가 발생했다. 이는 아래와 같은 중국 공산당의 여러 실책이 겹친 결과물이었다:&lt;br /&gt;
# 인민공사: 생산성 붕괴&lt;br /&gt;
#* 노동 동기 상실은 농촌의 생산성을 악화시켰다.&lt;br /&gt;
#* 생산량 실제보다 과장 보고하는 악습은 국가가 곡물을 초과 징발하도록 하였다.&lt;br /&gt;
# 토법 고로: 농민·청년·여성 모두 강철 생산에 동원되어 농업 생산량이 급락하였다.&lt;br /&gt;
#* 또한 토법고로로 인해 생태계가 파괴되고, 여러 자연재해를 야기했다.&lt;br /&gt;
#* 농기계와 농기구 등이 모두 녹여지며 농업 생산성이 급락하였다.&lt;br /&gt;
# 반우파 캠페인은 잘못된 보고라도 “상부 마음에 드는 보고”만 올리게 만들었다.&lt;br /&gt;
즉, 대기근은 단순히 흉작에서 기인한 것이 아니라 허위 보고, 강제 동원, 과잉 징수, 정치적 공포, 도덕적 마비, 행정적 무능 모두가 결합된 시스템 붕괴에서 기인하였다. 특히 당시 중국공산당의 2인자였던 펑더화이는 기근 현실을 직시하고 정책의 수정을 요구하였으나, 마오에게 반역자로 몰려 제거되었다.&lt;br /&gt;
&lt;br /&gt;
==문화대혁명==&lt;br /&gt;
대약진 운동의 결과로 3천만~5천만 명에 달하는 중국 인민들이 아사하고, 경제가 나락으로 추락하는 파멸적인 결과가 초래되자 이를 강행한 마오쩌둥의 권위는 추락하였고 그는 사실상 2선으로 후퇴하면서 국정에서 배제되었다. 물론 마오쩌둥은 이 시기에도 국부로서 절대적인 카리스마를 가지고 있었고, 중국공산당 중앙군사위원회 주석으로 군통수권을 쥐고 있었으므로 그 누구도 그를 거역할 수는 없었다. 문제는 마오쩌둥 본인이 대약진 운동이라는 엄청난 대삽질을 저질렀기 때문에 다시 정치 일선에 전면으로 나설 수 있을 만한 명분이 없었던 것이다.&lt;br /&gt;
[[파일:Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理).png|가운데|섬네일|600x600픽셀|Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理)]]&lt;br /&gt;
마오쩌둥이 1선에서 물러난 동안, 류사오치가 국가주석직을 승계해서 중국공산당 총서기 덩샤오핑과 함께 실용주의 정책을 펼쳐 중국 인민들의 호평을 듣게 되자 마오쩌둥은 류사오치와 덩샤오핑의 영향력이 점점 커지면서 자신이 권력에서 완전히 밀려날까 불안해 했다. 이에 마오쩌둥은 반대세력에 대한 반격이 필요하다고 여겼다. 문화대혁명의 한 축이 되었던 홍위병에 대해 이해할 필요가 있다. 당대 중국에선 대약진 운동의 실패로 중국공산당의 문제점이 드러나던 시기였고, 마오주의의 문제점도 드러나고 있었지만, 관료제의 폐해도 드러나고 있었다. 그러자 자연스럽게, 관료가 아닌 젊은 층에서는 점점 관료제에 대한 폐해가 인식되기 시작했다. 이 때문에 중국 각지에서 공산당에 대한 비판과 탈당, 홍콩으로의 망명 행렬이 쇄도했는데 류사오치와 덩샤오핑은 이것을 체제에 대한 도전으로 간주하고 마오쩌둥이 백화제방 운동을 반우파 투쟁으로 때려잡았듯이 공권력으로 반정부적인 학생세력을 마구 때려잡았다. 훗날 홍위병이라 불리는 집단도 처음에는 이렇게 조직된 반정부조직이었다.&lt;br /&gt;
&lt;br /&gt;
이들을 자신의 편으로 만들기 위해 마오쩌둥은 &amp;quot;부르주아와 자본주의 세력들이 다시 사회로 침투하고 있는데, 이들이 발붙이지 못하게 청년들이 바로잡아야 한다.&amp;quot;라는 어조의 연설을 하였다. 그리고 그리고 이 &#039;주자파&#039; 세력들은 다름 아닌 당 내부에 있다고 하며, 류사오치와 덩샤오핑을 표적으로 삼아 이들을 공격하며 그들의 핍박을 받던 학생들을 옹호했다. 이렇게 되자 마오쩌둥의 옹호를 받고 흥분한 청년들은 중국 전토 여기저기서 젊고, 앞뒤 안 가리고, 신격화된 마오쩌둥에 대한 충성심으로 불타는 이들을 주로 모아 홍위병이란 집단이 되었다.&lt;br /&gt;
&lt;br /&gt;
1966년 8월, 중국공산당 중앙위원회는 마오쩌둥의 논평에 맞춰 中国共产党中央委员会关于无产阶级文化大革命的决定(중국공산당 중앙위원회의 프롤레타리아 문화대혁명에 관한 결정)을 발표하는데, 내용을 요약하면 마오쩌둥이 하라는 대로 하는 게 진리라는 것이었다. 또한 마오쩌둥은 홍위병이 자유롭게 기존의 낡은 것들을 비판하고 타도할 수 있도록 허용하였다. 홍위병들의 활동에 사실상 한없는 자유를 부여하자, 각지에서 소위 낡은 것들을 모조리 파괴하고 다니기 시작했다. 절, 사당, 성당은 문을 닫거나 약탈되었으며, 베이징과 상하이에선 교사와 지식인 들이 낡은 사상의 소유자들이라는 이유로 홍위병들에게 붙들려 구타당했고 심지어 살해당하기까지 했다. &lt;br /&gt;
[[파일:Figure 8. 투쟁대회.png|섬네일|280x280픽셀|Figure 8. 투쟁대회]]&lt;br /&gt;
Figure 8은 투쟁대회(斗争会)의 한 장면을 보여준다. 투쟁대회에서는 지식인, 교사, 간부, 전문가들이 군중 앞에서 굴욕과 폭행을 당하였다. 큰 글씨로 “반당분자”, “자본주의 길을 걷는 자” 같은 문구를 적은 모자나 팻말을 쓰고 자아비판을 해야 했으며, 가족과 친구들까지 연루되기도 하였다. 이는 계급투쟁을 사회 전반에 퍼뜨리기 위한 정치적 폭력의 한 형태였다. &lt;br /&gt;
&lt;br /&gt;
류사오치는 결국 국가주석직에서 물러나고 가택연금 상태가 되었다. 그리고 덩샤오핑은 당직에서 쫓겨났고, 이른바 재교육을 세 번이나 받고 난 뒤 지방의 트랙터 엔진 공장에서 일하게 되었다. 이후 그는 1973년 저우언라이가 복귀시켜줄 때까지 꼼짝없이 그곳에 있어야만 했다. &lt;br /&gt;
&lt;br /&gt;
===상산하향 운동===&lt;br /&gt;
[[파일:Figure 9. 상산 하향 운동.png|가운데|섬네일|500x500픽셀|Figure 9. 상산 하향 운동]]&lt;br /&gt;
하지만 문화대혁명의 열기가 격력해짐에 따라 마오쩌둥조차도 홍위병을 완전히 통제할 수는 없었다. 마오쩌둥의 아버지를 부농이라며 비난하는 대자보가 붙을 정도였다. 결국 마오쩌둥은 1968년 7월 28일 공산당 지도부로 홍위병 운동의 지도자들을 불러 운동의 정지를 명했고, 1968년에서 1969년에 걸쳐서 상산하향 운동이 진행되었다. 이 운동은 마오쩌둥의 지시에 따라 &#039;젊은 학생들은 농민에게 배워야 한다&#039;라는 명분으로 학생들을 농촌으로 추방해 버린 것이다. 이때 중국에서는 시골로 한번 가면 도시 거주권을 박탈당해서 죽을 때까지 거기 살아야 되므로 홍위병에 대한 사실상의 토사구팽이었다. &lt;br /&gt;
&lt;br /&gt;
이 조치는 홍위병의 확산을 막기 위한 것이었지만, 이 역시 너무 지나치게 한 나머지 젊은 인재들이 모두 도시에서 빠져나가고 &#039;학력붕괴&#039;가 일어나서 무학 세대가 생겨났다고 할 정도로 중국에 엄청난 타격을 입혔다. 또한 시골로 간 홍위병들 또한 무사하진 못했는데, 그들이 간 시골에는 집도 없고, 밥도 없고, 질병과 해충과 폭력만 난무했고, 강제노동에 항의하다가 농촌 지역의 군인들한테 부르주아랍시고 맞아죽는 경우가 빈번했기 때문이다. 그리고, 동시에 중국 인민해방군과 중국 공안은 홍위병을 무력으로 진압하기 시작했고 이들을 대량으로 처형했다. &lt;br /&gt;
&lt;br /&gt;
===악영향===&lt;br /&gt;
문화대혁명은 중국의 광범위한 분야에 돌이킬 수 없는 악영향을 남겼다. 사회적으로는 홍위병과 각종 대중조직이 폭력을 일상화하며 교사·지식인·전문가 등을 잔혹하게 비판·고문하는 일이 전국적으로 벌어졌다. ‘사구(四舊)’ 철폐 운동의 이름으로 전통 문화유산·종교 시설·사적 문헌들이 파괴되었고, 중국 사회의 문화적 연속성은 깊은 상처를 입었다. 특히 교육 분야의 피해는 막대하여, 학교와 대학이 장기간 폐쇄되거나 학업이 중단되었으며, 수백만 명의 청년이 ‘상산하향(上山下鄕)’ 정책에 따라 강제로 농촌 지역에 내려가 노동에 종사해야 했다. 이로 인해 한 세대 전체가 정상적인 교육 기회를 잃어버리는 ‘잃어버린 세대’가 발생하였다.&lt;br /&gt;
&lt;br /&gt;
경제적으로도 문화대혁명은 심각한 타격을 남겼다. 전문가와 기술자가 ‘권위주의’ 또는 ‘전문가주의’로 비판받아 현장에서 배제되었고, 모든 생산 부문에서 노동자들이 정치 집회와 투쟁에 동원되면서 산업과 농업 생산이 크게 저하되었다. 이미 대약진운동과 대기근으로 약화된 경제 기반은 더욱 타격을 받아 정상적인 경제 운영이 불가능한 상황에 놓였고, 과학·기술·의학 등 주요 분야의 발전도 10년 이상 정체되었다.&lt;br /&gt;
&lt;br /&gt;
인권 측면에서는 대규모 폭행, 고문, 투쟁대회, 강제 고발이 일상적으로 벌어지면서 수많은 사람들이 사망하거나 부상을 입었고, 사회 전체가 공포와 불신의 분위기에 휩싸였다. 가족과 이웃 간의 신뢰도 붕괴되었으며, 공동체는 심각한 분열을 겪었다. 사상적으로는 마오 개인숭배가 절정에 달해, 비판적 사고와 학문적 자유가 억압되고 정치적 충성이 절대적 가치로 강요되었다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥의 죽음==&lt;br /&gt;
1976년 9월 9일, 중화인민공화국의 최고 지도자이자 중국 공산당의 핵심 인물이었던 마오쩌둥이 베이징에서 사망하였다. 그의 죽음은 1949년 건국 이후 27년간 유지되었던 마오 시대의 종식을 의미했으며, 오랜 기간 지속된 급진적 혁명 노선—특히 대약진운동과 문화대혁명—의 종결을 가능하게 하는 정치적 전환점이 되었다. 마오의 유해는 장례 기간 동안 공개적으로 안치되어 중국 지도부와 대중이 조문할 수 있도록 전시되었다.&lt;br /&gt;
&lt;br /&gt;
마오의 사망 직후 중국 공산당 내부에서는 권력 재편이 급속도로 진행되었다. 화궈펑이 공식적인 후계자로 지명되었고, 동시에 ‘4인방’이 체포되면서 문화대혁명 기간 동안 지속되었던 급진파의 영향력이 사실상 소멸하였다. 마오의 죽음은 이후 중국이 개혁·개방 노선으로 전환하는 역사적 출발점으로 평가된다. 덩샤오핑은 정치적으로 복권된 뒤 점차 실권을 장악하며 중국 경제·사회 구조의 대대적인 개혁을 주도하게 되었고, 이는 현대 중국의 국가 체제 변화로 이어졌다.&lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 사망은 단순한 지도자의 교체가 아니라, 중국 현대사에서 정치적 노선과 사회적 방향성을 근본적으로 바꾸어 놓은 결정적 사건으로 평가된다.&lt;br /&gt;
&lt;br /&gt;
==화궈펑 시대(1976~1978)==&lt;br /&gt;
화궈펑은 마오의 후계자로 추대되었지만, 그가 내세운 “마오의 결정은 모두 옳고, 마오의 지시는 모두 따른다(两个凡是)”라는 노선은 시대 변화에 적합하지 못했다. 이는 마오의 권위를 절대화함으로써 문화대혁명의 오류를 인정하지 않는 태도였고, 실용주의를 요구하던 당내 흐름과 충돌하였다.&lt;br /&gt;
&lt;br /&gt;
비록 화궈펑은 정치적 안정에 기여했지만, 대규모 산업 프로젝트 추진 등에서 마오 시대의 계획경제 방식에 여전히 머물러 있어 경제 활력 회복에는 실패했다. 이로 인해 덩샤오핑의 실용주의 노선이 점차 우위를 점하게 된다.&lt;br /&gt;
&lt;br /&gt;
==덩샤오핑의 집권==&lt;br /&gt;
덩샤오핑은 문화대혁명 당시 투옥·실각을 겪었으나, 1977년 복권되어 당과 국가의 핵심 정책 결정자로 복귀하였다. 그는 “실사구시(實事求是, 사실에 기반하여 진실을 추구한다)”라는 원칙을 통해 기존 이념 중심 정책을 비판하고, 실용주의적 접근을 대안으로 제시하였다. &lt;br /&gt;
&lt;br /&gt;
===역사 결의===&lt;br /&gt;
문화대혁명의 혼란, 마오 사후의 권력 공백, 경제 침체 등 누적된 문제를 해결하기 위해 중국 공산당은 마오 시대에 대한 공식 평가가 필요했다. 그 결과 1981년 「건국 이래 당의 역사적 문제에 관한 결의」(历史决议)가 채택되었다. 역사 결의는 아래와 같은 입장을 공식화하였다:&lt;br /&gt;
# 마오의 공적은 크나, 말기에는 중대한 오류를 범했다&lt;br /&gt;
# 문화대혁명은 “좌경적 오류”이며 “10년의 내란”으로 규정&lt;br /&gt;
# 덩샤오핑 노선이 향후 국가 발전의 정통성을 갖는다&lt;br /&gt;
이 문서를 통해 중국 공산당은 마오를 완전히 부정하지 않으면서도 새로운 경제 발전 노선을 정당화할 수 있게 되었고, 개혁개방은 이데올로기적 장애물을 제거한 상태에서 본격 추진될 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===4대 현대화의 제시===&lt;br /&gt;
덩샤오핑은 중국의 발전 목표를 농업·공업·국방·과학기술의 ‘4대 현대화’(四个现代化) 로 제시했다. 4대 현대화는 마오 시대의 혁명 중심 사고가 종식되고, 기술·교육·전문성 중심의 현실적 발전 국가로 전환되었음을 명확하게 보여준다. 이는 공산당을 혁명 정당에서 테크노크라트 정당으로 변화시키는 전환점이었다.&lt;br /&gt;
&lt;br /&gt;
===농촌 개혁===&lt;br /&gt;
1978년 안후이성 봉양현(凤阳) 샤오강촌의 농민 18가구는 국가의 집단농업 체계가 비효율적임을 절감하고 비밀리에 “가구별 책임 계약”을 체결하였다. 이들은 수확량 중 국가 납부분을 제외한 나머지를 가구가 보유하는 방식을 택했다. 샤오강촌의 생산량이 급증하자 이 방식은 농촌 전역으로 확산되었고, 덩샤오핑은 이를 공식적으로 승인해 전국적 제도로 확대하였다. 이렇게 탄생한 ‘가구 책임제(家庭联产承包责任制)’는 농업 생산성을 획기적으로 향상시켰다. 이에 따라 1958년 대약진운동 시기에 형성된 인민공사는 1983년 완전히 해체되었고, 농업 부문에서는 부분적 시장경제가 도입되었다. 이는 중국이 사실상 사회주의 계획농업을 탈피한 역사적 사건이다.&lt;br /&gt;
&lt;br /&gt;
===경제특구(SEZ)의 등장===&lt;br /&gt;
1980년 중국은 선전, 주하이, 샤먼, 산터우 등을 첫 경제특구로 지정하여 외자 유치·수출 지향 산업·시장경제 실험을 허용하였다. 1970년대만 해도 어촌에 불과했던 선전은 개혁개방 이후 세계적 제조·기술 중심지로 변모하였다. 화웨이, 텐센트, DJI 등 세계적 기업의 본거지가 되었으며, 이는 중국 자본주의 실험의 성공을 상징한다. 경제특구는 중국이 사회주의 체제를 유지하면서도 부분적·통제된 형태의 자본주의 시장을 실험한 사례로, 중국식 사회주의의 경제적 특징을 형성했다.&lt;br /&gt;
&lt;br /&gt;
===한 자녀 정책===&lt;br /&gt;
중국은 1970년대 말 인구 증가가 경제 발전의 최대 장애물이 될 것이라고 판단하였다. 그리하여 1980년 한 자녀 정책(One Child Policy) 이 도입되었다. 해당 정책은 도시 가구의 자녀 수를 한 명으로 제한하며, 농촌 또한 특정 조건을 만족해야 2명의 아이를 가질 수 있도록 제한하였다. 이는 구 증가 억제에 성공했으나, 고령화 가속, 성비 불균형, 노동력 감소, 4-2-1 가족 구조(한 자녀가 부모·조부모 6인 부양) 등과 같은 문제를 촉발하였다.&lt;br /&gt;
&lt;br /&gt;
==천안문 사태==&lt;br /&gt;
1989년 봄 베이징 대학생과 지식인들은 천안문광장에서 민주화와 정치 개혁을 요구하는 대규모 시위를 벌였다. 시위는 전국으로 확산되었고, 개혁의 방향을 둘러싼 사회적 긴장은 극에 달했다. 동시에 헝가리·폴란드·동독 등 동유럽 공산권에서 민주화 시위가 확산되며 공산당 정권이 붕괴되는 현상이 발생했다. 이를 지켜보던 중국 지도부는 정권 안정에 대한 위기감을 심각하게 느꼈다. 이에 따라 1989년 6월 4일 새벽, 중국군이 베이징 시내로 진입해 시위를 무력으로 진압하였다. 이 사건은 중국 현대사에서 가장 큰 정치적 분기점 중 하나로 평가된다. 이에 따라 정치 개혁은 완전히 중당되었으며, 당의 철권 통치가 강화되었다.&lt;br /&gt;
&lt;br /&gt;
==현대 중국의 형성==&lt;br /&gt;
덩샤오핑은 1992년 남방 시찰(남순강화)을 통해 개혁개방 노선이 되돌릴 수 없는 국가 정책임을 천명했다. 이는 경제 성장 가속화의 결정적 계기가 되었다. 이후 중국은 2001년 WTO에 가입하며 세계 경제 체제에 본격 편입했다. 이 시기 중국은 ‘세계의 공장’으로 자리매김하였으며, 2000년대 이후 중국은 반도체·통신·AI 등 첨단기술 분야에 국가 주도로 막대한 투자를 시작했다. 그 결과 화웨이·알리바바·텐센트 같은 글로벌 빅테크 기업들이 등장했다.&lt;br /&gt;
&lt;br /&gt;
===통제 강화와 신장 문제===&lt;br /&gt;
시진핑 정부는 경제 성장과 함께 강한 국가·강한 당·사회 안정·사상 통일을 강조하며 통치 체제를 강화하였다. 2017년 이후 신장 위구르 지역에서는 ‘극단주의 세력 척결’을 명분으로 대규모 재교육 시설이 건설되었다. 신장 지역에 들어선 대규모 감금 시설로 변한 장면은 현대 중국의 억압적인 통치 방식을 상징한다. 또한 21세기 중국 통치는 경제 개혁과 권위주의 통제가 결합된 독특한 모델로 발전하였다. 첨단 기술은 경제 성장뿐 아니라 사회 통제 강화에도 활용되고 있다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6172</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6172"/>
		<updated>2025-12-01T19:04:44Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Theorems about Undecidablity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal 튜링 머신이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 universal 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다. 따라서 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 실제로 존재할 수 없으며, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다.&lt;br /&gt;
&lt;br /&gt;
이때 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;가 decidable하기 위해서는 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;와 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;의 여집합이 모두 recognizable해야 한다. 이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 recognizable하므로, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;의 여집합은 unrecognizable하다.&lt;br /&gt;
&lt;br /&gt;
===Theorems about Undecidablity===&lt;br /&gt;
먼저, Halting 튜링 머신은 아래와 같은 튜링 머신을 의미한다.&lt;br /&gt;
 &amp;lt;math&amp;gt;HALT_{TM}=\{\langle M,m\rangle|M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에서 정지하는 모든 쌍&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 입력에 대해 튜링머신이 정지하는지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
다음으로 Emptiness 튜링 머신은 아래와 같은 튜링 머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;E_{TM}=\{\langle M\rangle|M&amp;lt;/math&amp;gt;의 언어 &amp;lt;math&amp;gt;L(M)=\empty\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 M이 만드는 언어가 공집합인지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
또한 ALL_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;ALL_{CFG}=\{\langle G\rangle|&amp;lt;/math&amp;gt;CFG &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt; 전체를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 문법이 가능한 모든 문자열을 모두 만드는지를 판단하는 튜링머신이며, undecidable하다.&lt;br /&gt;
&lt;br /&gt;
마지막으로, EQ_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;EQ_{CFG}=\{\langle G, H\rangle|&amp;lt;/math&amp;gt; 두 CFG &amp;lt;math&amp;gt;G, H&amp;lt;/math&amp;gt;가 같은 언어를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 문법 G, H가 완전히 같은 언어를 만드는지 판별하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6171</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6171"/>
		<updated>2025-12-01T19:04:28Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Undecidablity of Universal TM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal 튜링 머신이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 universal 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다. 따라서 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 실제로 존재할 수 없으며, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다.&lt;br /&gt;
&lt;br /&gt;
이때 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;가 decidable하기 위해서는 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;와 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;의 여집합이 모두 recognizable해야 한다. 이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 recognizable하므로, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;의 여집합은 unrecognizable하다.&lt;br /&gt;
&lt;br /&gt;
===Theorems about Undecidablity===&lt;br /&gt;
먼저, Halting 튜링 머신은 아래와 같은 튜링 머신을 의미한다.&lt;br /&gt;
 &amp;lt;math&amp;gt;HALT_{TM}=\{\langle M,m\rangle|M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에서 정지하는 모든 쌍&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 입력에 대해 튜링머신이 정지하는지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
다음으로 Emptiness 튜링 머신은 아래와 같은 튜링 머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;E_{TM}=\{\langle M\rangle|M&amp;lt;/math&amp;gt;의 언어 &amp;lt;math&amp;gt;L(M)=\empty\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 M이 만드는 언어가 공집합인지를 판단하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
또한 ALL_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;ALL_{CFG}=\{\langle G\rangle|&amp;lt;/math&amp;gt;CFG &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;\Sigma&amp;amp;&amp;lt;/math&amp;gt; 전체를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 입력으로 주어진 문법이 가능한 모든 문자열을 모두 만드는지를 판단하는 튜링머신이며, undecidable하다.&lt;br /&gt;
&lt;br /&gt;
마지막으로, EQ_CFG 튜링 머신은 아래와 같은 튜링머신을 의미한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;EQ_{CFG}=\{\langle G, H\rangle|&amp;lt;/math&amp;gt; 두 CFG &amp;lt;math&amp;gt;G, H&amp;lt;/math&amp;gt;가 같은 언어를 생성한다.&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 튜링머신은 주어진 문법 G, H가 완전히 같은 언어를 만드는지 판별하는 튜링머신이며, undecidable하다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6277</id>
		<title>Vertex Cover</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6277"/>
		<updated>2025-12-01T16:46:33Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제/알고리즘|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
Vertex Cover 문제는 아래와 같은 정의를 가진다. &lt;br /&gt;
 입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 최대 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;개의 정점만 선택해서 모든 간선이 적어도 하나의 선택된 정점에 닿도록 만들 수 있는가?&lt;br /&gt;
해당 문제는 3-SAT &amp;lt;math&amp;gt; \rightarrow&amp;lt;/math&amp;gt; Vertex Cover reduction을 통해서 Vertex Cover가 NP-Complete임을 보일 수 있다.&lt;br /&gt;
이때 Vertex Cover의 complement는 [[Independent Set]]이다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Independent_Set&amp;diff=6279</id>
		<title>Independent Set</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Independent_Set&amp;diff=6279"/>
		<updated>2025-12-01T16:46:23Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제/알고리즘|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
Independent Set 문제는 아래와 같은 정의를 가진다.&lt;br /&gt;
 입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 서로 연결되지 않은 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;개의 정점을 포함하는 집합이 존재하는가?&lt;br /&gt;
해당 문제는 Independent Set의 complement(여집합)가 [[Vertex Cover]]라는 사실을 이용하여 NP-Complete임을 증명할 수 있다. &lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Independent_Set&amp;diff=6278</id>
		<title>Independent Set</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Independent_Set&amp;diff=6278"/>
		<updated>2025-12-01T16:45:51Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:알고리즘 설계와 분석 분류:컴퓨터 공학 상위 문서: 알고리즘 설계와 분석   ==개요== Independent Set 문제는 아래와 같은 정의를 가진다.  입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;  질문: 서로 연결되지 않은 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;개의 정점을 포함하는 집합이 존재하는가? 해당 문제는 Independent Set의 complement(여집합)가 Vertex Cover라...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
Independent Set 문제는 아래와 같은 정의를 가진다.&lt;br /&gt;
 입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 서로 연결되지 않은 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;개의 정점을 포함하는 집합이 존재하는가?&lt;br /&gt;
해당 문제는 Independent Set의 complement(여집합)가 [[Vertex Cover]]라는 사실을 이용하여 NP-Complete임을 증명할 수 있다. &lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6276</id>
		<title>Vertex Cover</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6276"/>
		<updated>2025-12-01T16:45:23Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Vertex Cover */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
Vertex Cover 문제는 아래와 같은 정의를 가진다. &lt;br /&gt;
 입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 최대 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;개의 정점만 선택해서 모든 간선이 적어도 하나의 선택된 정점에 닿도록 만들 수 있는가?&lt;br /&gt;
해당 문제는 3-SAT &amp;lt;math&amp;gt; \rightarrow&amp;lt;/math&amp;gt; Vertex Cover reduction을 통해서 Vertex Cover가 NP-Complete임을 보일 수 있다.&lt;br /&gt;
이때 Vertex Cover의 complement는 [[Independent Set]]이다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6275</id>
		<title>Vertex Cover</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Vertex_Cover&amp;diff=6275"/>
		<updated>2025-12-01T16:45:15Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:알고리즘 설계와 분석 분류:컴퓨터 공학 상위 문서: 알고리즘 설계와 분석   ==개요== ==Vertex Cover== Vertex Cover 문제는 아래와 같은 정의를 가진다.   입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  질문: 최대 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;개의 정점만 선택해서 모든 간선이 적어도 하나의 선택된 정점에 닿도록 만들 수 있는가? 해당 문제는 3-SAT &amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
==Vertex Cover==&lt;br /&gt;
Vertex Cover 문제는 아래와 같은 정의를 가진다. &lt;br /&gt;
 입력: 그래프 &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt;, 정수 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 최대 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;개의 정점만 선택해서 모든 간선이 적어도 하나의 선택된 정점에 닿도록 만들 수 있는가?&lt;br /&gt;
해당 문제는 3-SAT &amp;lt;math&amp;gt; \rightarrow&amp;lt;/math&amp;gt; Vertex Cover reduction을 통해서 Vertex Cover가 NP-Complete임을 보일 수 있다.&lt;br /&gt;
이때 Vertex Cover의 complement는 [[Independent Set]]이다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Edit_Distance&amp;diff=6243</id>
		<title>Edit Distance</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Edit_Distance&amp;diff=6243"/>
		<updated>2025-12-01T16:44:35Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Dynamic Programming]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
문자열을 비교할 때는 오탈자가 있는 문자열을 고려해야 하는 경우가 있으며, 이를 위해서 근사(approximate) 매칭이 필요하다. 이를 위해서 두 문자열이 얼마나 다른지를 측정하는 척도가 필요하며, 이를 Edit Distance라고 한다. 이는 문자열 A를 문자열 B로 바꾸기 위해 필요한 최소 변경 횟수에 해당한다. Edit Distance는 보통 세 가지 연산을 기반으로 한다: &lt;br /&gt;
# Substitution (치환): 한 글자를 다른 글자로 바꾸기&amp;lt;ref&amp;gt;예를 들어, shot → spot의 경우는 ‘g’를 삽입하므로 Insertion 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Insertion (삽입): 문자 하나를 새로 삽입&amp;lt;ref&amp;gt;예를 들어, ago → agog의 경우는 ‘h’를 ‘p’로 바꾸므로 Substitution 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Deletion (삭제): 문자 하나 삭제&amp;lt;ref&amp;gt;예를 들어, hour → our의 경우는 ‘h’ 삭제 → Deletion 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Simple Recursive Algorithm==&lt;br /&gt;
Edit Distance 계산은 문자열 뒤에서부터 비교하면서 재귀적으로 해결할 수 있다. 이는 두 문자열 S[1..i], T[1..j]이 있을때 마지막 문자를 비교하여 해결할 수 있다. 만약 비교하는 두 문자가 같으면 비용 증가 없이 이전 문제로 이동한다.&amp;lt;ref&amp;gt;(s[1..i-1], t[1..j-1])에 해당한다.&amp;lt;/ref&amp;gt; 반면 두 문자가 다른 경우에는 substitution을 통해 Edit Distance를 1 증가시킨다.&amp;lt;ref&amp;gt;혹은 S에 문자를 추가하거나 삭제하는 방식을 취할 수도 있다.&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Recurrence Relation===&lt;br /&gt;
위에서 설명한 원리를 점화식으로 풀면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;D[i, j]&amp;lt;/math&amp;gt; is minimum of:&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1]&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] = T [j]&amp;lt;/math&amp;gt;: 둘이 같으면 비용 추가 안 됨&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1] + 1&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] \ne T [j]&amp;lt;/math&amp;gt;: 둘이 다르면 substitution 필요&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i, j - 1] + 1&amp;lt;/math&amp;gt; for an insertion into &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: T에서 문자를 하나 가져오는 경우(insertion)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j] + 1&amp;lt;/math&amp;gt; for a deletion from &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: S에서 문자를 하나 버리는 경우(deletion)&lt;br /&gt;
&lt;br /&gt;
===Recursive Edit Distance Code===&lt;br /&gt;
아래는 단순 재귀 기반의 알고리즘을 C 코드로 옮긴 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MATCH   0      /* enumerated type symbol for match */&lt;br /&gt;
#define INSERT  1      /* enumerated type symbol for insert */&lt;br /&gt;
#define DELETE  2      /* enumerated type symbol for delete */&lt;br /&gt;
&lt;br /&gt;
int string_compare_r(char *s, char *t, int i, int j) {&lt;br /&gt;
    int k;             /* counter */&lt;br /&gt;
    int opt[3];        /* cost of the three options */&lt;br /&gt;
    int lowest_cost;   /* lowest cost */&lt;br /&gt;
&lt;br /&gt;
    if (i == 0) {      /* indel is the cost of an insertion or deletion */&lt;br /&gt;
        return (j * indel(&#039; &#039;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (j == 0) {&lt;br /&gt;
        return (i * indel(&#039; &#039;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* match is the cost of a match/substitution */&lt;br /&gt;
&lt;br /&gt;
    opt[MATCH]  = string_compare_r(s, t, i-1, j-1) + match(s[i], t[j]);&lt;br /&gt;
    opt[INSERT] = string_compare_r(s, t, i,   j-1) + indel(t[j]);&lt;br /&gt;
    opt[DELETE] = string_compare_r(s, t, i-1, j  ) + indel(s[i]);&lt;br /&gt;
&lt;br /&gt;
    lowest_cost = opt[MATCH];&lt;br /&gt;
&lt;br /&gt;
    for (k = INSERT; k &amp;lt;= DELETE; k++) {&lt;br /&gt;
        if (opt[k] &amp;lt; lowest_cost) {&lt;br /&gt;
            lowest_cost = opt[k];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (lowest_cost);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recursive Algorithm Using DP==&lt;br /&gt;
위에서 구현한 단순한 재귀 알고리즘은 같은 (i, j) 상태를 수백 번, 수천 번 다시 계산한다. 이때 전체 가능한 상태의 수는 &amp;lt;math&amp;gt;|S|\times |T|&amp;lt;/math&amp;gt; 뿐인데, 이를 매번 재계산하기 때문에 비효율적이다. 실제로, 단순 재귀 알고리즘을 실제로 구현할 경우 시간 복잡도는 무려 &amp;lt;math&amp;gt;O(3^{m+n})&amp;lt;/math&amp;gt;이다.&lt;br /&gt;
&lt;br /&gt;
이를 단축시키기 위해 (i, j)를 계산한 값을 테이블에 저장하고, 이를 다시 사용하여 시간을 단축시킬 수 있다. 이는 [[Dynamic Programming|동적 프로그래밍(DP)]]을 활용하여 구현될 수 있다. 이를 구현하기 위한 DP 테이블은 2D 배열 m[i][j]으로 구성된다. 테이블의 각 칸에는 그 위치까지 컴퓨팅한 최소 비용(cost)과, 어떤 연산(MATCH/INSERT/DELETE)으로 이 칸에 왔는지 추적하기 위한 포인터(parent)가 저장된다. 이때 parent는 실제 편집 경로(edit sequence)를 복원하는 데에 사용된다. 아래는 해당 자료구조를 C언어 코드로 구현한 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct { &lt;br /&gt;
    int cost;               /* cost of reaching this cell */&lt;br /&gt;
    int parent;             /* parent cell */&lt;br /&gt;
} cell;&lt;br /&gt;
&lt;br /&gt;
cell m[MAXLEN+1][MAXLEN+1]; /* dynamic programming table */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
이때 DP 테이블의 각 칸은 vertex처럼 간주할 수 있으며, (i, j) → (i+1, j), (i, j+1), (i+1, j+1) 방향으로 edge가 존재한다고 할 수 있다. 즉, 이렇게 간주하면 DAG(Directed Acyclic Graph)이므로 topological order(위상 정렬)로 평가할 수 있다. 이는 DP 테이블에 “다음 칸을 계산하려면 이전 칸들이 먼저 계산되어야 한다”는 방향성이 있기 때문에 성립한다. &lt;br /&gt;
&lt;br /&gt;
이때 위의 DP 테이블 인덱스(i, j)를 문자열 인덱스와 동일하게 사용하기 위해서는 문자열의 첫 인덱스에는 아무것도 저장하지 않아야 한다. 예를 들어 문자열 배열 s에 &amp;quot;An&amp;quot;을 저장하고자 한다면 s[0]=, s[1]=&#039;A&#039;, s[2]=&#039;n&#039;과 같이 저장된다.&lt;br /&gt;
&lt;br /&gt;
이 알고리즘이 단순 재귀적인 알고리즘과 구분되는 점은 재귀 알고리즘과 같이 D[i][j]를 계산하기 위해서 D[i−1][j], D[i][j−1], D[i−1][j−1]를 또 재귀 호출하는 대신 배열 lookup을 사용하여 단순히 테이블에 저장된 값을 읽기만 하여 훨씬 빠른 속도를 보장&amp;lt;ref&amp;gt;시간 복잡도가 &amp;lt;math&amp;gt;O(|S|\times|T|)&amp;lt;/math&amp;gt;로 줄어든다.&amp;lt;/ref&amp;gt;하고, parent 포인터를 저장하여 편집 경로를 복원할 수 있다는 것이다. 또한 goal_cell() 같은 일반화된 함수 사용하여 여러 문제로 이를 확장할 수 있다는 장점이 있다. &lt;br /&gt;
&lt;br /&gt;
===Dynamic Programming Edit Distance Code===&lt;br /&gt;
아래는 동적 프로그래밍을 사용한 알고리즘을 C언어로 구현한 것이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int string_compare(char *s, char *t, cell m[MAXLEN+1][MAXLEN+1]) {&lt;br /&gt;
    int i, j, k;      /* counters */&lt;br /&gt;
    int opt[3];       /* cost of the three options */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt;= MAXLEN; i++) {&lt;br /&gt;
        row_init(i, m);&lt;br /&gt;
        column_init(i, m);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 1; i &amp;lt; strlen(s); i++) {&lt;br /&gt;
        for (j = 1; j &amp;lt; strlen(t); j++) {&lt;br /&gt;
&lt;br /&gt;
            opt[MATCH]  = m[i-1][j-1].cost + match(s[i], t[j]);&lt;br /&gt;
            opt[INSERT] = m[i][j-1].cost   + indel(t[j]);&lt;br /&gt;
            opt[DELETE] = m[i-1][j].cost   + indel(s[i]);&lt;br /&gt;
&lt;br /&gt;
            m[i][j].cost   = opt[MATCH];&lt;br /&gt;
            m[i][j].parent = MATCH;&lt;br /&gt;
&lt;br /&gt;
            for (k = INSERT; k &amp;lt;= DELETE; k++) {&lt;br /&gt;
                if (opt[k] &amp;lt; m[i][j].cost) {&lt;br /&gt;
                    m[i][j].cost   = opt[k];&lt;br /&gt;
                    m[i][j].parent = k;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    goal_cell(s, t, &amp;amp;i, &amp;amp;j);&lt;br /&gt;
    return (m[i][j].cost);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example of Implementation===&lt;br /&gt;
[[파일:Figure 1. Example of DP Table.png|섬네일|Figure 1. Example of DP Table|가운데]]&lt;br /&gt;
Figure 1은 &amp;quot;thou shalt&amp;quot;를 &amp;quot;you should&amp;quot;로 편집하기 위한 Edit Distance를 구한 결과 DP 테이블이다. 해당 DP 테이블의 값들은 해당 인덱스가 가리키는 부분문자열을 일치시키기 위해서 요구되는 Edit Distance(편집 횟수)를 의미한다. 예를 들어 m[3, 2]는 &amp;quot;tho&amp;quot;를 &amp;quot;so&amp;quot;로 편집하기 위해서 요구되는 편집 횟수를 의미한다. 이때 각각의 값들은 두 문자열의 마지막 문자를 서로 비교하며 결정되며 사용되는 식은 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;D[i, j]&amp;lt;/math&amp;gt; is minimum of:&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1]&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] = T [j]&amp;lt;/math&amp;gt;: 둘이 같으면 비용 추가 안 됨(match)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1] + 1&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] \ne T [j]&amp;lt;/math&amp;gt;: 둘이 다르면 치환 필요(substitution)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i, j - 1] + 1&amp;lt;/math&amp;gt; for an insertion into &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: T에서 문자를 하나 가져오는 경우(insertion)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j] + 1&amp;lt;/math&amp;gt; for a deletion from &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: S에서 문자를 하나 버리는 경우(deletion)&lt;br /&gt;
위 연산을 의식하면 DP 테이블에 대해 더욱 깊이 이해할 수 있다. 제시된 DP 테이블에는 색칠이 되어 있는데, 이는 각각의 원소들이 어떠한 연산을 통해 구해졌는지를 의미한다. 먼저, 빨간색은 일치(match)나 치환(substitution)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 대각선에 일치함을 의미한다. 이때 부모 원소와 비교하여 값이 보존되었다면 일치(M), 값이 증가하였다면 치환(S) 연산을 통해 구해진 것이다. 두번째로, 초록색은 삽입 연산(Insertion)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 왼쪽에 일치함을 의미한다. 마지막으로, 파란색은 삭제 연산(Deletion)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 위쪽에 일치함을 의미한다.&lt;br /&gt;
&lt;br /&gt;
이를 통하여 m[10, 10] 부터 연산을 역추적하면 Edit Distance를 5로 만들기 위한 Edit Sequence가 DSMMMMMISMS임을 알 수 있다. 이때 주어진 Edit Sequence에서 M을 제외한 편집 횟수는 5이며, 이는 m[10, 10]을 통해 주어진 Edit Distance인 5와 일치한다.&lt;br /&gt;
&lt;br /&gt;
===Reconstructing the Path===&lt;br /&gt;
DP 테이블을 기반으로 연산 경로를 복원하기 위해서는 DP 테이블의 m[|S|][|T|]에서 시작하여 parent를 따라가는 것이다. 즉, goal state인 m[i][j]에서 시작하여 parent 방향으로 (i-1, j), (i, j-1), (i-1, j-1) 중 하나로 이동하며, 이 과정에서 발생한 연산인 M/S/I/D를 기록하면 되는 것이다. 하지만 이는 뒤집혀진 순서이므로, 기록된 것을 reverse하여 출력해야 한다. 혹은 재귀(recursion)를 반대로 실행하면 자동으로 정방향 순서를 구할 수 있다. 아래는 주어진 DP 테이블을 바탕으로 경로를 복원하는 함수를 C언어로 구현한 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void reconstruct_path(char *s, char *t, int i, int j, cell m[MAXLEN+1][MAXLEN+1]) {&lt;br /&gt;
    if (m[i][j].parent == -1) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == MATCH) {&lt;br /&gt;
        reconstruct_path(s, t, i-1, j-1, m);&lt;br /&gt;
        match_out(s, t, i, j);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == INSERT) {&lt;br /&gt;
        reconstruct_path(s, t, i, j-1, m);&lt;br /&gt;
        insert_out(t, j);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == DELETE) {&lt;br /&gt;
        reconstruct_path(s, t, i-1, j, m);&lt;br /&gt;
        delete_out(s, i);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variant of Edit Distance==&lt;br /&gt;
Edit Distance 알고리즘을 커스터마이징 하면 다른 많은 문제들에 대해 적용할 수 있다. 이를 하기 위해서는 먼저, row_init() 와 column_init() 함수가 하는 일에 대해 알아야 한다. 이들은 DP 테이블의 0번째 행과 0번째 열을 초기화하는 함수들이다. 이는 각각 아래와 같은 의미이다:&lt;br /&gt;
# row_init(): 0번째 행 (m[0][j]) = 문자열 S가 비어있을 때 T[1..j]를 만들기 위해 삽입만 j번 해야 함&lt;br /&gt;
# column_init(): 0번째 열 (m[i][0]) = 문자열 T가 비어있을 때 S[1..i]를 만들기 위해 삭제만 i번 해야 함&lt;br /&gt;
즉, 이 함수들이 기본 DP 테이블의 경계 조건(base case)을 설정한다. &lt;br /&gt;
&lt;br /&gt;
하지만 커스터마이징의 핵심은 penalty cost를 조절하는 것이다. penalty cost란 연산 M/S/I/D에 대해 임의로 부여한 비용을 의미한다. 이때 match(c, d)는 문자 c를 d로 바꾸는 비용을 의미한다. 이에 따라 두 문자가 같다면 비용이 0이고, 다르면 일반적으로는 1이다. 또한 indel(c)은 c를 삭제/추가하는데 발생하는 비용을 의미하며, 일반적인 Edit Distance 알고리즘에서는 1비용이 1로 설정된다. 이때 match(c, d)와 indel(c)의 비용을 조절하는 것을 통해서 다양한 커스터마이징을 할 수 있다. &lt;br /&gt;
&lt;br /&gt;
goal_cell() 함수는 traceback이 어디서 끝나는지 결정한다. 기본적인 Edit Distance에서는 목표 셀(goal cell)은 DP 테이블의 오른쪽 아래, 즉 (len(S), len(T))로 자동으로 설정된다. 이는 문자열 S 전체를 문자열 T 전체로 변환해야 하기 떄문이다. 하짐ㄴ substring edit distance처럼 패턴 S가 텍스트 T 어디에나 나타날 수 있을 때는 goal cell이 마지막 행의 최솟값이 될 수 있다. 따라서 이러한 경우에는 goal_cell() 함수를 커스터마이징 해야 한다. &lt;br /&gt;
&lt;br /&gt;
===Substring Matching===&lt;br /&gt;
부분 문자열 매칭(Substring Matching)은 문자열 S(패턴)이 문자열 T(긴 텍스트) 안에서 가장 잘 맞는 위치를 찾는 것을 목표로 한다. 이때 기존의 일반적인 Edit Distance 알고리즘을 그대로 활용하지 않는 이유는 S 전체와 T 전체를 비교하여 S 를 T 로 완전히 바꾸는 비용을 계산하기 때문에 매우 비효율적이기 때문이다. 예를 들어 패턴 S 가 길이 6인데 T 가 길이 2000이면, T 안의 S 위치를 찾기 위해 T 나머지 부분 전체를 delete 해야 한다.&lt;br /&gt;
&lt;br /&gt;
따라서 이러한 문제를 해결하기 위해서는 패턴 매칭 비용이 텍스트 길이에 의존하지 않도록 하는 것이다. 따라서 위에서 구현된 함수를 커스터마이징해야 한다. 먼저 아래는 수정된 row_init() 함수이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void row_init(int i, cell m[][]) {&lt;br /&gt;
    m[0][i].cost = 0;&lt;br /&gt;
    m[0][i].parent = -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
기존의 초기화 함수는 0행의 편집횟수를 m[0][j] = j으로 설정한 반면에, 위 함수는 0행의 전체 비용을 0으로 만든다. 이를 통해 텍스트 T 의 어느 위치든 “비용 없이” 시작할 수 있게하여 S의 첫 글자와 T의 어떤 위치라도 “매칭 시작점”이 될 수 있도록 한다. 아래는 수정된 goal_cell() 함수이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
*i = strlen(s) - 1;&lt;br /&gt;
*j = 0;&lt;br /&gt;
for (k = 1; k &amp;lt; strlen(t); k++) {&lt;br /&gt;
    if (m[*i][k].cost &amp;lt; m[*i][*j].cost)&lt;br /&gt;
        *j = k;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
기존의 편집거리인 goal cell은 (len(S), len(T))이어서 S 전체를 T 전체로 변환하는 비용이었다. 하지만 위 함수는 S 전체가 끝나기만 하면 T 의 어떤 j 위치여도 괜찮아야 하므로 S 의 마지막 행 i = |S| 을 고정하고 그 행 전체에서 최소 비용을 갖는 열 j를 찾는다.&lt;br /&gt;
&lt;br /&gt;
===Longest Common Subsequence===&lt;br /&gt;
LCS(Longest Common Subsequence) 문제는 두 문자열 중에서 가장 긴 공통 부분수열을 찾는 문제이다. 예를 들어 &amp;quot;democrat&amp;quot;과 &amp;quot;republican&amp;quot; 사이의 LCS는 &amp;quot;eca&amp;quot;이다. 이는 e,c,a가 두 문자열 모두에서 인덱스 순서를 유지하는 가장 긴 부분 수열이기 때문이다. &lt;br /&gt;
&lt;br /&gt;
원래의 Edit Distance 알고리즘을 LCS 문제에 그대로 적용하는 것은 부적절하다. 왜냐하면 LCS는 “일치하는 문자”만 중요하고 문자가 다르면 match가 아니라 그냥 버리면(delete)되기 때문이다. 따라서 substitution(치환)을 “금지”하는 방식으로 알고리즘을 커스터마이징해야 한다. 이는 아래와 같은 코드로 구현된다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int match(c, d) {&lt;br /&gt;
    if (c == d) return 0;&lt;br /&gt;
    return MAXLEN;  // 엄청 큰 값 = 사실상 불가능&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
즉, 이를 통해서 DP는 문자가 같으면 match하고, 문자가 다르면 delete/insert로 스킵한다. 이를 통해 가장 많은 match 를 모으는 방향으로 DP가 움직이며, 그 match들의 집합이 바로 LCS가 된다. &lt;br /&gt;
&lt;br /&gt;
LCS 문제를 응용하면 LIS(Longest Increasing Subsequence) 문제도 해결할 수 있다. LIS는 Maximum Monotone Subsequence이라고도 불리며, 이는 원래 수열에서 일부 숫자를 삭제해 증가하는(subsequence) 형태를 유지하면서 가장 긴 수열을 만드는 문제이다. 예를 들어 243517698에서 LIS는 23568이다. 이는 LIS는 LCS 문제와 동일하기 때문이다. 이는 문자열 S가 있을 때, 아래와 같은 과정을 통해서 풀 수 있다:&lt;br /&gt;
# S를 정렬(sorted) 해서 새로운 수열 T를 만든다.&lt;br /&gt;
# LCS(S, T)를 구한다.&lt;br /&gt;
# 그 LCS가 바로 LIS이다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Edit_Distance&amp;diff=6242</id>
		<title>Edit Distance</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Edit_Distance&amp;diff=6242"/>
		<updated>2025-12-01T16:44:20Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[Dynamic Programming#문제|Dynammic Programming]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
문자열을 비교할 때는 오탈자가 있는 문자열을 고려해야 하는 경우가 있으며, 이를 위해서 근사(approximate) 매칭이 필요하다. 이를 위해서 두 문자열이 얼마나 다른지를 측정하는 척도가 필요하며, 이를 Edit Distance라고 한다. 이는 문자열 A를 문자열 B로 바꾸기 위해 필요한 최소 변경 횟수에 해당한다. Edit Distance는 보통 세 가지 연산을 기반으로 한다: &lt;br /&gt;
# Substitution (치환): 한 글자를 다른 글자로 바꾸기&amp;lt;ref&amp;gt;예를 들어, shot → spot의 경우는 ‘g’를 삽입하므로 Insertion 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Insertion (삽입): 문자 하나를 새로 삽입&amp;lt;ref&amp;gt;예를 들어, ago → agog의 경우는 ‘h’를 ‘p’로 바꾸므로 Substitution 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Deletion (삭제): 문자 하나 삭제&amp;lt;ref&amp;gt;예를 들어, hour → our의 경우는 ‘h’ 삭제 → Deletion 1회에 해당한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Simple Recursive Algorithm==&lt;br /&gt;
Edit Distance 계산은 문자열 뒤에서부터 비교하면서 재귀적으로 해결할 수 있다. 이는 두 문자열 S[1..i], T[1..j]이 있을때 마지막 문자를 비교하여 해결할 수 있다. 만약 비교하는 두 문자가 같으면 비용 증가 없이 이전 문제로 이동한다.&amp;lt;ref&amp;gt;(s[1..i-1], t[1..j-1])에 해당한다.&amp;lt;/ref&amp;gt; 반면 두 문자가 다른 경우에는 substitution을 통해 Edit Distance를 1 증가시킨다.&amp;lt;ref&amp;gt;혹은 S에 문자를 추가하거나 삭제하는 방식을 취할 수도 있다.&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Recurrence Relation===&lt;br /&gt;
위에서 설명한 원리를 점화식으로 풀면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;D[i, j]&amp;lt;/math&amp;gt; is minimum of:&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1]&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] = T [j]&amp;lt;/math&amp;gt;: 둘이 같으면 비용 추가 안 됨&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1] + 1&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] \ne T [j]&amp;lt;/math&amp;gt;: 둘이 다르면 substitution 필요&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i, j - 1] + 1&amp;lt;/math&amp;gt; for an insertion into &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: T에서 문자를 하나 가져오는 경우(insertion)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j] + 1&amp;lt;/math&amp;gt; for a deletion from &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: S에서 문자를 하나 버리는 경우(deletion)&lt;br /&gt;
&lt;br /&gt;
===Recursive Edit Distance Code===&lt;br /&gt;
아래는 단순 재귀 기반의 알고리즘을 C 코드로 옮긴 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MATCH   0      /* enumerated type symbol for match */&lt;br /&gt;
#define INSERT  1      /* enumerated type symbol for insert */&lt;br /&gt;
#define DELETE  2      /* enumerated type symbol for delete */&lt;br /&gt;
&lt;br /&gt;
int string_compare_r(char *s, char *t, int i, int j) {&lt;br /&gt;
    int k;             /* counter */&lt;br /&gt;
    int opt[3];        /* cost of the three options */&lt;br /&gt;
    int lowest_cost;   /* lowest cost */&lt;br /&gt;
&lt;br /&gt;
    if (i == 0) {      /* indel is the cost of an insertion or deletion */&lt;br /&gt;
        return (j * indel(&#039; &#039;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (j == 0) {&lt;br /&gt;
        return (i * indel(&#039; &#039;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* match is the cost of a match/substitution */&lt;br /&gt;
&lt;br /&gt;
    opt[MATCH]  = string_compare_r(s, t, i-1, j-1) + match(s[i], t[j]);&lt;br /&gt;
    opt[INSERT] = string_compare_r(s, t, i,   j-1) + indel(t[j]);&lt;br /&gt;
    opt[DELETE] = string_compare_r(s, t, i-1, j  ) + indel(s[i]);&lt;br /&gt;
&lt;br /&gt;
    lowest_cost = opt[MATCH];&lt;br /&gt;
&lt;br /&gt;
    for (k = INSERT; k &amp;lt;= DELETE; k++) {&lt;br /&gt;
        if (opt[k] &amp;lt; lowest_cost) {&lt;br /&gt;
            lowest_cost = opt[k];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (lowest_cost);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recursive Algorithm Using DP==&lt;br /&gt;
위에서 구현한 단순한 재귀 알고리즘은 같은 (i, j) 상태를 수백 번, 수천 번 다시 계산한다. 이때 전체 가능한 상태의 수는 &amp;lt;math&amp;gt;|S|\times |T|&amp;lt;/math&amp;gt; 뿐인데, 이를 매번 재계산하기 때문에 비효율적이다. 실제로, 단순 재귀 알고리즘을 실제로 구현할 경우 시간 복잡도는 무려 &amp;lt;math&amp;gt;O(3^{m+n})&amp;lt;/math&amp;gt;이다.&lt;br /&gt;
&lt;br /&gt;
이를 단축시키기 위해 (i, j)를 계산한 값을 테이블에 저장하고, 이를 다시 사용하여 시간을 단축시킬 수 있다. 이는 [[Dynamic Programming|동적 프로그래밍(DP)]]을 활용하여 구현될 수 있다. 이를 구현하기 위한 DP 테이블은 2D 배열 m[i][j]으로 구성된다. 테이블의 각 칸에는 그 위치까지 컴퓨팅한 최소 비용(cost)과, 어떤 연산(MATCH/INSERT/DELETE)으로 이 칸에 왔는지 추적하기 위한 포인터(parent)가 저장된다. 이때 parent는 실제 편집 경로(edit sequence)를 복원하는 데에 사용된다. 아래는 해당 자료구조를 C언어 코드로 구현한 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct { &lt;br /&gt;
    int cost;               /* cost of reaching this cell */&lt;br /&gt;
    int parent;             /* parent cell */&lt;br /&gt;
} cell;&lt;br /&gt;
&lt;br /&gt;
cell m[MAXLEN+1][MAXLEN+1]; /* dynamic programming table */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
이때 DP 테이블의 각 칸은 vertex처럼 간주할 수 있으며, (i, j) → (i+1, j), (i, j+1), (i+1, j+1) 방향으로 edge가 존재한다고 할 수 있다. 즉, 이렇게 간주하면 DAG(Directed Acyclic Graph)이므로 topological order(위상 정렬)로 평가할 수 있다. 이는 DP 테이블에 “다음 칸을 계산하려면 이전 칸들이 먼저 계산되어야 한다”는 방향성이 있기 때문에 성립한다. &lt;br /&gt;
&lt;br /&gt;
이때 위의 DP 테이블 인덱스(i, j)를 문자열 인덱스와 동일하게 사용하기 위해서는 문자열의 첫 인덱스에는 아무것도 저장하지 않아야 한다. 예를 들어 문자열 배열 s에 &amp;quot;An&amp;quot;을 저장하고자 한다면 s[0]=, s[1]=&#039;A&#039;, s[2]=&#039;n&#039;과 같이 저장된다.&lt;br /&gt;
&lt;br /&gt;
이 알고리즘이 단순 재귀적인 알고리즘과 구분되는 점은 재귀 알고리즘과 같이 D[i][j]를 계산하기 위해서 D[i−1][j], D[i][j−1], D[i−1][j−1]를 또 재귀 호출하는 대신 배열 lookup을 사용하여 단순히 테이블에 저장된 값을 읽기만 하여 훨씬 빠른 속도를 보장&amp;lt;ref&amp;gt;시간 복잡도가 &amp;lt;math&amp;gt;O(|S|\times|T|)&amp;lt;/math&amp;gt;로 줄어든다.&amp;lt;/ref&amp;gt;하고, parent 포인터를 저장하여 편집 경로를 복원할 수 있다는 것이다. 또한 goal_cell() 같은 일반화된 함수 사용하여 여러 문제로 이를 확장할 수 있다는 장점이 있다. &lt;br /&gt;
&lt;br /&gt;
===Dynamic Programming Edit Distance Code===&lt;br /&gt;
아래는 동적 프로그래밍을 사용한 알고리즘을 C언어로 구현한 것이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int string_compare(char *s, char *t, cell m[MAXLEN+1][MAXLEN+1]) {&lt;br /&gt;
    int i, j, k;      /* counters */&lt;br /&gt;
    int opt[3];       /* cost of the three options */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt;= MAXLEN; i++) {&lt;br /&gt;
        row_init(i, m);&lt;br /&gt;
        column_init(i, m);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (i = 1; i &amp;lt; strlen(s); i++) {&lt;br /&gt;
        for (j = 1; j &amp;lt; strlen(t); j++) {&lt;br /&gt;
&lt;br /&gt;
            opt[MATCH]  = m[i-1][j-1].cost + match(s[i], t[j]);&lt;br /&gt;
            opt[INSERT] = m[i][j-1].cost   + indel(t[j]);&lt;br /&gt;
            opt[DELETE] = m[i-1][j].cost   + indel(s[i]);&lt;br /&gt;
&lt;br /&gt;
            m[i][j].cost   = opt[MATCH];&lt;br /&gt;
            m[i][j].parent = MATCH;&lt;br /&gt;
&lt;br /&gt;
            for (k = INSERT; k &amp;lt;= DELETE; k++) {&lt;br /&gt;
                if (opt[k] &amp;lt; m[i][j].cost) {&lt;br /&gt;
                    m[i][j].cost   = opt[k];&lt;br /&gt;
                    m[i][j].parent = k;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    goal_cell(s, t, &amp;amp;i, &amp;amp;j);&lt;br /&gt;
    return (m[i][j].cost);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example of Implementation===&lt;br /&gt;
[[파일:Figure 1. Example of DP Table.png|섬네일|Figure 1. Example of DP Table|가운데]]&lt;br /&gt;
Figure 1은 &amp;quot;thou shalt&amp;quot;를 &amp;quot;you should&amp;quot;로 편집하기 위한 Edit Distance를 구한 결과 DP 테이블이다. 해당 DP 테이블의 값들은 해당 인덱스가 가리키는 부분문자열을 일치시키기 위해서 요구되는 Edit Distance(편집 횟수)를 의미한다. 예를 들어 m[3, 2]는 &amp;quot;tho&amp;quot;를 &amp;quot;so&amp;quot;로 편집하기 위해서 요구되는 편집 횟수를 의미한다. 이때 각각의 값들은 두 문자열의 마지막 문자를 서로 비교하며 결정되며 사용되는 식은 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;D[i, j]&amp;lt;/math&amp;gt; is minimum of:&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1]&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] = T [j]&amp;lt;/math&amp;gt;: 둘이 같으면 비용 추가 안 됨(match)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j - 1] + 1&amp;lt;/math&amp;gt; if &amp;lt;math&amp;gt;S[i] \ne T [j]&amp;lt;/math&amp;gt;: 둘이 다르면 치환 필요(substitution)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i, j - 1] + 1&amp;lt;/math&amp;gt; for an insertion into &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: T에서 문자를 하나 가져오는 경우(insertion)&lt;br /&gt;
 • &amp;lt;math&amp;gt;D[i - 1, j] + 1&amp;lt;/math&amp;gt; for a deletion from &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: S에서 문자를 하나 버리는 경우(deletion)&lt;br /&gt;
위 연산을 의식하면 DP 테이블에 대해 더욱 깊이 이해할 수 있다. 제시된 DP 테이블에는 색칠이 되어 있는데, 이는 각각의 원소들이 어떠한 연산을 통해 구해졌는지를 의미한다. 먼저, 빨간색은 일치(match)나 치환(substitution)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 대각선에 일치함을 의미한다. 이때 부모 원소와 비교하여 값이 보존되었다면 일치(M), 값이 증가하였다면 치환(S) 연산을 통해 구해진 것이다. 두번째로, 초록색은 삽입 연산(Insertion)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 왼쪽에 일치함을 의미한다. 마지막으로, 파란색은 삭제 연산(Deletion)을 의미한다. 즉, 이는 해당 원소의 부모가 되는 원소가 위쪽에 일치함을 의미한다.&lt;br /&gt;
&lt;br /&gt;
이를 통하여 m[10, 10] 부터 연산을 역추적하면 Edit Distance를 5로 만들기 위한 Edit Sequence가 DSMMMMMISMS임을 알 수 있다. 이때 주어진 Edit Sequence에서 M을 제외한 편집 횟수는 5이며, 이는 m[10, 10]을 통해 주어진 Edit Distance인 5와 일치한다.&lt;br /&gt;
&lt;br /&gt;
===Reconstructing the Path===&lt;br /&gt;
DP 테이블을 기반으로 연산 경로를 복원하기 위해서는 DP 테이블의 m[|S|][|T|]에서 시작하여 parent를 따라가는 것이다. 즉, goal state인 m[i][j]에서 시작하여 parent 방향으로 (i-1, j), (i, j-1), (i-1, j-1) 중 하나로 이동하며, 이 과정에서 발생한 연산인 M/S/I/D를 기록하면 되는 것이다. 하지만 이는 뒤집혀진 순서이므로, 기록된 것을 reverse하여 출력해야 한다. 혹은 재귀(recursion)를 반대로 실행하면 자동으로 정방향 순서를 구할 수 있다. 아래는 주어진 DP 테이블을 바탕으로 경로를 복원하는 함수를 C언어로 구현한 예시이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void reconstruct_path(char *s, char *t, int i, int j, cell m[MAXLEN+1][MAXLEN+1]) {&lt;br /&gt;
    if (m[i][j].parent == -1) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == MATCH) {&lt;br /&gt;
        reconstruct_path(s, t, i-1, j-1, m);&lt;br /&gt;
        match_out(s, t, i, j);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == INSERT) {&lt;br /&gt;
        reconstruct_path(s, t, i, j-1, m);&lt;br /&gt;
        insert_out(t, j);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (m[i][j].parent == DELETE) {&lt;br /&gt;
        reconstruct_path(s, t, i-1, j, m);&lt;br /&gt;
        delete_out(s, i);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Variant of Edit Distance==&lt;br /&gt;
Edit Distance 알고리즘을 커스터마이징 하면 다른 많은 문제들에 대해 적용할 수 있다. 이를 하기 위해서는 먼저, row_init() 와 column_init() 함수가 하는 일에 대해 알아야 한다. 이들은 DP 테이블의 0번째 행과 0번째 열을 초기화하는 함수들이다. 이는 각각 아래와 같은 의미이다:&lt;br /&gt;
# row_init(): 0번째 행 (m[0][j]) = 문자열 S가 비어있을 때 T[1..j]를 만들기 위해 삽입만 j번 해야 함&lt;br /&gt;
# column_init(): 0번째 열 (m[i][0]) = 문자열 T가 비어있을 때 S[1..i]를 만들기 위해 삭제만 i번 해야 함&lt;br /&gt;
즉, 이 함수들이 기본 DP 테이블의 경계 조건(base case)을 설정한다. &lt;br /&gt;
&lt;br /&gt;
하지만 커스터마이징의 핵심은 penalty cost를 조절하는 것이다. penalty cost란 연산 M/S/I/D에 대해 임의로 부여한 비용을 의미한다. 이때 match(c, d)는 문자 c를 d로 바꾸는 비용을 의미한다. 이에 따라 두 문자가 같다면 비용이 0이고, 다르면 일반적으로는 1이다. 또한 indel(c)은 c를 삭제/추가하는데 발생하는 비용을 의미하며, 일반적인 Edit Distance 알고리즘에서는 1비용이 1로 설정된다. 이때 match(c, d)와 indel(c)의 비용을 조절하는 것을 통해서 다양한 커스터마이징을 할 수 있다. &lt;br /&gt;
&lt;br /&gt;
goal_cell() 함수는 traceback이 어디서 끝나는지 결정한다. 기본적인 Edit Distance에서는 목표 셀(goal cell)은 DP 테이블의 오른쪽 아래, 즉 (len(S), len(T))로 자동으로 설정된다. 이는 문자열 S 전체를 문자열 T 전체로 변환해야 하기 떄문이다. 하짐ㄴ substring edit distance처럼 패턴 S가 텍스트 T 어디에나 나타날 수 있을 때는 goal cell이 마지막 행의 최솟값이 될 수 있다. 따라서 이러한 경우에는 goal_cell() 함수를 커스터마이징 해야 한다. &lt;br /&gt;
&lt;br /&gt;
===Substring Matching===&lt;br /&gt;
부분 문자열 매칭(Substring Matching)은 문자열 S(패턴)이 문자열 T(긴 텍스트) 안에서 가장 잘 맞는 위치를 찾는 것을 목표로 한다. 이때 기존의 일반적인 Edit Distance 알고리즘을 그대로 활용하지 않는 이유는 S 전체와 T 전체를 비교하여 S 를 T 로 완전히 바꾸는 비용을 계산하기 때문에 매우 비효율적이기 때문이다. 예를 들어 패턴 S 가 길이 6인데 T 가 길이 2000이면, T 안의 S 위치를 찾기 위해 T 나머지 부분 전체를 delete 해야 한다.&lt;br /&gt;
&lt;br /&gt;
따라서 이러한 문제를 해결하기 위해서는 패턴 매칭 비용이 텍스트 길이에 의존하지 않도록 하는 것이다. 따라서 위에서 구현된 함수를 커스터마이징해야 한다. 먼저 아래는 수정된 row_init() 함수이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void row_init(int i, cell m[][]) {&lt;br /&gt;
    m[0][i].cost = 0;&lt;br /&gt;
    m[0][i].parent = -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
기존의 초기화 함수는 0행의 편집횟수를 m[0][j] = j으로 설정한 반면에, 위 함수는 0행의 전체 비용을 0으로 만든다. 이를 통해 텍스트 T 의 어느 위치든 “비용 없이” 시작할 수 있게하여 S의 첫 글자와 T의 어떤 위치라도 “매칭 시작점”이 될 수 있도록 한다. 아래는 수정된 goal_cell() 함수이다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
*i = strlen(s) - 1;&lt;br /&gt;
*j = 0;&lt;br /&gt;
for (k = 1; k &amp;lt; strlen(t); k++) {&lt;br /&gt;
    if (m[*i][k].cost &amp;lt; m[*i][*j].cost)&lt;br /&gt;
        *j = k;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
기존의 편집거리인 goal cell은 (len(S), len(T))이어서 S 전체를 T 전체로 변환하는 비용이었다. 하지만 위 함수는 S 전체가 끝나기만 하면 T 의 어떤 j 위치여도 괜찮아야 하므로 S 의 마지막 행 i = |S| 을 고정하고 그 행 전체에서 최소 비용을 갖는 열 j를 찾는다.&lt;br /&gt;
&lt;br /&gt;
===Longest Common Subsequence===&lt;br /&gt;
LCS(Longest Common Subsequence) 문제는 두 문자열 중에서 가장 긴 공통 부분수열을 찾는 문제이다. 예를 들어 &amp;quot;democrat&amp;quot;과 &amp;quot;republican&amp;quot; 사이의 LCS는 &amp;quot;eca&amp;quot;이다. 이는 e,c,a가 두 문자열 모두에서 인덱스 순서를 유지하는 가장 긴 부분 수열이기 때문이다. &lt;br /&gt;
&lt;br /&gt;
원래의 Edit Distance 알고리즘을 LCS 문제에 그대로 적용하는 것은 부적절하다. 왜냐하면 LCS는 “일치하는 문자”만 중요하고 문자가 다르면 match가 아니라 그냥 버리면(delete)되기 때문이다. 따라서 substitution(치환)을 “금지”하는 방식으로 알고리즘을 커스터마이징해야 한다. 이는 아래와 같은 코드로 구현된다:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int match(c, d) {&lt;br /&gt;
    if (c == d) return 0;&lt;br /&gt;
    return MAXLEN;  // 엄청 큰 값 = 사실상 불가능&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
즉, 이를 통해서 DP는 문자가 같으면 match하고, 문자가 다르면 delete/insert로 스킵한다. 이를 통해 가장 많은 match 를 모으는 방향으로 DP가 움직이며, 그 match들의 집합이 바로 LCS가 된다. &lt;br /&gt;
&lt;br /&gt;
LCS 문제를 응용하면 LIS(Longest Increasing Subsequence) 문제도 해결할 수 있다. LIS는 Maximum Monotone Subsequence이라고도 불리며, 이는 원래 수열에서 일부 숫자를 삭제해 증가하는(subsequence) 형태를 유지하면서 가장 긴 수열을 만드는 문제이다. 예를 들어 243517698에서 LIS는 23568이다. 이는 LIS는 LCS 문제와 동일하기 때문이다. 이는 문자열 S가 있을 때, 아래와 같은 과정을 통해서 풀 수 있다:&lt;br /&gt;
# S를 정렬(sorted) 해서 새로운 수열 T를 만든다.&lt;br /&gt;
# LCS(S, T)를 구한다.&lt;br /&gt;
# 그 LCS가 바로 LIS이다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EC%84%A4%EA%B3%84%EC%99%80_%EB%B6%84%EC%84%9D&amp;diff=5381</id>
		<title>알고리즘 설계와 분석</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EC%84%A4%EA%B3%84%EC%99%80_%EB%B6%84%EC%84%9D&amp;diff=5381"/>
		<updated>2025-12-01T16:43:33Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 문제/알고리즘 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
[[:Category:알고리즘 설계와 분석]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
알고리즘이란, 특정한 작업을 수행하기 위한 절차이다. 이에 따라 하나의 알고리즘은 컴퓨터의 종류에 관계 없이 동일한 작업을 동일한 절차로 수행한다. 다만 이를 표현하는 문법이 달라질 뿐이다. 이러한 알고리즘이 잘 작동하기 위해서는 일반적이고(general), 잘 정의된(specified) 문제를 해결할 수 있어야 한다. 이때 잘 만들어진 알고리즘 문제는 그것에 대한 입력으로 주어질 수 있는 인스턴스의 완전한 집합과, 그중 하나의 인스턴스를 입력으로 하였을 때의 정답이 명확하게 설명된다. &lt;br /&gt;
&lt;br /&gt;
예를 들어 정렬(sorting) 문제에 대해 생각해보자. 입력으로는 n개의 수 &amp;lt;math&amp;gt;a_1, ..., a_n&amp;lt;/math&amp;gt;으로 이루어진 수열이 주어지며, 이때 출력은 해당 수열을 재배열하여 &amp;lt;math&amp;gt; a&#039;_1 \le a&#039;_2 \le ... \le a&#039;_n&amp;lt;/math&amp;gt;이 되도록 하는 것이다. 이때 이러한 작업을 수행하는 알고리즘은 효율적이고(efficient), 정확해야(correct) 한다. 이때 정확함(correctness)에 대한 개념은 많은 알고리즘 문제에서 명확하지 않다. 따라서 알고리즘에서 정확함을 보장하기 위해서는 이를 증명해야 한다. 이에 대한 더 잘 이해하기 위해서는, [[Robot Tour Optimization]] 문제 혹은 [[Selecting the Right Jobs]] 문제에 대한 문서를 참조하면 좋다.&lt;br /&gt;
&lt;br /&gt;
===Demonstrating Incorrectness===&lt;br /&gt;
어떤 알고리즘이나 규칙이 항상 최적이라고 주장하기 위해서는, 일반적인 사례에 대해 증명해야 한다. 반대로 이를 부정하기 위해서는 작은 반례 하나만 찾으면 되며, 이는 증명하는 것에 비해서 상대적으로 더욱 쉬운 방법이다. 이러한 반례를 찾는 데에는 아래와 같은 팁들이 존재한다.&lt;br /&gt;
# 작은 입력부터 전부 시험해본다.&lt;br /&gt;
# 극단적인 예제(아주 크거나 아주 작은 값이 섞여 있는 경우)를 시험해 본다.&lt;br /&gt;
# 알고리즘의 각 단계를 밟을 때, 동률(ties)이 존재하는 경우를 살펴본다.&amp;lt;ref&amp;gt;예를 들어 “가장 짧은 interval을 고른다” 했을 때, 길이가 같은 interval이 여러 개 있으면 tie-break 방식에 따라 결과가 달라질 수 있고, 그중 일부는 최적해가 아닐 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Induction and Recursion===&lt;br /&gt;
반례를 찾지 못했다고 해서 알고리즘이 정확하다는 것은 아니다. 엄밀한 증명이 필요하며, 이를 위해서 많이 사용되는 것이 수학적 귀납법이다. 수학적 귀납법은 재귀적인 알고리즘(recursive algorithm)을 증명하는데 자주 활용된다. 이는 아래와 같은 논리 구조를 따른다.&lt;br /&gt;
# 기저 사례 (basis case): 가장 작은 입력에 대해 올바름을 보임.&lt;br /&gt;
# 귀납 가정 (general assumption): 크기 k 이하에 대해 알고리즘이 맞다고 가정.&lt;br /&gt;
# 귀납 단계 (general case): k+1 크기에 대해서도 올바름을 보임.&lt;br /&gt;
&lt;br /&gt;
==알고리즘 분석==&lt;br /&gt;
알고리즘의 효율성을 분석하는 것은 매우 중요하다. 이를 위해서 사용하는 도구는 (1) 계산의 RAM 모델(the RAM model of computation)과 (2) 계산 복잡도의 점근적 분석이다. 이때 알고리즘 성능을 평가하기 위해서는 “빅 오(Big Oh)” 표기를 사용한다.&lt;br /&gt;
&lt;br /&gt;
===[[The RAM Model of Computation]]===&lt;br /&gt;
자세한 내용은 [[The RAM Model of Computation]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
===[[The Big Oh Notation]]===&lt;br /&gt;
자세한 내용은 [[The Big Oh Notation]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==Data Structures==&lt;br /&gt;
어떤 알고리즘에 알맞은 자료 구조를 이식하는 것은 매우 중요한 일이다. 자료 구조 자체는 프로그램의 정당성(correctness)에 영향을 주지는 않지만, 프로그램의 속도에 매우 큰 영향을 준다. 따라서 자료 구조를 이해하는 것은 알고리즘의 설계와 분석을 위해서는 매우 중요하다.&lt;br /&gt;
&lt;br /&gt;
자세한 내용은 [[Data Structures]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Graph]]==&lt;br /&gt;
그래프(Graph)는 알고리즘, 네트워크, 데이터 구조 등 컴퓨터 과학의 여러 분야에서 핵심적인 개념이다.&lt;br /&gt;
&lt;br /&gt;
자세한 내용은 [[Graph]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Backtracking]]==&lt;br /&gt;
[[Backtracking]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Dynamic Programming]]==&lt;br /&gt;
[[Dynamic Programming]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[NP-Completeness]]==&lt;br /&gt;
[[NP-Completeness]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==문제/알고리즘==&lt;br /&gt;
* [[Robot Tour Optimization]]&lt;br /&gt;
* [[Selecting the Right Jobs]]&lt;br /&gt;
* [[Sorting Problem]]&lt;br /&gt;
* [[Graph#Graph Traversal|Graph Traversal]]&lt;br /&gt;
* [[Topological Sorting]]&lt;br /&gt;
* [[Shortest Paths]]&lt;br /&gt;
* [[Fibonacci Numbers]]&lt;br /&gt;
* [[Binomial Coefficients]]&lt;br /&gt;
* [[The Gas Station Problem]]&lt;br /&gt;
* [[Edit Distance]]&lt;br /&gt;
* [[Vertex Cover]]&lt;br /&gt;
* [[Independent Set]]&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Satisfiability_Problem&amp;diff=6274</id>
		<title>Satisfiability Problem</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Satisfiability_Problem&amp;diff=6274"/>
		<updated>2025-12-01T16:42:34Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:알고리즘 설계와 분석 분류:컴퓨터 공학 상위 문서: NP-Completeness   ==개요== SAT(Satisfiability Problem)는 컴퓨터 과학 이론에서 가장 유명한 NP-complete 문제이며, 전 세계의 알고리즘 전문가들이 빠른 알고리즘(다항시간)을 찾으려 했지만 실패했다. SAT를 빠르게 풀 수 있으면 P = NP가 되어버리며, NP 문제들이 전부 빠르게 풀려 암호...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[NP-Completeness#Satisfiability Problem|NP-Completeness]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
SAT(Satisfiability Problem)는 컴퓨터 과학 이론에서 가장 유명한 NP-complete 문제이며, 전 세계의 알고리즘 전문가들이 빠른 알고리즘(다항시간)을 찾으려 했지만 실패했다. SAT를 빠르게 풀 수 있으면 P = NP가 되어버리며, NP 문제들이 전부 빠르게 풀려 암호 시스템 대부분이 붕괴한다. &lt;br /&gt;
&lt;br /&gt;
==Definition of SAT==&lt;br /&gt;
SAT는 아래와 같은 문제 정의를 가진다: &lt;br /&gt;
 입력: 변수들의 집합 &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; &lt;br /&gt;
     변수들로 이루어진 절(clause)&amp;lt;ref&amp;gt;여러 개의 리터럴(literal)들을 OR로 묶은 하나의 조건식이다. 예를 들면, &amp;lt;math&amp;gt;(v_1 \lor \bar{v_2} \lor v_3)&amp;lt;/math&amp;gt;이 있다.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;리터럴(literal)이란, 변수 &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;또는 그 부정 &amp;lt;math&amp;gt;\bar{ V}&amp;lt;/math&amp;gt;을 의미한다.&amp;lt;/ref&amp;gt;들의 집합 &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
 질문: 변수들에 true/false 값을 적절히 넣어 모든 절(clause)이 동시에 참이 되도록 하는 방법이 존재하는가? &lt;br /&gt;
아래는 SAT 문제에 대한 예시 인스턴스이다: &lt;br /&gt;
 입력: &amp;lt;math&amp;gt;V=\{v_1, v_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;C=\{\{v_1,\bar{v_2}\},\{\bar{v_1},v_2\}\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위와 같은 인스턴스에 대한 답은 모든 절을 참으로 만들 수 있다는 것이다. &amp;lt;math&amp;gt;v_1=v_2=true&amp;lt;/math&amp;gt;로 놓으면 두 절이 모두 만족되기 때문이다. 반면, 아래와 같은 인스턴스는 만족 불가능하다: &lt;br /&gt;
 입력: &amp;lt;math&amp;gt;V=\{v_1, v_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;C=\{\{v_1,v_2\},\{v_1,\bar{v_2}\},\{\bar{v_1}\}\}&amp;lt;/math&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
==3-Satisfiability Problem==	&lt;br /&gt;
3-SAT(3-Satisfiability)은 SAT 문제의 특수한 버전으로, 각 절(clause)에 정확히 3개의 literal이 들어간 형식이다. 이는 SAT의 특수한 버전이기 때문에(&amp;lt;math&amp;gt;3-SAT \subseteq SAT&amp;lt;/math&amp;gt;), 만약 reduction에 따라 3-SAT이 NP-complete이면 SAT도 NP-complete이다. &lt;br /&gt;
&lt;br /&gt;
===SAT to 3-SAT Reduction===&lt;br /&gt;
SAT의 절의 길이는 &amp;lt;math&amp;gt;k=1,2,3,4,..&amp;lt;/math&amp;gt;으로 일반적인 길이를 가지기 때문에, 어떤 인스턴스의 각 절 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;를 독립적으로 길이가 3인 절로 바꾸어 전체 식을 3-SAT 인스턴스로 변환하여 reduction을 수행할 수 있다. &lt;br /&gt;
&lt;br /&gt;
먼저 &amp;lt;math&amp;gt;C_i=\{z_1\}&amp;lt;/math&amp;gt;과 같이 &amp;lt;math&amp;gt;k=1&amp;lt;/math&amp;gt;인 경우, 리터럴이 3개인 절로 만들기 위해서 새로운 변수 &amp;lt;math&amp;gt;v_1, v_2&amp;lt;/math&amp;gt; 2개를 만들어야 한다. 이 경우 아래와 같이 네 개의 절이 생성된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;\{v_1,v_2,z_1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{v_1,\bar{v_2},z_1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_1},v_2,z_1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_1},\bar{v_2},z_1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 네 절이 동시에 만족되기 위해서는 무조건 &amp;lt;math&amp;gt;z_1=true&amp;lt;/math&amp;gt;여야 하므로 원래의 의미가 보존된다.&lt;br /&gt;
&lt;br /&gt;
그리고 &amp;lt;math&amp;gt;C_i=\{z_1,z_2\}&amp;lt;/math&amp;gt;과 같이 &amp;lt;math&amp;gt;k=2&amp;lt;/math&amp;gt;인 경우, 리터럴이 3개인 절로 만들기 위해서 새로운 변수 &amp;lt;math&amp;gt;v_1&amp;lt;/math&amp;gt;을 만들어야 한다. 이 경우 아래와 같이 두 개의 절이 생성된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;\{v_1,z_1,z_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_1},z_1,z_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 두 절이 모두 만족되기 위해서는 &amp;lt;math&amp;gt;z_1&amp;lt;/math&amp;gt; 또는 &amp;lt;math&amp;gt;z_2&amp;lt;/math&amp;gt; 중 하나가 true여야 하므로 원래 절의 의미가 유지된다.&lt;br /&gt;
&lt;br /&gt;
마지막으로 &amp;lt;math&amp;gt;C_i=\{z_1,z_2,z_3,...,z_n\}&amp;lt;/math&amp;gt;과 같이 &amp;lt;math&amp;gt;k=n&amp;gt;3&amp;lt;/math&amp;gt;인 경우, 리터럴이 3개인 절로 만들기 위해서는 새로운 변수들 &amp;lt;math&amp;gt;v_1, v_2,\cdots,v_{n-3}&amp;lt;/math&amp;gt;를 만들고 아래와 같이 사슬형(chain) 절들을 만들어야 한다. &lt;br /&gt;
 &amp;lt;math&amp;gt;\{z_1,z_2,v_1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_1}, z_3,v_2\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_2}, z_4, v_3\}&amp;lt;/math&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;math&amp;gt;\{\bar{v_{n-3}},z_{n-1}, z_n\}&amp;lt;/math&amp;gt;&lt;br /&gt;
위 절들은 각 절이 3개의 리터럴을 포함하도록 분해한 구조이다. 이를 통해서 원래의 절의 의미들을 보존할 수 있다. 또한 이를 통해서 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;가 자연수일 때 모든 절들을 길이가 3인 절로 변환할 수 있다는 것이 증명되었다. 따라서 SAT &amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt; p 3-SAT이며, SAT는 NP-complete 이므로 3-SAT도 NP-complete이다. &lt;br /&gt;
&lt;br /&gt;
이때, 절이 4개, 5개 … literal로 구성되어 있어도 조금 조정하면 동일한 방식으로 3-SAT으로 변환할 수 있기 때문에 4-SAT, 5-SAT, … 도 모두 NP-complete이다. 하지만 사실, 2-SAT 자체는 NP-complete이 아니며, 다항시간 내에 해결된다. &lt;br /&gt;
&lt;br /&gt;
또한 어떤 문제에 대해 NP-complete 증명을 할 때 일반 SAT 대신 3-SAT를 기준 문제로 사용할 수 있다. 이때 3-SAT를 기준으로 사용하는 이유는 모든 절의 길이가 3으로 균일하여 구조가 더욱 규칙적이기 때문이다. 이때 reduction의 방향성은 아래와 같다:&lt;br /&gt;
 SAT &amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt; 3-SAT &amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt; X&lt;br /&gt;
즉, SAT 문제를 3-SAT로 바꿀 수 있으므로, 3-SAT를 증명하고자 하는 X라는 새로운 문제로 reduction하여야 X가 NP-complete임을 증명할 수 있다. 예를 들면, [[Vertex Cover]] 혹은 [[Independent Set]] 문제는 3-SAT을 이용하여 NP-complete임을 증명할 수 있다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6273</id>
		<title>NP-Completeness</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6273"/>
		<updated>2025-12-01T16:39:16Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Reduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#NP-Completeness|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
어떠한 문제에 대해 충분히 빠른 알고리즘을 찾지 못한 이유를 설명하고자 할때, 그 방식은 세 가지 중 하나이다:&lt;br /&gt;
# 내가 문제를 잘 못풀어서. → 가오가 상함.&lt;br /&gt;
# 해당 문제의 lower bound를 증명. → 지루하고 현학적임.&amp;lt;ref&amp;gt;하지만 일반적인 문제에 대해 lower bound 증명은 극도로 어렵다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 내 잘못이 아니라, 세상의 그 누구도 풀 수 없는 문제다. → 간단함.&lt;br /&gt;
사실 어떤 문제를 해결하고자 할때, 이를 풀기 위한 다항시간 알고리즘을 찾을 수 없는 경우가 있다. 하지만 exponential-time lower bound 증명은 현재 기술로 거의 불가능하므로 이러한 문제들이 “진짜로 어려운지” 증명할 방법이 없었다. 하지만 Stephen Cook과 Richard Karp는 “어떤 문제가 다른 어려운 문제와 본질적으로 동일한 난이도를 가진다”는 개념을 만들었고, 이것이 바로 NP-completeness이다.&lt;br /&gt;
&lt;br /&gt;
==Problems==&lt;br /&gt;
NP-Completeness에 대해서 서술하기 위해서는 먼저 문제(problem)가 무엇인지 정의해야 한다. 문제란 일반화된 질문(general question)으로서, 아래의 두 요소로 이루어져 있다:&lt;br /&gt;
# 입력의 종류와 제약(Parameters of the input)&lt;br /&gt;
# 무엇이 “정답”인지 조건을 명시한 것(conditions on a satisfactory answer)&lt;br /&gt;
즉, 입력과 출력의 조건을 정의한 것이 &#039;문제&#039;이다. 또한 인스턴스(instance)는 해당 문제의 구체적인 입력을 의미한다. 더 쉽게 말하면, 특정 입력값으로 완전히 명시된 문제이다. 예를 들어, 정렬 문제는 아래와 같은 입력과 출력을 가진다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;a_1, ..., a_n&amp;lt;/math&amp;gt;으로 이루어진 수열&lt;br /&gt;
 출력: 해당 수열을 재배열하여 &amp;lt;math&amp;gt; a&#039;_1 \le a&#039;_2 \le ... \le a&#039;_n&amp;lt;/math&amp;gt;이 되도록 하는 것&lt;br /&gt;
이 경우, 인스턴스는 {3,5,2,7,4,8,1}과 같이 구체적으로 제시된 특정 순열이다. 또한 결정 문제(Decision Problems)는 답이 “예/아니오(yes/no)”로만 나오는 문제이다. 예를 들어 [[Minimum Spanning Trees|MST]] 문제는 출력이 &amp;quot;예/아니오&amp;quot;로 정의되지 않으므로 정렬 문제가 아니지만, &amp;quot;주어진 그래프 G와 정수 k에 대해 비용이 k 이하인 MST가 존재하는가?&amp;quot;는 결정 문제에 해당한다.&amp;lt;br&amp;gt;&lt;br /&gt;
이때 NP-Completeness는 결정 문제에 대해 주로 적용되므로, 해당 문서에서의 모든 문제들은 결정 문제 형식으로 통일하여 다룬다.&lt;br /&gt;
&lt;br /&gt;
==Reduction==&lt;br /&gt;
Reduction이란 주어진 문제를 다른 문제로 변환하여 푸는 것을 의미한다. 예를 들어 A라는 가상의 문제를 B를 이용하여 풀고 싶다면, 아래와 같은 절차를 따를 수 있다:&lt;br /&gt;
# A(X)와 같이 인스턴스 X가 주어졌다고 가정하자.&lt;br /&gt;
# X를 Y라는 B에 대한 인스턴스로 변환한다.&lt;br /&gt;
# B(Y)를 풀면, 이를 A(X)의 답으로 사용할 수 있다. &lt;br /&gt;
이러한 과정 자체가 reduction이다. 이때 올바른 reduction이 진행되었다면, 변환이 수행되어도 정답이 변하지 않아야 한다. 이때 reduction을 잘 구성한다면 두 문제의 난이도를 비교할 수 있다. 이를 위해 아래와 같은 기본적인 가정이 필요하다. &lt;br /&gt;
 X → Y를 변환하는 데 O(P(n)) 시간이 걸린다.&lt;br /&gt;
 B(Y)은 O(P&#039;(n&#039;))의 시간 복잡도를 가진다. &lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore&amp;lt;/math&amp;gt; A(X)는 O(P(n)+P&#039;(n&#039;))의 시간 복잡도를 가진다.&lt;br /&gt;
이때 n은 입력 인스턴스 X의 크기이며, P(n)은 변환 비용에 해당한다. 이때 중요한 것은 변환 비용 O(P(n))이 항상 다항 시간이라는 것이다. 이는 아래의 명제를 성립시킨다:&lt;br /&gt;
 A → B이면 A&amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt;p B 이며, B는 A보다 더 빨라질 수 없다.&lt;br /&gt;
이는 hardness 관점에서 A가 다항시간에 해결되지 않는 문제라고 할 때, B가 다항시간 내에 해결된다면 A 또한 다항 시간 내에 해결될 수 있기 때문이다. 따라서 주어진 문제 B가 다항시간에 해결되지 않는 것을 증명하기 위해서는 이미 다항시간 내에 해결될 수 없다는 것이 증명된 문제 A를 B로 A → B와 같이 reduction하여 해결할 수 있다.&lt;br /&gt;
&lt;br /&gt;
==[[Satisfiability Problem]]==&lt;br /&gt;
SAT(Satisfiability Problem)는 컴퓨터 과학 이론에서 가장 유명한 NP-complete 문제이며, 전 세계의 알고리즘 전문가들이 빠른 알고리즘(다항시간)을 찾으려 했지만 실패했다. SAT를 빠르게 풀 수 있으면 P = NP가 되어버리며, NP 문제들이 전부 빠르게 풀려 암호 시스템 대부분이 붕괴한다. &lt;br /&gt;
&lt;br /&gt;
[[Satisfiability Problem|SAT]]에 대한 자세한 내용은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6170</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6170"/>
		<updated>2025-11-24T20:23:43Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Universal Turing Machine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 언어 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal 튜링 머신이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 universal 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다. 따라서 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 실제로 존재할 수 없으며, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다.&lt;br /&gt;
&lt;br /&gt;
이때 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;가 decidable하기 위해서는 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;와 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;의 여집합이 모두 recognizable해야 한다. 이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 recognizable하므로, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;의 여집합은 unrecognizable하다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6169</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6169"/>
		<updated>2025-11-24T20:18:37Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Undecidablity of Universal TM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 튜링 머신을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 튜링머신 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal TM이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 universal 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다. 따라서 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 실제로 존재할 수 없으며, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다.&lt;br /&gt;
&lt;br /&gt;
이때 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;가 decidable하기 위해서는 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;와 &amp;lt;math&amp;gt;L(D)&amp;lt;/math&amp;gt;의 여집합이 모두 recognizable해야 한다. 이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 recognizable하므로, &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;의 여집합은 unrecognizable하다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6168</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6168"/>
		<updated>2025-11-24T19:48:53Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Undecidability */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 튜링 머신을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 튜링머신 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal TM이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다.&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6167</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6167"/>
		<updated>2025-11-24T19:48:22Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Undecidability */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다. &lt;br /&gt;
&lt;br /&gt;
==Universal Turing Machine==&lt;br /&gt;
아래와 같은 튜링 머신을 고려해보자:&lt;br /&gt;
 &amp;lt;math&amp;gt;A_{TM}=\{\langle M, w\rangle|M\,\,\, acept \,\,\, w\}&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 튜링머신 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 입력으로 받은 &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt; 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 재구성한다. &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하며, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 accept/reject하면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 이에 따라 accept/reject한다. 물론 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 무한 루프면 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;도 멈추지 않고 무한 루프를 돈다. &lt;br /&gt;
이때, 다른 모든 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;을 입력받아 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해 시뮬레이션하는 튜링 머신 &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;를 Universal TM이라고 한다. &lt;br /&gt;
&lt;br /&gt;
===Undecidablity of Universal TM===&lt;br /&gt;
이때 &amp;lt;math&amp;gt;A_{TM}&amp;lt;/math&amp;gt;은 undecidable하다. 이를 증명하기 위해서는 아래와 같은 decider &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;가 있다고 가정해야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M, w\rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept하면 → H accepts&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 reject하면 → H rejects&lt;br /&gt;
      &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 loop해도 &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;는 반드시 accept/reject 중 하나를 출력한다.&lt;br /&gt;
하지만 이는 모순을 일으킨다. 또한 아래와 같은 튜링머신 &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;를 만들어야 한다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;\langle M \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
 동작: &amp;lt;math&amp;gt;H(\langle M, \langle M\rangle \rangle)&amp;lt;/math&amp;gt;을 실행한다.&amp;lt;ref&amp;gt;“M은 자기 자신을 문자열로 인코딩한 입력을 accept하는가?”를 H에게 물어본 것이다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 출력: &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;의 답을 뒤집는다. &lt;br /&gt;
        H가 accept → D는 reject&lt;br /&gt;
        H가 reject → D는 accept&lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore\,\,\, D(M)=not \,\,\, H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 &amp;quot;M 자기 자신에 대해 M이 무엇을 하는지&amp;quot;를 무조건 반대로 따라 한다. 이때 &amp;lt;math&amp;gt;D(\langle D \rangle)&amp;lt;/math&amp;gt;을 실행하면, 이는 모순을 일으킨다. 먼저 &amp;lt;math&amp;gt;D(\langle D \rangle)=accept&amp;lt;/math&amp;gt;이면, &amp;lt;math&amp;gt;H(\langle M, \langle M \rangle \rangle)&amp;lt;/math&amp;gt;은 D가 자기 자신을 accept한다고 판단하였으므로, &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;는 이를 뒤집어 reject해야 하기 때문이다. 이는 모순을 일으키며, &amp;lt;math&amp;gt;D(\langle D \rangle)=reject&amp;lt;/math&amp;gt;일 때에도 마찬가지로 모순을 일으킨다.&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6166</id>
		<title>Turing Machines</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Turing_Machines&amp;diff=6166"/>
		<updated>2025-11-24T16:45:30Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Relationship between Classes of Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:계산 이론 개론]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[계산 이론 개론# Turing Machines|계산 이론 개론]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
튜링 머신(Turing Machine)은 계산의 본질을 단순한 모델로 표현한 이론적 컴퓨터 모델이다. 튜링 머신은 모든 계산 가능한 것을 정의하는 최초의 이론적 모델로서 현대 컴퓨터의 이론적 토대를 마련했다. 또한 , 튜링 머신을 통해 계산 가능성의 한계를 증명하고, 어떤 언어의 능력을 평가하는 &#039;튜링 완전성&#039; 개념의 기반이 되었다. &lt;br /&gt;
&lt;br /&gt;
==Basic Concepts of Turing Machines==&lt;br /&gt;
튜링 머신의 핵심적인 구성요소는 Control unit, Tape, Read/Write Head이다:&lt;br /&gt;
# Control unit: Control unit은 유한한 상태 집합 Q 중 하나의 상태에 머물며 작동한다. &lt;br /&gt;
#* 현재 상태를 기억하고 다음 동작을 결정하는 역할을 한다.&lt;br /&gt;
# Tape: 무한히 긴 1차원 테이프이며, 칸에는 하나의 기호(symbol)를 쓸 수 있다.&lt;br /&gt;
#* 이때 사용할 수 있는 기호들의 집합을 테이프 알파벳&amp;lt;math&amp;gt;(\Gamma)&amp;lt;/math&amp;gt;이라고 한다.&lt;br /&gt;
# Read/Write Head: 한 번에 한 칸씩 왼쪽(L) 또는 오른쪽(R)으로 이동하면서, 현재 칸의 기호를 읽거나 바꾼다.&lt;br /&gt;
튜링 머신은 위의 구성 요소를 바탕으로 유한한 개수의 명령(전이 함수, transition function)을 따라서 작동한다.&lt;br /&gt;
&lt;br /&gt;
===Mathematical Formalization===&lt;br /&gt;
튜링 머신은 아래와 같은 7-튜플(&amp;lt;math&amp;gt;Q, \Sigma, , \Gamma, \delta, q_0, q_{accept}, q_{reject}&amp;lt;/math&amp;gt;)을 통해서 정의된다:&lt;br /&gt;
# &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;: 상태들의 유한 집합(states)&lt;br /&gt;
# &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;: 입력 알파벳 (input alphabet)&amp;lt;ref&amp;gt;이때 공백 문자는 포함하지 않는나.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;: 테이프 알파벳 (tape alphabet), &amp;lt;math&amp;gt;\Sigma \in \Gamma, \textvisiblespace \in \Gamma&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;&amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;는 공백 문자를 의미한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;: 전이 함수(transition function)이며, 아래와 같은 형식이다:&amp;lt;br&amp;gt;&amp;lt;math&amp;gt;\delta: Q\times\Gamma\rightarrow Q\times\Gamma\times\{L,R\}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;: 시작 상태(start state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{accept}&amp;lt;/math&amp;gt;: 받아들이는 상태(accept state)&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{reject}&amp;lt;/math&amp;gt;: 거부 상태(reject state)&amp;lt;ref&amp;gt;단, &amp;lt;math&amp;gt;q_{accept}\neq q_{reject}&amp;lt;/math&amp;gt;를 만족한다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
튜링 머신의 전이 함수를 풀어 설명하면, 아래와 같은 형태이다:&lt;br /&gt;
 “만약 현재 상태가 q이고, 테이프에서 기호 a를 읽었다면,&lt;br /&gt;
이를 기호 b로 바꾸고, 머리를 L 또는 R로 한 칸 이동한 뒤, 상태를 r로 바꿔라.”&lt;br /&gt;
즉, 명령은 (q, a) → (r, b, L/R)과 같이 정의된다고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
튜링 기계의 형식적 정의는 사람마다 약간씩 다를 수 있다. 예를 들어, reject 상태를 따로 두지 않고 accept 상태 만을 정의하고 나머지는 자동으로 reject로 간주하기도 한다. 또한 테이프의 왼쪽 끝 표시(left-end marker)를 따로 두어 기계가 더 이상 왼쪽으로 이동하지 않도록 제한하기도 하기도 한다. 해당 위키에서 참조하는 Michael Sipser의 『Introduction to the Theory of Computation, Third Edition』에서도 아래와 같이 추가적인 정의를 추가한다:&lt;br /&gt;
 &amp;quot;어떤 구성 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;q\in \{q_{accept},q_{reject}\}&amp;lt;/math&amp;gt;일 때, 반드시 하나의 후속 구성(successor configuration)을 가진다.&amp;quot;&lt;br /&gt;
이는 모호하지 않은(결정적) 동작을 보장하여 결정적 튜링 머신(Deterministic Turing Machine)을 전제로 하기 위한 것이다.&lt;br /&gt;
&lt;br /&gt;
==Configurations of Turing Machines==&lt;br /&gt;
튜링 머신에서의 구성(Configuration)이란 튜링 머신의 현재 상태 전체를 나타내는 한 단위 상태이다. 이는 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 &amp;lt;math&amp;gt;q \in Q&amp;lt;/math&amp;gt;는 현재 튜링 머신이 위치한 상태를 나타낸다. 또한 &amp;lt;math&amp;gt;u \in \Gamma*&amp;lt;/math&amp;gt;는 헤드의 왼쪽에 있는 테이프 내용을, &amp;lt;math&amp;gt;v\in \Gamma^+&amp;lt;/math&amp;gt;는 헤드의 오른쪽에 있는 테이프 내용을 의미한다. 예를 들어 &amp;lt;math&amp;gt;(u,q,v)= (101, q_3, 0\textvisiblespace\textvisiblespace\textvisiblespace)&amp;lt;/math&amp;gt;와 같이 구성이 주어지면, 현재 상태는 &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt;이며, 테이프 왼쪽에는 &amp;quot;101&amp;quot;이, 오른쪽에는 &amp;quot;0&amp;quot;과 공백이 있다는 것을 의미한다. 이때 공백은 테이프 위에서 아무것도 적혀 있지 않은 칸을 의미하며, 입력 이외의 칸을 나타내기 위해 사용하는 심볼이다. 이때 중요한 것은 오른쪽 끝의 공백은 몇 개가 있든 동일한 구성으로 간주한다. 이는 아래와 같이 나타낼 수 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(u,q,v\textvisiblespace^n)=(u,q,v\textvisiblespace^m) for\,\, n,m\ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
이는 튜링 기계가 “무한히 많은 빈 칸”을 상정하므로, 불필요한 공백 개수는 의미가 없기 때문이다. &lt;br /&gt;
&lt;br /&gt;
아래 표는 튜링 머신이 계산을 시작하거나 끝내는 특수 상태들을 열거한 것이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구성 유형&lt;br /&gt;
!형태&lt;br /&gt;
|-&lt;br /&gt;
|시작 구성 (Start configuration)&lt;br /&gt;
|&amp;lt;math&amp;gt;q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Accept 구성 (Accepting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{accept}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Reject 구성 (Rejecting)&lt;br /&gt;
|&amp;lt;math&amp;gt;uq_{reject}v&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
이때 어떤 튜링 머신 M이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 accept한다고 하는 것은 아래 조건들을 만족하는 구성열(sequence)이 존재할 때이다:&lt;br /&gt;
# &amp;lt;math&amp;gt;C_1=q_0w&amp;lt;/math&amp;gt;&lt;br /&gt;
# 중간의 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;들은 accept/reject가 아닌 일반 상태&lt;br /&gt;
# 각 &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;는 &amp;lt;math&amp;gt;C_{i+1}&amp;lt;/math&amp;gt;을 yield함&lt;br /&gt;
# 마지막 &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;는 accepting configuration&lt;br /&gt;
즉, &amp;lt;math&amp;gt;C_1 \Rightarrow C_2 \Rightarrow \cdots \Rightarrow C_k&amp;lt;/math&amp;gt;이고, &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;가 accept 상태에 도달하면 문자열 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;는 accept된다.&lt;br /&gt;
&lt;br /&gt;
===The Yields Relation===&lt;br /&gt;
튜링 머신이 한 단계에서 다음 단계로 이동하는 규칙은 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;와, 해당 튜링머신의 구성을 통해 정의된다. 예를 들어,&lt;br /&gt;
 Configuration &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;C2&amp;lt;/math&amp;gt;&lt;br /&gt;
는 주어진 튜링 머신의 상태가 단 한번의 동작으로 &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;로 바뀐다는 것을 의미한다. 이때, 이 yield 관계(relation)는 전이함수 &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;에 의해서 결정된다. 이때 yield 관계는 아래와 같이 구분된다:&lt;br /&gt;
# 왼쪽으로 이동 (Move Left)&lt;br /&gt;
#* &amp;lt;math&amp;gt;q_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;q_jcv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;테이프의 맨 왼쪽에서 왼쪽으로 가려는 경우(즉, 왼쪽이 없음)를 의미한다.&amp;lt;/ref&amp;gt;: 단순히 머리 위치를 그대로 두고, 공백을 유지한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uq_jacv,\,\,if\,\, \delta(q_i,b)=(q_j,c,L)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고 왼쪽으로 이동하여 왼쪽 기호 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 위로 헤드를 옮긴다.&lt;br /&gt;
# 오른쪽으로 이동 (Move Right)&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ib&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_j\textvisiblespace,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;오른쪽으로 이동했는데, 오른쪽에 아무것도 없는 경우(끝까지 간 경우)를 의미한다.&amp;lt;/ref&amp;gt;: 공백(blank)을 새로 하나 추가해야 한다.&lt;br /&gt;
#* &amp;lt;math&amp;gt;uaq_ibv&amp;lt;/math&amp;gt; yields &amp;lt;math&amp;gt;uacq_jv,\,\,if\,\, \delta(q_i,b)=(q_j,c,R)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;를 &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;로 바꾸고, 한 칸 오른쪽으로 이동한다.&lt;br /&gt;
&lt;br /&gt;
==Deciders and Languages==&lt;br /&gt;
어떤 튜링 머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;이 decider라고 불리기 위해서는 입력 문자열에서 출발했을 때, 영원히 멈추지 않고 돌기만 하는 경우가 없어야 한다. 즉, 어떤 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서도 반드시 Accepting 혹은 Rejecting 구성에 도달해야 한다. 이때 모든 튜링 기계가 Decider인 것은 아니며, 어떤 기계는 특정 입력에서 무한 루프에 빠질 수도 있다. 이러한 경우를 recognizer라고 부른다. 이에 따라 튜링 기계가 인식(recognize)하거나 결정(decide)할 수 있는지 여부에 따라 언어(Language)의 종류를 구분할 수 있다. 아래는 이를 정리한 표이다:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!구분&lt;br /&gt;
!정의&lt;br /&gt;
!특징&lt;br /&gt;
|-&lt;br /&gt;
|Turing-recognizable&lt;br /&gt;
|어떤 튜링 기계 M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|입력이 언어에 속하면 Accept, &lt;br /&gt;
속하지 않으면 멈추지 않고 무한 루프 가능&lt;br /&gt;
|-&lt;br /&gt;
|Turing-decidable&lt;br /&gt;
|어떤 Decider M이 있어서, &lt;br /&gt;
L=L(M) 일 때&lt;br /&gt;
|모든 입력에 대해 반드시 멈추며, &lt;br /&gt;
Accept 또는 Reject 중 하나 출력&lt;br /&gt;
|}&lt;br /&gt;
이때 모든 Decidable 언어는 Recognizable 언어이지만, 그 반대(Recognizable → Decidable)는 성립하지 않는다. 이때 중요한 것은, &amp;quot;모든 정규 언어가 튜링 기계로 결정 가능하다(decidable)&amp;quot;하다는 것이다. 언어를 입력받을 때, 해당 입력이 끝나는 것은 공백(blank symbol)을 통해 판단한다. 즉, 입력을 다 읽고 처음 만나는 blank가 입력의 끝이다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Hacking==&lt;br /&gt;
튜링 머신은 프로그래밍 언어처럼 다룰 수 있으며, 해당 문단에서는 튜링 머신을 활용한 여러 테크닉에 대해 설명한다. 튜링 머신도 프로그래밍 언어처럼 패턴과 관용구(idiom)가 존재하며, 입력의 끝을 찾거나, 테이프의 처음으로 돌아가거나, 특정 영역을 표시하는 등의 “기본 동작”들을 잘 다루면 복잡한 계산을 구현할 수 있다.&lt;br /&gt;
&lt;br /&gt;
먼저, 입력의 오른쪽 끝을 찾기 위해서는 처음으로 등장하는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;를 찾으면 된다. 그 이유는 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;이 입력 알파벳에는 포함되지 않지만, 튜링 머신의 테이프 알파벳에는 포함되기 때문이다. 이로 인해 튜링 머신의 테이프에는 입력 문자열이 적혀 있고, 테이프의 끝은 &amp;lt;math&amp;gt;\textvisiblespace&amp;lt;/math&amp;gt;으로 채워져 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
반대로 테이프의 맨 왼쪽으로 돌아가기 위해서는 첫 단계에서 현재 보고 있는 기호를 기억(finite control)하고,&lt;br /&gt;
그 자리를 특별한 마커(symbol)로 바꾼다. 이후 왼쪽으로 계속 이동하다가 그 마커를 만나면 “출발점”을 찾을 수 있다. &lt;br /&gt;
&lt;br /&gt;
테이프의 칸을 “표시(mark)”하는 방법을 확장하면, 테이프 알파벳의 각 기호마다 표시(mark) 여부에 따라 어떤 셀을 “방문했음” 혹은 “처리했음”으로 표시할 때 활용할 수 있다. &lt;br /&gt;
&lt;br /&gt;
이 외에도 표시(mark)를 활용하는 방법으로는 스크래치 영역(scratch) 영역을 임의로 만드는 것이 있다. 예를 들어 프로그래밍에서의 “임시 변수 메모리 영역”을 튜링 머신에서도 활용하기 위해서는 입력의 오른쪽 끝을 찾은 뒤, 그 옆에 특별한 마커를 써서 임시 작업 공간을 확보할 수 있다. 이러한 임시 작업 공간은 필요시 가장 오른쪽으로 가서 해당 마커를 찾아 사용될 수 있다.&amp;lt;br&amp;gt;&lt;br /&gt;
스크래치 영역은 마치 호출 스택(call stack)과 같이 활용될 수도 있다. 현재 상태(복귀할 위치)를 스택에 저장하고, 서브루틴의 첫 상태로 점프한 후 끝나면 스택에 저장된 복귀할 위치로 돌아오는 구조를 만들면 된다.&amp;lt;br&amp;gt;&lt;br /&gt;
또한 스크래치 영역의 일부를 레지스터 처럼 사용하여 입력의 일부 값을 복사해서 저장하거나, 연산 중간 결과를 보관할 수도 있다.&lt;br /&gt;
&lt;br /&gt;
==Turing Machine Variants==&lt;br /&gt;
튜링 머신은 다양한 확장 버전이 존재한다. 이는 아래와 같다:&lt;br /&gt;
# Multi-track tape: 표준 TM 테이프의 각 칸이 하나의 기호만 저장한다면, 멀티트랙 TM 테이프는 각 칸이 여러 기호 묶음을 저장한다. &lt;br /&gt;
# Two-way infinite tape: 테이프가 오른쪽뿐만 아니라 왼쪽 방향으로도 무한히 뻗어 있다. &lt;br /&gt;
# Multiple tapes with independent heads: 테이프 여러 개이며 각각에 대한 헤드가 따로 존재하여 움직인다.&lt;br /&gt;
# Nondeterminism: 여러 선택지를 동시에 탐색하는 튜링 머신이다.&lt;br /&gt;
이때 중요한 것은 튜링머신을 여러 방식으로 강화(멀티트랙, 양방향 테이프, 여러 테이프, 비결정성)해도 ‘어떤 언어를 인식할 수 있는가 / 결정할 수 있는가’라는 능력은 변화하지 않는다는 것이다. 단지 시간과 공간적인 측면에서의 효율성만 달라진다.&lt;br /&gt;
&lt;br /&gt;
==TMs as Language Enumerators==&lt;br /&gt;
튜링머신은 입력을 받아 accept/reject하는 방식으로 언어를 정의할 수도 있지만, 반대로 “언어의 모든 문자열을 하나씩 출력해 나가는 방식”으로도 언어를 정의할 수 있다. 이러한 방식으로 사용되는 기계를 enumerator라고 한다. 이는 테이프 두개를 사용하여 구성된다:&lt;br /&gt;
# 출력 테이프: 오른쪽으로만 움직이며 출력을 하는데에 사용된다. 또한 한번 쓰면 덮어 쓸 수 없다.&lt;br /&gt;
# 작업 테이프: 계산을 하는 데에 사용된다.&lt;br /&gt;
튜링 머신은 처음에 두 테이프가 모두 비어있을 떄 시작한다. 이때 튜링 머신이 특수기호 # 을 출력테이프에 찍을 때마다 “한 개의 문자열을 다 출력했다”고 간주한다. 즉, 출력 형식은 아래와 같다:&lt;br /&gt;
 w1 # w2 # w3 # ...&lt;br /&gt;
이렇게 나열된 문자열들의 모임이 해당 튜링 머신이이 열거하는 언어이다. 이때 어떤 언어 L이 Turing-enumerable하다는 것은 어떤 튜링 머신이 L의 모든 가능한 문자열을 출력해낼 수 있다는 것을 의미한다. 이때 중요한 것은 Turing-recognizable과 Turing-enumerable은 동치라는 것이다. 또한 아래의 관계가 성립한다:&lt;br /&gt;
 Turing-decidable &amp;lt;math&amp;gt;\subset&amp;lt;/math&amp;gt; Turing-recognizable &amp;lt;math&amp;gt;\equiv&amp;lt;/math&amp;gt; Turing-enumerable&lt;br /&gt;
이는 decider는 모든 입력에서 halt하는 반면, recognizer는 정답이 맞으면 halt하고 accept, 틀리면 halt하거나 loop해도 되기 때문이다. 즉, decider는 모든 입력에 대해 항상 halt하므로 recognizer의 조건을 더욱 강하게 충족한다. &lt;br /&gt;
&lt;br /&gt;
==Using TMs to Compute Functions==&lt;br /&gt;
튜링머신은 단순히 “accept or reject”만 하는 기계가 아니다. 튜링머신은 입력이 주어지면 어떤 출력을 만들어내는 계산 장치로도 사용할 수 있다. 예를 들어, 함수 &amp;lt;math&amp;gt;f(w)=x&amp;lt;/math&amp;gt;를 계산하기 위해서는 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 어떤 튜링 머신 M을 사용하여 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 얻으면 된다. 하지만 TM이 모든 입력에서 반드시 halt하는 것이 아니기 때문에&lt;br /&gt;
튜링머신이 계산하는 함수는 부분 함수(partial function)일 수 있다. halt하지 않으면 튜링머신이 무한루프에 빠지고, 이는 출력이 만들어지지 않는 상황이기 때문이다.&lt;br /&gt;
&lt;br /&gt;
일반적인 함수 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 아래의 조건을 만족하는 &amp;lt;math&amp;gt;\Sigma*\times\Sigma*&amp;lt;/math&amp;gt;의 부분집합으로 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(w,x)\in f\land (w,y)\in f\rightarrow x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 total function &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 모든 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;에 대해서 어떤 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 존재하는 것으로 정의된다. &lt;br /&gt;
&lt;br /&gt;
튜링머신에 의해서 계산되는 함수 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;은 아래와 같이 정의된다:&lt;br /&gt;
 &amp;lt;math&amp;gt;f(M)=\{(w,x)|M&amp;lt;/math&amp;gt;이 입력 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 주었을 때 halt하고 accept했으며, accept 순간 테이프의 내용이 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;인 경우&amp;lt;math&amp;gt;\}&amp;lt;/math&amp;gt;&lt;br /&gt;
즉, &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;이 &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;를 입력으로 받아 accept 상태로 멈추고 그 순간 테이프가 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 담고 있다면 그때 &amp;lt;math&amp;gt;(w,x)&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;f(M)&amp;lt;/math&amp;gt;의 입력/출력 쌍이 된다는 것이다. 하지만 튜링머신에서 출력 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;가 &amp;lt;math&amp;gt;x\notin \Sigma*&amp;lt;/math&amp;gt;이라면 이는 유효한 입력/출력 쌍이 되지 않는다. 이때 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 어떤 튜링머신 &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;에 의해서 partial function이라면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 computable partial function이라고 한다. 또한 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;가 total이고, 튜링머신이 모든 입력에서 halt해 결과를 준다면 &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;는 total computable function이다.&lt;br /&gt;
&lt;br /&gt;
==Church-Turing Thesis==&lt;br /&gt;
Church-Turing Thesis는 어떤 합리적인(reasonable)” 알고리즘이든, 그것이 언어 L을 결정하거나 인식하거나 함수를 계산하는 방식이든, 결국 그 능력은 튜링머신으로 표현 가능한 계산 능력과 완전히 동일하다는 것을 의미한다. 이때 “Reasonable&amp;quot;이라는 말의 의미는 아래와 같다:&lt;br /&gt;
# 계산 기계는 유한한 규칙으로 동작하고, 필요한 만큼 확장 가능한 저장소(메모리)를 사용한다.&lt;br /&gt;
#* 실제 컴퓨터, RAM, 종이와 연필, 계산기 등 모두가 이에 해당한다.&lt;br /&gt;
#* 튜링머신도 테이프가 무한하다고 가정한다.&lt;br /&gt;
# 알고리즘은 기본 연산들의 유한한 집합으로 표현될 수 있다.&lt;br /&gt;
#* 우리가 짜는 프로그램이든, 사람이 수행하는 알고리즘이든 “유한한 규칙, 단계, 연산”으로 되어 있어야 한다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 유한한 상태·전이 표로 정의된다.&lt;br /&gt;
# 각 기본 연산은 유한 시간 안에 수행되며 유한한 저장을 사용한다.&lt;br /&gt;
#* 무한한 계산 단계를 한 번에 수행하는 “초능력” 연산은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신도 한 스텝씩 움직이며 작동한다.&lt;br /&gt;
# 각 기본 연산의 효과는 예측 가능해야 한다.&lt;br /&gt;
#* 같은 상태·조건에서 항상 같은 결과를 내야하며, 비결정적·무작위적 초능력은 허용되지 않는 다는 것을 의미한다.&lt;br /&gt;
#* 튜링머신은 완전히 기계적·결정적 규칙으로 작동한다.&lt;br /&gt;
따라서 결론적으로 Church-Turing Thesis에 대해서 설명하면 아래와 같다:&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 결정(decide)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 언어 L을 어떤 알고리즘이 인식(recognize)할 수 있다면 → TM도 할 수 있다&lt;br /&gt;
* 어떤 알고리즘이 어떤 partial function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
* 어떤 알고리즘이 어떤 total function을 계산한다면 → TM으로도 계산 가능&lt;br /&gt;
즉, 컴퓨터로 할 수 있는 계산은 튜링머신으로 할 수 있는 계산과 정확히 동일하다. 이는 &amp;quot;알고리즘&amp;quot; 자체가 엄밀하지 않은 개념이기에 수학적으로 증명되지 않은 명제이지만, 경험적으로 매우 강력하게 지지된다.&lt;br /&gt;
&lt;br /&gt;
==Encoding Objects as Strings==&lt;br /&gt;
컴퓨터 이론(특히 decidability/complexity)은 모든 입력을 문자열 형태로 다루기 때문에, [[Nondeterministic Finite Automata |DFA]]나 튜링 머신과 같은 복잡한 “기계”도 문자열 형태로 인코딩해야 한다. 이는 튜링머신은 “입력 테이프”에 문자열만을 읽어 들이며, 컴퓨터 이론에서는 이런 &amp;quot;기계&amp;quot;들을 입력으로 분석하는 문제를 다루기 때문이다. 예를 들어 아래는 DFA의 transition function을 튜플들의 나열로 표현한 것이다.&lt;br /&gt;
 &amp;lt;math&amp;gt;(q_1\#a_1\#b_1)(q_2\#a_2\#b_2)\cdots(q_n\#a_n\#b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;는 DFA의 상태를, &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;는 입력 심볼을, &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;는 다음 상태를 의미한다. 이때 중간의 &amp;lt;math&amp;gt;\#&amp;lt;/math&amp;gt;은 객체를 구분하기 위한 구분자로서 사용되었다. 이를 통해서 튜링머신이 이 문자열을 &amp;quot;읽고 파싱함&amp;quot;으로써 DFA의 구조를 이해하는데 사용할 수 있다. 이때 상태나 입력 심볼이 많아질수록, 알파벳으로 표현하면 길이가 매우 길어진다. 따라서 이를 단순화 하기 위해서 상태/심볼을 이진수로 표현하여야 한다. 예를 들면 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(q1 \rightarrow 0000)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(a1 \rightarrow 00)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(b1 \rightarrow 0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(0000\#00\#0001)&amp;lt;/math&amp;gt;&lt;br /&gt;
이러한 방식으로 모든 전이함수를 이진수로 인코딩할 수 있다. 이와 같은 방식으로 DFA의 입력 테이프에 올라가는 문자열을 길이 제한 없이 표현하기 위해 입력 문자열도 아래와 같이 인코딩 가능하다:&lt;br /&gt;
 &amp;lt;math&amp;gt;(00\#01\#10\#00\#00\#11)&amp;lt;/math&amp;gt;&lt;br /&gt;
이때 기계, 그래프, 정수 등의 어떤 객체 &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;를 문자열로 나타낸 것을 &amp;lt;math&amp;gt;\langle x\rangle&amp;lt;/math&amp;gt;과 같이 표현할 수 있다. 예를 들어, &amp;lt;math&amp;gt;\langle DFA\rangle&amp;lt;/math&amp;gt;는 DFA를 문자열로 encode한 것이고, &amp;lt;math&amp;gt;\langle G\rangle&amp;lt;/math&amp;gt;은 그래프를 문자열 형태로 나타낸 것이다. &lt;br /&gt;
&lt;br /&gt;
==Decidability and Complexity==&lt;br /&gt;
문제의 결정가능성(decidability)&amp;lt;ref&amp;gt;문제가 이론적으로 해결 가능한지의 여부를 의미한다.&amp;lt;/ref&amp;gt;에 대해서 고려할 때에는 인코딩의 길이와 방식같은 세부적인 사항이 문제되지 않는다. 이는 입력의 길이와 형식이 문제 풀이의 가능 여부에 영향을 미치지 않기 때문이다. 하지만 문제의 복잡도(complexity)를 고려할 때에는 인코딩의 길이가 큰 영향을 끼친다. 이는 인코딩의 길이가 입력 크기 n에 대해 직접적으로 영향을 미치기 때문이다. 따라서 이 경우에는 엄격하게 binary encoding을 규정해야 한다.&lt;br /&gt;
&lt;br /&gt;
===Relationship between Classes of Languages===&lt;br /&gt;
아래는 컴퓨터 이론에서 다루는 언어(문자열 집합)들의 계층 관계를 나타낸 것이다:&lt;br /&gt;
 Regular &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; CFL &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Decidable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Recognizable &amp;lt;math&amp;gt;\subseteq&amp;lt;/math&amp;gt; Other&lt;br /&gt;
안쪽일수록 단순한 기계로 인식 가능한 언어이고, 바깥으로 갈수록 더 강력한 계산 모델이 필요하다. 이는 단순히 “복잡성의 차이”가 아니라, 바로 결정 가능성(decidability) 과 직접적으로 연결된다. 언어 클래스가 바깥으로 갈수록 “결정 가능한 것”에서 점점 벗어나기 때문이다. 아래는 각 언어들에 대한 설명이다:&lt;br /&gt;
# Regular, Context-Free 언어: 둘 다 결정 가능(decidable)&lt;br /&gt;
#* Regular 언어 → DFA/NFA는 항상 결정 가능&lt;br /&gt;
#* Context-Free 언어 → CYK algorithm, deterministic PDA 등으로 항상 결정 가능&lt;br /&gt;
# Decidable 언어: 모든 입력에서 halt 하는 튜링머신이 있는 언어&lt;br /&gt;
#* 따라서 모든 decidable 언어는 알고리즘으로 완전히 판정 가능한 언어들이다.&lt;br /&gt;
# Turing-recognizable 언어: 어떤 입력에 대해 halt하지 않고 무한 loop를 돌 수도 있다.&lt;br /&gt;
# Recognizable 바깥의 언어들: 이는 더 심각한 수준의 undecidable 언어들이며, 어떤 알고리즘도 해당 언어를 인식조차 못한다.&lt;br /&gt;
&lt;br /&gt;
===Undecidability===&lt;br /&gt;
위에서 언급하였듯이, 어떤 언어들은 Turing-recognizable조차 될 수 없는 undeterministic 언어이다. 이는 아래와 같은 논증을 통해 증명될 수 있다:&lt;br /&gt;
# 모든 튜링 머신은 유한한 문자열로 인코딩할 수 있는데, 유한 문자열 집합 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;은 countable이다.&lt;br /&gt;
# 언어는 &amp;lt;math&amp;gt;\Sigma*&amp;lt;/math&amp;gt;의 부분집합이므로, 부분집합 전체는 &amp;lt;math&amp;gt;\mathcal{P}(\Sigma*)&amp;lt;/math&amp;gt;이므로 uncountable하다.&lt;br /&gt;
# 따라서 모든 언어 중 대다수는 튜링 머신으로 인식(recognize)조차 할 수 없다.&lt;br /&gt;
또한 recognizable이지만 decidable은 아닌 언어들이 존재한다는 것은 계산할 수 있는 것에는 본질적 한계가 있다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6272</id>
		<title>NP-Completeness</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6272"/>
		<updated>2025-11-24T06:39:42Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 개요 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#NP-Completeness|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
어떠한 문제에 대해 충분히 빠른 알고리즘을 찾지 못한 이유를 설명하고자 할때, 그 방식은 세 가지 중 하나이다:&lt;br /&gt;
# 내가 문제를 잘 못풀어서. → 가오가 상함.&lt;br /&gt;
# 해당 문제의 lower bound를 증명. → 지루하고 현학적임.&amp;lt;ref&amp;gt;하지만 일반적인 문제에 대해 lower bound 증명은 극도로 어렵다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 내 잘못이 아니라, 세상의 그 누구도 풀 수 없는 문제다. → 간단함.&lt;br /&gt;
사실 어떤 문제를 해결하고자 할때, 이를 풀기 위한 다항시간 알고리즘을 찾을 수 없는 경우가 있다. 하지만 exponential-time lower bound 증명은 현재 기술로 거의 불가능하므로 이러한 문제들이 “진짜로 어려운지” 증명할 방법이 없었다. 하지만 Stephen Cook과 Richard Karp는 “어떤 문제가 다른 어려운 문제와 본질적으로 동일한 난이도를 가진다”는 개념을 만들었고, 이것이 바로 NP-completeness이다.&lt;br /&gt;
&lt;br /&gt;
==Problems==&lt;br /&gt;
NP-Completeness에 대해서 서술하기 위해서는 먼저 문제(problem)가 무엇인지 정의해야 한다. 문제란 일반화된 질문(general question)으로서, 아래의 두 요소로 이루어져 있다:&lt;br /&gt;
# 입력의 종류와 제약(Parameters of the input)&lt;br /&gt;
# 무엇이 “정답”인지 조건을 명시한 것(conditions on a satisfactory answer)&lt;br /&gt;
즉, 입력과 출력의 조건을 정의한 것이 &#039;문제&#039;이다. 또한 인스턴스(instance)는 해당 문제의 구체적인 입력을 의미한다. 더 쉽게 말하면, 특정 입력값으로 완전히 명시된 문제이다. 예를 들어, 정렬 문제는 아래와 같은 입력과 출력을 가진다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;a_1, ..., a_n&amp;lt;/math&amp;gt;으로 이루어진 수열&lt;br /&gt;
 출력: 해당 수열을 재배열하여 &amp;lt;math&amp;gt; a&#039;_1 \le a&#039;_2 \le ... \le a&#039;_n&amp;lt;/math&amp;gt;이 되도록 하는 것&lt;br /&gt;
이 경우, 인스턴스는 {3,5,2,7,4,8,1}과 같이 구체적으로 제시된 특정 순열이다. 또한 결정 문제(Decision Problems)는 답이 “예/아니오(yes/no)”로만 나오는 문제이다. 예를 들어 [[Minimum Spanning Trees|MST]] 문제는 출력이 &amp;quot;예/아니오&amp;quot;로 정의되지 않으므로 정렬 문제가 아니지만, &amp;quot;주어진 그래프 G와 정수 k에 대해 비용이 k 이하인 MST가 존재하는가?&amp;quot;는 결정 문제에 해당한다.&amp;lt;br&amp;gt;&lt;br /&gt;
이때 NP-Completeness는 결정 문제에 대해 주로 적용되므로, 해당 문서에서의 모든 문제들은 결정 문제 형식으로 통일하여 다룬다.&lt;br /&gt;
&lt;br /&gt;
==Reduction==&lt;br /&gt;
Reduction이란 주어진 문제를 다른 문제로 변환하여 푸는 것을 의미한다. 예를 들어 A라는 가상의 문제를 B를 이용하여 풀고 싶다면, 아래와 같은 절차를 따를 수 있다:&lt;br /&gt;
# A(X)와 같이 인스턴스 X가 주어졌다고 가정하자.&lt;br /&gt;
# X를 Y라는 B에 대한 인스턴스로 변환한다.&lt;br /&gt;
# B(Y)를 풀면, 이를 A(X)의 답으로 사용할 수 있다. &lt;br /&gt;
이러한 과정 자체가 reduction이다. 이때 올바른 reduction이 진행되었다면, 변환이 수행되어도 정답이 변하지 않아야 한다. 이때 reduction을 잘 구성한다면 두 문제의 난이도를 비교할 수 있다. 이를 위해 아래와 같은 기본적인 가정이 필요하다. &lt;br /&gt;
 X → Y를 변환하는 데 O(P(n)) 시간이 걸린다.&lt;br /&gt;
 B(Y)은 O(P&#039;(n&#039;))의 시간 복잡도를 가진다. &lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore&amp;lt;/math&amp;gt; A(X)는 O(P(n)+P&#039;(n&#039;))의 시간 복잡도를 가진다.&lt;br /&gt;
이때 n은 입력 인스턴스 X의 크기이며, P(n)은 변환 비용에 해당한다. 이때 중요한 것은 변환 비용 O(P(n))이 항상 다항 시간이라는 것이다. 이는 아래의 명제를 성립시킨다:&lt;br /&gt;
 A → B이면 A&amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt;p B 이며, B는 A보다 더 빨라질 수 없다.&lt;br /&gt;
이는 hardness 관점에서 A가 다항시간에 해결되지 않는 문제라고 할 때, B가 다항시간 내에 해결된다면 A 또한 다항 시간 내에 해결될 수 있기 때문이다. 따라서 주어진 문제 B가 다항시간에 해결되지 않는 것을 증명하기 위해서는 이미 다항시간 내에 해결될 수 없다는 것이 증명된 문제 A를 B로 A → B와 같이 reduction하여 해결할 수 있다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6271</id>
		<title>NP-Completeness</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6271"/>
		<updated>2025-11-24T06:39:12Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 개요 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#NP-Completeness|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
어떠한 문제에 대해 충분히 빠른 알고리즘을 찾지 못한 이유를 설명하고자 할때, 그 방식은 세 가지 중 하나이다:&lt;br /&gt;
# 내가 문제를 잘 못풀어서. → 가오가 상함.&lt;br /&gt;
# 해당 문제의 lower bound를 증명. → 지루하고 현학적임.&amp;lt;ref&amp;gt;하지만 일반적인 문제에 대해 lower bound 증명은 극도로 어렵다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 내 잘못이 아니라, 세상의 그 누구도 풀 수 없는 문제다. → 간단함.&lt;br /&gt;
사실 어떤 문제를 해결하고자 할때, 이를 풀기 위한 다항시간 알고리즘을 찾을 수 없는 경우가 있다. 하지만 exponential-time lower bound 증명은 현재 기술로 거의 불가능하므로 이러한 문제들이 “진짜로 어려운지” 증명할 방법이 없었다. 하지만 Stephen Cook과 Richard Karp는 “어떤 문제가 다른 어려운 문제와 본질적으로 동일한 난이도를 가진다”는 개념을 만들었고, 이것이 바로 NP-completeness이다.&lt;br /&gt;
&lt;br /&gt;
앞으로 NP-Completeness에 대해서 알아보기 전에, 먼저 문제(problem)가 무엇인지 정의해야 한다. 문제란 일반화된 질문(general question)으로서, 아래의 두 요소로 이루어져 있다:&lt;br /&gt;
# 입력의 종류와 제약(Parameters of the input)&lt;br /&gt;
# 무엇이 “정답”인지 조건을 명시한 것(conditions on a satisfactory answer)&lt;br /&gt;
즉, 입력과 출력의 조건을 정의한 것이 &#039;문제&#039;이다. 또한 인스턴스(instance)는 해당 문제의 구체적인 입력을 의미한다. 더 쉽게 말하면, 특정 입력값으로 완전히 명시된 문제이다. 예를 들어, 정렬 문제는 아래와 같은 입력과 출력을 가진다:&lt;br /&gt;
 입력: &amp;lt;math&amp;gt;a_1, ..., a_n&amp;lt;/math&amp;gt;으로 이루어진 수열&lt;br /&gt;
 출력: 해당 수열을 재배열하여 &amp;lt;math&amp;gt; a&#039;_1 \le a&#039;_2 \le ... \le a&#039;_n&amp;lt;/math&amp;gt;이 되도록 하는 것&lt;br /&gt;
이 경우, 인스턴스는 {3,5,2,7,4,8,1}과 같이 구체적으로 제시된 특정 순열이다. 또한 결정 문제(Decision Problems)는 답이 “예/아니오(yes/no)”로만 나오는 문제이다. 예를 들어 [[Minimum Spanning Trees|MST]] 문제는 출력이 &amp;quot;예/아니오&amp;quot;로 정의되지 않으므로 정렬 문제가 아니지만, &amp;quot;주어진 그래프 G와 정수 k에 대해 비용이 k 이하인 MST가 존재하는가?&amp;quot;는 결정 문제에 해당한다.&amp;lt;br&amp;gt;&lt;br /&gt;
이때 NP-Completeness는 결정 문제에 대해 주로 적용되므로, 해당 문서에서의 모든 문제들은 결정 문제 형식으로 통일하여 다룬다.&lt;br /&gt;
&lt;br /&gt;
==Reduction==&lt;br /&gt;
Reduction이란 주어진 문제를 다른 문제로 변환하여 푸는 것을 의미한다. 예를 들어 A라는 가상의 문제를 B를 이용하여 풀고 싶다면, 아래와 같은 절차를 따를 수 있다:&lt;br /&gt;
# A(X)와 같이 인스턴스 X가 주어졌다고 가정하자.&lt;br /&gt;
# X를 Y라는 B에 대한 인스턴스로 변환한다.&lt;br /&gt;
# B(Y)를 풀면, 이를 A(X)의 답으로 사용할 수 있다. &lt;br /&gt;
이러한 과정 자체가 reduction이다. 이때 올바른 reduction이 진행되었다면, 변환이 수행되어도 정답이 변하지 않아야 한다. 이때 reduction을 잘 구성한다면 두 문제의 난이도를 비교할 수 있다. 이를 위해 아래와 같은 기본적인 가정이 필요하다. &lt;br /&gt;
 X → Y를 변환하는 데 O(P(n)) 시간이 걸린다.&lt;br /&gt;
 B(Y)은 O(P&#039;(n&#039;))의 시간 복잡도를 가진다. &lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore&amp;lt;/math&amp;gt; A(X)는 O(P(n)+P&#039;(n&#039;))의 시간 복잡도를 가진다.&lt;br /&gt;
이때 n은 입력 인스턴스 X의 크기이며, P(n)은 변환 비용에 해당한다. 이때 중요한 것은 변환 비용 O(P(n))이 항상 다항 시간이라는 것이다. 이는 아래의 명제를 성립시킨다:&lt;br /&gt;
 A → B이면 A&amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt;p B 이며, B는 A보다 더 빨라질 수 없다.&lt;br /&gt;
이는 hardness 관점에서 A가 다항시간에 해결되지 않는 문제라고 할 때, B가 다항시간 내에 해결된다면 A 또한 다항 시간 내에 해결될 수 있기 때문이다. 따라서 주어진 문제 B가 다항시간에 해결되지 않는 것을 증명하기 위해서는 이미 다항시간 내에 해결될 수 없다는 것이 증명된 문제 A를 B로 A → B와 같이 reduction하여 해결할 수 있다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6270</id>
		<title>NP-Completeness</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6270"/>
		<updated>2025-11-24T06:16:09Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#NP-Completeness|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
어떠한 문제에 대해 충분히 빠른 알고리즘을 찾지 못한 이유를 설명하고자 할때, 그 방식은 세 가지 중 하나이다:&lt;br /&gt;
# 내가 문제를 잘 못풀어서. → 가오가 상함.&lt;br /&gt;
# 해당 문제의 lower bound를 증명. → 지루하고 현학적임.&amp;lt;ref&amp;gt;하지만 일반적인 문제에 대해 lower bound 증명은 극도로 어렵다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 내 잘못이 아니라, 세상의 그 누구도 풀 수 없는 문제다. → 간단함.&lt;br /&gt;
사실 어떤 문제를 해결하고자 할때, 이를 풀기 위한 다항시간 알고리즘을 찾을 수 없는 경우가 있다. 하지만 exponential-time lower bound 증명은 현재 기술로 거의 불가능하므로 이러한 문제들이 “진짜로 어려운지” 증명할 방법이 없었다. 하지만 Stephen Cook과 Richard Karp는 “어떤 문제가 다른 어려운 문제와 본질적으로 동일한 난이도를 가진다”는 개념을 만들었고, 이것이 바로 NP-completeness이다.&lt;br /&gt;
&lt;br /&gt;
==Reduction==&lt;br /&gt;
Reduction이란 주어진 문제를 다른 문제로 변환하여 푸는 것을 의미한다. 예를 들어 A라는 가상의 문제를 B를 이용하여 풀고 싶다면, 아래와 같은 절차를 따를 수 있다:&lt;br /&gt;
# A(X)와 같이 인스턴스 X가 주어졌다고 가정하자.&lt;br /&gt;
# X를 Y라는 B에 대한 인스턴스로 변환한다.&lt;br /&gt;
# B(Y)를 풀면, 이를 A(X)의 답으로 사용할 수 있다. &lt;br /&gt;
이러한 과정 자체가 reduction이다. 이때 올바른 reduction이 진행되었다면, 변환이 수행되어도 정답이 변하지 않아야 한다. 이때 reduction을 잘 구성한다면 두 문제의 난이도를 비교할 수 있다. 이를 위해 아래와 같은 기본적인 가정이 필요하다. &lt;br /&gt;
 X → Y를 변환하는 데 O(P(n)) 시간이 걸린다.&lt;br /&gt;
 B(Y)은 O(P&#039;(n&#039;))의 시간 복잡도를 가진다. &lt;br /&gt;
 &amp;lt;math&amp;gt;\therefore&amp;lt;/math&amp;gt; A(X)는 O(P(n)+P&#039;(n&#039;))의 시간 복잡도를 가진다.&lt;br /&gt;
이때 n은 입력 인스턴스 X의 크기이며, P(n)은 변환 비용에 해당한다. 이때 중요한 것은 변환 비용 O(P(n))이 항상 다항 시간이라는 것이다. 이는 아래의 명제를 성립시킨다:&lt;br /&gt;
 A → B이면 A&amp;lt;math&amp;gt;\le&amp;lt;/math&amp;gt;p B 이며, B는 A보다 더 빨라질 수 없다.&lt;br /&gt;
이는 hardness 관점에서 A가 다항시간에 해결되지 않는 문제라고 할 때, B가 다항시간 내에 해결된다면 A 또한 다항 시간 내에 해결될 수 있기 때문이다. 따라서 주어진 문제 B가 다항시간에 해결되지 않는 것을 증명하기 위해서는 이미 다항시간 내에 해결될 수 없다는 것이 증명된 문제 A를 B로 A → B와 같이 reduction하여 해결할 수 있다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Dynamic_Programming&amp;diff=6141</id>
		<title>Dynamic Programming</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Dynamic_Programming&amp;diff=6141"/>
		<updated>2025-11-24T05:14:22Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#Dynamic Programming|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
동적 프로그래밍(Dynamic Programming)은 좌우 순서로 배열된 문제들&amp;lt;ref&amp;gt;문자열, 수열 등에 관한 문제이다.&amp;lt;/ref&amp;gt;에 대한 최적화 문제를 효율적으로 푸는 방법이다. 동적 프로그래밍의 핵심적인 아이디어는 복잡한 문제를 작은 하위 문제(subproblem) 로 나누고, 중복 계산을 피하기 위해 이전 결과를 저장(memoization)하는 것이다. 이때 동적 프로그래밍은 재귀적으로 구현한다는 것을 의미하지 않는다. 동적 프로그램의 본질은 어디까지나:&lt;br /&gt;
# 중복되는 하위 문제(Overlapping Subproblems): 예를 들면, 피보나치에서 fib(3)을 여러 번 계산하지 않는 것이 있다.&lt;br /&gt;
# 최적 부분 구조(Optimal Substructure): 큰 문제의 최적해가 작은 문제의 최적해들로 구성되는 것이다.&lt;br /&gt;
따라서 DP를 구현하는 방식은 아래와 같이 두 가지로 나뉜다:&lt;br /&gt;
# Top-Down(Memoization): 큰 문제에서 출발해 재귀를 통해 하위 문제를 호출하며, 이미 계산된 값은 저장하여 활용한다.&lt;br /&gt;
# Bottom-Up(Tabulation): 가장 작은 하위 문제부터 순서대로 반복문으로 해결하며, 결과를 테이블에 저장한다. &lt;br /&gt;
&lt;br /&gt;
동적 프로그래밍은 완전탐색(Exhaustive Search) 방식에 같이 사용된다. 완전 탐색 기법은 모든 가능한 해를 탐색하므로 항상 정답은 구하지만 비효율적이지만 동적프로그램과 같이 응용하여, 중복 계산을 제거하여 효율을 높일 수 있다. 이를 이용한 대표적인 알고리즘으로는 [[Shortest Paths#Floyd’s Algorithm|Floyd’s Algorithm]]이 있다. &lt;br /&gt;
&lt;br /&gt;
==Recurrence Relations==&lt;br /&gt;
점화식(Recurrence Relation)은 어떤 수열을 “이전 항들로 정의하는 식”이다. 즉, &amp;quot;자기 자신을 기반으로 정의된 함수&amp;quot;이다. 예를 들면, 아래와 같은 식이 있다:&lt;br /&gt;
 &amp;lt;math&amp;gt;a_n=a_{n-1}+1,a_1=1 \Rightarrow a_n = n&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;a_n=2a_{n-1},a_1=2\,\,\,\,\,\,\, \Rightarrow a_n = 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;a_n=na_{n-1}, a_1=1\,\,\,\,\,\,\, \Rightarrow a_n=n!&amp;lt;/math&amp;gt;&lt;br /&gt;
이와 같이 점화식을 통해 문제의 구조를 반복되는 관계로 표현함으로서 프로그램이 재귀적으로 계산할 수 있다. 즉, 동적 프로그래밍은 이러한 점화식을 효율적으로 계산하기 위해 부분 결과를 저장하는 기법이다. &lt;br /&gt;
&lt;br /&gt;
===Master Theorem===&lt;br /&gt;
이때 점화식은 문제를 작은 하위 문제로 나누었을 때 이를 표현하는 수식이므로, 주어진 점화식을 이용해 알고리즘의 시간복잡도를 추론할 수 있다. 이를 마스터 정리(master theorem)이라고 하며, 이는 [[Sorting Problem#Mergesort#Divide and Conquer|분할 정복 알고리즘]]에도 적용될 수 있다. 마스터 정리는 점화식이 아래와 같은 형태임을 가정한다:&lt;br /&gt;
 &amp;lt;math&amp;gt;T(n) = a\cdot T(n/b)+f(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
위에서 a는 분할할 때 문제의 개수, n/b는 분할된 각 문제의 크기, f(n)은 부분 문제의 해를 합치는데 걸리는 비용을 의미한다. 일반화한 이 식을 통해 T(n)의 점근적인 시간복잡도를 구하면 아래와 같다:&lt;br /&gt;
*Case 1: &amp;lt;math&amp;gt;f(n) = O(n^{log_b{a-\epsilon}}),&amp;lt;/math&amp;gt; for some &amp;lt;math&amp;gt;\epsilon &amp;gt; 0&amp;lt;/math&amp;gt;&lt;br /&gt;
** 즉, 합치는 비용이 부분 문제 비용보다 작다. 이 경우, &amp;lt;math&amp;gt;T(n) = \Theta(n^{log_ba})&amp;lt;/math&amp;gt;&lt;br /&gt;
* Case 2: &amp;lt;math&amp;gt;f(n) = \Theta(n^{log_ba}),&amp;lt;/math&amp;gt;&lt;br /&gt;
** 즉, 합치는 비용이 부분 문제 비용과 비슷하다. 이 경우, &amp;lt;math&amp;gt;T(n) = \Theta(n^{log_ba}\cdot log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
* Case 3: &amp;lt;math&amp;gt;f(n) = \Omega(n^{log_b{a+\epsilon}}),&amp;lt;/math&amp;gt; for some &amp;lt;math&amp;gt;\epsilon &amp;gt; 0&amp;lt;/math&amp;gt;&lt;br /&gt;
** 즉, 합치는 비용이 부분 문제 비용보다 크다. 이 경우, &amp;lt;math&amp;gt;T(n) = \Theta(f(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
** 단, 정규성 조건이 필요하다: &amp;lt;math&amp;gt;a\cdot f(n/b) \le c\cdot f(n)&amp;lt;/math&amp;gt; for some &amp;lt;math&amp;gt;c &amp;lt; 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Three Steps to Dynamic Programming===&lt;br /&gt;
마스터 정리를 바탕으로, 동적 프로그래밍을 하기 위한 3단계를 요약하면 아래와 같다:&lt;br /&gt;
# 점화식 세우기: 문제를 작은 하위 문제로 나누고, 이들 결과를 결합하는 수식을 만든다.&lt;br /&gt;
# 서브문제 개수의 다항성 보장: 가능한 하위 문제 수가 너무 많지 않아야 한다.&amp;lt;ref&amp;gt;마스터 정리를 통해 계산했을 때 전체 알고리즘의 시간 복잡도가 &amp;lt;math&amp;gt;O(n^2), O(n^3)&amp;lt;/math&amp;gt; 정도이면 적당하다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 계산 순서 결정: 하위 문제의 결과를 이미 계산된 값으로부터 효율적으로 구할 수 있도록 순서를 정한다.&lt;br /&gt;
&lt;br /&gt;
==[[Fibonacci Numbers]]==&lt;br /&gt;
피보나치 수열(Fibonacci Numbers)은 동적 프로그래밍의 대표적인 구현 예시 중 하나이다.&lt;br /&gt;
&lt;br /&gt;
[[Fibonacci Numbers|피보나치 수열]]에 대한 자세한 설명은 해당 문서를 참조해주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Binomial Coefficients]]==&lt;br /&gt;
이항 계수(Binomial Coefficients)는 동적 프로그래밍의 고전적인 응용 중 하나이다. &lt;br /&gt;
&lt;br /&gt;
[[Binomial Coefficients|이항 계수(Binomial Coefficients)]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[The Gas Station Problem]]==&lt;br /&gt;
[[The Gas Station Problem]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Edit Distance]]==&lt;br /&gt;
[[Edit Distance]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==High-Density Bar Codes==&lt;br /&gt;
바코드 기술이 발달함에 따라, 2D 바코드가 등장했다. 기본적으로 2D 알고리즘을 구현하기 위해서는 문자 타입에 따라 최적 인코딩 방식&amp;lt;ref&amp;gt;숫자 모드, 대문자 모드, 소문자 모드, 문장부호 모드, 혼합 모드&amp;lt;/ref&amp;gt;을 선택하여 문자열을 인코딩해야 한다. 기존에는 greedy 알고리즘이 사용되어 해당 문자에 가장 좋아 보이는 모드만 선택 방식으로 구현되었다. &lt;br /&gt;
&lt;br /&gt;
PDF-417은 기존 2D 바코드보다 더 밀도있게 정보를 담을 수 있는 2D 바코드이다. PDF-417은 문자를 표현하는 여러 모드(mode)를 가지고 있는데, 문자열 전체를 최적으로 압축하기 위해서 동적 프로그래밍을 사용한다. PDF-417은 문자 타입에 따라 네 가지 모드를 지원하며, Figure 1은 네 가지 모드의 상태 전이도이며, 이는 각 모드를 전환(switch)하기 위해서 필요한 비용을 보여준다. 아래는 상태전이도에 대한 설명이다:&lt;br /&gt;
* 네 가지 모드(state)&lt;br /&gt;
*# Alpha (A–Z)&lt;br /&gt;
*# Lower Case (a–z)&lt;br /&gt;
*# Mixed (0–9, #$% 등)&lt;br /&gt;
*# Punctuation (문장부호)&lt;br /&gt;
* Latch: 한 모드에서 다른 모드로 영구적으로 이동하며, 비용이 크다.(보통 1 코드워드)&lt;br /&gt;
* Shift: 일시적으로 다른 모드의 한 글자를 표현하는 명령이지만, 비용이 latch보다 작다.&lt;br /&gt;
따라서 문장을 인코딩할 때는 “지금 모드를 유지할까? 잠깐 shift할까? latch해서 영구적으로 바꿀까?”라는 복잡한 선택이 필요하다. 기존 방식과 달리 동적 프로그래밍을 활용하면 모든 prefix에 대해 모든 모드의 최소 비용을 계산할 수 있다. 이를 위한 DP 테이블은 M[i][j]와 같이 구성된다. 이는 모드 j에서 끝난 i번째 문자까지 고려했을 때 누적 최소 비용을 의미한다. 이에 대한 DP 점화식은 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;M[i][j] = min(M[i-1][k]+&amp;lt;/math&amp;gt;i번째 문자를 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;에서 &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;로 인코딩한 비용&lt;br /&gt;
이는 단순한 greedy 알고리즘보다 평균 8%이상 성능을 개선하는 효과를 가진다.&lt;br /&gt;
&lt;br /&gt;
==Book Partition Problem==&lt;br /&gt;
책 분할 문제(Book Partition Problem)는 책들의 길이가 다를 때, 이를 k명의 작업자에게 공평하게 나누는 문제이다. 입력과 문제 상황을 구체화하면 아래와 같다:&lt;br /&gt;
 Input: 책들의 배열 &amp;lt;math&amp;gt;S=\{s_1,S_2,\cdots,s_n\}&amp;lt;/math&amp;gt;, 작업자 &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 Problem: Partition &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; into &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ranges, so as to minimize the maximum sum over all the ranges.&lt;br /&gt;
예를 들어 &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;이고 &amp;lt;math&amp;gt;S = \{100, 200, 300, 400, 500, 600, 700, 800, 900\}&amp;lt;/math&amp;gt;과 같이 주어진다면, 아래와 같이 분할해야 하는 것이다. &lt;br /&gt;
 100 200 300 400 500 | 600 700 | 800 900&lt;br /&gt;
위는 첫 번째 구간의 합은 1500이고, 두 번째 구간의 합은 1300이고, 세 번째 합은 1700이다. 이는 주어진 문자열에 대해 각 구간의 합을 가능한 한 비슷하게 만들어, 가장 큰 구간의 합을 최소화한 것이다. 이때 평균을 기준으로 나누는 방식은 항상 최적을 보장해주지 않기 때문에, 동적 프로그래밍이 해당 문제를 해결하기 위해 사용된다.&lt;br /&gt;
&lt;br /&gt;
점화식을 유도하기 위해, 마지막 partition을 (i+1)~n 구간으로 둔다고 가정하자. 이 경우 마지막 구간의 합은 아래와 같이 구해진다:&lt;br /&gt;
 &amp;lt;math&amp;gt;\sum^n_{j=i+1}s_j&amp;lt;/math&amp;gt;&lt;br /&gt;
그 이전 구간들(1 ~ i)은 k−1개의 구간으로 나눠져야 한다. 이에 따라 전체 partition의 cost(최대 구간 합)는 아래와 같이 구해진다: &lt;br /&gt;
 &amp;lt;math&amp;gt;M[n,k]=\min^n_{i=1} \max(M[i,k-1], \sum^n_{j=i+1}s_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
 base case 1: &amp;lt;math&amp;gt;M[1,k]=s_1&amp;lt;/math&amp;gt;: 원소 하나는 구간 합이 그 원소뿐&lt;br /&gt;
 base case 2: &amp;lt;math&amp;gt;M[n,1]=\sum^n_{i=1}s_i&amp;lt;/math&amp;gt;: 한 구간만 있으면 전체 합&lt;br /&gt;
위 점화식을 그대로 구현하면, DP 테이블의 크기는 &amp;lt;math&amp;gt;n\times k=O(nk)&amp;lt;/math&amp;gt;이고, 각 DP cell에 대한 계산은 &amp;lt;math&amp;gt;1\le i \le n&amp;lt;/math&amp;gt;을 만족하는 &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;에 대해 전부 계산한다. 이에 따라 총 시간복잡도는 &amp;lt;math&amp;gt;O(nk)\times O(n)= O(kn^2)&amp;lt;/math&amp;gt;이다.&lt;br /&gt;
&lt;br /&gt;
==Limitations of Dynamic Programming==&lt;br /&gt;
동적 프로그래밍은 효율적이지만 항상 사용 가능한 것은 아니다. 동적 프로그래밍은 부분 문제의 결과를 테이블에 저장하여 전체 계산을 빠르게 하므로, 이를 효율적으로 구현하기 위해서는 부분 문제의 수가 작아야 한다. 예를 들어 순열(Permutations) 문제에 대해, n개의 원소를 순열로 나누면 n!개의 순열이 존재하므로 부분 문제의 수가 많아 이를 다 저장할 수 없다. 따라서 순열 기반 문제는 보통 동적 프로그래밍이 불가능하다. 이는 부분집합의 경우에도 n개의 원소를 가지는 집합에 대한 부분집합의 개수는 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;이므로 동적 프로그래밍이 불가능하다. 또한 TSP 문제도 동적 프로그래밍으로 기존 &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; 알고리즘보다 더욱 효율적으로 구현할 수 있음에도 저장의 문제로 구현하지 못하는 예시이다. TSP의 점화식은 아래와 같다:&lt;br /&gt;
 &amp;lt;math&amp;gt;T(i;S)=\min_{j\in S}C[i,j]+T(j;S-\{j\})&amp;lt;/math&amp;gt;&lt;br /&gt;
이 경우 시간복잡도는 &amp;lt;math&amp;gt;n^22^n&amp;lt;/math&amp;gt;이며, 기존 알고리즘보다 더욱 빠르지만 부분문제의 개수가 너무 많아 동적 프로그래밍으로 구현할 수 없다. 반대로 동적 프로그래밍이 적용될 수 있는 대표적인 예시가 문자열 관련 문제인데, 문자열의 substring의 개수는 &amp;lt;math&amp;gt;n(n+1)/2&amp;lt;/math&amp;gt;이므로 충분히 적용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
또한 동적 프로그래밍는 선형 구조나, 왼쪽에서 오른쪽으로의 순서가 있는 구조와 같이 순서가 고정된 구조에서 강하다. 이는 예를 들어 트리 구조 관련된 문제, 문자열의 문자들, 행렬 chain, 다각형 boundary 위의 점들과 관련한 문제가 있다.&lt;br /&gt;
&lt;br /&gt;
동적 프로그래밍이 가능하기 위한 가장 중요한 이론적 조건은 Principle of Optimality이다. 이는 아래와 같다:&lt;br /&gt;
 어떤 문제의 최적 해가 존재하려면 그 해의 부분구성 요소(sub-solution)도 최적이어야 한다.&lt;br /&gt;
즉, 전체 최적해의 앞부분이 최적이 아니라면 전체 최적해가 될 수 없다는 것이다. 이 원리가 깨지면 동적 프로그래밍이 불가능하다. 예를 들어 [[Shortest Paths#Dijkstra’s Algorithm|Dijkstra’s Algorithm]]는 동적 프로그래밍 기반으로 작동한다. 이때 Dijkstra 알고리즘이 동적 프로그래밍으로 구현될 수 있는 이유는 어떤 노드 x까지의 최단 경로가 그 이전 노드까지의 경로가 최단거리를 포함한다는 원칙이 있기 때문이다. 즉, 이는 Principle of Optimality를 만족한다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6269</id>
		<title>NP-Completeness</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=NP-Completeness&amp;diff=6269"/>
		<updated>2025-11-24T05:14:00Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:알고리즘 설계와 분석 분류:컴퓨터 공학 상위 문서: 알고리즘 설계와 분석   ==개요==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
상위 문서: [[알고리즘 설계와 분석#문제|알고리즘 설계와 분석]] &lt;br /&gt;
&lt;br /&gt;
==개요==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EC%84%A4%EA%B3%84%EC%99%80_%EB%B6%84%EC%84%9D&amp;diff=5380</id>
		<title>알고리즘 설계와 분석</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EC%84%A4%EA%B3%84%EC%99%80_%EB%B6%84%EC%84%9D&amp;diff=5380"/>
		<updated>2025-11-24T05:13:37Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* Dynamic Programming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:알고리즘 설계와 분석]]&lt;br /&gt;
[[분류:컴퓨터 공학]]&lt;br /&gt;
[[:Category:알고리즘 설계와 분석]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
알고리즘이란, 특정한 작업을 수행하기 위한 절차이다. 이에 따라 하나의 알고리즘은 컴퓨터의 종류에 관계 없이 동일한 작업을 동일한 절차로 수행한다. 다만 이를 표현하는 문법이 달라질 뿐이다. 이러한 알고리즘이 잘 작동하기 위해서는 일반적이고(general), 잘 정의된(specified) 문제를 해결할 수 있어야 한다. 이때 잘 만들어진 알고리즘 문제는 그것에 대한 입력으로 주어질 수 있는 인스턴스의 완전한 집합과, 그중 하나의 인스턴스를 입력으로 하였을 때의 정답이 명확하게 설명된다. &lt;br /&gt;
&lt;br /&gt;
예를 들어 정렬(sorting) 문제에 대해 생각해보자. 입력으로는 n개의 수 &amp;lt;math&amp;gt;a_1, ..., a_n&amp;lt;/math&amp;gt;으로 이루어진 수열이 주어지며, 이때 출력은 해당 수열을 재배열하여 &amp;lt;math&amp;gt; a&#039;_1 \le a&#039;_2 \le ... \le a&#039;_n&amp;lt;/math&amp;gt;이 되도록 하는 것이다. 이때 이러한 작업을 수행하는 알고리즘은 효율적이고(efficient), 정확해야(correct) 한다. 이때 정확함(correctness)에 대한 개념은 많은 알고리즘 문제에서 명확하지 않다. 따라서 알고리즘에서 정확함을 보장하기 위해서는 이를 증명해야 한다. 이에 대한 더 잘 이해하기 위해서는, [[Robot Tour Optimization]] 문제 혹은 [[Selecting the Right Jobs]] 문제에 대한 문서를 참조하면 좋다.&lt;br /&gt;
&lt;br /&gt;
===Demonstrating Incorrectness===&lt;br /&gt;
어떤 알고리즘이나 규칙이 항상 최적이라고 주장하기 위해서는, 일반적인 사례에 대해 증명해야 한다. 반대로 이를 부정하기 위해서는 작은 반례 하나만 찾으면 되며, 이는 증명하는 것에 비해서 상대적으로 더욱 쉬운 방법이다. 이러한 반례를 찾는 데에는 아래와 같은 팁들이 존재한다.&lt;br /&gt;
# 작은 입력부터 전부 시험해본다.&lt;br /&gt;
# 극단적인 예제(아주 크거나 아주 작은 값이 섞여 있는 경우)를 시험해 본다.&lt;br /&gt;
# 알고리즘의 각 단계를 밟을 때, 동률(ties)이 존재하는 경우를 살펴본다.&amp;lt;ref&amp;gt;예를 들어 “가장 짧은 interval을 고른다” 했을 때, 길이가 같은 interval이 여러 개 있으면 tie-break 방식에 따라 결과가 달라질 수 있고, 그중 일부는 최적해가 아닐 수 있다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Induction and Recursion===&lt;br /&gt;
반례를 찾지 못했다고 해서 알고리즘이 정확하다는 것은 아니다. 엄밀한 증명이 필요하며, 이를 위해서 많이 사용되는 것이 수학적 귀납법이다. 수학적 귀납법은 재귀적인 알고리즘(recursive algorithm)을 증명하는데 자주 활용된다. 이는 아래와 같은 논리 구조를 따른다.&lt;br /&gt;
# 기저 사례 (basis case): 가장 작은 입력에 대해 올바름을 보임.&lt;br /&gt;
# 귀납 가정 (general assumption): 크기 k 이하에 대해 알고리즘이 맞다고 가정.&lt;br /&gt;
# 귀납 단계 (general case): k+1 크기에 대해서도 올바름을 보임.&lt;br /&gt;
&lt;br /&gt;
==알고리즘 분석==&lt;br /&gt;
알고리즘의 효율성을 분석하는 것은 매우 중요하다. 이를 위해서 사용하는 도구는 (1) 계산의 RAM 모델(the RAM model of computation)과 (2) 계산 복잡도의 점근적 분석이다. 이때 알고리즘 성능을 평가하기 위해서는 “빅 오(Big Oh)” 표기를 사용한다.&lt;br /&gt;
&lt;br /&gt;
===[[The RAM Model of Computation]]===&lt;br /&gt;
자세한 내용은 [[The RAM Model of Computation]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
===[[The Big Oh Notation]]===&lt;br /&gt;
자세한 내용은 [[The Big Oh Notation]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==Data Structures==&lt;br /&gt;
어떤 알고리즘에 알맞은 자료 구조를 이식하는 것은 매우 중요한 일이다. 자료 구조 자체는 프로그램의 정당성(correctness)에 영향을 주지는 않지만, 프로그램의 속도에 매우 큰 영향을 준다. 따라서 자료 구조를 이해하는 것은 알고리즘의 설계와 분석을 위해서는 매우 중요하다.&lt;br /&gt;
&lt;br /&gt;
자세한 내용은 [[Data Structures]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Graph]]==&lt;br /&gt;
그래프(Graph)는 알고리즘, 네트워크, 데이터 구조 등 컴퓨터 과학의 여러 분야에서 핵심적인 개념이다.&lt;br /&gt;
&lt;br /&gt;
자세한 내용은 [[Graph]] 문서를 참조하십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Backtracking]]==&lt;br /&gt;
[[Backtracking]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[Dynamic Programming]]==&lt;br /&gt;
[[Dynamic Programming]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==[[NP-Completeness]]==&lt;br /&gt;
[[NP-Completeness]]에 대한 자세한 설명은 해당 문서를 참조해 주십시오.&lt;br /&gt;
&lt;br /&gt;
==문제/알고리즘==&lt;br /&gt;
* [[Robot Tour Optimization]]&lt;br /&gt;
* [[Selecting the Right Jobs]]&lt;br /&gt;
* [[Sorting Problem]]&lt;br /&gt;
* [[Graph#Graph Traversal|Graph Traversal]]&lt;br /&gt;
* [[Topological Sorting]]&lt;br /&gt;
* [[Shortest Paths]]&lt;br /&gt;
* [[Fibonacci Numbers]]&lt;br /&gt;
* [[Binomial Coefficients]]&lt;br /&gt;
* [[The Gas Station Problem]]&lt;br /&gt;
* [[Edit Distance]]&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6257</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6257"/>
		<updated>2025-11-21T05:16:27Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
[[파일:Figure 1. 마오쩌둥.png|섬네일|208x208픽셀|Figure 1. 마오쩌둥]]&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
[[파일:Figure 2. 대장정 경로.png|섬네일|Figure 2. 대장정 경로]]&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁과 집단 농촌화===&lt;br /&gt;
[[파일:Figure 3. 자아비판.png|섬네일|200x200픽셀|Figure 3. 자아비판]]&lt;br /&gt;
1949년 건국 직후 공산당의 가장 중요한 초기 정책은 지주·부농 계급 제거였으며, 이를 위해 토지를 농민들에게 재분배하여 공산당의 농촌 지배력을 강화하는 토지개혁이 진행되었다. Figure 3는 당시 시기의 전형적인 자아비판의 모습을 보여준다. 이미지 중앙에 무릎을 꿇은 사람은 지주로, 중국공산당과 당시 농민들에게 악한 것으로 규정되었다. 이는 토지개혁이 단순한 정책 집행이 아니라 대중을 정치적으로 동원하는 혁명적 의례였다는 것을 보여준다. &lt;br /&gt;
&lt;br /&gt;
토지개혁의 결과 지주 계층이 완전히 소멸하고, 농업 정책의 방향은 대규모 집단농장의 형태로 빠르게 나아갔다. 이 과정에서 개혁의 속도를 조절하자는 의견도 있었지만, 마오쩌둥은 이를 비난하며 더 빠르고 더 급진적인 집단화를 요구하였다. 아래는 그의 주장을 담은 글이다:&lt;br /&gt;
 “새로운 사회주의 대중운동의 거대한 물결이 곧 전국 농촌 지역을 휩쓸게 될 것이다. 그러나 우리의 몇몇 동지들은 마치 전족(纏足)한 여인처럼 비틀거리며, 늘 다른 사람들에게 불평을 늘어놓는다. ‘너무 빨리 간다, 너무 빨리 간다’라고 말하면서 말이다. 그들은 사소한 흠을 트집 잡고, 근거 없는 불평을 하고, 끝없는 걱정과 수많은 금기만 만들어내며, 이런 태도가 농촌 사회주의 대중운동을 지도하는 올바른 방침이라고 여긴다. 아니다... 이것은 잘못된 방침이다.”&lt;br /&gt;
마오쩌둥은 위와 같은 말을 통해서 신중론, 점진주의는 모두 반혁명적 보수성에 해당하며, 대중은 혁명적 열망을 가지고 있으므로 지도층은 대중을 억제하는 것이 아니라 더 큰 집단화를 밀어붙여야 한다고 주장한 것이다. 이러한 논리는 대약진 운동으로도 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==반우파 운동==&lt;br /&gt;
1956년, 마오쩌둥은 지식인들의 자유발언을 허용하는 문제를 논의했고 4월 28일 정치국 확대회의에서는 &#039;백화제방(百花齊放)，백가쟁명(百家爭鳴)&#039;이라는 방침을 제시했다. 아래는 1956년 5월 26일, 중국공산당 선전부장 루딩이(陸定一)가 여러 지식인 2천여 명을 모아놓고 &#039;백화제방, 백가쟁명&#039;에 대해 강연한 내용의 일부이다:&lt;br /&gt;
 &amp;quot;독립적인 사고와 자유로운 토론이 장려되지 않는다면 학술발전은 정체될 수밖에 없다는 사실을 역사는 보여준다. 문학예술활동과 과학연구에 있어서 독립적인 사고의 자유, 논쟁의 자유, 창작과 비평의 자유, 자기의 의견을 발표, 견지, 유보할 수 있는 제유를 제창한다.&amp;quot;&lt;br /&gt;
물론 우호적 비판은 허용하되 &#039;비난&#039;은 철저히 용납하지 않겠다는 입장이었지만, 지식인들은 반신반의하면서도 한편으로는 기뻐했다. 지식인들은 그동안의 사상개조운동의 영향으로 폐쇄된 언로와 중국공산당의 독주에 불만을 품으면서도 은근히 개방을 바라고 있었기 때문이다. 그러나 마오쩌둥의 노력에도 불구하고, 그동안 공산당에게 호되게 시달려왔던 지식인들은 쉽사리 입을 열지 않았다.  하지만 중국 공산당이 마오쩌둥의 뜻에 따라 공산당 내부의 문제에 대한 정풍운동을 1957년 4월 25일부터 전개하고 모든 &#039;우호적&#039; 비판을 허용한다는 입장을 거듭 표명하면서 지식인들은 점차 용기를 얻었다. 아래는 중공중앙통일전선부가 1957년에 주최한 좌담회에서 좌담회를 주최한 리웨이한이 말한 내용이다:&lt;br /&gt;
 &amp;quot;이 회의를 소집한 목적은 여러분에게 우리가 진행하고 있는 정풍을 원조해달라는 것과 우리의 결점과 잘못을 고칠 수 있도록 도와달라는 것이다. 통일전선의 방법을 가지고 우리의 정풍을 추진하는 것은 처음 있는 일로서 여러분이 자세한 비판과 의견을 많이 제시해 줄 것을 희망한다.&amp;quot;&lt;br /&gt;
이렇듯 마오쩌둥과 공산당이 대놓고 &#039;마음껏 떠들어도 좋다&#039;. &#039;절대로 계급투쟁을 하지 않겠다.&#039;라고 부추기자, 지식인들은 마침내 가슴속에 품어왔던 불만을 쏟아내기 시작했다. 이는 공산당원의 특권인식과 공산당의 무능, 공산당의 법과 제도를 운용할 능력의 부재, 공산당의 독주 비판 등 중국 사회 전체와 지금까지 중국 공산당이 진행한 여러 전반적인 정책에 관한 것이었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥은 &#039;백화제방&#039;, &#039;백가쟁명&#039; 방침을 정하고 지식인들에게 자유롭게 발언할 기회를 제공한 후 상황이 자신이 원하는 대로 돌아가지 않는 것을 목격했다. 지식인들은 공산당이 허용할 수 없는 범위의 비판을 넘어서 공산당의 통치 전반에 걸쳐 비판 및 비난을 퍼부었고, 일부 대학생들은 더 나아가 &amp;quot;공산당을 탈퇴하고 자유시민이 되자&amp;quot;, &amp;quot;마오쩌둥은 물러가라!&amp;quot; 등의 구호를 외쳤다. 이에 마오쩌둥은 지식인들에게 철퇴를 가하기로 결심했다. 아래는 1957년 7월 1일, 인민일보에 개재된 사설의 일부이다:&lt;br /&gt;
 중국민주동맹이 백가쟁명과 정풍 과정에서 행한 역할은 매우 열악하며 그들의 조직, 계획, 강령, 노선은 모두 인민을 도외시하는 것이며, 반공반사회주의이자 반공 반민주의이다. 그리고 농공민주당도 똑같다. (중략) 중국의 하늘은 흑구름으로 뒤덮였고, 이것의 출처는 장보쥔, 뤄룽지, 장즈중 동맹이다. 그들은 죄가 있으며, &#039;말하는 사람은 무죄다&#039;라는 원칙이 그들에게는 적용되지 않는다.&lt;br /&gt;
백화제방에서 정부를 비판한 사람들은 곧 ‘우파분자(Rightists)’로 규정되어 숙청 대상이 되어 약 55만 명이 숙청, 재교육, 노동교화로 끌려갔다. 이로 인하여 교육·관료·지식인 계층이 큰 타격을 입었고, 중국에서 정치적인 비판의 공간은 완전히 붕괴되었다.&lt;br /&gt;
&lt;br /&gt;
이에 대해 학계에서는 마오가 처음부터 비판자를 드러내기 위해 유도했다는 견해와, 진심으로 비판을 허용했지만 예상보다 훨씬 많은 비판이 쏟아지자 공산당이 공포심을 느껴 탄압으로 선회했다는 두 가지의 주장이 존재한다. 하지만 공통된 결과는 정치적 자유는 짧게 열렸다가 더욱 강하게 폐쇄되었다는 것이다.&lt;br /&gt;
&lt;br /&gt;
==대약진 운동==&lt;br /&gt;
[[파일:Figure 4. 대약진 운동 선전 포스터.png|섬네일|200x200픽셀|Figure 4. 대약진 운동 선전물]]&lt;br /&gt;
대약진 운동(大跃进运动, &amp;quot;Great Leap Forward&amp;quot;)은 중국에서 중국공산당의 주도로 1958년부터 1962년경까지 실시되었던 경제, 사회 개발 운동이다. 이는 미국과의 체제 경쟁을 진행하던 소련의 노력을 보고 영감을 얻은 마오쩌둥이 영국을 따라잡을 목적으로 야심차게 준비한 경제 성장 계획이었으나, 결과적으로 중국의 성장을 수십 년 후퇴시켰던 역사적인 실책이다. 이는 농업/산업의 실제 생산 능력이 아니라 혁명적 낙관주의&amp;lt;ref&amp;gt;“혁명을 위한 의지와 열정만 있으면 자연도, 경제도, 과학도 이겨낼 수 있다”는 신념을 의미한다.&amp;lt;/ref&amp;gt;를 기반으로 하였으나, 기획 자체의 모순과 결함, 기술의 미비, 일의 순서를 무시한 강압적 추진 태도, 부정부패 등으로 처참히 실패하였다.&lt;br /&gt;
&lt;br /&gt;
===인민공사===&lt;br /&gt;
[[파일:Figure 5. 인민공사.png|섬네일|200x200픽셀|Figure 5. 인민공사]]&lt;br /&gt;
대약진 운동의 핵심 제도 중 하나는 인민공사(人民公社, Communes)였다. 이는 1958년 이후 기존의 작은 협동조합을 수천~수만 명 단위의 초대형 농업·사회 단위로 통합한 조직이었다. 하지만 이는 단순한 농업 단위가 아니라 행정 단위, 군사 단위, 생산 단위, 생활 단위로서 기능하는 하나의 작은 사회였다. 또한 해당 공동체 내에서는 모두가 함께 생활하였는데, figure는 당시 인민공사 내의 인민공사 생활이 어떻게 운영되었는지 보여준다. 사람들은 개인 요리를 하지 않고 모두 집단 식당에서 무료로 배식받았으며, 공동 생활은 사회주의적 연대와 같다고 강하게 선전되었다. &lt;br /&gt;
&lt;br /&gt;
그러나 인민공사는 많은 문제점을 낳았다. 사람들이 공동식당에 의존함에 따라 배급이 줄자 곧바로 기근이 발생하는 상황이 고착화되었다. 또한 성과에 목을 맨 관료들이 경쟁적으로 자신이 속한 인민공사의 생산량을 과장하여 보고하였고, 이에 따라 국가가 실제보다 훨씬 많은 곡물을 징발하였다. 또한 개인의 토지와 수확이 없어져 농민의 노동 동기가 하락하였다.  &lt;br /&gt;
&lt;br /&gt;
===토법고로===&lt;br /&gt;
[[파일:Figure 6. 토법고로.png|섬네일|299x299픽셀|Figure 6. 토법고로]]&lt;br /&gt;
토법고로란 대약진 운동 시기, 중국 각지에서 &#039;재래식 용광로를 이용해 강철을 대량 생산하려 했던 정책&#039; 또는 &#039;그때 쓰인 용광로&#039;를 이르는 명칭이다. 이는 마오쩌둥에 의해서 강력하게 추진되었는데, 그의 주장은 몇 년 안에 영국을 따라잡으려면 철강 생산량을 폭발적으로 늘려야 한다는 것이었다. 하지만 문제는 농촌에 산업시설이 없었기 때문에, 그는 각 마을에서 재래식 용광로를 통해서 직접 철을 만들 것을 명령했다. &lt;br /&gt;
&lt;br /&gt;
이에 따라 농민과 주민들은 조잡한 용광로를 만들고 집에서 쓰던 금속 기구(냄비, 농기구 등)를 모아 녹여 &#039;강철&#039;을 만들었다. 문제는 당시 농민들은 강철 생산 기술은커녕 열처리나 단조가 뭔지조차 몰랐다는 것이다. 전통 방식으로(토법고로를 포함하여) 강철을 만들기 위해서는 대장장이같은 야금 전문가들이 불순물을 걸러내고 석탄과 풀무를 이용해 철을 환원시킨 후 철을 두드려서 탄소를 일정량 제거하고[6] 담금질을 비롯한 열처리까지 하는 기나긴 과정을 거쳐야 한다. 하지만 평범한 농민들은 이러한 공정에 대해서 하나도 몰랐고, 억지로 고철과 철광석을 녹여내 굳힌 결과 무려 60%가 다시 재처리하지 않으면 사용 자체가 불가능한 폐품급 철로 만들어 졌다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고로가 설치되면서 윗선에서는 매달 강철 얼마씩을 만들라고 할당량을 정해줬고, 못 채운 마을은 배급 감소를 비롯한 여러 불이익이 가해졌다. 농업을 죄다 집단화하여 사식의 개념이 폐지된 대약진 운동 당시엔 절대 무시할 수 없는 불이익이었다. 또한 이러한 목표치는 전례 없는 발전이라는 명목 하에 터무니 없이 높게 잡혔다. 이 때문에 수많은 농민들이 명예는 몰라도 굶어죽기는 싫어서 눈에 띄는 금속이란 금속은 전부 토법고로에 집어넣었다. 이때 녹이는 데에 사용된 금속들은 멀쩡한 각종 농기구와 트랙터 같은 농기계들, 식기구들, 양철 지분, 철도 등이 포함되었다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고소가 전국적으로 장기적으로 운용되었으니 당연히 토법고로가 제철을 하기 위해 필요로 하는 연료의 양은 상상을 초월했다. 농민들은 토법고로를 온전히 돌리기 위해 코크스가 아니라 인근 산천의 나무란 나무들을 모두 벌목해 땔감으로 썼으며, 그래도 모자라자 과수원의 과수들까지 싸그리 벌목해 땔감으로 썼다. 이렇게 토법고로가 전국적으로 활성화되자 산림이 씨가 마르기 시작했고 이렇게 생겨난 민둥산들은 비가 오면 토사가 씻겨 나가 산사태를 일으켰다. 이 과정에서 계단식 논이 직접적으로 피해를 입었고 흘러간 토사는 저수지로 유입되어 이를 메워버리면서 농업 용수가 부족해져 결국 농업까지 초토화되기 시작했다.&lt;br /&gt;
&lt;br /&gt;
===대기근===&lt;br /&gt;
인민공사와 토법고로 같은 마오쩌둥의 대실책의 결과, 1959년에서 1961년까지 중국은 대기근이라는 대재난을 겪었다. 이는 표면적으로 자연 재해에 의한 것이었지만, 사실은 토법고로를 만들기 위해 나무를 캐서 숲을 모두 민둥산으로 만든 탓에 생태계 순환 시스템 자체가 무너진 결과였다. 결국 대약진 운동으로 인하여 발생한 여러 문제점들이 근대사 이래 역사적인 대기근을 발생시켜 무려 3천만~5천만 명이 아사하는 사태가 발생했다. 이는 아래와 같은 중국 공산당의 여러 실책이 겹친 결과물이었다:&lt;br /&gt;
# 인민공사: 생산성 붕괴&lt;br /&gt;
#* 노동 동기 상실은 농촌의 생산성을 악화시켰다.&lt;br /&gt;
#* 생산량 실제보다 과장 보고하는 악습은 국가가 곡물을 초과 징발하도록 하였다.&lt;br /&gt;
# 토법 고로: 농민·청년·여성 모두 강철 생산에 동원되어 농업 생산량이 급락하였다.&lt;br /&gt;
#* 또한 토법고로로 인해 생태계가 파괴되고, 여러 자연재해를 야기했다.&lt;br /&gt;
#* 농기계와 농기구 등이 모두 녹여지며 농업 생산성이 급락하였다.&lt;br /&gt;
# 반우파 캠페인은 잘못된 보고라도 “상부 마음에 드는 보고”만 올리게 만들었다.&lt;br /&gt;
즉, 대기근은 단순히 흉작에서 기인한 것이 아니라 허위 보고, 강제 동원, 과잉 징수, 정치적 공포, 도덕적 마비, 행정적 무능 모두가 결합된 시스템 붕괴에서 기인하였다. 특히 당시 중국공산당의 2인자였던 펑더화이는 기근 현실을 직시하고 정책의 수정을 요구하였으나, 마오에게 반역자로 몰려 제거되었다.&lt;br /&gt;
&lt;br /&gt;
==문화대혁명==&lt;br /&gt;
대약진 운동의 결과로 3천만~5천만 명에 달하는 중국 인민들이 아사하고, 경제가 나락으로 추락하는 파멸적인 결과가 초래되자 이를 강행한 마오쩌둥의 권위는 추락하였고 그는 사실상 2선으로 후퇴하면서 국정에서 배제되었다. 물론 마오쩌둥은 이 시기에도 국부로서 절대적인 카리스마를 가지고 있었고, 중국공산당 중앙군사위원회 주석으로 군통수권을 쥐고 있었으므로 그 누구도 그를 거역할 수는 없었다. 문제는 마오쩌둥 본인이 대약진 운동이라는 엄청난 대삽질을 저질렀기 때문에 다시 정치 일선에 전면으로 나설 수 있을 만한 명분이 없었던 것이다.&lt;br /&gt;
[[파일:Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理).png|가운데|섬네일|600x600픽셀|Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理)]]&lt;br /&gt;
마오쩌둥이 1선에서 물러난 동안, 류사오치가 국가주석직을 승계해서 중국공산당 총서기 덩샤오핑과 함께 실용주의 정책을 펼쳐 중국 인민들의 호평을 듣게 되자 마오쩌둥은 류사오치와 덩샤오핑의 영향력이 점점 커지면서 자신이 권력에서 완전히 밀려날까 불안해 했다. 이에 마오쩌둥은 반대세력에 대한 반격이 필요하다고 여겼다. 문화대혁명의 한 축이 되었던 홍위병에 대해 이해할 필요가 있다. 당대 중국에선 대약진 운동의 실패로 중국공산당의 문제점이 드러나던 시기였고, 마오주의의 문제점도 드러나고 있었지만, 관료제의 폐해도 드러나고 있었다. 그러자 자연스럽게, 관료가 아닌 젊은 층에서는 점점 관료제에 대한 폐해가 인식되기 시작했다. 이 때문에 중국 각지에서 공산당에 대한 비판과 탈당, 홍콩으로의 망명 행렬이 쇄도했는데 류사오치와 덩샤오핑은 이것을 체제에 대한 도전으로 간주하고 마오쩌둥이 백화제방 운동을 반우파 투쟁으로 때려잡았듯이 공권력으로 반정부적인 학생세력을 마구 때려잡았다. 훗날 홍위병이라 불리는 집단도 처음에는 이렇게 조직된 반정부조직이었다.&lt;br /&gt;
&lt;br /&gt;
이들을 자신의 편으로 만들기 위해 마오쩌둥은 &amp;quot;부르주아와 자본주의 세력들이 다시 사회로 침투하고 있는데, 이들이 발붙이지 못하게 청년들이 바로잡아야 한다.&amp;quot;라는 어조의 연설을 하였다. 그리고 그리고 이 &#039;주자파&#039; 세력들은 다름 아닌 당 내부에 있다고 하며, 류사오치와 덩샤오핑을 표적으로 삼아 이들을 공격하며 그들의 핍박을 받던 학생들을 옹호했다. 이렇게 되자 마오쩌둥의 옹호를 받고 흥분한 청년들은 중국 전토 여기저기서 젊고, 앞뒤 안 가리고, 신격화된 마오쩌둥에 대한 충성심으로 불타는 이들을 주로 모아 홍위병이란 집단이 되었다.&lt;br /&gt;
&lt;br /&gt;
1966년 8월, 중국공산당 중앙위원회는 마오쩌둥의 논평에 맞춰 中国共产党中央委员会关于无产阶级文化大革命的决定(중국공산당 중앙위원회의 프롤레타리아 문화대혁명에 관한 결정)을 발표하는데, 내용을 요약하면 마오쩌둥이 하라는 대로 하는 게 진리라는 것이었다. 또한 마오쩌둥은 홍위병이 자유롭게 기존의 낡은 것들을 비판하고 타도할 수 있도록 허용하였다. 홍위병들의 활동에 사실상 한없는 자유를 부여하자, 각지에서 소위 낡은 것들을 모조리 파괴하고 다니기 시작했다. 절, 사당, 성당은 문을 닫거나 약탈되었으며, 베이징과 상하이에선 교사와 지식인 들이 낡은 사상의 소유자들이라는 이유로 홍위병들에게 붙들려 구타당했고 심지어 살해당하기까지 했다. &lt;br /&gt;
[[파일:Figure 8. 투쟁대회.png|섬네일|280x280픽셀|Figure 8. 투쟁대회]]&lt;br /&gt;
Figure 8은 투쟁대회(斗争会)의 한 장면을 보여준다. 투쟁대회에서는 지식인, 교사, 간부, 전문가들이 군중 앞에서 굴욕과 폭행을 당하였다. 큰 글씨로 “반당분자”, “자본주의 길을 걷는 자” 같은 문구를 적은 모자나 팻말을 쓰고 자아비판을 해야 했으며, 가족과 친구들까지 연루되기도 하였다. 이는 계급투쟁을 사회 전반에 퍼뜨리기 위한 정치적 폭력의 한 형태였다. &lt;br /&gt;
&lt;br /&gt;
류사오치는 결국 국가주석직에서 물러나고 가택연금 상태가 되었다. 그리고 덩샤오핑은 당직에서 쫓겨났고, 이른바 재교육을 세 번이나 받고 난 뒤 지방의 트랙터 엔진 공장에서 일하게 되었다. 이후 그는 1973년 저우언라이가 복귀시켜줄 때까지 꼼짝없이 그곳에 있어야만 했다. &lt;br /&gt;
&lt;br /&gt;
===상산하향 운동===&lt;br /&gt;
[[파일:Figure 9. 상산 하향 운동.png|가운데|섬네일|500x500픽셀|Figure 9. 상산 하향 운동]]&lt;br /&gt;
하지만 문화대혁명의 열기가 격력해짐에 따라 마오쩌둥조차도 홍위병을 완전히 통제할 수는 없었다. 마오쩌둥의 아버지를 부농이라며 비난하는 대자보가 붙을 정도였다. 결국 마오쩌둥은 1968년 7월 28일 공산당 지도부로 홍위병 운동의 지도자들을 불러 운동의 정지를 명했고, 1968년에서 1969년에 걸쳐서 상산하향 운동이 진행되었다. 이 운동은 마오쩌둥의 지시에 따라 &#039;젊은 학생들은 농민에게 배워야 한다&#039;라는 명분으로 학생들을 농촌으로 추방해 버린 것이다. 이때 중국에서는 시골로 한번 가면 도시 거주권을 박탈당해서 죽을 때까지 거기 살아야 되므로 홍위병에 대한 사실상의 토사구팽이었다. &lt;br /&gt;
&lt;br /&gt;
이 조치는 홍위병의 확산을 막기 위한 것이었지만, 이 역시 너무 지나치게 한 나머지 젊은 인재들이 모두 도시에서 빠져나가고 &#039;학력붕괴&#039;가 일어나서 무학 세대가 생겨났다고 할 정도로 중국에 엄청난 타격을 입혔다. 또한 시골로 간 홍위병들 또한 무사하진 못했는데, 그들이 간 시골에는 집도 없고, 밥도 없고, 질병과 해충과 폭력만 난무했고, 강제노동에 항의하다가 농촌 지역의 군인들한테 부르주아랍시고 맞아죽는 경우가 빈번했기 때문이다. 그리고, 동시에 중국 인민해방군과 중국 공안은 홍위병을 무력으로 진압하기 시작했고 이들을 대량으로 처형했다. &lt;br /&gt;
&lt;br /&gt;
===악영향===&lt;br /&gt;
문화대혁명은 중국의 광범위한 분야에 돌이킬 수 없는 악영향을 남겼다. 사회적으로는 홍위병과 각종 대중조직이 폭력을 일상화하며 교사·지식인·전문가 등을 잔혹하게 비판·고문하는 일이 전국적으로 벌어졌다. ‘사구(四舊)’ 철폐 운동의 이름으로 전통 문화유산·종교 시설·사적 문헌들이 파괴되었고, 중국 사회의 문화적 연속성은 깊은 상처를 입었다. 특히 교육 분야의 피해는 막대하여, 학교와 대학이 장기간 폐쇄되거나 학업이 중단되었으며, 수백만 명의 청년이 ‘상산하향(上山下鄕)’ 정책에 따라 강제로 농촌 지역에 내려가 노동에 종사해야 했다. 이로 인해 한 세대 전체가 정상적인 교육 기회를 잃어버리는 ‘잃어버린 세대’가 발생하였다.&lt;br /&gt;
&lt;br /&gt;
경제적으로도 문화대혁명은 심각한 타격을 남겼다. 전문가와 기술자가 ‘권위주의’ 또는 ‘전문가주의’로 비판받아 현장에서 배제되었고, 모든 생산 부문에서 노동자들이 정치 집회와 투쟁에 동원되면서 산업과 농업 생산이 크게 저하되었다. 이미 대약진운동과 대기근으로 약화된 경제 기반은 더욱 타격을 받아 정상적인 경제 운영이 불가능한 상황에 놓였고, 과학·기술·의학 등 주요 분야의 발전도 10년 이상 정체되었다.&lt;br /&gt;
&lt;br /&gt;
인권 측면에서는 대규모 폭행, 고문, 투쟁대회, 강제 고발이 일상적으로 벌어지면서 수많은 사람들이 사망하거나 부상을 입었고, 사회 전체가 공포와 불신의 분위기에 휩싸였다. 가족과 이웃 간의 신뢰도 붕괴되었으며, 공동체는 심각한 분열을 겪었다. 사상적으로는 마오 개인숭배가 절정에 달해, 비판적 사고와 학문적 자유가 억압되고 정치적 충성이 절대적 가치로 강요되었다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥의 죽음==&lt;br /&gt;
1976년 9월 9일, 중화인민공화국의 최고 지도자이자 중국 공산당의 핵심 인물이었던 마오쩌둥이 베이징에서 사망하였다. 그의 죽음은 1949년 건국 이후 27년간 유지되었던 마오 시대의 종식을 의미했으며, 오랜 기간 지속된 급진적 혁명 노선—특히 대약진운동과 문화대혁명—의 종결을 가능하게 하는 정치적 전환점이 되었다. 마오의 유해는 장례 기간 동안 공개적으로 안치되어 중국 지도부와 대중이 조문할 수 있도록 전시되었다.&lt;br /&gt;
&lt;br /&gt;
마오의 사망 직후 중국 공산당 내부에서는 권력 재편이 급속도로 진행되었다. 화궈펑이 공식적인 후계자로 지명되었고, 동시에 ‘4인방’이 체포되면서 문화대혁명 기간 동안 지속되었던 급진파의 영향력이 사실상 소멸하였다. 마오의 죽음은 이후 중국이 개혁·개방 노선으로 전환하는 역사적 출발점으로 평가된다. 덩샤오핑은 정치적으로 복권된 뒤 점차 실권을 장악하며 중국 경제·사회 구조의 대대적인 개혁을 주도하게 되었고, 이는 현대 중국의 국가 체제 변화로 이어졌다.&lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 사망은 단순한 지도자의 교체가 아니라, 중국 현대사에서 정치적 노선과 사회적 방향성을 근본적으로 바꾸어 놓은 결정적 사건으로 평가된다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_9._%EC%83%81%EC%82%B0_%ED%95%98%ED%96%A5_%EC%9A%B4%EB%8F%99.png&amp;diff=6268</id>
		<title>파일:Figure 9. 상산 하향 운동.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_9._%EC%83%81%EC%82%B0_%ED%95%98%ED%96%A5_%EC%9A%B4%EB%8F%99.png&amp;diff=6268"/>
		<updated>2025-11-21T05:15:41Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 9. 상산 하향 운동&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_8._%ED%88%AC%EC%9F%81%EB%8C%80%ED%9A%8C.png&amp;diff=6267</id>
		<title>파일:Figure 8. 투쟁대회.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_8._%ED%88%AC%EC%9F%81%EB%8C%80%ED%9A%8C.png&amp;diff=6267"/>
		<updated>2025-11-21T05:14:57Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 8. 투쟁대회&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_7._%EC%B2%9C%ED%95%98%EB%AC%B4%EC%A0%81%EC%9D%98_%EB%B3%91%EC%82%AC%EB%93%A4%EC%9D%98_%EB%B6%84%EB%85%B8%EA%B0%80_%ED%95%98%EB%8A%98%EC%97%90_%EA%B0%80%EB%93%9D%ED%95%98%EB%8B%A4._%EB%B0%98%EB%9E%80%EC%9D%80_%EC%A0%95%EB%8B%B9%ED%95%98%EB%8B%A4.(%E5%A4%A9%E5%85%B5%E6%80%92%E6%B0%94%E5%86%B2%E9%9C%84%E6%B1%89%E2%80%94%E9%80%A0%E5%8F%8D%E6%9C%89%E7%90%86).png&amp;diff=6266</id>
		<title>파일:Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理).png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_7._%EC%B2%9C%ED%95%98%EB%AC%B4%EC%A0%81%EC%9D%98_%EB%B3%91%EC%82%AC%EB%93%A4%EC%9D%98_%EB%B6%84%EB%85%B8%EA%B0%80_%ED%95%98%EB%8A%98%EC%97%90_%EA%B0%80%EB%93%9D%ED%95%98%EB%8B%A4._%EB%B0%98%EB%9E%80%EC%9D%80_%EC%A0%95%EB%8B%B9%ED%95%98%EB%8B%A4.(%E5%A4%A9%E5%85%B5%E6%80%92%E6%B0%94%E5%86%B2%E9%9C%84%E6%B1%89%E2%80%94%E9%80%A0%E5%8F%8D%E6%9C%89%E7%90%86).png&amp;diff=6266"/>
		<updated>2025-11-21T05:13:06Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 7. 천하무적의 병사들의 분노가 하늘에 가득하다. 반란은 정당하다.(天兵怒气冲霄汉—造反有理)&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_4._%EB%8C%80%EC%95%BD%EC%A7%84_%EC%9A%B4%EB%8F%99_%EC%84%A0%EC%A0%84_%ED%8F%AC%EC%8A%A4%ED%84%B0.png&amp;diff=6265</id>
		<title>파일:Figure 4. 대약진 운동 선전 포스터.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_4._%EB%8C%80%EC%95%BD%EC%A7%84_%EC%9A%B4%EB%8F%99_%EC%84%A0%EC%A0%84_%ED%8F%AC%EC%8A%A4%ED%84%B0.png&amp;diff=6265"/>
		<updated>2025-11-21T05:12:05Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 4. 대약진 운동 선전 포스터&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_6._%ED%86%A0%EB%B2%95%EA%B3%A0%EB%A1%9C.png&amp;diff=6264</id>
		<title>파일:Figure 6. 토법고로.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_6._%ED%86%A0%EB%B2%95%EA%B3%A0%EB%A1%9C.png&amp;diff=6264"/>
		<updated>2025-11-21T05:08:06Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 6. 토법고로&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_5._%EC%9D%B8%EB%AF%BC%EA%B3%B5%EC%82%AC.png&amp;diff=6263</id>
		<title>파일:Figure 5. 인민공사.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_5._%EC%9D%B8%EB%AF%BC%EA%B3%B5%EC%82%AC.png&amp;diff=6263"/>
		<updated>2025-11-21T05:07:09Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 5. 인민공사&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_4._%EB%8C%80%EC%95%BD%EC%A7%84_%EC%9A%B4%EB%8F%99.png&amp;diff=6262</id>
		<title>파일:Figure 4. 대약진 운동.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_4._%EB%8C%80%EC%95%BD%EC%A7%84_%EC%9A%B4%EB%8F%99.png&amp;diff=6262"/>
		<updated>2025-11-21T05:06:31Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 4. 대약진 운동&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_3._%EC%9E%90%EC%95%84%EB%B9%84%ED%8C%90.png&amp;diff=6261</id>
		<title>파일:Figure 3. 자아비판.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_3._%EC%9E%90%EC%95%84%EB%B9%84%ED%8C%90.png&amp;diff=6261"/>
		<updated>2025-11-21T05:04:34Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 3. 자아비판&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_2._%EB%8C%80%EC%9E%A5%EC%A0%95_%EA%B2%BD%EB%A1%9C.png&amp;diff=6260</id>
		<title>파일:Figure 2. 대장정 경로.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_2._%EB%8C%80%EC%9E%A5%EC%A0%95_%EA%B2%BD%EB%A1%9C.png&amp;diff=6260"/>
		<updated>2025-11-21T05:03:05Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 2. 대장정 경로&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_1._%EB%A7%88%EC%98%A4%EC%A9%8C%EB%91%A5.png&amp;diff=6259</id>
		<title>파일:Figure 1. 마오쩌둥.png</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Figure_1._%EB%A7%88%EC%98%A4%EC%A9%8C%EB%91%A5.png&amp;diff=6259"/>
		<updated>2025-11-21T05:02:14Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figure 1. 마오쩌둥&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6256</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6256"/>
		<updated>2025-11-21T04:58:44Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 악영향 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁과 집단 농촌화===&lt;br /&gt;
1949년 건국 직후 공산당의 가장 중요한 초기 정책은 지주·부농 계급 제거였으며, 이를 위해 토지를 농민들에게 재분배하여 공산당의 농촌 지배력을 강화하는 토지개혁이 진행되었다. Figure는 당시 시기의 전형적인 자아비판의 모습을 보여준다. 이미지 중앙에 무릎을 꿇은 사람은 지주로, 중국공산당과 당시 농민들에게 악한 것으로 규정되었다. 이는 토지개혁이 단순한 정책 집행이 아니라 대중을 정치적으로 동원하는 혁명적 의례였다는 것을 보여준다. &lt;br /&gt;
&lt;br /&gt;
토지개혁의 결과 지주 계층이 완전히 소멸하고, 농업 정책의 방향은 대규모 집단농장의 형태로 빠르게 나아갔다. 이 과정에서 개혁의 속도를 조절하자는 의견도 있었지만, 마오쩌둥은 이를 비난하며 더 빠르고 더 급진적인 집단화를 요구하였다. 아래는 그의 주장을 담은 글이다:&lt;br /&gt;
 “새로운 사회주의 대중운동의 거대한 물결이 곧 전국 농촌 지역을 휩쓸게 될 것이다. 그러나 우리의 몇몇 동지들은 마치 전족(纏足)한 여인처럼 비틀거리며, 늘 다른 사람들에게 불평을 늘어놓는다. ‘너무 빨리 간다, 너무 빨리 간다’라고 말하면서 말이다. 그들은 사소한 흠을 트집 잡고, 근거 없는 불평을 하고, 끝없는 걱정과 수많은 금기만 만들어내며, 이런 태도가 농촌 사회주의 대중운동을 지도하는 올바른 방침이라고 여긴다. 아니다... 이것은 잘못된 방침이다.”&lt;br /&gt;
마오쩌둥은 위와 같은 말을 통해서 신중론, 점진주의는 모두 반혁명적 보수성에 해당하며, 대중은 혁명적 열망을 가지고 있으므로 지도층은 대중을 억제하는 것이 아니라 더 큰 집단화를 밀어붙여야 한다고 주장한 것이다. 이러한 논리는 대약진 운동으로도 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==반우파 운동==&lt;br /&gt;
1956년, 마오쩌둥은 지식인들의 자유발언을 허용하는 문제를 논의했고 4월 28일 정치국 확대회의에서는 &#039;백화제방(百花齊放)，백가쟁명(百家爭鳴)&#039;이라는 방침을 제시했다. 아래는 1956년 5월 26일, 중국공산당 선전부장 루딩이(陸定一)가 여러 지식인 2천여 명을 모아놓고 &#039;백화제방, 백가쟁명&#039;에 대해 강연한 내용의 일부이다:&lt;br /&gt;
 &amp;quot;독립적인 사고와 자유로운 토론이 장려되지 않는다면 학술발전은 정체될 수밖에 없다는 사실을 역사는 보여준다. 문학예술활동과 과학연구에 있어서 독립적인 사고의 자유, 논쟁의 자유, 창작과 비평의 자유, 자기의 의견을 발표, 견지, 유보할 수 있는 제유를 제창한다.&amp;quot;&lt;br /&gt;
물론 우호적 비판은 허용하되 &#039;비난&#039;은 철저히 용납하지 않겠다는 입장이었지만, 지식인들은 반신반의하면서도 한편으로는 기뻐했다. 지식인들은 그동안의 사상개조운동의 영향으로 폐쇄된 언로와 중국공산당의 독주에 불만을 품으면서도 은근히 개방을 바라고 있었기 때문이다. 그러나 마오쩌둥의 노력에도 불구하고, 그동안 공산당에게 호되게 시달려왔던 지식인들은 쉽사리 입을 열지 않았다.  하지만 중국 공산당이 마오쩌둥의 뜻에 따라 공산당 내부의 문제에 대한 정풍운동을 1957년 4월 25일부터 전개하고 모든 &#039;우호적&#039; 비판을 허용한다는 입장을 거듭 표명하면서 지식인들은 점차 용기를 얻었다. 아래는 중공중앙통일전선부가 1957년에 주최한 좌담회에서 좌담회를 주최한 리웨이한이 말한 내용이다:&lt;br /&gt;
 &amp;quot;이 회의를 소집한 목적은 여러분에게 우리가 진행하고 있는 정풍을 원조해달라는 것과 우리의 결점과 잘못을 고칠 수 있도록 도와달라는 것이다. 통일전선의 방법을 가지고 우리의 정풍을 추진하는 것은 처음 있는 일로서 여러분이 자세한 비판과 의견을 많이 제시해 줄 것을 희망한다.&amp;quot;&lt;br /&gt;
이렇듯 마오쩌둥과 공산당이 대놓고 &#039;마음껏 떠들어도 좋다&#039;. &#039;절대로 계급투쟁을 하지 않겠다.&#039;라고 부추기자, 지식인들은 마침내 가슴속에 품어왔던 불만을 쏟아내기 시작했다. 이는 공산당원의 특권인식과 공산당의 무능, 공산당의 법과 제도를 운용할 능력의 부재, 공산당의 독주 비판 등 중국 사회 전체와 지금까지 중국 공산당이 진행한 여러 전반적인 정책에 관한 것이었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥은 &#039;백화제방&#039;, &#039;백가쟁명&#039; 방침을 정하고 지식인들에게 자유롭게 발언할 기회를 제공한 후 상황이 자신이 원하는 대로 돌아가지 않는 것을 목격했다. 지식인들은 공산당이 허용할 수 없는 범위의 비판을 넘어서 공산당의 통치 전반에 걸쳐 비판 및 비난을 퍼부었고, 일부 대학생들은 더 나아가 &amp;quot;공산당을 탈퇴하고 자유시민이 되자&amp;quot;, &amp;quot;마오쩌둥은 물러가라!&amp;quot; 등의 구호를 외쳤다. 이에 마오쩌둥은 지식인들에게 철퇴를 가하기로 결심했다. 아래는 1957년 7월 1일, 인민일보에 개재된 사설의 일부이다:&lt;br /&gt;
 중국민주동맹이 백가쟁명과 정풍 과정에서 행한 역할은 매우 열악하며 그들의 조직, 계획, 강령, 노선은 모두 인민을 도외시하는 것이며, 반공반사회주의이자 반공 반민주의이다. 그리고 농공민주당도 똑같다. (중략) 중국의 하늘은 흑구름으로 뒤덮였고, 이것의 출처는 장보쥔, 뤄룽지, 장즈중 동맹이다. 그들은 죄가 있으며, &#039;말하는 사람은 무죄다&#039;라는 원칙이 그들에게는 적용되지 않는다.&lt;br /&gt;
백화제방에서 정부를 비판한 사람들은 곧 ‘우파분자(Rightists)’로 규정되어 숙청 대상이 되어 약 55만 명이 숙청, 재교육, 노동교화로 끌려갔다. 이로 인하여 교육·관료·지식인 계층이 큰 타격을 입었고, 중국에서 정치적인 비판의 공간은 완전히 붕괴되었다.&lt;br /&gt;
&lt;br /&gt;
이에 대해 학계에서는 마오가 처음부터 비판자를 드러내기 위해 유도했다는 견해와, 진심으로 비판을 허용했지만 예상보다 훨씬 많은 비판이 쏟아지자 공산당이 공포심을 느껴 탄압으로 선회했다는 두 가지의 주장이 존재한다. 하지만 공통된 결과는 정치적 자유는 짧게 열렸다가 더욱 강하게 폐쇄되었다는 것이다.&lt;br /&gt;
&lt;br /&gt;
==대약진 운동==&lt;br /&gt;
대약진 운동(大跃进运动, &amp;quot;Great Leap Forward&amp;quot;)은 중국에서 중국공산당의 주도로 1958년부터 1962년경까지 실시되었던 경제, 사회 개발 운동이다. 이는 미국과의 체제 경쟁을 진행하던 소련의 노력을 보고 영감을 얻은 마오쩌둥이 영국을 따라잡을 목적으로 야심차게 준비한 경제 성장 계획이었으나, 결과적으로 중국의 성장을 수십 년 후퇴시켰던 역사적인 실책이다. 이는 농업/산업의 실제 생산 능력이 아니라 혁명적 낙관주의&amp;lt;ref&amp;gt;“혁명을 위한 의지와 열정만 있으면 자연도, 경제도, 과학도 이겨낼 수 있다”는 신념을 의미한다.&amp;lt;/ref&amp;gt;를 기반으로 하였으나, 기획 자체의 모순과 결함, 기술의 미비, 일의 순서를 무시한 강압적 추진 태도, 부정부패 등으로 처참히 실패하였다.&lt;br /&gt;
&lt;br /&gt;
===인민공사===&lt;br /&gt;
대약진 운동의 핵심 제도 중 하나는 인민공사(人民公社, Communes)였다. 이는 1958년 이후 기존의 작은 협동조합을 수천~수만 명 단위의 초대형 농업·사회 단위로 통합한 조직이었다. 하지만 이는 단순한 농업 단위가 아니라 행정 단위, 군사 단위, 생산 단위, 생활 단위로서 기능하는 하나의 작은 사회였다. 또한 해당 공동체 내에서는 모두가 함께 생활하였는데, figure는 당시 인민공사 내의 인민공사 생활이 어떻게 운영되었는지 보여준다. 사람들은 개인 요리를 하지 않고 모두 집단 식당에서 무료로 배식받았으며, 공동 생활은 사회주의적 연대와 같다고 강하게 선전되었다. &lt;br /&gt;
&lt;br /&gt;
그러나 인민공사는 많은 문제점을 낳았다. 사람들이 공동식당에 의존함에 따라 배급이 줄자 곧바로 기근이 발생하는 상황이 고착화되었다. 또한 성과에 목을 맨 관료들이 경쟁적으로 자신이 속한 인민공사의 생산량을 과장하여 보고하였고, 이에 따라 국가가 실제보다 훨씬 많은 곡물을 징발하였다. 또한 개인의 토지와 수확이 없어져 농민의 노동 동기가 하락하였다.  &lt;br /&gt;
&lt;br /&gt;
===토법고로===&lt;br /&gt;
토법고로란 대약진 운동 시기, 중국 각지에서 &#039;재래식 용광로를 이용해 강철을 대량 생산하려 했던 정책&#039; 또는 &#039;그때 쓰인 용광로&#039;를 이르는 명칭이다. 이는 마오쩌둥에 의해서 강력하게 추진되었는데, 그의 주장은 몇 년 안에 영국을 따라잡으려면 철강 생산량을 폭발적으로 늘려야 한다는 것이었다. 하지만 문제는 농촌에 산업시설이 없었기 때문에, 그는 각 마을에서 재래식 용광로를 통해서 직접 철을 만들 것을 명령했다. &lt;br /&gt;
&lt;br /&gt;
이에 따라 농민과 주민들은 조잡한 용광로를 만들고 집에서 쓰던 금속 기구(냄비, 농기구 등)를 모아 녹여 &#039;강철&#039;을 만들었다. 문제는 당시 농민들은 강철 생산 기술은커녕 열처리나 단조가 뭔지조차 몰랐다는 것이다. 전통 방식으로(토법고로를 포함하여) 강철을 만들기 위해서는 대장장이같은 야금 전문가들이 불순물을 걸러내고 석탄과 풀무를 이용해 철을 환원시킨 후 철을 두드려서 탄소를 일정량 제거하고[6] 담금질을 비롯한 열처리까지 하는 기나긴 과정을 거쳐야 한다. 하지만 평범한 농민들은 이러한 공정에 대해서 하나도 몰랐고, 억지로 고철과 철광석을 녹여내 굳힌 결과 무려 60%가 다시 재처리하지 않으면 사용 자체가 불가능한 폐품급 철로 만들어 졌다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고로가 설치되면서 윗선에서는 매달 강철 얼마씩을 만들라고 할당량을 정해줬고, 못 채운 마을은 배급 감소를 비롯한 여러 불이익이 가해졌다. 농업을 죄다 집단화하여 사식의 개념이 폐지된 대약진 운동 당시엔 절대 무시할 수 없는 불이익이었다. 또한 이러한 목표치는 전례 없는 발전이라는 명목 하에 터무니 없이 높게 잡혔다. 이 때문에 수많은 농민들이 명예는 몰라도 굶어죽기는 싫어서 눈에 띄는 금속이란 금속은 전부 토법고로에 집어넣었다. 이때 녹이는 데에 사용된 금속들은 멀쩡한 각종 농기구와 트랙터 같은 농기계들, 식기구들, 양철 지분, 철도 등이 포함되었다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고소가 전국적으로 장기적으로 운용되었으니 당연히 토법고로가 제철을 하기 위해 필요로 하는 연료의 양은 상상을 초월했다. 농민들은 토법고로를 온전히 돌리기 위해 코크스가 아니라 인근 산천의 나무란 나무들을 모두 벌목해 땔감으로 썼으며, 그래도 모자라자 과수원의 과수들까지 싸그리 벌목해 땔감으로 썼다. 이렇게 토법고로가 전국적으로 활성화되자 산림이 씨가 마르기 시작했고 이렇게 생겨난 민둥산들은 비가 오면 토사가 씻겨 나가 산사태를 일으켰다. 이 과정에서 계단식 논이 직접적으로 피해를 입었고 흘러간 토사는 저수지로 유입되어 이를 메워버리면서 농업 용수가 부족해져 결국 농업까지 초토화되기 시작했다.&lt;br /&gt;
&lt;br /&gt;
===대기근===&lt;br /&gt;
인민공사와 토법고로 같은 마오쩌둥의 대실책의 결과, 1959년에서 1961년까지 중국은 대기근이라는 대재난을 겪었다. 이는 표면적으로 자연 재해에 의한 것이었지만, 사실은 토법고로를 만들기 위해 나무를 캐서 숲을 모두 민둥산으로 만든 탓에 생태계 순환 시스템 자체가 무너진 결과였다. 결국 대약진 운동으로 인하여 발생한 여러 문제점들이 근대사 이래 역사적인 대기근을 발생시켜 무려 3천만~5천만 명이 아사하는 사태가 발생했다. 이는 아래와 같은 중국 공산당의 여러 실책이 겹친 결과물이었다:&lt;br /&gt;
# 인민공사: 생산성 붕괴&lt;br /&gt;
#* 노동 동기 상실은 농촌의 생산성을 악화시켰다.&lt;br /&gt;
#* 생산량 실제보다 과장 보고하는 악습은 국가가 곡물을 초과 징발하도록 하였다.&lt;br /&gt;
# 토법 고로: 농민·청년·여성 모두 강철 생산에 동원되어 농업 생산량이 급락하였다.&lt;br /&gt;
#* 또한 토법고로로 인해 생태계가 파괴되고, 여러 자연재해를 야기했다.&lt;br /&gt;
#* 농기계와 농기구 등이 모두 녹여지며 농업 생산성이 급락하였다.&lt;br /&gt;
# 반우파 캠페인은 잘못된 보고라도 “상부 마음에 드는 보고”만 올리게 만들었다.&lt;br /&gt;
즉, 대기근은 단순히 흉작에서 기인한 것이 아니라 허위 보고, 강제 동원, 과잉 징수, 정치적 공포, 도덕적 마비, 행정적 무능 모두가 결합된 시스템 붕괴에서 기인하였다. 특히 당시 중국공산당의 2인자였던 펑더화이는 기근 현실을 직시하고 정책의 수정을 요구하였으나, 마오에게 반역자로 몰려 제거되었다.&lt;br /&gt;
&lt;br /&gt;
==문화대혁명==&lt;br /&gt;
대약진 운동의 결과로 3천만~5천만 명에 달하는 중국 인민들이 아사하고, 경제가 나락으로 추락하는 파멸적인 결과가 초래되자 이를 강행한 마오쩌둥의 권위는 추락하였고 그는 사실상 2선으로 후퇴하면서 국정에서 배제되었다. 물론 마오쩌둥은 이 시기에도 국부로서 절대적인 카리스마를 가지고 있었고, 중국공산당 중앙군사위원회 주석으로 군통수권을 쥐고 있었으므로 그 누구도 그를 거역할 수는 없었다. 문제는 마오쩌둥 본인이 대약진 운동이라는 엄청난 대삽질을 저질렀기 때문에 다시 정치 일선에 전면으로 나설 수 있을 만한 명분이 없었던 것이다.&lt;br /&gt;
&lt;br /&gt;
마오쩌둥이 1선에서 물러난 동안, 류사오치가 국가주석직을 승계해서 중국공산당 총서기 덩샤오핑과 함께 실용주의 정책을 펼쳐 중국 인민들의 호평을 듣게 되자 마오쩌둥은 류사오치와 덩샤오핑의 영향력이 점점 커지면서 자신이 권력에서 완전히 밀려날까 불안해 했다. 이에 마오쩌둥은 반대세력에 대한 반격이 필요하다고 여겼다. 문화대혁명의 한 축이 되었던 홍위병에 대해 이해할 필요가 있다. 당대 중국에선 대약진 운동의 실패로 중국공산당의 문제점이 드러나던 시기였고, 마오주의의 문제점도 드러나고 있었지만, 관료제의 폐해도 드러나고 있었다. 그러자 자연스럽게, 관료가 아닌 젊은 층에서는 점점 관료제에 대한 폐해가 인식되기 시작했다. 이 때문에 중국 각지에서 공산당에 대한 비판과 탈당, 홍콩으로의 망명 행렬이 쇄도했는데 류사오치와 덩샤오핑은 이것을 체제에 대한 도전으로 간주하고 마오쩌둥이 백화제방 운동을 반우파 투쟁으로 때려잡았듯이 공권력으로 반정부적인 학생세력을 마구 때려잡았다. 훗날 홍위병이라 불리는 집단도 처음에는 이렇게 조직된 반정부조직이었다.&lt;br /&gt;
&lt;br /&gt;
이들을 자신의 편으로 만들기 위해 마오쩌둥은 &amp;quot;부르주아와 자본주의 세력들이 다시 사회로 침투하고 있는데, 이들이 발붙이지 못하게 청년들이 바로잡아야 한다.&amp;quot;라는 어조의 연설을 하였다. 그리고 그리고 이 &#039;주자파&#039; 세력들은 다름 아닌 당 내부에 있다고 하며, 류사오치와 덩샤오핑을 표적으로 삼아 이들을 공격하며 그들의 핍박을 받던 학생들을 옹호했다. 이렇게 되자 마오쩌둥의 옹호를 받고 흥분한 청년들은 중국 전토 여기저기서 젊고, 앞뒤 안 가리고, 신격화된 마오쩌둥에 대한 충성심으로 불타는 이들을 주로 모아 홍위병이란 집단이 되었다.&lt;br /&gt;
&lt;br /&gt;
1966년 8월, 중국공산당 중앙위원회는 마오쩌둥의 논평에 맞춰 中国共产党中央委员会关于无产阶级文化大革命的决定(중국공산당 중앙위원회의 프롤레타리아 문화대혁명에 관한 결정)을 발표하는데, 내용을 요약하면 마오쩌둥이 하라는 대로 하는 게 진리라는 것이었다. 또한 마오쩌둥은 홍위병이 자유롭게 기존의 낡은 것들을 비판하고 타도할 수 있도록 허용하였다. 홍위병들의 활동에 사실상 한없는 자유를 부여하자, 각지에서 소위 낡은 것들을 모조리 파괴하고 다니기 시작했다. 절, 사당, 성당은 문을 닫거나 약탈되었으며, 베이징과 상하이에선 교사와 지식인 들이 낡은 사상의 소유자들이라는 이유로 홍위병들에게 붙들려 구타당했고 심지어 살해당하기까지 했다. &lt;br /&gt;
&lt;br /&gt;
Figure 는 투쟁대회(斗争会)의 한 장면을 보여준다. 투쟁대회에서는 지식인, 교사, 간부, 전문가들이 군중 앞에서 굴욕과 폭행을 당하였다. 큰 글씨로 “반당분자”, “자본주의 길을 걷는 자” 같은 문구를 적은 모자나 팻말을 쓰고 자아비판을 해야 했으며, 가족과 친구들까지 연루되기도 하였다. 이는 계급투쟁을 사회 전반에 퍼뜨리기 위한 정치적 폭력의 한 형태였다. &lt;br /&gt;
&lt;br /&gt;
류사오치는 결국 국가주석직에서 물러나고 가택연금 상태가 되었다. 그리고 덩샤오핑은 당직에서 쫓겨났고, 이른바 재교육을 세 번이나 받고 난 뒤 지방의 트랙터 엔진 공장에서 일하게 되었다. 이후 그는 1973년 저우언라이가 복귀시켜줄 때까지 꼼짝없이 그곳에 있어야만 했다. &lt;br /&gt;
&lt;br /&gt;
===상산하향 운동===&lt;br /&gt;
하지만 문화대혁명의 열기가 격력해짐에 따라 마오쩌둥조차도 홍위병을 완전히 통제할 수는 없었다. 마오쩌둥의 아버지를 부농이라며 비난하는 대자보가 붙을 정도였다. 결국 마오쩌둥은 1968년 7월 28일 공산당 지도부로 홍위병 운동의 지도자들을 불러 운동의 정지를 명했고, 1968년에서 1969년에 걸쳐서 상산하향 운동이 진행되었다. 이 운동은 마오쩌둥의 지시에 따라 &#039;젊은 학생들은 농민에게 배워야 한다&#039;라는 명분으로 학생들을 농촌으로 추방해 버린 것이다. 이때 중국에서는 시골로 한번 가면 도시 거주권을 박탈당해서 죽을 때까지 거기 살아야 되므로 홍위병에 대한 사실상의 토사구팽이었다. &lt;br /&gt;
&lt;br /&gt;
이 조치는 홍위병의 확산을 막기 위한 것이었지만, 이 역시 너무 지나치게 한 나머지 젊은 인재들이 모두 도시에서 빠져나가고 &#039;학력붕괴&#039;가 일어나서 무학 세대가 생겨났다고 할 정도로 중국에 엄청난 타격을 입혔다. 또한 시골로 간 홍위병들 또한 무사하진 못했는데, 그들이 간 시골에는 집도 없고, 밥도 없고, 질병과 해충과 폭력만 난무했고, 강제노동에 항의하다가 농촌 지역의 군인들한테 부르주아랍시고 맞아죽는 경우가 빈번했기 때문이다. 그리고, 동시에 중국 인민해방군과 중국 공안은 홍위병을 무력으로 진압하기 시작했고 이들을 대량으로 처형했다. &lt;br /&gt;
&lt;br /&gt;
===악영향===&lt;br /&gt;
문화대혁명은 중국의 광범위한 분야에 돌이킬 수 없는 악영향을 남겼다. 사회적으로는 홍위병과 각종 대중조직이 폭력을 일상화하며 교사·지식인·전문가 등을 잔혹하게 비판·고문하는 일이 전국적으로 벌어졌다. ‘사구(四舊)’ 철폐 운동의 이름으로 전통 문화유산·종교 시설·사적 문헌들이 파괴되었고, 중국 사회의 문화적 연속성은 깊은 상처를 입었다. 특히 교육 분야의 피해는 막대하여, 학교와 대학이 장기간 폐쇄되거나 학업이 중단되었으며, 수백만 명의 청년이 ‘상산하향(上山下鄕)’ 정책에 따라 강제로 농촌 지역에 내려가 노동에 종사해야 했다. 이로 인해 한 세대 전체가 정상적인 교육 기회를 잃어버리는 ‘잃어버린 세대’가 발생하였다.&lt;br /&gt;
&lt;br /&gt;
경제적으로도 문화대혁명은 심각한 타격을 남겼다. 전문가와 기술자가 ‘권위주의’ 또는 ‘전문가주의’로 비판받아 현장에서 배제되었고, 모든 생산 부문에서 노동자들이 정치 집회와 투쟁에 동원되면서 산업과 농업 생산이 크게 저하되었다. 이미 대약진운동과 대기근으로 약화된 경제 기반은 더욱 타격을 받아 정상적인 경제 운영이 불가능한 상황에 놓였고, 과학·기술·의학 등 주요 분야의 발전도 10년 이상 정체되었다.&lt;br /&gt;
&lt;br /&gt;
인권 측면에서는 대규모 폭행, 고문, 투쟁대회, 강제 고발이 일상적으로 벌어지면서 수많은 사람들이 사망하거나 부상을 입었고, 사회 전체가 공포와 불신의 분위기에 휩싸였다. 가족과 이웃 간의 신뢰도 붕괴되었으며, 공동체는 심각한 분열을 겪었다. 사상적으로는 마오 개인숭배가 절정에 달해, 비판적 사고와 학문적 자유가 억압되고 정치적 충성이 절대적 가치로 강요되었다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥의 죽음==&lt;br /&gt;
1976년 9월 9일, 중화인민공화국의 최고 지도자이자 중국 공산당의 핵심 인물이었던 마오쩌둥이 베이징에서 사망하였다. 그의 죽음은 1949년 건국 이후 27년간 유지되었던 마오 시대의 종식을 의미했으며, 오랜 기간 지속된 급진적 혁명 노선—특히 대약진운동과 문화대혁명—의 종결을 가능하게 하는 정치적 전환점이 되었다. 마오의 유해는 장례 기간 동안 공개적으로 안치되어 중국 지도부와 대중이 조문할 수 있도록 전시되었다.&lt;br /&gt;
&lt;br /&gt;
마오의 사망 직후 중국 공산당 내부에서는 권력 재편이 급속도로 진행되었다. 화궈펑이 공식적인 후계자로 지명되었고, 동시에 ‘4인방’이 체포되면서 문화대혁명 기간 동안 지속되었던 급진파의 영향력이 사실상 소멸하였다. 마오의 죽음은 이후 중국이 개혁·개방 노선으로 전환하는 역사적 출발점으로 평가된다. 덩샤오핑은 정치적으로 복권된 뒤 점차 실권을 장악하며 중국 경제·사회 구조의 대대적인 개혁을 주도하게 되었고, 이는 현대 중국의 국가 체제 변화로 이어졌다.&lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 사망은 단순한 지도자의 교체가 아니라, 중국 현대사에서 정치적 노선과 사회적 방향성을 근본적으로 바꾸어 놓은 결정적 사건으로 평가된다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6255</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6255"/>
		<updated>2025-11-21T04:55:21Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 대약진운동 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁과 집단 농촌화===&lt;br /&gt;
1949년 건국 직후 공산당의 가장 중요한 초기 정책은 지주·부농 계급 제거였으며, 이를 위해 토지를 농민들에게 재분배하여 공산당의 농촌 지배력을 강화하는 토지개혁이 진행되었다. Figure는 당시 시기의 전형적인 자아비판의 모습을 보여준다. 이미지 중앙에 무릎을 꿇은 사람은 지주로, 중국공산당과 당시 농민들에게 악한 것으로 규정되었다. 이는 토지개혁이 단순한 정책 집행이 아니라 대중을 정치적으로 동원하는 혁명적 의례였다는 것을 보여준다. &lt;br /&gt;
&lt;br /&gt;
토지개혁의 결과 지주 계층이 완전히 소멸하고, 농업 정책의 방향은 대규모 집단농장의 형태로 빠르게 나아갔다. 이 과정에서 개혁의 속도를 조절하자는 의견도 있었지만, 마오쩌둥은 이를 비난하며 더 빠르고 더 급진적인 집단화를 요구하였다. 아래는 그의 주장을 담은 글이다:&lt;br /&gt;
 “새로운 사회주의 대중운동의 거대한 물결이 곧 전국 농촌 지역을 휩쓸게 될 것이다. 그러나 우리의 몇몇 동지들은 마치 전족(纏足)한 여인처럼 비틀거리며, 늘 다른 사람들에게 불평을 늘어놓는다. ‘너무 빨리 간다, 너무 빨리 간다’라고 말하면서 말이다. 그들은 사소한 흠을 트집 잡고, 근거 없는 불평을 하고, 끝없는 걱정과 수많은 금기만 만들어내며, 이런 태도가 농촌 사회주의 대중운동을 지도하는 올바른 방침이라고 여긴다. 아니다... 이것은 잘못된 방침이다.”&lt;br /&gt;
마오쩌둥은 위와 같은 말을 통해서 신중론, 점진주의는 모두 반혁명적 보수성에 해당하며, 대중은 혁명적 열망을 가지고 있으므로 지도층은 대중을 억제하는 것이 아니라 더 큰 집단화를 밀어붙여야 한다고 주장한 것이다. 이러한 논리는 대약진 운동으로도 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==반우파 운동==&lt;br /&gt;
1956년, 마오쩌둥은 지식인들의 자유발언을 허용하는 문제를 논의했고 4월 28일 정치국 확대회의에서는 &#039;백화제방(百花齊放)，백가쟁명(百家爭鳴)&#039;이라는 방침을 제시했다. 아래는 1956년 5월 26일, 중국공산당 선전부장 루딩이(陸定一)가 여러 지식인 2천여 명을 모아놓고 &#039;백화제방, 백가쟁명&#039;에 대해 강연한 내용의 일부이다:&lt;br /&gt;
 &amp;quot;독립적인 사고와 자유로운 토론이 장려되지 않는다면 학술발전은 정체될 수밖에 없다는 사실을 역사는 보여준다. 문학예술활동과 과학연구에 있어서 독립적인 사고의 자유, 논쟁의 자유, 창작과 비평의 자유, 자기의 의견을 발표, 견지, 유보할 수 있는 제유를 제창한다.&amp;quot;&lt;br /&gt;
물론 우호적 비판은 허용하되 &#039;비난&#039;은 철저히 용납하지 않겠다는 입장이었지만, 지식인들은 반신반의하면서도 한편으로는 기뻐했다. 지식인들은 그동안의 사상개조운동의 영향으로 폐쇄된 언로와 중국공산당의 독주에 불만을 품으면서도 은근히 개방을 바라고 있었기 때문이다. 그러나 마오쩌둥의 노력에도 불구하고, 그동안 공산당에게 호되게 시달려왔던 지식인들은 쉽사리 입을 열지 않았다.  하지만 중국 공산당이 마오쩌둥의 뜻에 따라 공산당 내부의 문제에 대한 정풍운동을 1957년 4월 25일부터 전개하고 모든 &#039;우호적&#039; 비판을 허용한다는 입장을 거듭 표명하면서 지식인들은 점차 용기를 얻었다. 아래는 중공중앙통일전선부가 1957년에 주최한 좌담회에서 좌담회를 주최한 리웨이한이 말한 내용이다:&lt;br /&gt;
 &amp;quot;이 회의를 소집한 목적은 여러분에게 우리가 진행하고 있는 정풍을 원조해달라는 것과 우리의 결점과 잘못을 고칠 수 있도록 도와달라는 것이다. 통일전선의 방법을 가지고 우리의 정풍을 추진하는 것은 처음 있는 일로서 여러분이 자세한 비판과 의견을 많이 제시해 줄 것을 희망한다.&amp;quot;&lt;br /&gt;
이렇듯 마오쩌둥과 공산당이 대놓고 &#039;마음껏 떠들어도 좋다&#039;. &#039;절대로 계급투쟁을 하지 않겠다.&#039;라고 부추기자, 지식인들은 마침내 가슴속에 품어왔던 불만을 쏟아내기 시작했다. 이는 공산당원의 특권인식과 공산당의 무능, 공산당의 법과 제도를 운용할 능력의 부재, 공산당의 독주 비판 등 중국 사회 전체와 지금까지 중국 공산당이 진행한 여러 전반적인 정책에 관한 것이었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥은 &#039;백화제방&#039;, &#039;백가쟁명&#039; 방침을 정하고 지식인들에게 자유롭게 발언할 기회를 제공한 후 상황이 자신이 원하는 대로 돌아가지 않는 것을 목격했다. 지식인들은 공산당이 허용할 수 없는 범위의 비판을 넘어서 공산당의 통치 전반에 걸쳐 비판 및 비난을 퍼부었고, 일부 대학생들은 더 나아가 &amp;quot;공산당을 탈퇴하고 자유시민이 되자&amp;quot;, &amp;quot;마오쩌둥은 물러가라!&amp;quot; 등의 구호를 외쳤다. 이에 마오쩌둥은 지식인들에게 철퇴를 가하기로 결심했다. 아래는 1957년 7월 1일, 인민일보에 개재된 사설의 일부이다:&lt;br /&gt;
 중국민주동맹이 백가쟁명과 정풍 과정에서 행한 역할은 매우 열악하며 그들의 조직, 계획, 강령, 노선은 모두 인민을 도외시하는 것이며, 반공반사회주의이자 반공 반민주의이다. 그리고 농공민주당도 똑같다. (중략) 중국의 하늘은 흑구름으로 뒤덮였고, 이것의 출처는 장보쥔, 뤄룽지, 장즈중 동맹이다. 그들은 죄가 있으며, &#039;말하는 사람은 무죄다&#039;라는 원칙이 그들에게는 적용되지 않는다.&lt;br /&gt;
백화제방에서 정부를 비판한 사람들은 곧 ‘우파분자(Rightists)’로 규정되어 숙청 대상이 되어 약 55만 명이 숙청, 재교육, 노동교화로 끌려갔다. 이로 인하여 교육·관료·지식인 계층이 큰 타격을 입었고, 중국에서 정치적인 비판의 공간은 완전히 붕괴되었다.&lt;br /&gt;
&lt;br /&gt;
이에 대해 학계에서는 마오가 처음부터 비판자를 드러내기 위해 유도했다는 견해와, 진심으로 비판을 허용했지만 예상보다 훨씬 많은 비판이 쏟아지자 공산당이 공포심을 느껴 탄압으로 선회했다는 두 가지의 주장이 존재한다. 하지만 공통된 결과는 정치적 자유는 짧게 열렸다가 더욱 강하게 폐쇄되었다는 것이다.&lt;br /&gt;
&lt;br /&gt;
==대약진 운동==&lt;br /&gt;
대약진 운동(大跃进运动, &amp;quot;Great Leap Forward&amp;quot;)은 중국에서 중국공산당의 주도로 1958년부터 1962년경까지 실시되었던 경제, 사회 개발 운동이다. 이는 미국과의 체제 경쟁을 진행하던 소련의 노력을 보고 영감을 얻은 마오쩌둥이 영국을 따라잡을 목적으로 야심차게 준비한 경제 성장 계획이었으나, 결과적으로 중국의 성장을 수십 년 후퇴시켰던 역사적인 실책이다. 이는 농업/산업의 실제 생산 능력이 아니라 혁명적 낙관주의&amp;lt;ref&amp;gt;“혁명을 위한 의지와 열정만 있으면 자연도, 경제도, 과학도 이겨낼 수 있다”는 신념을 의미한다.&amp;lt;/ref&amp;gt;를 기반으로 하였으나, 기획 자체의 모순과 결함, 기술의 미비, 일의 순서를 무시한 강압적 추진 태도, 부정부패 등으로 처참히 실패하였다.&lt;br /&gt;
&lt;br /&gt;
===인민공사===&lt;br /&gt;
대약진 운동의 핵심 제도 중 하나는 인민공사(人民公社, Communes)였다. 이는 1958년 이후 기존의 작은 협동조합을 수천~수만 명 단위의 초대형 농업·사회 단위로 통합한 조직이었다. 하지만 이는 단순한 농업 단위가 아니라 행정 단위, 군사 단위, 생산 단위, 생활 단위로서 기능하는 하나의 작은 사회였다. 또한 해당 공동체 내에서는 모두가 함께 생활하였는데, figure는 당시 인민공사 내의 인민공사 생활이 어떻게 운영되었는지 보여준다. 사람들은 개인 요리를 하지 않고 모두 집단 식당에서 무료로 배식받았으며, 공동 생활은 사회주의적 연대와 같다고 강하게 선전되었다. &lt;br /&gt;
&lt;br /&gt;
그러나 인민공사는 많은 문제점을 낳았다. 사람들이 공동식당에 의존함에 따라 배급이 줄자 곧바로 기근이 발생하는 상황이 고착화되었다. 또한 성과에 목을 맨 관료들이 경쟁적으로 자신이 속한 인민공사의 생산량을 과장하여 보고하였고, 이에 따라 국가가 실제보다 훨씬 많은 곡물을 징발하였다. 또한 개인의 토지와 수확이 없어져 농민의 노동 동기가 하락하였다.  &lt;br /&gt;
&lt;br /&gt;
===토법고로===&lt;br /&gt;
토법고로란 대약진 운동 시기, 중국 각지에서 &#039;재래식 용광로를 이용해 강철을 대량 생산하려 했던 정책&#039; 또는 &#039;그때 쓰인 용광로&#039;를 이르는 명칭이다. 이는 마오쩌둥에 의해서 강력하게 추진되었는데, 그의 주장은 몇 년 안에 영국을 따라잡으려면 철강 생산량을 폭발적으로 늘려야 한다는 것이었다. 하지만 문제는 농촌에 산업시설이 없었기 때문에, 그는 각 마을에서 재래식 용광로를 통해서 직접 철을 만들 것을 명령했다. &lt;br /&gt;
&lt;br /&gt;
이에 따라 농민과 주민들은 조잡한 용광로를 만들고 집에서 쓰던 금속 기구(냄비, 농기구 등)를 모아 녹여 &#039;강철&#039;을 만들었다. 문제는 당시 농민들은 강철 생산 기술은커녕 열처리나 단조가 뭔지조차 몰랐다는 것이다. 전통 방식으로(토법고로를 포함하여) 강철을 만들기 위해서는 대장장이같은 야금 전문가들이 불순물을 걸러내고 석탄과 풀무를 이용해 철을 환원시킨 후 철을 두드려서 탄소를 일정량 제거하고[6] 담금질을 비롯한 열처리까지 하는 기나긴 과정을 거쳐야 한다. 하지만 평범한 농민들은 이러한 공정에 대해서 하나도 몰랐고, 억지로 고철과 철광석을 녹여내 굳힌 결과 무려 60%가 다시 재처리하지 않으면 사용 자체가 불가능한 폐품급 철로 만들어 졌다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고로가 설치되면서 윗선에서는 매달 강철 얼마씩을 만들라고 할당량을 정해줬고, 못 채운 마을은 배급 감소를 비롯한 여러 불이익이 가해졌다. 농업을 죄다 집단화하여 사식의 개념이 폐지된 대약진 운동 당시엔 절대 무시할 수 없는 불이익이었다. 또한 이러한 목표치는 전례 없는 발전이라는 명목 하에 터무니 없이 높게 잡혔다. 이 때문에 수많은 농민들이 명예는 몰라도 굶어죽기는 싫어서 눈에 띄는 금속이란 금속은 전부 토법고로에 집어넣었다. 이때 녹이는 데에 사용된 금속들은 멀쩡한 각종 농기구와 트랙터 같은 농기계들, 식기구들, 양철 지분, 철도 등이 포함되었다. &lt;br /&gt;
&lt;br /&gt;
또한 토법고소가 전국적으로 장기적으로 운용되었으니 당연히 토법고로가 제철을 하기 위해 필요로 하는 연료의 양은 상상을 초월했다. 농민들은 토법고로를 온전히 돌리기 위해 코크스가 아니라 인근 산천의 나무란 나무들을 모두 벌목해 땔감으로 썼으며, 그래도 모자라자 과수원의 과수들까지 싸그리 벌목해 땔감으로 썼다. 이렇게 토법고로가 전국적으로 활성화되자 산림이 씨가 마르기 시작했고 이렇게 생겨난 민둥산들은 비가 오면 토사가 씻겨 나가 산사태를 일으켰다. 이 과정에서 계단식 논이 직접적으로 피해를 입었고 흘러간 토사는 저수지로 유입되어 이를 메워버리면서 농업 용수가 부족해져 결국 농업까지 초토화되기 시작했다.&lt;br /&gt;
&lt;br /&gt;
===대기근===&lt;br /&gt;
인민공사와 토법고로 같은 마오쩌둥의 대실책의 결과, 1959년에서 1961년까지 중국은 대기근이라는 대재난을 겪었다. 이는 표면적으로 자연 재해에 의한 것이었지만, 사실은 토법고로를 만들기 위해 나무를 캐서 숲을 모두 민둥산으로 만든 탓에 생태계 순환 시스템 자체가 무너진 결과였다. 결국 대약진 운동으로 인하여 발생한 여러 문제점들이 근대사 이래 역사적인 대기근을 발생시켜 무려 3천만~5천만 명이 아사하는 사태가 발생했다. 이는 아래와 같은 중국 공산당의 여러 실책이 겹친 결과물이었다:&lt;br /&gt;
# 인민공사: 생산성 붕괴&lt;br /&gt;
#* 노동 동기 상실은 농촌의 생산성을 악화시켰다.&lt;br /&gt;
#* 생산량 실제보다 과장 보고하는 악습은 국가가 곡물을 초과 징발하도록 하였다.&lt;br /&gt;
# 토법 고로: 농민·청년·여성 모두 강철 생산에 동원되어 농업 생산량이 급락하였다.&lt;br /&gt;
#* 또한 토법고로로 인해 생태계가 파괴되고, 여러 자연재해를 야기했다.&lt;br /&gt;
#* 농기계와 농기구 등이 모두 녹여지며 농업 생산성이 급락하였다.&lt;br /&gt;
# 반우파 캠페인은 잘못된 보고라도 “상부 마음에 드는 보고”만 올리게 만들었다.&lt;br /&gt;
즉, 대기근은 단순히 흉작에서 기인한 것이 아니라 허위 보고, 강제 동원, 과잉 징수, 정치적 공포, 도덕적 마비, 행정적 무능 모두가 결합된 시스템 붕괴에서 기인하였다. 특히 당시 중국공산당의 2인자였던 펑더화이는 기근 현실을 직시하고 정책의 수정을 요구하였으나, 마오에게 반역자로 몰려 제거되었다.&lt;br /&gt;
&lt;br /&gt;
==문화대혁명==&lt;br /&gt;
대약진 운동의 결과로 3천만~5천만 명에 달하는 중국 인민들이 아사하고, 경제가 나락으로 추락하는 파멸적인 결과가 초래되자 이를 강행한 마오쩌둥의 권위는 추락하였고 그는 사실상 2선으로 후퇴하면서 국정에서 배제되었다. 물론 마오쩌둥은 이 시기에도 국부로서 절대적인 카리스마를 가지고 있었고, 중국공산당 중앙군사위원회 주석으로 군통수권을 쥐고 있었으므로 그 누구도 그를 거역할 수는 없었다. 문제는 마오쩌둥 본인이 대약진 운동이라는 엄청난 대삽질을 저질렀기 때문에 다시 정치 일선에 전면으로 나설 수 있을 만한 명분이 없었던 것이다.&lt;br /&gt;
&lt;br /&gt;
마오쩌둥이 1선에서 물러난 동안, 류사오치가 국가주석직을 승계해서 중국공산당 총서기 덩샤오핑과 함께 실용주의 정책을 펼쳐 중국 인민들의 호평을 듣게 되자 마오쩌둥은 류사오치와 덩샤오핑의 영향력이 점점 커지면서 자신이 권력에서 완전히 밀려날까 불안해 했다. 이에 마오쩌둥은 반대세력에 대한 반격이 필요하다고 여겼다. 문화대혁명의 한 축이 되었던 홍위병에 대해 이해할 필요가 있다. 당대 중국에선 대약진 운동의 실패로 중국공산당의 문제점이 드러나던 시기였고, 마오주의의 문제점도 드러나고 있었지만, 관료제의 폐해도 드러나고 있었다. 그러자 자연스럽게, 관료가 아닌 젊은 층에서는 점점 관료제에 대한 폐해가 인식되기 시작했다. 이 때문에 중국 각지에서 공산당에 대한 비판과 탈당, 홍콩으로의 망명 행렬이 쇄도했는데 류사오치와 덩샤오핑은 이것을 체제에 대한 도전으로 간주하고 마오쩌둥이 백화제방 운동을 반우파 투쟁으로 때려잡았듯이 공권력으로 반정부적인 학생세력을 마구 때려잡았다. 훗날 홍위병이라 불리는 집단도 처음에는 이렇게 조직된 반정부조직이었다.&lt;br /&gt;
&lt;br /&gt;
이들을 자신의 편으로 만들기 위해 마오쩌둥은 &amp;quot;부르주아와 자본주의 세력들이 다시 사회로 침투하고 있는데, 이들이 발붙이지 못하게 청년들이 바로잡아야 한다.&amp;quot;라는 어조의 연설을 하였다. 그리고 그리고 이 &#039;주자파&#039; 세력들은 다름 아닌 당 내부에 있다고 하며, 류사오치와 덩샤오핑을 표적으로 삼아 이들을 공격하며 그들의 핍박을 받던 학생들을 옹호했다. 이렇게 되자 마오쩌둥의 옹호를 받고 흥분한 청년들은 중국 전토 여기저기서 젊고, 앞뒤 안 가리고, 신격화된 마오쩌둥에 대한 충성심으로 불타는 이들을 주로 모아 홍위병이란 집단이 되었다.&lt;br /&gt;
&lt;br /&gt;
1966년 8월, 중국공산당 중앙위원회는 마오쩌둥의 논평에 맞춰 中国共产党中央委员会关于无产阶级文化大革命的决定(중국공산당 중앙위원회의 프롤레타리아 문화대혁명에 관한 결정)을 발표하는데, 내용을 요약하면 마오쩌둥이 하라는 대로 하는 게 진리라는 것이었다. 또한 마오쩌둥은 홍위병이 자유롭게 기존의 낡은 것들을 비판하고 타도할 수 있도록 허용하였다. 홍위병들의 활동에 사실상 한없는 자유를 부여하자, 각지에서 소위 낡은 것들을 모조리 파괴하고 다니기 시작했다. 절, 사당, 성당은 문을 닫거나 약탈되었으며, 베이징과 상하이에선 교사와 지식인 들이 낡은 사상의 소유자들이라는 이유로 홍위병들에게 붙들려 구타당했고 심지어 살해당하기까지 했다. &lt;br /&gt;
&lt;br /&gt;
Figure 는 투쟁대회(斗争会)의 한 장면을 보여준다. 투쟁대회에서는 지식인, 교사, 간부, 전문가들이 군중 앞에서 굴욕과 폭행을 당하였다. 큰 글씨로 “반당분자”, “자본주의 길을 걷는 자” 같은 문구를 적은 모자나 팻말을 쓰고 자아비판을 해야 했으며, 가족과 친구들까지 연루되기도 하였다. 이는 계급투쟁을 사회 전반에 퍼뜨리기 위한 정치적 폭력의 한 형태였다. &lt;br /&gt;
&lt;br /&gt;
류사오치는 결국 국가주석직에서 물러나고 가택연금 상태가 되었다. 그리고 덩샤오핑은 당직에서 쫓겨났고, 이른바 재교육을 세 번이나 받고 난 뒤 지방의 트랙터 엔진 공장에서 일하게 되었다. 이후 그는 1973년 저우언라이가 복귀시켜줄 때까지 꼼짝없이 그곳에 있어야만 했다. &lt;br /&gt;
&lt;br /&gt;
===상산하향 운동===&lt;br /&gt;
하지만 문화대혁명의 열기가 격력해짐에 따라 마오쩌둥조차도 홍위병을 완전히 통제할 수는 없었다. 마오쩌둥의 아버지를 부농이라며 비난하는 대자보가 붙을 정도였다. 결국 마오쩌둥은 1968년 7월 28일 공산당 지도부로 홍위병 운동의 지도자들을 불러 운동의 정지를 명했고, 1968년에서 1969년에 걸쳐서 상산하향 운동이 진행되었다. 이 운동은 마오쩌둥의 지시에 따라 &#039;젊은 학생들은 농민에게 배워야 한다&#039;라는 명분으로 학생들을 농촌으로 추방해 버린 것이다. 이때 중국에서는 시골로 한번 가면 도시 거주권을 박탈당해서 죽을 때까지 거기 살아야 되므로 홍위병에 대한 사실상의 토사구팽이었다. &lt;br /&gt;
&lt;br /&gt;
이 조치는 홍위병의 확산을 막기 위한 것이었지만, 이 역시 너무 지나치게 한 나머지 젊은 인재들이 모두 도시에서 빠져나가고 &#039;학력붕괴&#039;가 일어나서 무학 세대가 생겨났다고 할 정도로 중국에 엄청난 타격을 입혔다. 또한 시골로 간 홍위병들 또한 무사하진 못했는데, 그들이 간 시골에는 집도 없고, 밥도 없고, 질병과 해충과 폭력만 난무했고, 강제노동에 항의하다가 농촌 지역의 군인들한테 부르주아랍시고 맞아죽는 경우가 빈번했기 때문이다. 그리고, 동시에 중국 인민해방군과 중국 공안은 홍위병을 무력으로 진압하기 시작했고 이들을 대량으로 처형했다. &lt;br /&gt;
&lt;br /&gt;
===악영향===&lt;br /&gt;
문화대혁명은 중국의 광범위한 분야에 돌이킬 수 없는 악영향을 남겼다. 사회적으로는 홍위병과 각종 대중조직이 폭력을 일상화하며 교사·지식인·전문가 등을 잔혹하게 비판·고문하는 일이 전국적으로 벌어졌다. ‘사구(四舊)’ 철폐 운동의 이름으로 전통 문화유산·종교 시설·사적 문헌들이 파괴되었고, 중국 사회의 문화적 연속성은 깊은 상처를 입었다. 특히 교육 분야의 피해는 막대하여, 학교와 대학이 장기간 폐쇄되거나 학업이 중단되었으며, 수백만 명의 청년이 ‘상산하향(上山下鄕)’ 정책에 따라 강제로 농촌 지역에 내려가 노동에 종사해야 했다. 이로 인해 한 세대 전체가 정상적인 교육 기회를 잃어버리는 ‘잃어버린 세대’가 발생하였다.&lt;br /&gt;
&lt;br /&gt;
경제적으로도 문화대혁명은 심각한 타격을 남겼다. 전문가와 기술자가 ‘권위주의’ 또는 ‘전문가주의’로 비판받아 현장에서 배제되었고, 모든 생산 부문에서 노동자들이 정치 집회와 투쟁에 동원되면서 산업과 농업 생산이 크게 저하되었다. 이미 대약진운동과 대기근으로 약화된 경제 기반은 더욱 타격을 받아 정상적인 경제 운영이 불가능한 상황에 놓였고, 과학·기술·의학 등 주요 분야의 발전도 10년 이상 정체되었다.&lt;br /&gt;
&lt;br /&gt;
인권 측면에서는 대규모 폭행, 고문, 투쟁대회, 강제 고발이 일상적으로 벌어지면서 수많은 사람들이 사망하거나 부상을 입었고, 사회 전체가 공포와 불신의 분위기에 휩싸였다. 가족과 이웃 간의 신뢰도 붕괴되었으며, 공동체는 심각한 분열을 겪었다. 사상적으로는 마오 개인숭배가 절정에 달해, 비판적 사고와 학문적 자유가 억압되고 정치적 충성이 절대적 가치로 강요되었다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6254</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6254"/>
		<updated>2025-11-21T03:44:43Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 토지개혁 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁과 집단 농촌화===&lt;br /&gt;
1949년 건국 직후 공산당의 가장 중요한 초기 정책은 지주·부농 계급 제거였으며, 이를 위해 토지를 농민들에게 재분배하여 공산당의 농촌 지배력을 강화하는 토지개혁이 진행되었다. Figure는 당시 시기의 전형적인 자아비판의 모습을 보여준다. 이미지 중앙에 무릎을 꿇은 사람은 지주로, 중국공산당과 당시 농민들에게 악한 것으로 규정되었다. 이는 토지개혁이 단순한 정책 집행이 아니라 대중을 정치적으로 동원하는 혁명적 의례였다는 것을 보여준다. &lt;br /&gt;
&lt;br /&gt;
토지개혁의 결과 지주 계층이 완전히 소멸하고, 농업 정책의 방향은 대규모 집단농장의 형태로 빠르게 나아갔다. 이 과정에서 개혁의 속도를 조절하자는 의견도 있었지만, 마오쩌둥은 이를 비난하며 더 빠르고 더 급진적인 집단화를 요구하였다. 아래는 그의 주장을 담은 글이다:&lt;br /&gt;
 “새로운 사회주의 대중운동의 거대한 물결이 곧 전국 농촌 지역을 휩쓸게 될 것이다. 그러나 우리의 몇몇 동지들은 마치 전족(纏足)한 여인처럼 비틀거리며, 늘 다른 사람들에게 불평을 늘어놓는다. ‘너무 빨리 간다, 너무 빨리 간다’라고 말하면서 말이다. 그들은 사소한 흠을 트집 잡고, 근거 없는 불평을 하고, 끝없는 걱정과 수많은 금기만 만들어내며, 이런 태도가 농촌 사회주의 대중운동을 지도하는 올바른 방침이라고 여긴다. 아니다... 이것은 잘못된 방침이다.”&lt;br /&gt;
마오쩌둥은 위와 같은 말을 통해서 신중론, 점진주의는 모두 반혁명적 보수성에 해당하며, 대중은 혁명적 열망을 가지고 있으므로 지도층은 대중을 억제하는 것이 아니라 더 큰 집단화를 밀어붙여야 한다고 주장한 것이다. 이러한 논리는 대약진 운동으로도 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==반우파 운동==&lt;br /&gt;
1956년, 마오쩌둥은 지식인들의 자유발언을 허용하는 문제를 논의했고 4월 28일 정치국 확대회의에서는 &#039;백화제방(百花齊放)，백가쟁명(百家爭鳴)&#039;이라는 방침을 제시했다. 아래는 1956년 5월 26일, 중국공산당 선전부장 루딩이(陸定一)가 여러 지식인 2천여 명을 모아놓고 &#039;백화제방, 백가쟁명&#039;에 대해 강연한 내용의 일부이다:&lt;br /&gt;
 &amp;quot;독립적인 사고와 자유로운 토론이 장려되지 않는다면 학술발전은 정체될 수밖에 없다는 사실을 역사는 보여준다. 문학예술활동과 과학연구에 있어서 독립적인 사고의 자유, 논쟁의 자유, 창작과 비평의 자유, 자기의 의견을 발표, 견지, 유보할 수 있는 제유를 제창한다.&amp;quot;&lt;br /&gt;
물론 우호적 비판은 허용하되 &#039;비난&#039;은 철저히 용납하지 않겠다는 입장이었지만, 지식인들은 반신반의하면서도 한편으로는 기뻐했다. 지식인들은 그동안의 사상개조운동의 영향으로 폐쇄된 언로와 중국공산당의 독주에 불만을 품으면서도 은근히 개방을 바라고 있었기 때문이다. 그러나 마오쩌둥의 노력에도 불구하고, 그동안 공산당에게 호되게 시달려왔던 지식인들은 쉽사리 입을 열지 않았다.  하지만 중국 공산당이 마오쩌둥의 뜻에 따라 공산당 내부의 문제에 대한 정풍운동을 1957년 4월 25일부터 전개하고 모든 &#039;우호적&#039; 비판을 허용한다는 입장을 거듭 표명하면서 지식인들은 점차 용기를 얻었다. 아래는 중공중앙통일전선부가 1957년에 주최한 좌담회에서 좌담회를 주최한 리웨이한이 말한 내용이다:&lt;br /&gt;
 &amp;quot;이 회의를 소집한 목적은 여러분에게 우리가 진행하고 있는 정풍을 원조해달라는 것과 우리의 결점과 잘못을 고칠 수 있도록 도와달라는 것이다. 통일전선의 방법을 가지고 우리의 정풍을 추진하는 것은 처음 있는 일로서 여러분이 자세한 비판과 의견을 많이 제시해 줄 것을 희망한다.&amp;quot;&lt;br /&gt;
이렇듯 마오쩌둥과 공산당이 대놓고 &#039;마음껏 떠들어도 좋다&#039;. &#039;절대로 계급투쟁을 하지 않겠다.&#039;라고 부추기자, 지식인들은 마침내 가슴속에 품어왔던 불만을 쏟아내기 시작했다. 이는 공산당원의 특권인식과 공산당의 무능, 공산당의 법과 제도를 운용할 능력의 부재, 공산당의 독주 비판 등 중국 사회 전체와 지금까지 중국 공산당이 진행한 여러 전반적인 정책에 관한 것이었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥은 &#039;백화제방&#039;, &#039;백가쟁명&#039; 방침을 정하고 지식인들에게 자유롭게 발언할 기회를 제공한 후 상황이 자신이 원하는 대로 돌아가지 않는 것을 목격했다. 지식인들은 공산당이 허용할 수 없는 범위의 비판을 넘어서 공산당의 통치 전반에 걸쳐 비판 및 비난을 퍼부었고, 일부 대학생들은 더 나아가 &amp;quot;공산당을 탈퇴하고 자유시민이 되자&amp;quot;, &amp;quot;마오쩌둥은 물러가라!&amp;quot; 등의 구호를 외쳤다. 이에 마오쩌둥은 지식인들에게 철퇴를 가하기로 결심했다. 아래는 1957년 7월 1일, 인민일보에 개재된 사설의 일부이다:&lt;br /&gt;
 중국민주동맹이 백가쟁명과 정풍 과정에서 행한 역할은 매우 열악하며 그들의 조직, 계획, 강령, 노선은 모두 인민을 도외시하는 것이며, 반공반사회주의이자 반공 반민주의이다. 그리고 농공민주당도 똑같다. (중략) 중국의 하늘은 흑구름으로 뒤덮였고, 이것의 출처는 장보쥔, 뤄룽지, 장즈중 동맹이다. 그들은 죄가 있으며, &#039;말하는 사람은 무죄다&#039;라는 원칙이 그들에게는 적용되지 않는다.&lt;br /&gt;
백화제방에서 정부를 비판한 사람들은 곧 ‘우파분자(Rightists)’로 규정되어 숙청 대상이 되어 약 55만 명이 숙청, 재교육, 노동교화로 끌려갔다. 이로 인하여 교육·관료·지식인 계층이 큰 타격을 입었고, 중국에서 정치적인 비판의 공간은 완전히 붕괴되었다.&lt;br /&gt;
&lt;br /&gt;
이에 대해 학계에서는 마오가 처음부터 비판자를 드러내기 위해 유도했다는 견해와, 진심으로 비판을 허용했지만 예상보다 훨씬 많은 비판이 쏟아지자 공산당이 공포심을 느껴 탄압으로 선회했다는 두 가지의 주장이 존재한다. 하지만 공통된 결과는 정치적 자유는 짧게 열렸다가 더욱 강하게 폐쇄되었다는 것이다.&lt;br /&gt;
&lt;br /&gt;
==대약진운동==&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6253</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6253"/>
		<updated>2025-11-21T03:21:43Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==공산당의 위기==&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
===대장정===&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
===옌안 소비에트===&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
===토지개혁===&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6252</id>
		<title>중화인민공화국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EC%9D%B8%EB%AF%BC%EA%B3%B5%ED%99%94%EA%B5%AD&amp;diff=6252"/>
		<updated>2025-11-21T03:20:07Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: 새 문서: 분류:교양 문서 분류:중국 문화와 역사 상위 문서: 중국 문화와 역사  ==개요== 해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.  ==마오쩌둥== 중국 공산당이 러시아 혁명의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 중화민국#5·4운...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서는 현재 중국 대륙을 지배하고 있는 중화인민공화국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==마오쩌둥==&lt;br /&gt;
중국 공산당이 [[중화민국#중국 공산당의 대두|러시아 혁명]]의 영향을 받아 발달하기 시작할 당시, 젊은 시절의 마오쩌둥은 [[중화민국#5·4운동#신문화운동|신문화운동]]의 영향을 받았다. 당시 그는 민주주의, 과학, 전통 타파, 농민 중심 혁명론 등을 흡수하며 사상적으로 성장했다. 이 과정에서 그는 노동자가 중심이 되었던 러시아 혁명의 노선과는 다르게, 중국에서의 “혁명의 중심은 도시 노동자가 아니라 농민”이라는 생각을 가지게 되었다. &lt;br /&gt;
&lt;br /&gt;
마오쩌둥의 이러한 사상은 리다자오(李大钊, Li Dazhao)에게 큰 영향을 받았다. 그는 베이징대 도서관장, 중국에서 초기 마르크스주의 확산의 핵심 인물이었으며, “중국 혁명의 주체는 농민” 가능성을 일찍이 제시하여 마오쩌둥의 사상적인 멘토 역할을 수행했다. 반면, 초기 중국 공산당에는 러시아 모델을 강하게 주장하는 사람들도 많았다. 대표적인 인물이 천두슈(陈独秀, Chen Duxiu)로,  신문화운동의 중심 인물이자 《신청년(新青年)》의 편집자였다. 그는 공산당의 초대 총서기로서 도시 노동자 중심 혁명을 주장하였으나, 후일 당내 투쟁에서 밀려나 축출되었다. &lt;br /&gt;
&lt;br /&gt;
도시 중심 공산당 지도부는 농민운동의 “과격성”을 비판하였는데, 마오는 이에 반대하며, 혁명의 가장 강력한 힘은 농민이라고 주장하였다. 이는 1927년에 그가 발표한 아래의 글에서 잘 나타난다:&lt;br /&gt;
 “그들 맨 앞에서 행진하며 이끌 것인가? 아니면 그들 뒤에서 손짓하며 비판할 것인가? 혹은 그들과 맞서서 반대편에 서서 대적할 것인가? 혁명이란 사람들을 저녁 식사에 초대하는 일도, 에세이를 쓰는 일도, 그림을 그리는 일도, 자수를 놓는 일도 아니다. 혁명은 그렇게 정교하고, 한가롭고, 부드럽고, 온화하고, 고상하고, 예의 바르고, 절제되고, 상냥한 것이 될 수 없다. 혁명이란 한 계급이 다른 계급의 권력을 전복시키는 봉기, 즉 폭력을 수반한 행동이다.”&lt;br /&gt;
이를 통해 그는 명은 본질적으로 폭력적 충돌이며, 기존 질서(지주·엘리트 계층)의 해체를 필연적으로 동반하므로 혁명적 폭력(revolutionary violence)의 필요성을 역설하였다.&lt;br /&gt;
&lt;br /&gt;
==상하이 대학살==&lt;br /&gt;
중국공산당은 처음에는 쑨원과 연합한 코민테른의 지령을 받아 국민당에 개별 입당하는 식으로 1차 국공합작에 나서게 된다. 이어 소련 군사고문단이 중국에 파견되어 국민혁명군의 건설을 도왔으며 국민당의 1차 동정, 1925년 객군 반란 진압, 국민당의 2차 동정과 남정에 적극 참여하여 대중운동을 선동하여 군사작전을 도왔고 공산당을 선전했다. &lt;br /&gt;
&lt;br /&gt;
1921년 중국공산당이 수립된 이후 1922년 코민테른의 지시에 따라, 중국공산당과 중국국민당은 국민혁명을 위한 통일 전선을 형성했다. 제1차 국공합작이라고도 불리는 이 관계는 설립 때부터 불안했고 쑨원 사후 폭발했다. 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였고, 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. 이에 따라 이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었고, 6만에 달하던 당원은 1만명으로 급감하였다. 또한 중국공산당은 이를 계기로 농촌으로 도피하게 되었다.&lt;br /&gt;
&lt;br /&gt;
==대장정==&lt;br /&gt;
중국 공산당이 상하이 대학살을 통해 위기에 몰린 이후, 중국공산당은 천두슈의 지휘 아래에 난창 폭동 등을 감행하면서 노동자들의 힘을 빌어 소비에트를 건설하려 했지만 국민당에게 번번이 진압될 따름이었다. 이후로도 무모한 무장봉기가 실패하자 공산당은 지하활동과 지방 소비에트 건설에 주력했다. 이때 두각을 드러낸 것이 정강산에서 시작하여 장시성(江西省) 전체에 이르는 거대한 소비에트 지구를 확보한 마오쩌둥과 주더였다. &lt;br /&gt;
&lt;br /&gt;
1929년 중국 공산당의 지도자 마오쩌둥은 당원들과 함께 정강산 투쟁을 시작으로 장시성, 푸젠성 일대에 혁명을 위한 근거지를 마련하였다. 이후 1931년 11월에 장시성(江西省)에서 중화 소비에트 전국 대회가 열리고, 중화소비에트공화국 임시 정부가 수립되었다. 일찍이 마오쩌둥은 당중앙에서 지시하는 폭동이 무모한 것이니 실패할 것이라고 지적하면서 농민들을 중심으로 하는 비정통 혁명 이론을 내세우고 있었다. 당중앙이 내세우던 연속혁명론, 무장봉기론은 계속 실패했지만 마오쩌둥의 소비에트 지구는 날이 갈수록 확장되었다. 결국 마오쩌둥의 장시성 소비에트는 중앙 소비에트로 지칭되기에 이르렀으며, 1931년 11월에는 인구 250만 명의 장시성 루이진(瑞金) 지역에서 정부 주석 마오쩌둥, 부주석 장궈타오, 군사위원회 주석 주더를 선출하면서 중화소비에트공화국 임시 정부 성립을 선언하였다. 중화소비에트공화국에서는 자체적인 화폐를 발행할 정도로 소규모 혁명국가처럼 기능하였으며, 토지개혁 실험, 농민 동원, 간부 교육 등 마오주의 정책의 초기 실험장이 되었다.&lt;br /&gt;
&lt;br /&gt;
국민정부는 이런 소비에트에 대한 군사적인 공격을 감행하였으나, 공산당의 홍군을 처음에는 단순히 비적떼로 얕잡아보아 지방군을 중심으로 한 보잘것없는 공세를 초기에 취했으며 저우언라이가 지휘하는 공산당 스파이들이 정보를 빼냈기 때문에 번번이 실패했다. 하지만 바이마르 공화국에서 모셔온 한스 폰 젝트를 위시한 주중 독일 군사고문단의 조언을 받아들여 공산당이 장악한 지역으로 섣불리 진군하는 것을 자제하고 요처마다 콘크리트 진지를 건설하며 중국공산당의 숨통을 조여갔다. 이에 따라 홍군은 그야말로 쓰러져갔고 공산당은 공격은커녕 근거지도 지킬 수 없을 만큼 위험한 처지에 놓이게 되었으며, 공산당 수뇌부는 현재의 근거지를 고수할 수 없다는 결론에 도달하였다. &lt;br /&gt;
&lt;br /&gt;
Figure는 당시 홍군 약 8만 명이 국민당의 포위망을 뚫고 서북부로 9,000km 이상 도보로 이동한 경로를 보여준다. 이 사건은 대장정이라고 불리며, 이는 전술적으로는 병력의 90%를 잃어버린 기나긴 퇴각과 도주의 과정이었다. 또한 간신히 피신한 서북 지역도 중국 본토에서 가장 척박하고 인구밀도도 희박한 곳 중 하나로서 도저히 장기적으로 혁명을 도모할 만한 곳이 되지 못하여 공산당 내부에서는 외몽골이나 신장으로 이동해 소련의 지원을 받아야 한다는 말까지 나올 정도였다.&amp;lt;br&amp;gt;&lt;br /&gt;
그러나 그럼에도 불구하고, 전략적인 관점에서 대장정은 중국공산당의 승리였다. 어쨌든 중국 국민당은 중국공산당을 완전히 박멸하는 데에는 실패하였으며, 홍군의 핵심 지도부는 시련을 이기고 살아남아 후일을 도모할 수 있었기 때문이다. 또한 마오쩌둥은 그의 정치/군사 이론을 중심으로 한 지도 체계의 그 유효성을 입증하며 중국 공산당 내에서의 주도권을 더욱 틀어쥘 수 있었다. 그리고 중국공산당은 이를 바탕으로 북쪽에서 다시금 토대를 다질 수 있었다.&lt;br /&gt;
&lt;br /&gt;
==옌안 소비에트==&lt;br /&gt;
중국 공산당이 대장정을 피해서 정착한 곳은 산간닝변구(陕甘宁边区)라는 곳이었다. 산간닝변구라는 이름은 산시성, 간쑤성, 닝샤성의 앞 글자를 따서 명명되었다. 이 지역은 당시 국민정부 내에 존재했던 제2차 국공합작이 진행되는 동안 중국 공산당이 얻은 합법적인 통치 영역이었고, 혁명수도 옌안이 위치했다.&lt;br /&gt;
&lt;br /&gt;
이 지역에서 마오쩌둥은 옌안 소비에트를 건국하였다. 이 지역에서는 명 간부와 농민이 함께 생활하며 교육·정치 동원·사상 개조가 진행되었다. 또한 내부 정풍(整風, Rectification Movement)을 통해 모든 간부가 마오의 사상에 충성하도록 재교육이 진행되었으며, 이 시기에 “마오쩌둥 사상(Mao Zedong Thought)”이 공산당의 공식 지도 이념으로 자리 잡았다. 마오쩌둥 사상은 아래와 같다:&lt;br /&gt;
# 군사투쟁과 정치투쟁의 통합: 혁명은 단순한 군사행동이 아니라 정치·사회·사상 영역 전체를 동원하는 총체적 전쟁&lt;br /&gt;
# 일상의 변혁: 혁명은 정치만 바꾸는 것이 아니라 사람들의 생활 방식, 사고방식, 관습까지 변화시켜야 한다.&amp;lt;ref&amp;gt;이는 이후 문화대혁명(1966-76)의 이념적 준비 단계가 되었다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 대중 속에서의 혁명 의식 고취: 혁명은 간부가 아니라 ‘인민’이 수행해야 한다는 이념이다.&lt;br /&gt;
# 군중노선: 간부는 대중 속에 들어가 민중의 요구를 파악하고, 그것을 혁명적 형태로 재구성하여 다시 대중에게 환원해야 한다.&lt;br /&gt;
&lt;br /&gt;
==중화인민공화국의 건국==&lt;br /&gt;
제2차 국공합작으로 공산당은 산간닝 변구를 기반으로 점차 공산당 근거지인 해방구를 늘려갔다. 1945년 일본 제국은 패망하고 잠깐 동안은 공산당과 국민정부는 화평교섭회담을 개최하는 등 외견상의 평화가 유지되었으나, 실제로는 공산당과 국민당 모두 싸움을 준비하던 상황이었고 그 사이 홍군은 소련의 군정 치하에 있는 만주에서 소련의 도움으로 관동군의 무기로 무장해 군사력을 강화했다. 결국 장제스는 1946년 6월 국공합작을 깨고 소비에트 지구를 침공하면서 제2차 국공내전이 일어났다. 초반에는 국민혁명군이 우세했으나, 1947년 하반기부터 밀리기 시작하였다. 1948년에는 홍군을 중국인민해방군으로 개칭하였다. 1949년에는 공산당은 중국 대륙의 대부분을 장악하고 국민정부는 대만으로 피신한다. 이후 공산당은 중국을 수립하였다.&lt;br /&gt;
&lt;br /&gt;
==토지개혁==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EB%AF%BC%EA%B5%AD&amp;diff=6208</id>
		<title>중화민국</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=%EC%A4%91%ED%99%94%EB%AF%BC%EA%B5%AD&amp;diff=6208"/>
		<updated>2025-11-21T02:39:14Z</updated>

		<summary type="html">&lt;p&gt;Pinkgo: /* 상하이 대학살 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[분류:교양 문서]]&lt;br /&gt;
[[분류:중국 문화와 역사]]&lt;br /&gt;
상위 문서: [[중국 문화와 역사#현대중국의 형성|중국 문화와 역사]]&lt;br /&gt;
&lt;br /&gt;
==개요==&lt;br /&gt;
해당 문서에서는 중화민국의 역사에 대해 다룬다.&lt;br /&gt;
&lt;br /&gt;
==신해혁명과 중화민국의 건국==&lt;br /&gt;
[[파일:Figure 10. 쑨원.png|섬네일|259x259픽셀|Figure 1. 쑨원]]&lt;br /&gt;
신해혁명의 계기가 되는 우창 봉기가 일어나기 전, 혁명 찬성론자들은 비밀 조직을 결성하며 힘을 길렀다. 대표적인 혁명론자인 쑨원은 1905년 일본에서 중국동맹회를 창설하였으며, 민족주의, 민권주의, 민생주의를 기반으로 하는 삼민주의(三民主義)를 그들의 사상적 기반으로 삼았다. 그들의 비전은 “청 제국을 무너뜨리고 근대 공화국을 세운다.”는 것이었으며, 이는 해외의 화교들과 상인, 지식인, 학생들에게 큰 지지를 받았다. &lt;br /&gt;
&lt;br /&gt;
이러한 혁명의 불씨는 우창 봉기(1911)가 일어나며 본격적으로 타오르게 되었다. 당시 우창은 현대식 군사산업이 발달한 도시로 현대화된 신군을 위한 현대적 무기들이 많이 만들어내고 있었다. 이때 우창에 주둔하던 신군 사이에 쑨원의 혁명이념이 많이 퍼졌으며 병사들은 혁명 조직에 많이 가담하고 있었다. 그러던 와중 우창 봉기는 우창(Wuchang)에서 폭탄 사고가 일어나며 비밀 혁명조직이 발각됨에 따라 일어났는데, 군인들이 즉시 봉기하여 도시를 장악하였다. 그리고 혁명군은 민주공화정을 골자로 하는 군사정부 수립을 선언하였다. 이때가 신해년(辛亥年)인 1911년이었기에 신해혁명이라 일컫는다. 이 소식이 전국으로 퍼지면서 혁명 봉기가 도미노처럼 확산되었으며, 불과 6주 만에 대부분의 중국 성(省)이 청으로부터 독립을 선언하였다. &lt;br /&gt;
&lt;br /&gt;
청나라 정부가 이를 관망만 하고 있을 입장은 아닌지라 서둘러 진압군을 파견하는 한편 군사적 실력자였던 위안스카이에게 급히 도움의 제스처를 취했다. 당시 북양군은 중국 최정예 군사조직으로서 청나라가 기댈 수 있는 마지막 희망이었다. 하지만 그조차 상황은 이미 통제할 수 있는 지경이었다. 당시 한커우를 점령한 진압군은 편제가 완전히 확충되지 않으면 양쯔강 이남으로 도하하는건 무리라고 대놓고 명령을 거부했으며 새롭게 편제된 진압군조차 혁명군으로 넘어가기 일쑤였다.&lt;br /&gt;
&lt;br /&gt;
하지만 혁명군은 우후죽순 제멋대로 등장했고 서로 연계가 잘 안 되었으며 탄약과 필수물자도 거의 없는 상황이었기 때문에 수도인 북경과 거리가 먼 지역은 쉽사리 독립 선포를 달성했지만 가깝거나 요충지인 지역은 아직 남아있는 청군이 남아있었기 때문에 베이징의 청조를 무너트리는 것에는 한계가 있었다. 이에 따라 양쯔강의 이권을 가지고 있었던 영국이 이 지역이 신해혁명으로 전장의 한복판에 놓이자 적극적으로 화의를 주선하기 시작했다. 이에 청 정부는 군권을 가진 원세개(Yuan Shikai) 에게 협상 역할을 맡겼으며, 위안스카이는 “황제를 퇴위시키는 대신 초대 대통령이 된다”는 거래를 하였다. 이를 혁명군이 수용하며 이것으로 혁명군의 남부와 북양군벌의 북부의 화해, 즉 남북의화(南北議和)가 성립되었다. 또한 1912년 마지막 황제 푸이(宣統帝)가 퇴위하며 중화민국이 건국되었다.&lt;br /&gt;
&lt;br /&gt;
===비한족 지방의 독립과 오족공화===&lt;br /&gt;
신해혁명으로 청이 무너진 뒤, 중앙 권력이 약화되며 티베트, 몽골, 신장 같은 변방 지역은 독자적으로 움직이며 사실상 독립적 정치 체제를 구축하였다. 티베트는 13대 달라이 라마가 청이 붕괴한 틈을 타 독립을 선언하였고, 몽골은 보그드 칸이 독립한 제정 몽골을 선포하였다. 또한 신장 지역은 군벌과 지방 통치자들에 의해서 사실상 자치적으로 통치되었다. 특히 티베트는 시믈라 조약(The Simla Convention)을 1914년에 영국과 체결하여 티베트의 영토, 지위, 중국과의 관계 등을 규정하였다. 이때 중국은 조약 인정을 거부하였으나, 하지만 티베트는 1951년까지 사실상 독립국의 지위를 누렸다. &lt;br /&gt;
&lt;br /&gt;
이러한 소수민족의 독립 움직임에 따라 중화민국에는 오족공화(五族共和, Five Races Under One Union)라는 사상이 등장하였다. 이는 한족, 만주족, 몽골족, 회족, 티베트 족이 하나의 깃발아래 통합되어 살아가야 한다는 것이다. 하지만 실제로는 한족 중심적 정책이 강화되고 한족에 대한 동화 압력이 증가함에 따라 티베트·몽골·신장 지역은 이에 대해 반발하였다.&lt;br /&gt;
&lt;br /&gt;
==중화제국의 선포와 군벌, 사회 운동==&lt;br /&gt;
[[파일:Figure 2. 군벌에 의해 쪼개진 중국.png|섬네일|Figure 2. 군벌에 의해 쪼개진 중국]]&lt;br /&gt;
위안스카이는 상당한 권력욕을 가지고 있었다. 위안스카이는 중화민국이 세워지자 임시 대총통인 쑨원을 몰아내고 자신이 대총통이 되었음에도 황제가 되겠다는 야망을 가지고 있었다. 결국 1915년 12월 12일 위안스카이는 스스로 황제로 즉위하면서 홍헌제제를 선포하며 중화제국을 건국하였다. 관저인 중난하이의 총통부를 신화궁으로 개칭했다. 물론 무리수라 반발이 어마어마했고 이에 대항하여 1915년 12월 25일 호국전쟁이 일어났다. 결국, 위안스카이는 반대의견을 수용하여 1916년 3월 23일 왕정을 취소하고 중화제국은 겨우 3개월 만에 멸망한다. &lt;br /&gt;
&lt;br /&gt;
3월 22일 왕정 취소를 발표한 위안스카이는 3월 23일 중화민국의 공화정 체제를 회복시켰다. 그러나 남방의 군무원은 공화제 회복 정도로는 물러설 생각이 없었고 위안스카이와 그 일족의 재산 몰수, 공민권 박탈, 국외추방을 요구했다. 위안스카이는 과도기 동안 나라를 안정시키기 위해서는 자신이 대총통 자리를 유지해야 한다는 논리를 주장했지만 받아들여지지 않았다. 이 과정에서 요독증이 악화되어 1916년 6월 6일 급사한다. &lt;br /&gt;
&lt;br /&gt;
갑작스러운 중앙 권력의 공백은 중국을 군벌 시대로 몰아넣었다. Figure 2는 당시 중국이 군벌에 의해 쪼개져 있는 모습을 보여준다. 붉은 지역은 분양군벌 중심의 여러 군벌들이며, 파란 지역은 국가를 다시 통일하고 근대적 공화국을 세우려는 정치세력인 국민당이다. 국민당은 쑨원에 의해 세워졌으며, 1920년대에 국민혁명군(NRA)을 조직하고 북벌을 통해 중국을 재통일하고자 하였다. 이때 각각의 군벌들은 독자적인 군대와 세금 체계를 갖추었으며, 열강(일본, 러시아, 영국 등)이 중국 정치에 깊게 개입하였다. 지식인과 학생들은 이런 혼란에 절망하며 새로운 정치 체제를 갈망했고, 공산주의·무정부주의·민족주의 등 다양한 이념이 확산되었다. &lt;br /&gt;
&lt;br /&gt;
===무정부주의자===&lt;br /&gt;
정치와 국가 권력에 대한 환멸이 퍼지면서, 일부 청년·지식인은 무정부주의를 대안으로 탐구하기 시작하였다. 무정부주의는 단순한 “폭력”이 아니라 윤리적 사회개혁 운동으로 이해되었다. 그들은 중국의 도덕·사회·가족·경제 체계를 완전히 뒤엎고 새로운 사회를 만들려 했던 초급진적 지식인 세력이었다. &lt;br /&gt;
&lt;br /&gt;
그들은 청나라의 개혁은 실패했고, 국민당의 정치혁명은 너무 느리며, 군벌은 당연히 최악이므로 기존 정치가 모두 실패하였다고 생각하였다. 이에 따라 그들은 정치와 국가가 문제의 근본이라고 생각하였고 사유재산의 최소화와 노동의 평등화를 통한 협력을 통한 사회 유지를 목표로 하였다. 그들은 이를 이루기 위해 파리와 도쿄에서 “근로-학습 운동”을 조직하여 그들의 사상을 발전시켰으며, 신문과 잡지를 발행하였다.&lt;br /&gt;
&lt;br /&gt;
비록 그들은 중국을 통치하지는 못했지만 후대 중국에 깊은 영향을 끼쳤다. 예를 들어 자본주의·군벌·제국주의·유교 가부장제를 비판한 점은 중국 현대사에서 사상적 토대가 되었으며, 공산당 사상과 여성해방운동 등에도 영향을 크게 주었다.&lt;br /&gt;
&lt;br /&gt;
===여성운동===&lt;br /&gt;
[[파일:Figure 3. 추근.png|섬네일|200x200픽셀|Figure 3.  추근]]&lt;br /&gt;
당시 중화민국에서 여성운동은 국가의 해방과 여성의 해방을 연결되어 진행되었다. 그들은 여성의 해방을 위해서 여학교의 설립과 전족 철폐운동, 가부장제적 가족제도 비판, 여성 잡지 발간, 여성 공동체 조직 등을 하였다. Figure 은 추근秋瑾)이라는 여성 혁명가로, 여성 교육·반족발(발 묶기 금지) 운동의 상징적 인물로 평가된다.&lt;br /&gt;
&lt;br /&gt;
==5·4운동==&lt;br /&gt;
1917년 중화민국은 연합국(영국·프랑스·미국) 편에 서서 전쟁에 참여하였다. 중화민국은 군대를 보낼 여력이 없었기 때문에 14만 명의 노동자(“Chinese Labour Corps”)를 프랑스 전선에 보내었다. 그들은 참호 공사, 군수 물자 운반, 시신 운반 등 위험한 노동을 담당했다. 이는 아래의 사항들을 노린 것이었다:&lt;br /&gt;
# 제국주의 국가들 사이에서 국제적 인정 회복&lt;br /&gt;
# 중국 영토(특히 산둥성)에서 일본의 세력 축소&lt;br /&gt;
# “열강 체제” 안에서 중국의 지위 개선&lt;br /&gt;
하지만 1919년 베르사유조약에서 산둥을 독일이 아닌 ‘일본’에게 넘기는 결정이 내려짐에 따라, 중국의 지식인·학생들은 “열강은 중국을 절대 대등한 주권국가로 보지 않는다”는 엄청난 배신감을 느꼈다. 이는 우드로 윌슨의 민족자결주의에 위배되는 결정이었다. 미국 대통령 우드로 윌슨은 전쟁 후 세계 재편 과정에서 각 민족은 스스로 국가를 결정할 권리가 있다고 주장하였다. 이 사상은 중국·티베트·몽골·베트남·한국 등 식민지·반식민지 국가의 지식인들에게 폭발적인 매력이 있었다. 하지만 베르사유 회의에서 민족자결주의가 동맹국들의 식민지에만 적용되었고, 그 결과 중국 지식인들은 “민족자결은 허울뿐이고, 서구는 여전히 아시아를 식민지 취급한다”고 생각하였다. 이는 반서구·반제국주의 감정을 촉발시켰으며, 중국 학생들과 지식인들은 서구 대신 새로운 이념(마르크스주의·아나키즘·민족주의)을 탐색하기 시작하였다. &lt;br /&gt;
&lt;br /&gt;
5·4운동은 이러한 배경에서 등장하였다. 학생, 상인, 노동자들은 베르사유에서 산둥을 일본에게 넘긴 결정에 분노하였고, 1919년 5월 4일, 베이징 대학생들 중심으로 대규모 시위가 발생하였다. 이는 학생과 상인, 노동자가 함께 참여한 최초의 대중 정치 운동이었다. 이에 따라 일본 상품 불매, 총파업, 시위가 전국으로 확산되었고, 기존 왕조적 충성 대신 국가·민족에 대한 근대적 애국심이 자리잡는 계기가 되었다. &lt;br /&gt;
&lt;br /&gt;
===신문화운동===&lt;br /&gt;
5·4운동의 맥락에 있었던 가장 중요한 운동 중 하나가 신문화 운동이다. 신문화운동은 당시 중국 사회는 여전히 충효, 가부장제, 군신 관계 등의 유교적 전통에 기반하고 있었기 때문에, 지식인들은 유교 사상이 중국 사회 발전을 저해한다고 보고 이를 극복해야 한다고 주장한 것에서 출발하였다. &lt;br /&gt;
&lt;br /&gt;
지식인들은 기존 유교적 질서, 과학과 민주주의 부족, 권위주의적 가족 제도 등을 비판하였다. 그들은 과학, 민주주의, 개인의 해방, 자유로운 사상과 비판적 지성을 강조하며 중국 사회의 사고방식을 완전히 뒤바꾸었다. 또한 5·4운동과 결합해 중국 혁명의 지적 기반을 형성하였다. 특히 베르사유 조약 이후 지식인들은 서구 자유주의는 아시아를 해방시키지 못한다는 것을 깨닫고 대안적인 이념을 탐색하였고, 이과정에서 마르크스주의가 매력적인 대안으로 부상하였다. 이러한 흐름속에서 1919–1921년에 북경·상해 등에서 마르크스 연구회가 조직되고 1921년, 상하이 프랑스 조계에서&lt;br /&gt;
중국 공산당(중공)이 공식적으로 창당되었다.&lt;br /&gt;
&lt;br /&gt;
중국 근대문학의 창시자로도 불리는 루쉰(魯迅, Lu Xun)은 신문화 운동을 대표하는 인물 중 한명이다. 루쉰은 「광인일기(狂人日記)」에서 전통 유교 질서를 “사람을 먹는 제도”라 비판하였고, 「아Q정전」에서는 중국 민중의 수동적/굴종적 정신을 풍자하여 중국 사회를 내부에서 개혁해야 한다는 메시지를 던졌다. 또한 군벌 시대, 전통적 가부장제, 유교 가치, 미신 등 전근대적 요소를 통렬히 비판 하며 지식인의 사회적 책임을 강조하였다. &lt;br /&gt;
&lt;br /&gt;
이러한 시대 정신의 변화는 신여성(New Woman)이라고 일컬어지는 개념을 만들었다. 신여성은 단발머리, 치파오(旗袍), 하이힐과 같이 구별되는 옷차림을 하고 공공장소(카페·무도회장·백화점 등)를 자유롭게 출입하고, 독자적 소비 활동과 남녀 혼성 교류를 하는 등 이전 전통 사회에서는 볼 수 없던 새로운 여성상을 의미한다. 이는 서구식 미(美)의 기준이 확산되고, 전통적 ‘부덕(婦德)’ 대신 모던함·개성·자기표현이 강조됨에 따라 나타난 것으로, 도시 소비문화와 자본주의 가치의 유입을 보여준다.&lt;br /&gt;
&lt;br /&gt;
신여성이라는 개념은 여성 주체성의 확대를 보여주지만 해당 개념이 결국 기업·남성 시각 중심의 “상품화된 여성성”이라는 점에서 한계를 지니기도 한다. 1935년 채추생(蔡楚生) 감독, 여배우 류안링위(阮玲玉) 주연의 신여성(新女性)이라는 이름의 영화는 이를 잘 보여준다. 해당 영화는 여성이 직면한 억압(가부장제, 빈곤, 사회적 낙인)을 사실적으로 묘사하며 신여성의 이상과 현실의 충돌을 다루었다. 또한 해당 영화는 새장(birdcage)이라는 이미지를 활용하는데, 이는 여성은 근대화된 중국에서도 여전히 ‘보이지 않는 감옥’ 속에 갇혀 있다는 것을 의미한다. 이는 류안링위 배우가 실제로 신여성적 이미지와 언론의 억압 사이에서 고통을 받았다는 점에서 영화의 메시지는 더욱 의미를 가진다. &lt;br /&gt;
&lt;br /&gt;
==중국 공산당의 대두==&lt;br /&gt;
[[파일:Figure 4. 러시아 혁명.png|섬네일|Figure 4. 러시아 혁명]]&lt;br /&gt;
1917년의 러시아 혁명은 전제군주국이었던 러시아 제국을 무너뜨리고 세계 최초의 공산주의 국가인 소련(러시아 소비에트 공화국)을 만들었다. 그들은 프롤레타리아 혁명, 계급 해방, 사회주의의 도래를 슬로건으로 삼으며 민중의 집단적 힘과 연대를 그들의 힘의 원천이라고 주장하였다. 이는 서구 제국주의 질서에 균열을 냈는데, “약한 나라가 자력으로 혁명에 성공했다”는 사례를 중국과 같은 여러 약소국들에게 제시했기 때문이었다. &lt;br /&gt;
&lt;br /&gt;
또한 소련은 1919년에 코민테른(Comintern, Communist International)을 신설하였는데, 이는 전 세계 공산주의 정당을 지도·지원하기 위한 국제 조직이었다. 이는 국제 공산주의 운동을 제도화하며, 공산주의가 이론에서 머물지 않고 실제로 각국에 공산당을 만들도록 적극 개입한 것이다. 이는 1921년 중국 공산당의 창립에 결정적인 영향력을 행사했다. 실제로 보이친스키(Voitinsky)라는 코민테른 요원은 1920년 상하이에 도착하여 리다자오·천두슈 등 중국 혁명가들을 만나 공산당 조직 필요성을 제시하였다. 그는 초기 중국 공산당과 소련을 연결하는 가장 중요한 코민테른 대표였으며, 중국 공산당 창당 회의(1921) 준비에 실질적 도움을 주었다.&lt;br /&gt;
&lt;br /&gt;
중국 공산당의 대두는 신문화 운동의 맥락에서 이루어졌다. 예를 들어 천두슈(陳獨秀, 1879–1942)는 신문화운동의 핵심 인물로, 《신청년》 잡지의 창립자이다. 그는 초기 공산당의 제1대 총서기로서 중국 사회개혁의 핵심은 “전통의 해체와 새로운 정치 이념의 도입”이라는 생각을 갖고 있었다. 또한 리다자오(李大釗, 1889–1927) 또한 북경대 도서관 사서로서 학생 운동·사상 교류를 적극적으로 주도하였다. 또한 그는 중국 최초로 러시아 혁명과 마르크스주의를 적극 소개한 인물이었으며, “약소 민족 해방의 길은 사회주의밖에 없다”고 주장하였다.&lt;br /&gt;
&lt;br /&gt;
===국민당과의 비교===&lt;br /&gt;
중국 공산당은 중국의 문제의 근원은 자본주의라고 보았다. 그들이 보기에 자본주의는 고도화된 착취 구조로서, 중국의 빈곤·불평등은 세계 자본주의 체제에 편입되었기 때문에 발생한 것이었다. 더군다나 중국 내부의 봉건적인 지주 제도와 자본주의가 결합하여 그 폐단이 더욱 심각해 졌다고 보았다. 따라서 그들에게 유일한 해결책은 사회주의 혁명이었으며, 프롤레타리아 혁명, 지주 몰수, 생산수단 국유화를 통해 경제 구조 자체를 바꿔야 한다고 보았다.&lt;br /&gt;
&lt;br /&gt;
하지만 국민당은 이에 공감하지 않았다. 그들에게 중국의 문제의 근원은 빈곤 그 자체와 글로벌 자본주의 경쟁에서 뒤처진 것이 었으며, 이를 해결하기 위해서는 자본주의적인 발전을 해야한다고 보았다. 따라서 그들은 중국의 문제를 해결하기 위해서는 산업화·자본 축적, 기업가·지주 계층과의 협력, 국가 주도 근대화를 통해 현대적인 자본주의를 육성해야 한다고 보았다.&lt;br /&gt;
&lt;br /&gt;
==국민당의 북벌==&lt;br /&gt;
[[파일:Figure 5. 장제스.png|섬네일|283x283픽셀|Figure 5. 장제스]]&lt;br /&gt;
국민당을 세운 쑨원은 중국의 민주주의를 회복하려 했으며 1차 국공합작으로 소련의 지원을 받아 북벌을 주장하며 중국을 통일시키고자 했으나 세력의 빈약함으로 그 뜻을 이루지 못한채 1925년 사망했다. 그후 국민당을 장악한 사람은 장제스(蔣介石, Chiang Kai-shek)이며 그는 쑨원 사후 권력 공백 상태에 빠진 국민당을 군벌적 성격이 강한 장제스 체제로 재편하였다. 그는 국민당 군대(국민혁명군)의 최고 지휘관으로 실권을 장악하였으며, 스스로를 “총사령(Generalissimo)”이라 불렀다. 특히 그는 강한 반공주의적 성향을 지녔는데, 이는 후일 공산당과의 갈등에 큰 영향을 끼쳤다.&lt;br /&gt;
&lt;br /&gt;
1920년대 중국은 각지 군벌이 서로 싸우는 군벌 혼란기였다. 장제스는 분열된 중국을 군사력으로 통일하기 위해 1926년에 북벌을 시작하였다. 북벌의 주요 목표는 우한, 난창, 상하이, 난징 등 주요 도시였으며, 최종 목표는 베이징이었다. 북벌은 장제스에게 정치적 정당성을 만들어 주었으며, 국민당이 ‘중앙 정부’로 자리잡는 계기가 되었다. 또한 이는 공산당과의 갈등을 폭발시키는 촉매제가 되었다.&lt;br /&gt;
&lt;br /&gt;
국민당의 북벌은 1928년까지 진행되었으며, 중국 대부분을 지배하던 북양군벌들의 세력들을 크게 위축시켰다. 반면 중국국민당은 기존의 광동성에 국한되어 있던 세력권이 복건, 호북, 호남, 절강, 강소, 하남, 산동에 이르게 되면서 2억에 달하는 인구가 국민정부의 지배 하에 들어왔다. 비록 4.12 상하이 쿠데타와 국공결렬로 공산당과의 합작이 종결되고 공산당이 친공 부대를 포섭하여 무장투쟁을 전개하고 있었지만 국민정부의 아성을 흔들 수준은 아니었으며 펑위샹, 옌시산을 비롯한 강대한 군벌들이 국민당에 합류했다는 점에서 힘의 균형은 완전히 국민정부 쪽으로 쏠리게 되었다. &lt;br /&gt;
&lt;br /&gt;
한편 장제스는 공산당 숙청(4·12 쿠데타) 이후 소련·공산당·국민당 좌파 모두에게 강한 공격을 받으면서 정치적 정당성을 잃고, 북벌을 계속 지휘할 수 없는 상황에 처했다. 따라서 그는 일시적으로 권력을 내려놓고 일본(가고시마)으로 떠나 ‘정치적 소방(冷却期)’을 만들었다. 그리고 사태를 관망하며 복직과 국민당의 2차 북벌을 준비하였다. &lt;br /&gt;
&lt;br /&gt;
===상하이 대학살===&lt;br /&gt;
[[파일:Figure 5. 상하이 대학살.png|섬네일|200x200픽셀|Figure 5. 상하이 대학살]]&lt;br /&gt;
북벌 과정에서 국민당과 공산당은 제1차 국공합작으로 일시적 협력 관계였다. 그러나 공산당의 세력은 무섭게 불어나고 있었고, 장제스는 공산당이 노동자 조직·혁명 운동을 강화하는 것을 보며 공산당을 국민당의 적대 세력으로 판단하였다. 이에 따라 장제스는 1927년 4월 12일, 상하이에 진입한 뒤 노동자 파업조직, 공산당 지부, 좌익 단체를 전격적으로 공격하였다. &lt;br /&gt;
&lt;br /&gt;
이로 인해 수천~수만 명의 공산주의자와 노동자가 체포, 고문, 처형되었다. 또한 국공합작이 붕괴되고 국공내전이 시작되는 계기가 되었다. 그리고 공산당은 당시 강대한 세력을 가졌던 국민당에 의해서 도시에서 쫓겨나 농촌으로 이동하였다. 이는 마오쩌둥의 “농민 기반 혁명노선”으로 이어졌다.&lt;br /&gt;
&lt;br /&gt;
==난징 국민정부==&lt;br /&gt;
1차 북벌도중 하야하였던 장제스는 단 몇 달 만에 다시 복귀할 수 있었다. 이는 그의 하야 이후 정치 지형이 급격하게 장제스에게 유리한 방향으로 재편되었기 때문이다. 먼저 국민당 좌파가 이끌었던 국민당 우한정부는 소련/공산당과 협력하여 장제스를 대체하고자 하였으나, 공산당에 의한 우한 농민운동·무장봉기 확산으로 인하여 우한정부가 공산당과 단절하였다. 또한 장제스가 떠난 뒤, 북벌을 지휘하던 우한정부는 군사력이 매우 약했고 통합된 지휘권도 없었기 때문에 이를 다시 통합해서 지휘할 “중앙 군사 리더”가 필요했다. 이러한 문제점은 난징정부도 마찬가지였기 때문에, 장제스는 국민당에 정식으로 복귀하고 국민당의 모든 실권을 다시 잡았다. 그는 난징에 수도를 세우고 국민정부(國民政府)를 수립하여 중국을 통치하였다. &lt;br /&gt;
&lt;br /&gt;
장제스는 이후 1928년에 제 2차 북벌은 추진하여 장쭤린의 북양정부를 무너뜨리고 베이징에 입성했다. 국민당 내에서의 입지를 단단히 굳힌 그는 초공작전을 개시하여 1933년 제5차 초공작전에서 공산당을 궤멸시켰다. 비록 공산당은 대장정을 단행해 가까스로 전멸을 면했지만 남은 군사력은 얼마 되지 않아 곧 국민혁명군에게 토벌될 게 뻔해 보였다. 이로서 자신에게 대항할 적들을 모조리 굴복시키는 데 성공한 장제스는 관심을 내치로 돌렸다. 장제스는 중국이 서구 제국주의의 침탈로 약화된 이래 군벌의 난립과 공산주의의 침투로 사회 전반이 도덕적으로 타락하고 부정부패가 만연하고 있다고 판단했다. 이에 따라 난징 국민정부는 만주를 빼앗아간 일본 군국주의 세력의 위협에 대항하고자 사회 전반의 부정부패와 민중들의 무지를 척결하기 위한 개혁들을 시도하였다. &lt;br /&gt;
&lt;br /&gt;
===파시즘적 정부===&lt;br /&gt;
난징 국민정부는 BIS를 세웠으며, 이는 사회 통제·첩보·반공 숙청을 위해 만든 비밀 경찰·첩보기관이었다. BIS는 나치 독일의 히믈러(SS 지휘자)에 비유될 정도로 공포 정치를 수행하였으며, 공산당원, 지식인, 반체제 인사 들을 추적·납치·처형하였다. 이는 KMT 정권의 독재적 성향을 보여주는 핵심 장치이다. &lt;br /&gt;
&lt;br /&gt;
또한 장제스는 1932년에 비밀 연설을 통해서 장제스가 국가를 재건하기 위해 강조한 중국식 파시즘적 국가주의 철학을 강조했다. 당시 중국은 일본의 실질적인 위협하에 있었다. 1931년 일본은 만주사변을 일으키고 중국 북동부를 점령하여 괴뢰국을 세웠다. 이는 중국의 핵심 산업·자원이 집중된 지역이었으며, 중국 정부의 무력함이 국제적으로 드러난 사건이었다. 이에 따라 장제스는 비밀 연설에서 “영토를 잃었어도, 민족정신(national spirit)만 살아있으면 되찾을 수 있다”고 주장하며 서양/일본 파시즘 국가처럼 강력한 단일정당 체제(일당 독재)를 요구하였다. 또한 충, 효 등의 전통적 유교적 가치를 부활시키며 국민을 정신적·도덕적으로 규율하여 강인한 민족을 만들고자 하였다. &lt;br /&gt;
&lt;br /&gt;
===신생활 운동===&lt;br /&gt;
[[파일:Figure 6. 신생활 운동.png|섬네일|Figure 6. 신생활 운동]]&lt;br /&gt;
장제스는 중국이 서구 제국주의의 침탈로 약화된 이래 군벌의 난립과 공산주의의 침투로 사회 전반이 도덕적으로 타락하고 부정부패가 만연하고 있다고 판단했다. 이에 따라 난징 국민정부는 만주를 빼앗아간 일본 군국주의 세력의 위협에 대항하고자 사회 전반의 부정부패와 민중들의 무지를 척결하기 위한 개혁을 시도하였다. &lt;br /&gt;
&lt;br /&gt;
신생활 운동은 1934년 부터 장제스·쑹메이링 부부가 주도한 국민정신 재건 운동이다. 신생활 운동은 서구식 자유주의/공산주의를 이단시하고 국민을 “군대처럼” 규율하려는 시도의 연장이었다. 이에 따라 옷, 위생, 질서, 근면과 같은 행동 규범을 세세하게 규제하였다. 이는 유교, 파시즘, 감시체제의 혼합으로서 국민당 정권이 사회 전체를 완전히 통제하기 위한 시도였다. 그리고 이를 통해서 중국인들의 의식 전반을 개혁하고 국민들의 정부에 대한 충성심을 증진시키고자 하였다.&lt;br /&gt;
&lt;br /&gt;
==국민당의 몰락==&lt;br /&gt;
1931년 만주 침략(만주사변) 이후 일본은 아시아 전역으로 급속히 팽창하였다. 1941년 태평양 전쟁 이후, 일본은 동남아시아·태평양의 광대한 지역을 점령했다. 이 때문에 장제스는 공산당보다 일본이 더 큰 위협이라고 보았고, 국민당은 공산당과 다시 국공합작을 이루어 1937년 중일전쟁을 치렀다. 하지만 국민당의 주력군은 일본군과 싸우며 막대한 손실을 입었던 반면, 공산당은 상대적으로 병력을 보존하며 성장하였다. 이는 공산당이 농촌에서 세력을 키우고 인민 지지를 확대할 조건을 만들어 주었다.&lt;br /&gt;
[[파일:Figure 7. 국민당의 대만 도피.png|섬네일|200x200픽셀|Figure 7. 국민당의 대만 도피]]&lt;br /&gt;
1937~45년 동안 국민당과 공산당이 국공합작을 통해 서로 협력하였지만, 일본이 항복하자, 두 정당은 “중국의 주도권”을 놓고 다시 경쟁하기 시작하였다. 미국은 중국이 공산화되는 것을 막기 위해 두 당을 화해시키려 했지만 실패했다. 이후 일본이 점령하였던 만주 지역을 먼저 점령하기 위한 두 당 사이의 경쟁이 이루어졌고, 이는 1946년 국공내전의 재개로 이어졌다. 국민당은 부패, 일본과의 전쟁의 부담, 경제난, 민심 이반, 공산당의 농민 동원 전략들은 국민당이 국공 내전에서 열세에 있도록 만들었다. 이로 인해 1949년, 국민당은 국공내전에서 패배하여 대만으로 도피하였다. 결국 중국 대륙은 공산당이 장악하여 중화인민공화국이 수립되었다.&lt;br /&gt;
&lt;br /&gt;
==각주==&lt;/div&gt;</summary>
		<author><name>Pinkgo</name></author>
	</entry>
</feed>