koodev

'분류 전체보기'에 해당되는 글 75건

  1. Group
  2. Unsigned Integer to String with Generics
  3. 크래머의 법칙 정리
  4. 아이폰-아이튠즈 사진 동기화 문제
  5. 증명(proof) 관련 용어 정리

Group

Math

정리를 안하니 계속 잊어먹게 된다. Artin Algebra에서 설명하는 Group 에 대해서 정리해본다.

Group을 한마디로 정의하면, 'law of composition 이 정의되어 있고 각 엘리먼트들은 그 안에서 inverse를 갖는 집합'이다. 책에서 사용하는 정의는 아래와 같다.

Definition. A group is a set G together with a law of composition which is associative and has an identityt element, and such that every element of G has an inverse.

예를 들어 0이 아닌 실수의 집합을 생각해보자. 이 집합의 law of composition을 곱셈이라고 정의하면, 각 원소 k의 inverse는 1/k가 된다. 따라서 이 집합과 law of composition은 Group이 될 수 있으며 수학책에서 보통 ℝ× 로 표기한다.

[A sumbol of the set of real numbers]

다른 예를 들면, 모든 실수의 집합에서 law of composition을 덧셈으로 정의해도 Group으로 만들 수 있다. 이 경우 각 원소 k의 inverse는 -k가 된다. 그리고 이 Group은 ℝ+ 으로 표기한다.

책에서 특히 중요하다고 소개하는 Group이 있는데, invertible 한 n × n matrix들의 집합으로서 law of composition이 matrix multiplication인 'General Linear Group' ‐ GLn 이다. 따라서 GLn은 아래와 같이 표기할 수 있다.

GLn = { n × n matrices A with det A ≠ 0 }.

'Math' 카테고리의 다른 글

Symmetric Group  (0) 2017.05.08
Abelian Group  (0) 2017.05.08
Group - Law of composition  (0) 2017.04.28
크래머의 법칙 정리  (0) 2017.03.19
증명(proof) 관련 용어 정리  (0) 2017.02.02

Unsigned Integer to String with Generics

Programming

Swift를 사용해서 부호없는 십진수를 십육진수 형태의 문자열로 바꾸는 Generics 함수를 작성한 내용을 기록한다.

Swift의 포인터를 공부하다가 십진수를 십육진수로 바꾸어 1바이트 단위로 보는 기능이 필요했다. 인터넷을 참고하여 String 클래스의 메소드를 사용하면 Decimal을 Hex로 바꿀 수 있었다.

http://stackoverflow.com/questions/24229505/how-to-convert-an-int-to-hex-string-in-swift

let dec = 10
let hex = String(dec, radix:16)
print("0x\(hex)") // 0xa

그런데 매번 이렇게 정수를 문자열로 바꾸어주는 표현식을 적기가 귀찮아서 함수로 만들어 보기로 했다.

func toHex(_ num: Int) -> String {
    let hex = String(num, radix: 16)
    return "0x\(hex)"
}

let dec = 10
print("\(toHex(dec))") // 0xa

이 함수를 가지고 아래와 같이 1바이트 부호없는 정수와 8바이트 부호없는 정수의 값을 찍어보았다. 당연히 타입이 안 맞으니 에러가 나왔다.

let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 8)
uint8Pointer.initialize(from: [0x37, 0x77, 0x11, 0x11, 0x02, 0x33, 0x39, 0x00])

let uint64Pointer = UnsafeMutableRawPointer(uint8Pointer).bindMemory(to: UInt64.self, capacity: 1)

let rawPointer = UnsafeMutableRawPointer(uint64Pointer)
var fullInteger = rawPointer.load(as: UInt64.self)
var firstByte = rawPointer.load(as: UInt8.self)

func toHex(_ num: UInt64) -> String {
    let hex = String(num, radix: 16)
    return "0x\(hex)"
}

print("8byte: \(toHex(fullInteger))")
print("1byte: \(toHex(firstByte))")

./pointer_test3.swift:22:23: error: cannot convert value of type 'UInt64' to expected argument type 'Int'
print("8byte: \(toHex(fullInteger))")
                      ^~~~~~~~~~~
                      Int(       )
./pointer_test3.swift:23:23: error: cannot convert value of type 'UInt8' to expected argument type 'Int'
print("1byte: \(toHex(firstByte))")
                      ^~~~~~~~~
                      Int(     )

그럼 타입을 맞춰주면 된다. 전달인자 목록의 Int 대신에 UInt를 넣어서 다시 해본다. 그렇지만 역시 에러가 나온다. UInt가 내부적으로 4바이트이면 UInt8, UInt64 어느 쪽과도 타입이 맞지 않는다. 그러면 타입을 맞추기 위해 함수를 2개 만들어야 할까? 2바이트, 4바이트 데이터에 대응하기 위해서는 4개를 만들어야 한다.

