Factoriser n'importe quel nombre avec Javascript : la méthode fonctionnelle

Dec 12 2022
Contexte À l'époque où j'étais à l'école primaire, après avoir appris l'arithmétique de base, nous avons été amenés à une leçon sur la factorisation, une technique pour trouver les éléments de multiplication qui peuvent former le nombre cible. Ce que nous avons fait ensuite a été de tester chaque nombre du plus petit au plus grand pour voir si chacun d'eux était un élément de la multiplication du nombre cible, ou en d'autres termes, une fois divisé par celui-ci, il donnait un nombre entier.
Photo de Chris Liverani sur Unsplash

Arrière plan

À l'époque où j'étais à l'école primaire, après avoir appris l'arithmétique de base, nous avons été amenés à une leçon sur la factorisation, une technique pour trouver des éléments de multiplication qui peuvent former le nombre cible. Ce que nous avons fait ensuite a été de tester chaque nombre du plus petit au plus grand pour voir si chacun d'eux était un élément de la multiplication du nombre cible, ou en d'autres termes, une fois divisé par celui-ci, il donnait un nombre entier. Par exemple, lorsque nous recherchons tous les nombres de facteurs de 62, nous essayons 2 (entier), 5 (décimal), 7 (décimal), etc. Jusqu'à ce que nous trouvions que les seuls facteurs possibles pour le nombre 62 sont 1, 2, 31 et 62. Et si nous laissions ce travail fastidieux à l'ordinateur pour produire les résultats ?

Méthode

Avant d'apprendre à l'ordinateur quoi faire, nous devons d'abord décrire le processus manuel que nous avons suivi pour produire cette réponse. C'est ainsi que je le comprends :

  1. Créer une série de nombres de 1 à N (cible)
  2. Pour chacun de ces nombres (i), vérifiez si (N/i) le résultat est un nombre entier ou non
  3. Si le résultat est un nombre entier, alors mettez (i) dans la liste des nombres de facteurs pour la valeur cible (N)

Résultat

Chaque programmeur peut utiliser un processus différent pour traduire un algorithme, bien qu'ils soient basés sur le même algorithme. Dans ce cas, j'ai choisi de m'en tenir au paradigme fonctionnel et au code généré comme suit :

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

Vous pouvez le tester en donnant à la factorizefonction n'importe quel nombre avec n'importe quel chiffre et cela donnera les résultats attendus. Mais ne vous attendez pas à ce que votre ordinateur ne gèle pas lorsqu'on lui donne de gros nombres de 9 chiffres ou plus.