koodev

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

  1. Congruence Relation & Coset
  2. Equivalence relations (3) - fibres
  3. Xcode에 assimp 올리기

Congruence Relation & Coset

Math

Equivalence Relation in Homomorphism = Congruence Relation = Coset

들어가기에 앞서 Homomorphism에 대해 복습해보자.

Group GG'이 있을 때, Homomorphism이란 φ: GG' 매핑으로 다음 룰을 만족한다: φ(ab) = φ(a)φ(b)

매핑 φ:GG'을 Homomorphism 이라고 하자. 여기서 매핑 φ에 의해 G에 Equivalence Relation이 존재하는지를 살펴보자. 이는 Homomorphism에 fibres가 존재하는지를 알아보는 것이기도 한다. 이 경우, 즉 Homomorphism인 φ에서 아래와 같이 Equivalence한 조건일 경우를 Congruence 라고 하고, 기호로는 ~(tilde) 가 아닌 ≡(삼지창등호?) 으로 표기한다.

ab   if   φ(a) = φ(b)

예를 들어 φ:ℂ× ⟶ ℝ× 가 φ(a) = | a | 으로 절대값을 취하는 Homomorphism 매핑 이라고 하자. 이걸로 정의된 Equivalence Relation에 의하면 | a | = | b | 일 경우 ab 이게 된다. 여기에서 fibres는 아래 그림과 같은 Concentric Circles(동심원)이 된다. 그리고 이들 fibres는 매핑된 이미지 im φ(양의 실수들의 집합)와 bijective한(일대일대응) 관계를 갖는다.

Congruence Relation을 정의하는 것은 앞서 나온 ' ab   if   φ(a) = φ(b) ' 외에도 다른 방법들이 많은데 이들 중 이번에 소개하는 내용이 가장 중요하다.

Proposition. φ:GG'을 Group Homomorphism 이며, Kernel N을 갖고, abG의 엘리먼트라고 하자. 그러면 φ(a) = φ(b) 라는 것은 반드시(if and only if) nN인 어떤 엘리먼트 n에 대하여 b = an 이어야 한다. 또는 같은 의미로 a-1bN 이어야 한다.

Proof. φ(a) = φ(b) 라고 하자. 그러면 φ(a)-1φ(b) = 1 이고, φ가 Homomorphism 이기 때문에 아래 두 식을 사용하면,

φ(ab) = φ(a)φ(b)
φ(a-1) = φ(a)-1 ... since a group homomorphism carries the identity to identity and inverses to inverses

φ(a-1b) = 1 이렇게 쓸 수 있다. 그리고 Kernel의 정의를 다시 떠올려보자. Kernel NxG 에서 φ(x) = 1 인 모든 엘리먼트 x를 말한다. 따라서, φ(a-1b) = 1 라는 것은 곧 a-1bN 이며, a-1b = n (for some nN) 이 된다. 바꾸어 말하면, 만일 b = an 이고, nN 일 경우, φ(b) = φ(a)φ(n) = φ(a)1 = φ(a) 가 된다(끝).

여기서 an 과 같은 형태(어떤 엘리먼트와 Kernel 중의 한 엘리먼트와의 composition)를 갖는 엘리먼트들의 집합을 Coset of N in G 라고 하고, aN 이렇게 쓴다.

aN = { gG | g = an for some nN}

즉, Coset aN은 Group 내에서 a와 Congruent한 모든 엘리먼트 b가 된다.

한편, Congruence Relation 인 ab는 Group G를 Partition 하여 Congruence Class로 만든다. 결국 이 Congruence Class가 Coset aN 이다. 이 Coset 들은 φ 매핑의 fibres 이다. 위의 예제 그림 5.12 에서 보이는 각각의 동심원들이 바로 절대값으로 매핑되는 Homomorphism의 Coset 들인 것이다.

그런데 만일 어떤 Homomorphism에서 Kernel이 Trivial Subgroup, 즉 1 ⟶ 1' 하나로 구성된 경우라면 어떨까?

Corollary. 어떤 Group간 Homomorphism φ:GG'가 Injective 할 경우 반드시(if and only if) Kernel은 Trivial Subgroup인 {1} 이 된다.

