Sugli algoritmi

28 Mar

Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi elementari in un tempo ragionevole [dal nome del matematico persiano al-Khuwarizmi vissuto nel ix secolo dell’era mderna, considerato uno dei primi autori ad aver studiato questo concetto nel libro Regole di ripristino e riduzione. L’algoritmo è un concetto matematico fondamentale – ripreso con vigore con l’informatica in cui il termine “algoritmo” ha iniziato a diffondersi – alla base della nozione <teorica> formale del calcolo: un problema si considera <calcolabile> quando è risolvibile mediante un “algoritmo”, che pertanto diviene un concetto cardine della fase di programmazione dello sviluppo di un programma elettronico [software] reso come problema da <automatizzare>. La programmazione dunque costituisce essenzialmente la <traduzione o codifica di un algoritmo per tale problema in programma>, che possa essere quindi effettivamente eseguito da un calcolatore rappresentandone la logica di elaborazione.

La cosiddetta “macchina di Turing” (1936-39) è una rappresentazione essenziale del funzionamento di un generico computer <astratto>: per tale motivo basilare potrebbe sembrare una questione semplice [diceva Brecht, nel 1933, del comunismo che “è ragionevole, chiunque lo capisce. è facile, lo puoi intendere, va bene per te, informatene; gli idioti lo chiamano idiota, ma è contro l’idiozia. Non è follia ma invece fine della follia. È la semplicità che è difficile a farsi”]. Se perfino il <comunismo> è da Brecht stesso considerato “semplice” da capire, ma talmente “difficile” da fare – e si sa quanto sia vera tanto l’affermazione di simile possibile conoscenza, “coscienza”, quanto la constatazione della sua realizzazione di là da venire – si pensi che cosa possa voler dire trovarsi di fronte alla definizione scientifica di algoritmo per la duplice illusoria <semplicità> della escogitazione di Turing al cospetto della sua enorme <difficoltà> a comprenderla e renderla logicamente <funzionante>. Quindi nonostante che una definizione del <concetto di algoritmo> sia formale e non tecnica, pur con una profondissima conoscenza di una matematica complicata come quella di Turing, e molto avanzata (anche senza dover essere geniali come lui), nessun matematico è riuscito finora a darne un dimostrazione compiuta {figurarsi se l’abuso fattone da gentuccia come Renzi o Grillo e tanti altri pseudo <esperti> che ci si sciacquano la bocca senza capirne una beneamata minchia, e perfino i Casaleggio, padre e figlio, che sugli <algoritmi> intesi però come “marchingegni” hanno fondato le loro mosse, il primo oniricamente e il secondo, senza immaginazione, sbagliandone pure l’uso per l’impiego tentato, … in omaggio a Rousseau messo su una <piattaforma> come su un altare (mentre Grillo portava i fiori alla statua dell’illuminista ginevrino)}.

Pertanto noi con i poveri mortali dobbiamo necessariamente contentarci di una formulazione intuitiva di <algoritmo> enciclopedicamente definita come: “una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce a un ben determinato risultato in un tempo finito”. Soltanto; tutto qui!? Occorre perciò lasciare al computer astratto della macchina di Turing la formale semplicità … “facilmente” descritta in termini matematici. La macchina di Von Neumann, che è il modello sottostante a tutti i <computer> attuali, è equivalente, in termini di potere di calcolo, alla macchina pensata da Turing. In altre parole, è stato dimostrato che un certo problema può essere risolto da un <computer> (opportunamente programmato) se e solo se esso può essere risolto logicamente anche da una macchina di Turing. Dalla precedente definizione di algoritmo si evincono alcune proprietà necessarie, senza le quali un algoritmo non può essere definito tale:

– i passi costituenti devono essere “elementari”, ovvero non ulteriormente scomponibili;

– i passi costituenti devono essere interpretabili in modo diretto e univoco (senza ambiguità) dall’esecutore, sia esso umano o artificiale;

– l’algoritmo deve essere composto da un numero “finito” di passi e richiedere una quantità finita di dati in ingresso;

– l’esecuzione deve avere <termine> dopo un tempo “finito”;

– l’esecuzione deve portare a un <risultato> univoco, effettivo.

Così, con un esempio da enciclopedia, “rompere le uova” può essere considerato legittimamente un passo elementare di un “algoritmo per la cucina” (ricetta), ma invece non potrebbe esserlo anche “aggiungere sale <quanto basta>” dato che l’espressione <quanto basta> è ambigua, e non indica con precisione quali passaggi servano per determinare la quantità necessaria [come le promesse <algoritmiche> di Renzi, la cui precisione sta nella casa del diavolo]. Così pure un passo come “preparare un pentolino di crema pasticcera” non può considerarsi legittimo perché ulteriormente scomponibile in sotto-operazioni (accendere il fuoco, regolare la fiamma, mettere il pentolino sul fornello, ecc.) e anche perché contenente ambiguità (non specifica quanto grande deve essere il pentolino, quanto deve essere riempito di crema e così via) [si pensi al cosiddetto job act, alle sue <illegittimità> logiche, alle <sotto-operazioni> (decreti di attuazione) necessarie, oltre alle <ambiguità> volute (come la specificazione delle quantità e delle caratteristiche dei dati, sulla occupazione occultando le diversità assolute tra tempo determinato e indeterminato)]. Al contrario, “continuare a mescolare a fuoco vivo fino a quando il composto non assume colore bruno” è un’istruzione accettabile di tipo iterativo, che comporta un numero finito di operazioni (le rimestate) sebbene tale numero non sia conoscibile a priori, perché dipendente da ciò che è chiamato input (il grado di umidità della farina nel composto, il vigore della fiamma, ecc.). All’istruzione non elementare di preparazione della crema potrebbe, però, essere associato a un opportuno rimando a un’altra sezione del ricettario, che fornisca un <sotto-algoritmo> apposito per questa specifica operazione. Questo suggerisce che, per comodità di realizzazione, gli algoritmi possano essere modulari, ovvero orientati a risolvere anche specifici sotto-problemi (o sotto-operazioni), e gerarchicamente organizzati. Inoltre, una ricetta che preveda la cottura a microonde non può essere preparata da un esecutore sprovvisto dell’apposito elettrodomestico; questo rimanda al problema della realizzabilità degli algoritmi, ovvero della loro compatibilità con le risorse materiali e temporali a disposizione. Infine, possono darsi <più algoritmi validi> per risolvere uno stesso problema, ma ognuno con un diverso grado di efficienza. Il caso culinario, in forma ancora più alla portata di tutti, può essere usato popolarmente come pseudo spiegazione di un <algoritmo elementare>, didatticamente istruttivo. Se prendete 500 gr. di farina, 50 gr. di zucchero, 50 gr. di burro, 3 uova, 1 bicchiere di vino bianco secco, un pizzico (?) di sale e un pizzico di vaniglia, 15 gr. di lievito, 50 gr. di miele, 50 gr. di zucchero a velo e mezzo litro olio, avete la <ricetta> per le cosiddette frappe o “bugìe di carnevale”, ma se buttate tutti gli ingredienti nell’olio bollente, certamente non farete le frappe ma otterrete una sbroscia immangiabile e vomitosa, anche se quegli ingredienti presi uno a uno siano stati i migliori. E se la “prova della torta” è nel mangiarla, secondo il proverbio inglese amato da Engels, una tal prova sarebbe qui fallimentare: prima di mangiarla, qualsiasi torta bisogna saperla fare, conoscere beni i <passi costituenti> in maniera  chiara e inequivocabile affinché un algoritmo possa essere definito tale; o almeno conoscere qualcuno che la sappia fare. Gli ingredienti messi alla rinfusa non fanno mai la torta: occorre saperli elaborare, e amalgamare l’un l’altro a “regola d’arte”. Solo un lavoro “ben fatto”, come dicono i marinai, può dirsi un lavoro. La somma delle parti non coincide mai con la loro totalità, se ora dalla metafora gastronomica si vuol passare alla <cucina hegeliana>. Un programma politico non è ben fatto – non è proprio un programma – se si limita a elencare obiettivi, anche singolarmente giusti. Senza al contempo indicare come amalgamarli, realmente e praticamente, per trasmutarli in qualcosa di coeso e coerente, capace di tenuta da tutti i suoi versanti, e per giunta credibile e appetibile per le masse chiamate a lottare per quegli obiettivi, in tal caso sì si sfornano bugìe, menzogne nel senso originale del termine, e non programmi. E affinché una siffatta totalità sia coerente, e non risulti ora bella e impossibile come un’utopia insensata, ora eclettica e sincretica come vuole la praticaccia bell’e pronta senza principî, si richiede un rigore di analisi capace di fondare la lotta di classe, come sostiene Engels, concludendo la Questione delle abitazioni, occorre una “corretta e completa conoscenza del modo di produzione capitalistico in tutti i suoi aspetti”.

L’algoritmo viene generalmente descritto come “procedimento di risoluzione di un problema”. In questo contesto, i “problemi” che si considerano sono quasi sempre caratterizzati da dati di ingresso (gli <input>) variabili, su cui l’algoritmo stesso opererà per giungere fino alla soluzione. A es., il calcolo del massimo comune divisore fra due numeri è un esempio di “problema”, e i suoi dati di ingresso, variabili di volta in volta, sono i due numeri in questione. Se per ottenere un certo risultato (risolvere un certo problema) esiste un procedimento infallibile, che può essere descritto in modo non ambiguo fino ai dettagli, e conduce sempre all’obiettivo desiderato in un tempo finito, allora esistono le condizioni per affidare questo compito a un <computer>, semplicemente introducendo l’algoritmo in questione in un programma scritto in un opportuno linguaggio comprensibile alla macchina. Nella fase di programmazione l’algoritmo così scritto verrà tradotto in linguaggio di programmazione a opera di un programmatore sotto forma di codice sorgente dando vita al programma che sarà eseguito dal calcolatore, eventualmente dopo un’ulteriore traduzione in linguaggio macchina. Lo studio di un algoritmo viene suddiviso in due fasi:

– sintesi (o progetto): dato un problema, costruire un algoritmo per risolvere il problema;

– analisi: dato un algoritmo e un problema, dimostrare che l’algoritmo risolve correttamente il problema e valutare la quantità di risorse usate dall’algoritmo complessivo.

Un’ampia porzione della teoria degli algoritmi è lo studio della complessità, computazionale e spaziale. Si vuole sapere, al crescere della complessità del problema, in che modo cresce il tempo necessario a eseguire l’algoritmo e lo spazio di memoria occupato in un calcolatore.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

w

Connessione a %s...