Introduzione - Storia degli algoritmi

Pagina creata da Vincenzo Marini
 
CONTINUA A LEGGERE
Introduzione - Storia degli algoritmi
Introduzione

Gli algoritmi oggi controllano tantissimi aspetti delle nostre vite: ci sono algorit-
mi che cercano per noi informazioni sul web, che decidono i prezzi dei biglietti
aerei e quali pubblicità vedremo su internet, algoritmi che progettano serie tv,
algoritmi che ci guidano passo passo nel raggiungere una destinazione usan-
do un navigatore o un programma su uno smartphone, algoritmi che decidono
quali notizie vediamo nei social network.
   Ma cosa è, esattamente, un algoritmo? Sono state proposte diverse definizio-
ni, di cui parleremo in maggior dettaglio in seguito; per il momento possiamo
dire che un algoritmo è simile a una ricetta: è un procedimento per giungere a
un risultato (ad esempio, una torta) a partire da dati o informazioni in ingresso
(gli ingredienti). Questa metafora ci consente anche di chiarire la relazione tra
programmi e algoritmi: gli algoritmi sono la parte teorica di un programma per
computer e esistono indipendentemente dall’essere stati implementati in uno o
più programmi; questo è simile a quello che avviene per le ricette, che rappre-
sentano la parte teorica della cucina: una ricetta esiste indipendentemente del
fatto che sia stata implementata (preparando il piatto corrispondente) una o
più volte.
   Da un punto di vista storico, i primi algoritmi di cui abbiamo traccia risalgo-
no a circa 4000 anni fa, nell’antico Egitto e a Babilonia, ed erano essenzialmen-
te algoritmi di calcolo numerico, come gran parte degli algoritmi fino al secolo
scorso.
   Ma la vera grande rivoluzione che ha portato gli algoritmi a diffondersi
non ha a che fare con il calcolo numerico, bensì con due fattori: la capacità
di manipolare informazioni di qualsiasi natura, non solo numeri, e la diffusione
12                                breve e universale storia degli algoritmi

dei computer e il loro collegamento nell’artefatto più complesso realizzato
dall’uomo - il World Wide Web, la rete di documenti e contenuti che si poggia
su Internet, la rete di reti di computer.
     In questo libro ripercorriamo le tappe dell’incredibile ascesa al potere degli
algoritmi: nel capitolo seguente cercheremo di comprendere meglio cosa sia un
algoritmo, con esempi di algoritmi creati da personaggi che non vi aspettereste,
come Giulio Cesare, Edgar Allan Poe e Sherlock Holmes, solo per citarne alcuni.
I due capitoli successivi descrivono, per sommi capi, le idee e le persone che
hanno portato alla creazione del computer, ovvero di una macchina in grado di
eseguire qualsiasi algoritmo, e di Internet e del World Wide Web. Nel quarto
capitolo parleremo degli algoritmi usati dai colossi dei nostri giorni: Google,
Facebook, Amazon e Netflix; come vedremo, i loro sistemi sono accomunati dal
fatto di cercare di capire cosa ci piaccia.
     Poi affronteremo aspetti di cui si parla poco: fino ad ora ci siamo concentrati
sull’interazione tra le persone e gli algoritmi, ma cosa succede quando gli algo-
ritmi interagiscono tra di loro? E vedremo anche come sia possibile costruire,
tramite algoritmi, un sistema monetario decentralizzato (Bitcoin) basato su una
tecnologia interessantissima ma al tempo stesso piena di insidie, la Blockchain.
Infine, parleremo dei recentissimi progressi nel campo dell’intelligenza artifi-
ciale, ottenuti con idee algoritmiche che risalgono alla metà del secolo scorso
ma che solo oggi, disponendo di potenza di calcolo adeguata e grandi quantità
di dati (i famigerati Big Data), si stanno manifestando.
     Per i lettori più arditi, in appendice riportiamo alcuni esempi di program-
mi in diversi linguaggi di programmazione; alla fine di ogni capitolo trovate
un indovinello algoritmico, la cui soluzione è proprio un algoritmo. Se volete
verificare la correttezza della soluzione trovata, o non siete riusciti a risolverli,
le soluzioni sono alla fine di questo libro.
capitolo 1
                                Dixit Algorizmi

                                                L’informatica riguarda i computer
                               non più di quanto l’astronomia riguardi i telescopi.
                                                           - Edsger Wybe Dijkstra

Metodo. Procedura. Regola (o insieme di regole). Procedimento. Questi sono
alcuni dei nomi con i quali ci riferiamo comunemente ad algoritmi veri e propri.
E di solito usiamo il termine algoritmo solo per indicare qualcosa collegato a
attività informatiche, anche molto diverse tra di loro: “gli algoritmi controllano
i mercati azionari”, “gli algoritmi decidono i prezzi dei biglietti aerei” e “un
algoritmo sceglie la tua anima gemella”.
   Nell’immaginario collettivo, alla parola algoritmo è associato un alone di