Injective란 우리말로 단사함수이며 f(x1) = f(x2) 일 경우는 반드시 x1 = x2 이며, x2x2 이면 f(x1) ≠ f(x2) 가 되는 함수이다. 위의 그림에서 aN이 φ(a)로 대응되는데 Kernel이 한개뿐이라면 당연히 단사함수가 될 것이다.

위의 Corollay를 가지고 어떤 Homomorphism이 Isomorphism인지를 검증할 수 있다. Isomorphism은 양방향이며 Bijective 해야 한다. 즉, ker φ = {1} 이라면, 그 φ는 Injective 할 것이고, 또한 im φ = G' 이 될 것이다. 즉, φ 는 Surjective(전사함수: 치역과 공역이 같음)한 것이다. Injective하고 Surjective하니 Bijective할 것이고 Homomorphism이니 결국은 Isomorphism이 되겠다.

'Math' 카테고리의 다른 글

Lagrange's Theorem과 Counting Formular  (0) 2017.06.22
Subgroup으로 생성되는 Left Coset  (0) 2017.06.16
Equivalence relations (3) - fibres  (0) 2017.06.08
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Equivalence relations (1)  (0) 2017.05.31

Equivalence relations (3) - fibres

Math

이전 포스팅의 내용을 다시 생각해보면, 어떤 매핑함수 φ:ST 가 정의역(domain) S에서 Equivalence Relation을 형성한다고 했을 때, φ(a) = φ(b) 이라는 것은 a ~ b 임을 의미한다. 매핑함수가 서로 Equivalence Class 임을 판별하는데 쓰이는 것이다. 이렇게 φ 매핑에 의해서 Equivalence Relation이 형성되었을 때 이것을 the Equivalence Relation determined by the map 이라고 한다.

매핑에는 Inverse(역사상)도 있을 수가 있다. 위의 경우에는 T의 엘리먼트에 대응되는 S쪽 Partition이 Inverse 이미지가 된다. 즉, 엘리먼트 tTInterse Image는 모든 엘리먼트 s가 아래와 같은 S의 부분집합이 되게 된다.

φ-1(t) = {sS | φ(s) = t}

즉, φ-1(t)은 정의역(domain)이었던 S의 부분집합이 된다. 이러한 표현은 단지 표현방식일 뿐이고 여기서 φ-1은 함수가 아니다. 출력이 여러 엘리먼트가 될 수도 있기 때문이다. 이렇게 나오는 Inverse Image들을 fibres of the map φ 라고 부른다. Nonempty인 fibres φ-1(t) 라는 것은 t가 φ의 Image이며, S의 Partition을 형성한다는 것을 의미한다. 여기서 Nonempty fibres 들의 집합인 Equivalence Class S 는 φ 매핑의 이미지 im φ 를 만들어 낼 수도 있다.

φ:S ⟶ im φ

위의 매핑은 일대일매핑(bijective)으로 S의 엘리먼트 s를 φ(s)로 보내는 매핑이다. 이건 φ:ST 와 같아보일수도 있지만 입력이 개별 엘리먼트인 s단위가 아니라 fibres인 s단위이다.

한편, fibres는 영국식 표현이라고 한다. 미국식으로는 fiber 라고하며, 우리말로는 올다발이다.

'Math' 카테고리의 다른 글

Subgroup으로 생성되는 Left Coset  (0) 2017.06.16
Congruence Relation & Coset  (0) 2017.06.10
Equivalence relations (2) - Bar 표현식  (0) 2017.06.02
Equivalence relations (1)  (0) 2017.05.31
Homomorphisms (2): image, kernel and normal subgroup  (0) 2017.05.24

Xcode에 assimp 올리기

Programming

OpenGL 3D 모델 관련 코드를 연습해보다가 웹에 공유된 모델 데이터를 코드로 읽어들이는 작업이 필요하게 되었다. 참고하고 있는 문서에서는 assimp 외부 라이브러리를 사용하고 있었는데, 윈도우 기반으로 설명하고 있어서 Xcode에 적용하는 방법은 직접 알아낼 수 밖에 없었다. 이 포스트에서는 Xcode에 MacOS용 assimp를 적용하는 방법을 정리한다.

아래는 assimp 라이브러리를 사용하여 nanosuit.obj 를 읽어들여 렌더링한 결과이다. 텍스처는 아직 연결하지 못했다.

