「入力を受け取り、出力を返す」という関数の概念は、数学でもプログラミングでも同じ。しかし数学の関数には「全射」「単射」「逆関数」といった性質がある。これを知ると、なぜmap/filterが便利なのか、なぜハッシュ関数は一方通行なのかが見えてくる。

写像 関数 定義域 値域 全射 単射

写像とは

写像(mapping)または関数(function)とは、ある集合の各要素に対して、別の集合の要素を一意に対応させる規則である。

写像の定義

f: A → B

集合Aの各要素aに対して、集合Bの要素f(a)がただ一つ定まる。

・A:定義域(domain)

・B:終域(codomain)

・f(A):値域(range, image)= 実際に出力される値の集合

プログラミングの関数と数学の関数の違い:数学では同じ入力には必ず同じ出力(純粋関数)。プログラミングでは副作用があり得る。

写像の種類

単射(Injection)

単射(one-to-one)

異なる入力には異なる出力が対応する。

f(a₁) = f(a₂) ならば a₁ = a₂

例:f(x) = 2x は単射。f(x) = x² は単射でない(f(2) = f(-2) = 4)

全射(Surjection)

全射(onto)

終域のすべての要素が、少なくとも1つの入力から到達可能。

値域 = 終域

例:f: ℝ → ℝ, f(x) = x³ は全射。f(x) = x² は全射でない(負の数に到達不可)

全単射(Bijection)

全単射(one-to-one correspondence)

単射かつ全射。1対1の完全な対応。

逆写像が存在する。

例:f(x) = 2x + 1 は全単射。逆関数 f⁻¹(y) = (y-1)/2

図解

種類 特徴 逆関数
単射 重複なし(異なる入力→異なる出力) 部分的に可能
全射 漏れなし(すべての出力に到達) 不定(複数の入力から同じ出力)
全単射 重複なし+漏れなし 完全に存在

実務での応用

WEB開発での応用

ハッシュ関数:多対1の写像(単射でない)。異なる入力が同じ出力になりうる(衝突)。

エンコーディング:Base64は全単射。デコードで元に戻せる。

ID採番:データベースのシーケンスは単射。重複しない。

URLルーティング:パス→コントローラの対応は関数。

AI/MLでの応用

活性化関数:ReLU、Sigmoid、tanh などは写像。入出力の性質が重要。

エンベディング:高次元空間への写像。単語→ベクトル。

次元削減:高次元→低次元の写像。全射でないことが多い(情報の損失)。

深掘りリンク