mistero: cosa faccia, e quindi cosa sia, un algoritmo, non è dato saperlo. Se poi
proviamo a cercare su internet, o nei testi di informatica, troviamo definizioni
che non sembrano essere di grande aiuto: Wikipedia propone, ad esempio, “un
algoritmo è un procedimento che risolve un determinato problema attraverso un
numero finito di passi elementari”. La definizione è sicuramente corretta, ma in
parecchi rimarrà il dubbio: come fanno questi passi elementari a controllare i
mercati azionari, scegliere il prezzo di un biglietto aereo o, addirittura, trovarci
l’anima gemella?
   Per rispondere alla domanda qui sopra (ma senza grosse garanzie per quello
che riguarda la vostra anima gemella) dobbiamo innanzitutto chiarire cosa sia,
esattamente, un algoritmo.
14                                breve e universale storia degli algoritmi

                     una semplice moltiplicazione

Facciamo un passo indietro di circa ottocento anni e immaginiamo di essere
intorno all’anno 1200, nell’antica repubblica di Pisa, una delle principali repub-
bliche marinare dell’epoca. Avete appena concluso una vendita, ben 35 tessuti
in seta al buon prezzo di 12 denari per ogni tessuto. Per calcolare il prezzo to-
tale dovete fare una semplice moltiplicazione; usando la notazione in vigore al
tempo, ovvero i numeri romani, possiamo scrivere:

                                X X X V × X I I = ??

     Qui ci accorgiamo che abbiamo un problema, non sappiamo fare la molti-
plicazione con il sistema di numerazione romano: all’epoca, in effetti, per le
operazioni matematiche usavano un abaco, ovvero uno strumento di calcolo si-
mile, in alcune sue versioni, a un pallottoliere. Noi invece abbiamo imparato già
alle elementari come fare le moltiplicazioni, con il metodo chiamato in colonna,
che mostriamo in Figura 1.1.
     Il calcolo del prodotto di due numeri viene ricondotto al calcolo di prodotti
semplici (il primo numero per ogni cifra del secondo numero) e di somme. Ab-
biamo quindi risolto un problema (calcolo del prodotto di due numeri) usando
dei passi elementari (prodotto di un numero per una cifra e semplici somme):
abbiamo appena usato un algoritmo! Un algoritmo che conoscete fin dalle scuole
elementari ma che probabilmente non avete mai chiamato con questo nome!
     Con questo algoritmo chiunque è in grado di calcolare il prodotto di due
numeri, indipendentemente da quanto siano grandi. Chiaramente, più grandi

                                       35    ×
                                       12    =
                                       70
                                      35
                                      420

                       Figura 1.1: Moltiplicazione in colonna.
capitolo 1 - dixit algorizmi                                                    15

sono i numeri e maggiore sarà, in generale, il tempo necessario a calcolare il
loro prodotto.
   La scelta di questo algoritmo come primo esempio non è casuale: viene de-
scritto nell’opera Algoritmi de Numero Indorum di Al-Khuwarizmi. In questa
opera fondamentale, scritta in arabo con il titolo Kitab al-hisab al-hindi presu-
mibilmente intorno all’anno 825, ma di cui a noi sono giunte solo traduzioni in
latino, l’autore illustra il sistema di numerazione indiano, che usa un simbolo
speciale per indicare lo zero, e le regole per fare le quattro operazioni e per
il calcolo delle frazioni. Questa opera, nelle sue diverse traduzioni, avrà gran-
de diffusione in tutta europa e dalla latinizzazione del nome di Al-Khuwarizmi
nasce il termine algoritmo.
   Il fatto che le cifre indiane siano arrivate in Europa attraverso Al-Khuwarizmi
chiarisce perché spesso ci si riferisca ad esse con il nome di cifre arabe (o anche
cifre indo-arabe).

                        il liber abaci di fibonacci

Tra le traduzioni dell’opera di Al-Khuwarizmi c’è un testo scritto nel 1202 da un
matematico pisano, Leonardo Pisano detto Fibonacci: il Liber Abaci, ovvero il
Libro dell’Abaco, inteso come calcolo. Fibonacci non si limita a una semplice
traduzione dell’opera di Al-Khuwarizmi ma, come lui stesso ammette nel Liber
Abaci, integra la conoscenza della matematica indiana e araba, ottenuta leg-
gendo le opere di Al-Khuwarizmi, con la matematica Euclidea. Il risultato è un
testo di importanza fondamentale in quanto, per la prima volta, la materia vie-
ne esposta in maniera didattica dedicata non ai matematici ma ai commercianti,
che erano infatti i veri destinatari del testo.
   Secondo Pietro Cossali, autore di quella che viene considerata la prima ope-