한편, 애플은 ModelIO 라는 API를 제공하고 있었는데 나한테는 assimp보다 사용성이 직관적이지 않고 이해하고 적용하기까지 많은 시간이 걸리는 듯 하여 포기했다.

Assimp 다운로드

assimp 페이지를 방문하여 코드를 다운로드 받는다. 나는 최신 버전을 git으로 받았다.

git clone git://github.com/assimp/assimp.git

Cmake 설치

Assimp를 빌드하려면 Cmake를 설치해야 한다. GUI버전을 다운로드 받아도 될지 모르겠지만, 나는 brew를 사용하여 설치했다.

brew install cmake

Assimp 빌드

여기서부터 좀 삽질을 했었는데, 그냥 Cmake를 돌리면 컴파일러가 지정되어 있지 않다는 등 알 수 없는 에러가 나온다. 아래는 assimp 소스 폴더에서 cmake CMakeLists.txt -G "Xcode" 를 실행했을 때 나왔던 에러이다.

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:38 (PROJECT):
  No CMAKE_C_COMPILER could be found.



CMake Error at CMakeLists.txt:38 (PROJECT):
  No CMAKE_CXX_COMPILER could be found.



-- Configuring incomplete, errors occurred!
See also "/Users/koodev/Workspace/Source/assimp/CMakeFiles/CMakeOutput.log".
See also "/Users/koodev/Workspace/Source/assimp/CMakeFiles/CMakeError.log".

GUI 버전의 Cmake를 돌려도 비슷한 에러가 뜬다. 나한테 유효했던 해결책은 아래와 같이 xcode-select 로 developer tool의 기준이 되는 경로를 지정해 주는 것이다. 이 방법을 알아내는데 참고한 사이트는 다음과 같다: https://github.com/nodejs/node-gyp/issues/569#issuecomment-255589932

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
cmake CMakeLists.txt -G "Xcode"

그러면 한동안 빌드가 돌아가고 Assimp.xcodeproj 도 나온다. 내 Mac에 Xcode는 한번밖에 설치한 적이 없을텐데 왜 이게 문제가 되었는진 모르겠다. 힘들게 빌드는 했지만 잘 이후에도 큰 난관이 2개나 더 있었다.

프로젝트에 Assimp 가져오기

Xcode에 외부 라이브러리를 추가하는 방법은 두 가지 정도가 될 수 있을 것 같다. 하나는 해당 라이브러리를 Sub Projext로 구성하는 것이고, 다른 하나는 직접 라이브러리 파일을 추가하는 것이다. 앞의 방식을 사용하면 디버깅을 할 수 있다는 장점이 있다. (뭐가 쉬울까) 고민 끝에 나는 뒤의 방식으로 진행했다.

우선 프로젝트 루트 폴더 밑에 assimp라는 폴더를 만들고 여기에 assimp 소스의 include 폴더와 lib/Debug 폴더를 가져와 아래와 같이 구성한다. lib 폴더에 assimp의 lib/Debug 안에 있는 .a파일과 링크들을 넣었다.

.
├── OpenGLScratch
├── OpenGLScratch.xcodeproj
└── assimp
    ├── include
    │   └── assimp
    │       ├── Compiler
    │       └── port
    │           └── AndroidJNI
    └── lib

그리고 Finder를 열어 assimp 폴더를 Xcode로 그래그하여 옮긴다. 아래와 같은 상태로 만드는 것이다.

프로젝트의 Build Phases - Link Binary With Libraries로 가보면 Xcode가 친절하게도 방금 전에 추가한 라이브러리들을 링크하게 설정해 놓았다.

그치만 헤더 파일의 경로는 자동으로 잡아주지 않기 때문에 이것을 직접 해 주어야 한다. Build Settings - Header Search Paths 에 있다.

끝?

이제 프로젝트에서 assimp라는 외부 라이브러리를 사용할 수 있는 상태가 된 것이다. 하지만 코드에서 assimp를 쓰기 위해서 해야 할 일이 좀 더 있다. assimp 인터페이스가 C++ 이기 때문에 Objective-C++ 로 wrapper 인터페이스를 만들어야하고, Swift를 사용할 경우에는 Bridging Header에 새로 만든 wrapper 헤더를 넣어주어야 한다.

참고