Factorice cualquier número con Javascript: la forma funcional

Dec 12 2022
Antecedentes Cuando estaba en la escuela primaria, después de aprender aritmética básica, nos llevaron a una lección sobre factorización, una técnica para encontrar elementos de multiplicación que pueden formar el número objetivo. Lo que hicimos entonces fue probar cada número de menor a mayor para ver si cada uno de ellos era un elemento de la multiplicación del número objetivo, o en otras palabras, al dividirlo entre él daba un número entero.
Foto de Chris Liverani en Unsplash

Fondo

Cuando estaba en la escuela primaria, después de aprender aritmética básica, nos llevaron a una lección sobre factorización, una técnica para encontrar elementos de multiplicación que pueden formar el número objetivo. Lo que hicimos entonces fue probar cada número de menor a mayor para ver si cada uno de ellos era un elemento de la multiplicación del número objetivo, o en otras palabras, al dividirlo entre él daba un número entero. Por ejemplo, cuando buscamos todos los números de factor de 62, probamos 2 (entero), 5 (decimal), 7 (decimal), y así sucesivamente. Hasta que encontremos, los únicos factores posibles para el número 62 son 1, 2, 31 y 62. ¿Qué sucede si dejamos este tedioso trabajo a la computadora para obtener los resultados?

Método

Antes de enseñarle a la computadora qué hacer, primero debemos describir cuál fue el proceso manual por el que pasamos para producir esa respuesta. Así es como lo entiendo:

  1. Crear una serie de números del 1 al N (objetivo)
  2. Para cada uno de estos números (i), compruebe si (N / i) el resultado es un número entero o no
  3. Si el resultado es un número entero, coloque (i) en la lista de números de factor para el valor objetivo (N)

Resultado

Cada programador puede usar un proceso diferente para traducir un algoritmo, aunque se basan exactamente en el mismo algoritmo. En este caso, opté por seguir con el paradigma funcional y generé un código como el siguiente:

factorize = num =>
  [...Array(num).keys()]
  .map(i => i + 1)
  .reduce((acc, inc) =>
    num % inc === 0 ?
    [...acc, inc] : acc
  , [])
factorize(62) // get [1, 2, 31, 62]
factorize(123456) // get 28 different numbers

Puede probarlo dando a factorizela función cualquier número con cualquier dígito y obtendrá los resultados esperados. Pero no espere que su computadora no se bloquee cuando se le den grandes números de 9 dígitos o más.