ra di storia della matematica scritta in italiano, pubblicata in due volumi nel
1797 e nel 1799, il Liber Abaci è stato il principale artefice della diffusione delle
conoscenze dell’algebra e dell’aritmetica moderne: da Pisa ha raggiunto tutta
la Toscana, e in particolare Firenze; da qui si è diffuso in tutta Italia, compresa
Venezia che ha contribuito a farlo conoscere in tutta Europa. La prima edizio-
16                                breve e universale storia degli algoritmi

     Al-Khuwarizmi

                                     Abū Ja‘far Muḥammad ibn Mūsā Al-
                                     Khuwarizmi nasce intorno al 780 d.C.
                                     in Corasmia, una regione asiatica corri-
                                     spondente all’odierna Khorezm in Uzbe-
                                     kistan.
                                     Il Califfo al-Mamūn lo nominò responsa-
                                     bile della Casa della Saggezza, il leggen-
                                     dario polo culturale arabo che è arriva-
                                     to a contenere, al suo apice, più di mez-
                                     zo milione di volumi. La Casa della Sag-
                                     gezza era stato fondata dal padre di al-
                                     Mamūn, il Califfo Harun Al-Rashid, noto
     anche per essere il protagonista di parecchie storie de Le mille e una
     notte.
     Sotto la direzione di Al-Khwarizmi, le principali opere matematiche del
     periodo greco-ellenistico, persiane, babilonesi e indiane furono tradotte
     in arabo.
     Intorno all’825 d.C. Al-Khwarizmi scrisse un testo, poi tradotto in latino
     con il titolo Algoritmi de Numero Indorum, considerato il primo trattato
     completo sul sistema numerale indiano; il termine algebra deriva proprio
     dal titolo arabo di questo libro.
     Al-Khwarizmi ha dato contributi anche in astronomia, scrivendo un te-
     sto, derivato da opere indiane e dal lavoro di Tolomeo, in cui mostrava
     come calcolare la posizione del Sole, della Luna e dei pianeti. Scrisse
     anche un testo di geografia, in cui elencava latitudine e longitudine di
     oltre duemila località che includevano città, mari, montagne, regioni,
     isole e fiumi. Visse fino all’anno 850 d.C. circa. Nella figura, un fran-
     cobollo commemorativo dei 1200 anni (circa) dalla nascita, stampato in
     Unione Sovietica nel 1983.
capitolo 1 - dixit algorizmi                                                      17

ne del Liber Abaci, quella del 1202, è andata persa; a noi è giunta la seconda
versione dell’opera, scritta da Fibonacci nel 1228.
   In questa seconda versione Fibonacci ha aggiunto del materiale, tra cui
probabilmente anche i famosi numeri omonimi (numeri di Fibonacci), ovvero
i numeri della sequenza (o successione)

                             1, 1, 2, 3, 5, 8, 13, 21, . . .

   Come possiamo vedere, a parte i primi due numeri (entrambi 1), ogni nume-
ro è la somma dei due che lo precedono. Questa sequenza ha moltissime pro-
prietà matematiche, comprese relazioni con la sezione aurea e con il Triangolo
di Tartaglia; alcune moderne strutture dati informatiche (Heap di Fibonacci)
sono state ispirate proprio da questa sequenza.
   Grazie alla diffusione di quest’opera, i numeri indiani hanno gradualmente
spodestato, in tutta Europa, i numeri romani. A tal proposito, una curiosità:
tra i primi a recepire l’importanza del Liber Abaci furono i banchieri, che pre-
stavano denaro e avevano bisogno di calcolare gli interessi. Tuttavia, questo
repentino cambio di scrittura, dai familiari numeri romani alle cifre di origine
indiana, fu giudicato sospetto dai governanti dell’epoca: i banchieri furono ac-
cusati di aver cifrato i loro libri allo scopo di renderli incomprensibili e quindi
pagare meno tasse del dovuto; nel 1299 a Firenze fu addirittura emanata una
legge (Statuto dell’Arte del Cambio) che proibiva l’uso delle cifre nelle scritture
contabili. Da questi fatti deriva l’etimologia di cifrare, nel senso di codificare:
in origine voleva solo indicare lo scrivere usando le cifre di origine indiana.

                     come uscire da un labirinto

