集合論の基礎(ベン図・論理演算)
和集合・積集合・差集合・補集合とブール論理・SQLの共通言語
- 1
- 集合論は「ものの集まり」を厳密に扱う数学の基礎言語で、和集合 ・積集合 ・差集合 ・補集合 の4つの基本演算がベン図で視覚化できる
- 2
- 2つの有限集合の要素数について が成り立ち(包除原理)、重複を引くことで正しい合計人数・件数を数えられる
- 3
- SQLの `UNION`・`INTERSECT`・`EXCEPT(MINUS)` や、プログラミング言語のビット演算 `OR`・`AND`・`XOR`・`NOT` は、集合演算とブール論理の直接的なコード上の実装である
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
集合論は「ものの集まり」を厳密に扱う数学の基礎言語で、和集合 $A \cup B$・積集合 $A \cap B$・差集合 $A \setminus B$・補集合 $A^c$ の4つの基本演算がベン図で視覚化できる
身につく武器・思考力
2つの有限集合の要素数について $|A \cup B| = |A| + |B| - |A \cap B|$ が成り立ち(包除原理)、重複を引くことで正しい合計人数・件数を数えられる
実社会・ITでの活躍現場
- •SQLの集合演算(UNION/INTERSECT/EXCEPT)とビット演算による集合実装
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
2つの円(集合 A・集合 B)の半径と重なり具合をスライダーで調整し、下のボタンで「和集合 」「積集合 」「差集合 」「補集合 」を切り替えてみよう。選んだ演算に対応する領域がベン図上でハイライトされ、その演算を表す集合記法もあわせて表示される。
↑ 上のボタンで4つの基本演算(和集合・積集合・差集合・補集合)を切り替えると、青紫色に塗られた領域が対応する集合を表します。円の半径や重なり具合を変えても、選んだ演算のロジック自体は変わらないことを確認しましょう。
集合 A の要素数が 30、集合 B の要素数が 20、A と B の積集合 の要素数が 8 のとき、和集合 はいくつか?
Layer 2 — 定義・受験・証明
定義
全体集合 の中の2つの部分集合 に対して、次の基本的な集合演算が定義される。 和集合(Union):
積集合/共通部分(Intersection):
差集合(Difference):
補集合(Complement):
これらの演算はベン図(Venn Diagram)と呼ばれる重なり合う円の図で視覚的に表現でき、それぞれの演算が円のどの領域に対応するかを一目で理解できる。
公式・数理モデル
証明・導出
包除原理(inclusion-exclusion)の証明: 有限集合 の要素数の和 を考えると、 に属する要素は を数えるときに1回、 を数えるときにもう1回、合計2回数えられてしまっている。
一方、実際に和集合 に含まれる各要素は(のみ/のみ/両方のいずれであっても)ちょうど1回だけ数えられるべきである。したがって から重複分 を1回分引けば、正しい和集合の要素数が得られる。
ド・モルガンの法則の証明: であることは「 でない」、すなわち「 でも でもない」ことと同値である。 これは論理的に「 かつ 」と同値であり、まさに「 かつ 」、すなわち であることを意味する。 よって が成り立つ(同様に も成り立つ)。
押さえておきたいポイント
- 3つの集合の包除原理:
- ド・モルガンの法則 は、論理演算のブール代数における `NOT(P OR Q) = (NOT P) AND (NOT Q)` と完全に同じ構造を持つ
- 対称差(symmetric difference) はビット演算の排他的論理和 XOR に対応する
- (部分集合)はプログラミングの条件分岐における「含意(もし〜ならば)」の集合論的な対応物である
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
SQLの集合演算(UNION/INTERSECT/EXCEPT)とビット演算による集合実装
リレーショナルデータベースのSQLは、テーブルの行の集まりを集合とみなし、UNION(和集合)・INTERSECT(積集合)・EXCEPT/MINUS(差集合)という集合演算をそのまま言語機能として提供している。プログラミングでは固定長のビット列(ビットセット)で集合を表現し、AND/OR/XOR/NOTで高速に演算することも多い。
1// JavaScript の Set を用いた集合演算(数学の A, B に対応)2function union<T>(a: Set<T>, b: Set<T>): Set<T> {3 return new Set([...a, ...b]); // A ∪ B4}56function intersection<T>(a: Set<T>, b: Set<T>): Set<T> {7 return new Set([...a].filter((x) => b.has(x))); // A ∩ B8}910function difference<T>(a: Set<T>, b: Set<T>): Set<T> {11 return new Set([...a].filter((x) => !b.has(x))); // A \ B12}1314const setA = new Set(["田中", "佐藤", "鈴木", "高橋"]); // 数学サークル会員15const setB = new Set(["佐藤", "鈴木", "山田"]); // 物理サークル会員1617console.log("両方に所属 (A ∩ B):", [...intersection(setA, setB)]); // 佐藤, 鈴木18console.log("どちらかに所属 (A ∪ B):", [...union(setA, setB)]);19console.log("数学のみ (A \\ B):", [...difference(setA, setB)]); // 田中, 高橋2021// 対応するSQL(テーブル同士の集合演算)22// SELECT name FROM math_club INTERSECT SELECT name FROM physics_club; -- A ∩ B23// SELECT name FROM math_club UNION SELECT name FROM physics_club; -- A ∪ B24// SELECT name FROM math_club EXCEPT SELECT name FROM physics_club; -- A \ B2526// ビットマスクによる集合表現(要素数が少ない場合、超高速な集合演算が可能)27const A = 0b1011; // 集合 {0, 1, 3} を表すビットセット28const B = 0b0110; // 集合 {1, 2} を表すビットセット29console.log("A ∩ B:", (A & B).toString(2)); // AND演算 = 積集合30console.log("A ∪ B:", (A | B).toString(2)); // OR演算 = 和集合31console.log("A △ B:", (A ^ B).toString(2)); // XOR演算 = 対称差
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元