集合をゼロからやり直そう

こんにちは。
昨日のkatsuyukiさんに続き、今は亡き経営工学科卒のgangunが担当いたします。i科の藤村忠寿とは私のこと。
現在世田谷方面に住んでおり、職場は渋谷区。
見事に飯田橋方面には用事がないですが、彼と同じくあのキャンパスに特に思い入れはないです。ええ。

お前ら、ちょっとしたスクリプト組む時もテストは書いておけよ。
動作保証付きのメソッドは、後で流用する時も安心して使えるからな。

現在は社員数5名の企業でエンジニアをやっています。
機械学習を一番のメインに据えつつ、ゴリゴリやっています。

エンジニア=オタク、軟弱、根暗という風潮が嫌いなので、それに抗うべくジムで体を鍛えてます。
そこのお前。昨日の自分より強くなると、とても気分がいいぞ。
<br>
<br>
で、題材についてなんですが。
なんというか、直近は１つの案件のなかで色々な経験をしておりまして、
サービスとしてリリースするためのインフラ構築、AWSサービスを使った大規模データの移行など学びはたくさんあったのですが、
アドベントカレンダーとしての面白いネタにはならないよね大泉君、と悩みまして。

なので、いっそ数学分野に寄ってみようかなと。内容はヌルいです。いろはのいの字の一画目。
私のように<font color="Crimson">実は数学がそんなに得意ではないのに理科大を出てしまった方々</font>のために、この記事を捧げます。
私も学部時代は数学系の科目はC、良くてBで駆け抜けていましたが。
最近少しずつ学び直しておりますので、ね。
今年もしばしお付き合いください。

なお、書籍は[松坂和夫氏著「集合・位相入門」](https://www.amazon.co.jp/%E9%9B%86%E5%90%88%E3%83%BB%E4%BD%8D%E7%9B%B8%E5%85%A5%E9%96%80-%E6%9D%BE%E5%9D%82-%E5%92%8C%E5%A4%AB/dp/4000054244)を参考にしています。


# 集合とは

いくつかの「もの」を集めて作った、ものの集まり。

ex)

- 自然数全体の集まり
- 0≦x≦1であるような実数x全体の集まり
- ‘p’, ‘q’, ‘r’という3つの文字の集まり
- 日本の都道府県の集まり
- 東京理科大学工学部第一部経営工学科2015年3月卒業生の集まり

つまり、集合を構成する「もの」は<font color="Crimson">なんでも良い</font>ということです。抽象的な概念ですから。


### 集合の制約

では、制約とは何か？

ズバリ、<font color="Crimson">範囲が明確であること。</font>

上記のexは全て、誰がみても範囲がはっきりしているのがわかります。

逆に、「十分大きい数の集まり」などと言われてしまうと困るのです。

人によって「十分大きい」数字の基準は異なります。なので、範囲を明確に決めること。


では、記号を用意して話を進めましょう。

### 集合の要素

Aという集合があり、その要素の一つにaがあるとする。その要素一つひとつのことを元という。

aがAの元であるということを、

```math
a \in A
```

と表します。上記の否定は

```math
a \notin A
```

ここで、先ほどの「集合の範囲が明確であること」という制約が活きてきます。
何が言いたいかと言うと。
上記の2つは「同時には成立しない」し、「どちらも成立しないということもありえない」と言うことです。

直感的には当然も当然ですが、<font color="Crimson">土台の理論を見返すことで理解もより盤石になるのです。</font>

### 元の数

元が無限に存在する集合を無限集合、逆に数に限りがある集合を有限集合と言います。
では、ちょっとした問題です。以下の集合がどちらに属するか考えてみてください。

- 10より小さい素数の集合
- 自然数全体の集合
- 3の倍数である自然数全体の集合

※注意
有限集合のうち、元を1つしか含まない {a} のようなパターン。
<font color="Crimson">元であるa単品と、aを1つ含む集合{a}は概念上別物であると言うことを意識しておきましょう。</font>

### 基本的な集合

流石にここはさらっと流しておきますが、数学で頻出となる基本的な集合です。

N: 自然数全体の集合　　 "Natural number"
Z: 整数全体の集合   "Zahlen"(ドイツ語)が由来
Q: 有理数全体の集合 　"Quoziente"(イタリア語)が由来
R: 実数全体の集合   "Real number"


### 集合の記法

一般的に、元a,b,c,...からなる集合を {a, b, c, ...} という記号で表します。
Nは {1, 2, 3, … , n, ...}

中括弧で上記のように表す記法を外延的記法と言います。(⇔内包的記法、あとで説明します)


### 数学で用いる「条件」
<br>

```math
xは有理数である
```

```math
yは0≦y≦1であるような実数である
```
<br>
上記は変数x,yそれぞれについての条件(性質)を表しています。

この条件の記述についても、制約があります。
それは、
「変数部分に具体的な値を代入した時の結果が正しいかどうかはっきり定まる文でなければならない」
と言うことです。

感覚的には集合の制約と似ていますね。
以下、わかりやすくするために変数xについての条件をC(x)と書くことにします。
上記の記述でいえばそれぞれをC(x)、C(y)と表すことを意味します。
こう言う部分を抽象的に表現することで応用の幅が広がるのです。

話を続けましょう。

変数xについて条件C=C(x)が与えられたとする。
ある具体的な値aを代入して得られる文章C(a)が正しい場合、「aは条件Cを満たす」,「aは性質Cを持つ」といいます。

条件Cを満たすようなもの全体の集合は{x|　C(x)}と表せます。この記法を内包的記法と言います。

先に挙げた例で言うならば、
{x| xは有理数である} → {x| x∈Q}
{y| yは0≦y≦1であるような実数である} → {y| y∈R, 0≦y≦1}


### 条件を満たさない集合

ここまでは、条件を満たすものが存在するような集合を書いてきましたが、では、条件を満たすものが存在しない集合について触れておきます。

以下のような条件を考えてみましょう。

ex)
C(x): xは以下を満たす実数である

```math
 x^2 + 1=0
```

さて、どうでしょうか？条件を満たすxは存在しないと直ちにおわかりいただけたかと思います。
こういう時にも{x| C(x)}を集合として扱うには<font color="Crimson">元を全く含まない集合</font>を考慮する必要があります。

そういう場合に、空集合∅を定めます。要は、元が1つも入っていない集合のことです。
こうすることで、
{x| x∈R, x^2 + 1=0}は∅である、と表現できるようになります。

なお、空集合は元を1つも含まないので、どのようなものaを取っても a∉∅ となります。


### 集合の相当

2つの集合が等しいとはどう考えたらよいでしょうか。  
土台の理解がビシっとしていれば、この問いも頭を捻って考えずに済みます。実に単純。

<font color="Crimson">「２つの集合の、その元全体が全く同じなら集合としても等しい」</font>

<font color="Crimson">これだけです。</font>

集合の中身全体が等しければいいので、以下のように異なる表記であっても等しいということになります。

- A: {x| 2＜x＜10である素数}
- B: {x| 1＜x＜8である奇数}　　<br>
→ A = B

<br>
ここまでで、また注意事項を。

- 同じ元で構成されている、異なる2つの集合は存在しない
集合はあくまで元の全体によって決定される

- 元を書き並べる順序はなんでも良い {1,2,3,4}={2,1,4,3}={4,2,1,3}

- 同一の元を重複して書いても良い {1,2,3,4}={1,1,1,2,2,3,4,4,4,4}
※いくつ書いても1回書いた場合と同じだけの効果しか持たない

- 集合の内包的記法において、変数記号は条件Cに含まれない任意の他の文字に置き換えることができる 
- { x | C(x) } = { y | C(y) }


こういう、隅っこの知識部分まで拾っておくことが将来役にたつこともありますので。ね。

### 論理記号
これも今更ですが、今後集合の理解を深める中で必要になるのでおさらいしておきましょう。

- p→q :  “pが正しい時にqも正しい”　ならば正
- q→p :  “qが正しい時にpも正しい”　ならば正
- p↔︎q :  “p→qが正しく、かつq→pも正しい”　ならば正

集合AとBが等しいとは、任意の対象xについて、
x∈A ↔︎ x∈B
となることを言います。つまり、<font color="Crimson">任意のxがAとB両方に含まれていること</font?>、という意味です。


# ここまでが・・・

書籍の第1章、チャプター1の内容です。
この先ではさらに集合同士の演算、そして写像などの概念が出てきます。
我々が中高の数学で学んできたいわゆる「関数」などの、さらに根っこの部分に触れていきます。

この記事自体は勢いで書き始めたものですが、記事を区切った上で、もう少しキリのいいところまで今後書けたらな、と思ってます。

集合を学んでいて、エンジニア目線でもメリットがあったなと感じています。
プログラムの処理で、データの流れがイメージしやすくなったという実感があります。
ここまでの処理ではデータ全体でどういう形をしているから、そこにどういう変換・フィルタリングをしてやればいいのかな、というような。

理屈を考えることと、状態や概念をイメージすること。
同時に鍛え上げられるという意味で、集合を学ぶのはとても意義があると思っています。

書籍名については冒頭で記しているので、興味のある方、数学の勉強をやり直したい方はぜひそのとっかかりにしていただければ。

それではみなさま、ごきげんよう。