<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>전산 on Nyan101 Blog</title><link>https://nyan101.github.io/category/%EC%A0%84%EC%82%B0/</link><description>Recent content in 전산 on Nyan101 Blog</description><generator>Hugo -- gohugo.io</generator><language>ko-KR</language><copyright>© nyan101</copyright><lastBuildDate>Wed, 27 May 2020 01:25:33 +0900</lastBuildDate><atom:link href="https://nyan101.github.io/category/%EC%A0%84%EC%82%B0/feed.xml" rel="self" type="application/rss+xml"/><item><title>소인수분해 알고리즘(Pollard-(p-1), Pollard-rho, Dixon's Random Square)</title><link>https://nyan101.github.io/blog/algorithms-for-integer-factorization/</link><pubDate>Wed, 27 May 2020 01:25:33 +0900</pubDate><guid>https://nyan101.github.io/blog/algorithms-for-integer-factorization/</guid><description>&lt;p&gt;&lt;a href="https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem" target="_blank" rel="noreferrer"&gt;지난번 글&lt;/a&gt;에서는 이산 로그 문제에 대해 다뤘으니 이번에는 소인수분해 문제를 해결하는 알고리즘에 대해 알아보자. 코드는 이전과 마찬가지로 아래와 같은 수정이 들어간 파이썬 문법을 따랐다.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;양 끝을 명시적으로 나타내기 위해 &lt;code&gt;range(st, ed+1)&lt;/code&gt; 대신 &lt;code&gt;[st...ed]&lt;/code&gt;와 같은 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;파이썬에서 거듭제곱을 나타내는 &lt;code&gt;a**b&lt;/code&gt; 대신 일반적으로 사용되는 &lt;code&gt;a^b&lt;/code&gt; 표기를 사용했다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;지난 이산 로그 문제와는 달리 &lt;del&gt;모두가 알 것이라 믿고&lt;/del&gt; 소인수분해 문제에 대한 자세한 설명은 생략한다. 또한 알고리즘 설계를 간단히 하기 위해 소인수분해 문제의 요구조건을 &lt;strong&gt;주어진 자연수 n에 대해, 1과 자기 자신(=n)을 제외한 약수를 발견하는 것&lt;/strong&gt;으로 정했다.&lt;/p&gt;</description></item><item><title>이산 로그 문제(DLP)에 대한 알고리즘(Shanks, Pollard-rho, Pohlig-Hellman)</title><link>https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem/</link><pubDate>Fri, 08 May 2020 16:36:14 +0900</pubDate><guid>https://nyan101.github.io/blog/algorithms-for-discrete-logarithm-problem/</guid><description>&lt;p&gt;암호학, 특히 공개키 기반 암호시스템은 주로 1)소인수분해 문제 혹은 2)이산 로그 문제를 기반으로 설계되는 경우가 많다. 그중 이산 로그 문제와 이를 해결하는 알고리즘에 대해 알아보자. 예시로 든 코드는 기본적으로 파이썬 문법을 따라 작성했으며 가독성을 위해 다음과 같은 부분을 수정했다.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;파이썬에서 &lt;code&gt;range(n)&lt;/code&gt;은 0부터 시작해 n이 아닌 n-1까지를 포함한다. 양 끝을 명시적으로 나타내기 위해 &lt;code&gt;[st...ed]&lt;/code&gt;와 같은 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;파이썬에서 거듭제곱을 나타내는 &lt;code&gt;a**b&lt;/code&gt; 대신 일반적으로 사용되는 &lt;code&gt;a^b&lt;/code&gt; 표기를 사용했다.&lt;/li&gt;&#10;&lt;li&gt;mod p에서의 역원을 &lt;code&gt;a^(-1)&lt;/code&gt;로 표기했다. 실제 구현에서는 다음과 같이 구할 수 있다.&#10;&lt;ul&gt;&#10;&lt;li&gt;페르마 소정리에 의해 $a^{p-1} \equiv 1 \pmod p$이므로 $a\cdot a^{p-2} \equiv 1$에서 $a^{-1} \equiv a^{p-2}$&lt;/li&gt;&#10;&lt;li&gt;$p$가 소수가 아닌 경우, 확장 유클리드 알고리즘을 사용한다&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;이산 로그 문제&#10; &lt;div id="이산-로그-문제" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ec%9d%b4%ec%82%b0-%eb%a1%9c%ea%b7%b8-%eb%ac%b8%ec%a0%9c" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;이산 로그 문제는 이산 대수 문제라고도 하며, 순환군 $\langle g \rangle$와 군의 원시근(primitive root) $g$, 그리고 $y \in \langle g \rangle$ 가 주어졌을 때, $y=g^k$를 만족하는 최소의 자연수 $k$를 찾는 문제이다. 암호학에서는 큰 소수 $p$에 대해 $p$로 나눈 나머지들의 모임인 $\mathbb{Z}_p^\ast$를 사용하는 경우가 많다.&lt;/p&gt;</description></item><item><title>Möbius 함수의 정의와 활용</title><link>https://nyan101.github.io/blog/Mobius-function/</link><pubDate>Sun, 31 Mar 2019 21:38:49 +0900</pubDate><guid>https://nyan101.github.io/blog/Mobius-function/</guid><description>&lt;p&gt;얼마 전 코드포스에서 &lt;a href="http://codeforces.com/contest/1139/problem/D" target="_blank" rel="noreferrer"&gt;흥미로운 문제&lt;/a&gt;를 접했다. 대회 당시에는 풀지 못했는데, 에디토리얼을 읽어보던 중 뫼비우스 함수(Möbius function)에 대한 언급이 있어 이에 대해 좀더 자세히 알아보았다.&lt;/p&gt;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;Möbius function의 정의&#10; &lt;div id="möbius-function의-정의" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#m%c3%b6bius-function%ec%9d%98-%ec%a0%95%ec%9d%98" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;뫼비우스 함수(Möbius function)는 자연수 n에 대해 다음과 같이 정의된다. (\(p\)는 소수)&lt;/p&gt;</description></item><item><title>Coq 02 - 자연수 덧셈의 결합법칙 증명</title><link>https://nyan101.github.io/blog/Coq-02-mynat/</link><pubDate>Mon, 08 Jan 2018 02:24:01 +0900</pubDate><guid>https://nyan101.github.io/blog/Coq-02-mynat/</guid><description>&lt;p&gt;대부분의 reference가 그렇듯이 읽다보면 쉽게 지루해진다. 지루함을 덜하고 Coq에 익숙해지기 위해 일단 예제를 조금씩 따라해보면서 익혀가기로 했다. 자바를 처음 배울 때 &lt;em&gt;public static void main(int argv, char **argc)&lt;/em&gt;가 정확히 뭔지는 몰라도 &amp;ldquo;Hello World&amp;rdquo; 부터 찍어보는 그런 마음으로 진행해봤다.&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;CoqIDE 실행&#10; &lt;div id="coqide-실행" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#coqide-%ec%8b%a4%ed%96%89" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;프로그램을 처음 실행하면 다음과 같은 화면을 볼 수 있다. 크게 3가지 창으로 나뉘어져 있으며, 왼쪽은 코드 작성을, 오른쪽 위/아래는 각각 Proof 보조/결과 출력을 담당하는 역할이었다.&lt;/p&gt;</description></item><item><title>Coq 01 - Introduction</title><link>https://nyan101.github.io/blog/Coq-01-intro/</link><pubDate>Thu, 04 Jan 2018 12:42:31 +0900</pubDate><guid>https://nyan101.github.io/blog/Coq-01-intro/</guid><description>&lt;p&gt;&amp;lt;Interactive Theorem Proving and Program Development&amp;gt;라는 책을 추천받아 조금씩 읽어보기로 했다. 첫 장에서는 Coq에 대한 간단한 안내를 진행한다. 책의 순서를 따라가면서 하나씩 알아보자&lt;/p&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;타입&#10; &lt;div id="타입" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%ed%83%80%ec%9e%85" aria-label="앵커"&gt;&lt;span class="heading-anchor-mark" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;먼저 Coq에서는 Gallina라는 언어를 사용해 요구사항(Specification)을 서술한다. 대부분의 다른 프로그래밍 언어들과 마찬가지로 타입은 declaration과 typing rule에 의해 정해진다.&lt;/p&gt;</description></item><item><title>소수 판별 튜링머신</title><link>https://nyan101.github.io/blog/primality-test-Turing-Machine/</link><pubDate>Sat, 05 Aug 2017 00:00:01 +0900</pubDate><guid>https://nyan101.github.io/blog/primality-test-Turing-Machine/</guid><description>&lt;p&gt;이번 SCTF(Samsung CTF)의 700점짜리 문제로 &lt;strong&gt;튜링머신 설계&lt;/strong&gt;가 나왔다. 총 4개의 문제 중 3개는 일반적인 오토마타 교과서에서 다루는 언어들(ex: \(L=\{ 0^n1^n | n \geq 0 \}\))이었지만 마지막 단계인 \(L=\{0^p | p \, \mathrm{\,is\,prime}\}\)가 다소 많은 시간을 잡아먹었다. 사실상 소수 판별을 하는 튜링 머신을 설계하라는 문제였는데, 기억상 다른 교재들에서도 이에 대한 명확한 실례는 나와있지 않아 따로 정리했다.&#10;아래 등장하는 그래프의 화살표에서 &lt;code&gt;A/B . P&lt;/code&gt;는 &amp;ldquo;현재 state에서 알파벳 A를 읽었을 때, 테이프에 B를 쓰고 P방향(L, 또는 R)으로 이동한다&amp;quot;라는 의미를 가진다. 이제 필요한 서브루틴을 하나씩 구성해 보자.&lt;/p&gt;</description></item></channel></rss>