COME CALCOLARE LA SOMMA DI DUE NUMERI?

1. Introduzione

In questo contributo, quando parliamo della somma fra numeri, intendiamo riferirci a “numeri reali”. Non intendiamo affatto qui dilungarci sulla loro natura, ma rimandiamo al precedente contributo radici e relativo programma calcolo radici per calcolo delle radici.
Accettata dunque la visione del concetto di numero reale come “allineamento infinito di cifre, separate da una virgola decimale”, ci vogliamo dedicare al calcolo, se possibile, della somma di due tali numeri.
Forse qualcuno ritiene di essere già perfettamente in grado di calcolare la somma fra due numeri (reali), e vorremmo cominciare con il dissuaderlo.
Quindi analizziamo la questione. Per calcolare la somma di due numeri, penso nessuno dubiti che il minimo requisito indispensabile sia di conoscere i due addendi. Ma come possiamo dire di conoscere un numero reale? Come già illustrato in radici, non è sensato pretendere di conoscere tutte le cifre, che sono infinite. Bisogna abbassare le pretese, e chiedere non di conoscere le cifre, ma di saperle generare in quantità arbitraria (finita ma illimitata a priori). Il precedente contributo aveva appunto l’ambizione di illustrare un modo per calcolare un numero arbitrario di cifre della radice n-esima di un numero naturale qualsiasi, e quindi permetteva di calcolare tale numero, nel senso appena precisato.
Poiché quanto appena detto sul senso di “conoscere” un numero reale si applica tanto agli addendi quanto al risultato della somma, ne concludiamo che la formulazione più corretta del problema di cui vogliamo occuparci può essere una delle due seguenti, di cui la seconda particolarmente rivolta a chi ami gli aspetti informatici:

  • Supponendo di disporre di due procedure per generare quante cifre si vogliano di due certi numeri a e b, siamo in grado di generare quante cifre si vogliano della loro somma a + b ?
  • Supponendo di disporre di due programmi per generare quante cifre si vogliano di due certi numeri a e b, siamo in grado di scrivere un programma che generi quante cifre si vogliano della loro somma a + b ?

Può stupire, ma non è così ovvio che la risposta sia si. Cerchiamo anzitutto di capire dove è la difficoltà.

2. Perché la somma è difficile?

Quando abbiamo due numeri espressi in forma decimale con un numero finito di cifre, siamo perfettamente in grado di calcolare la loro somma, fin dai primi anni della scuola elementare: si parte dall’ultima cifra (eventualmente 0 per uno dei due addendi, se ha meno cifre dell’altro), si sommano le ultime cifre, si tiene conto del riporto se il risultato supera 10, si passa alle penultime cifre, e così via fino alla fine.
Ma questa semplice procedura non è applicabile quando le cifre sono in numero infinito: non esiste un’ “ultima cifra” da cui partire.
Dal punto di vista pratico questo fatto non crea particolari problemi: basta approssimare i due addendi troncandoli ad un numero finito di cifre, e sommare i troncati nel modo usuale, ottenendo così un’approssimazione del risultato. Questo è quanto fa qualsiasi strumento di calcolo, incluso quello che sto usando per scrivere, che approssima i numeri reali con un numero finito prefissato di cifre (che in questo caso specifico sono binarie e non decimali, ma questo non sposta il problema).
Dunque questo metodo pratico permette di ottenere un’approssimazione del risultato, ma non risolve affatto il problema da cui siamo partiti, di generare in successione le cifre del risultato. Infatti due numeri possono essere vicinissimi, pur avendo cifre completamente diverse. Questo capita addirittura già per i numeri razionali. Ad esempio 1,999999999999 e 2,0000000000 possono essere considerati molto vicini, ma neppure una cifra del primo coincide con una del secondo.
Questi ragionamenti potrebbero essere ulteriormente raffinati, giungendo a dimostrare che:

  • Non esiste alcuna procedura sicuramente terminante e capace di generare le cifre della somma di due arbitrari numeri reali, supposti dati attraverso due procedure che ne generino le cifre.