코드중복 문제를 해결하기 위해 Generics 라는걸 써보기로 했다. 'Generics는 C++ 템플릿 비슷한 것이니 전달인자 타입을 대충 T로 우겨 넣고 컴파일하면 되겠지'라고 생각하고 함수를 다시 작성해 보았다.

func toHex<T>(_ num: T) -> String {
    let hex = String(num, radix: 16)
    return "0x\(hex)"
}

./pointer_test3.swift:18:15: error: cannot invoke initializer for type 'String' with an argument list of type '(T, radix: Int)'
    let hex = String(num, radix: 16)

./pointer_test3.swift:18:15: note: expected an argument list of type '(T, radix: Int, uppercase: Bool)'
    let hex = String(num, radix: 16)

이번에는 String 클래스의 생성자가 동작을 안했다. 함수 밖에서와 같은 내용일텐데 함수 안에서는 제대로 동작하지 않는 걸까? Swift의 Generics는 C++의 템플릿과는 달리 타입 체킹을 더 엄격히 할 수 있다고 한다. T로 정의된 타입이 들어와도 이게 String 클래스의 생성자에 정의된 제약 조건에 의해서 아무 T나 받지 못하게 되어 있던 것이다.

https://developer.apple.com/reference/swift/string/1641688-init

String 클래스의 해당 생성자 문서를 보면 메소드가 아래와 같이 where로 지정된 제약 조건이 걸려 있다.

init<T>(_ value: T, radix: Int = default, uppercase: Bool = default) where T : UnsignedInteger

즉, T 타입은 아무 타입이 아니라 UnsignedInteger 여야 하는 것이다. 따라서 toHex 함수에도 똑같이 제약 조건을 달아주어야 한다.

func toHex<T>(_ num: T) -> String where T : UnsignedInteger {
    let hex = String(num, radix: 16)
    return "0x\(hex)"
}

print("8byte: \(toHex(fullInteger))") // 8byte: 0x39330211117737
print("1byte: \(toHex(firstByte))") // 1byte: 0x37

그러면 부호있는 정수를 Hex로 바꾸려면 어떻게 해야할까? 아쉽게도 이 경우는 함수를 하나 더 작성해야 한다. UnsignedInteger를 _SignedInteger 라는 제약 조건으로 대체하여 같은 함수를 하나 더 만들면 된다. String 생성자도 이런 코드 중복이 보인다. 어쩔 수 없는 듯.

https://developer.apple.com/reference/swift/string/1640980-init

'Programming' 카테고리의 다른 글

macOS에 emacs ggtags 설치 및 설정  (0) 2017.10.17
Xcode에 assimp 올리기  (0) 2017.06.06
OpenGL로 원 그리기  (1) 2017.05.27
Swift3 - result unused warning 없애기  (0) 2017.05.23
Swift - 튜플에 포인터로 접근하기  (0) 2017.05.14

크래머의 법칙 정리

Math

Artin Algebra 에서 설명하는 Crammer's Rule 을 정리해 보았다. 중간에 나온 Theorem의 증명은 생략했다.

Crammer's Rule 은 연립일차방정식(systems of linear equations)의 해를 행렬식(determinant)으로 구하는 방법이다. 이를 유도하기 위해 우선 아래와 같이 행렬 A의 행렬식을 j번째 column에 대한 expansion by minors 로 정리해보자.

(식1)... det A = (-1)j+1a1jdet A1j + (-1)j+2a2jdet A2j + ... + (-1)j+nanjdet Anj.

여기서 Aij는 행렬 A에서 i번째 row와 j번째 column을 제거한(crossing out) 행렬이다. 위 식에 αij = (-1)i+j det Aij 를 넣어서 단순화 시켜보자.

(식2)... det A = a1j α1j + a2j α2j + ... + anj αnj.

(식2)를 잘 기억해 두고, 다음에는 adjoint 를 정의해 보자. 행렬 A의 adjoint 란 n × n 행렬로 (i,j)의 entry인 (adj)ij 가 (-1)i+j det Aji 인 행렬이다. 즉, αji 이며, 아래와 같이 transpose의 형태로도 표현할 수 있다.

(adj A) = (αij)t

adjoint 의 예를 몇개 더 들어보자. 아래는 2 × 2 행렬의 adjoint 이다.

adj  
ab
cd
  =  
d-b
-ca

그리고 아래의 3 × 3 행렬의 경우이다.

adj  
112
021
102
  =  
41-2
-201
-3-12
  t   =  
4-2-3
10-1
-2-12

