L’inversione dell’operazione di fattoriale, ovvero il fattoriale inverso

In questo articolo ci proponiamo di implementare uno script in ambiente Mathematica per il calcolo del fattoriale inverso (o antifattoriale). Ho letto con estremo interesse l'articolo di Piero Boccadoro sul calcolo del fattoriale inverso tant'è che ho implementato uno script in ambiente Mathematica, il noto sistema di Computer Algebra (C.A.S.).
Prima di addentrarci nella descrizione del programma, vediamo di focalizzare la nostra attenzione sulle difficoltà che si incontrano nel calcolo del fattoriale inverso.

Come descritto nell'articolo citato, il fattoriale è una funzione (o applicazione/operatore) che a ogni numero intero naturale n associa il prodotto n*(n-1)*(n-2)...*2*1 e si indica con il simbolo n!. Ad esempio, il fattoriale di 4 è 4! = 4*3*2*1 =24. Anche 0 ha un fattoriale: si pone per definizione:

0! = 1
Il fattoriale è una funzione f: N --> N, dove N è l'insieme degli interi naturali. Per essere più precisi, è una successione ricorsivamente definita, in quanto:

      (1)
La legge di ricorrenza espressa dalla formula (1) permette di computare il fattoriale a patto di conoscere il valore iniziale f(0) che per quanto visto è:

  (2)
Trattandosi di un processo ricorsivo, il fattoriale si presta molto bene a essere computato via software utilizzando un qualunque linguaggio di programmazione, oppure attraverso un C.A.S. (Computer Algebra System). Mathematica è uno tra questi e il fattoriale è una funzione built-in che viene invocata dal comando Factorial[] o semplicemente, utilizzando il simbolo ! come nella notazione usuale.

Ci poniamo, dunque, il problema di "invertire" l'operazione di fattoriale. Dalla formula (1) ricaviamo

(3)
Cioè

  (4)
Esplicitando il denominatore della (4)

  (5)
Osserviamo subito che la (5) è valida per n > 1. Infatti, per n=1 implicherebbe una divisione per zero, operazione che nessuna interfaccia umana o artificiale è in grado di portare a termine. A questo punto, supponiamo di conoscere n! e di voler calcolare n (che è appunto il fattoriale inverso). Poniamo m=n!, per cui la (5) si scrive

(6)
che può essere vista come un'equazione nell'incognita n e che, però, non può essere risolta "simbolicamente". Dobbiamo, perciò, risolverla numericamente.

Un'altra osservazione: non sempre la (6) è compatibile, nel senso che è priva di soluzione. Tale circostanza si verifica, ad esempio, per ogni m dispari. Per m=1 l'equazione è compatibile e indeterminata, poichè ammette due soluzioni: n=0 e n=1. Infatti 0!=1!=1. In tutti gli altri casi, se l'equazione è compatibile, allora è determinata (ammette una ed una soluzione). Questa conclusione ci permette di definire univocamente l'antifattoriale per n>1.

 

Assegnato m, per risolvere la (5) i.e. trovare l'antifattoriale,  dobbiamo "provare" per vari n a partire da n=2, fino a quando risulta soddisfatta la formula (6). Dunque, si tratta di applicare un procedimento iterativo che va ripetuto per un certo numero di passi.

Con Mathematica possiamo utilizzare il ciclo Do, la cui sintassi è Do[<espressione>, {n,n_min,n_max,n_step}], dove n è l'iteratore, n_min e n_max individuano il range del ciclo, mentre n_step ne fissa il passo.

In <espressione> inseriamo un costrutto If la cui sintassi è If[<condizione>,T,F], dove T e F sono gli usuali stati logici True e False, rispettivamente. A questo punto non dobbiamo fare altro che dire a Mathematica di controllare la

n = m/(n-1)!

per un assegnato m e per n variabile in un dato range.

 

Si noti che l'estremo superiore del range va fissato "ad occhio", nel senso che dipende dall'ordine di grandezza di m. In altre parole, si va per tentativi. E questo può essere fatto con il ciclo Do.

L'equazione rappresenta la condizione e se occupa lo stato logico True, lo script stampa a video il risultato che è appunto il fattoriale inverso di m.

Concludiamo questo articolo osservando che Mathematica pur non essendo un applicativo orientato unicamente al calcolo numerico, ben si presta nella gestione di problemi la cui soluzione può essere trovata solo per via numerica.

25 Commenti

  1. Piero Boccadoro 7 novembre 2014
  2. Gianluca Angelone GianlucaAngelone 7 novembre 2014
    • Piero Boccadoro 10 novembre 2014
      • katte82 10 novembre 2014
      • Marcello Colozzo Marcello.Colozzo 1 14 novembre 2014
    • Marcello Colozzo Marcello.Colozzo 1 12 novembre 2014
    • Marcello Colozzo Marcello.Colozzo 1 12 novembre 2014
      • Esperanto Esperanto 13 novembre 2014
        • Marcello Colozzo Marcello.Colozzo 1 13 novembre 2014
          • Gianluca Angelone GianlucaAngelone 14 novembre 2014
          • Marcello Colozzo Marcello.Colozzo 1 14 novembre 2014
  3. Esperanto Esperanto 11 novembre 2014
  4. Esperanto Esperanto 12 novembre 2014
    • Gianluca Angelone GianlucaAngelone 12 novembre 2014
      • Esperanto Esperanto 13 novembre 2014
        • Gianluca Angelone GianlucaAngelone 17 novembre 2014
    • Marcello Colozzo Marcello.Colozzo 1 14 novembre 2014
      • Esperanto Esperanto 14 novembre 2014
        • Marcello Colozzo Marcello.Colozzo 1 15 novembre 2014
  5. Marcello Colozzo Marcello.Colozzo 1 13 novembre 2014
  6. Marcello Colozzo Marcello.Colozzo 1 15 novembre 2014
    • Gianluca Angelone GianlucaAngelone 17 novembre 2014
      • Esperanto Esperanto 18 novembre 2014
  7. Esperanto Esperanto 17 novembre 2014
  8. Gianluca Angelone GianlucaAngelone 26 febbraio 2015

Scrivi un commento

Send this to a friend