Insomma, il nostro problema non è difficile, è irrisolubile, in generale, cioè per arbitrari numeri reali.
Qualcuno, interessato ad aspetti logici della questione, potrebbe addirittura chiedersi: “ma in questa situazione, in cui non so generare le cifre della somma di due numeri, è almeno chiaro cosa intendo per somma?”. La risposta è che, nell’ambito di una certa formulazione della logica e dei fondamenti della matematica, la somma è definibile, ma con una definizione non costruttiva, cioè che porta a dimostrare l’esistenza di un certo numero chiamato somma, ma non fornisce alcun metodo per trovarlo. Se poi una tale situazione sia accettabile o no, è questione di gusti personali. Bisogna però precisare che limitandosi a metodi costruttivi si distruggerebbe una gran parte della Matematica, forse con soddisfazione di molti studenti.

3. Qualche speranza

Abbiamo concluso che non siamo in grado di calcolare, in generale, la somma di due numeri reali. Questo però non significa che abbiamo terminato il lavoro. Infatti potrebbero esserci certi numeri di cui sappiamo calcolare la somma, e proprio a questo vogliamo dedicarci. Questa è una situazione che si trova anche in altri settori: ad esempio si sa che non esiste una formula risolutiva generale per equazioni di grado 5 o superiore, ma questo non implica che non si sappiano risolvere particolari equazioni.
Una vasta classe di numeri reali fra cui sappiamo eseguire la somma (e per inciso anche altre operazioni) è formata dai numeri esprimibili, a partire da interi, con le quattro operazioni dell’aritmetica più estrazioni di radici (in numero arbitrario) di qualsiasi ordine. Esempi:

Per mantenere la trattazione ad un livello semplice, rinunciamo a illustrare questo fatto in generale, e ci limitiamo a vedere un esempio:

  • Come calcolare √2+√3?

O meglio:

  • Come generare un numero arbitrario di cifre di √2+√3?

Dopo risolto questo problema, vedremo come le idee che guidano la soluzione possono essere generalizzate in modo abbastanza naturale, seppure con qualche limitazione.

4. Approccio al problema

Sgombriamo subito il campo da un possibile equivoco. Anche se disponiamo di un algoritmo (calcolo radici) per calcolare la radice n-esima di qualsiasi numero naturale, non lo useremo affatto per calcolare √2e √3. Invece affronteremo direttamente il problema di calcolare le cifre di x=√2+√3 (l’abbiamo chiamato x perché, per il momento, è una quantità incognita).
L’idea però è derivata da calcolo radici. Se si va a rileggere radici e ad esaminare il relativo programma riportato in calcolo radici, si scopre che ciò che si è fatto per calcolare è stato in realtà di considerare l’equazione xn=m, e costruirne la soluzione con i seguenti passi:

  1. ricerca del più grande intero tale che la sua potenza n-esima non superi m;
  2. trovato questo, e quindi la parte intera del risultato, cercare fra i dieci numeri ottenibili aggiungendo una cifra dopo la virgola il più grande tale che la sua potenza n-esima non superi m;
  3. …….
  4. ……

Si intuisce che un metodo simile possa essere applicato anche ad equazioni diverse dalla xn=m, giungendo quindi a costruirne iterativamente le cifre della (delle?) soluzioni.
Per questo il primo passo sarà:

  • trasformare il nostro calcolo di somma nella soluzione di un’equazione.

5. L’equazione soddisfatta dalla nostra somma