이번에는 아래 Theorem 과 Corollary 를 살펴보자.

Theorem. δ = det A 라고 하자. 그러면,

(adj A) ⋅ A = δ I, and A ⋅ (adj A) = δ I.

Corollary. 행렬A의 행렬식 δ 가 0이 아니라면,

A-1 =
1 δ
(adj A).

위의 Corollary 를 사용하여 고등학교때 외웠던 2 × 2 행렬의 행렬식을 유도해낼 수 있다. 즉,

det  
ab
cd
  =  
1 ad - bc
 
d-b
-ca
 .

그리고 앞서 나왔던 3 × 3 행렬의 determinant는 1인데, 해당 행렬과 adjoint 행렬을 곱해보면 3 × 3 의 identity matrix가 나온다.

이어서 연립방정식의 해를 행렬로 구하는 경우를 생각해보자. AX = B 의 형태의 식을 떠올릴 수 있고 양변에 행렬 A의 역행렬을 곱해주고 위의 Corollary를 가져온다고 했을 때,

X = A-1B =
1 δ
(adj A) B,
where δ = det A.

위와 같은 형태가 된다. 그리고 우변의 식은 B가 column vector 이기에 j번째 (row의) 변수 xj를 아래와 같이 풀어쓸 수 있다.

xj =
1 δ
(adj A)j [ b1 b2 ... bn ]t
    =
1 δ
((-1)1+j det A1j b1 + (-1)2+j det A2j b2 + ... + (-1)n+j det Anj bn )
    =
1 δ
(b1α1j + ... + bnαnj)

(식3)... xj =
1 δ
(b1α1j + ... + bnαnj)

(식3)의 괄호안 (b1α1j + ... + bnαnj) 을 살펴보면 (식2) 와 무척 닮았음을 알 수 있다. 즉, (식2) 에서 aij 을 bi 로 바꾸면 똑같게 되는 것이다. 여기서 발견한 내용을 사용해보자.

행렬 A의 j번째 column을 column vector B로 치환한 행렬을 Mj 라고 하자. Mj 의 determinant를 expansion by minors 로 표현하면 아래와 같다.

(식4)... det Mj = (b1α1j + ... + bnαnj)

이 식이 왜 말이 되는지는 α 의 정의와 아래 그림이 참고가 되면 좋겠다.

(식3)과 (식4)를 조합하면, 아래와 같이 j번째 X를 구할 수 있고, 이게 Crammer's Rule 이 되겠다.

xj =
det Mj det A

끝으로 이걸 구체적으로 어떻게 응용하는지는 아래 링크에서 참고하면 되겠다.

http://egloos.zum.com/eyestorys/v/3544617

'Math' 카테고리의 다른 글

Symmetric Group  (0) 2017.05.08
Abelian Group  (0) 2017.05.08
Group - Law of composition  (0) 2017.04.28
Group  (0) 2017.04.28
증명(proof) 관련 용어 정리  (0) 2017.02.02

아이폰-아이튠즈 사진 동기화 문제

Computer

아이폰과 아이튠즈 사진 동기화가 안되는 문제를 해결하여 그 내용을 기록해 둔다.

아이폰으로 찍은 사진을 macOS의 사진 프로그램(Photos)에 넣어놓고 아이폰의 사진(카메라롤)은 삭제한 다음에 동기화를 시키려 하면 언젠가부터 아래와 같은 대화상자가 나타나면서 진행이 되지 않고 있었다(한글로는 어떤 내용인지 기억이 나지 않는다).

원인은 사진 라이브러리 디렉토리(*.photoslibrary)에 대한 권한이 충분치 않아서인 것으로 보인다. 그래서 해당 디렉토리의 권한을 설정해주면 된다. 그런데 내 경우 이미 권한은 넣은 상태였는데 그냥 권한을 확인하는 것만으로도 해결되었다. 권한 확인을 하면 뭔가 설정을 다시 읽어오는듯 하다. 버그인듯.

권한을 확인하려면,

  1. Finder에서 '그림'(Pictures) 디렉토리로 간다음에
  2. '사진 라이브러리'에 우클릭하여 '정보 가져오기' 클릭
  3. 그리고 나오는 창에서 우하단에 누런색 자물쇠 아이콘 클릭
  4. 권한에 문제가 있으면 수정하면 된다. 본인 계정으로 읽기/쓰기 권한이 있어야 한다.
  5. 혹시 몰라서 'iPhoto 라이브러리'에도 같은 작업을 해 주었다.

그리고 관련 프로그램들(사진, 아이튠즈)을 재시작해주고 아이폰을 다시 연결하여 동기화를 진행하면 된다.

참고: https://discussions.apple.com/thread/6831863?tstart=0

증명(proof) 관련 용어 정리