L’algoritmo per moltiplicare due numeri, visto nella sezione precedente, è un
esempio tipico di algoritmo di calcolo numerico. Vediamo adesso alcuni al-
goritmi di tipo diverso, iniziando con quelli in grado di guidarci fuori da un
labirinto.
18                                 breve e universale storia degli algoritmi

     Leonardo Pisano, detto Fibonacci

                                      Leonardo Pisano, detto Fibonacci, nasce
                                      intorno al 1170 a Pisa, figlio di un mercan-
                                      te. Da giovane, accompagnando il padre
                                      nei suoi viaggi, visse a Bugia, nell’odierna
                                      Algeria ed entrò in contatto con il mon-
                                      do arabo e con l’opera di Al-Khwarizmi.
                                      Comprese subito che il contenuto, per
                                      certi versi rivoluzionario, doveva essere
                                      diffuso a tutti, non solo ai matematici.
                                      Così, nel 1202, Fibonacci scrisse la sua
     opera monumentale, il “Liber Abaci”, che spiegava in un linguaggio com-
     prensibile i metodi (algoritmi!) per fare le operazioni matematiche di
     base (somme, sottrazioni, moltiplicazioni e divisioni).
     La pubblicazione del Liber Abaci diede a Fibonacci una grandissima
     notorietà: tra i suoi estimatori dell’epoca figura persino Federico II di
     Svevia, prima re di Sicilia e poi Imperatore del Sacro Romano Impero.
     Federico II cercò di convincere, invano, Fibonacci a trasferirsi alla sua
     corte, ebbe con lui un fitto rapporto epistolare e gli assegnò un vitali-
     zio. Parecchi studiosi sono convinti che la corrispondenza tra i due ebbe
     influenza diretta nella progettazione di Castel del Monte, la fortezza di
     Federico II, inserita dall’Unesco nella lista dei Patrimoni dell’umanità per
     l’armoniosa unione degli elementi culturali del Nord Europa, del mondo
     islamico e dell’antichità classica.
     Nel 1228, Fibonacci scrisse una versione rivista del “Liber Abaci” che ag-
     giungeva alcune cose necessarie e ne rimuoveva alcune superflue e la de-
     dicò a Michele Scoto, un astronomo e astrologo della corte di Federico
     II. Questa versione del 1228 è l’unica che è sopravvissuta fino ai giorni
     nostri; tra le aggiunte, pare che ci sia anche la famosa successione di nu-
     meri che adesso porta il suo nome: la successione di Fibonacci (o anche
     semplicemente i numeri di Fibonacci).
capitolo 1 - dixit algorizmi                                                        19

   Ne Il nome della rosa, il famoso romanzo di Umberto Eco da cui è stato
anche tratto un film interpretato da Sean Connery, il protagonista Gugliemo
da Baskerville racconta al suo discepolo Adso un metodo (un algoritmo!) per
uscire da un labirinto, metodo appreso da un antico testo:
   “Per trovare la via di uscita da un labirinto,” recitò infatti Guglielmo, “non vi
è che un mezzo. A ogni nodo nuovo, ossia mai visitato prima, il percorso di arrivo
sarà contraddistinto con tre segni. Se, a causa di segni precedenti su qualcuno
dei cammini del nodo, si vedrà che quel nodo è già stato visitato, si porrà un solo
segno sul percorso di arrivo. Se tutti i varchi sono già stati segnati allora bisognerà
rifare la strada, tornando indietro. Ma se uno o due varchi del nodo sono ancora
senza segni, se ne sceglierà uno qualsiasi, apponendovi due segni. Incamminandosi
per un varco che porta un solo segno, ve ne apporremo altri due, in modo che ora
quel varco ne porti tre. Tutte le parti del labirinto dovrebbero essere state percorse
se, arrivando a un nodo, non si prenderà mai il varco con tre segni, a meno che
nessuno degli altri varchi sia ormai privo di segni.”
   Se il metodo vi sembra complicato, sappiate che anche Guglielmo era dub-
bioso sull’efficacia: quando il suo discepolo gli chiede “E secondo questa regola
si esce?”, lui risponde “Quasi mai, che io sappia.”
   In realtà l’algoritmo descritto non proviene da un antico testo ma è stato
inventato da Trémaux nel 1892: l’idea è quella di marcare con un singolo se-
gno il corridoio che stiamo percorrendo, mettendo il segno sia all’inizio che alla
fine del corridoio. Se poi siamo costretti, perché non ci sono altre possibilità,
a ripercorrere all’indietro il corridoio, aggiungiamo altri due segni, sempre ad
entrambe le estremità del corridoio. In questa maniera sapremo che, relativa-
mente alle entrate marcate con tre segni, non portano da nessuna parte. Se il
labirinto ha una entrata e una uscita allora il percorso tra le due sarà quello che
passa attraverso i corridoi con un solo segno. Se invece il labirinto ha solo una
entrata (che quindi coincide con l’uscita), questo algoritmo fa percorrere tutti i
corridoi del labirinto due volte, in entrambe le direzioni.
   Se pensate che l’algoritmo di Trémaux sia complicato, nel caso dobbiate
