# 8. 함수

## 8.1. 함수의 개념

### 8.1.1. 함수 정의

```
def
집합 A, B에 대해 집합 A에서 B로 가는 관계가 성립할 때, A의 원소 a에 대해 B의 원소 b 하나가 대응 되는 관계
```

**관계와의 차이** 관계는 한마디로 A의 모든 원소와 B의 모든 원소가 어떻게든 엮어만 있으면(관계는 곱집합의 부분집합이다!) 성립하는 것이고, 함수는 a에 대해 딱 하나의 b로만 가야 성립한다.

다음 표를 보자

| 한글(가,나,다) 동물(강아지,냐옹이,다람쥐,레서팬더) | is관계?     | is함수?       |
| ------------------------------ | --------- | ----------- |
| (가,가), (냐옹이,냐옹이)               | X         | X           |
| (가, 강아지), (냐옹이,냐옹이)            | X         | X           |
| (나, 냐옹이), (나, 레서팬더)            | O(한글->동물) | X           |
| (나, 냐옹이), (다, 냐옹이)             | O         | X           |
| (나, 냐옹이), (다, 레서팬더)            | O         | X           |
| (나, 다람쥐), (다, 다람쥐), (가, 다람쥐)   | O         | O(f:한글->동물) |
| (나, 냐옹이), (다, 다람쥐), (가, 레서팬더)  | O         | O           |

어떤 인풋은 아웃풋이 없는 함수가 말이 안되니깐!

### 8.1.2. 함수의 몇가지 용어들

```
def
집합 A에서 B로 가는 함수 f:A->B에 대해,
원상, preimage : 집합 B의 원소 b와 대응하는 집합 A의 원소 a (*그니까 출발지, input)
상, image : 집합 A의 원소 a에 대응되는 집합 B의 원소 b(=f(a)) (*그니까 도착지, output)
정의역, domain : set of inputs (=A, =dom(f))
공변역, codomain : universal set of output (=B, =codom(f))
치역, range : set of outputs (=ran(f) = {f(a)|a는 A의 원소}) (*한마디로 B의 모든 원소중에 실제로 아웃풋이 된놈만 모은 것)
```

## 8.2. 함수의 특성

### 8.2.1. 단사함수(injection)

```
def
f: X->Y 가 있을 때, 임의의 두 정의역 원소에 대하여 x1 != x2 면, f(x1) != f(x2)인 함수
```

아까 표를 다시보자.

| 한글(가,나,다) 동물(강아지,냐옹이,다람쥐,레서팬더) | is관계? | is함수? | 함수타입 |
| ------------------------------ | ----- | ----- | ---- |
| (나, 냐옹이), (다, 다람쥐), (가, 레서팬더)  | O     | O     | 단사함수 |

* 이런 관계에서 codomain은 domain보다 같거나 커야한다! (왜냐믄 domain의 원소들이 모두 다른 놈으로 가야하기 때문)
* 따라서 range 또한 codomain과 같거나 작다!

### 8.2.2. 전사함수(Subjection)

```
def
f: X->Y가 있을 때, 모든 Y의 원소 y에 대해 f(x) = y인 정의역 원소가 적어도 하나 이상 존재하는 함수
```

**쉽게 말해서** 모든 y에 대해서 y로 오는 놈이 1개 이상 있다는 뜻! 그니까 여러 x가 같은 y를 가리켜도 상관없다.

따라서 다음이 성립된다

* subjection일 경우 domain은 codomain보다 같거나 커야한다!(injection과 반대)
* subjection일 경우 range는 codomain과 같다!(모든 y가 자기한테 오는 x를 하나 이상 가지고 있으니까!)

### 8.2.3. 전단사함수(Bi-jective function || One-to-one Correspondence)

```
def
injection이면서 subjection인 함수
```

즉, 모든 y가 자기에게 오는 x를 가지고(subjection), 모든 x는 각기 다른 y를 보는 함수(injection)

* 이러한 경우 domain과 codomain, range의 크기는 같다!(|domain|=|range|=|codomain|)

## 8.3. 함성함수

### 8.3.1. 합성함수의 정의

```
def
f:A->B 와 g:B->C가 있을 때 집합 A의 모든 원소가 집합 C의 원소에 대응하는 새로운 함수
g ο f = (g ο f)(x) = g(f(x)), ∀x ∈ A
```

f:A->B 가 함수 인 이상 모든 A의 원소에 대응하는 B의 원소가 있다. g:B->C 또한 함수 이므로 모든 B의 원소에 대응하는 C의 원소가 있다. ∴ 모든 A의 원소에 대응하는 C의 원소가 있으므로 \[어떤함수:A->C] 라고 할 수 있고, B를 통해 그 대응이 이루어진다. 이 어떤함수를 합성함수라 한다!

### 8.3.2. 합성함수의 특성

... 너무 길다 책 311페이지 참고...!

## 8.4. 함수의 종류

### 8.4.1. 항등함수(Identity Function : Ia)

```
def
f:A->A가 f(a)=a로 정의 되는 관계
```

1. 한마디로 인풋넣으면 그대로 나오는 함수\~!
2. domain === codomain === range (자기 자신이니까)
3. 2번을 통해 전단사함수(Bi-jective)!

### 8.4.2. 역함수(Inverse Function)

```
def
Bi-jective 함수 f:A->B에 대해
f역함수: B->A 이고
f(a)=b 일 때 f역함수(b) = a
```

1. 한마디로 인풋아웃풋 바뀐고!
2. 바뀔라믄 전단사함수여야함!

### 8.4.3. 상수함수(Constant Function)

```
def
f:A->B에서 집합 A의 모든 원소가 집합 B의 원소 하나에만 대응되는 관계
∀a ∈ A, ∃b ∈ B 에 대해 f(a) = b
```

즉 모든 인풋에대해서 하나의 아웃풋만 나올 때!

### 8.4.4. 특성함수(Charateristic function)

```
def
U에 속한 어떤 집합 A에 대해 다음과 같은 특성을 갖는 관계
f_a(x) = 1(x ∈ A일 때) 또는 0(x !∈ A)
```

단순히 말해서 집합 A에 포함되면 1, 아니면 0을 내뱉는 함수. 예를 들어 `isInteger()` 따위의 함수

### 8.4.5. 바닥함수와 천정함수

```
def. 바닥함수
x∈R 에 대해서 x와 같거나 x보다 작은 정수중 가장 큰 정수를 대응하는 함수
```

걍 자바스크립트의 `Math.floor(x)`

```
def. 천정함수
x∈R 에 대해서 x와 같거나 x보다 큰 정수중 가장 작은 정수를 대응하는 함수
```

걍 자바스크립트의 `Math.ceil(x)`
