다항식과 FFT.

Slides:



Advertisements
Similar presentations
제철고 프로그래밍언어 2015 가을학기 강의 #2 Python 변수, 입출력, 배열 박성우 POSTECH 컴퓨터공학과 2015 년 9 월 30 일.
Advertisements

Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
수치해석 (Numerical Analysis) 보간법 (Interpolation). Page 2 보간법 (Interpolation) In this chapter … 보간법이란 ? 통계적 혹은 실험적으로 구해진 데이터들 (x i ) 로부터, 주어진 데이터를 만족하는 근사.
재료수치해석 HW # 박재혁.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 배우는 알고리즘 10장. 문자열 매칭.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
제2장 배열과구조.
5 순차 자료구조 방식.
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
- 1변수 방정식의 solution 프로그램 (Bisection method, Newton-Raphson method)
제 3 장 선형 리스트 3.1 선형 리스트 3.2 연결 리스트 3.3 다항식.
Chapter 02 순환 (Recursion).
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
Heesang kim PL/SQL 3 Heesang kim.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6장. printf와 scanf 함수에 대한 고찰
프로그래밍 랩 – 7주 리스트.
11장. 1차원 배열.
일차방정식의 풀이 일차방정식의 풀이 순서 ① 괄호가 있으면 괄호를 먼저 푼다.
C#.
제4장 제어 시스템의 성능.
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
JA A V W. 03.
프로그래밍 개요
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
컴퓨터 개론 및 실습 2차 프로젝트 Byoungjun Kim
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
제 3 강.
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
KMP ALPS 알고리즘 세미나 김태리.
8주차: Strings, Arrays and Pointers
1. 2진 시스템.
Fitting / Matrix / Excel
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Regular Expression 1 Powerful pattern matching with regular expression to a string while () { if ( /ab*c/ ) { print $_; } } substitute operator s/abc*c/def/;
Excel 일차 강사 : 박영민.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
5장. 선택 알고리즘.
Chapter 1 단위, 물리량, 벡터.
컴퓨터 구성요소와 사용 컴퓨터 문서 작업 인터넷 활용
쉽게 배우는 알고리즘 2장. 점화식과 점근적 복잡도 분석
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
TVM ver 최종보고서
쉽게 배우는 알고리즘 10장. 문자열 매칭
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
Excel 일차 강사 : 박영민.
수치해석 ch3 환경공학과 김지숙.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
김선균 컴퓨터 프로그래밍 기초 - 12th : 문자열 - 김선균
어서와 C언어는 처음이지 제21장.
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
13. 포인터와 배열! 함께 이해하기.
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

다항식과 FFT

다항식의 표현(1) 다항식 계수 표현(coefficient representation) 계수-지수 표현 f(x) = a0 + a1x1 + a2x2 + … an-1xn-1 계수(coefficient), 지수(exponent), 차수(degree) 다항식의 차수 상한(degree-bound) 계수 표현(coefficient representation) 계수 벡터로 다항식을 표현 float a[n]; // xi의 계수를 a[i]에 저장 계수-지수 표현 지수 및 계수로 구성된 구조체로 항(term)을 표현 Term poly[# of terms]; // 다항식: array of terms