Math

Abstract Algebra 책에 증명 관련 용어들을 정리해 놓은 챕터가 있어서 한글로 정리해 본다.

이론 수학에서는 axiomatic approach 라는 방식을 사용한다. 이는 어떤 오브젝트들을 모아 놓고 이것을 S라고 한다음 이들에 대한 룰(rule)을 가정하는 것이다. 여기서 말하는 룰들을 axioms(공리) 라고 한다. S에 대한 axiom 들과 논리적인 방식들을 가지고 S에서 또다른 정보들을 추출해낼 수 있다. axiom 들은 또한 일관성이 있어야 한다. 즉, axiom 들은 서로를 부정해서는 안된다. 어떤 시스템에서 axiom 들이 지나치게 제한적이라면 이 시스템으로부터 나올 수 있는 수학적인 예문(examples of the methematical structure)이 별로 없을 것이다.

논리학이나 수학에서 statement(명제) 란 참이나 거짓을 판별할 수 있는 문장을 말한다. 아래 예제를 살펴보자.

  • 3 + 56 - 13 + 8/2.
  • All cats are black.
  • 2 + 3 = 5.
  • 2x = 6 exactly when x = 4.
  • If ax2 + bx + c = 0 and a ≠ 0, then
    x =
    -b ± √b2 - 4ac / 2a
  • x3 - 4x2 + 5x - 6.

위에서 첫번째와 마지막을 빼놓고는 모두 참이나 거짓이 되는 statement이다.

수학적인 증명이란 어떤 statement의 참/거짓에 대하여 확인하는 작업(argument)일 뿐이다. 이러한 작업은 독자(audience)가 이해할 수 있도록 부연설명이 충분해야 한다.

"10/5 = 2" 라는 간단한 statement가 있다. 그런데 수학자들은 보다 복잡한 statement에 관심을 갖는다. 예를 들어 "p이면 q이다" 이런 것들이다(p와 q는 statement). 만일 어떤 statement가 참인 것으로 알려졌거나 그렇게 가정할 수 있을 경우, 이와 관련된 다른 statement들은 참인지 거짓인지에 대해서도 알고 싶을 것이다. 여기서 p를 hypothesis(가설) 라고 부르고 q를 conclusion(결론) 이라고 부른다. 다음 statement를 살펴보자: If ax2 + bx + c = 0 and a ≠ 0, then

x =
-b ± √b2 - 4ac / 2a

여기서 hypothesis는 ax2 + bx + c = 0 and a ≠ 0 이고, conclusion은 아래와 같다.

x =
-b ± √b2 - 4ac / 2a

위의 전체 statement(즉, "p이면 q이다"의 형태의 큰 statement)를 가지고는 hypothesis가 참인지 거짓인지에 대해서 알 수 없다. 하지만 전체 statement가 참이고 hypothesis인 ax2 + bx + c = 0 and a ≠ 0 가 참임을 보여줄 수 있다면 conclusion은 무조건 참이다. 이 statement는 아래와 같이 몇 개의 방정식으로 증명할 수 있다:

ax2 + bx + c = 0
x2 +
b/a
x + c = -
c/a

x2 +
b / a
x + (
b / 2a
)2 = (
b / 2a
)2 -
c / a

( x +
b / 2a
)2 =
b2 - 4ac / 4a2

x +
b / 2a
=
± √b2 - 4ac / 2a

x =
-b ± √b2 - 4ac / 2a

어떤 statement가 참인것을 증명하면, 그 statement를 proposition(참인 명제) 라고 부른다. proposition 중에서도 아주 중요한 것을 theorem(정리) 라고 한다. 때로는 theorem이나 proposition을 한번에 증명하기보다는 여러 모듈로 나누어서 진행한다. 즉, 여러개의 작은 proposition들을 증명하는 것인데, 이것들을 lemma(보조정리) 라고 한다. lemma들을 이용해서 전체 증명을 하는 것이다. 그리고 또 가끔씩 proposition이나 theorem을 증명하다가 연관된 다른 proposition들을 내놓기도 하는데 이들을 corollary(따름정리) 라고 한다.

용어 한글 번역

  • axiom: 공리
  • statement: 명제
  • hypothesis: 가정
  • conclusion: 결론
  • proposition: 참인 명제(한글책에서는 그냥 명제라고함)
  • theorem: 정리
  • lemma: 보조정리
  • corollary: 따름정리, 추론

참고

'Math' 카테고리의 다른 글

Symmetric Group  (0) 2017.05.08
Abelian Group  (0) 2017.05.08
Group - Law of composition  (0) 2017.04.28
Group  (0) 2017.04.28
크래머의 법칙 정리  (0) 2017.03.19