Dato che il problema che ci poniamo è il calcolo di x=√2+√3, in un certo senso l’equazione che stiamo cercando è già sotto i nostri occhi. Occorre però trasformarla in una forma che non contenga radicali, in modo da poterla poi trattare con un programma simile a calcolo radici.
Questa è una tipica operazione di razionalizzazione. Si comincia elevando ambo i membri a quadrato, e si ottiene
x2=2+3+2√2√3
ovvero
x2-5=2√2√3
Una seconda elevazione al quadrato fornisce
(x2 – 5)2 = 24
o meglio
(x2– 5)2– 24 = 0 (1)
che è proprio l’equazione richiesta. Si noti che una simile procedura, seppure più complicata, si può applicare in generale ai numeri definiti nel par. 3, e questo già fa intuire come il procedimento sviluppato su un esempio potrebbe essere generalizzato.
Attenzione ad un dettaglio importante: sebbene si sia certi che la nostra somma di radici soddisfi alla (1), non si può dire che trovare una soluzione della (1) sia equivalente al calcolo della nostra somma: infatti la (1) potrebbe anche avere altre soluzioni. Così è in effetti: chi conosce la teoria delle equazioni algebriche sa che un’equazione può avere tante soluzioni quante il suo grado (4 nel caso specifico). Nel caso trattato in calcolo radici, questo problema non si poneva, perché l’equazione era intrinsecamente dotata di una sola soluzione positiva.
Nel caso attuale, senza presupporre nessuna conoscenza algebrica a priori, vediamo di capire chi sono tutte le soluzioni della (1). In sostanza è sufficiente ripercorrere all’indietro, con le dovute cautele, i passi che hanno portato alla (1). Il primo passo non richiede nessuna cautela, e si arriva a
(x2 – 5)2 = 24
A questo punto si estrae la radice quadrata di entrambi i membri, ricordando, come tutti gli studenti sanno, che questa fornisce due valori di segno contrario:
x2 – 5=+-2√2√3
Il passo successivo è indolore, e porta a

x2=5+-2√2√3 =2+3+-2√2√3
=(√2+-√3)2

L’ultimo passo è invece doloroso quanto uno dei precedenti, e fornisce
x=+-(√2+-√3)
In definitiva, si è verificato che la nostra equazione (1) ammette effettivamente 4 soluzioni, che assumono i valori

-√2-√3     +√2-√3     -√2+√3    +√2+√3

Fra essi, quello che stiamo cercando di calcolare è l’ultimo, che è anche il più grande di tutti. Quindi il nostro problema può essere correttamente tradotto nel seguente:

  • Generare le cifre della più grande soluzione dell’equazione (x2– 5)2– 24 = 0

6. Il punto di vista grafico

Prima di procedere, confermiamo e acquistiamo confidenza con i risultati già acquisiti sfruttando una visualizzazione. Facciamo il grafico della funzione y = (x2– 5)2– 24 . Chi non sa nulla di studi di funzione può procedere per tabulazione o usare un programma per tracciare grafici. Ecco il risultato

Già a colpo d’occhio si ritrovano i fatti acquisiti in precedenza: il grafico della funzione mostra 4 attraversamenti dell’asse X, che corrispondono proprio alle quattro soluzioni della (1) di cui abbiamo parlato. Fra di esse ci interessa la più grande, cioè, riferendosi al grafico, il punto di attraversamento più a destra, indicato con una freccia rossa.
Queste considerazioni permettono di precisare subito il punto di partenza per l’algoritmo che genererà le cifre richieste: è evidente che se si parte, ad esempio, dal valore 2 e si cerca la parte intera della soluzione aumentandolo con un passo di 1, si “pizzica” il valore esatto della parte intera del punto di attraversamento giusto (che visibilmente vale 3). Questo fatto è importante, perché se si partisse da un punto iniziale “sbagliato”, per esempio 0, si rischierebbe di “pizzicare” un valore di attraversamento che non corrisponde alla soluzione cercata.
Queste considerazioni visive e intuitive possono comunque essere rese rigorose, semplicemente dimostrando che il punto di partenza proposto, di ascissa 2, è compreso fra le due più grandi soluzioni dell’equazione (1), cioè verificando la doppia disuguaglianza

-√2+√3<2<+√2+√3

Si tratta di un esercizio facilissimo che lasciamo al lettore.

7. L’algoritmo

