koodev

'전체 글'에 해당되는 글 75건

  1. Cyclic subgroup
  2. Swift - 튜플에 포인터로 접근하기
  3. Subgroup of ℤ+

Cyclic subgroup

Math

Cyclic subgroup 역시 group 챕터에서 자주 등장하는 개념이다.

group G의 임의의 엘리먼트 x를 가지고 cyclic subgroup 이란 것을 생성(generate)해낼 수 있다. 여기서는 곱셈을 law of composition 으로 표기할 것이다. x에 의해 생성되는 cyclic subgroup H는 아래와 같이 x를 거듭 composition한 것이다.

H = {..., x-2, x-1, 1, x, x2, ...}

이것은 x를 포함하는 가장 작은 G의 subgroup 이 된다. 그리고 또한 주목해야하는 내용은 xn이 group G의 엘리먼트 중 하나를 나타낸다는 것이다.

x를 거듭 composition 하다보면 반복이 일어날 수도 있다. 예를 들어 x = 1 이면 모든 엘리먼트들은 1이 된다. 반복성을 가지고 경우를 나누어 보면 1) 모든 x의 거듭 composition이 다를 경우와 2) 그렇지 않은 경우로 나뉜다. 전자의 경우 group Hinfinite cyclic 이라고 부른다.

반복성을 띌 경우를 생각해 보자. 예를 들어 xn = xm 일 경우 n > m 이라면 xn - m = 1 이 된다. 이는 곧 x의 0이 아닌 거듭제곱이 1이 된다는 뜻이다. 이와 관련하여 아래 Lemma를 살펴보자.

Lemma. xn = 1 인 n 으로 이루어진 집합 S는 ℤ+의 subgroup 이다.

Proof. xm = 1 이고 xn = 1 이라면 xm+n = xmxn = 1 이 된다. 따라서 m, nS 이라면 m + nS 이다. 이는 subgroup의 첫 번째 axiom(Closure: If a ∈ H and b ∈ H, then ab ∈ H)을 만족한다. 또한 x0 = 1 이기 때문에 두 번째 axiom(Identity: 1 ∈ H)도 만족한다. 마지막으로 xn = 1 이라면 x-n = xnx-n = x0 = 1 이다. 따라서 nS 라면 또한 −n ∈ 이 된다(끝).

위의 Lemma와 ℤ+의 subgroup이 bℤ 의 형태를 갖는다는 Proposition을 상기하면서 S = mℤ 인 group을 만들 수 있다. 여기서 mxm = 1 인 가장 작은 양의 정수이다. S에서 m 개의 엘리먼트들 1,x,...,xm-1 은 모두 서로 다르다. 그리고 x의 거듭 composition인 xn 들 중에서는 서로 같은 것들이 존재한다. 나머지(remainder) 표현식으로 정리하면 n = mq + r 이 되는데 나머지(reminder) r은 나눔수인 m 보다 작다. 이걸 다시 지수표현식으로 정리하면, xn = (xm)qxr = xr 이 된다(xm = 1). 따라서 group H는 아래와 같이 m개의 엘리먼트로 구성된다.

H = {1, x, ... , xm - 1}, these posers are distinct, and xm = 1

위와 같은 group을 'cyclic group of order m' 이라고 부른다.

어떤 group G의 order는 그러니까 엘리먼트의 갯수이다. order는 아래와 같이 절대값을 쓸때와 같은 형식으로도 표기한다.

| G | = number of elements of G

order는 물론 무한대가 될 수도 있다.

그리고 어떤 group의 엘리먼트가 order m을 갖는다는 말은 그 엘리먼트가 생성(generate)하는 cyclic subgroup이 order m 을 갖는다는 뜻이다. 그러면 mxm = 1 인 가장 작은 양의 정수가 된다.

예를 들어 행렬

11
-10
  은 GL2(ℝ) 에서 order 6인 엘리먼트이다. 즉, 이 행렬이 생성(generate)하는 cyclic subgroup은 order 6을 갖는다. 그러나 행렬
11
01
  은 무한대의 order인 엘리먼트이다. 왜냐하면 아래와 같이 거듭 composition이 계속해서 다른 값을 생성해내기 때문이다.

n power of
11
01
  =
1n
01

'Math' 카테고리의 다른 글

Isomorphism (2)  (0) 2017.05.17
Isomorphisms (1)  (0) 2017.05.16
Subgroup of ℤ+  (0) 2017.05.11
Subgroups  (0) 2017.05.11
Symmetric Group  (0) 2017.05.08

Swift - 튜플에 포인터로 접근하기

Programming