다항식의 표현(2) 점 값에 의한 표현(point value representation) 서로 다른 n개의 x 값에 대하여 아래의 순서쌍들의 집합으로 다항식을 표현 {(x0, y0), {(x1, y1), …, {(xn-1, yn-1)}, where yk = f(xk) n개의 순서쌍으로 표현된 다항식은 유일함 Vandermonde 행렬 V에 대한 V-1이 유일하게 존재

다항식에 대한 연산 식의 값 계산 다항식의 덧셈 다항식의 곱셈 1개의 x 값에 대한 식의 값 계산 일반 알고리즘: O(n2) Horner 알고리즘: O(n) f(x) = a0 + x*(a1 + … + x*(an-2 + x*(an-1))…) n개의 x 값에 대한 식의 값 계산: O(n2) 다항식의 덧셈 기본 알고리즘: O(n) 다항식의 곱셈 계수 표현: O(n2) FFT을 적용한 알고리즘: O(n log n)

Point-wise Multiplication FFT를 적용한 다항식 곱셈 입력 다항식 A, B 출력 다항식 C 일반 알고리즘 O(n2) 계수 표현 n개의 점에 대한 식의 값 계산 O(n log n) 보간법에 의한 계수 계산 O(n log n) Point-wise Multiplication O(n) 점값 표현 {(xk , C(xk)|C(xk) = A(xk) * B(xk)}

복소수 근 ω의 특성 방정식 xn = 1의 복소수 근 ω의 특성 n개의 근: ω의 특성과 관련한 정리

DFT Discrete Fourier Transformation의 정의 DFT의 행렬 표현: y = Vn a

FFT FFT(Fast Fourier Transformation)란? 알고리즘 정의: 복소수 근의 특성을 활용하여 DFTn(a)를 O(n log n) 시간 안에 계산하는 방법 다항식 A(x)를 A[0](x)와 A[1](x)로 분할 A[0](x) = a0 + a2x + a4x2 + … + an-2xn/2-1 A[1](x) = a1 + a3x + a6x2 + … + an-1xn/2-1 A(x) = A[0](x2) + xA[1](x2) A[0](x)와 A[1](x)의 값을 아래 점에서 계산하여 결합 알고리즘 Recursive FFT Iterative FFT

RecursiveFFT 알고리즘(1) // a: 다항식의 계수 벡터 RecursiveFFT(a) { n = length of a; // n = 2k if (n == 1) return a; // 방정식 xn =1의 복소수 근의 값을 설정 ROOT = exp(2 * PHI * imgUNIT / n); // imgUNIT = 허수 단위 i OMEGA = 1; // 계수 벡터 a를 분할하고, 각각에 대한 DFTn/2(a)를 계산 a0[] = { a[0], a[2], …, a[n-2] }; a1[] = { a[1], a[3], …, a[n-1] }; y0[] = RecursiveFFT(a0); y1[] = RecursiveFFT*a1);

RecursiveFFT 알고리즘(2) // 2개의 DFTn/2(a)를 결합 for (k = 0; k <= n/2 -1; k++) { y[k] = y0[k] + OMEGA * y1[k]; y[k+n/2] = y0[k] – OMEGA * y1[k]; OMEGA = OMEGA * ROOT; } return y; ※ FFT의 수행 시간 T(n) = 2 * T(n/2) + O(n) = O(n log n)

보간법 기본 개념 알고리즘 점값에 의한 다항식 표현을 계수형으로 변환 DFT의 행렬 표현 식으로부터 계산 DFT: y = Vn a 보간법: a = Vn-1 y 알고리즘 FFT 알고리즘을 일부 수정하여 적용 aj 값 계산 식

String Matching

String Matching? 문제의 정의 대표적인 알고리즘 주어진 조건 Text String(텍스트 문자열): A[1..n] Pattern String(패턴 문자열): P[1..m] m《 n -> P[]는 A[]에 비해서 현저히 짧다. 문제: 텍스트 문자열이 패턴 문자열을 포함하고 있는가? 대표적인 알고리즘 원시적인 matching 방법 Automata를 이용한 matching Rabin-Karp 알고리즘 KMP 알고리즘 Boyer-Moore 알고리즘

원시적인 Matching 방법 ▣ 기본 아이디어: 텍스트의 처음부터 패턴과 비교 -> O(mn) 1단계: P[1..m]과 A[1..m]을 비교 2단계: P[1..m]과 A[2..m+1]을 비교 ... ※ 전체 비교 회수: (n-m+1)번 A[] b o y c a t s r p P[] s o a r s o a r s o a r s o a r

원시적인 매칭 알고리즘 // n: length of text A, m: length of pattern P naiveMatching(A, P) { for (i = 1; i <= n-m+1; i++) { if (P[1..m] = A[i..i+m-1) { A[i]에서 매칭이 발견되었음을 기록한다; }

Automata를 이용한 Matching 문제 해결 절차를 상태간의 이동(전이)으로 표현 A = (Q, q0, F, Σ, δ) Q : 상태들의 집합 q0 : 초기 상태 F: 목적이 달성된 상태의 집합 Σ: 입력 가능한 문자들의 집합 δ: 상태 전이 함수. 2차원 배열로 표현 ▣ Pattern “ababaca”를 찾는 오토마타 1 3 2 5 4 6 7 a c b

Automata를 이용한 매칭 알고리즘 // n: length of text A, f: final state FA_Matcher(A, δ, f) { q = 0; for (i = 1; i <= n; i++) { q = δ(q, A[i]); if (q = f) { A[i-m+1]에서 매칭이 발견되었음을 기록한다; } 수행 시간: O(n) 상태전이함수 준비시간: O(|Σ|∙m) 전체수행시간: O(n + |Σ|∙m)

Rabin-Karp 알고리즘 기본 개념 문자열 패턴을 수치로 바꾸어 문자열 비교를 수치 비교로 전환시켜 매칭하는 방법 문자 집합 Σ의 크기에 따라 몇 진수를 쓸 것인지를 결정 영어 알파벳 대소문자: 52진수, ASCII 문서: 128진수, ... 패턴 P[1..m]을 d 진수로 변환한 값 p의 계산 P[1]*dm-1 + P[2]*dm-2 + ... + P[m-1]*d1 + P[m] A[i..i+m-1]에 대응하는 ai의 계산 ai = A[i]*dm-1 + A[i+1]*dm-2 + ... + A[i+m-2]*d1 + A[i+m-1] ai = d*(ai-1 – dm-1*A[i-1]) + A[i+m-1]

수치화를 이용한 매칭 알고리즘 // n: length of text A, m: length of pattern P, d: 진수 basicRabinKarp(A, P, d) { p = 0; a[i] = 0; for (i = 1; i <= m; i++) { p = d*p + P[i]; // P[]의 수치 값 계산 a[1] = d*a[1] + A[i]; // a[1]의 수치 값 계산 } for (i = 1; i <= n-m+1; i++) { if (i != 1) a[i] = d*(a[i-1] – dm-1*A[i-1]) + A[i+m-1]; if (p = a[i]) A[i]에서 매칭이 발견되었음을 기록한다; 전체수행시간: O(n)

수치화를 이용한 알고리즘의 개선 문제점 해결 방안 문자 집합 Σ의 크기와 m의 길이에 따라 ai가 매우 큰 수가 될 수 있다. 이 경우에 컴퓨터 레지스터의 용량을 초과하여, overflow가 발생할 가능성이 매우 높다. 해결 방안 컴퓨터 레지스터가 감당할 수 있는 범위에서 충분히 큰 소수(prime number) q를 선정 ai 대신에 bi = ai mod q 를 사용 실제로는 매칭이 되지 않았는데도 mod q 연산으로 인하여 우연히 p = bi가 되는 경우가 발생할 수 있음 q 값을 충분히 크게 잡음으로써 발생할 확률을 0에 가깝게 만듬

수치화를 이용한 매칭 알고리즘 // n: length of text A, m: length of pattern P, d: 진수, q: 충분히 큰 소수. RabinKarp(A, P, d, q) { p = 0; b[i] = 0; for (i = 1; i <= m; i++) { p = (d*p + P[i]) % q; // P[]의 수치 값 계산 b[1] = (d*b[1] + A[i]) % q; // a[1]의 수치 값 계산 } h = (dm-1) % q; for (i = 1; i <= n-m+1; i++) { if (i != 1) b[i] =(d*(b[i-1] – h*A[i-1]) + A[i+m-1]) % q; if (p == b[i] && P[1..m] == A[i..i+m-1]) A[i]에서 매칭이 발견되었음을 기록한다; O(m) T(n) = O(n+km), k: 매치 발생 회수

KMP 알고리즘(1) 기본 개념 Knuth, Morris, Pratt이 만든 알고리즘 핵심 아이디어 오토마타를 사용한 알고리즘과 유사한 발상 어느 지점에서 매칭이 성공하지 못했어도, 그 지점을 기준으로 몇 개의 부분 문자열이 찾으려는 패턴 문자열의 앞 부분과 일치한다면 그 정보를 활용 패턴의 각 위치에 대해서 매칭에 실패했을 때 돌아갈 곳을 알려주는 일차원 배열(π[])을 준비 이를 이용해서 텍스트 문자열을 훑어 나간다

배열 π의 생성 P[] a b c d w z π[] 1 2 3 4 a b c d w z 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 P[] a b c d w z 1 2 3 4 5 6 7 8 9 10 π[] 1 2 3 4 a b c d w z

KMP 알고리즘의 수행 예 A[] . a b c d 패턴 문자열의 구조로부터 이미 매치되었음을 알고 있으므로, 비교하지 않고 건너 뜀 P[] a b c d w z a b c d w z π[8] = 4 이므로, 매치가 실패한 위치의 텍스트 문자와 P[4]를 비교

KMP 알고리즘(1) // n: length of text A, m: length of pattern P. KMP(A, P) { preprocessing(P); i = 1; j = 1; // 텍스트 문자열 포인터 & 패턴 문자열 포인터 while (i <= n) { if (j == 0 or A[i] == P[j]) { i++; j++; } else j = π[j]; if (j == m+1) { A[i-m]에서 매치되었음을 알림; j = π[j]; } T(n) ≤ 2n = O(n)

KMP 알고리즘(2) preprocessing(P) { j = 1; k = 0; π[1] = 0; while (j <= m) { if (k == 0 or P[j] == P[k]) { j++; k++; π[j] = k; } else k = π[k];

Boyer-Moore 알고리즘 핵심 아이디어 마지막 문자부터 역순으로 비교하며, 매치될 가능성이 없을 때에는 일부 문자를 점프 A[1..m]가 P[1..m]을 비교하는 경우 A[m]이 P[1..m]에 존재하지 않을 경우 A[2], ..., A[m-1]로 시작하는 문자열은 P[1..m]과 매치될 가능성이 없다. 따라서 텍스트 문자열에서 m개의 문자를 건너 뛰고, A[m+1..2m]과 P[1..m]을 비교하면 된다. A[m]이 P[1..m]에 존재하는 경우 P[1..m]의 몇 번째 문자인가에 따라 2칸 이상 점프할 기회가 있음 2개의 version simple version: Boyer-Moore-Horspool 알고리즘 full version: Boyer-Moore 알고리즘

Jump 수행 예 A[] . b t i g e r P[] t i g e r b를 활용, 5칸 점프 t i g e r A[] .

Boyer-Moore-Horspool 알고리즘 // n: length of text A, m: length of pattern P. BoyerMooreHorspool(A, P) { computeJump(P, jump); i = 1; while (i <= n-m+1) { j = m; // j: 패턴 문자열을 위한 포인터(끝에서부터 이동) k = i+m-1; // k: 텍스트 문자열을 위한 포인터(") while (j > 0 and P[j] == A[k]) { j--;, k--; } if (j == 0 ) A[i] 위치에서 매치되었음을 알림; i = i + jump[[A[i+m-1]]; // 마지막 문자로부터 jump 위치 결정 } O(m) O(m) 최악의 경우: O(mn), 최선의 경우: O(n/m) 실제의 경우: O(n) 보다 더 작은 시간 소요

완전한 Boyer-Moore 알고리즘 2가지 Heuristics 불일치 문자 휴리스틱(Bad-Character Heuristics) j가 m보다 r번째 왼쪽에서 불일치한 경우 텍스트에서 (jump[A[k]] – r)만큼 점프 가능 일치 접미부 휴리스틱(Good-Suffix Heuristics) P[j] (j >0)에서 불일치한 경우: P[m] ~ P[j+1] 까지는 일치. P[1..m]의 다른 부분에서 P[j+1..m]과 일치하는 부분 문자열이 없으면, 한꺼번에 점프 가능 P[1..m]의 다른 부분에서 P[j+1..m]과 일치하는 부분 문자열이 있으면, 그 부분이 A[i..i+m-1]과 나란해지도록 점프 가능 불일치 문자 휴리스틱과 일치 접미부 휴리스틱에 의한 점프 중에서 큰 것을 선택하여 점프