8. Números primos y factorización

Los números primos son bloques básicos de los números enteros. La factorización permite descomponer un número en factores más simples y es una idea central en muchos algoritmos.

8.1 Introducción

En el tema anterior vimos divisibilidad, múltiplos y divisores. Ahora usaremos esas ideas para estudiar números primos y factorización.

Los números primos son importantes porque permiten construir otros números mediante multiplicación. En programación aparecen en ejercicios de algoritmos, criptografía, validaciones, generación de secuencias y optimización de cálculos.

Para trabajar con primos en JavaScript usaremos divisiones, restos con el operador %, ciclos y funciones.

8.2 Qué es un número primo

Un número primo es un número natural mayor que 1 que tiene exactamente dos divisores positivos: 1 y él mismo.

7 es primo porque sus únicos divisores positivos son 1 y 7.

En cambio, 12 no es primo porque tiene más divisores: 1, 2, 3, 4, 6 y 12.

console.log(7 % 2);
console.log(7 % 3);
console.log(7 % 4);
console.log(7 % 5);
console.log(7 % 6);

Ninguna de esas divisiones deja resto 0, por eso 7 no tiene divisores intermedios entre 1 y 7.

8.3 Primeros números primos

Los primeros números primos son:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ...

El número 2 es el único primo par. Todos los demás números pares son divisibles por 2 y, por lo tanto, no son primos.

Número Divisores positivos Clasificación
2 1, 2 Primo
4 1, 2, 4 Compuesto
9 1, 3, 9 Compuesto
13 1, 13 Primo

8.4 Números compuestos

Un número compuesto es un número natural mayor que 1 que tiene más de dos divisores positivos. Es decir, puede descomponerse como producto de números menores.

12 = 3 × 4
12 = 2 × 6
12 = 2 × 2 × 3

Los números compuestos no son “malos” ni menos importantes. Simplemente tienen una estructura interna que podemos analizar mediante sus factores.

8.5 El 1 no es primo

El número 1 no se considera primo porque solo tiene un divisor positivo: él mismo. La definición de primo exige exactamente dos divisores positivos.

Esta regla puede parecer un detalle, pero es importante para que la factorización de números sea única.

function cantidadDivisores(numero) {
  let cantidad = 0;

  for (let i = 1; i <= numero; i++) {
    if (numero % i === 0) {
      cantidad++;
    }
  }

  return cantidad;
}

console.log(cantidadDivisores(1));
console.log(cantidadDivisores(2));
console.log(cantidadDivisores(12));

8.6 Probar si un número es primo

Una forma simple de saber si un número es primo es probar si tiene algún divisor entre 2 y el número anterior. Si encontramos uno, el número no es primo.

function esPrimo(numero) {
  if (numero <= 1) {
    return false;
  }

  for (let divisor = 2; divisor < numero; divisor++) {
    if (numero % divisor === 0) {
      return false;
    }
  }

  return true;
}

console.log(esPrimo(7));
console.log(esPrimo(12));
console.log(esPrimo(13));

Este algoritmo es fácil de entender, aunque no es el más eficiente para números grandes.

8.7 Optimizar con raíz cuadrada

No hace falta probar todos los divisores hasta el número anterior. Si un número tiene un divisor mayor que su raíz cuadrada, necesariamente tendrá otro divisor menor que su raíz cuadrada.

Por eso podemos probar divisores solo hasta Math.sqrt(numero).

function esPrimo(numero) {
  if (numero <= 1) {
    return false;
  }

  for (let divisor = 2; divisor <= Math.sqrt(numero); divisor++) {
    if (numero % divisor === 0) {
      return false;
    }
  }

  return true;
}

console.log(esPrimo(97));
console.log(esPrimo(100));
console.log(esPrimo(101));

Esta mejora reduce mucho la cantidad de pruebas necesarias.

8.8 Generar números primos en un rango

Podemos combinar una función de primalidad con un ciclo para obtener todos los primos dentro de un rango.

function esPrimo(numero) {
  if (numero <= 1) return false;

  for (let divisor = 2; divisor <= Math.sqrt(numero); divisor++) {
    if (numero % divisor === 0) return false;
  }

  return true;
}

const primos = [];

for (let numero = 1; numero <= 30; numero++) {
  if (esPrimo(numero)) {
    primos.push(numero);
  }
}

console.log(primos);

