# -*- coding: utf-8 -*-
from myutil import consolePrintWithLineNumber as c
'''
Created on 2015. 8. 12.
@author: Administrator
'''
'''
ch02 필드
'''
# 46p
from math import e
from math import pi
from GF2 import one
from image import color2gray
from image import file2image
from plotting import plot
c(1 + 3j)
c(1j)
c((1 + 3j) + (2 + 2j))
x = 1 + 3j
c(x ** 2)
c(x.real)
c(x.imag)
c(type(1 + 2j)) # class 'complex'...
# 47p
# ax + b = c
def solve1(a, b, c): return (c - b) / a
# 10x + 5 = 30
c(solve1(10, 5, 30))
# (10+5i)x+ 5 = 20
c(solve1(10 + 5j, 5, 20))
# 48p
# module six를 설치해야 한다.
# > pip install six
# > pip install python-dateutil
# > pip install pyparsing
# 기타 여러 문제 해결 > https://wikidocs.net/1019
# matplotlib 사용법
# import matplotlib.pyplot as plt
# x = range(100)
# y = [ i * i for i in x]
# plt.plot(x, y)
# plt.show()
# 저자 사이트에서 plotting.py 파일 다운받기(matplotlib가 아니다.) > http://resources.codingthematrix.com/
# 익스플로러가 열린후, 스크립트가 적용이 안된다.???
# 작동이 되지 않는다면, plotting.py 파일안에 create_temp 함수에서 remove_at_exit(path) 부분을 주석처리한다.
# > exit 될때, 임시파일을 삭제하는 부분인데, 파일이 삭제되는 시점이 너무 빨라서, 웹브라우저가 가동했지만 정작 파일읃 찾지 못하기 때문.
S = {2 + 2j, 3 + 2j, 1.75 + 1j, 2 + 1j, 2.25 + 1j, 2.5 + 1j, 2.75 + 1j, 3 + 1j, 3.25 + 1j}
# plot(S, 4) # 웹브라우저로 출력, plot 함수는 전체 실행할 때마다 계속 브라우저를 호출하므로, 테스트 후 주석처리 함.
# 49p
c(abs(3 + 4j))
c(abs(1 + 1j))
c((3 + 4j).conjugate()) # 공액 복소수(z.real - z.imag)
# 50p
S1 = {1 + 2j + z for z in S}
c(S1)
# plot(S1, 4)
S2 = {-2 - 2j + z for z in S}
# plot(S2, 4)
# 51p
# 52p
S3 = {z / 2 for z in S}
# plot(S3, 4)
S4 = {z * 2 for z in S}
# plot(S4, 4)
'''
<번역오류?>
마찬가지로, 각 복소수를 2배 하는 것은 점들을 원점과 서로에게 더 가까워지게 한다.
> 마찬가지로, 각 복소수를 2배 하는 것은 점들을 원점과 서로에게 더 멀어지게 한다.
'''
# 53p
S1 = {z * -1 for z in S}
# plot(S1, 4)
# 90도 회전한 이미지가 책과 다르다;;;
S1 = {z * 1j for z in S}
# plot(S1, 4)
# 54p
# Task2.4.8
S1 = {z * 1j / 2 for z in S}
# plot(S1, 4)
# Task2.4.9
S1 = {(z * 1j) / 2 + 2 - 1j for z in S}
# plot(S1, 4)
# Task2.4.10
# 밝기가 아니라 색상이다. RGB : (183,183,183)
# color2gray의 리턴값(밝은 정도) 중에 120보다 작은 값을 가진 픽셀만 추린다.
data = file2image('img01.png')
data = color2gray(data)
pts = [[x + y * 1j for x, pixel in enumerate(row) if pixel < 120] for y, row in enumerate(data)]
pts1 = sum(pts, [])
# plot(pts1, 200, 1) # 200은 스케일, 1은 점의 굵기
# > 이미지가 반대로 나온다...x, y가 뒤바뀐듯.
# file2image 함수 결과값에서부터 반대로 나온다.
# 리스트를 컴프리헨션 할때, 마지막값부터 읽어보자. reversed 이용
pts = [[x + y * 1j for x, pixel in enumerate(row) if pixel < 120] for y, row in enumerate(reversed(data))]
pts1 = sum(pts, [])
# plot(pts1, 200, 1)
# 55p
# Task2.4.11 복소수의 중심을 구한다. 그러고나서 원점으로 평행이동
def f(zlist):
x_min = 0
x_max = 0
y_min = 0
y_max = 0
for z in zlist:
x = z.real
y = z.imag
if(x_min >= x):
x_min = x
if(x >= x_max):
x_max = x
if(y_min >= y):
y_min = y
if(y > y_max):
y_max = y
x_center = x_max - x_min
y_center = y_max - y_min
# 그림의 중심에 해당하는 복소수z1의 반대방향-z1/2을 더한다.
# 그냥 -z1을 더하면, 반대쪽 원점을 중심으로 대칭이동이 된다.
return [z - x_center / 2 - y_center / 2 * 1j for z in zlist]
pts2 = f(pts1)
# plot(pts2, 200, 1)
# plot([z * 1j / 2 for z in pts1], 200, 1)
# 56p 오타?? 아래 그림의 z1,z2사이의 각도가 pi/4이 아닌 pi/8이다.
# 57p
# Task2.4.17
n = 6
w = e ** (2 * pi * 1j / n)
list = [w ** x for x in range(0, n)]
c(list)
# plot(list, 3, 3)
# 58p
# Task2.4.18
S1 = [z * e ** ((pi / 4) * 1j) for z in S]
# plot(S1, 4)
# Task2.4.19
pts2 = [z * e ** ((pi / 4) * 1j) for z in pts1]
# plot(pts2, 200, 1)
# 61p
# Task2.4.20(중심 평행이동, 회전, 스케일링)
pts2 = [z * e ** ((pi / 4) * 1j) * 0.5 for z in f(pts1)]
# plot(pts2, 200, 1)
# 60p
# GF(2) 갈루아 필드 .... 무슨 소리지??
c(one * one)
c(one * 0)
c(one + 0)
c(one + one)
c(-one)
# 62p
'''
P2.5.1 이걸 어떻게 알아???
> 암호KEY의 가능성은 2**5 = 32가지이다. 이걸로 다 돌려보자
복호화 알고리즘은 앞페이지의 방법을 역으로 이용한다.(다른 방법이 없다..-_-;;)
암호문1 = KEY1 + 평문1
평문1 = 암호문1 - KEY1
복호화(32가지 KEY 적용)
↓
암호문 Q1 ----> 평문 Q2 ---> 5개씩 자르고 -> 10진수 -> 알파벳
'''
Q1 = '1010100100101010101111001000110101110101001001100111010'
# '01010' 을 10진수 숫자로 변환
def bin2dec(bin):
base = 2
digits = 5
return sum([int(bin[i]) * (base ** (digits - i - 1)) for i in range(digits)])
# 10진수 숫자를 2진수 5자리로 만들기(KEY 만들때 사용)
def dec2bin(num):
digits = 5
bStr = ""
while num > 0 :
bStr = str(num % 2) + bStr
num = num >> 1
# 자리수 맞춰주기
while(len(bStr) < digits):
bStr = '0' + bStr
return bStr
# 10진수 숫자를 알파벳으로 변환
def dec2AZ(num):
if num <= 25:
return chr(num + 97) # chr <-> ord 아스키코드표 기준
elif num == 26:
return ' '
elif num > 26: # KEY가 잘못된 경우, 예상 범위를 넘어서는 결과가 나오기도 한다. 이 경우 대체할 문자가 없으므로 *로 표시한다.
return '*'
# 문자열 s를 n자리수로 잘라서 리스트로 만든다.
def chunks(s, n):
list = []
for start in range(0, len(s), n):
list.append(s[start:start + n])
return list
# 복호화 알고리즘
def decodeLogic(c, key):
# 평문1 = 암호문1 - KEY1
return abs(c - key)
def sol1():
# 가능한 암호 55자리(11*5) 만들기. 32개
keylist = []
for i in range(32):
s0 = dec2bin(i) * 11
keylist.append(s0)
# 복호화
plainlist = []
for key in keylist:
s = ''
for index, k in enumerate(key):
s = s + str(decodeLogic(int(Q1[index]), int(k)))
plainlist.append(s)
# 결과를 5자리로 자르고
chrunkslist = []
for list in plainlist:
chrunkslist.append(chunks(list, 5))
# 문자로 변환
resultlist = []
for clist in chrunkslist:
s2 = ''
for bin in clist:
s2 = s2 + dec2AZ(bin2dec(bin))
resultlist.append(s2)
return resultlist
c(sol1()) # 32개 결과중에 답이 될 만한 것을 찾아보자. 답은 'eve is evil' 이다. 헉! 소름끼친다...
콘솔 출력 결과
22 > (1+3j) 23 > 1j 25 > (3+5j) 27 > (-8+6j) 28 > 1.0 29 > 3.0 31 >T2.4.10 결과 (처음결과)37 > 2.5 39 > (1.2-0.6j) 64 > 5.0 65 > 1.4142135623730951 66 > (3-4j) 70 > {(2.75+3j), (3.5+3j), (4.25+3j), (3.25+3j), (3+3j), (3.75+3j), (4+3j), (4+4j), (3+4j)} 155 > [(1+0j), (0.5000000000000001+0.8660254037844386j), (-0.4999999999999998+0.8660254037844388j), (-1+3.885780586188048e-16j), (-0.5000000000000006-0.8660254037844385j), (0.49999999999999944-0.8660254037844392j)] 173 > one 174 > 0 175 > one 176 > 0 177 > one 253 > ['vevlzdlvez ', 'ufukyckufy*', 'xgxj*bjxg*y', 'whwi aiwh z', 'rarp*hpra**', 'qbqo*goqb**', 'tctn*fntc**', 'sdsm*emsd**', '*m*drld*mrs', '*n*cqkc*nqt', '*o*btjb*otq', '*p*asia*psr', 'zizhvphzivw', 'yjyguogyjux', '*k*fxnf*kxu', ' l ewme lwv', 'fuf*jt*fujk', 'eve is evil', 'hwhzlrzhwli', 'gxgykqygxkj', 'bqb*nx*bqno', 'ara*mw*armp', 'dsd*pv*dspm', 'ctc*ou*cton', 'n*ntb*tn*bc', 'm*msa sm*ad', 'p*prdzrp*da', 'o*oqcyqo*cb', 'jyjxf*xjyfg', 'iziwe*wizeh', 'l lvh*vl he', 'k*kug*uk*gf']
T2.4.10 결과 (reversed 적용)
T2.4.17
n=1
n=2
n=3
n=4
n=5
n=6
T2.4.19
'python 및 머신러닝 > Coding The Matrix' 카테고리의 다른 글
| [Coding The Matrix] 코딩 더 매트릭스 - Chapter 3 벡터 (0) | 2015.08.18 |
|---|---|
| 파이썬을 사용하면서 발생한 이슈 (0) | 2015.08.17 |
| [Coding The Matrix] 코딩 더 매트릭스 - Chapter 1.6 역 인덱스 (0) | 2015.08.13 |
| [Coding The Matrix] 코딩 더 매트릭스 - 준비 (0) | 2015.08.13 |
| [Coding The Matrix] 코딩 더 매트릭스 - Chapter 1 함수 (1) | 2015.08.11 |