A questo punto siamo in grado di precisare l’algoritmo che intendiamo usare per calcolare le cifre richieste.
Il primo passo è il calcolo della parte intera: si fa per tentativi: si comincia fissando un certo numero X a 2, si calcola (X2– 5)2– 24, poi si aumenta X di 1, e si continua così fino a quando il risultato del calcolo supera 0. Uno sguardo al grafico basta per convincersi che questo fatto prima o poi capita, anzi capita quasi subito. A questo punto si diminuisce X di 1 e si è ottenuta la parte intera.
Trovata la parte intera, si passa alla prima cifra dopo la virgola. Questa volta i tentativi da fare sono al più 10, quanti i possibili valori di tale cifra. Si parte da 0 (come prima cifra dopo la virgola) e la si aumenta fino a che il valore tentato, inserito al posto di X nella formula (X2– 5)2– 24, non dia un valore positivo. A questo punto si diminuisce di 1 la prima cifra e si ha il valore calcolato fino alla prima cifra decimale.
Il meccanismo si ripete tale e quale fino al numero di cifre richiesto dall’utente.
Il lettore attento si sarà accorto che le frasi iniziali di questo capitolo fino alla presente esclusa sono praticamente identiche a quelle presenti all’inizio del capitolo 3.2 di radici. Infatti devo ammettere che sono state ottenute con “copia e incolla” e qualche modifica per adattarle al contesto attuale. Ma questo non è motivo di vergogna, ma di soddisfazione: stiamo scoprendo che ciò che si è fatto ha una validità piuttosto generale. In realtà le uniche differenze fra l’algoritmo attuale e quello sviluppato in radici e calcolo radici sono le seguenti:

  • Ora il punto di partenza non è 0, ma 2, per i motivi illustrati nel capitolo precedente
  • Ora il criterio per decidere “ho calcolato una certa cifra” non è più del tipo “Xn supera il radicando ? ”, ma “(X2– 5)2– 24 supera 0 ? ”

Questo fa capire che anche il programma sviluppato in calcolo radici resta inalterato nella sua struttura, deve solo essere modificato nelle azioni appena elencate.

8. Il programma

In armonia con quanto appena spiegato, ecco il programma richiesto:

Sub Sommarad2rad3()
Dim dato, valore, valprova, passo As Double

Set cella = Worksheets("Foglio1").Cells(3, 2)
ncifre = cella.Value

Rem troviamo il massimo intero minore della somma richiesta

For intero = 2 To 100000

If ((intero^2-5)^2 - 24 > 0) Then Exit For

Next intero
intero = intero - 1

valore = intero

passo = 0.1

For cifra = 1 To ncifre

For i = 0 To 10

valprova = valore + i * passo
If ((valprova^2-5)^2 - 24 > 0) Then Exit For

Next i
valore = valprova - passo

passo = passo / 10

Set cella = Worksheets("Foglio1").Cells(5 + cifra, 1)
cella.Value = "risultato al passo"
Set cella = Worksheets("Foglio1").Cells(5 + cifra, 2)
cella.Value = cifra
Set cella = Worksheets("Foglio1").Cells(5 + cifra, 3)
cella.Value = valore
Set cella = Worksheets("Foglio1").Cells(5 + cifra, 4)
cella.Value = "verifica"
Set cella = Worksheets("Foglio1").Cells(5 + cifra, 6)
cella.Value = (valore^2-5)^2 - 24

Next cifra

End Sub

Per evidenziare quanto è simile al programma illustrato in calcolo radici, per le poche modifiche si è usato il carattere rosso. Inoltre si noti che la parte iniziale di inserimento dei dati è stata ridotta, perché attualmente, avendo evitato di fare una trattazione generale, l’unico dato da introdurre è il numero di cifre richieste.

9. L’ambiente di utilizzo

Ovviamente si è scelto lo stesso ambiente di utilizzo descritto in radici e calcolo radici, cioè il programma è stato inserito come una macro in un file EXCEL (sommarad2rad3.xls - 26KB).
Per le impostazioni, le modalità di accesso, l’esecuzione, l’osservazione ed eventuale modifica del programma fornito, l’analisi dei risultati, l’uso del debugger, si rimanda a quanto descritto in radici.
Si ricorda solo che, concordemente a quanto detto alla fine del capitolo precedente, ora l’utente deve inserire un solo dato, il numero di cifre richiesto, scrivendolo nella cella B3 prima di attivare la macro, che ora si chiama, per evidenti motivi, Sommarad2rad3.

10. Risultati

Riportiamo, per completezza, i risultati ottenuti eseguendo il programma, relativi ad un numero di cifre richiesto pari a 20.