affrontare un labirinto potete usare quello che è stato usato nella versione ci-
nematografica de Il nome della rosa: qui, a differenza del romanzo, Gugliemo
20                                   breve e universale storia degli algoritmi

Figura 1.2: Un labirinto e il relativo percorso di uscita, usando la regola della mano
sinistra. La planimetria è quella del labirinto, i cui lati misuravano venti metri, installato
nel 2014 nel National Building Museum di Washington D.C., progettato dall’architetto
Bjarke Ingels.
capitolo 1 - dixit algorizmi                                                     21

consiglia a Adso di girare sempre a sinistra. L’algoritmo, noto anche con il no-
me di regola della sinistra (o regola della destra), consiste semplicemente nel
poggiare una mano (la sinistra o la destra, indifferentemente) su un muro e
camminare in modo da tenere la mano sempre poggiata sul muro. In questo
modo, ogni volta che si arriva a un vicolo cieco, se ne uscirà continuando a per-
correrlo (costeggiando tutto il muro). Se il labirinto ha un solo ingresso, che è
anche il punto di uscita, l’algoritmo visita tutto il labirinto.
   Questo algoritmo garantisce di poter uscire da qualsiasi labirinto, come quel-
lo mostrato in Figura 1.2, ed è noto anche ad Harris, uno dei protagonisti del
romanzo Tre uomini in barca (per non parlar del cane) di Jerome K. Jerome.
Harris, parlando del labirinto di Hampton Court, dice infatti: “Basta sempre
prendere la prima a destra”, anche se poi il gruppetto di persone da lui guida-
to si perderà e dovrà ricorrere all’aiuto del custode del labirinto per riuscire a
uscirne.

                              messaggi segreti

Abbiamo visto in precedenza come il termine cifrare, con il significato di na-
scondere un messaggio per renderlo comprensibile solo al legittimo destinata-
rio, derivi dalle cifre indo-arabe. Dopo aver visto come usare un algoritmo per
uscire da un labirinto, adesso vedremo prima un esempio di algoritmo per cifra-
re il testo, usato da Giulio Cesare, e poi degli algoritmi per decifrare un testo,
usati da Edgar Allan Poe e Arthur Conan Doyle nelle loro opere letterarie.
   Giulio Cesare usava un codice molte semplice: dopo aver eliminato ogni
spazio dal messaggio, sostituiva ogni lettera con la lettera che dista tre posizioni
nell’alfabeto: la A diventava quindi una D, la B una E e così via, come mostrato

                Testo in chiaro:    a b c d e f g h i j k l m
                Testo cifrato:      D E F G H I J K L M N O P
                Testo in chiaro:    n o p q r s t u v w x y z
                Testo cifrato:      Q R S T U V W X Y Z A B C

                           Figura 1.3: Cifrario di Cesare.
22                                 breve e universale storia degli algoritmi

in Figura 1.3 dove usiamo la convenzione, tipica della crittologia, di usare i
caratteri minuscoli per il testo in chiaro e i caratteri maiuscoli per il testo cifrato.
     Ad esempio, supponiamo che Cesare volesse trasmettere in maniera sicura il
seguente messaggio: Forza Roma. Come primo passo eliminiamo tutti gli spazi
(e usiamo solo caratteri minuscoli per rispettare la convenzione della crittolo-
gia). Il messaggio da cifrare diventa quindi forzaroma. I passi elementari di
questo algoritmo sono quelli di sostituire ad ogni lettera quella che la segue di
tre posizioni nell’alfabeto, come mostrato in Figura 1.3.
     Eseguendo questi passi, uno alla volta, si ha:
                                     forzaroma
                                     Iorzaroma
                                     IRrzaroma
                                     IRUzaroma
                                     IRUCaroma
                                     IRUCDroma
                                     IRUCDUoma
                                     IRUCDURma
                                     IRUCDURPa
                                     IRUCDURPD

     Otteniamo quindi IRUCDURPD che è la versione cifrata di Forza Roma. Per
decodificare questo messaggio bisogna seguire il procedimento inverso, ovvero
sostituire ad ogni lettera quella che la precede di tre posizioni nell’alfabeto.
     Il cifrario di Cesare è un cifrario monoalfabetico, in cui a ogni lettera corri-
sponde una sola lettera dell’alfabeto; per cifrare e decifrare i messaggi si usa una
tabella di cifratura, come quella mostrata in Figura 1.3, dove per ogni lettera
possiamo leggere la lettera corrispondente.
     Persino nella Bibbia, e più precisamente nel libro di Geremia, troviamo un
