Una función es inyectiva, o uno a uno, si asigna elementos únicos del codominio a elementos únicos del dominio. Es decir, bajo una función inyectiva, es imposible que dos entradas distintas produzcan la misma salida.
En el estudio de las funciones discretas, no todas se comportan igual al transformar los datos del dominio. Algunas agrupan diferentes entradas en un mismo valor de salida, mientras que otras conservan la distinción individual de cada elemento de principio a fin.
Una función f : A → B es **inyectiva** (o *uno a uno*) si elementos distintos del dominio tienen imágenes distintas en el codominio. En términos sencillos: si envías dos entradas diferentes al programa, tienes la garantía absoluta de recibir dos salidas diferentes.
Formalmente, una función f : A → B es inyectiva si y solo si cumple la siguiente implicación lógica:
O equivalentemente, aplicando la contrapositiva (que resulta más útil para demostraciones algebraicas):
Si encontramos al menos un par de elementos distintos en el dominio (a ≠ b) tales que tengan la misma imagen (f(a) = f(b)), entonces la función **no es inyectiva**.
Dependiendo de cómo representemos la función, la inyectividad se detecta de la siguiente manera:
El simulador te permite explorar la inyectividad. Mueve el cursor horizontalmente por la cuadrícula para escanear los puntos y ver si la recta corta a más de un punto a la vez. Observa especialmente cómo cambiar el dominio de una función (como f(x) = x²) puede transformarla de no inyectiva a inyectiva.
Para probar analíticamente si una función es inyectiva, partimos de la igualdad f(a) = f(b) e intentamos deducir lógicamente que a = b.
Ejemplo 1: Demostrar que f(x) = 3x - 1 sobre ℝ es inyectiva.
Ejemplo 2: Analizar si f(x) = x² sobre ℤ es inyectiva.
En programación, podemos verificar si una función es inyectiva sobre un dominio finito evaluando las salidas para cada entrada del dominio y asegurándonos de que no haya duplicados. En JavaScript, el objeto Set es ideal para esto, ya que almacena únicamente valores únicos.
const dominio = [-2, -1, 0, 1, 2];
// Función f(x) = x²
const f = (x) => x * x;
// Función g(x) = 2x
const g = (x) => 2 * x;
function esInyectiva(dom, func) {
const salidas = dom.map(func);
// Set almacena solo elementos únicos
const salidasUnicas = new Set(salidas);
// Si el tamaño coincide, no hubo duplicados de salida
return salidasUnicas.size === dom.length;
}
console.log("¿f(x) = x² es inyectiva?", esInyectiva(dominio, f));
console.log("¿g(x) = 2x es inyectiva?", esInyectiva(dominio, g));
// ¿f(x) = x² es inyectiva? false
// ¿g(x) = 2x es inyectiva? true
La inyectividad es una propiedad sumamente útil en computación. Una función inyectiva garantiza que no se pierda información durante el procesamiento de datos, lo cual es fundamental en áreas como la criptografía (donde cada mensaje encriptado debe descifrarse en un único mensaje original) y la generación de claves hash o identificadores únicos.
En el próximo tema estudiaremos las funciones sobreyectivas, analizando qué ocurre cuando todos los elementos del codominio son alcanzados por la función, completando la segunda propiedad fundamental antes de abordar las funciones biyectivas e inversas.