risultato al passo 1 3,1 verifica -2,7479
risultato al passo 2 3,14 verifica -0,38429
risultato al passo 3 3,146 verifica -0,0163
risultato al passo 4 3,1462 verifica -0,00397
risultato al passo 5 3,14626 verifica -0,00027
risultato al passo 6 3,146264 verifica -2,30E-05
risultato al passo 7 3,1462643 verifica -4,30E-06
risultato al passo 8 3,14626436 verifica -6,10E-07
risultato al passo 9 3,146264369 verifica -5,80E-08
risultato al passo 10 3,14626437 verifica -2,60E-09
risultato al passo 11 3,14626437 verifica -1,20E-10
risultato al passo 12 3,14626437 verifica -6,00E-11
risultato al passo 13 3,14626437 verifica -4,40E-12
risultato al passo 14 3,14626437 verifica -1,40E-13
risultato al passo 15 3,14626437 verifica -2,10E-14
risultato al passo 16 3,14626437 verifica 1,42E-14
risultato al passo 17 3,14626437 verifica 1,42E-14
risultato al passo 18 3,14626437 verifica 1,42E-14
risultato al passo 19 3,14626437 verifica 1,42E-14
risultato al passo 20 3,14626437 verifica 1,42E-14

La loro interpretazione, del resto analoga a quanto riportato nel capitolo 4 di radici, è semplicissima: ogni riga corrisponde al calcolo di una nuova cifra dopo la virgola; quindi, ad esempio, al passo 1 si ha il numero 3,1, che è la miglior approssimazione inferiore della somma cercata con una sola cifra decimale. L’ultima colonna fornisce il valore della approssimazione trovata inserita nella formula (X2– 5)2– 24 , e il suo discostarsi da 0 da un’idea della precisione raggiunta.
Ovviamente si nota lo stesso difetto rilevato nel capitolo 5 di radici: dopo un certo numero di cifre non si riesce più a generarne di nuove. Come già illustrato in radici, questo dipende non da un difetto dell’algoritmo, ma dal fatto che forzatamente esso è eseguito non su una macchina da calcolo ideale, ma su questa specifica, che intrinsecamente lavora con un numero limitato di cifre.

11. Generalizzazione

L’algoritmo e il programma sono stati presentati per un esempio particolare, il calcolo di √2+√3 .
Ma contengono in se il germe della generalizzazione. Al riguardo ci sono da considerare due punti:

  1. In realtà il programma sviluppato non sa nulla di somma di numeri reali, ma piuttosto si occupa di “risolvere” una certa equazione algebrica, nel caso particolare la (X2– 5)2– 24 = 0. E’ abbastanza ovvio che la sostituzione di questa con un’altra, per esempio X27 + 35 X12– 7X5 = 0 è quasi immediata, e tocca solo alcune delle parti in rosso nel listato presentato nel capitolo 8. Anzi, chi conosce un po’ più a fondo il linguaggio Basic può addirittura scrivere il programma in una forma del tutto generale lasciando solo indicata l’equazione specifica da considerare, che viene fornita a parte, come funzione Basic.
    Quindi il programma fornito è sostanzialmente idoneo a generare le cifre di qualsiasi numero reale che sia soluzione di un’opportuna equazione algebrica a coefficienti interi. Questi numeri sono così importanti da meritare un nome loro dedicato: si chiamano “numeri algebrici”. Quanto poi a generare l’equazione che è soddisfatta da un certo numero, definito come somma (o anche altre operazioni) su altri numeri algebrici, si tratta sostanzialmente di eseguire i passi di razionalizzazione riportati nel capitolo 5. Programmare queste operazioni per il caso più generale possibile non è semplicissimo, ma possibile. Sono disponibili dei software per manipolazione di espressioni algebriche, capaci in particolare di eseguire, con qualche limitazione, le operazioni necessarie per razionalizzare espressioni e produrre così l’equazione da noi richiesta.
  2. Un po’ più delicata, dal punto di vista di un’automatizzazione, è la discussione riportata nel capitolo 6 riguardo alla scelta del punto di partenza. Qui si tratta di considerare almeno i seguenti punti:
    • Fra le molte soluzioni che può avere un’equazione algebrica, identificare quella che ci interessa;
    • Separare la soluzione identificata dalle eventuali altre, e quindi identificare un punto di partenza tale che muovendo da esso si arrivi certamente alla soluzione voluta e non ad un’altra;
    • Decidere anche il passo iniziale: nel nostro esempio questo punto non era stato considerato, perché fortuna volle che la separazione fra le soluzioni fosse così grande da permettere di partire senz’altro con passo pari a 1. In casi più generali è possibile che la separazione sia minore, e quindi si sia costretti a partire da un punto vicino alla soluzione voluta, e di conseguenza a ridurre il passo in modo da non saltarla.

    Dal punto di vista di un essere umano, la soluzione più rapida, ma da prendere con qualche cautela, di questi problemi può essere ottenuta visivamente dall’osservazione del grafico della funzione che compare al primo membro dell’equazione da risolvere, come si è fatto nel capitolo 6. Il guaio è che la capacità umana di capire situazioni con “un colpo d’occhio” è assai lontana dalle capacità di bovina e paziente ripetizione di operazioni elementari propria delle macchine da calcolo. Quindi programmare tali tipi di attività non è certo semplice. Però è possibile, come dovrebbe sapere chiunque abbia usato un lettore automatico di testi, seppure con qualche limitazione. La conclusione è che presentare un programma semplice capace di fare nella massima generalità quanto qui sarebbe richiesto non è possibile, però è certamente possibile scrivere un programma sofisticato che sappia gestire la situazione, magari con qualche limitazione o con la necessità di essere parzialmente guidato da una persona. Ovviamente non ci addentriamo in questi problemi.