cifrario di questo tipo, detto cifrario Atbash, che viene usato per cifrare il no-
me di Babele. In questo cifrario, la prima lettera dell’alfabeto viene cifrata con
l’ultima, la seconda con la penultima, e così via. Il nome di questo cifrario
deriva dall’alfabeto ebraico: in questo alfabeto la prima lettera (Aleph) viene
cifrata con l’ultima (Tav), mentre la seconda (Bet) viene cifrata con la penul-
capitolo 1 - dixit algorizmi                                                    23

                Testo in chiaro:    a b c d e f g h i j k l m
                Testo cifrato:      Z Y X W V U T S R Q P O N
                Testo in chiaro:    n o p q r s t u v w x y z
                Testo cifrato:      M L K J I H G F E D C B A

                            Figura 1.4: Cifrario Atbash.

tima (Shin); abbiamo quindi A con T e B con SH e da queste coppie deriva il
nome Atbash. In Figura 1.4 mostriamo la tabella del cifrario Atbash, usando il
moderno alfabeto internazionale.
   Quindi, se volessimo usare questo cifrario per codificare il messaggio
precedente, i passaggi sarebbero i seguenti:
                                 forzaroma
                                 Uorzaroma
                                 ULrzaroma
                                 ULIzaroma
                                 ULIAaroma
                                 ULIAZroma
                                 ULIAZIoma
                                 ULIAZILma
                                 ULIAZILNa
                                 ULIAZILNZ

   È importante sottolineare che, in questi cifrari monoalfabetici, l’algoritmo
rimane sempre lo stesso: prendi una lettera alla volta e sostituiscila con la
lettera corrispondente della tabella di cifratura (come quelle mostrate nelle
Figure 1.3 e 1.4).
   Quello che cambia, per ogni cifrario, è la tabella di cifratura, che negli esem-
pi mostrati finora utilizza lo stesso alfabeto del messaggio in chiaro, ma ovvia-
mente nulla vieta che venga utilizzato un alfabeto creato per l’occasione, come
vedremo in seguito.
   Se invece decidiamo di usare l’alfabeto tradizionale, quanti cifrari (monoal-
fabetici) diversi esistono? Come abbiamo visto, nel caso di questi cifrari l’al-
24                                breve e universale storia degli algoritmi

goritmo è sempre lo stesso, mentre quello che cambia è la tabella di cifrature.
Quindi la domanda precedente è equivalente a chiedersi: quante sono le pos-
sibili tabelle di cifratura? Per contarle possiamo fare nel modo seguente: per
cifrare la lettera ‘a’ abbiamo 26 scelte, una per ogni lettera dell’alfabeto; dopo
aver scelto quale lettera usiamo per la ‘a’, ci rimangono 25 scelte possibili per
cifrare la lettera ‘b’, e così via... quando arriviamo a decidere quale lettera usare
per cifrare la ‘z’ ne sarà rimasta solo una disponibile. Quindi il numero totale
di cifrari è:
                     26 × 25 × 24 × 23 × . . . × 4 × 3 × 2 × 1 =

                     = 403.291.461.126.605.635.584.000.000

     Esistono quindi circa 400 milioni di miliardi di miliardi di cifrari monoalfa-
betici! Se non si è in possesso della tabella di cifratura sembrerebbe arduo riu-
scire a decifrare un messaggio ma, come vedremo, ci sono algoritmi anche per
questo compito, che ricade nella crittanalisi, ovvero l’arte di decifrare messaggi
segreti.

                       decifrare messaggi segreti

In realtà, i cifrari monoalfabetici non sono considerati cifrari molto sicuri, in
quanto soffrono di un problema legato alle caratteristiche della lingua in cui
viene scritto il messaggio. Le lettere dell’alfabeto, in una data lingua, non ven-
gono utilizzate in maniera uniforme; basti pensare, ad esempio, a quante poche
siano le parole in italiano in cui compaiono le lettere K, X, W e Y. Sappiamo
inoltre che le vocali sono le lettere più usate in assoluto.
     Possiamo sfruttare questa informazione per cercare di decifare i messaggi.
Prendiamo il testo cifrato del messaggio che abbiamo codificato con il cifrario
di Cesare: IRUCDURPD. Qui abbiamo tre lettere che si ripetono due volte: R, U e
D. È lecito supporre che queste lettere corrispondano a delle vocali: in effetti,
R e D corrispondono, rispettivamente, alle lettere ‘o’ e ‘a’. Se il messaggio fosse
stato più lungo avremmo avuto più informazioni da sfruttare.
     Edgar Allan Poe, nel suo famoso racconto Lo Scarabeo d’Oro, spiega come de-