Este patrón aparece en ejercicios de lógica, filtros de datos y problemas matemáticos.

8.9 Qué es factorizar

Factorizar un número significa escribirlo como producto de otros números. Cuando lo escribimos como producto de números primos, hablamos de factorización prima.

60 = 2 × 2 × 3 × 5

La factorización prima descompone un número en sus “bloques multiplicativos” más simples.

Número Factorización prima
12 2 × 2 × 3
18 2 × 3 × 3
45 3 × 3 × 5
100 2 × 2 × 5 × 5

8.10 Factorización con divisiones sucesivas

Para factorizar un número, podemos dividirlo por el menor divisor posible tantas veces como sea necesario. Luego seguimos con el siguiente divisor.

function factorizar(numero) {
  const factores = [];
  let divisor = 2;

  while (numero > 1) {
    if (numero % divisor === 0) {
      factores.push(divisor);
      numero = numero / divisor;
    } else {
      divisor++;
    }
  }

  return factores;
}

console.log(factorizar(60));
console.log(factorizar(84));

El arreglo resultante contiene los factores primos del número original.

8.11 Contar factores repetidos

En algunos casos conviene contar cuántas veces aparece cada factor primo. Por ejemplo, 60 = 2² × 3 × 5.

function contarFactores(factores) {
  const conteo = {};

  for (const factor of factores) {
    conteo[factor] = (conteo[factor] || 0) + 1;
  }

  return conteo;
}

console.log(contarFactores([2, 2, 3, 5]));
console.log(contarFactores([2, 2, 2, 3, 3]));

Esta representación será útil cuando estudiemos máximo común divisor y mínimo común múltiplo.

8.12 Aplicación: validar números primos

Una aplicación directa es validar si un número ingresado cumple la condición de ser primo. Esta clase de validación se usa mucho en ejercicios de programación.

function esPrimo(numero) {
  if (!Number.isInteger(numero) || numero <= 1) {
    return false;
  }

  for (let divisor = 2; divisor <= Math.sqrt(numero); divisor++) {
    if (numero % divisor === 0) {
      return false;
    }
  }

  return true;
}

const valor = 29;

if (esPrimo(valor)) {
  console.log("El número es primo");
} else {
  console.log("El número no es primo");
}

La función valida que el valor sea entero y mayor que 1 antes de probar divisores.

8.13 Aplicación: descomponer para entender divisores

La factorización ayuda a entender por qué un número tiene ciertos divisores. Por ejemplo, si un número contiene el factor 2, entonces es divisible por 2. Si contiene los factores 3 y 5, entonces es divisible por 15.

const numero = 90;
const factores = [2, 3, 3, 5];

console.log(numero % 2 === 0);
console.log(numero % 3 === 0);
console.log(numero % 5 === 0);
console.log(numero % 15 === 0);
console.log(factores);

En programas más avanzados, esta idea se usa para simplificar fracciones, calcular divisores, optimizar búsquedas y resolver problemas de teoría de números.

8.14 Errores comunes

  • Considerar que 1 es primo. No lo es, porque no tiene exactamente dos divisores positivos.
  • Olvidar que 2 es el único número primo par.
  • Probar divisores innecesarios cuando alcanza con llegar hasta la raíz cuadrada.
  • No validar que el número sea entero antes de probar si es primo.
  • Confundir divisor con factor primo: no todos los divisores son primos.
console.log(Number.isInteger(7));
console.log(Number.isInteger(7.5));
console.log(2 % 2 === 0);
console.log(2 === 2);

8.15 Qué debes recordar de este tema

  • Un número primo tiene exactamente dos divisores positivos: 1 y él mismo.
  • El número 1 no es primo.
  • El número 2 es el único primo par.
  • Para probar si un número es primo, buscamos divisores que dejen resto 0.
  • Podemos optimizar la búsqueda probando divisores solo hasta la raíz cuadrada.
  • Factorizar es descomponer un número como producto de factores.
  • La factorización prima escribe un número usando solo factores primos.

8.16 Conclusión

Los números primos y la factorización conectan divisibilidad con algoritmos. Aunque son conceptos matemáticos básicos, permiten construir soluciones claras para validar números, descomponer valores y analizar estructuras multiplicativas.

En el próximo tema estudiaremos máximo común divisor y mínimo común múltiplo, dos herramientas que se apoyan directamente en divisores y factorización.