상황은 이렇다. GLKMatrix4glUniformMatrix4fv()를 사용하려 한다. 문제는 GLKMatrix4가 Float 배열로 이루어진 게 아니라 16개짜리 튜플로 이루어져 있다는 점이다. 배열로 된 경우 자동으로 C포인터로 변환되어 C API에다 사용할 수 있지만 튜플일 경우 그럴 수가 없다. 참고로 여기를 보면 과거에는 GLKMatrix4의 내부 데이터가 튜플이 아니라 배열이었던 것 같다. 참고로 현재 내가 사용중인 Swift 버전은 3.1 이다.

즉, 아래와 같이 하면 컴파일 에러가 난다는게 문제다.

var trans: GLKMatrix4 = GLKMatrix4Identity
// trans에 조작 blah blah...
glUniformMatrix4fv(self.transformLoc, 1, GLboolean(GL_FALSE), &trans.m)

찾아낸 방법은 ios - pass a 4x4 matrix to glUniformMatrix4fv 이다. 요약하면 우선 튜플을 포인터로 변환하고(withUnsafePointer), 그 포인터를 다시 Float 포인터로 변환하는 것이다(withMemoryRebound).

withUnsafePointer는 입력된 변수를 그 타입의 포인터로 변환하여 클로저로 넘겨준다. 그리고 변환된 포인터는 클로저 밖에서는 쓸 수 없다.

withUnsafePointer(to: &trans.m) {
// 이제 $0로 넘어온 포인터로 뭔가를 조작하자
}

클로저 안으로 넘어온 인자의 타입은 UnsafePointer<(Float, Float,...)> 이다(튜플의 포인터: Pointee가 튜플임). 그런데 사용하려는 API의 입력 타입은 UnsafePointer<Float> 이므로 또 다시 변환해주어야 한다.

어떤 포인터를 다른 Pointee 타입의 포인터로 변환하기 위해 withMemoryRebound 메소드를 사용한다. 접근 가능한 갯수도 지정해 줄 수 있는데 원래는 접근할 갯수(16)를 정확히 넣어주어야 하겠지만 API가 포인터 하나만 쓸 것이므로 1을 주어도 상관없다. 모두 정리하면 아래와 같이 쓰면 동작한다.

withUnsafePointer(to: &trans.m) {
    $0.withMemoryRebound(to: Float.self, capacity: 16) {
        glUniformMatrix4fv(self.transformLoc, 1, GLboolean(GL_FALSE), $0)
    }
}

위와 같이 써도 좋지만 조금 더 직관적인 방법이 있다. 위에서 튜플 데이터에 대한 포인터를 만들기 위해 withUnsafePointer()를 썼는데, 이는 튜플 데이터를 바로 UnsafePointer 형태로 만드는게 불가능해서였다. 그런데 대상 데이터 변수를 UnsafeMutablePointer로 감싸는 것은 가능하다.

UnsafeMutablePointer는 UnsafeRawPointer로 변환할 수 있는데 UnsafeRawPointer는 bindMemory() 메소드를 사용할 수 있다. bindMemory()는 원하는 데이터형(Pointee)의 포인터로 바꾸어준다. 즉, 아래와 같이도 쓸 수 있다. 블록 없이 쓸 수 있어서 개인적으로 이 방식이 더 마음에 든다.

let m = UnsafeMutablePointer(&trans.m)
let p = UnsafeRawPointer(m).bindMemory(to: Float.self, capacity: 16)
glUniformMatrix4fv(self.transformLoc, 1, GLboolean(GL_FALSE), p)

물론 이걸 with절로 묶어서 쓸 수도 있다. 그런데 with절로 묶었을 때 들어오는 포인터(주소)값이 그냥 UnsafeMutablePointer로 감쌌을 경우의 포인터값과 다른 것으로 보아 with절을 쓰면 카피가 일어나는 것 같다.

withUnsafeMutablePointer(to: &trans.m) {
    m in
    let p = UnsafeRawPointer(m).bindMemory(to: Float.self, capacity: 16)
    glUniformMatrix4fv(self.transformLoc, 1, GLboolean(GL_FALSE), p)
}

'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
Unsigned Integer to String with Generics  (0) 2017.04.23

Subgroup of ℤ+

Math

이번에는 덧셈을 law of composition으로 하는 정수 group인 ℤ+ 의 subgroup 들을 살펴보자. 우선 특정 정수 b의 배수로 이루어진 ℤ+ 의 subgroup은 아래와 같이 쓸 수 있다.

bℤ = {n ∈ ℤ | n = bk for some k ∈ ℤ}.

그러면 여기서 (놀랍게도!)+ 의 모든 subgroup은 위와 같은 형태가 된다는 명제가 하나 나온다.