cifrare un messaggio usando proprio questo metodo: come prima cosa assume
capitolo 1 - dixit algorizmi                                                           25

Figura 1.5: Il primo messaggio cifrato che compare nel racconto L’avventura degli Uomini
Danzanti di Arthur Conan Doyle.

che il messaggio sia in inglese, poi spiega che “la lettera usata più frequente-
mente è la e, seguita da a, o, i, d, h, n, r, s, t, u, y, c, f, g, l, m, w, b, k, p, q, x,
z”.
      L’algoritmo in questo caso è semplice: come prima cosa bisogna contare, per
ogni lettera del messaggio cifrato, le sue occorrenze. Poi si ordinano le lettere
del messaggio in base al numero di occorrenze; a questo punto, le lettere del
messaggio vengono messe in corrispondenza con le lettere della lingua in cui
si suppone sia scritto il messaggio, ordinate secondo la frequenze della lingua;
usando questa corrispondenza si può provare a decodificare il messaggio. In
pratica, visto che in inglese le lettere usate più frequentemente sono, come sap-
piamo da Edgar Allan Poe, ‘e’, ‘a’, ‘o’, ‘i’ e ‘d’, alla lettera che compare più spesso
nel messaggio assoceremo la lettera ‘e’, alla seconda la lettera ‘a’ e così via.
      Questa tecnica, chiamata analisi delle frequenze, viene descritta per la prima
volta in un’opera dello studioso arabo Al-Kindi, anche lui frequentatore, come
Al-Khuwarizmi, della Casa della Saggezza di Baghdad. La stessa tecnica vie-
ne usata da Sherlock Holmes per decifrare una serie di messaggi nel racconto
L’Avventura degli Uomini Danzanti, dove i messaggi in codice non usavano l’al-
fabeto tradizionale ma una serie di disegni raffiguranti, come dice il titolo del
racconto, uomini danzanti; nella Figura 1.5 vediamo il primo dei messaggi che
appare in questo racconto.
      Quando spiega come ha fatto a risolvere il caso, Sherlock Holmes raccon-
ta di aver usato quella che ormai sappiamo essere l’analisi delle frequenze: ad
esempio, nel messaggio mostrato in figura, appare quattro volte lo stesso sim-
bolo (di cui due volte con la bandierina in mano, che serve ad indicare la fine
della parola) e da questo l’investigatore capisce che il simbolo corrisponde alla
lettera ‘e’. Sherlock Holmes, nel finale del racconto, spiega anche di essere stato
costretto ad aspettare nuovi messaggi per poter avere tutte le informazioni di
26                                breve e universale storia degli algoritmi

cui aveva bisogno.
     Per i curiosi, il messaggio nascosto negli uomini danzanti di Figura 1.5 è
“AM HERE ABE SLANEY”; anche se breve, questo messaggio contiene quattro ‘e’
e tre ‘a’ che sono, come detto in precedenza, le due lettere più frequenti della
lingua inglese.

                  indovinello algoritmico: rispetta i versi

Ogni capitolo di questo libro si chiude, prima delle note storiche e bibliografi-
che, con un indovinello algoritmico, ovvero un indovinello la cui soluzione è un
algoritmo! In fondo al libro trovate le soluzioni a tutti gli indovinelli proposti.
     Iniziamo con un indovinello semplice: vi vengono dati una lista di numeri e
una serie di celle vuote in cui, tra ogni coppia di celle, vi è un simbolo di disu-
guaglianza (maggiore o minore). Ricordiamo che il simbolo ‘>’ indica maggiore
e il simbolo ‘ b’ si legge “a maggiore di b” e ‘c < d ’
si legge “c minore di d”.
     Il vostro scopo è disporre i numeri nelle celle, in modo da rispettare i versi
delle disuguaglianze. Ad esempio, se la lista di numeri è

                               {10, 6, 11, 39, 30, 28}

e le celle da riempire sono

                    <         >          >          <         >

una possibile soluzione è

              11 < 30 > 28 >                   6    < 39 > 10

Domanda 1. Considerate i numeri da 1 a 6. Riuscite a disporli nelle seguenti
celle rispettando i versi?

                    <         >          <          <         >
capitolo 1 - dixit algorizmi                                                       27

Domanda 2. Riuscite a inventare un algoritmo che, data una qualsiasi lista di
numeri (tutti distinti tra di loro) e una serie di celle da riempire, riesca a mettere
i numeri nelle celle rispettando i versi?
28                                breve e universale storia degli algoritmi

                        note storiche e bibliografiche

