30. Funciones inyectivas, sobreyectivas y biyectivas

Las funciones pueden clasificarse según cómo relacionan dominio, codominio e imagen. Las funciones inyectivas no mezclan entradas, las sobreyectivas cubren todo el codominio y las biyectivas hacen ambas cosas.

30.1 Introducción

Una función asigna a cada elemento del dominio exactamente un elemento del codominio. Pero no todas las funciones se comportan igual: algunas distinguen perfectamente las entradas, otras alcanzan todos los valores posibles de salida y otras hacen ambas cosas.

Para describir estas situaciones usamos tres conceptos: inyectiva, sobreyectiva y biyectiva.

30.2 Recordatorio de función

Una función f: A → B asigna a cada elemento de A un único elemento de B.

f: A → B A = dominio B = codominio

La imagen es el subconjunto de B formado por los valores que realmente se obtienen.

30.3 Función inyectiva

Una función es inyectiva si elementos distintos del dominio tienen imágenes distintas.

Si f(a₁) = f(a₂), entonces a₁ = a₂

También se dice que una función inyectiva es "uno a uno". Ningún valor de salida es usado por dos entradas diferentes.

30.4 Ejemplo de función inyectiva

A = {1, 2, 3} B = {a, b, c, d} f = {(1, a), (2, b), (3, c)}

La función es inyectiva porque cada elemento del dominio tiene una salida distinta. El valor d queda sin usar, pero eso no afecta la inyectividad.

30.5 Función no inyectiva

A = {1, 2, 3} B = {a, b} f = {(1, a), (2, a), (3, b)}

Esta función no es inyectiva porque 1 y 2 tienen la misma imagen: a.

30.6 Función sobreyectiva

Una función es sobreyectiva si todo elemento del codominio aparece como imagen de al menos un elemento del dominio.

Para todo b ∈ B, existe a ∈ A tal que f(a) = b

En una función sobreyectiva, la imagen coincide con el codominio.

30.7 Ejemplo de función sobreyectiva

A = {1, 2, 3} B = {a, b} f = {(1, a), (2, a), (3, b)}

La función es sobreyectiva porque todos los elementos del codominio, a y b, aparecen como salida.

30.8 Función no sobreyectiva

A = {1, 2} B = {a, b, c} f = {(1, a), (2, b)}

Esta función no es sobreyectiva porque el elemento c del codominio no aparece como imagen.

30.9 Función biyectiva

Una función es biyectiva si es inyectiva y sobreyectiva al mismo tiempo.

Biyectiva = inyectiva + sobreyectiva

En una biyección, cada elemento del dominio se asocia con un elemento distinto del codominio y todos los elementos del codominio son usados.

30.10 Ejemplo de función biyectiva

A = {1, 2, 3} B = {a, b, c} f = {(1, a), (2, b), (3, c)}

La función es biyectiva porque no repite salidas y además cubre todo el codominio.

30.11 Comparación entre los tres tipos

Tipo Condición Idea intuitiva
Inyectiva No hay dos entradas distintas con la misma salida No mezcla entradas
Sobreyectiva La imagen cubre todo el codominio No deja salidas sin usar
Biyectiva Es inyectiva y sobreyectiva Empareja dominio y codominio perfectamente

30.12 Relación con cardinalidad

Cuando los conjuntos son finitos, la cardinalidad ayuda a razonar sobre estos tipos de funciones.

Situación Consecuencia
Existe una inyección A → B |A| ≤ |B|
Existe una sobreyección A → B |A| ≥ |B|
Existe una biyección A → B |A| = |B|

Estas relaciones son especialmente útiles para comparar tamaños de conjuntos.

30.13 Verificar inyectividad en JavaScript

Una función representada como pares es inyectiva si no repite salidas para entradas distintas.

function esInyectiva(relacion) {
  const salidas = relacion.map(([, salida]) => salida);
  return new Set(salidas).size === salidas.length;
}

const inyectiva = [[1, "a"], [2, "b"], [3, "c"]];
const noInyectiva = [[1, "a"], [2, "a"], [3, "b"]];

console.log(esInyectiva(inyectiva));
console.log(esInyectiva(noInyectiva));

Si las salidas distintas son tantas como los pares, no hay repetición de imágenes.

30.14 Verificar sobreyectividad en JavaScript

Una función es sobreyectiva si cada elemento del codominio aparece como salida.

function esSobreyectiva(codominio, relacion) {
  const imagen = new Set(relacion.map(([, salida]) => salida));
  return codominio.every(valor => imagen.has(valor));
}

const codominio = ["a", "b", "c"];
const f1 = [[1, "a"], [2, "b"], [3, "c"]];
const f2 = [[1, "a"], [2, "b"]];

console.log(esSobreyectiva(codominio, f1));
console.log(esSobreyectiva(codominio, f2));

La segunda función no cubre todo el codominio porque falta c.

30.15 Verificar biyectividad en JavaScript

Una función es biyectiva si cumple inyectividad y sobreyectividad.

function esInyectiva(relacion) {
  const salidas = relacion.map(([, salida]) => salida);
  return new Set(salidas).size === salidas.length;
}

function esSobreyectiva(codominio, relacion) {
  const imagen = new Set(relacion.map(([, salida]) => salida));
  return codominio.every(valor => imagen.has(valor));
}

function esBiyectiva(codominio, relacion) {
  return esInyectiva(relacion) && esSobreyectiva(codominio, relacion);
}

const codominio = ["a", "b", "c"];
const f1 = [[1, "a"], [2, "b"], [3, "c"]];
const noInyectiva = [[1, "a"], [2, "a"], [3, "b"]];

console.log(esBiyectiva(codominio, f1));
console.log(esBiyectiva(codominio, noInyectiva));

La biyección establece una correspondencia exacta entre dominio y codominio.

30.16 Aplicaciones prácticas

Tipo Aplicación Ejemplo
Inyectiva Identificadores únicos Cada usuario tiene un ID distinto
Sobreyectiva Cobertura completa Cada categoría tiene al menos un producto
Biyectiva Correspondencia exacta Cada asiento se asigna a una persona y cada persona a un asiento
Biyectiva Mapeo reversible Codificación donde cada símbolo tiene una traducción única

30.17 Errores frecuentes

  • Confundir inyectiva con sobreyectiva.
  • Creer que una función inyectiva debe usar todo el codominio.
  • Creer que una función sobreyectiva no puede repetir salidas.
  • Olvidar que la sobreyectividad depende del codominio declarado.
  • Decir que una función es biyectiva sin verificar ambas propiedades.

30.18 Qué debes recordar de este tema

  • Una función inyectiva no asigna la misma salida a entradas distintas.
  • Una función sobreyectiva cubre todo el codominio.
  • Una función biyectiva es inyectiva y sobreyectiva.
  • En conjuntos finitos, una biyección implica igual cardinalidad.
  • La sobreyectividad depende del codominio elegido.
  • En JavaScript, estas propiedades pueden verificarse con Set y recorridos sobre pares.

30.19 Conclusión

Las funciones inyectivas, sobreyectivas y biyectivas describen formas distintas de conectar dominio y codominio. Estas clasificaciones permiten analizar unicidad, cobertura y correspondencias exactas.

En el próximo tema estudiaremos operaciones y composición de funciones.