Algoritmo di Ada Lovelace per i numeri di Bernoulli
Ada Byron e l'algoritmo per il calcolo dei numeri di Bernoulli
L'algoritmo di Ada permette di calcolare i numeri di Bernoulli, senza dover conteggiare tutti quelli ad essi precedenti. Tuttora, questo algoritmo è considerato un risultato brillante, non soltanto per la valenza computazionale, quanto soprattutto nel campo della programmazione informatica. Infatti costituisce un chiaro esempio in cui la Matematica offre validi strumenti anche per lo sviluppo informatico.
Gli algoritmi di Ada Byron e di Bernoulli a confronto
Secondo alcune fonti storiche, per la costruzione del suo programma Ada Lovelace si servì della seguente funzione generatrice esponenziale:
(1)
opportunamente semplificata e modificata nell'espressione:
(2)
Altre fonti non concordano con tale versione per diverse ragioni. In primo luogo perché, pur essendo vero che lo sviluppo della (1), insieme ad altri sviluppi in serie di funzioni trascendenti, contiene numeri di Bernoulli,
come osservato dallo stesso Bernoulli nell'Ars conjectandi e successivamente anche da Eulero e Stirling, non esiste tuttavia alcuna relazione matematica in grado di trasformare la (1) nella (2).
In secondo luogo, pare esistere una lettera della Byron scritta nel luglio del 1843, nella quale chiedeva a Babbage di inviarle la formula generatrice dei numeri di Bernoulli e non uno sviluppo che li contenesse (il che prevede anche una lista dei numeri). Infine, sempre in base a tali fonti, la formula (2) utilizzata dalla Byron non è altro che una rielaborazione della seguente formula utilizzata da Bernoulli:
(3)
e che Ada fra l'altro aveva studiato qualche anno prima, sotto la guida di De Morgan. Per confrontare la formula effettivamente utilizzata dalla Byron con la (3), è sufficiente riscrivere lo sviluppo di quest’ultima sostituendo con e sottraendo da entrambi i membri dell'uguaglianza:
da cui, dividendo ciascun termine per il fattore , si ottiene:
(4)
È possibile riscrivere ciascun coefficiente binomiale che compare nella (4) in modo più semplice. Ad esempio per il primo coefficiente si ha:
oppure per il secondo si ha:
Dunque, semplificando la (4), si perviene in definitiva alla:
(5)
dalla quale, per ricorsività e grazie al supporto di una macchina quale l'Analithycal Engine di Babbage, è assai facile generare progressivamente i numeri di Bernoulli con , come Ada stessa propose.
In realtà, la Byron usò la formula (2) che differisce leggermente dalla (5) sia per l'alternanza dei segni sia per la presenza delle potenze dispari di , oltre che nel numeratore dell'uguaglianza, dove il fattore compare al posto del fattore della (5).
Mediante una congettura piuttosto geniale per quell'epoca, la Byron riuscì a generare i coefficienti incogniti semplicemente mediante iterazioni successive, attribuendo ad valori interi via via crescenti , , , ... In questo modo, sostituendo , tanto nella (2) quanto nella (5), tutti i termini dello sviluppo contenenti si annullano, ossia tutti i termini dal secondo in poi. Ad esempio, per la (5) si ottiene:
dalla quale risulta agevole ricavare . In modo analogo, attribuendo ad il valore si annullano invece tutti i termini che contengono il fattore , ovvero tutti quelli a partire dal terzo:
da cui, una volta noto , si ottiene il secondo coefficiente dello sviluppo . Per spariscono tutti i termini a partire dal quarto e così via per valori sempre crescenti di .
Anche Bernoulli, un secolo prima della Byron, propose un procedimento analogo in base al quale partendo dallo sviluppo (3) e ponendo di volta in volta , , ... si riesce ad arrestare la somma e a calcolare ricorsivamente i coefficienti . Così ad esempio per , e di conseguenza , si ha:
da cui si ricava immediatamente . Ovviamente il numero successivo significativo si ottiene arrestando lo stesso sviluppo per e dunque facendo variare da a
sapendo che , si ottiene:
cioè . Dunque la vera innovazione introdotta dall'algoritmo della Byron rispetto al metodo di Bernoulli sta nell'aver usato ad ogni iterazione la stessa formula, riuscendo a semplificarla di volta in volta al variare del valore dell'incognita . Il calcolo di ciascun numero, uno alla volta, costituisce il ciclo esterno del programma, mentre per calcolare ogni valore frazionario successivo si fa ricorso ad un ciclo secondario. Riportiamo qui di seguito gli algoritmi proposti dalla Byron e da Bernoulli: