<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>수학・암호・양자 on kenji.blog</title><link>http://kenji.blog/ko/categories/%EC%88%98%ED%95%99%EC%95%94%ED%98%B8%EC%96%91%EC%9E%90/</link><description>Recent content in 수학・암호・양자 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 05 Sep 2026 22:10:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/categories/%EC%88%98%ED%95%99%EC%95%94%ED%98%B8%EC%96%91%EC%9E%90/index.xml" rel="self" type="application/rss+xml"/><item><title>【완전 해부】 양자 컴퓨터란 무엇인가? ~기초부터 아는 궁극의 계산 원리~</title><link>http://kenji.blog/ko/p/quantum-computer-basics/</link><pubDate>Sat, 05 Sep 2026 22:10:00 +0900</pubDate><guid>http://kenji.blog/ko/p/quantum-computer-basics/</guid><description>&lt;img src="http://kenji.blog/p/quantum-computer-basics/quantum_basics_eyecatch_1788613712487.jpg" alt="Featured image of post 【완전 해부】 양자 컴퓨터란 무엇인가? ~기초부터 아는 궁극의 계산 원리~" />&lt;h2 id="시작하며-양자-컴퓨터가-가져올-계산의-패러다임-시프트">시작하며: 양자 컴퓨터가 가져올 &amp;lsquo;계산의 패러다임 시프트&amp;rsquo;
&lt;/h2>&lt;p>최근 뉴스나 기술 기사에서 &amp;lsquo;양자 컴퓨터&amp;rsquo;라는 단어를 보지 않는 날이 없습니다. &amp;lsquo;현재의 슈퍼컴퓨터로 수천 년 걸릴 계산을 몇 분 만에 끝낸다&amp;rsquo;, &amp;lsquo;현재의 암호 기술이 모두 뚫릴지도 모른다&amp;rsquo;는 등 SF 영화 같은 이야기들이 그럴듯하게 들려옵니다. Google이나 IBM, Microsoft 같은 거대 IT 기업부터 전 세계의 대학과 스타트업까지, 이 꿈의 기술을 상용화하기 위해 치열하게 경쟁하고 있습니다.&lt;/p>
&lt;p>하지만 &amp;lsquo;양자 컴퓨터가 결국 무엇인가?&amp;lsquo;라는 질문을 받으면, 정확하게 대답할 수 있는 사람은 많지 않을 것입니다. 많은 사람들이 &amp;lsquo;모든 조합을 동시에 계산할 수 있는 마법의 상자&amp;rsquo;라는 막연한 이미지를 가지고 있지만, 엄밀히 말해 그것은 정확하지 않습니다.&lt;/p>
&lt;p>본 기사에서는 양자 컴퓨터가 고전 컴퓨터(우리가 평소에 사용하는 PC나 스마트폰)와 근본적으로 어떻게 다른지, 그리고 &amp;lsquo;중첩(Superposition)&amp;rsquo;, &amp;lsquo;양자 얽힘(Entanglement)&amp;rsquo;, &amp;lsquo;양자 게이트(Quantum gates)&amp;lsquo;와 같은 양자역학의 신비한 현상들을 어떻게 계산에 이용하고 있는지를 기초부터 철저하게, 전문적이면서도 알기 쉽게 해설합니다. 이 기사를 다 읽을 즈음에는 양자 컴퓨터의 본질적인 대단함과 현재의 과제를 명확히 이해할 수 있을 것입니다.&lt;/p>
&lt;hr>
&lt;h2 id="제1장-고전-컴퓨터와-양자-컴퓨터의-결정적인-차이">제1장: 고전 컴퓨터와 양자 컴퓨터의 결정적인 차이
&lt;/h2>&lt;p>양자 컴퓨터의 작동 방식을 이해하려면 먼저 우리가 현재 사용하고 있는 &amp;lsquo;고전 컴퓨터&amp;rsquo;가 어떻게 작동하는지 복습할 필요가 있습니다.&lt;/p>
&lt;h3 id="비교표-고전-컴퓨터-vs-양자-컴퓨터">비교표: 고전 컴퓨터 vs 양자 컴퓨터
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>항목&lt;/th>
&lt;th>고전 컴퓨터&lt;/th>
&lt;th>양자 컴퓨터&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>기본 단위&lt;/strong>&lt;/td>
&lt;td>비트 (0 또는 1)&lt;/td>
&lt;td>양자 비트 (0과 1의 중첩)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>상태의 표현&lt;/strong>&lt;/td>
&lt;td>확정적&lt;/td>
&lt;td>확률적 (관측할 때까지 결정되지 않음)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>계산 방식&lt;/strong>&lt;/td>
&lt;td>순차 처리 (병렬화에는 물리 코어 필요)&lt;/td>
&lt;td>양자 병렬성 (지수함수적인 상태를 동시에 조작)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>잘하는 계산&lt;/strong>&lt;/td>
&lt;td>사칙연산, 일상적인 데이터 처리&lt;/td>
&lt;td>소인수분해, 양자 화학 계산&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>오류 내성&lt;/strong>&lt;/td>
&lt;td>매우 강함&lt;/td>
&lt;td>매우 약함 (극저온 환경이나 오류 정정이 필요)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="고전-컴퓨터의-세계-0인가-1인가의-비트bit">고전 컴퓨터의 세계: 0인가 1인가의 &amp;lsquo;비트(Bit)&amp;rsquo;
&lt;/h3>&lt;p>고전 컴퓨터는 모든 정보를 &amp;lsquo;0&amp;rsquo; 또는 &amp;lsquo;1&amp;rsquo; 둘 중 하나의 상태로 표현합니다. 이것을 &lt;strong>비트(Bit)&lt;/strong> 라고 부릅니다. 물리적으로는 반도체 칩 위의 트랜지스터 전압이 높냐(1) 낮냐(0)로 표현됩니다.
스마트폰에 있는 고화질 사진도, 지금 읽고 있는 이 글도, 즐겨보는 YouTube 영상도 궁극적으로는 방대한 수의 &amp;lsquo;0과 1의 나열&amp;rsquo;로 환원됩니다. 계산이란 이 0과 1의 나열에 대해 AND(논리곱), OR(논리합), NOT(논리부정)과 같은 기본적인 논리 회로를 조합하여 조작을 가하는 과정에 다름 아닙니다.
이것은 매우 확실하고 결정론적인 세계입니다. 입력이 같으면 반드시 같은 출력을 얻습니다.&lt;/p>
&lt;h3 id="양자-컴퓨터의-세계-0이면서-1이기도-한-양자-비트qubit">양자 컴퓨터의 세계: 0이면서 1이기도 한 &amp;lsquo;양자 비트(Qubit)&amp;rsquo;
&lt;/h3>&lt;p>반면, 양자 컴퓨터의 최소 정보 단위는 &lt;strong>양자 비트(Qubit: Quantum bit)&lt;/strong> 라고 불립니다.
양자 비트의 가장 큰 특징은 고전적인 비트처럼 &amp;lsquo;0&amp;rsquo; 또는 &amp;lsquo;1&amp;rsquo; 둘 중 하나의 상태에 있을 뿐만 아니라, &amp;lsquo;0과 1이 특정 확률로 섞인 상태&amp;rsquo;를 취할 수 있다는 점입니다. 이것을 &lt;strong>&amp;lsquo;중첩(Superposition)&amp;rsquo;&lt;/strong> 이라고 부릅니다.&lt;/p>
&lt;p>예를 들어 고전 비트가 &amp;lsquo;앞면&amp;rsquo; 또는 &amp;lsquo;뒷면&amp;rsquo; 중 하나가 위로 놓인 동전이라고 한다면, 양자 비트는 &amp;lsquo;공중에서 계속 회전하고 있는 동전&amp;rsquo;에 자주 비유됩니다. 회전 중인 동전은 앞면이라고도 뒷면이라고도 할 수 없으며 양쪽의 상태가 겹쳐져 있습니다. 그리고 동전이 바닥에 떨어져 움직임을 멈추는 순간(이를 양자역학에서는 &amp;lsquo;관측&amp;rsquo;이라고 부릅니다) 처음으로 &amp;lsquo;앞면&amp;rsquo;인지 &amp;lsquo;뒷면&amp;rsquo;인지가 확정됩니다.&lt;/p>
&lt;p>이 &amp;lsquo;관측할 때까지 상태가 확정되지 않는다&amp;rsquo;는 미시 세계(양자역학) 특유의 성질을 그대로 정보 처리 과정에 통합한 것이 양자 컴퓨터입니다.&lt;/p>
&lt;hr>
&lt;h2 id="제2장-계산을-근본부터-바꾸는-3가지-양자역학적-성질">제2장: 계산을 근본부터 바꾸는 3가지 양자역학적 성질
&lt;/h2>&lt;p>양자 컴퓨터의 경이로운 계산 능력의 원천은 단순히 클럭 주파수가 높다거나 부품이 작다는 것이 아닙니다. 물리 법칙 자체를 계산 리소스로 이용한다는 점에 있습니다. 주로 다음의 3가지 양자역학적 현상이 핵심이 됩니다.&lt;/p>
&lt;h3 id="1-중첩superposition과-지수함수적인-정보량">1. 중첩(Superposition)과 지수함수적인 정보량
&lt;/h3>&lt;p>앞서 말했듯이, 양자 비트는 0과 1 양쪽의 상태를 동시에 유지할 수 있습니다. 1개의 양자 비트는 &amp;lsquo;0과 1의 중첩&amp;rsquo;인데, 양자 비트의 수를 늘리면 어떻게 될까요?&lt;/p>
&lt;ul>
&lt;li>1 양자 비트: 2가지 상태(0, 1)의 중첩&lt;/li>
&lt;li>2 양자 비트: 4가지 상태(00, 01, 10, 11)의 중첩&lt;/li>
&lt;li>3 양자 비트: 8가지 상태의 중첩&lt;/li>
&lt;li>&lt;strong>N개의 양자 비트: $2^N$개 패턴의 중첩&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>단 50개의 양자 비트만 있으면 $2^{50}$(약 1100조)개의 상태를 동시에 유지할 수 있습니다. 그리고 불과 300개의 양자 비트가 있으면 $2^{300}$개(우주에 존재하는 모든 원자의 수보다 많은 수!)의 패턴을 한 번에 유지할 수 있는 것입니다. 이 지수함수적인 정보 유지 능력이 양자 컴퓨터의 잠재력의 토대가 됩니다. 고전 컴퓨터에서 우주의 원자 수보다 많은 상태를 메모리에 기억시키는 것은 물리적으로 불가능합니다.&lt;/p>
&lt;h3 id="2-양자-얽힘entanglement-기이한-원격-작용">2. 양자 얽힘(Entanglement): 기이한 원격 작용
&lt;/h3>&lt;p>양자 얽힘은 아인슈타인이 &amp;lsquo;기이한 원격 작용(Spooky action at a distance)&amp;lsquo;이라고 부르며 평생 받아들이지 못했을 정도로 인간의 직관에 반하는 신비한 현상입니다.&lt;/p>
&lt;p>여러 양자 비트가 &amp;lsquo;양자 얽힘&amp;rsquo; 상태가 되면, 그것들은 서로 강하게 결합하여 &lt;strong>&amp;lsquo;한쪽의 상태가 확정되면 아무리 거리가 떨어져 있어도 다른 한쪽의 상태가 즉시 확정된다&amp;rsquo;&lt;/strong> 는 운명 공동체 같은 관계가 됩니다.&lt;/p>
&lt;p>예를 들어 얽힘 상태에 있는 두 양자 비트 A와 B가 있다고 가정해 봅시다(이들은 각각 0과 1의 중첩 상태에 있습니다). A를 관측해서 &amp;lsquo;0&amp;rsquo;이었을 경우, 정보 전달 속도의 한계인 빛의 속도를 뛰어넘어 즉시 B의 상태도 (예를 들어 반드시 &amp;lsquo;1&amp;rsquo;이 되도록) 확정됩니다.
양자 컴퓨터에서는 이 양자 얽힘을 이용함으로써 여러 양자 비트 간의 복잡한 상관관계를 표현하고, 초병렬적인 정보 처리를 수행합니다. 얽힘이 없다면 양자 컴퓨터의 계산 능력은 고전 컴퓨터와 크게 다르지 않을 것입니다.&lt;/p>
&lt;h3 id="3-양자-간섭quantum-interference-정답을-떠오르게-하는-마법">3. 양자 간섭(Quantum Interference): 정답을 떠오르게 하는 마법
&lt;/h3>&lt;p>&amp;lsquo;모든 패턴을 동시에 유지할 수 있다면 그것을 단번에 병렬 계산해서 순식간에 답이 나오는 것 아닌가?&amp;lsquo;라고 생각할 수도 있습니다. 이것이 양자 컴퓨터에 대해 가장 흔히 하는 오해입니다.
중첩 상태에서 계산을 수행해도 최종적으로 답을 알기 위해서는 &amp;lsquo;관측&amp;rsquo;을 해야 합니다. 하지만 관측하는 순간 상태는 $2^N$개의 패턴 중 어느 하나로 무작위로 수축해 버립니다. 이러면 단순히 엉터리(무작위적인) 답이 나올 뿐입니다.&lt;/p>
&lt;p>여기서 등장하는 것이 &lt;strong>&amp;lsquo;양자 간섭(Interference)&amp;rsquo;&lt;/strong> 입니다. 파도와 파도가 부딪힐 때 파장이 맞는 곳은 서로를 강화하고, 어긋나는 곳은 서로를 상쇄하는 현상을 이용합니다(노이즈 캔슬링 이어폰의 원리와 본질적으로 같습니다).&lt;/p>
&lt;p>우수한 &amp;lsquo;양자 알고리즘&amp;rsquo;은 계산 과정에서 &lt;strong>&amp;lsquo;정답으로 이어지는 상태(파동)의 확률 진폭을 강화(증폭)하고&amp;rsquo;, &amp;lsquo;오답으로 이어지는 상태의 확률 진폭을 서로 상쇄&amp;rsquo;&lt;/strong> 하도록 교묘하게 양자 상태를 조작합니다. 그리고 최종적으로 관측했을 때 한없이 100%에 가까운 확률로 &amp;lsquo;정답&amp;rsquo;이 툭 튀어나오도록 유도하는 것입니다. 이 간섭의 과정을 잘 설계하는 것이야말로 양자 프로그래밍의 정수입니다.&lt;/p>
&lt;hr>
&lt;h2 id="제3장-어떻게-계산하는가-양자-게이트와-양자-회로">제3장: 어떻게 계산하는가? &amp;lsquo;양자 게이트&amp;rsquo;와 &amp;lsquo;양자 회로&amp;rsquo;
&lt;/h2>&lt;p>고전 컴퓨터가 논리 게이트(AND, OR, NOT 등)를 사용하여 계산을 진행하는 것처럼, 양자 컴퓨터도 &lt;strong>&amp;lsquo;양자 게이트(Quantum Gates)&amp;rsquo;&lt;/strong> 라는 조작을 양자 비트에 적용하여 계산을 진행합니다. 여러 양자 게이트를 조합한 것을 ** 양자 회로(Quantum Circuit)** 라고 부릅니다.&lt;/p>
&lt;p>양자 비트의 상태는 &amp;lsquo;블로흐 구면(Bloch sphere)&amp;lsquo;이라는 3차원 구체의 표면 위 점으로 수학적으로 표현됩니다. 북극이 &amp;lsquo;0&amp;rsquo;, 남극이 &amp;lsquo;1&amp;rsquo;, 적도 위가 &amp;lsquo;0과 1이 반반씩 겹쳐진 상태&amp;rsquo;입니다. 양자 게이트란 이 구의 표면에서 상태(벡터)를 회전시키는 조작에 다름 아닙니다.&lt;/p>
&lt;p>대표적인 양자 게이트를 몇 가지 소개해 보겠습니다.&lt;/p>
&lt;h3 id="1-아다마르-게이트h-게이트">1. 아다마르 게이트(H 게이트)
&lt;/h3>&lt;p>고전 컴퓨터에는 존재하지 않는, 양자 컴퓨터만의 가장 기본적인 게이트입니다. 상태가 완전히 &amp;lsquo;0&amp;rsquo;인 양자 비트에 H 게이트를 통과시키면 0과 1이 정확히 반반의 확률로 관측되는 &amp;lsquo;완전한 중첩 상태&amp;rsquo;(블로흐 구면에서 적도 위의 점)를 만들어 냅니다. 양자 계산의 초기화 단계로서 많은 알고리즘이 먼저 이 H 게이트를 모든 양자 비트에 적용하는 것에서 시작합니다.&lt;/p>
&lt;h3 id="2-파울리-게이트x-y-z-게이트">2. 파울리 게이트(X, Y, Z 게이트)
&lt;/h3>&lt;p>고전 컴퓨터의 NOT 게이트(0을 1로, 1을 0으로 반전시키는 것)에 해당하는 조작을 포함하는 게이트입니다. 블로흐 구면에서 X축, Y축, Z축을 중심으로 180도 회전시키는 조작에 해당합니다. 특히 X 게이트는 북극(0)을 남극(1)으로 반전시키기 때문에 고전의 NOT 게이트와 완전히 같은 역할을 합니다. Z 게이트는 중첩의 &amp;lsquo;위상(파동의 타이밍 같은 것)&amp;lsquo;을 반전시키는 역할을 가지며, 양자 간섭을 일으키는 데 극히 중요합니다.&lt;/p>
&lt;h3 id="3-cnot-게이트제어-not-게이트">3. CNOT 게이트(제어 NOT 게이트)
&lt;/h3>&lt;p>양자 얽힘을 만들어내기 위한 매우 중요한 게이트입니다. 2개의 양자 비트(제어 비트와 타깃 비트)를 사용합니다.
&amp;lsquo;만약 제어 비트가 1이라면 타깃 비트의 상태를 반전(X 게이트)시킨다. 제어 비트가 0이라면 아무것도 하지 않는다&amp;rsquo;는 동작을 합니다. 언뜻 보면 단순한 IF 조건 분기 같지만, 제어 비트가 &amp;lsquo;0과 1의 중첩 상태&amp;rsquo;였다면 어떻게 될까요? 타깃 비트는 &amp;lsquo;반전된 것과 반전되지 않은 것이 겹쳐진 상태&amp;rsquo;가 되어 두 비트의 운명이 완전히 연결됩니다. 멋지게 두 양자 비트가 &amp;lsquo;얽히게&amp;rsquo; 되는 것입니다.&lt;/p>
&lt;p>이러한 게이트들을 음악의 악보처럼 왼쪽에서 오른쪽으로 순서대로 배치하고 적용해 나감으로써 복잡한 알고리즘을 실행합니다.&lt;/p>
&lt;hr>
&lt;h2 id="제4장-양자-컴퓨터는-무엇을-잘하고-무엇을-못하는가">제4장: 양자 컴퓨터는 무엇을 잘하고, 무엇을 못하는가?
&lt;/h2>&lt;p>여기서 중요한 사실을 말씀드립니다. 양자 컴퓨터는 만능의 신이 아닙니다.
웹 브라우징, 동영상 렌더링, 엑셀의 매크로 처리, 혹은 일반적인 스마트폰 앱의 동작과 같은 일상적인 작업에서 양자 컴퓨터가 고전 컴퓨터를 능가하는 일은 아마 영원히 없을 것입니다. 이러한 순차적인 처리는 이미 고도로 최적화되어 압도적인 속도와 저렴함을 자랑하는 고전 컴퓨터가 더 적합합니다.&lt;/p>
&lt;p>양자 컴퓨터가 그 진가를 발휘하는 것은 &lt;strong>&amp;lsquo;고전 컴퓨터로는 계산 조합이 지수함수적으로 폭발하여 우주의 수명만큼의 시간이 걸려버리는 특정한 문제&amp;rsquo;&lt;/strong> 에 대해서뿐입니다. 이것을 &amp;lsquo;양자 우월성(Quantum Supremacy)&amp;rsquo; 또는 &amp;lsquo;양자 우위성(Quantum Advantage)&amp;lsquo;이라고 부릅니다.&lt;/p>
&lt;h3 id="양자-컴퓨터가-잘하는-것킬러-애플리케이션">양자 컴퓨터가 잘하는 것(킬러 애플리케이션)
&lt;/h3>&lt;h4 id="1-소인수분해와-암호-해독쇼어의-알고리즘">1. 소인수분해와 암호 해독(쇼어의 알고리즘)
&lt;/h4>&lt;p>현재 인터넷상의 안전한 통신(신용카드 결제나 개인정보 전송 등)을 지키고 있는 &amp;lsquo;RSA 암호&amp;rsquo; 등은 &amp;lsquo;거대한 수의 소인수분해는 고전 컴퓨터로는 실질적으로 불가능(방대한 시간이 걸림)하다&amp;rsquo;는 전제에 기반하고 있습니다.
하지만 1994년 수학자 피터 쇼어가 발견한 &amp;lsquo;쇼어의 알고리즘&amp;rsquo;을 사용하면, 양자 컴퓨터는 간섭을 교묘하게 이용하여 이를 극적인 속도(다항 시간)로 풀 수 있습니다. 이로 인해 장래에 현재의 암호 체계가 붕괴할 위험이 있어 전 세계의 중앙은행과 정부 기관이 &amp;lsquo;양자 내성 암호(Post-Quantum Cryptography)&amp;lsquo;로의 전환을 서두르고 있습니다.&lt;/p>
&lt;h4 id="2-양자-화학-계산과-신소재신약-개발">2. 양자 화학 계산과 신소재·신약 개발
&lt;/h4>&lt;p>자연계의 분자나 원자의 움직임은 애초에 양자역학의 법칙을 따르고 있습니다. 고전 컴퓨터로 복잡한 분자의 움직임을 시뮬레이션하려고 하면 전자 간의 상호작용 조합이 폭발하여 비교적 작은 분자라도 계산량의 한계에 부딪힙니다.
노벨 물리학상 수상자인 리처드 파인만이 &amp;ldquo;자연을 시뮬레이션하고 싶다면 양자역학적으로 만들어야 한다&amp;quot;고 말했듯, 양자 컴퓨터는 물질 시뮬레이션에서 압도적인 네이티브 파워를 발휘합니다. 획기적인 신약 설계, 상온 초전도 물질 발견, 고효율 태양전지 및 배터리 재료 개발, 에너지 효율이 높은 비료 합성 등 인류의 과제를 해결할 돌파구가 기대되고 있습니다.&lt;/p>
&lt;h4 id="3-조합-최적화-문제와-탐색그로버의-알고리즘">3. 조합 최적화 문제와 탐색(그로버의 알고리즘)
&lt;/h4>&lt;p>방대한 선택지 중에서 최적의 것을 찾아내는 문제(물류의 최적화 경로, 금융 포트폴리오 최적화 등)에 대해서도 양자 알고리즘은 힘을 발휘합니다. &amp;lsquo;그로버의 알고리즘&amp;rsquo;을 사용하면 데이터가 정리되지 않은 데이터베이스에서의 검색에서 고전 컴퓨터의 루트(제곱근) 횟수로 목적하는 데이터를 찾아낼 수 있습니다. 예를 들어 1억 건의 데이터가 있다면 고전에서 최대 1억 번 걸리는 탐색을 불과 1만 번 정도로 완료할 수 있게 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="제5장-앞을-가로막는-하드웨어의-벽-결어어긋남과-양자-오류-정정">제5장: 앞을 가로막는 하드웨어의 벽 &amp;lsquo;결어어긋남&amp;rsquo;과 &amp;lsquo;양자 오류 정정&amp;rsquo;
&lt;/h2>&lt;p>이론적으로는 마법처럼 강력한 양자 컴퓨터이지만, 상용화로 가는 길에는 극도로 높고 험난한 물리적인 벽이 가로막고 있습니다. 최대의 적은 &lt;strong>&amp;lsquo;노이즈&amp;rsquo;&lt;/strong> 입니다.&lt;/p>
&lt;p>양자 비트의 &amp;lsquo;중첩&amp;rsquo;이나 &amp;lsquo;양자 얽힘&amp;rsquo;은 극도로 섬세하고 부서지기 쉬운 상태입니다. 주위의 아주 작은 열, 전자기파의 흔들림, 혹은 우주선 등에 닿기만 해도 그 마법의 상태는 순식간에 붕괴하고 그저 고전 비트가 되어 버립니다. 이 현상을 &lt;strong>&amp;lsquo;디코히어런스(결어어긋남, 양자 붕괴)&amp;rsquo;&lt;/strong> 라고 부릅니다.&lt;/p>
&lt;h3 id="물리적인-구현-방식의-치열한-경쟁">물리적인 구현 방식의 치열한 경쟁
&lt;/h3>&lt;p>현재 이 섬세 양자 비트를 물리적으로 어떻게 만들 것인지에 대해 전 세계에서 다양한 방식이 연구되고 있으며, 패권 다툼이 일어나고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>초전도 방식(Superconducting)&lt;/strong> : Google, IBM, Amazon 등이 채택. 루프 형태의 초전도 회로를 사용하며, 절대영도(약 -273℃)에 가까운 극저온까지 거대한 냉동기로 냉각시켜 양자 상태를 제어합니다. 현재 가장 앞서 있고 양자 비트 수를 늘리기 쉬운 방식이지만, 냉각 장치가 거대하고 비쌉니다.&lt;/li>
&lt;li>&lt;strong>이온 트랩 방식(Trapped Ion)&lt;/strong> : IonQ, Quantinuum 등이 채택. 진공 중에 이온(원자)을 전자기장으로 가두고 정밀한 레이저를 쏘아 제어합니다. 모든 양자 비트가 균일하고 상태를 오래 유지할 수 있는(코히어런스 시간이 긴) 것이 강점이지만, 조작 속도가 초전도에 비해 느리다는 과제가 있습니다.&lt;/li>
&lt;li>&lt;strong>광양자 방식(Photonic)&lt;/strong> : PsiQuantum 등이 주력. 빛의 입자(광자)를 사용합니다. 극저온 환경을 필요로 하지 않고 실온에서 동작하는 부분이 많으며, 기존의 실리콘 칩 제조 기술이나 광섬유 통신 기술과 상성이 좋다는 큰 장점이 있습니다.&lt;/li>
&lt;li>&lt;strong>위상 방식(Topological)&lt;/strong> : Microsoft가 오랜 기간 연구. 애니온이라 불리는 특수한 입자의 위상기하학적(토폴로지) 성질을 이용하여, 환경 노이즈에 대해 근본적으로 강한(오류가 발생하기 어려운) 양자 비트를 만들려는 야심 찬 접근법입니다. 이론상으로는 최강이지만 물리적인 구현의 장애물이 가장 높다고 알려져 있습니다.&lt;/li>
&lt;/ul>
&lt;h3 id="궁극의-목표-결함-허용-양자-컴퓨터ftqc로-가는-길">궁극의 목표 &amp;lsquo;결함 허용 양자 컴퓨터(FTQC)&amp;lsquo;로 가는 길
&lt;/h3>&lt;p>현재 우리가 쓰는 고전 컴퓨터의 세계에도 계산 오류(우주선에 의한 비트 반전 등)는 존재하지만, &amp;lsquo;오류 정정 코드&amp;rsquo;를 통해 완벽하게 수정되고 있기 때문에 우리는 단 한 번도 오류를 의식하지 않고 스마트폰을 사용할 수 있습니다. 양자 컴퓨터에서도 실용적인 대규모 계산을 수행하려면 동일한 &lt;strong>&amp;lsquo;양자 오류 정정(Quantum Error Correction: QEC)&amp;rsquo;&lt;/strong> 이 필수적입니다.&lt;/p>
&lt;p>하지만 양자 상태는 &amp;lsquo;관측하면 깨진다&amp;rsquo;는 성질이 있기 때문에 오류를 확인하기 위해 내용을 직접 볼(관측할) 수 없다는 치명적인 딜레마가 있습니다.
이를 회피하기 위해 다수의 불안정한 &amp;lsquo;물리 양자 비트&amp;rsquo;를 교묘하게 조합하여 오류를 감지하고 수정할 수 있는 1개의 안정된 &amp;lsquo;논리 양자 비트&amp;rsquo;를 구축하는 이론이 확립되어 있습니다(표면 부호 등).
그러나 1개의 논리 양자 비트를 만들기 위해 1000～1만 개의 물리 양자 비트가 필요하다고 합니다. 수천 개의 논리 양자 비트를 사용하여 쇼어의 알고리즘 등을 실행하려면 전체적으로 수백만에서 수천만 개의 물리 양자 비트를 가진 거대한 시스템이 필요해집니다.&lt;/p>
&lt;p>현재 우리가 있는 시기는 &lt;strong>NISQ(Noisy Intermediate-Scale Quantum: 노이즈가 있는 중규모 양자)&lt;/strong> 디바이스의 시대라고 불립니다. 오류 정정을 갖추지 못하고 수십～수백 양자 비트로 작동하는 과도기적인 기계입니다.
궁극의 목표인 완전히 오류 정정이 가능한 &lt;strong>&amp;lsquo;결함 허용 양자 컴퓨터(Fault-Tolerant Quantum Computer: FTQC)&amp;rsquo;&lt;/strong> 의 실현에는 아직 10년～수십 년이라는 장기적인 연구 개발이 필요하다고 전문가들은 예측하고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="제6장-양자-컴퓨터의-역사와-미래-전망">제6장: 양자 컴퓨터의 역사와 미래 전망
&lt;/h2>&lt;p>마지막으로 양자 컴퓨터가 어떻게 탄생했고 앞으로 어디를 향해 갈 것인지 조망해 보겠습니다.&lt;/p>
&lt;h3 id="이론의-탄생부터-양자-우월성-실증까지">이론의 탄생부터 &amp;lsquo;양자 우월성&amp;rsquo; 실증까지
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>1980년대&lt;/strong> : 물리학자 폴 베니오프와 리처드 파인만이 양자역학의 원리를 이용한 컴퓨터의 개념을 제창. &amp;ldquo;자연을 시뮬레이션하려면 양자역학을 사용해라&amp;quot;라는 말이 시발점이 되었습니다.&lt;/li>
&lt;li>&lt;strong>1994년&lt;/strong> : 피터 쇼어가 소인수분해의 양자 알고리즘(쇼어의 알고리즘)을 발표. 세계에 충격을 주고 막대한 연구 자금이 흘러 들어가는 계기가 됩니다.&lt;/li>
&lt;li>&lt;strong>1996년&lt;/strong> : 로브 그로버가 데이터 검색을 고속화하는 그로버의 알고리즘을 발표.&lt;/li>
&lt;li>**2019년 ** : 역사적인 이정표. Google이 53 양자 비트의 초전도 프로세서 &amp;lsquo;Sycamore&amp;rsquo;를 사용하여, 고전 슈퍼컴퓨터로 1만 년이 걸릴(것으로 여겨졌던) 난수 생성의 검증 계산을 약 200초 만에 완료했다고 발표. 세계 최초의 &lt;strong>&amp;lsquo;양자 우월성(Quantum Supremacy)&amp;rsquo;&lt;/strong> 실증 선언으로 큰 화제를 불렀습니다(이후 IBM 등이 고전 슈퍼컴퓨터 측의 알고리즘을 개선하여 며칠 만에 계산 가능하다고 반론하는 등 뜨거운 논쟁이 오갔습니다).&lt;/li>
&lt;li>&lt;strong>2023년 이후&lt;/strong> : IBM이 1000 양자 비트를 넘는 프로세서 &amp;lsquo;Condor&amp;rsquo;를 발표. 또한 하버드 대학 등이 &amp;lsquo;논리 양자 비트&amp;rsquo;의 생성과 조작에 성공하는 등 오류 정정 기술의 초기 실증이 속속 보고되기 시작하고 있습니다.&lt;/li>
&lt;/ul>
&lt;h3 id="차세대-테크놀로지를-향하여">차세대 테크놀로지를 향하여
&lt;/h3>&lt;p>양자 컴퓨터는 단순한 &amp;lsquo;클럭 수가 빠른 차세대 CPU&amp;rsquo;가 아닙니다. 계산이라는 행위 자체의 개념을 미시 세계를 지배하는 양자역학의 규칙으로 근본부터 다시 쓰는, 그야말로 정보 과학에서의 패러다임 시프트입니다.&lt;/p>
&lt;p>우리가 살아가는 동안 주머니에 들어가는 &amp;lsquo;퍼스널 양자 스마트폰&amp;rsquo;을 가지게 될 일은 없을 것입니다(그럴 필요도 없습니다). 하지만 AWS나 Azure 같은 클라우드 네트워크 너머에 있는 거대한 양자 데이터 센터가 어느 날 갑자기 불치병의 특효약을 발견하거나, 지구 온난화를 해결할 꿈의 클린 에너지 재료(예를 들어 상온에서 대기 중의 질소로부터 암모니아를 합성하는 촉매 등)를 도출해내는 미래는 확실히 다가오고 있습니다.&lt;/p>
&lt;p>지금은 아직 거대한 진공관의 열로 방 안이 더워지면서 천공 카드로 움직이던 1940년대의 에니악(ENIAC)과 같은 여명기에 해당합니다. 하지만 전 세계 최고 수준의 연구자들과 엔지니어들이 지혜를 짜내며 매일같이 기술적인 돌파구가 보고되고 있습니다.
이 새로운 &amp;lsquo;계산의 여명&amp;rsquo;이 진화하는 과정을 실시간으로 목격할 수 있는 우리는 역사상 매우 흥미진진한 시대를 살고 있다고 할 수 있겠습니다.&lt;/p>
&lt;p>양자의 세계로 향하는 문은 이제 막 열렸을 뿐입니다. 앞으로의 동향에서 눈을 뗄 수 없습니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>이 기사는 양자 컴퓨팅의 기본 개념을 비즈니스맨이나 기술에 관심이 있는 일반인을 위해 알기 쉽게 해설하는 것을 목적으로 하고 있습니다. 엄밀한 수학적·물리학적 정의(브라-켓 표기법이나 복소 확률 진폭의 세부 사항 등)에서는 일부 간략화된 부분이 있음을 양해 바랍니다.&lt;/em>&lt;/p></description></item><item><title>양자 컴퓨터는 정말 RSA 암호를 파괴할 것인가? ~쇼어의 알고리즘과 현재의 도달점~</title><link>http://kenji.blog/ko/p/shors-algorithm-and-rsa-breaking/</link><pubDate>Sat, 05 Sep 2026 22:09:21 +0900</pubDate><guid>http://kenji.blog/ko/p/shors-algorithm-and-rsa-breaking/</guid><description>&lt;img src="http://kenji.blog/p/shors-algorithm-and-rsa-breaking/quantum_breaking_rsa_1788613722990.jpg" alt="Featured image of post 양자 컴퓨터는 정말 RSA 암호를 파괴할 것인가? ~쇼어의 알고리즘과 현재의 도달점~" />&lt;h2 id="시작하며-암호-기술과-양자-컴퓨터의-교차점">시작하며: 암호 기술과 양자 컴퓨터의 교차점
&lt;/h2>&lt;p>현대 인터넷 사회에서 통신의 비밀을 지키기 위한 기반이 되고 있는 것이 &amp;lsquo;공개키 암호&amp;rsquo;입니다. 그 중에서도 대표적인 것이 1977년 Ron Rivest, Adi Shamir, Leonard Adleman 세 사람에 의해 개발된 &amp;lsquo;RSA 암호&amp;rsquo;입니다. 우리가 매일 이용하는 온라인 쇼핑 결제, 웹사이트 열람(HTTPS), 이메일 송수신에 이르기까지 RSA 암호는 인터넷 인프라의 심장부로서 기능하고 있습니다.&lt;/p>
&lt;p>그러나 &amp;lsquo;양자 컴퓨터&amp;rsquo;의 등장으로 인해 이러한 안전성이 근본부터 뒤집힐 가능성이 지적되고 있습니다. 미디어에서는 &amp;ldquo;양자 컴퓨터가 완성되면 전 세계의 비밀번호나 암호가 몇 초 만에 해독되어 버린다&amp;quot;는 등 선정적인 헤드라인이 장식되기도 합니다. 과연 그것은 사실일까요?&lt;/p>
&lt;p>이 글에서는 고전적인 암호 해독 기법인 GNFS(일반 수체 체)와 양자 컴퓨터를 이용한 암호 해독 알고리즘의 결정판인 &amp;lsquo;쇼어의 알고리즘(Shor&amp;rsquo;&amp;rsquo;s Algorithm)&amp;lsquo;의 구조를 깊이 파헤쳐 봅니다. 양자 푸리에 변환이나 주기 발견과 같은 고도의 개념을 알기 쉽게 해설하고, 현재의 NISQ(Noisy Intermediate-Scale Quantum) 시대에 있어서 양자 하드웨어의 현황과, 실제로 RSA-2048을 깨기 위해 필요한 난관들에 대해 상세히 검증해 보겠습니다.&lt;/p>
&lt;hr>
&lt;h2 id="rsa-암호의-근간-소인수-분해의-어려움">RSA 암호의 근간: 소인수 분해의 어려움
&lt;/h2>&lt;p>RSA 암호의 안전성은 수학에서의 매우 단순한 비대칭성에 의존하고 있습니다. 그것은 &amp;ldquo;두 개의 거대한 소수를 곱하는 것은 간단하지만, 그 곱한 결과(합성수)로부터 원래의 두 소수를 찾아내는(소인수 분해하는) 것은 극히 어렵다&amp;quot;는 사실입니다.&lt;/p>
&lt;p>예를 들어, $ p = 61 $, $ q = 53 $ 이라는 두 개의 소수가 있다고 가정해 봅시다. 이 곱셈 $ N = p \times q = 3233 $ 을 계산하는 것은 순식간입니다. 하지만 &amp;lsquo;3233&amp;rsquo;이라는 숫자만 주어지고 &amp;ldquo;이것은 어느 소수와 어느 소수의 곱셈인가?&amp;ldquo;를 푸는 것은 숫자가 커질수록 계산량이 폭발적으로 증가합니다.&lt;/p>
&lt;p>현재 주류가 되고 있는 RSA-2048에서는 키 길이가 2048비트, 즉 10진수로 약 617자리에 달하는 거대한 합성수 $ N $ 이 사용되고 있습니다. 이 $ N $ 을 소인수 분해할 수 있다면, 암호는 해독된 거나 다름없게 됩니다.&lt;/p>
&lt;h3 id="고전-컴퓨터의-도전-gnfs-일반-수체-체">고전 컴퓨터의 도전: GNFS (일반 수체 체)
&lt;/h3>&lt;p>소인수 분해 문제를 풀기 위해 수학자나 암호학자들은 오랜 세월에 걸쳐 다양한 알고리즘을 개발해 왔습니다. 그 중에서도 고전 컴퓨터에서 현재 가장 빠르다고 여겨지는 것이 &lt;strong>일반 수체 체(GNFS: General Number Field Sieve)&lt;/strong> 입니다.&lt;/p>
&lt;p>GNFS는 거대한 수 $ N $ 을 소인수 분해하기 위해, 정수환에서의 계산을 더 추상적인 대수체(Number Field)로 확장하여 해석하는 기법입니다. 대략적인 흐름은 다음과 같습니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>다항식의 선택&lt;/strong> : $ N $ 을 근으로 가지는, 적절한 차수와 계수를 가진 다항식 $ f(x) $ 를 찾습니다.&lt;/li>
&lt;li>&lt;strong>데이터 수집(체질)&lt;/strong> : 유리수체 및 대수체 위에서, 작은 소수(매끄러운 수, Smooth numbers)로 분해될 수 있는 수의 쌍을 대량으로 탐색합니다. 이 과정이 &amp;lsquo;체질(Sieving)&amp;lsquo;이라 불리며 가장 많은 시간을 필요로 하는 부분입니다.&lt;/li>
&lt;li>&lt;strong>행렬의 생성과 축약&lt;/strong> : 수집한 관계식을 바탕으로 거대한 희소 행렬(성분의 대부분이 0인 행렬)을 생성하고, 선형대수학적 기법(블록 란초스 방법 등)을 사용하여 해를 구합니다.&lt;/li>
&lt;li>&lt;strong>제곱근의 계산&lt;/strong> : 마지막으로 대수체 위에서 제곱근을 계산하여, $ N $ 의 인수(소인수)를 도출해 냅니다.&lt;/li>
&lt;/ol>
&lt;p>GNFS의 계산량은 점근적으로 $ O(\exp((\sqrt[3]{\frac{64}{9}} + o(1)) (\log N)^{\frac{1}{3}} (\log \log N)^{\frac{2}{3}})) $ 로 평가됩니다. 이는 &amp;lsquo;준지수함수적(Sub-exponential)&amp;rsquo; 시간 계산량이라 불립니다. 지수 시간보다는 빠르지만, 다항 시간(Polynomial time)보다는 훨씬 느린 계산량입니다.&lt;/p>
&lt;p>실제로 2020년에는 국제적인 연구팀이 GNFS를 사용하여 RSA-250(829비트, 250자리 합성수)의 소인수 분해에 성공했습니다. 이 계산에는 전 세계의 컴퓨터 자원을 끌어모아 약 2700 CPU 코어 연도라는 방대한 계산 시간을 소모했습니다. 그러나 이것이 2048비트가 되면, 필요한 계산량은 우주의 수명의 수조 배로 부풀어 오른다고 언급되고 있어, 현재의 슈퍼컴퓨터를 아무리 병렬로 가동시킨다 해도 고전적인 기법으로는 현실적인 시간 내에 해독하는 것이 불가능합니다.&lt;/p>
&lt;hr>
&lt;h2 id="양자-컴퓨터의-비장의-카드-쇼어의-알고리즘">양자 컴퓨터의 비장의 카드: 쇼어의 알고리즘
&lt;/h2>&lt;p>여기서 등장하는 것이 1994년 피터 쇼어(Peter Shor)에 의해 발표된 &amp;lsquo;쇼어의 알고리즘&amp;rsquo;입니다. 이 알고리즘은 소인수 분해 문제를 양자 컴퓨터 상에서 &lt;strong>다항 시간&lt;/strong> ( $ O((\log N)^3) $ ) 안에 풀 수 있다는 획기적인 것이었습니다. 준지수함수적 시간과 다항 시간의 차이는 결정적인 것이며, 이론상 양자 컴퓨터를 사용하면 RSA 암호는 완전히 파괴됨을 의미합니다.&lt;/p>
&lt;h3 id="쇼어의-알고리즘의-전체-흐름">쇼어의 알고리즘의 전체 흐름
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">graph TD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A[소인수 분해하고 싶은 수 N을 입력] --&amp;gt; B[랜덤한 정수 a를 선택]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B --&amp;gt; C{a와 N의&amp;lt;br&amp;gt;최대공약수}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt;|1보다 크다| D[운 좋게 소인수를 발견!]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt;|1 즉, 서로소| E[양자 컴퓨터의 차례]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> E --&amp;gt; F[함수 f_x = a^x mod N 의&amp;lt;br&amp;gt;주기 r을 양자 푸리에 변환으로 구함]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F --&amp;gt; G{주기 r이 짝수 이고&amp;lt;br&amp;gt;a^r/2 ≢ -1 mod N}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt;|Yes| H[최대공약수 gcd_a^r/2 ± 1, N 을 계산]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> H --&amp;gt; I((소인수 분해 성공!))
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt;|No| B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>쇼어의 알고리즘은 소인수 분해라는 문제를 직접 푸는 것이 아니라, 정수론의 정리를 이용하여 &amp;lsquo;주기 발견 문제(Period Finding Problem)&amp;lsquo;라는 별개의 문제로 변환하고, 그것을 양자 컴퓨터의 특성을 살려 고속으로 푸는 접근법을 취합니다.&lt;/p>
&lt;h3 id="단계-1-소인수-분해에서-주기-발견-문제로의-환원-고전적-처리">단계 1: 소인수 분해에서 주기 발견 문제로의 환원 (고전적 처리)
&lt;/h3>&lt;p>알고리즘의 첫 단계는 고전 컴퓨터에서 이루어집니다.
소인수 분해하고자 하는 수 $ N $ 에 대해, $ N $ 과 서로소인(최대공약수가 1인) 랜덤한 정수 $ a $ ( $ 1 &lt; a &lt; N $ )를 선택합니다. 만약 우연히도 최대공약수가 1이 아니라면, 그 시점에서 찾은 공약수가 $ N $ 의 소인수이므로 해독 완료이지만 확률은 극히 낮습니다.&lt;/p>
&lt;p>다음으로 이하의 모듈로 방정식 수열을 생각합니다.
$ f(x) = a^x \pmod N $&lt;/p>
&lt;p>이 함수 $ f(x) $ 에 $ x = 1, 2, 3, \dots $ 를 대입해 가면 값은 무작위인 것처럼 보이지만, 유한한 범위 내에서 계산하고 있기 때문에 반드시 어딘가에서 원래 값으로 돌아오고 같은 수열을 반복합니다. 이 반복의 주기를 $ r $ 이라고 부릅니다. 즉,
$ a^r \equiv 1 \pmod N $
이 되는 최소의 양의 정수 $ r $ 을 찾는 문제, 이것이 &amp;lsquo;주기 발견 문제&amp;rsquo;입니다.&lt;/p>
&lt;p>만약 이 주기 $ r $ 이 발견되고 $ r $ 이 짝수라면, $ a^r - 1 \equiv 0 \pmod N $ 이 되어 인수 분해 공식을 사용하여
$ (a^{r/2} - 1)(a^{r/2} + 1) \equiv 0 \pmod N $
와 같이 변형할 수 있습니다. 여기서 유클리드 호제법을 사용하여 $ N $ 과 $ a^{r/2} \pm 1 $ 의 최대공약수를 계산함으로써, $ N $ 의 소인수를 극히 높은 확률로 얻을 수 있습니다.&lt;/p>
&lt;p>고전 컴퓨터로 주기 $ r $ 을 찾기 위해서는 결국 지수 시간적인 단계가 필요해져 고속화할 수 없습니다. 하지만 양자 컴퓨터라면 이 주기 $ r $ 을 순식간에(다항 시간 안에) 찾을 수 있는 것입니다.&lt;/p>
&lt;h3 id="단계-2-양자-상태의-준비와-중첩">단계 2: 양자 상태의 준비와 중첩
&lt;/h3>&lt;p>여기서부터 양자 컴퓨터가 나설 차례입니다.
양자 컴퓨터는 &amp;lsquo;0&amp;rsquo;과 &amp;lsquo;1&amp;rsquo;의 상태를 동시에 가질 수 있는 &amp;lsquo;양자 비트(Qubit)&amp;lsquo;를 사용합니다. 쇼어의 알고리즘에서는 입력을 저장하는 레지스터(제1 레지스터)와 계산 결과를 저장하는 레지스터(제2 레지스터) 두 가지를 준비합니다.&lt;/p>
&lt;p>먼저 아다마르 게이트(Hadamard gate)라 불리는 양자 게이트 조작을 제1 레지스터의 모든 양자 비트에 적용합니다. 이로써 제1 레지스터는 생각할 수 있는 모든 $ x $ 의 값( $ 0 $ 부터 $ 2^n-1 $ 까지. $ n $ 은 충분히 큰 비트 수)의 &lt;strong>균등한 중첩 상태&lt;/strong> 가 됩니다.&lt;/p>
&lt;p>즉, 양자 컴퓨터의 내부에는 $ x=0, 1, 2, 3, \dots $ 이라는 무수한 입력값이 동시에 병행하여 존재하고 있는 상태가 만들어집니다.&lt;/p>
&lt;h3 id="단계-3-양자-모듈로-거듭제곱-quantum-modular-exponentiation">단계 3: 양자 모듈로 거듭제곱 (Quantum Modular Exponentiation)
&lt;/h3>&lt;p>다음으로 제1 레지스터의 중첩 상태를 입력으로 하여 $ f(x) = a^x \pmod N $ 을 계산하고, 그 결과를 제2 레지스터에 저장합니다.
이 계산은 양자 회로 상의 유니터리 변환으로서 실행되기 때문에, 중첩이 유지된 채 모든 $ x $ 에 대한 $ f(x) $ 의 계산이 &amp;lsquo;동시 병행적으로(양자 병렬성)&amp;rsquo; 이루어집니다.&lt;/p>
&lt;p>이 시점에서의 양자 시스템 전체의 공간은,
$ |x, a^x \bmod N\rangle $
이라는 상태의 방대한 중첩으로 되어 있습니다.&lt;/p>
&lt;p>그러나 여기서 단순히 제2 레지스터를 측정(관측)해 버리면, 랜덤한 $ a^x \bmod N $ 의 값이 단 하나만 확률적으로 선택되고, 그에 연동되어 제1 레지스터의 $ x $ 도 하나로 확정되어 버립니다. 이래서는 고전 컴퓨터로 한 번 계산한 것과 다를 바 없어, 주기 $ r $ 을 찾을 수 없습니다.&lt;/p>
&lt;p>양자역학의 규칙에서는 중첩 상태의 내용을 직접 들여다보는 것은 불가능합니다. 그렇다면 어떻게 전체의 &amp;lsquo;주기&amp;rsquo;라는 전역적인(global) 정보를 추출하는 것일까요?&lt;/p>
&lt;h3 id="단계-4-양자-푸리에-변환-qft-quantum-fourier-transform">단계 4: 양자 푸리에 변환 (QFT: Quantum Fourier Transform)
&lt;/h3>&lt;p>이 벽을 돌파하는 쇼어 알고리즘의 진면목이 바로 제1 레지스터에 대한 &lt;strong>양자 푸리에 변환(QFT)&lt;/strong> 의 적용입니다.&lt;/p>
&lt;p>측정을 실시하기 전에, 함수 $ f(x) $ 의 파동적 성질을 해석합니다. 제2 레지스터를 관측했다고 가정해 봅시다. 어떤 값 $ y $ 를 얻었다고 합시다. 그러면 제1 레지스터의 상태는 &amp;ldquo;$ a^x \pmod N = y $ 가 되는 모든 $ x $ 의 중첩&amp;quot;으로 수축됩니다.
이 $ x $ 의 값은 $ x_0, x_0 + r, x_0 + 2r, x_0 + 3r, \dots $ 와 같이 주기 $ r $ 의 간격으로 이산적으로 나열된 상태(일종의 빗 모양의 확률 진폭 분포)가 됩니다.&lt;/p>
&lt;p>이 상태에 대해 양자 푸리에 변환(QFT)을 적용합니다. 고전적인 이산 푸리에 변환이 시간 영역의 신호를 주파수 영역으로 변환하듯이, QFT는 양자 상태의 확률 진폭에 간섭을 일으킵니다.&lt;/p>
&lt;p>QFT를 걸면 양자 간섭 효과에 의해 주기 $ r $ 과 공명하지 않는(위상이 맞지 않는) 잘못된 답의 확률은 서로 상쇄되어 0에 가까워지고(상쇄 간섭), 주기 $ r $ 의 정보를 가진 올바른 답의 확률만이 증폭됩니다(보강 간섭).&lt;/p>
&lt;h3 id="단계-5-측정과-연분수-전개-고전적-후처리">단계 5: 측정과 연분수 전개 (고전적 후처리)
&lt;/h3>&lt;p>QFT 적용 후에 제1 레지스터를 측정하면, 매우 높은 확률로 $ c \approx \frac{j \cdot 2^n}{r} $ 이라는 형태에 가까운 정수 $ c $ 를 얻게 됩니다( $ j $ 는 미지의 정수, $ 2^n $ 은 레지스터의 크기).&lt;/p>
&lt;p>이 측정 결과 $ c $ 를 고전 컴퓨터로 가져와서 $ \frac{c}{2^n} \approx \frac{j}{r} $ 이라는 분수를 만듭니다. 그리고 수학적 기법인 &amp;lsquo;연분수 전개(Continued fraction expansion)&amp;lsquo;를 사용하여 근사치를 계산함으로써 분모인 주기 $ r $ 을 멋지게 찾아낼 수 있습니다.&lt;/p>
&lt;p>$ r $ 을 알게 되면, 남은 것은 단계 1의 공식을 사용하여 $ N $ 의 소인수를 계산하기만 하면 되며 RSA 암호는 완전히 해독됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="현재의-양자-컴퓨터nisq의-실력과-과제">현재의 양자 컴퓨터(NISQ)의 실력과 과제
&lt;/h2>&lt;p>이론적으로는 완벽한 쇼어의 알고리즘이지만, &amp;ldquo;내일이라도 당장 RSA 암호가 깨지는가?&amp;ldquo;라고 묻는다면 답은 명확히 &amp;ldquo;아니오&amp;quot;입니다. 그 이유는 현재의 양자 컴퓨터의 하드웨어 기술의 한계에 있습니다.&lt;/p>
&lt;h3 id="nisq-noisy-intermediate-scale-quantum-시대">NISQ (Noisy Intermediate-Scale Quantum) 시대
&lt;/h3>&lt;p>현재 우리가 살고 있는 것은 &amp;lsquo;NISQ&amp;rsquo;라 불리는 시대입니다. NISQ 디바이스는 수십에서 수백 개의 물리 양자 비트를 가지지만, 노이즈에 대해 극히 취약합니다.&lt;/p>
&lt;p>양자 비트는 열이나 전자파 등의 외부 환경의 영향을 받기 쉬워, 양자 상태가 깨져 버리는 &amp;lsquo;결어긋남(Decoherence, 양자 얽힘 상실)&amp;lsquo;이나 게이트 조작 시의 &amp;lsquo;게이트 에러&amp;rsquo;가 빈번하게 발생합니다. 쇼어의 알고리즘과 같이 매우 깊은(연산 단계 수가 방대한) 양자 회로를 실행하려고 하면, 계산 도중에 에러가 축적되어 최종적인 출력은 의미를 가지지 않는 완전한 노이즈가 되어 버립니다.&lt;/p>
&lt;h3 id="물리-양자-비트와-논리-양자-비트">물리 양자 비트와 논리 양자 비트
&lt;/h3>&lt;p>이 에러 문제를 해결하기 위해 필수불가결한 것이 &amp;lsquo;양자 오류 정정(Quantum Error Correction)&amp;lsquo;입니다.
고전 컴퓨터에서도 오류 정정 코드가 사용되고 있지만, 양자 상태의 복제를 금지하는 &amp;lsquo;복제 불가능성 정리(No-cloning theorem)&amp;lsquo;가 있기 때문에 양자 오류 정정은 매우 복잡합니다.&lt;/p>
&lt;p>양자 오류 정정에서는 &amp;lsquo;표면 부호(Surface Code)&amp;rsquo; 등의 기술을 이용하여, 다수의 노이즈투성이인 &amp;lsquo;물리 양자 비트&amp;rsquo;를 조합함으로써 에러가 없는 이상적인 하나의 &amp;lsquo;논리 양자 비트&amp;rsquo;를 만들어 냅니다.&lt;/p>
&lt;p>현재의 에러율을 전제로 하면, 하나의 논리 양자 비트를 만들기 위해서는 약 1,000～10,000개의 물리 양자 비트가 필요해진다고 추산되고 있습니다. 이를 &amp;lsquo;오류 정정의 오버헤드&amp;rsquo;라고 부릅니다.&lt;/p>
&lt;h3 id="rsa-2048을-파괴하기-위해-필요한-자원이란">RSA-2048을 파괴하기 위해 필요한 자원이란?
&lt;/h3>&lt;p>그렇다면 실제로 RSA-2048을 해독하기 위해, 쇼어의 알고리즘을 구동시키려면 어느 정도의 자원이 필요할까요?&lt;/p>
&lt;p>Craig Gidney (Google) 와 Martin Ekerå 의 2021년 논문에 따른 획기적인 자원 추정에 의하면, 최적화된 쇼어의 알고리즘을 사용하고 표면 부호에 의한 오류 정정을 수행할 경우 다음과 같은 자원이 필요하다고 합니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>논리 양자 비트 수&lt;/strong> : 약 4,096 개&lt;/li>
&lt;li>&lt;strong>물리 양자 비트 수 ** : ** 약 2000만 개&lt;/strong> (에러율 $10^{-3}$ 정도를 가정)&lt;/li>
&lt;li>&lt;strong>계산 시간&lt;/strong> : 약 8시간 (물리 게이트 조작이 수백만～수십억 회 필요)&lt;/li>
&lt;/ul>
&lt;p>이에 반해, 현재의 양자 하드웨어의 도달점은 어떨까요?
2023년 말에 IBM이 발표한 초전도 양자 프로세서 &amp;lsquo;Condor(콘도르)&amp;lsquo;는 1,121 양자 비트입니다. 또한 논리 양자 비트의 생성과 관련된 획기적인 연구(하버드 대학이나 QuEra사 등에 의한 중성 원자 양자 컴퓨터를 이용한 48개의 논리 양자 비트 생성 등)도 등장하고 있지만, 아직 &amp;ldquo;노이즈 없는 완벽한 연산&amp;quot;을 장시간 연속으로 실행할 수 있는 단계에는 이르지 못했습니다.&lt;/p>
&lt;p>수천 개의 물리 양자 비트에서 &lt;strong>2000만 개&lt;/strong> 의 실용적인 물리 양자 비트(게다가 상호 결선되어 극저온에서 안정적으로 동작하고 초고속으로 제어 신호를 처리할 수 있는 시스템)로의 스케일업은 공학적으로 엄청난 장벽(배선 문제, 냉각 능력의 한계, 제어 전자장치의 비대화)이 존재합니다. 많은 전문가들은 RSA-2048을 해독할 수 있는 &amp;lsquo;결함 허용(Fault-Tolerant) 양자 컴퓨터(FTQC)&amp;lsquo;가 실현되려면 적어도 10년에서 30년, 혹은 그 이상의 세월이 필요하다고 예측하고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="다가오는-store-now-decrypt-later의-위협과-pqc의-여명">다가오는 &amp;lsquo;Store Now, Decrypt Later&amp;rsquo;의 위협과 PQC의 여명
&lt;/h2>&lt;p>&amp;ldquo;아직 10년 이상 걸린다면 안심이다&amp;quot;라고 생각하는 것은 시기상조입니다. 현재 국가 기밀정보나 의료 데이터, 장기적인 인프라 설계 등 수십 년 후까지 비밀을 보장해야만 하는 데이터가 존재합니다.&lt;/p>
&lt;p>여기서 우려되고 있는 것이 바로 &lt;strong>&amp;lsquo;Store Now, Decrypt Later (지금 저장하고, 나중에 해독한다)&amp;rsquo;&lt;/strong> 는 공격 기법입니다. 악의가 있는 국가나 조직이 현재의 RSA나 ECC(타원곡선암호)로 암호화된 통신 데이터를 모두 도청하여 스토리지에 저장해 두는 것입니다. 그리고 10년 후, 20년 후에 강력한 양자 컴퓨터가 완성되는 순간에 쇼어의 알고리즘을 사용하여 과거의 데이터를 모두 해독해내어 비밀을 폭로한다는 기법입니다.&lt;/p>
&lt;p>이러한 타임 래그의 위협에 대항하기 위해 NIST(미국 국립표준기술연구소)를 중심으로 &lt;strong>&amp;lsquo;양자 내성 암호 (PQC: Post-Quantum Cryptography)&amp;rsquo;&lt;/strong> 의 표준화 프로세스가 급피치로 진행되어 왔습니다.&lt;/p>
&lt;p>PQC는 양자 컴퓨터를 이용하더라도 해독이 곤란한(즉, 쇼어의 알고리즘을 적용할 수 없는) 수학적 문제를 기반으로 한 새로운 암호 알고리즘입니다. 주요 접근법으로는 다음과 같은 것들이 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>격자 암호 (Lattice-based cryptography)&lt;/strong> : LWE(Learning with Errors) 문제 등을 기초로 합니다. NIST의 표준화에서 주류 (Kyber, Dilithium 등).&lt;/li>
&lt;li>&lt;strong>부호 기반 암호 (Code-based cryptography)&lt;/strong> : 오류 정정 부호의 복호 문제의 어려움에 의존합니다.&lt;/li>
&lt;li>&lt;strong>다변수 다항식 암호 (Multivariate cryptography)&lt;/strong> : 다변수의 연립 이차방정식을 푸는 어려움에 의존합니다.&lt;/li>
&lt;li>&lt;strong>해시 기반 서명 (Hash-based signatures)&lt;/strong> : 해시 함수의 안전성에만 의존하는 디지털 서명입니다.&lt;/li>
&lt;/ul>
&lt;p>이미 Google Chrome이나 Apple의 iMessage 등 주요 소프트웨어나 플랫폼에서는 PQC의 도입 테스트나 하이브리드 구현이 시작되었습니다.&lt;/p>
&lt;h2 id="마치며">마치며
&lt;/h2>&lt;p>양자 컴퓨터는 SF 세계의 꿈 같은 이야기에서 현실적인 공학적 도전으로 넘어가고 있습니다. 쇼어의 알고리즘은 수학과 양자역학이 융합된 인류의 위대한 지적 성과이지만, 동시에 우리 디지털 사회의 기반을 뒤흔드는 &amp;lsquo;파괴적인 힘&amp;rsquo;을 간직하고 있습니다.&lt;/p>
&lt;p>RSA 암호가 내일 당장 쓰지 못하게 되는 것은 아닙니다. 하지만 양자 기술의 진화와 &amp;lsquo;Store Now, Decrypt Later&amp;rsquo;의 리스크를 감안한다면, PQC로의 이행이라는 암호 역사에 남을 대규모의 마이그레이션은 이미 시작되었습니다. 우리는 지금 정보 보안의 패러다임 시프트의 최전선을 목격하고 있는 것입니다.&lt;/p></description></item><item><title>일반 수체 체(GNFS)의 진정한 수학적 구조</title><link>http://kenji.blog/ko/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</link><pubDate>Sat, 05 Sep 2026 02:26:13 +0900</pubDate><guid>http://kenji.blog/ko/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</guid><description>&lt;img src="http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523.jpg" alt="Featured image of post 일반 수체 체(GNFS)의 진정한 수학적 구조" />&lt;h1 id="일반-수체-체법gnfs의-진정한-수학적-구조">일반 수체 체법(GNFS)의 진정한 수학적 구조
&lt;/h1>&lt;p>GNFS의 궁극적인 목적은 $X^2 \equiv Y^2 \pmod N$이 되는 $X, Y$를 찾는 것입니다.
이를 달성하기 위해 수학자들은 &lt;strong>「현실의 정수 세계」&lt;/strong> 와 &lt;strong>「대수체의 세계」&lt;/strong> 사이에 다리를 놓았습니다. 그 다리가 바로 「준동형 사상」입니다.&lt;/p>
&lt;h2 id="제1단계-세계를-연결하는-준동형-사상homomorphism">제1단계: 세계를 연결하는 「준동형 사상(Homomorphism)」
&lt;/h2>&lt;h3 id="1-다항식의-선정과-근의-정의">1. 다항식의 선정과 근의 정의
&lt;/h3>&lt;p>거대한 합성수 $N$에 대해, 어떤 정수 $m$과 다항식 $f(x)$를 선택하여, $f(m) \equiv 0 \pmod N$이 되도록 합니다.
(예: $N$을 $m$진수로 전개하고, 그 계수로부터 $f(x)$를 만듭니다. 이때 $f(x)$는 유리수체 $\mathbb{Q}$ 위에서 기약(더 이상 인수분해할 수 없음)이라고 가정합니다).&lt;/p>
&lt;p>다음으로, 방정식 $f(x) = 0$의 「복소수에서의 근」 중 하나를 $\alpha$로 둡니다.
당연히 $f(\alpha) = 0$입니다. $\alpha$는 정수가 아니라, 루트나 허수를 포함하는 복잡한 수(대수적 수)입니다.&lt;/p>
&lt;h3 id="2-환ring과-준동형-사상의-구축">2. 환(Ring)과 준동형 사상의 구축
&lt;/h3>&lt;p>여기서 두 개의 수학적인 「환(덧셈과 곱셈이 정의된 세계)」을 준비합니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>세계A: $\mathbb{Z}[\alpha]$&lt;/strong> ($\alpha$를 포함하는 대수적 정수환)
$a + b\alpha + c\alpha^2 + \dots$ 형태로 표현되는 수의 세계입니다.&lt;/li>
&lt;li>&lt;strong>세계B: $\mathbb{Z}/N\mathbb{Z}$&lt;/strong> ($N$으로 나눈 나머지의 환)
$0$부터 $N-1$까지의 정수로만 구성된, 합동식(모듈로)의 세계입니다.&lt;/li>
&lt;/ul>
&lt;p>여기서 세계A에서 세계B로, 다음과 같은 매핑(사상) $\phi$를 정의합니다.
&lt;strong>$$\phi : \mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z}$$&lt;/strong>
&lt;strong>$$\phi(\alpha) = m \pmod N$$&lt;/strong>&lt;/p>
&lt;p>이 사상 $\phi$는 세계A의 변수 $\alpha$를 그대로 세계B의 정수 $m$으로 바꿔치기하는 마법의 조작입니다.
이 $\phi$는 &lt;strong>「환 준동형 사상(Ring Homomorphism)」&lt;/strong> 이라는 극히 강력한 성질을 가지고 있습니다.
준동형이란 &lt;strong>「덧셈이나 곱셈의 구조를 깨뜨리지 않고 다른 세계로 워프시키는」&lt;/strong> 성질을 의미합니다. 즉, 다음 식이 성립합니다.&lt;/p>
&lt;ul>
&lt;li>$\phi(X \times Y) = \phi(X) \times \phi(Y)$&lt;/li>
&lt;li>$\phi(X^2) = \phi(X)^2$&lt;/li>
&lt;/ul>
&lt;p>이것이 무엇을 의미할까요? 만약 우리가 「세계A($\alpha$의 세계)」에서 어떤 복잡한 요소 $\gamma$의 &lt;strong>「제곱($\gamma^2$)」&lt;/strong> 을 만들 수 있다면, 그것을 $\phi$로 「세계B(나머지의 세계)」로 워프시켜도 ** 훌륭하게 제곱의 형태 $\phi(\gamma)^2$가 유지된다** 는 것입니다.&lt;/p>
&lt;hr>
&lt;h2 id="제2단계-소인수분해의-붕괴와-아이디얼ideal의-탄생">제2단계: 소인수분해의 붕괴와 「아이디얼(Ideal)」의 탄생
&lt;/h2>&lt;p>우리는 세계A($\mathbb{Z}[\alpha]$) 안에서 적당한 요소 $(a - b\alpha)$를 많이 모아, 그것들을 곱해서 「완전한 제곱(평방원)」을 만들고자 합니다.
보통이라면 모은 $(a - b\alpha)$를 각각 「소인수분해」해서, 소수의 지수가 모두 짝수가 되도록 조합(행렬로 풂)하면 제곱을 만들 수 있습니다.&lt;/p>
&lt;p>&lt;strong>하지만, 여기서 대수학의 절망적인 장벽이 앞을 가로막습니다.&lt;/strong>
$\mathbb{Z}[\alpha]$와 같은 대수체의 세계에서는, 중학교 때 배우는 &lt;strong>「소인수분해의 유일성(어떤 수도 소수의 곱셈으로 단 한 가지로만 표현할 수 있다)」이 붕괴되어 버리는&lt;/strong> 것입니다.&lt;/p>
&lt;p>(예: 어떤 대수체의 세계에서는 $6 = 2 \times 3$ 이며, 동시에 $6 = (1+\sqrt{-5}) \times (1-\sqrt{-5})$ 가 되어버려, 어느 쪽이 진짜 소수인지 알 수 없게 됩니다)&lt;/p>
&lt;p>소인수분해가 한 가지로 정해지지 않으면, 「소수의 개수를 세어 짝수 개로 만든다」는 퍼즐(체법)을 원리적으로 실행할 수 없습니다.&lt;/p>
&lt;h3 id="쿠머와-데데킨트의-구원-아이디얼">쿠머와 데데킨트의 구원: 「아이디얼」
&lt;/h3>&lt;p>이 붕괴를 구원한 것이, 19세기의 수학자들이 만들어낸 &lt;strong>「아이디얼(Ideal: 이상수)」&lt;/strong> 이라는 개념입니다.
요소 자체가 아니라, 그 요소가 생성하는 「배수의 집합(아이디얼)」을 생각함으로써 다시 소인수분해를 가능하게 한 것입니다.&lt;/p>
&lt;p>대수체의 정수환 $\mathcal{O}_K$($\mathbb{Z}[\alpha]$를 포함하는 더 완전한 환)에서, 요소는 유일하게 소인수분해할 수 없어도, &lt;strong>「아이디얼은 반드시 『소 아이디얼($\mathfrak{p}$)』의 곱으로 단 한 가지로 소인수분해할 수 있다」&lt;/strong> 는 것이 증명되어 있습니다.&lt;/p>
&lt;p>따라서 GNFS에서는 요소 $(a - b\alpha)$ 자체를 분해하는 것이 아니라, 그것이 생성하는 &lt;strong>단항 아이디얼 $\langle a - b\alpha \rangle$을 소 아이디얼 분해&lt;/strong> 합니다.&lt;/p>
&lt;hr>
&lt;h2 id="제3단계-노름norm과-두-개의-체sieve">제3단계: 노름(Norm)과 두 개의 체(Sieve)
&lt;/h2>&lt;p>그렇다면, 아이디얼 $\langle a - b\alpha \rangle$이 어떤 소 아이디얼로 분해되는지 어떻게 알 수 있을까요?
여기서 &lt;strong>「노름(Norm)」&lt;/strong> 이라는 함수를 사용합니다. 노름이란, 대수체의 복잡한 요소를 「평범한 현실의 정수 $\mathbb{Z}$」로 변환하는 함수입니다.&lt;/p>
&lt;p>요소 $(a - b\alpha)$의 노름은 $b^d f(a/b)$라는 간단한 다항식 계산으로 구할 수 있습니다($d$는 $f(x)$의 차수).&lt;/p>
&lt;p>대수학의 정리에 의해, &lt;strong>「어떤 아이디얼의 노름이 작은 소수로 완전히 분해될 수 있다면(매끄럽다면), 그 원래의 아이디얼도 작은 소 아이디얼로 완전히 분해될 수 있다」&lt;/strong> 는 것이 알려져 있습니다.&lt;/p>
&lt;p>그래서 GNFS는 대량의 정수 쌍 $(a, b)$에 대해 다음 두 가지를 동시에 계산하고, 양쪽 모두가 「매끄러운 수」가 되는 쌍만을 수집합니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>유리 체(Rational Sieve)&lt;/strong>: $a - bm$ (현실 세계의 값)&lt;/li>
&lt;li>&lt;strong>대수 체(Algebraic Sieve)&lt;/strong>: $b^d f(a/b)$ (대수체의 세계에서의 노름)&lt;/li>
&lt;/ol>
&lt;p>양쪽 모두 매끄러운 쌍 $(a, b)$를 수천만 개 모아, 아이디얼의 소인수분해 데이터(소 아이디얼이 몇 개 포함되어 있는지)를 거대한 행렬(GF(2) 위에서의 선형대수)로 풀어, 「곱하면 모든 소 아이디얼의 지수가 짝수가 되는」 쌍의 집합 $S$를 찾습니다.&lt;/p>
&lt;hr>
&lt;h2 id="제4단계-앞을-가로막는-두-개의-장애물과-아이디얼-류군">제4단계: 앞을 가로막는 두 개의 「장애물」과 아이디얼 류군
&lt;/h2>&lt;p>행렬 계산을 통해 집합 $S$에 속하는 $(a - b\alpha)$의 아이디얼을 모두 곱하면, 어떤 아이디얼 $I$의 제곱이 된다는 것을 알았습니다.
&lt;/p>
$$\prod_{S} \langle a - b\alpha \rangle = I^2$$
&lt;p>&lt;strong>하지만 아직 끝나지 않았습니다. GNFS에서 가장 깊고, 가장 어려운 수학의 벽이 여기에 있습니다.&lt;/strong>&lt;/p>
&lt;p>우리가 마지막으로 원하는 것은 「아이디얼의 제곱」이 아니라, 사상 $\phi$에 대입하기 위한 &lt;strong>「요소의 제곱($\gamma^2$)」&lt;/strong> 입니다.
아이디얼의 제곱이 되었다고 해서, 요소 자체가 제곱이 되어 있다는 보장은 없습니다. 여기에는 &lt;strong>두 가지 강력한 수학적 장애물(Obstruction)&lt;/strong> 이 존재합니다.&lt;/p>
&lt;h3 id="장애물-아이디얼-류군ideal-class-group의-벽">장애물①: 아이디얼 류군(Ideal Class Group)의 벽
&lt;/h3>&lt;p>아이디얼 $I$는 반드시 「하나의 요소로 생성되는 아이디얼(단항 아이디얼)」이라고는 할 수 없습니다.
단항 아이디얼이 아닌 아이디얼에서 구체적인 요소 $\gamma$를 꺼내는 것은 불가능합니다.&lt;/p>
&lt;p>여기서 &lt;strong>「아이디얼 류군(Class Group, $Cl_K$)」&lt;/strong> 이라는 개념이 등장합니다. 아이디얼 류군이란, 「그 대수체의 세계에 단항 아이디얼이 아닌 아이디얼이 얼마나 존재하는가(소인수분해의 유일성이 얼마나 깨져 있는가)」를 측정하는 군입니다.
$\prod \langle a - b\alpha \rangle$이 $I^2$이 되었다고 해도, $I$가 아이디얼 류군에서 단위원(단항 아이디얼)이 아니라면, 요소의 제곱으로 되돌릴 수 없습니다.&lt;/p>
&lt;h3 id="장애물-단수군unit-group의-벽">장애물②: 단수군(Unit Group)의 벽
&lt;/h3>&lt;p>만약 운 좋게 $I$가 단항 아이디얼 $\langle \gamma \rangle$이었다고 해봅시다.
그러면 $\prod \langle a - b\alpha \rangle = \langle \gamma^2 \rangle$이 됩니다.
「좋아, 요소도 제곱이다!」라고 생각할지 모르지만, 큰 착각입니다.&lt;/p>
&lt;p>아이디얼(배수의 집합)이 같다는 것이 요소가 완전히 같다는 것을 의미하지는 않습니다. 반드시 &lt;strong>「단수(Unit: 역수도 정수가 되는 수. 1이나 -1 등)」&lt;/strong> 의 차이가 발생합니다.
즉, 실제 요소의 등식은 다음과 같이 됩니다.
&lt;/p>
$$\prod_{S} (a - b\alpha) = u \cdot \gamma^2$$
&lt;p>
($u$는 단수군 $U_K$의 요소)&lt;/p>
&lt;p>이 단수 $u$ 자체가 무언가의 제곱(평방원)이 아니라면, 좌변은 절대로 「완전한 요소의 제곱」이 될 수 없습니다.&lt;/p>
&lt;hr>
&lt;h2 id="제5단계-애들먼의-마법-이차-잉여-지표quadratic-characters">제5단계: 애들먼의 마법 「이차 잉여 지표(Quadratic Characters)」
&lt;/h2>&lt;p>아이디얼 류군의 장애물과 단수군의 장애물. 이 두 가지를 어떻게 뛰어넘을 것인가?
여기서 암호학자 레너드 애들먼(RSA의 &amp;ldquo;A&amp;rdquo;) 등이 도입한 천재적인 수법 &lt;strong>「이차 잉여 지표(Quadratic Characters)」&lt;/strong> 가 등장합니다.&lt;/p>
&lt;p>「어떤 요소가 대수체 안에서 완전히 제곱이 되어 있는가?」를 판정하기 위해, 르장드르 기호(이차 잉여)의 대수체 버전을 사용합니다.
아까의 거대한 행렬(소 아이디얼의 개수를 짝수로 만들기 위한 퍼즐)에 &lt;strong>「몇 가지 특별한 소 아이디얼 $\mathfrak{q}$에 대한 이차 잉여 지표도 모두 $1$(짝수)이 된다」는 추가 조건(열)을 수십 개 정도 몰래 덧붙이는&lt;/strong> 것입니다.&lt;/p>
&lt;p>행렬 계산에 의해 이 추가 조건조차도 만족하는 집합 $S$를 찾았을 때, 대수적 정수론의 깊은 정리에 의해 &lt;strong>「아이디얼 류군의 장애물도, 단수군의 장애물도, 압도적인 확률로 자연스럽게 소멸한다」&lt;/strong> 는 것이 보장됩니다.&lt;/p>
&lt;p>이를 통해 마침내 우리는 진정한 등식을 손에 넣게 됩니다.
&lt;/p>
$$\prod_{S} (a - b\alpha) = \gamma^2$$
&lt;hr>
&lt;h2 id="최종-단계-세계의-융합과-암호-붕괴">최종 단계: 세계의 융합과 암호 붕괴
&lt;/h2>&lt;p>드디어 퍼즐의 모든 조각이 맞춰졌습니다.&lt;/p>
&lt;p>&lt;strong>【대수체의 세계(세계A)의 요소】&lt;/strong>
$\gamma^2 = \prod (a - b\alpha)$
(이것을 제곱근 알고리즘을 사용하여 $\gamma$를 구합니다)&lt;/p>
&lt;p>&lt;strong>【현실의 세계(유리수의 세계)의 요소】&lt;/strong>
$V^2 = \prod (a - bm)$
(이쪽은 단순한 정수의 곱셈이므로, 평범하게 제곱근 $V$가 구해집니다)&lt;/p>
&lt;p>자, 맨 처음에 만든 마법의 다리, &lt;strong>준동형 사상 $\phi$&lt;/strong> 가 나설 차례입니다.
세계A의 요소 $\gamma$를, $\phi$($\alpha$에 $m$을 대입하는 사상)를 사용하여 세계B($N$의 나머지 세계)로 워프시킵니다.
&lt;/p>
$$Y = \phi(\gamma) \pmod N$$
&lt;p>한편, 현실 세계에서 만든 $V$를 그대로 나머지 세계로 가져가 $X$로 둡니다.
&lt;/p>
$$X = V \pmod N$$
&lt;p>준동형 사상의 「구조를 보존하는」 성질에 의해, 세계A에서 성립하던 제곱의 관계는 세계B(모듈로 $N$의 세계)에서도 완전히 보존되어 있습니다.
게다가 원래의 쌍 $(a, b)$는 $a - b\alpha$와 $a - bm$이라는 형태로 대응되어 만들어졌기 때문에, 이 $X$와 $Y$는 모듈로 $N$의 세계에서 격돌하며 다음의 절대적인 등식을 낳습니다.&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>이제 이 $X$와 $Y$가 자명한 해($X \equiv \pm Y$)가 아니기를 기도하며,
&lt;strong>$\gcd(X - Y, N)$&lt;/strong> 을 계산합니다.&lt;/p>
&lt;p>비자명한 해라면, 유클리드 호제법이 0.001초 만에 실행되며 RSA 암호의 심장부인 비밀 소수 $p$와 $q$가 출력 화면에 인쇄됩니다.&lt;/p>
&lt;hr>
&lt;p>이것이 현대 수학의 정수를 모은 &lt;strong>「일반 수체 체법(GNFS)」의 완전한 모습&lt;/strong> 입니다.&lt;/p></description></item><item><title>인터넷 암호를 깨는 인류 최강의 수학 '일반 수체 체(GNFS)'란?</title><link>http://kenji.blog/ko/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</link><pubDate>Sat, 05 Sep 2026 02:09:08 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485.jpg" alt="Featured image of post 인터넷 암호를 깨는 인류 최강의 수학 '일반 수체 체(GNFS)'란?" />&lt;h1 id="인터넷의-암호를-깨는-인류-최강의-수학-일반-수체-체gnfs란">인터넷의 암호를 깨는 인류 최강의 수학 「일반 수체 체(GNFS)」란?
&lt;/h1>&lt;p>우리가 매일 사용하는 인터넷. LINE 메시지나 YouTube, Amazon에서의 쇼핑 등 모든 통신은 &amp;ldquo;암호&amp;quot;에 의해 보호받고 있습니다.
현재 전 세계에서 가장 많이 사용되는 암호의 대표가 &amp;ldquo;RSA 암호&amp;quot;입니다.&lt;/p>
&lt;p>RSA 암호 방어의 핵심은 매우 간단합니다. 그것은 &lt;strong>&amp;ldquo;거대한 수의 소인수분해는 컴퓨터로도 풀 수 없다&amp;rdquo;&lt;/strong> 는 수학적 성질을 이용하고 있다는 것입니다.
예를 들어 &amp;ldquo;15&amp;quot;라면 &amp;ldquo;3 × 5&amp;quot;라고 바로 알 수 있지만, 이것이 &amp;ldquo;270자리 숫자&amp;quot;가 되는 순간 전 세계의 슈퍼컴퓨터를 모두 모아도 푸는 데 수억 년이 걸리고 맙니다.&lt;/p>
&lt;p>하지만 수학자들도 가만히 있지는 않습니다. 이 철벽같은 암호를 깨기 위해 인류는 &lt;strong>&amp;ldquo;일반 수체 체(GNFS: General Number Field Sieve)&amp;rdquo;&lt;/strong> 라는 마법 같은 알고리즘(계산 절차)을 만들어 냈습니다.&lt;/p>
&lt;p>이 글에서는 전문 용어를 전혀 사용하지 않고, &lt;strong>중학교에서 배우는 수학(소인수분해, 문자식, 최대공약수)&lt;/strong> 지식만으로 이 &amp;ldquo;인류 최강의 알고리즘&amp;quot;이 암호를 깨는 원리를 단계별로 완전 해설합니다!&lt;/p>
&lt;hr>
&lt;h2 id="제1장-암호-해독의-목표는-중학교-3학년-공식">제1장: 암호 해독의 목표는 &amp;ldquo;중학교 3학년 공식&amp;rdquo;
&lt;/h2>&lt;p>거대한 소인수분해에 맞서기 위한 최대의 필살기. 그것은 중학교 3학년 때 배우는 이 공식입니다.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>$X^2 - Y^2 = (X + Y)(X - Y)$&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>&amp;ldquo;어, 이런 기초적인 공식으로 암호를 깰 수 있다고?&amp;ldquo;라고 생각할지 모릅니다. 하지만 이것이야말로 모든 것을 밝혀낼 마스터키입니다.&lt;/p>
&lt;p>암호를 깨기 위한 최대의 목표는 거대한 수 $N$에 대해,
&lt;strong>&amp;quot;$X^2$과 $Y^2$을 $N$으로 나눈 나머지가 같아지는 수($X$와 $Y$)&amp;rdquo;&lt;/strong> 를 찾는 것입니다.&lt;/p>
&lt;h3 id="왜-나머지가-같으면-암호가-풀리는-걸까">왜 &amp;ldquo;나머지가 같으면&amp;rdquo; 암호가 풀리는 걸까?
&lt;/h3>&lt;p>어떤 두 수 $X^2$과 $Y^2$의 &amp;ldquo;$N$으로 나눈 나머지가 같다&amp;quot;고 가정해 봅시다.
나머지가 같다는 것은 &lt;strong>뺄셈을 한 &amp;ldquo;$X^2 - Y^2$&amp;ldquo;는 반드시 $N$으로 딱 나누어떨어진다($N$의 배수가 된다)&lt;/strong> 는 법칙이 있습니다.&lt;/p>
&lt;p>여기서 암호에 사용되는 거대한 수 $N$은 두 개의 비밀 소수($p$와 $q$)의 곱셈으로 이루어져 있다고 합시다($N = p \times q$).&lt;/p>
&lt;p>$X^2 - Y^2$를 인수분해하면 &lt;strong>$(X - Y)(X + Y)$&lt;/strong> 가 됩니다.
이것이 $N$의 배수라는 것은 이 곱셈의 어딘가에 비밀 소수 $p$와 $q$가 숨어 있다는 의미입니다.&lt;/p>
&lt;p>여기서 기적이 일어납니다.
두 소수 $p$와 $q$가 &lt;strong>&amp;quot;$p$는 $(X - Y)$의 방으로&amp;rdquo;, &amp;ldquo;$q$는 $(X + Y)$의 방으로&amp;rdquo;&lt;/strong> 서로 다른 방으로 나뉘어 들어갈 확률이 수학적으로 ** 50%(2분의 1)** 나 되는 것입니다.&lt;/p>
&lt;p>소수 $p$만이 $(X - Y)$의 방에 들어간 상태에서 $(X - Y)$와 $N$의 &lt;strong>&amp;ldquo;최대공약수(공통되는 가장 큰 부품)&amp;rdquo;&lt;/strong> 를 계산해 봅시다.&lt;/p>
&lt;ul>
&lt;li>$(X - Y)$의 내용물 = $p \times$ 어떤 수&lt;/li>
&lt;li>$N$의 내용물 = $p \times q$
공통된 부품은 &lt;strong>&amp;quot;$p$&amp;rdquo;&lt;/strong> 밖에 없죠!&lt;/li>
&lt;/ul>
&lt;p>즉, 최대공약수를 계산하는 순간 숨어 있던 소수 $p$가 툭 떨어져 나와 암호가 완전히 해독되어 버리는 것입니다. (※최대공약수는 &amp;ldquo;유클리드 호제법&amp;quot;을 사용하면 스마트폰으로도 순식간에 계산할 수 있습니다)&lt;/p>
&lt;p>&lt;strong>【잠깐 칼럼: 왜 제곱일까? 세제곱이나 2배는 안 될까?】&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;$2X - 2Y$&amp;ldquo;라면 $2(X - Y)$가 되어 방이 하나밖에 없으므로 소수를 떼어놓을 수 없습니다. &amp;ldquo;$X^3 - Y^3$&amp;ldquo;라면 방의 크기가 불균형해져서 계산이 쓸데없이 무거워집니다. 소수를 두 개로 떼어놓기 위해서는 아름답게 두 개의 방으로 나뉘는 &amp;ldquo;제곱&amp;quot;이 가성비가 가장 좋습니다.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="제2장-x와-y를-어떻게-찾을까-소수-카드-모으기-퍼즐">제2장: X와 Y를 어떻게 찾을까? &amp;ldquo;소수 카드 모으기 퍼즐&amp;rdquo;
&lt;/h2>&lt;p>목표는 알았습니다. 하지만 &amp;ldquo;나머지가 같아지는 $X^2$과 $Y^2$&amp;ldquo;를 무턱대고 찾아봤자 우주의 수명이 다할 때까지 찾을 수 없습니다.
그래서 수학자들은 &lt;strong>&amp;ldquo;소수 카드 모으기 퍼즐&amp;rdquo;&lt;/strong> 이라는 천재적인 방법을 떠올렸습니다.&lt;/p>
&lt;h3 id="step-1-사금매끄러운-수만을-체로-걸러-모으기">Step 1: 사금(매끄러운 수)만을 체로 걸러 모으기
&lt;/h3>&lt;p>먼저 적당한 수 $Z$를 준비하고, 제곱해서 $N$으로 나눈 나머지 $W$를 계산합니다.
($Z^2 = W$인 나머지의 세계)&lt;/p>
&lt;p>나온 나머지 $W$를 소인수분해합니다. 여기서 &lt;strong>&amp;ldquo;2, 3, 5, 7 등의 작은 소수로만 이루어진 $W$&amp;rdquo;&lt;/strong> 가 나왔을 때만 그 식을 &amp;ldquo;당첨 카드&amp;quot;로 남기고, 큰 소수가 섞여 있으면 버립니다.
강에서 큰 돌을 체로 걸러 버리고 사금만을 모으는 것과 같은 작업입니다.&lt;/p>
&lt;h3 id="step-2-모두-짝수-개로-만드는-퍼즐">Step 2: 모두 &amp;ldquo;짝수 개&amp;quot;로 만드는 퍼즐
&lt;/h3>&lt;p>예를 들어, 다음과 같은 3장의 사금 카드가 모였다고 합시다.&lt;/p>
&lt;ul>
&lt;li>카드 A: $Z_1^2 = 2^3 \times 3^1$&lt;/li>
&lt;li>카드 B: $Z_2^2 = 2^1 \times 5^1$&lt;/li>
&lt;li>카드 C: $Z_3^2 = 3^1 \times 5^1$&lt;/li>
&lt;/ul>
&lt;p>이것을 모두 곱해 봅시다.
오른쪽은 $(2^3 \times 3^1) \times (2^1 \times 5^1) \times (3^1 \times 5^1)$이 되고,
한데 묶어 정리하면 &lt;strong>&amp;quot;$2^4 \times 3^2 \times 5^2$&amp;rdquo;&lt;/strong> 가 됩니다.&lt;/p>
&lt;p>놀랍게도 소수의 개수가 &amp;ldquo;4개, 2개, 2개&amp;quot;로 &lt;strong>모두 짝수 개&lt;/strong> 가 되었습니다!
모두 짝수 개라는 것은 전체를 절반의 개수로 만들면 &amp;ldquo;어떤 수의 제곱&amp;quot;이 된다는 것입니다.
즉, $(2^2 \times 3^1 \times 5^1)^2 = (60)^2$입니다.&lt;/p>
&lt;p>왼쪽은 $(Z_1 \times Z_2 \times Z_3)^2$이므로, 이것으로 마침내
&lt;strong>$X = (Z_1 \times Z_2 \times Z_3)$&lt;/strong>
&lt;strong>$Y = 60$&lt;/strong>
이라는 기다리고 기다리던 &amp;ldquo;$X^2 = Y^2$&amp;ldquo;의 쌍이 완성된 것입니다!&lt;/p>
&lt;p>컴퓨터에 있어 소수의 개수를 &amp;ldquo;짝수인가 홀수인가(0인가 1인가)&amp;ldquo;로 계산하는 퍼즐은 매우 능숙하므로, 이 방법이라면 빠르게 $X$와 $Y$를 찾을 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="제3장-앞을-가로막는-절망의-벽">제3장: 앞을 가로막는 절망의 벽
&lt;/h2>&lt;p>이제 어떤 암호라도 깰 수 있다!&amp;hellip; 라고 생각했지만, 큰 문제가 발생합니다.
암호 숫자 $N$이 &amp;ldquo;100자리&amp;rdquo; 정도까지라면 이 방법(이차 체라고 합니다)으로 풀 수 있지만, $N$이 &amp;ldquo;200자리, 300자리&amp;quot;가 되면 계산 도중에 나오는 $W$가 너무 커집니다.&lt;/p>
&lt;p>숫자가 너무 커지면 &amp;ldquo;작은 소수로만 이루어진 수(사금)&amp;ldquo;가 뚝 끊기고 맙니다. 사막에서 콘택트렌즈를 찾는 것보다 어려워져서, 퍼즐을 풀기 위한 카드가 전혀 모이지 않게 되는 것입니다.&lt;/p>
&lt;p>여기서 마침내 인류의 최종 병기 &lt;strong>&amp;ldquo;일반 수체 체(GNFS)&amp;rdquo;&lt;/strong> 가 등장합니다.&lt;/p>
&lt;hr>
&lt;h2 id="제4장-인류-최강의-아이디어-두-개의-세계-만들기">제4장: 인류 최강의 아이디어 &amp;ldquo;두 개의 세계&amp;rdquo; 만들기
&lt;/h2>&lt;p>GNFS의 천재적인 발상은 &lt;strong>&amp;ldquo;현실 세계에서만 계산하니까 숫자가 커진다. 그렇다면 다항식(문자식)을 사용한 &amp;lsquo;이면의 세계&amp;rsquo;를 만들어서 계산의 무게를 둘로 분산시키자&amp;rdquo;&lt;/strong> 라는 것입니다.&lt;/p>
&lt;h3 id="문자식의-마법">문자식의 마법
&lt;/h3>&lt;p>GNFS는 거대한 수 $N$을 베이스가 되는 수 $m$을 사용하여 문자식으로 변환합니다.
예를 들어 $N=100$이라면, $m=4$로 하여 $100 = 4^3 + 2(4^2) + 4$.
이것을 문자 $x$를 사용하여 &lt;strong>$f(x) = x^3 + 2x^2 + x$&lt;/strong> 라는 식(이면의 세계)으로 만듭니다.&lt;/p>
&lt;p>이 식의 재미있는 점은 &lt;strong>&amp;ldquo;문자 $x$에 $m$(위의 예라면 4)을 대입하면 언제든지 현실의 수 $N$으로 워프해서 돌아올 수 있다&amp;rdquo;&lt;/strong> 는 성질을 가지고 있다는 것입니다.&lt;/p>
&lt;h3 id="두-세계에서-동시에-사금-찾기">두 세계에서 동시에 사금 찾기
&lt;/h3>&lt;p>GNFS는 적당한 정수 쌍 $(a, b)$를 많이 만들고, 다음 두 가지 계산을 동시에 수행합니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>현실 세계&lt;/strong>: $a - b \times m$&lt;/li>
&lt;li>&lt;strong>문자식 세계&lt;/strong>: $a - b \times x$를 문자식의 규칙으로 계산한 값&lt;/li>
&lt;/ol>
&lt;p>문제를 두 개의 세계로 나눔으로써 다루는 숫자의 크기가 극적으로 작아집니다(가벼워집니다). 거대한 바위를 둘로 쪼개어 다루기 쉬운 돌멩이로 만든 이미지입니다.&lt;/p>
&lt;p>그리고 &lt;strong>&amp;ldquo;현실 세계에서도, 문자식 세계에서도 양쪽 모두 &amp;lsquo;작은 소수로만 이루어져 있는(사금)&amp;rsquo;&amp;rdquo;&lt;/strong> 기적의 쌍 $(a, b)$만을 체로 걸러내어 모읍니다. 이것이 &amp;ldquo;수체 체&amp;quot;라는 이름의 유래입니다.&lt;/p>
&lt;h3 id="마침내-암호가-깨지는-순간">마침내 암호가 깨지는 순간
&lt;/h3>&lt;p>양쪽 세계에서 수천만 장의 &amp;ldquo;사금 카드&amp;quot;가 모이면 슈퍼컴퓨터의 거대한 행렬 계산을 사용하여, 제2장에서 했던 &amp;ldquo;소수의 개수가 모두 짝수가 되는 조합&amp;quot;을 찾아냅니다.&lt;/p>
&lt;p>조합을 찾으면,&lt;/p>
&lt;ul>
&lt;li>현실 세계에서 만들어진 제곱 수를 &lt;strong>$X^2$&lt;/strong>&lt;/li>
&lt;li>문자식 세계에서 만들어진 제곱 식을 &lt;strong>$Y(x)^2$&lt;/strong> 로 둡니다.&lt;/li>
&lt;/ul>
&lt;p>마지막으로 문자식의 $Y(x)$의 $x$에 $m$을 대입하여 현실 세계로 워프시켜 합류시킵니다.
그러면 수학의 마법처럼 &lt;strong>&amp;quot;$X^2$과 $Y^2$의 나머지가 같아진다&amp;rdquo;&lt;/strong> 는 상태가 엄밀하게 완성되는 것입니다!&lt;/p>
&lt;p>이제 제1장에서와 같이 $X - Y$와 $N$의 최대공약수를 계산하면, 난공불락의 RSA 암호는 소리를 내며 무너져 내리고 비밀 소수가 모습을 드러냅니다.&lt;/p>
&lt;hr>
&lt;h2 id="맺음말-수학은-끝나지-않는다">맺음말: 수학은 끝나지 않는다
&lt;/h2>&lt;p>&amp;ldquo;좋아, GNFS를 사용하면 어떤 암호라도 깰 수 있겠구나!&amp;ldquo;라고 생각했을지도 모릅니다.
하지만 RSA 암호도 만만치 않습니다. 현재 인터넷에서 사용되는 것은 &amp;ldquo;RSA-2048(약 617자리)&amp;ldquo;이라는 괴물 같은 거대 수입니다.&lt;/p>
&lt;p>GNFS가 아무리 인류 최강의 알고리즘이라 하더라도, 270자리(RSA-270)를 푸는 데만도 전 세계의 컴퓨터를 연결해도 수천 년, 수만 년이 걸린다고 합니다. 지금으로서는 우리의 LINE이나 은행 데이터는 안전합니다.&lt;/p>
&lt;p>하지만 만약 &lt;strong>&amp;ldquo;어떤 거대한 수라도 순식간에 $X$와 $Y$를 찾는 마법&amp;rdquo;&lt;/strong> 이 나타난다면 어떻게 될까요?
사실 거기에 가장 가까운 존재가 현재 개발 중인 &lt;strong>&amp;ldquo;양자 컴퓨터(쇼어의 알고리즘)&amp;rdquo;&lt;/strong> 입니다. 양자 역학의 파동 성질을 사용하면 귀찮은 카드 모으기 퍼즐을 무시하고 단번에 답을 뽑아낼 수 있다고 수학적으로 증명되어 있습니다.&lt;/p>
&lt;p>암호를 만드는 사람(방어)과 암호를 깨는 알고리즘을 만드는 사람(공격)의 끝없는 지혜 겨루기.
중학교에서 배우는 &amp;ldquo;소인수분해&amp;quot;나 &amp;ldquo;문자식&amp;quot;이 사실은 세계 보안의 최전선에서 치열하게 싸우고 있는 무기라는 것을 알면 수학 수업이 조금은 더 재미있어 보이지 않나요?&lt;/p>
&lt;p>미래의 최강 알고리즘을 발견하는 것은 이 글을 읽고 있는 당신일지도 모릅니다!&lt;/p>
&lt;hr>
&lt;p>&lt;em>(※본 기사는 암호 해독의 수학적 매력을 중학생용으로 개념화한 것입니다. 실제 GNFS는 대수체의 이데알 류군이나 준동형 사상 등의 고도화된 대학 수학을 이용하여 엄밀하게 계산됩니다)&lt;/em>&lt;/p></description></item><item><title>'콜라츠 추측'</title><link>http://kenji.blog/ko/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</link><pubDate>Tue, 15 Jul 2025 18:03:03 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img.png" alt="Featured image of post '콜라츠 추측'" />&lt;h1 id="어떤-숫자든-마지막엔-1이-된다는-게-진짜야--콜라츠-추측을-즐겨보자">&amp;ldquo;어떤 숫자든 마지막엔 1이 된다&amp;quot;는 게 진짜야? ── 콜라츠 추측을 즐겨보자
&lt;/h1>&lt;p>안녕하세요! kenji입니다.&lt;/p>
&lt;p>갑작스럽지만, &amp;ldquo;어떤 숫자든 최종적으로 1이 되는 규칙&amp;quot;이라고 들으면,
조금 신기하지 않나요?&lt;/p>
&lt;blockquote>
&lt;p>예를 들어, 19나, 87이나, 1000000이라도.
적당한 규칙에 따라 숫자를 다루다 보면, 왠지 마지막은 &amp;ldquo;1&amp;quot;로 수렴합니다.&lt;/p>
&lt;/blockquote>
&lt;p>그런 꿈 같은 이야기가, &lt;strong>콜라츠 추측(Collatz Conjecture)&lt;/strong> 입니다.&lt;/p>
&lt;hr>
&lt;h2 id="애초에-콜라츠-추측이란-게-뭐야">애초에, 콜라츠 추측이란 게 뭐야?
&lt;/h2>&lt;p>먼저 규칙을 소개할게요.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>시작: 임의의 &lt;strong>양의 정수&lt;/strong> 를 선택합니다.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>조작:&lt;/p>
&lt;ul>
&lt;li>짝수라면 → 반으로 나눈다 (n → n / 2)&lt;/li>
&lt;li>홀수라면 → 3을 곱하고 1을 더한다 (n → 3n + 1)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>이것을 계～속 반복하면, &lt;strong>어떤 숫자도 최종적으로는 1에 도달한다&lt;/strong> 는 추측인 거죠.&lt;/p>
&lt;p>예를 들어, &lt;code>6&lt;/code>부터 시작하면:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>제대로 &amp;ldquo;1&amp;quot;이 되었습니다. 어서 오세요!&lt;/p>
&lt;hr>
&lt;h2 id="코드로-해보자-python으로-콜라츠">코드로 해보자: Python으로 콜라츠
&lt;/h2>&lt;p>자, 이럴 때는 코드로 시험해보는 게 빠릅니다!
Python으로 &amp;ldquo;콜라츠 수열&amp;quot;을 출력해봅시다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">steps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 예: 19부터 시작해보기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">19&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>실행하면:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>멋지게 1에 도달합니다.
꽤 우회하는데도, 마지막은 확실하게 골인!&lt;/p>
&lt;p>참고로 29부터 시작해도, 마찬가지로 1에 도달합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">pythonprint(collatz(29))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>실행하면&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>무려, 111스텝이나 걸립니다!&lt;/p>
&lt;p>게다가, 중간에 9000 이상까지 부풀어 오르는 장면도.
엄청나게 우회하고 나서 골인하는 패턴이네요.&lt;/p>
&lt;hr>
&lt;h2 id="그래서-결국-뭐가-대단한-거야">그래서, 결국 뭐가 대단한 거야?
&lt;/h2>&lt;p>이 추측의 무엇이 대단하냐면,&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>증명되지 않았는데, 어떤 수로 해도 1이 되는 것 같다&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>라는 점입니다.&lt;/p>
&lt;p>어? 그럼, 1조나, 1경(경)은&amp;hellip;?&lt;/p>
&lt;p>라고 생각하신 분, 예리합니다.
실제로 컴퓨터를 사용해서 &amp;ldquo;2의 68승&amp;rdquo; 정도까지는 확인되었고,
&lt;strong>모두 1에 도달&lt;/strong> 하고 있습니다. 믿을 수 없어&amp;hellip;&lt;/p>
&lt;p>하지만, &lt;strong>&amp;ldquo;전부 그렇게 된다&amp;quot;고 이론적으로 증명된 것은 아닙니다&lt;/strong>.
이것이 수학 세계에서 말하는 &amp;ldquo;미해결 문제&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="콜라츠-씨가-누구야">콜라츠 씨가 누구야?
&lt;/h2>&lt;p>자, 여기까지 읽고 &amp;ldquo;애초에 콜라츠가 누구야?&amp;ldquo;라고 생각하시죠.
제대로 소개할게요!&lt;/p>
&lt;ul>
&lt;li>이름: &lt;strong>로타르 콜라츠 (Lothar Collatz)&lt;/strong>&lt;/li>
&lt;li>국적: 독일&lt;/li>
&lt;li>생년: 1910년 ～ 1990년&lt;/li>
&lt;li>직함: 수학자 (함수 해석이나 정수론 분야에서 활약)&lt;/li>
&lt;/ul>
&lt;p>1937년에 이 추측을 제안했고,
그 후, 80년 이상에 걸쳐 &lt;strong>아무도 증명도 반증도 하지 못하고 있습니다&lt;/strong>.&lt;/p>
&lt;p>참고로, 이 문제는 너무 심플한데 심오해서,
그 폴 에어디시(초유명 수학자)조차 이렇게 말했다고 하죠.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;수학은 아직 콜라츠를 다루기에 미숙하다&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>즉, 인류의 수학이 이 수수께끼를 아직 따라잡지 못했다는 설&amp;hellip;&lt;/p>
&lt;hr>
&lt;h2 id="어려운-수식은-필요-없다">&amp;ldquo;어려운 수식&amp;quot;은 필요 없다
&lt;/h2>&lt;p>콜라츠 추측의 좋은 점은, &lt;strong>누구나 즐길 수 있다&lt;/strong> 는 것입니다.&lt;/p>
&lt;p>종이와 펜이 있으면 할 수 있습니다.
Python으로 코드를 작성하면, 자동으로 시험할 수 있습니다.
그러면서도, &lt;strong>최첨단의 수학자들이 진심으로 도전하고 있다&lt;/strong>.&lt;/p>
&lt;p>왠지, 두근두근하지 않나요?&lt;/p>
&lt;hr>
&lt;h2 id="덤-한-번에-시험하는-코드">덤: 한 번에 시험하는 코드
&lt;/h2>&lt;p>여러 숫자를 모아서 시험하는 코드도 실어둘게요.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">(스텝 수: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이것은 &amp;ldquo;1～20&amp;quot;의 콜라츠 수열을 한 번에 출력해 줍니다.&lt;/p>
&lt;hr>
&lt;h2 id="결론-이-세계-역시-신기하다">결론: 이 세계, 역시 신기하다
&lt;/h2>&lt;p>이런 이유로, 콜라츠 추측.&lt;/p>
&lt;ul>
&lt;li>엄청 심플한데&lt;/li>
&lt;li>아무도 증명하지 못해서&lt;/li>
&lt;li>수학계에서는 큰 문제&lt;/li>
&lt;/ul>
&lt;p>라는, 불가사의 덩어리 같은 존재였습니다.&lt;/p>
&lt;p>프로그래밍 초보자라도 시도해볼 수 있으니, 꼭 즐겨보세요～!&lt;/p>
&lt;hr>
&lt;h2 id="추천-링크-관심-있는-분용">추천 링크 (관심 있는 분용)
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ko.wikipedia.org/wiki/%ec%bd%9c%eb%9d%bc%ec%b8%a0_%ec%b6%94%ec%b8%a1" target="_blank" rel="noopener"
>Wikipedia: 콜라츠 추측&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://arxiv.org/abs/1909.03562" target="_blank" rel="noopener"
>Terence Tao 논문 (영문)&lt;/a>&lt;/li>
&lt;li>Python의 시각화 버전을 만들어 보는 것도 재밌어요! (요청이 있으면 만들겠습니다)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>더 이런 &amp;ldquo;신기한 수학 × 프로그래밍&amp;rdquo; 소재를 알고 싶은 분은,
편하게 &amp;ldquo;더 알려줘&amp;quot;라고 요청해 보세요.
조만간, 리만 가설이나 소수 이야기 등, 여러 가지 소개할게요!&lt;/p>
&lt;hr>
&lt;p>📮끝!&lt;/p>
&lt;hr></description></item><item><title>'케르크호프스의 원리'</title><link>http://kenji.blog/ko/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/</link><pubDate>Wed, 16 Apr 2025 23:53:08 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2.png" alt="Featured image of post '케르크호프스의 원리'" />&lt;h1 id="케르크호프스의-원리">케르크호프스의 원리
&lt;/h1>&lt;hr>
&lt;p>안녕하세요!&lt;/p>
&lt;p>오늘은 좀 재밌으면서도 사실 엄청나게 중요한 &amp;lsquo;케르크호프스의 원리&amp;rsquo;라는 이야기를 해보려고 합니다.&lt;/p>
&lt;p>아, 잠깐만요.&lt;br>
&amp;lsquo;케르크호프스의 원리&amp;rsquo;라니 들어본 적도 없고, 왠지 어렵게 느껴진다고 생각하신 분도 계실지 모르겠습니다. 안심하세요. 이 글은 바로 그런 분들이 읽어주셨으면 하는 내용이거든요.&lt;/p>
&lt;hr>
&lt;h2 id="안전한-암호란-무슨-뜻일까요">&amp;lsquo;안전한 암호&amp;rsquo;란 무슨 뜻일까요?
&lt;/h2>&lt;p>예를 들어 누군가가 &amp;ldquo;이 금고, 비밀 여는 법을 아는 사람만 열 수 있습니다&amp;quot;라고 말했다고 해보죠.&lt;/p>
&lt;p>그거 얼핏 보면 엄청 안심되는 것 같죠.&lt;br>
하지만 가만히 생각해보면 조금 불안하지 않나요?&lt;/p>
&lt;p>&amp;ldquo;그 비밀, 들키면 끝나는 거 아냐?&amp;rdquo; 같은 생각이 들잖아요.&lt;/p>
&lt;p>사실 이것이 케르크호프스의 원리가 등장하게 된 계기입니다.&lt;/p>
&lt;hr>
&lt;h2 id="애초에-케르크호프스의-원리가-뭔가요">애초에 &amp;lsquo;케르크호프스의 원리&amp;rsquo;가 뭔가요?
&lt;/h2>&lt;p>이거, 엄청 간단하게 말하자면,&lt;/p>
&lt;p>&lt;strong>&amp;ldquo;암호는 그 구조가 들통나도 안전해야 한다&amp;rdquo;&lt;/strong> 는 생각입니다.&lt;/p>
&lt;p>더 나아가 &amp;ldquo;안전성은 오직 &amp;lsquo;비밀 키&amp;rsquo;에만 의존해야 하며, 암호화 방식 자체는 공개되어 있어도 OK!&amp;ldquo;라는 뜻이죠.&lt;/p>
&lt;p>반대로 말하면, &amp;ldquo;암호 알고리즘(구조)을 비밀로 하고 있을 뿐인 상태는 신뢰성이 낮다&amp;quot;고 간주되는 겁니다.&lt;/p>
&lt;hr>
&lt;h2 id="구조가-비밀이니까-안심이라는-생각은-좀-위험할-수-있습니다">&amp;ldquo;구조가 비밀이니까 안심&amp;quot;이라는 생각은 좀 위험할 수 있습니다
&lt;/h2>&lt;p>흔히 이런 생각을 하죠.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;이 앱의 내부는 아무에게도 보여주지 않았으니까 보안은 괜찮아&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>그 마음 이해합니다.&lt;br>
하지만 그건 &amp;ldquo;아무도 보지 않으니까 나쁜 점도 발견되지 않을 테고, 괜찮겠지&amp;quot;라고 말하는 것과 같습니다.&lt;/p>
&lt;p>실제로는 그 &amp;ldquo;아무도 보지 않는다&amp;quot;는 것 자체가 리스크가 될 수도 있거든요.&lt;/p>
&lt;hr>
&lt;h2 id="그런데-왜-그런-원리가-중요한-걸까요">그런데 왜 그런 원리가 중요한 걸까요?
&lt;/h2>&lt;p>왜냐하면, 만약 누군가가 구조를 알아내서 간단히 해독해버린다면 그 암호는 끝이기 때문입니다.&lt;/p>
&lt;p>비유하자면, 문 열쇠가 엄청 복잡한 구조로 되어 있는데 사실 100엔샵에서 만든 열쇠로도 열려버리는 것과 같습니다.&lt;/p>
&lt;p>&amp;ldquo;열쇠가 비밀이라서 괜찮아&amp;quot;가 아니라, &amp;ldquo;구조를 전부 보여줘도, 제대로 된 열쇠가 없으면 열 수 없다&amp;quot;가 중요한 거겠죠.&lt;/p>
&lt;hr>
&lt;h2 id="그래도-왠지-무섭지-않아라는-마음">&amp;ldquo;그래도 왠지 무섭지 않아?&amp;ldquo;라는 마음
&lt;/h2>&lt;p>여기서 많은 사람들이 느끼는 것이,&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;구조를 전부 드러낸다니, 왠지 무섭지 않아?&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>라는 불안입니다.&lt;/p>
&lt;p>이해합니다.&lt;br>
왜냐하면 &amp;ldquo;내부를 전부 보여주면 따라 하거나 악용되지 않을까?&amp;ldquo;라고 생각하게 되니까요.&lt;/p>
&lt;p>하지만 그 점이 바로 케르크호프스 원리의 핵심입니다.&lt;br>
&amp;ldquo;내부를 보여줘도 무너지지 않는 견고함&amp;quot;이야말로 진짜 보안이라는 것이죠.&lt;/p>
&lt;hr>
&lt;h2 id="그렇긴-해도-처음엔-약간의-용기가-필요합니다">그렇긴 해도 처음엔 약간의 용기가 필요합니다
&lt;/h2>&lt;p>개발자의 입장이 되어보면 &amp;ldquo;구조를 공개한다 = 약점도 보여준다&amp;quot;는 것 같아서 당연히 조마조마합니다.&lt;/p>
&lt;p>하지만 생각해보세요.&lt;/p>
&lt;p>구조를 제대로 보여준 뒤 &amp;ldquo;누구든 검증해도 좋아&amp;quot;라고 말할 수 있는 쪽이 결과적으로 더 신뢰받습니다.&lt;/p>
&lt;p>그건 인간관계와도 비슷하죠.&lt;/p>
&lt;p>&amp;ldquo;진짜 내 모습을 보여준 뒤에도 친하게 지내주는 사람&amp;quot;이 역시 가장 안심되잖아요.&lt;/p>
&lt;hr>
&lt;h2 id="그래서-결론은">그래서 결론은
&lt;/h2>&lt;p>케르크호프스의 원리라는 게 좀 이론적으로 들릴지도 모르겠지만, 본질은 아주 심플합니다.&lt;/p>
&lt;p>&lt;strong>&amp;ldquo;누구에게 보여줘도 망가지지 않는 구조를 만들자&amp;rdquo;&lt;/strong> 는 이야기일 뿐이죠.&lt;/p>
&lt;p>표면적인 비밀보다 제대로 된 설계.&lt;br>
누구에게도 보여주고 싶지 않은 코드보다, 보여줘도 부끄럽지 않은 코드.&lt;/p>
&lt;p>그런 &amp;lsquo;견고함&amp;rsquo;이 앞으로의 시대에는 더욱 요구될지도 모르겠습니다.&lt;/p>
&lt;hr>
&lt;p>읽어주셔서 감사합니다!&lt;/p>
&lt;p>보안 이야기는 좀 어렵지만, 그래도 &amp;lsquo;사람과의 관계&amp;rsquo;나 &amp;lsquo;일상의 안심감&amp;rsquo;과도 이어지는 부분이 있죠.&lt;br>
부담 갖지 말고, 조금씩 알아가다 보면 분명 좋은 일이 있을 거라 생각합니다.&lt;/p>
&lt;hr>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img.png"
width="189"
height="282"
srcset="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="Auguste Kerckhoffs"
class="gallery-image"
data-flex-grow="67"
data-flex-basis="160px"
>&lt;/p></description></item><item><title>'P≠NP 예상'</title><link>http://kenji.blog/ko/p/pnp%E4%BA%88%E6%83%B3/</link><pubDate>Wed, 11 Sep 2024 02:22:39 +0900</pubDate><guid>http://kenji.blog/ko/p/pnp%E4%BA%88%E6%83%B3/</guid><description>&lt;h1 id="개요">개요
&lt;/h1>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">클래스 P란, 결정론적 튜링 기계에서 다항 시간에 판정 가능한 문제의 클래스이며, 클래스 NP는 Yes가 되는 증거(Witness라고 함)가 주어졌을 때 다항 시간에 Witness의 정당성 판정(이를 검증이라고 함)이 가능한 문제의 클래스이다. 다항 시간에 판정 가능한 문제는 다항 시간에 검증 가능하므로 P⊆NP인 것은 분명하지만, P가 NP의 진부분집합인지 여부에 대해서는 명확하지 않다. 아직 증명되지는 않았지만, 많은 연구자는 P≠NP라고 믿고 있다. 그리고 이 클래스 P와 클래스 NP가 같지 않다는 예상을 &amp;#39;P≠NP 예상&amp;#39;이라고 한다.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>참고 사이트 : &lt;a class="link" href="https://daigakudenki.com/np-hard/" target="_blank" rel="noopener"
>https://daigakudenki.com/np-hard/&lt;/a>&lt;/p></description></item><item><title>'아인슈타인의 명언'</title><link>http://kenji.blog/ko/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/</link><pubDate>Sat, 24 Aug 2024 18:38:47 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/Solvay_conference_1927.jpg" alt="Featured image of post '아인슈타인의 명언'" />&lt;p>안녕하세요!&lt;/p>
&lt;p>오늘은 아인슈타인의 명언에 대해 이야기하고자 합니다.&lt;/p>
&lt;hr>
&lt;h2 id="세상은-당신의-선행을-평가하지-않는다">세상은 당신의 선행을 평가하지 않는다?
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">세상은 당신이 행하는 백만 번의 선행을 결코 평가하지 않을 것입니다.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">하지만 당신이 하는 한 가지 잘못된 행동은 비판할 것입니다...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">하지만 낙담하지 마십시오.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 알베르트 아인슈타인
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이것은 아인슈타인이 남겼다고 알려진 말입니다. 우리가 매일 느끼는 사회의 가혹함이나 사람들의 평가가 가진 편향성을 날카롭게 지적하고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="그럼에도-계속해서-일어선다">그럼에도, 계속해서 일어선다
&lt;/h2>&lt;p>&amp;ldquo;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.&amp;rdquo;&lt;/p>
&lt;p>이 이어지는 말은, 앞서 언급한 냉혹한 현실에 대한 아인슈타인의 대답이라고도 할 수 있습니다. 비판이나 조롱에 굴하지 않고, 자기 자신을 믿고 계속 전진하는 것의 소중함을 가르쳐 줍니다.&lt;/p>
&lt;hr>
&lt;h2 id="일상에-활용하는-아인슈타인의-가르침">일상에 활용하는 아인슈타인의 가르침
&lt;/h2>&lt;p>이 명언은 우리의 일상 생활과도 깊이 관련되어 있습니다. 예를 들어, 직장에서의 노력이 인정받지 못하고 사소한 실수만 눈에 띄는 경우가 있습니다. 또한 SNS에서의 발언이 일부만 잘려서 비판받는 일도 있을 것입니다.&lt;/p>
&lt;p>그럴 때, 아인슈타인의 이 말을 떠올려 보십시오. 타인의 평가에 일희일비하기보다는 자신의 신념을 유지하는 것이 중요합니다.&lt;/p>
&lt;hr>
&lt;h2 id="요약">요약
&lt;/h2>&lt;p>아인슈타인의 이 명언은 우리에게 &amp;ldquo;타인의 평가에 좌우되지 않고 자신을 믿고 살아가는&amp;rdquo; 것의 중요성을 가르쳐 줍니다. 비판이나 조롱에 지지 않고 자신이 믿는 길을 나아갈 용기를 가집시다.&lt;/p>
&lt;p>마지막으로, 아인슈타인의 말을 다시 한 번.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>이 말이 여러분의 마음에 닿아 긍정적인 한 걸음을 내딛는 계기가 되기를 바랍니다.&lt;/p></description></item><item><title>'Mathematica 입문'</title><link>http://kenji.blog/ko/p/mathematica%E5%85%A5%E9%96%80/</link><pubDate>Thu, 25 Jul 2024 01:36:19 +0900</pubDate><guid>http://kenji.blog/ko/p/mathematica%E5%85%A5%E9%96%80/</guid><description>&lt;img src="http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img.png" alt="Featured image of post 'Mathematica 입문'" />&lt;h1 id="mathematica-입문">Mathematica 입문
&lt;/h1>&lt;h2 id="방정식-풀기">방정식 풀기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="정수-범위에서-방정식의-해-구하기">정수 범위에서 방정식의 해 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0 &amp;amp;&amp;amp; 0 &amp;lt;= x &amp;lt;= 2, x, Integers]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="연립방정식-풀기">연립방정식 풀기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[{x + y == 3, x - y == 1}, {x, y}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 2, y -&amp;gt; 1}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="부등식-풀기">부등식 풀기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Reduce[x^2 - 3 x + 2 &amp;gt; 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x &amp;lt; 1 || x &amp;gt; 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="미분하기">미분하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">2 x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="적분하기">적분하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Integrate[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x^3/3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="극한-구하기">극한 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Limit[1/x, x -&amp;gt; 0]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Infinity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="급수-구하기">급수 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Sum[1/n^2, {n, 1, Infinity}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">π^2/6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="행렬-만들기">행렬 만들기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m = {{1, 2}, {3, 4}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="행렬의-곱-구하기">행렬의 곱 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m . m
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{7, 10}, {15, 22}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="역행렬-구하기">역행렬 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Inverse[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{-2, 1}, {1.5, -0.5}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="고유값과-고유벡터-구하기">고유값과 고유벡터 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Eigensystem[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{5, 0}, {{1, 1}, {1, -1}}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-내적-구하기">벡터의 내적 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">11
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-외적-구하기">벡터의 외적 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Cross[{1, 2, 3}, {4, 5, 6}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{-3, 6, -3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-크기-구하기">벡터의 크기 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Norm[{1, 2, 3}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">√14
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-각도-구하기">벡터의 각도 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[11/(√5 √25)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-사영-구하기">벡터의 사영 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{11/5, 22/5}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-회전-구하기">벡터의 회전 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RotationMatrix[π/2].{1, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 1}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-평행이동-구하기">벡터의 평행이동 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">TranslationTransform[{1, 2}][{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{4, 6}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-확대-축소-구하기">벡터의 확대 축소 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ScalingTransform[{2, 3}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="벡터의-반전-구하기">벡터의 반전 구하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ReflectionTransform[{1, 1}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기">난수 생성하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-정수">난수 생성하기 (정수)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-범위-지정">난수 생성하기 (범위 지정)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5.6789
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-정수-범위-지정">난수 생성하기 (정수, 범위 지정)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-분포-지정">난수 생성하기 (분포 지정)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1]]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-분포-지정-개수-지정">난수 생성하기 (분포 지정, 개수 지정)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="난수-생성하기-분포-지정-개수-지정-시드-지정">난수 생성하기 (분포 지정, 개수 지정, 시드 지정)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">SeedRandom[12345]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="배열의-요소에-함수-적용하기">배열의 요소에 함수 적용하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Map[Sqrt, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sqrt /@ {1, 4, 9}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Map[#^(1/2)&amp;amp;, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="람다식을-사용하여-함수-정의하기">람다식을 사용하여 함수 정의하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">f[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="함수-합성하기">함수 합성하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">g = Function[x, x + 1]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h = Function[x, f[g[x]]]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">16
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="직전-계산-결과-참조하기">직전 계산 결과 참조하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">% + 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">17
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="순수-함수">순수 함수
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">(#+3)&amp;amp;[5]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="배열-추출하기">배열 추출하기
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, EvenQ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, Mod[#,2]==0&amp;amp;]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>'생일 역설이란?'</title><link>http://kenji.blog/ko/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</link><pubDate>Tue, 02 Apr 2024 01:20:50 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img.png" alt="Featured image of post '생일 역설이란?'" />&lt;h2 id="생일-역설을-아시나요">생일 역설을 아시나요?
&lt;/h2>&lt;p>조금 신기한 이야기를 해볼까 합니다.
&amp;lsquo;같은 생일인 사람이 있을 확률&amp;rsquo;은 몇 명 정도 모여야 높아질 것이라 생각하시나요?&lt;/p>
&lt;p>예를 들어 1년은 365일이므로, &amp;lsquo;23명이 모여서 누군가와 생일이 겹칠 확률은 50% 이상&amp;rsquo;이라고 한다면… 왠지 직관에 어긋나는 느낌이 드실 겁니다.&lt;/p>
&lt;p>하지만 이것은 &lt;strong>정말 50% 이상입니다.&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="왜-그런-일이-발생할까요">왜 그런 일이 발생할까요?
&lt;/h2>&lt;p>이 현상은 &amp;lsquo;생일 역설&amp;rsquo;이라고 불립니다.
이름은 &amp;lsquo;역설(패러독스)&amp;lsquo;이지만, 제대로 된 수학적인 이유가 있습니다.&lt;/p>
&lt;p>인원수를 &amp;rsquo;n&amp;rsquo;이라고 했을 때, &lt;strong>아무도 생일이 겹치지 않을 확률&lt;/strong> 은 다음 수식으로 구할 수 있습니다:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">P(아무도 겹치지 않음) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이 값을 1에서 빼면 &amp;lsquo;누군가와 겹칠 확률&amp;rsquo;이 나옵니다.&lt;/p>
&lt;hr>
&lt;h2 id="결과를-살펴보면">결과를 살펴보면…
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>인원수&lt;/th>
&lt;th>같은 생일인 사람이 있을 확률&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>10명&lt;/td>
&lt;td>약 11.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>20명&lt;/td>
&lt;td>약 41.1%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>23명&lt;/td>
&lt;td>&lt;strong>약 50.7% (여기가 주목!)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>30명&lt;/td>
&lt;td>약 70.6%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70명&lt;/td>
&lt;td>&lt;strong>무려 약 99.9%!&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>즉, 단 &lt;strong>23명&lt;/strong> 만 있으면 절반 이상의 확률로 누군가와 생일이 겹치게 됩니다.
학교 학급이나 직장 회의에서도 꽤 자주 들어맞을 것 같죠.&lt;/p>
&lt;hr>
&lt;h2 id="요약-직관과-수학의-차이가-재미있다">요약: 직관과 수학의 차이가 재미있다
&lt;/h2>&lt;p>&amp;lsquo;생일 역설&amp;rsquo;은 우리의 직관과 실제 수학적인 확률이 어긋나는 재미있는 예입니다.
이런 이야기를 알아두면 가벼운 잡담이나 퀴즈로 분위기를 띄울 수 있을지도 모릅니다!&lt;/p>
&lt;hr>
&lt;h2 id="참고-링크">참고 링크
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9" target="_blank" rel="noopener"
>생일 역설 (Wikipedia)&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>'몬티 홀 문제'</title><link>http://kenji.blog/ko/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/</link><pubDate>Sun, 31 Mar 2024 23:41:51 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/img_1.png" alt="Featured image of post '몬티 홀 문제'" />&lt;h2 id="몬티-홀-문제란">몬티 홀 문제란
&lt;/h2>&lt;p>몬티 홀 문제란, 미국의 텔레비전 프로그램 「Let&amp;rsquo;s Make a Deal」에서 진행되었던 게임 중 하나로, 다음과 같은 문제입니다.&lt;/p>
&lt;p>전제 조건：3개의 문 중 1개에는 상품이 들어 있고, 나머지 2개에는 꽝이 들어 있다.&lt;/p>
&lt;ol>
&lt;li>참가자는 3개의 문 중 1개를 선택합니다.&lt;/li>
&lt;li>사회자는 참가자가 선택한 문 이외의 2개의 문 중, 꽝인 1개의 문을 엽니다.&lt;/li>
&lt;li>참가자에게 선택한 문을 변경할지 여부를 묻습니다.&lt;/li>
&lt;/ol>
&lt;p>이때, 참가자는 문을 변경하는 것이 좋은지, 변경하지 않는 것이 좋은지를 생각하는 문제입니다.&lt;/p>
&lt;h2 id="해법">해법
&lt;/h2>&lt;p>몬티 홀 문제의 해법은 다음과 같습니다.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>참가자가 처음에 선택한 문을 변경하지 않을 경우&lt;/p>
&lt;ul>
&lt;li>당첨 확률：1/3&lt;/li>
&lt;li>꽝일 확률：2/3&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>사회자가 꽝인 문을 연 후&lt;/p>
&lt;ul>
&lt;li>변경하지 않을 경우, 당첨 확률：1/3 (1.의 당첨 확률에서 변하지 않음)&lt;/li>
&lt;li>변경할 경우, 당첨 확률：2/3 (1.의 당첨 이외의 확률)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>따라서, 참가자가 문을 변경하는 편이 당첨 확률이 높아집니다.&lt;/p>
&lt;h2 id="참고">참고
&lt;/h2>&lt;ul>
&lt;li>Wikipedia &lt;a class="link" href="https://en.wikipedia.org/wiki/Monty_Hall_problem" target="_blank" rel="noopener"
>Monty Hall problem&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>수학의 미해결 문제</title><link>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/</link><pubDate>Sat, 02 Mar 2024 22:57:36 +0900</pubDate><guid>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img.png" alt="Featured image of post 수학의 미해결 문제" />&lt;h1 id="수학의-미해결-문제">수학의 미해결 문제
&lt;/h1>&lt;p>수학의 미해결 문제에 대해 설명합니다. 문제 자체는 단순해도, 증명되지 않은 문제가 아직 많이 있습니다.&lt;/p>
&lt;h2 id="완전수는-무수히-많은가">완전수는 무수히 많은가?
&lt;/h2>&lt;p>완전수란, 자기 자신을 제외한 양의 약수의 합이 자기 자신과 같은 자연수입니다.
예를 들어,&lt;/p>
&lt;ul>
&lt;li>6은 약수가 1, 2, 3이 되며, 1+2+3=6이므로 완전수입니다.&lt;/li>
&lt;li>28은 약수가 1, 2, 4, 7, 14가 되며, 1+2+4+7+14=28이므로 완전수입니다.&lt;/li>
&lt;/ul>
&lt;p>현재 51개밖에 발견되지 않았지만, 무수히 많을 것으로 예상되고 있습니다만,
아직 증명되지 않았습니다.&lt;/p>
&lt;h2 id="골드바흐의-추측">골드바흐의 추측
&lt;/h2>&lt;p>골드바흐의 추측은, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 추측입니다.
(여기서 소수란, 1과 자기 자신 이외의 약수를 가지지 않는 자연수입니다.)&lt;/p>
&lt;p>예를 들어,&lt;/p>
&lt;ul>
&lt;li>4=2+2&lt;/li>
&lt;li>6=3+3&lt;/li>
&lt;li>8=3+5&lt;/li>
&lt;li>10=3+7=5+5&lt;/li>
&lt;/ul>
&lt;p>문제 자체는 매우 단순하지만, 아직까지 증명되지 않았습니다.&lt;/p>
&lt;h2 id="리만-가설">리만 가설
&lt;/h2>&lt;p>리만 제타 함수의 영점이, 음의 짝수와, 실수부가 1 / 2 인 복소수에 한정된다는 추측이다.&lt;/p>
&lt;p>리만 제타 함수는, $s$를 복소수, $n$을 자연수라고 할 때,&lt;/p>
$$\zeta(s):=\sum _{n=1}^{\infty }{\frac {1}{n^{s}}}=1+{\frac {1}{2^{s}}}+{\frac {1}{3^{s}}}+{\frac {1}{4^{s}}}+\cdots$$
&lt;p>로 정의되는 함수 $\zeta$를 말한다.&lt;/p></description></item><item><title>'수학의 역사'</title><link>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/</link><pubDate>Sat, 22 Jul 2023 15:25:10 +0900</pubDate><guid>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/img.png" alt="Featured image of post '수학의 역사'" />&lt;h3 id="고대-그리스의-3대-작도-문제">고대 그리스의 3대 작도 문제
&lt;/h3>&lt;ol>
&lt;li>원이 주어졌을 때, 그 원과 같은 넓이를 가지는 정사각형을 만들기 (원의 정방형화 문제)&lt;/li>
&lt;li>임의의 각이 지정되었을 때, 그것을 3등분하기 (각의 3등분 문제)&lt;/li>
&lt;li>정육면체가 주어졌을 때, 그 두 배의 부피를 가지는 정육면체를 만들기 (정육면체의 배적 문제)&lt;/li>
&lt;/ol>
&lt;h3 id="아르키메데스의-나선">아르키메데스의 나선
&lt;/h3>&lt;p>평면 상에서 반직선 OB를 정점 O를 중심으로 일정한 속도로 회전시킵니다. 처음 위치를 OA라고 할 때,
OA에서 움직이기 시작함과 동시에 점 P가 O에서 출발하여, OB를 따라 일정한 속도로 움직일 때 점 P가 그리는
선이 아르키메데스의 나선입니다.&lt;/p>
&lt;h3 id="파푸스의-정리">파푸스의 정리
&lt;/h3>&lt;ul>
&lt;li>사이클로이드&lt;/li>
&lt;li>니코메데스의 콘코이드&lt;/li>
&lt;li>디오클레스의 시소이드&lt;/li>
&lt;li>페르마의 접선법&lt;/li>
&lt;li>데카르트의 법선법&lt;/li>
&lt;/ul>
&lt;h3 id="연표">연표
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>연도&lt;/th>
&lt;th>사건&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>기원전 3400년경&lt;/td>
&lt;td>수메르인이 점토로 만든 대용 화폐로 계산을 수행&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>기원전 3000년경&lt;/td>
&lt;td>이집트에서 상형문자의 수학이 등장&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>기원전 2800년경&lt;/td>
&lt;td>인더스 문명에서 10진법에 따른 도량형이 사용됨&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>기원전 2700년경&lt;/td>
&lt;td>이집트인이 밧줄과 피타고라스 수를 사용하여 각도를 확인&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>기원전 2500년경&lt;/td>
&lt;td>계산에 사용하는 도구, 주판이 발견됨&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>기원전 2500년경&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="참고">참고
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2" target="_blank" rel="noopener"
>수학의 역사&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Python(matplotlib.pyplot)을 사용하여 그래프를 그리는 방법</title><link>http://kenji.blog/ko/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 09 Apr 2023 01:02:19 +0900</pubDate><guid>http://kenji.blog/ko/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post Python(matplotlib.pyplot)을 사용하여 그래프를 그리는 방법" />&lt;p>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1.png"
width="1200"
height="288"
srcset="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hue3f23818eeeec9c43d6452cc0f61fb52_43864_480x0_resize_box_3.png 480w, http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hue3f23818eeeec9c43d6452cc0f61fb52_43864_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="416"
data-flex-basis="1000px"
>&lt;/p>
&lt;h1 id="필요한-것">필요한 것
&lt;/h1>&lt;ul>
&lt;li>Google 계정&lt;/li>
&lt;/ul>
&lt;h1 id="순서">순서
&lt;/h1>&lt;ol>
&lt;li>&lt;a class="link" href="https://colab.research.google.com/" target="_blank" rel="noopener"
>https://colab.research.google.com/&lt;/a> 에 접속&lt;/li>
&lt;li>&amp;lsquo;파일&amp;rsquo; → &amp;lsquo;새 노트&amp;rsquo; 선택&lt;/li>
&lt;li>아래의 코드를 붙여넣고 실행&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">matplotlib.pyplot&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">500&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;sin curve&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cos&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cos curve&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">legend&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># 범례 표시&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">show&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="실행-결과">실행 결과
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png"
width="568"
height="413"
srcset="http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_480x0_resize_box_3.png 480w, http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="137"
data-flex-basis="330px"
>&lt;/p>
&lt;h1 id="참고">참고
&lt;/h1>&lt;ul>
&lt;li>&lt;a class="link" href="https://matplotlib.org/3.5.3/api/_as_gen/matplotlib.pyplot.html" target="_blank" rel="noopener"
>matplotlib.pyplot — Matplotlib 3.5.3 documentation&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>'hugo에서 KaTeX(LaTeX 스타일 수식 표시) 활성화하는 방법'</title><link>http://kenji.blog/ko/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 31 Mar 2023 23:11:26 +0900</pubDate><guid>http://kenji.blog/ko/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="http://kenji.blog/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post 'hugo에서 KaTeX(LaTeX 스타일 수식 표시) 활성화하는 방법'" />&lt;h1 id="katex란">KaTeX란?
&lt;/h1>&lt;p>KaTeX는 LaTeX 스타일의 수식을 HTML로 표시하기 위한 javascript 라이브러리입니다.&lt;/p>
&lt;p>구체적으로는 아래와 같은 수식을 표시할 수 있습니다.&lt;/p>
$$f(x) = x^2 + x + 41$$
&lt;p>그 외에도 LaTeX 스타일의 수식 표시 라이브러리도 있는 것 같습니다만, KaTeX는 심플하고 빠르다는 정평이 나 있습니다.&lt;/p>
&lt;h1 id="hugo에-도입하는-방법">hugo에 도입하는 방법
&lt;/h1>&lt;ol>
&lt;li>hugo의 폴더 계층에서 &lt;code>layouts/partials/math.html&lt;/code>을 새로 작성합니다.&lt;/li>
&lt;/ol>
&lt;p>내용은 아래와 같이 작성해 주세요.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css&amp;#34; integrity=&amp;#34;sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js&amp;#34; integrity=&amp;#34;sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js&amp;#34; integrity=&amp;#34;sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;script&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document.addEventListener(&amp;#34;DOMContentLoaded&amp;#34;, function() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> renderMathInElement(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> document.body,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> delimiters: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;$$&amp;#34;, right: &amp;#34;$$&amp;#34;, display: true},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;\\[&amp;#34;, right: &amp;#34;\\]&amp;#34;, display: true},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;$&amp;#34;, right: &amp;#34;$&amp;#34;, display: false},
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {left: &amp;#34;\\(&amp;#34;, right: &amp;#34;\\)&amp;#34;, display: false}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> });
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> });
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;/script&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ol start="2">
&lt;li>다음으로 기존 파일 &lt;code>layouts/partials/extend_head.html&lt;/code>에 아래의 코드를 추가합니다.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{ if or .Params.math .Site.Params.math }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ partial &amp;#34;math.html&amp;#34; . }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ol start="3">
&lt;li>이것으로 KaTeX를 사용할 준비가 완료되었습니다.&lt;/li>
&lt;/ol>
&lt;p>페이지의 front matter에 &lt;code>math: true&lt;/code>를 추가함으로써, KaTeX를 활성화할 수 있습니다.&lt;/p>
&lt;ol start="4">
&lt;li>이제 페이지 본문에 수식을 LaTeX 스타일로 작성하기만 하면 됩니다.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">$$ e^{i \pi} = -1 $$
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>위와 같이 작성하면, 아래와 같이 표시됩니다.&lt;/p>
$$ e^{i \pi} = -1 $$
&lt;h1 id="참고">참고
&lt;/h1>&lt;ul>
&lt;li>&lt;a class="link" href="https://reorx.github.io/hugo-PaperModX/docs/math-typesetting/" target="_blank" rel="noopener"
>Math Typesetting | PaperModX&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://katex.org/docs/autorender.html" target="_blank" rel="noopener"
>KaTex Auto-render Extension&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://www.storange.jp/2017/02/katex.html" target="_blank" rel="noopener"
>KaTeX 도입 | The Strange Storage&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Mathematica로 순회 외판원 문제 풀기</title><link>http://kenji.blog/ko/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/</link><pubDate>Wed, 12 Oct 2022 19:05:58 +0900</pubDate><guid>http://kenji.blog/ko/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/</guid><description>&lt;img src="http://kenji.blog/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/img.png" alt="Featured image of post Mathematica로 순회 외판원 문제 풀기" />&lt;h1 id="mathematica로-순회-외판원-문제-풀기">Mathematica로 순회 외판원 문제 풀기
&lt;/h1>&lt;h2 id="문제">문제
&lt;/h2>&lt;blockquote class="twitter-tweet">&lt;p lang="ja" dir="ltr">電車でこんな広告を見かけました😁📸 &lt;a href="https://t.co/iXEgvtXrpL">pic.twitter.com/iXEgvtXrpL&lt;/a>&lt;/p>&amp;mdash; 早稲田大学 早水桃子研究室 (@hayamizu_lab) &lt;a href="https://x.com/hayamizu_lab/status/1579806418982825984?ref_src=twsrc%5Etfw">October 11, 2022&lt;/a>&lt;/blockquote>
&lt;script async src="https://platform.x.com/widgets.js" charset="utf-8">&lt;/script>
&lt;h2 id="해법">해법
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">d=SparseArray[{{1,2}-&amp;gt;10,{2,1}-&amp;gt;10,{1,5}-&amp;gt;15,{5,1}-&amp;gt;15,{1,4}-&amp;gt;12,{4,1}-&amp;gt;12,{1,3}-&amp;gt;20,{3,1}-&amp;gt;20,{2,5}-&amp;gt;10,{5,2}-&amp;gt;10,{3,4}-&amp;gt;10,{4,3}-&amp;gt;10,{3,8}-&amp;gt;30,{8,3}-&amp;gt;30,{3,7}-&amp;gt;20,{7,3}-&amp;gt;20,{3,6}-&amp;gt;25,{6,3}-&amp;gt;25,{4,5}-&amp;gt;15,{5,4}-&amp;gt;15,{4,8}-&amp;gt;20,{8,4}-&amp;gt;20,{5,9}-&amp;gt;18,{9,5}-&amp;gt;18,{5,8}-&amp;gt;15,{8,5}-&amp;gt;15,{6,7}-&amp;gt;5,{7,6}-&amp;gt;5,{7,8}-&amp;gt;35,{8,7}-&amp;gt;35,{8,9}-&amp;gt;12,{9,8}-&amp;gt;12},{9,9},Infinity];
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>SparseArray 함수로 행렬을 만듭니다. 각각의 요소는 그 요소의 행과 열의 도시 간 거리를 나타냅니다. 예를 들어, 첫 번째 요소 &lt;code>{1,2}-&amp;gt;10&lt;/code>은 1과 2의 거리가 10이라는 의미입니다. 끝에서 두 번째 요소 &lt;code>{9,9}&lt;/code>는 행렬의 크기를 나타내며, 마지막 요소 &lt;code>Infinity&lt;/code>는 지정하지 않은 도시 간 길의 길이가 무한, 즉 길이 없음을 의미합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{len,tour}=FindShortestTour[{1,2,3,4,5,6,7,8,9},DistanceFunction-&amp;gt;(d[[#1,#2]]&amp;amp;)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>FindShortestTour 함수로 간단하게 순회 외판원 문제를 풀 수 있습니다. &lt;code>{1,2,3,4,5,6,7,8,9}&lt;/code>는 도시의 번호를 나타냅니다. &lt;code>DistanceFunction-&amp;gt;(d[[#1,#2]]&amp;amp;)&lt;/code>는 도시 간의 거리를 나타내는 행렬 d를 전달하고 있습니다.&lt;/p>
&lt;h2 id="출력">출력
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{137, {1, 2, 5, 9, 8, 7, 6, 3, 4}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>출력은 최단 거리와 그때의 순회로입니다. 최단 거리는 &lt;code>137&lt;/code>, 순회로는 &lt;code>1→2→5→9→8→7→6→3→4→1&lt;/code>이 됩니다. ABC 순서로 고치면 &lt;code>A, B, E, I, H, G, F, C, D&lt;/code>가 됩니다.&lt;/p></description></item><item><title>좋아하는 수식</title><link>http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/</link><pubDate>Wed, 05 Oct 2022 13:24:50 +0900</pubDate><guid>http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/</guid><description>&lt;img src="http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/img.png" alt="Featured image of post 좋아하는 수식" />&lt;h2 id="윌슨의-정리">윌슨의 정리
&lt;/h2>&lt;p>$p$ 가 소수일 때, $(p−1)!≡−1 \pmod p$ 가 성립한다.&lt;/p>
&lt;h2 id="오일러의-공식">오일러의 공식
&lt;/h2>&lt;p>$e^{iπ}+1=0$&lt;/p>
&lt;h2 id="페르마의-마지막-정리">페르마의 마지막 정리
&lt;/h2>&lt;p>$n≥3$ 인 정수 $n$ 에 대해, $x^n+y^n=z^n$ 을 만족하는 양의 정수 쌍 $x, y, z$ 는 존재하지 않는다.&lt;/p>
&lt;h2 id="바젤-문제">바젤 문제
&lt;/h2>&lt;p>$1/1^2+1/2^2+1/3^2+1/4^2+...=π^2/6$&lt;/p>
&lt;h2 id="오일러의-소수-생성식">오일러의 소수 생성식
&lt;/h2>&lt;p>$n^2+n+41$ 은 $n$ 이 $0$ 이상 $39$ 이하의 정수일 때, 모두 소수가 된다.&lt;/p></description></item><item><title>왜 수학이나 컴퓨터를 좋아하는 걸까</title><link>http://kenji.blog/ko/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/</link><pubDate>Fri, 23 Sep 2022 01:56:52 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/</guid><description>&lt;img src="http://kenji.blog/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img.png" alt="Featured image of post 왜 수학이나 컴퓨터를 좋아하는 걸까" />&lt;h2 id="왜-수학이나-컴퓨터를-좋아하는-걸까-생각해보았습니다">왜 수학이나 컴퓨터를 좋아하는 걸까 생각해보았습니다
&lt;/h2>&lt;h3 id="모든-사람에게-평등하다">모든 사람에게 평등하다
&lt;/h3>&lt;p>사람이나 입장, 장소를 가리지 않고 같은 인풋에 대해 항상 같은 아웃풋을 반환한다.&lt;/p>
&lt;h3 id="규칙이-명확하다">규칙이 명확하다
&lt;/h3>&lt;p>규칙이 명확하게 정해져 있어서, 부조리나 불의가 없다는 것.&lt;/p>
&lt;h3 id="도출해낸-답이나-이론은-영원히-옳다">도출해낸 답이나 이론은 영원히 옳다
&lt;/h3>&lt;p>한 번 도출해낸 답이 나중에 바뀔 걱정이 없다.&lt;/p>
&lt;h3 id="적당한-어려움이-있다">적당한 어려움이 있다
&lt;/h3>&lt;p>항상 미해결 문제가 있어서, 언제든지 과제 해결에 도전할 수 있다.&lt;/p></description></item><item><title>'수학의 위인들'</title><link>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/</link><pubDate>Thu, 22 Sep 2022 23:06:37 +0900</pubDate><guid>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/img.png" alt="Featured image of post '수학의 위인들'" />&lt;h3 id="페르마-p-de-fermat-1601-1665">페르마 (P. de Fermat, 1601-1665)
&lt;/h3>&lt;p>17세기를 대표하는 프랑스의 수학자. 해석기하, 확률론, 미분법 등의 기초를 다졌다. 또한 정수론의 시조이기도 하다.&lt;/p>
&lt;h3 id="디오판토스-diophantus-207경-291경">디오판토스 (Diophantus, 207경-291경)
&lt;/h3>&lt;p>그리스의 수학자. 기호법의 도입, 유리수 해의 연구로 유명하다. 저서 『산술』이 대표작이다. 방정식의 유리수 해를 구하는 분야를 디오판토스 해석이라고 부른다.&lt;/p>
&lt;h3 id="오일러-l-euler-1707-1783">오일러 (L. Euler, 1707-1783)
&lt;/h3>&lt;p>스위스가 낳은 수학왕. 온갖 수학 분야에서 업적을 남겼다. 논문 700편 이상, 저서 45편이 남아 있다.&lt;/p>
&lt;h3 id="르장드르-a-m-legendre-1752-1833">르장드르 (A. M. Legendre, 1752-1833)
&lt;/h3>&lt;p>프랑스의 수학자. 정수론, 타원적분, 인력 문제 등에서 다수의 업적을 남겼다. &amp;lsquo;정수론&amp;rsquo;이라는 말은 그의 주저 『정수론』에서 유래했다.&lt;/p>
&lt;h3 id="쿠머-e-e-kummer-1810-1893">쿠머 (E. E. Kummer, 1810-1893)
&lt;/h3>&lt;p>독일의 수학자. 원분체의 정수론을 페르마의 마지막 정리에 응용하여 큰 성과를 거두었다.&lt;/p>
&lt;h3 id="데카르트-r-descartes-1596-1650">데카르트 (R. Descartes, 1596-1650)
&lt;/h3>&lt;p>프랑스의 독창적인 철학자. 대표적인 저작으로 『방법서설』, 『기하학』, 『우주론』 등이 있다.&lt;/p>
&lt;h3 id="파스칼-b-pascal-1623-1662">파스칼 (B. Pascal, 1623-1662)
&lt;/h3>&lt;p>확률론과 유체 연구로 알려진 프랑스의 철학자. 나중에 얀센파에 소속되어 종교 활동에 종사했다. 『팡세』는 그때의 저작이다.&lt;/p>
&lt;h3 id="바셰-c-g-bachet-1581-1638">바셰 (C. G. Bachet, 1581-1638)
&lt;/h3>&lt;p>프랑스의 귀족으로, 취미로 수 퍼즐을 연구했다. 디오판토스의 『산술』 라틴어 번역을 간행하고, 여기에 자신의 연구를 주석으로 게재했다.&lt;/p>
&lt;h3 id="월리스-j-wallis-1616-1703">월리스 (J. Wallis, 1616-1703)
&lt;/h3>&lt;p>영국의 수학자. 주저 『무한의 산술』에서 극한의 개념에 수학적인 형식을 부여하여, 미적분학의 기초를 다지는 데 공헌했다.&lt;/p>
&lt;h3 id="브룽커-w-brouncker-1620-1684">브룽커 (W. Brouncker, 1620-1684)
&lt;/h3>&lt;p>아일랜드의 귀족. 왕립학회(영국 학사원)의 초대 회장. 수학 애호가로, 월리스 등과 교류가 있었다.&lt;/p>
&lt;h3 id="라그랑주-j-l-lagrange-1736-1813">라그랑주 (J. L. Lagrange, 1736-1813)
&lt;/h3>&lt;p>이탈리아 태생의 프랑스 수학자. 오일러의 후임으로 베를린 학사원 수학부장을 지냈다. 정수론, 해석역학 등에서 큰 업적을 남겼다.&lt;/p>
&lt;h3 id="지겔-c-l-siegel-1896-1981">지겔 (C. L. Siegel, 1896-1981)
&lt;/h3>&lt;p>독일의 정수론 학자. 수의 해석적 이론에서 수많은 공헌을 했다.&lt;/p>
&lt;h3 id="피보나치-l-fibonacci-1175경-1250경">피보나치 (L. Fibonacci, 1175경-1250경)
&lt;/h3>&lt;p>이탈리아의 수학자. 주저 『산반서』에서 인도-아라비아 숫자를 사용하여 보급에 힘썼다. 또한 『제곱의 서』에서 합동수를 논했다.&lt;/p>
&lt;h3 id="베이커-a-baker-1939-">베이커 (A. Baker, 1939-)
&lt;/h3>&lt;p>영국의 정수론 학자. 초월수론에서의 공헌으로 히로나카 헤이스케와 함께 필즈상을 수상했다.&lt;/p>
&lt;h3 id="푸앵카레-j-poincare-1854-1912">푸앵카레 (J. Poincare, 1854-1912)
&lt;/h3>&lt;p>최후의 만능 수학자라 불린 프랑스의 수학자. 보형함수론, 비유클리드 기하학, 미분방정식, 천체역학, 전기역학 등을 비롯해 과학적 평론에서도 탁월한 저작을 남겼다.&lt;/p>
&lt;h3 id="모델-l-j-mordell-1888-1972">모델 (L. J. Mordell, 1888-1972)
&lt;/h3>&lt;p>미국 태생의 수학자. 부모는 리투아니아 출신의 이민자이다. 부정방정식론에서 수많은 논문이 있지만, 타원곡선론에서의 모델의 정리는 특히 유명하다. 베유가 이를 일반 대수곡선의 경우로 확장하여, 산술적 대수기하학은 여기서부터 폭발적인 발전을 이루게 된다.&lt;/p>
&lt;h3 id="베유-a-weil-1906-">베유 (A. Weil, 1906-)
&lt;/h3>&lt;p>유대계 프랑스 수학자. 젊은 시절 페르마 문제에 관심을 가지고 정수론에 응용할 목적으로 대수기하학을 근본적으로 재검토하여 엄격하게 기초를 다졌다. 수학사 저작으로도 알려져 있다.&lt;/p>
&lt;h3 id="메르센-m-mersenne-1588-1648">메르센 (M. Mersenne, 1588-1648)
&lt;/h3>&lt;p>프랑스 미님회의 신부. 각지의 수학자들의 왕복 서한을 중재했다. 메르센 수라는 이름의 수도 실은 페르마가 고안한 수이다.&lt;/p>
&lt;h3 id="로베르발-g-p-de-roberval-1602-1675">로베르발 (G. P. de Roberval, 1602-1675)
&lt;/h3>&lt;p>프랑스의 수학자. 당시 수학자로서 교수직을 얻고 있던 거의 유일한 사람으로, 사이클로이드 연구 등으로 알려져 있다.&lt;/p>
&lt;h3 id="아벨-n-h-abel-1802-1829">아벨 (N. H. Abel, 1802-1829)
&lt;/h3>&lt;p>노르웨이의 수학자. 일반 5차 방정식의 불가해성, 타원함수론, 아벨 적분론 등 뛰어난 업적을 남겼으나 젊은 나이에 세상을 떠났다.&lt;/p>
&lt;h3 id="야코비-k-g-jacob-1804-1851">야코비 (K. G. Jacob, 1804-1851)
&lt;/h3>&lt;p>유대계 독일 수학자. 타원함수론, 세타함수론, 미분방정식, 변분학 등에서 큰 업적을 남겼다. 아벨의 업적을 세상에 소개했다. 과학의 목적을 &amp;lsquo;인간 정신의 명예&amp;rsquo;를 위한 것이라 하며 실용주의를 배격한 것으로도 알려져 있다.&lt;/p>
&lt;h3 id="가우스-c-f-gauss-1777-1855">가우스 (C. F. Gauss, 1777-1855)
&lt;/h3>&lt;p>독일이 낳은 수학왕. 정수론, 비유클리드 기하학, 측지학, 초기하급수, 곡면론, 지자기 연구 등으로 알려져 있다. 완벽주의자여서, 발판이 보이지 않을 정도로 완성도가 높지 않으면 성과를 공표하지 않았다고 한다. 주저 『산술연구』 등.&lt;/p>
&lt;h3 id="라메-g-lame-1795-1870">라메 (G. Lame, 1795-1870)
&lt;/h3>&lt;p>프랑스의 수학자. 탄성역학, 열전도론 등에 공헌했다.&lt;/p>
&lt;h3 id="리우빌-j-liouville-1809-1882">리우빌 (J. Liouville, 1809-1882)
&lt;/h3>&lt;p>프랑스의 수학자. 미분방정식, 초월정수론, 함수론에 공헌했다.&lt;/p>
&lt;h3 id="코시-a-l-cauchy-1789-1857">코시 (A. L. Cauchy, 1789-1857)
&lt;/h3>&lt;p>프랑스의 수학자. 다작을 했으며 이론물리학, 수학에 업적이 많다. 프랑스에서는 가우스에 필적할 정도로 존경받고 있다고 한다.&lt;/p>
&lt;h3 id="갈루아-e-galois-1811-1832">갈루아 (E. Galois, 1811-1832)
&lt;/h3>&lt;p>프랑스의 수학자. 5차 이상의 방정식은 일반적으로 대수적으로 풀 수 없다는 아벨의 정리를 군이라는 개념을 도입하여 해명했다. 젊은 나이에 결투로 쓰러졌는데, 하찮은 여자 문제가 계기였다는 것이 현재는 알려져 있다.&lt;/p>
&lt;h3 id="헨젤-k-hensel-1861-1941">헨젤 (K. Hensel, 1861-1941)
&lt;/h3>&lt;p>독일의 수학자. 크로네커의 제자. 함수론적 수법을 응용하여 정수론에 p진법(p진 해석)이라는 이론을 도입했다.&lt;/p>
&lt;h3 id="하세-h-hesse-1898-1979">하세 (H. Hesse, 1898-1979)
&lt;/h3>&lt;p>독일의 수학자. 헨젤의 제자로, p진 해석의 기초를 다지고 그 응용에 공헌했다. 유체론의 정비, 타원곡선의 L 함수 연구 등.&lt;/p>
&lt;h3 id="크로네커-l-kronecker-1823-1891">크로네커 (L. Kronecker, 1823-1891)
&lt;/h3>&lt;p>유대계 독일 수학자. 타원함수론, 정수론 등에 공헌. 수학의 산술적 기초를 제창한 것으로도 알려져 있으나, 주관성이 강한 성격으로 베를린 대학의 동료 바이어슈트라스에 대해 불합리한 비판을 하거나 칸토어의 취직을 방해한 것은 그의 생애에 부정적인 이미지를 주고 있다.&lt;/p>
&lt;h3 id="힐베르트-d-hilbert-1862-1943">힐베르트 (D. Hilbert, 1862-1943)
&lt;/h3>&lt;p>독일의 수학자. 불변식론, 대수적 정수론, 수학기초론을 비롯해 수학의 모든 분야에 거대한 발자취를 남겼다. 파리 국제수학자회의(1900)에서 제창한 23개의 문제는 수학 발전에 큰 영향을 미쳤다.&lt;/p>
&lt;h3 id="리만-b-riemann-1826-1866">리만 (B. Riemann, 1826-1866)
&lt;/h3>&lt;p>독일의 수학자. 복소함수론에서의 리만 면의 개념, 리만 기하학 등 수학의 근본과 관련된 큰 업적을 남겼다.&lt;/p>
&lt;h3 id="팔팅스-g-faltings-1954-">팔팅스 (G. Faltings, 1954-)
&lt;/h3>&lt;p>독일의 수학자. 1983년에 모델 추측을 해결했다.&lt;/p>
&lt;h3 id="와일즈-a-wiles-1953-">와일즈 (A. Wiles, 1953-)
&lt;/h3>&lt;p>영국 태생의 수학자. 이와사와 주추측, 버치-스위너턴다이어 추측 등의 연구에서 큰 공헌을 한 이 분야의 1인자이다.&lt;/p>
&lt;h3 id="참고문헌">참고문헌
&lt;/h3>&lt;p>페르마의 마지막 정리가 풀렸다! 오일러부터 와일즈의 증명까지 고단샤&lt;/p></description></item><item><title>'수학자가 등장하는 영화'</title><link>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/</link><pubDate>Mon, 05 Sep 2022 10:41:00 +0900</pubDate><guid>http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/images/img.png" alt="Featured image of post '수학자가 등장하는 영화'" />&lt;p>수학자 주인공이 등장하는 제가 추천하는 영화 3선입니다.&lt;/p>
&lt;h1 id="뷰티풀-마인드">뷰티풀 마인드
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/images/beautiful_mind.jpg"
loading="lazy"
>&lt;br>
실존하는 미국의 천재 수학자의 반생을 그린 작품. 마지막에는 놀라운 전개가.
주연인 러셀 크로우가 매력적인 연기를 보여줍니다.&lt;/p>
&lt;h1 id="이니그마">이니그마
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/images/enigma.jpg"
loading="lazy"
>&lt;/p>
&lt;blockquote>
&lt;p>로버트 해리스의 소설 『암호기 이니그마를 향한 도전』을 영화화하여 2001년 개봉한 영화.
wikipedia 발췌&lt;/p>
&lt;/blockquote>
&lt;p>이니그마 암호기라는 독일이 만들어낸 암호를 해독하는 이야기.&lt;/p>
&lt;h1 id="이미테이션-게임">이미테이션 게임
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/images/imitation_game.jpg"
loading="lazy"
>&lt;/p>
&lt;p>이 작품 역시 이니그마를 다룬 암호 해독 이야기. 당시의 세계관을 좋아합니다.&lt;/p>
&lt;h1 id="기적이-내려준-수식">기적이 내려준 수식
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img.png"
width="566"
height="800"
srcset="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_hu224d39544ca0af082720aacd7902fd19_1089949_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_hu224d39544ca0af082720aacd7902fd19_1089949_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="70"
data-flex-basis="169px"
>&lt;/p>
&lt;p>케임브리지 대학의 수학자 하디와 인도의 수학자 라마누잔의 교류를 그린 작품. 수학의 아름다움을 느낄 수 있습니다.&lt;/p>
&lt;h1 id="박사와-그녀의-이론">박사와 그녀의 이론
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_1.png"
width="800"
height="459"
srcset="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_1_hubfe00de5360673c8281820134bf7a309_739706_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_1_hubfe00de5360673c8281820134bf7a309_739706_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="174"
data-flex-basis="418px"
>&lt;/p>
&lt;p>호킹 박사의 반생을 그린 작품.&lt;/p>
&lt;h1 id="파티클-피버">파티클 피버
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_2.png"
width="640"
height="960"
srcset="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_2_hu18abd37eefb70a17a04950b9cdaa7d84_902746_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/img_2_hu18abd37eefb70a17a04950b9cdaa7d84_902746_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_2.png"
class="gallery-image"
data-flex-grow="66"
data-flex-basis="160px"
>&lt;/p></description></item><item><title>[수학적 고찰] 왜 암호 해독 알고리즘 'GNFS'는 양자 컴퓨터 시대의 Shor 알고리즘에 패배하는가?</title><link>http://kenji.blog/ko/p/gnfs-to-shors-algorithm-math-deepdive/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kenji.blog/ko/p/gnfs-to-shors-algorithm-math-deepdive/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508.jpg" alt="Featured image of post [수학적 고찰] 왜 암호 해독 알고리즘 'GNFS'는 양자 컴퓨터 시대의 Shor 알고리즘에 패배하는가?" />&lt;p>현대 인터넷 사회의 정보 보안은 RSA 암호를 비롯한 공개키 암호 방식에 의해 보호받고 있습니다. RSA 암호의 안전성 근거는, &lt;strong>&amp;lsquo;거대한 합성수의 소인수분해는 계산량적으로 극히 어렵다&amp;rsquo;&lt;/strong> 는 사실에 의존하고 있습니다.&lt;/p>
&lt;p>이 글에서는 고전 컴퓨터에서 최강의 소인수분해 알고리즘인 &lt;strong>&amp;lsquo;일반 수체 체(General Number Field Sieve, GNFS)&amp;rsquo;&lt;/strong> 의 수학적 메커니즘을 파헤치고, 그것이 왜 피터 쇼어(Peter Shor)가 발견한 &lt;strong>&amp;lsquo;쇼어 알고리즘(Shor&amp;rsquo;s Algorithm)&amp;rsquo;&lt;/strong> 에 의해 완전히 무너지는지, 그 패러다임 시프트를 수식과 개념도를 이용해 철저히 깊이 있게 다룹니다.&lt;/p>
&lt;hr>
&lt;h2 id="1-고전-계산에서의-소인수분해-접근법-페르마의-소인수분해법으로부터의-발전">1. 고전 계산에서의 소인수분해 접근법: 페르마의 소인수분해법으로부터의 발전
&lt;/h2>&lt;p>소인수분해 문제란, 주어진 합성수 $N$에 대하여 $N = p \times q$가 되는 소수 $p, q$를 찾는 문제입니다.&lt;/p>
&lt;p>기본적인 아이디어는 다음 합동식을 만족하는 자명하지 않은 $x, y$를 찾는 것으로 귀결됩니다.&lt;/p>
$$ x^2 \equiv y^2 \pmod N $$
&lt;p>이를 변형하면,&lt;/p>
$$ x^2 - y^2 \equiv 0 \pmod N $$
$$ (x - y)(x + y) \equiv 0 \pmod N $$
&lt;p>여기서 $x \not\equiv \pm y \pmod N$ 이라면, $\gcd(x-y, N)$ 또는 $\gcd(x+y, N)$을 계산함으로써 $N$의 자명하지 않은 인수를 얻을 수 있습니다. 이 사실이 GNFS 등 근대적인 소인수분해 알고리즘의 기초가 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-고전-최강의-알고리즘-일반-수체-체gnfs의-심연">2. 고전 최강의 알고리즘: &amp;lsquo;일반 수체 체(GNFS)&amp;lsquo;의 심연
&lt;/h2>&lt;p>&lt;strong>&amp;lsquo;GNFS&amp;rsquo;&lt;/strong> 는 오늘날 알려진 고전 컴퓨터용 소인수분해 알고리즘 중에서 가장 빠른 것입니다. 그 시간 복잡도는 준지수 함수적(Sub-exponential)인 시간을 필요로 합니다.&lt;/p>
&lt;h3 id="gnfs의-계산량">GNFS의 계산량
&lt;/h3>&lt;p>수 $N$의 자릿수를 $b = \log_2 N$이라고 할 때, GNFS의 계산량은 다음과 같이 표현됩니다.&lt;/p>
$$ O\left( \exp \left( \left(\frac{64}{9} b\right)^{1/3} (\log b)^{2/3} \right) \right) $$
&lt;p>이 식에서 알 수 있듯이, 계산량은 다항식 시간이 아니라 지수 함수보다는 약간 느린 &lt;strong>&amp;lsquo;준지수 시간&amp;rsquo;&lt;/strong> 이 됩니다. 그럼에도 자릿수가 늘어나면 계산 시간은 천문학적으로 증대합니다.&lt;/p>
&lt;h3 id="gnfs의-수학적-메커니즘">GNFS의 수학적 메커니즘
&lt;/h3>&lt;p>GNFS는 크게 4개의 단계로 구성됩니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>다항식 선택 (Polynomial Selection)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>체질 (Sieving)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>행렬의 간소화 (Matrix Reduction)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>제곱근 계산 (Square Root)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h4 id="21-다항식-선택과-대수체">2.1. 다항식 선택과 대수체
&lt;/h4>&lt;p>먼저, 정수를 계수로 하는 기약 다항식 $f(x)$와 $g(x)$를 선택합니다. 이들은 공통의 근 $m$을 modulo $N$으로 가지도록 설정됩니다. 즉,&lt;/p>
$$ f(m) \equiv 0 \pmod N $$
$$ g(m) \equiv 0 \pmod N $$
&lt;p>일반적으로 $g(x)$는 일차 다항식 $g(x) = x - m$으로 선택됩니다. $f(x)$의 근을 $\alpha$라고 두면, $\mathbb{Q}(\alpha)$라는 &lt;strong>&amp;lsquo;대수체&amp;rsquo;&lt;/strong>(Number Field)가 구성됩니다. $\mathbb{Q}(\alpha)$의 환에서의 연산과 일반적인 정수환 $\mathbb{Z}$의 연산을 준동형 사상 $\phi: \alpha \mapsto m$을 통해 비교합니다.&lt;/p>
&lt;h4 id="22-체질-sieving">2.2. 체질 (Sieving)
&lt;/h4>&lt;p>다음으로 서로소인 정수 쌍 $(a, b)$를 대량으로 탐색합니다. 목적은 다음 두 값이 각각 &lt;strong>&amp;lsquo;B-smooth&amp;rsquo;&lt;/strong>(비교적 작은 소인수로만 구성됨)가 되는 쌍을 찾는 것입니다.&lt;/p>
&lt;ol>
&lt;li>$a - bm$ (정수환 위에서의 값)&lt;/li>
&lt;li>$b^d f(a/b)$ (대수체 위에서의 노름 $N(a - b\alpha)$에 대응)&lt;/li>
&lt;/ol>
&lt;p>여기서 &lt;strong>&amp;lsquo;체&amp;rsquo;&lt;/strong>(Sieve)라고 불리는 고속 탐색 기법이 사용됩니다. 이를 통해 방대한 후보 중에서 조건을 만족하는 $(a, b)$ 쌍을 효율적으로 추출합니다.&lt;/p>
&lt;h4 id="23-행렬의-간소화-linear-algebra-over-gf2">2.3. 행렬의 간소화 (Linear Algebra over GF(2))
&lt;/h4>&lt;p>수집한 쌍 $(a, b)$로부터 지수 벡터를 구성하고, 거대한 희소 행렬의 왼쪽 영공간(Left Null Space)을 $\mathbb{F}_2$(요소가 0과 1뿐인 체) 위에서 구합니다.&lt;/p>
&lt;p>관계식 $ \prod (a_i - b_i m) $ 와 $ \prod (a_i - b_i \alpha) $ 가 각각 제곱원이 되도록 벡터 $v$를 해로 찾습니다. 이는,&lt;/p>
$$ M \mathbf{x} \equiv \mathbf{0} \pmod 2 $$
&lt;p>라는 선형 방정식계를 푸는 것과 다름없습니다. 여기서 블록 란초스 알고리즘(Block Lanczos Algorithm)이나 블록 위데만 알고리즘(Block Wiedemann Algorithm) 등의 고도화된 수치 계산 알고리즘이 활용됩니다.&lt;/p>
&lt;h4 id="24-제곱근-계산">2.4. 제곱근 계산
&lt;/h4>&lt;p>마지막으로 대수체와 정수환 양쪽에서 제곱근을 취하고, $x^2 \equiv y^2 \pmod N$이라는 관계식을 도출해 냅니다. 그리고 $\gcd(x-y, N)$을 계산하여 인수를 얻습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-양자-계산에-의한-혁신-쇼어-알고리즘">3. 양자 계산에 의한 혁신: &amp;lsquo;쇼어 알고리즘&amp;rsquo;
&lt;/h2>&lt;p>GNFS가 준지수 함수적인 시간을 필요로 하는 반면, 1994년 피터 쇼어가 발표한 &lt;strong>&amp;lsquo;쇼어 알고리즘&amp;rsquo;&lt;/strong> 은 양자 컴퓨터를 사용하여 이 문제를 &lt;strong>&amp;lsquo;다항식 시간&amp;rsquo;&lt;/strong> 에 풀 수 있습니다.&lt;/p>
&lt;h3 id="쇼어-알고리즘의-계산량">쇼어 알고리즘의 계산량
&lt;/h3>&lt;p>양자 비트 수를 $O(\log N)$이라고 할 때, 시간 복잡도는 다음과 같습니다.&lt;/p>
$$ O((\log N)^3) $$
&lt;p>이는 비트 수에 대해 지수 함수적인 폭발을 일으키지 않음을 의미합니다. &lt;strong>&amp;lsquo;고전 계산&amp;rsquo;&lt;/strong> 의 계산량이 우주의 수명을 초과할 만한 거대한 합성수라도, &lt;strong>&amp;lsquo;양자 계산&amp;rsquo;&lt;/strong> 에서는 몇 시간～며칠 만에 해독 가능해진다는 경이로운 결과입니다.&lt;/p>
&lt;h3 id="쇼어-알고리즘의-전체상-주기-찾기-문제로의-귀결">쇼어 알고리즘의 전체상: 주기 찾기 문제로의 귀결
&lt;/h3>&lt;p>쇼어 알고리즘은 소인수분해 문제를 &lt;strong>&amp;lsquo;주기 찾기 문제&amp;rsquo;&lt;/strong> 로 교묘하게 귀결시킵니다.&lt;/p>
&lt;ol>
&lt;li>$N$과 서로소인 무작위 정수 $a$를 선택합니다 ($1 &lt; a &lt; N$).&lt;/li>
&lt;li>함수 $f(x) = a^x \bmod N$을 정의합니다.&lt;/li>
&lt;li>$f(x)$의 주기 $r$, 즉 $a^r \equiv 1 \pmod N$이 되는 최소의 양의 정수 $r$을 찾습니다.&lt;/li>
&lt;li>$r$이 짝수이면, $a^{r/2} \not\equiv -1 \pmod N$인지 확인하고, $\gcd(a^{r/2} \pm 1, N)$을 계산하여 소인수를 얻습니다.&lt;/li>
&lt;/ol>
&lt;p>이 3단계의 &lt;strong>&amp;lsquo;주기 $r$의 발견&amp;rsquo;&lt;/strong> 이야말로 고전 컴퓨터에서는 지수 함수적 시간을 필요로 하는 병목 현상이지만, 양자 컴퓨터는 &lt;strong>&amp;lsquo;양자 중첩&amp;rsquo;&lt;/strong> 과 &lt;strong>&amp;lsquo;양자 푸리에 변환&amp;rsquo;&lt;/strong>(QFT)을 사용하여 이를 순식간에 해결합니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-양자-푸리에-변환qft과-주기의-추출">4. 양자 푸리에 변환(QFT)과 주기의 추출
&lt;/h2>&lt;p>쇼어 알고리즘의 핵심인 양자 상태의 조작에 대해 수식으로 자세히 살펴보겠습니다.&lt;/p>
&lt;h3 id="41-양자-중첩의-생성">4.1. 양자 중첩의 생성
&lt;/h3>&lt;p>먼저 2개의 양자 레지스터를 준비합니다. 레지스터 1은 입력 $x$의 중첩 상태를 유지하고, 레지스터 2는 함수의 계산 결과 $f(x)$를 유지합니다. 초기 상태 $|0\rangle |0\rangle$에 아다마르 변환(Hadamard Transform)을 적용하여 가능한 모든 $x$의 중첩을 만들어 냅니다.&lt;/p>
$$ |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |0\rangle $$
&lt;p>
(여기서 $Q$는 $N^2 \le Q &lt; 2N^2$을 만족하는 2의 거듭제곱)&lt;/p>
&lt;p>다음으로 양자 오라클 $U_f$를 사용하여 $f(x) = a^x \bmod N$을 계산하고 레지스터 2에 저장합니다.&lt;/p>
$$ |\psi_2\rangle = U_f |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |a^x \bmod N\rangle $$
&lt;p>여기서 레지스터 2를 측정했다고 가정해 봅시다 (실제로 측정하지 않아도 수학적 구조는 동일합니다). 어떤 값 $y = a^{x_0} \bmod N$이 관측되었다고 하면, 레지스터 1의 상태는 $f(x) = y$가 되는 모든 $x$의 중첩으로 수축합니다. 주기를 $r$이라고 하면, 그러한 $x$는 $x_0, x_0 + r, x_0 + 2r, \dots$가 됩니다.&lt;/p>
$$ |\psi_3\rangle = \frac{1}{\sqrt{M}} \sum_{k=0}^{M-1} |x_0 + kr\rangle $$
&lt;p>
(여기서 $M \approx Q/r$은 항의 수)&lt;/p>
&lt;p>이 상태는 주기 $r$의 정보를 내포하고 있지만, 직접 측정해도 무작위한 $x_0 + kr$이 얻어질 뿐, 주기 $r$은 알 수 없습니다. 여기서 QFT가 등장합니다.&lt;/p>
&lt;h3 id="42-양자-푸리에-변환-quantum-fourier-transform-의-적용">4.2. 양자 푸리에 변환 (Quantum Fourier Transform) 의 적용
&lt;/h3>&lt;p>QFT는 양자 상태의 진폭에 대해 이산 푸리에 변환을 수행하는 조작입니다. 상태 $|x\rangle$에 대한 QFT의 작용은 다음과 같이 정의됩니다.&lt;/p>
$$ \text{QFT} |x\rangle = \frac{1}{\sqrt{Q}} \sum_{y=0}^{Q-1} e^{2\pi i \frac{xy}{Q}} |y\rangle $$
&lt;p>이것을 $|\psi_3\rangle$에 적용하면, 위상의 간섭(양자 간섭)이 일어납니다.&lt;/p>
$$ |\psi_4\rangle = \text{QFT} |\psi_3\rangle = \frac{1}{\sqrt{MQ}} \sum_{y=0}^{Q-1} \sum_{k=0}^{M-1} e^{2\pi i \frac{(x_0 + kr)y}{Q}} |y\rangle $$
&lt;p>이 식의 합을 전개하면,&lt;/p>
$$ \sum_{k=0}^{M-1} e^{2\pi i \frac{kry}{Q}} $$
&lt;p>라는 부분이 나타납니다. 이 기하급수의 합은 $ry/Q$가 정수에 가까울 때에만 보강 간섭(Constructive Interference)이 일어나고, 그 외의 경우에는 상쇄 간섭(Destructive Interference)이 일어납니다.&lt;/p>
&lt;p>따라서 높은 확률로 측정되는 상태 $|y\rangle$는,&lt;/p>
$$ \frac{y}{Q} \approx \frac{c}{r} $$
&lt;p>이라는 조건을 만족하는 정수 $y$가 됩니다 ($c$는 어떤 정수).&lt;/p>
&lt;h3 id="43-연분수-전개에-의한-주기-특정">4.3. 연분수 전개에 의한 주기 특정
&lt;/h3>&lt;p>측정을 통해 $y$를 얻은 후, 고전 컴퓨터를 이용하여 $y/Q$를 &lt;strong>&amp;lsquo;연분수 전개&amp;rsquo;&lt;/strong>(Continued Fraction Expansion)합니다. 이를 통해 $y/Q$의 근사 분수 $c/r$을 계산하고, 분모로부터 주기 $r$의 후보를 고효율로 추출할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-개념-모델의-비교와-패러다임-시프트">5. 개념 모델의 비교와 패러다임 시프트
&lt;/h2>&lt;p>GNFS와 쇼어 알고리즘의 차이를 직관적으로 이해하기 위해, Mermaid 기법을 사용한 개념도를 제시합니다.&lt;/p>
&lt;h3 id="양자-회로에-의한-쇼어-알고리즘의-개념도">양자 회로에 의한 쇼어 알고리즘의 개념도
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">graph TD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A[초기 상태: 0...0] --&amp;gt; B[아다마르 변환으로 모든 상태의 중첩]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B --&amp;gt; C[모듈러 거듭제곱 연산 a^x mod N]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt;|양자 얽힘| D[주기성을 가지는 상태로의 수축]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D --&amp;gt; E[양자 푸리에 변환 QFT]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> E --&amp;gt;|간섭에 의한 확률 증폭| F[측정: y를 얻음]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F --&amp;gt; G[고전 처리: 연분수 전개]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt; H[주기 r 발견]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> H --&amp;gt; I[N의 소인수 산출]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style A fill:#f9f,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style E fill:#bbf,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style I fill:#bfb,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="패러다임-시프트의-본질">패러다임 시프트의 본질
&lt;/h3>&lt;p>GNFS는 &lt;strong>&amp;lsquo;수학적인 공간(대수체) 안에서 관계식을 탐색한다&amp;rsquo;&lt;/strong> 라는 접근 방식을 취합니다. 하지만 탐색 공간은 자릿수에 대해 지수 함수적으로 확대되기 때문에, 고전 컴퓨터의 계산 능력(병렬화를 포함하더라도)으로는 키 길이가 2048비트 등을 초과하면 사실상 해독이 불가능해집니다.&lt;/p>
&lt;p>반면, 쇼어 알고리즘은 &lt;strong>&amp;lsquo;양자 간섭에 의한 파동의 성질&amp;rsquo;&lt;/strong> 을 이용합니다. 중첩 상태에 있는 모든 계산 경로를 동시에 평가하고, QFT에 의해 불필요한 답을 상쇄(약화)시키고, 정답이 되는 주기의 확률 진폭만을 증폭(강화)시킵니다. 이를 통해 공간을 탐색하는 것이 아니라, &lt;strong>&amp;lsquo;정답 그 자체를 떠오르게 한다&amp;rsquo;&lt;/strong> 는 전혀 다른 차원의 접근 방식을 실현하고 있는 것입니다.&lt;/p>
&lt;h2 id="6-요약">6. 요약
&lt;/h2>&lt;p>이 글에서는 고전 한계의 끝판왕인 &lt;strong>&amp;lsquo;GNFS&amp;rsquo;&lt;/strong> 와 양자 계산의 힘을 보여주는 &lt;strong>&amp;lsquo;쇼어 알고리즘&amp;rsquo;&lt;/strong> 에 대해, 각각의 수학적 배경과 알고리즘의 구조를 깊이 비교했습니다.&lt;/p>
&lt;p>GNFS가 다항식의 선택이나 거대한 행렬의 계산 등 수학적 기교를 부려 준지수 시간으로 계산량을 끌어내린 반면, 쇼어 알고리즘은 양자 역학의 기본 원리인 중첩과 간섭을 수학적 도구(QFT)와 융합시켜 단숨에 다항식 시간으로의 혁신을 이루어냈습니다.&lt;/p>
&lt;p>현재 시점에서는 실용적인 규모(수천 양자 비트)로 쇼어 알고리즘을 실행할 수 있는 결함 허용 양자 컴퓨터(FTQC)는 존재하지 않습니다. 하지만 이 수학적·이론적인 패러다임 시프트의 존재야말로, 현재 전 세계적으로 양자 내성 암호(PQC: Post-Quantum Cryptography)로의 이행이 시급해진 가장 큰 이유입니다.&lt;/p></description></item></channel></rss>