Le considerazioni svolte dovrebbero almeno far capire quanta differenza ci sia fra un programma dimostrativo, quale quello qui presentato, e un programma effettivamente usabile. Possiamo assicurare che per passare dal primo al secondo lo sforzo non raddoppia, si centuplica. E per quanto sforzo e attenzione si dedichi al problema, capiterà sempre qualche situazione che non si è stati capaci di prevedere, e che manderà in crisi il sistema “effettivamente usabile”. Questo obbligherà ad estenderlo, fino a scoperta di un nuovo caso critico. In questo c’è tutta la differenza fra il mondo astratto della matematica, e il mondo della realtà, di cui il primo è al più una limitata imitazione.

12. Esercizi proposti

Superando le note pessimistiche riportate alla fine del paragrafo precedente, suggeriamo al lettore alcuni esercizi. Si potrebbe provare a modificare il programma presentato, per adattarlo a fare qualche altro calcolo fra numeri reali (non solo somme, non c’è alcun motivo per fare questa limitazione). Per esempio, si propone:

  • √5+√6
  • √2/√3
  • (√2+√3)/√5
  • ………………

Si confermerà il fatto che le modifiche al programma toccheranno sostanzialmente solo le parti scritte in rosso.

13. Conclusioni

Probabilmente molti pensano che la matematica sia un insieme di “regole” certe per risolvere problemi. Si spera che questo limitato contributo valga almeno a sfatare questa convinzione. Siamo partiti da una considerazione catastrofica: non siamo neppure capaci di calcolare la somma di due numeri. Ma non ci siamo fermati e abbiamo scoperto classi di numeri con cui siamo capaci di operare, e a prima vista in modo decisamente semplice. Ma questo momento di autocompiacimento è durato poco, perché abbiamo scoperto le difficoltà di generalizzazione descritte nel capitolo 11. Ancora non ci siamo fermati, abbiamo delineato come potrebbero essere superate, o meglio allontanate.
Questo processo di alternanze fra successi e delusioni è tipico della matematica (e di qualsiasi costruzione umana). Si potrebbe, schematizzando, concludere che non esiste alcun problema matematico completamente risolto, e non esiste nessun problema matematico su cui si sia totalmente disarmati. Il confine si sposta continuamente, e ci sarà sempre spazio per la costruzione individuale.

14. Riferimenti

  1. radici :
    http://www2.polito.it/didattica/polymath/ICT/Htmls/Interventi/Articoli/Italia/CalcoloRadici/CalcoloRadici.htm
  2. calcolo radici :
    http://www2.polito.it/didattica/polymath/ICT/Htmls/Interventi/Articoli/Italia/CalcoloRadici/Img/radici.xls