Proposition. 모든 정수 b에 대해서 부분집합(subset) bℤ 는 ℤ+의 subgroup이다. 게다가 (심지어)+의 모든 subgroup H는 'H = bℤ for some integer b' 이렇게 쓸 수 있다!

책에서는 bℤ가 ℤ+의 subgroup이라는 것에 대한 증명은 생략하고 모든 subgroup이 bℤ 와 같은 형태라는 것만 증명한다.

우선 H를 ℤ+의 subgroup이라고 하자. law of composition이 덧셈이고, identity 엘리먼트는 0이고, 엘리먼트 a의 inverse는 −a 이므로 아래와 같은 axiom(룰) 들을 정리할 수 있다.

  1. if aH and bH, then a + bH;
  2. 0 ∈ H;
  3. if aH, then −aH.

두 번째 axiom 에 의해서 0이 H의 유일한 엘리먼트일 경우(자명한 subgroup {0}), H = 0ℤ 이므로 해당 명제는 만족한다.

그리고 aHa가 음수이든 양수이든 세 번째 axiom에 의해서 −aH에 포함된다.

그리고 H에서 가장 작은 양의 정수를 뽑아서 H = bℤ 라고 해보자. 이것을 다르게 표현하면 양의 정수 k에 대해서 bk = b + b + ... + b (k 번 반복) 이 된다. 이를 첫 번째 axiom 과 induction을 사용하면 bkH의 엘리먼트임을 만족하게 된다. k가 음수인 경우는 -bk 이므로 역시 H의 엘리먼트임을 만족한다(세 번째 axiom).

마지막으로 Hbℤ 인 것을 보이자. 이 말은 H의 모든 엘리먼트 nHb의 배수인 정수라는 말이다. nb의 배수와 나머지 형태로 수식으로 표현하면 아래와 같이 쓸 수 있다.

n = bq + r

여기서 q, r 은 정수이고 나머지(remainder)인 r은 0 ≤ r < b 의 범위를 갖는다. 그러면 nbq는 모두 H의 엘리먼트이다(위의 내용과 이어지니 잘 따라오자). 그리고 위 식을 r에 대하여 고쳐쓰면 r = n - bq 가 되는데 이것 역시 첫 번째 axiom과 세 번째 axiom에 의하여 H의 엘리먼트가 된다. 또한 bH에서 가장 작은 양의 정수라고 정했고 0 ≤ r < b 이니 r = 0 이고 n = bqbℤ 이다(끝).

한편, subgroup bℤ는 b로 나누어 떨어지는 정수들이다. 그렇다면 여기서 두 정수 ab를 정하고 ab로 생성되는 subgroup을 만들어 볼 수 있을 것이다. 책에서는 'subgroups which are generated by two integers a, b' 라고 표현한다. 즉 아래 집합은 ℤ+의 subgroup 이다.

aℤ + bℤ = {n ∈ ℤ | n = ar + bs for some integers r, s}

위와 같은 형태로 구성된 subgroup을 subgroup generated by a and b 라고 한다. 이런 subgroup은 두 엘리먼트를 모두 포함하는 가장 작은 규모의 subgroup 이다.

앞의 proposition을 잠시 떠올려보면(bℤ 형태의 subgroup) aℤ + bℤ 이것도 어떤 정수 d 에 의해서 dℤ 로 표현될 수 있다(ℤ+의 subgroup이기 때문에). 즉 d 로 나뉘어 떨어지는 정수들의 집합인 것이다. 여기서 d는 'greatest common divisor of a and b'라고 불린다. 이어서 아래 proposition을 살펴보자.

Proposition. a, b를 0이 아닌 정수라고 하자. 그리고 d는 subgroup aℤ + bℤ 를 generate하는 양의 정수라고 하자. 그러면,
  1. d can be written in the form d = ar + bs for some integers r and s.
  2. d divides a and b
  3. If an integer e divides a and b, it also divides d

위 proposition을 증명해보자. 우선 첫 번째 assertion은 d가 subgroup aℤ + bℤ 의 generator 라고 한 사실을 다시 적은 것일 뿐이다. 두 번째는 dℤ = aℤ + bℤ 이기 때문에 dab를 나눌 수 있다. 마지막으로 eab를 나눌 수 있다면 abeℤ 의 형태가 된다. 이 말은 어떤 정수 n = ar + bseℤ 에 포함된다는 이야기이고, d역시 이러한 형태이기 때문에 ed를 나눌 수 있게된다(끝).

'Math' 카테고리의 다른 글

Isomorphisms (1)  (0) 2017.05.16
Cyclic subgroup  (0) 2017.05.15
Subgroups  (0) 2017.05.11
Symmetric Group  (0) 2017.05.08
Abelian Group  (0) 2017.05.08