I primi algoritmi di cui abbiamo traccia sono riportati su delle tavolette ba-
bilonesi risalenti a un periodo compreso tra il 1800 e il 1600 a.C.; in queste
tavolette venivano affrontati diversi problemi come il calcolo delle radici qua-
drate, la soluzione di equazioni di secondo grado e il calcolo dell’inverso di un
numero. L’esposizione di queste tavolette seguiva uno stile semplice e ripetiti-
vo, mostrando diversi esempi numerici, con numeri diversi, seguiti dalla frase
conclusiva: “Questo è il modo di procedere” che, come osservato da Ausiello,
“mette in evidenza la consapevolezza di aver identificato un metodo, un algoritmo,
per risolvere il problema in modo generale” [5].
     Gli algoritmi babilonesi sono descritti in dettaglio da Knuth che afferma
anche che “per rendere l’informatica una scienza rispettabile bisogna mostra-
re che abbia radici profonde nella storia, e che non sia quindi un fenomeno
passeggero” [27].
     Una breve introduzione riguardo la storia degli algoritmi si trova nel capitolo
scritto da Ausiello nel libro da lui curato insieme a Petreschi [5]. Il testo di
Chabert et al. [10] presenta una rassegna dettagliata della storia degli algoritmi
numerici.
     L’originale arabo di Al-Khuwarizmi dal titolo Kitab al-hisab al-hindi è anda-
to perduto, ma a noi sono giunte quattro traduzioni in latino; tra queste la più
famosa è sicuramente Dixit Algorizmi, da cui prende il nome questo capitolo,
che è il manoscritto sulla base del quale Baldassarre Boncompagni, storico della
scienza e matematico, pubblicò il suo testo Algoritmi De Numero Indorum nel
1857. Il manoscritto usato da Baldassarre Boncompagni è conservato nella libre-
ria universitaria di Cambridge, ed inizia con “Dixit Algorizmi: laudes deo rectori
nostro atque defensori dicamus dignos” (“Così disse Al-Khuwarizmi: indirizziamo
a Dio, nostro signore e protettore, le lodi che merita”). Nel testo di Ambrosetti
vi è un interessante confronto tra le quattro traduzioni latine dell’opera di Al-
Khuwarizmi: la già citata Dixit Algorizmi, il Liber Ysagogarum Alchorismi (in
tre versioni, più un compendio legato alla prima), il Liber Alchorismi e il Liber
Pulueris [1].
     Il termine algoritmo per molto tempo è stato sinonimo di metodo di calcolo
capitolo 1 - dixit algorizmi                                                    29

Figura 1.6: Confronto tra l’algoritmista Boezio e l’abacista Pitagora, da Margarita
Philosophica di G.Reisch, 1508.

aritmetico, contrapposto al calcolo mediante abaco; in una immagine del 1508,
tratta dalla Margarita Philosophica di G.Reisch, un testo illustrato in 12 volumi,
una vera e propria enciclopedia per giovani studiosi, viene mostrato il confronto
tra un algoritmista e un abacista. A sinistra si vede l’algoritmista Boezio, a cui
veniva attribuita l’invenzione dei numeri indiani, mentre a destra si vede l’aba-
cista Pitagora (che, secondo una credenza medievale, aveva inventato l’abaco).
30                                breve e universale storia degli algoritmi

La superiorità dell’algoritmista è rappresentata dal fatto che ha già terminato il
calcolo e posato lo stilo, mentre l’abacista sta ancora muovendo i gettoni dell’a-
baco; inoltre sulle vesti di Aritmetica, sullo sfondo, sono presenti le cifre indiane
a indicare, probabilmente, una predilizione per l’algoritmista.
     Nell’Enciclopedia di d’Alembert e Diderot, del XVIII secolo, compare il ter-
mine algoritmo nell’accezione attuale, “per intendere il metodo e la notazione di
qualsivoglia tipo di calcolo”.
     La vita di Fibonacci è raccontata nel testo di Devlin I magici numeri di Fi-
bonacci [12]. L’autore, docente di matematica a Stanford, rende giustizia a uno
studioso che dovrebbe essere famoso al pari di Galileo, Copernico e Keplero:
grazie a Fibonacci, infatti, si sono diffusi i numeri indiani e i relativi metodi di
calcolo in tutto l’Occidente. È a dir poco difficile riuscire a valutare l’impatto
del contributo di Fibonacci; prima o poi i numeri indiani probabilmente si sa-
rebbero imposti comunque, ma in quanto tempo? Quanto sarebbe diverso il
mondo oggi?
     In Codici e segreti, Singh racconta in maniera brillante l’affascinante sto-
ria della crittologia, la scienza dei messaggi segreti, dalle origini ai codici che
usiamo oggi per comunicare in maniera sicura su Internet [45].
Puoi anche leggere