Codice Gray. (versione Marzo 2007)

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Codice Gray. (versione Marzo 2007)"

Transcript

1 Codice Gray (versione Marzo 27) Data una formula booleana con n variabili, per costruire una tavola di verità per questa formula è necessario generare tutte le combinazioni di valori per le n variabili. Usando per vero e per falso, di solito si parte con n zeri e poi si continua ad incrementare di in binario; ad es. con n2: Per un certo tipo di tavole di verità (le "mappe di Karnaugh") serve elencare le combinazioni in modo tale che tra due consecutive ci sia esattamente un bit di differenza; questo modo di elencare le combinazioni si chiama Codice Gray. Nella tabella di sopra, la a e la 2a riga differiscono di bit, ma la 2a e la 3a hanno 2 bit di differenza. E` facile rimediare, basta invertire le ultime due righe: Notare che il codice Gray non e` unico; anche quello che segue ha la proprietà voluta Nel seguito cerchiamo di ottenere il codice "del primo tipo"; quindi diciamo "il codice Gray" ed usiamo G n per indicare il codice Gray per n variabili. Problema: trovare un modo per generare il codice Gray per n variabili (n > ). più precisamente: scrivere una procedura che, dato n, stampa il codice Gray per n. Approccio induttivo alla soluzione: proviamo a risolvere per n piccolo (questa è la base dell'induzione); vediamo se, avendo costruito il codice Gray per, 2,..., n- variabili, riusciamo a generare quello per n variabili usando i precedenti (questo è il passo induttivo). La base è facile, perchè per n il codice è banale: G (Inoltre abbiamo anche la soluzione per n2.) Per capire il passo induttivo, vediamo il caso n3. Pensandoci un po', si capisce che: scrivendo seguito da G 2 abbiamo scritto metà di G 3

2 il resto si ha scrivendo seguito da G 2 in ordine rovesciato (cioè scrivendolo a partire dall'ultima riga): G 3 [ questo è G 2 ] [ questo è G 2 rovesciato ] E` immediato verificare che si può ragionare cosí anche per andare da G a G 2 G 2 [ questo è G ] [ questo è G rovesciato ] A questo punto dovrebbe essere chiaro che la cosa vale in generale. Scrivendo GR n per il codice Gray per n variabili scritto in ordine inverso, abbiamo: G n+ G n GR n A questo punto, se si deve risolvere il problema "su un pezzo di carta", abbiamo finito: partendo da G riusciamo a generare tutti i G n Volendo scrivere una procedura per risolvere il problema, dopo un po' si capisce che bisogna anche trovare una "formula" per GR n Studiando i casi n, 2, 3, vediamo che: GR GR 2 [ questo è G ] [ questo è GR ] GR 3 [ questo è G 2 ] [ questo è GR 2 ] 2

3 Quindi si capisce che la formula generale è: GR n+ G n GR n A questo punto, avendo un modo induttivo per generare sia G n che GR n possiamo procedere per capire come scrivere la procedura per stampare il codice. Algoritmo - Prima idea: per generare G n definiamo una matrice n x 2 n e poi la riempiamo seguendo lo schema di sopra; alla fine basterà stampare la matrice. Definiamo una procedura gray (n: int) che stampa G n Questa dichiara una matrice tab di dimensione n x 2 n e poi usa due ulteriori procedure, gd per generare il codice Gray e gr per generare il codice rovesciato. Guardando i disegni di sopra, si capisce che per generare, ad esempio, G 7 servirà, ad esempio, generare G 3 e GR 3 piu' volte ed in posizioni diverse della matrice; quindi gd e gr avranno come parametri: la matrice tab e poi 4 indici che individuano la poosizione della matrice su cui lavorare: left_col (colonna sinistra), right_col (colonna destra), upper_row (riga superiore), lower_row (riga inferiore); ovviamente, se, come sopra, il codice da generare è G 3 (oppure GR 3 ), avremo che: right_col left_col + 3 quindi non c'è bisogno del parametro corrispondente al numero di variabili. Per adeguarci al C, facciamo partire gli indici degli array da. procedura gray( n : integer IN ) { qui n > var k, j, num_righe : integer; num_righe <--- 2 n { blocco con dichiarazioni: var tab : array [.. n- ;.. num_righe-] of char ora generiamo la tabella completa da colonna a colonna n- e da riga a riga num_righe- : gd(tab,, n-,, num_righe-); e poi stampiamo il risultato : per k,, 2,... num_righe- { per j,, 2,..., n- scrivi ( tab[k][j] ) vai a capo chiude il per su k chiude blocco chiude procedura 3

4 procedura gd( tab [ ] [ ] of char IN - OUT left_col, right_col, upper_row, lower_row : integer IN) { if (left_col < right_col) { int k, med; med <---- (upper_row + lower_row) div 2; per k upper_row, upper_row+,..., med: tab[k][left_col] <--- ''; gd(tab, left_col+, right_col, upper_row, med); per k med+, med+2,... lower_row : tab[k][left_col] <---- ''; gr(tab, left_col+, right_col, med+, lower_row); procedura gr( tab [ ] [ ] of char IN - OUT left_col, right_col, upper_row, lower_row : integer IN) { e` uguale a gd, tranne che si scambiano '' e '' if (left_col < right_col) { int k, med; med <---- (upper_row + lower_row) div 2; per k upper_row, upper_row+,..., med: tab[k][left_col] <--- ''; gd(tab, left_col+, right_col, upper_row, med); per k med+, med+2,... lower_row : tab[k][left_col] <---- ''; gr(tab, left_col+, right_col, med+, lower_row); La versione C segue questo schema, però c'è un problema: nelle procedure non è possibile usare un parametro array con due dimensioni non specificate. Per risolvere il problema, in una prima versione, gray_.c, si fissa un limite al numero di variabili; nella seconda versione, gray bis.c, si usano i puntatori. Algoritmo - seconda idea: per generare G n utilizziamo solo un vettore di lunghezza n; generiamo una riga della tabella alla volta e poi la stampiamo. Vediamo prima l'algoritmo e poi lo commentiamo. 4

5 procedura gray( n : integer ) { qui n > var : k : integer w : array [.. n] of char come una stringa in C, usiamo terminatore : '\' per k,,..., n- : w[k] <--- ' ' w[n] <--- '\' ; gd(, w); per togliere eventuali caratteri nulli presenti procedura gd( k : integer IN, w : array [ ] of char IN-OUT ) { if (w[k] '\') then scrivi ( w ) else { w[k] <--- '' gd(k+, w); w[k] <--- ''; gr(k+, w); procedura gr( k : integer IN, w : array [ ] of char IN-OUT ) { come gd, ma scambiando ed if (w[k] '\') then scrivi ( w ) else { w[k] <--- '' gd(k+, w); w[k] <--- ''; gr(k+, w); Non è per nulla evidente che funzioni; in effetti è anche difficile spiegare come si arriva a questo algoritmo. L'idea che c'è sotto è: ricordiamo che w è un array con indici da a n; indichiamo con w k la stringa w[] w[]... w[k-] allora inoltre w[n] terminatore; (nota: w stringa nulla); gd(k, w) stampa, nell'ordine previsto dal nostro codice Gray, tutte le stringhe della forma w k u con u che appartiene a G i con i n-k. (qui: il indica concatenazione tra stringhe e G { e, dove e stringa vuota) Quindi, gd(, w) stampa G n In effetti, per capire veramente come funzionano le cose, bisogna anche precisare cosa produce gr(k, w), ma questo è facile: come per gd(k, w), ma usando GR i. 5

6 Proviamo a dimostrare il tutto per induzione. Ipotesi: w è un array con indici da a n (n > ); inoltre w[n] terminatore; Notazione: w k indica a stringa w[] w[]... w[k-] Tesi: (w e stringa nulla); [a] gd(k, w) stampa, nell'ordine previsto dal nostro codice Gray, tutte le stringhe della forma w k u con u che appartiene a G i con i n-k (dove G { e ). [b] gr(k, w) stampa, nell'ordine previsto dal nostro codice Gray, tutte le stringhe della forma w k u con u che appartiene a GR i con i n-k (dove GR { e ). Dimostrazione per induzione (a passi) su i n-k ( < i < n) Base, i. La tesi è verificata, perchè per kn sia gd(k,w) che gr(k,w) stampano la stringa contenuta in w, cioè w n. Passo: supponiamo vera la tesi per i- ( < i- < n) e dimostriamo che vale anche per i. Vediamo prima la tesi [a]. Poichè i >, abbiamo k < n; quindi nell'eseguire gd(k,w) si sceglie il ramo else. Poichè n-(k+) i-, per ipotesi induttiva la tesi vale per le due chiamate gd(k+,w) e gr(k+,w); quindi: gd(k+, w) stampa, nell'ordine previsto..., tutte le stringhe della forma w k+ u con u che appartiene a G i- e, successivamente, gr(k+, w) stampa, nell'ordine previsto..., tutte le stringhe della forma w k+ u con u che appartiene a GR i- A causa delle due assegnazioni w[k] <--- '' e w[k] <--- '' quanto sopra si può riscrivere come segue: gd(k+, w) stampa, nell'ordine previsto..., tutte le stringhe della forma w k "" u con u che appartiene a G i- e, successivamente, gr(k+, w) stampa, nell'ordine previsto..., tutte le stringhe della forma w k "" u con u che appartiene a GR i- Ma allora gd(k,w) stampa proprio tutte le stringhe della forma w k u con u che appartiene a G i come si voleva. La tesi [b] si dimostra in modo del tutto analogo. Quindi la dimostrazione è fatta ed abbiamo finito!!! 6

Un esempio di calcolo di complessità: insertion sort

Un esempio di calcolo di complessità: insertion sort Un esempio di calcolo di complessità: insertion sort Vediamo su un esempio come si può calcolare la complessità di un algoritmo... L esempio è un metodo semplice per ordinare arrays: insertion sort, o

Dettagli

APPUNTI SULLA DIAGONALIZZAZIONE Corso Prof. F.Podestà, a.a

APPUNTI SULLA DIAGONALIZZAZIONE Corso Prof. F.Podestà, a.a APPUNTI SULLA DIAGONALIZZAZIONE Corso Prof FPodestà, aa 003-004 Sia V uno spazio vettoriale e sia f : V V una applicazione lineare una tale applicazione da uno spazio vettoriale in se stesso è chiamata

Dettagli

1 Combinazioni lineari.

1 Combinazioni lineari. Geometria Lingotto LeLing5: Spazi Vettoriali Ārgomenti svolti: Combinazioni lineari Sistemi lineari e combinazioni lineari Definizione di spazio vettoriale Ēsercizi consigliati: Geoling 6, Geoling 7 Combinazioni

Dettagli

Inversa di una matrice

Inversa di una matrice Geometria Lingotto. LeLing: La matrice inversa. Ārgomenti svolti: Inversa di una matrice. Unicita e calcolo della inversa. La inversa di una matrice. Il gruppo delle matrici invertibili. Ēsercizi consigliati:

Dettagli

LeLing12: Ancora sui determinanti.

LeLing12: Ancora sui determinanti. LeLing2: Ancora sui determinanti. Ārgomenti svolti: Sviluppi di Laplace. Prodotto vettoriale e generalizzazioni. Rango e determinante: i minori. Il polinomio caratteristico. Ēsercizi consigliati: Geoling

Dettagli

Appunti sui Codici di Reed Muller. Giovanni Barbarino

Appunti sui Codici di Reed Muller. Giovanni Barbarino Appunti sui Codici di Reed Muller Giovanni Barbarino Capitolo 1 Codici di Reed-Muller I codici di Reed-Muller sono codici lineari su F q legati alle valutazioni dei polinomi sullo spazio affine. Per semplicità

Dettagli

1 Riduzione per righe e matrici equivalenti per righe.

1 Riduzione per righe e matrici equivalenti per righe. Geometria Lingotto. LeLing2: Sistemi lineari omogenei. Ārgomenti svolti: Riduzione per righe e matrici equivalenti per righe. Forma echelon e sistemi gia risolti. Il metodo di Gauss-Jordan e la forma echelon.

Dettagli

Metodo di Gauss-Jordan 1

Metodo di Gauss-Jordan 1 Metodo di Gauss-Jordan 1 Nota Bene: Questo materiale non debe essere considerato come sostituto delle lezioni. Ārgomenti svolti: Riduzione per righe e matrici equivalenti per righe. Forma echelon e sistemi

Dettagli

NOTE DI ALGEBRA LINEARE v = a 1 v a n v n, w = b 1 v b n v n

NOTE DI ALGEBRA LINEARE v = a 1 v a n v n, w = b 1 v b n v n NOTE DI ALGEBRA LINEARE 2- MM 9 NOVEMBRE 2 Combinazioni lineari e generatori Sia K un campo e V uno spazio vettoriale su K Siano v,, v n vettori in V Definizione Un vettore v V si dice combinazione lineare

Dettagli

Laboratorio di Python

Laboratorio di Python Problem solving, Ricorsione, Università di Bologna 13 e 15 marzo 2013 Sommario 1 2 3 4 Errore di semantica Esercizio def vocali(s): voc='' for c in s: if c in 'aeiou': voc=voc+c return voc Cerchiamo di

Dettagli

1 Indipendenza lineare e scrittura unica

1 Indipendenza lineare e scrittura unica Geometria Lingotto. LeLing7: Indipendenza lineare, basi e dimensione. Ārgomenti svolti: Indipendenza lineare e scrittura unica. Basi e dimensione. Coordinate. Ēsercizi consigliati: Geoling. Indipendenza

Dettagli

Esercitazione di Reti degli elaboratori

Esercitazione di Reti degli elaboratori Esercitazione di Prof.ssa Chiara Petrioli Christian Cardia, Gabriele Saturni Cosa vedremo in questa lezione? Gli Array Gli array multidimensionali Le stringhe I puntatori Esercizi Pagina 1 Gli Array Definizione

Dettagli

1 Definizione di sistema lineare omogeneo.

1 Definizione di sistema lineare omogeneo. Geometria Lingotto. LeLing1: Sistemi lineari omogenei. Ārgomenti svolti: Definizione di sistema lineare omogeneo. La matrice associata. Concetto di soluzione. Sistemi equivalenti. Operazioni elementari

Dettagli

DAI NUMERI NATURALI AI NUMERI RAZIONALI

DAI NUMERI NATURALI AI NUMERI RAZIONALI DAI NUMERI NATURALI AI NUMERI RAZIONALI 1. L insieme dei numeri naturali Nel sistema assiomatico ZF, l Assioma dell infinito stabilisce che: Esiste un insieme A, i cui elementi sono insiemi e tale che

Dettagli

LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13)

LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13) LOGICA MATEMATICA PER INFORMATICA (A.A. 12/13) DISPENSA N. 4 Sommario. Dimostriamo il Teorema di Completezza per il Calcolo dei Predicati del I ordine. 1. Teorema di Completezza Dimostriamo il Teorema

Dettagli

1 Giochi di Ehrenfeucht-Fraissé e Logica del Prim ordine

1 Giochi di Ehrenfeucht-Fraissé e Logica del Prim ordine 1 Giochi di Ehrenfeucht-Fraissé e Logica del Prim ordine In questo tipo di giochi l arena è costituita da due grafi orientati G = (V, E), G = (V, E ). Lo scopo del I giocatore è di mostrare, in un numero

Dettagli

Corso di Informatica di Base

Corso di Informatica di Base Corso di Informatica di Base A.A. 2011/2012 Algoritmi e diagrammi di flusso Luca Tornatore Cos è l informatica? Calcolatore: esecutore di ordini o automa Programma: insieme di istruzioni che possono essere

Dettagli

Derivazione numerica. Introduzione al calcolo numerico. Derivazione numerica (II) Derivazione numerica (III)

Derivazione numerica. Introduzione al calcolo numerico. Derivazione numerica (II) Derivazione numerica (III) Derivazione numerica Introduzione al calcolo numerico Il calcolo della derivata di una funzione in un punto implica un processo al limite che può solo essere approssimato da un calcolatore. Supponiamo

Dettagli

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine RISOLUZIONE IN LOGICA PROPOSIZIONALE Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine 1. Risoluzione Definitione 1.1. Un letterale l è una variabile proposizionale (letterale

Dettagli

Sui determinanti e l indipendenza lineare di vettori

Sui determinanti e l indipendenza lineare di vettori Sui determinanti e l indipendenza lineare di vettori 1 Si dice che m vettori v 1, v 2,,v m di R n sono linearmente indipendenti, se una loro combinazione lineare può dare il vettore nullo solo se i coefficienti

Dettagli

La codifica digitale

La codifica digitale La codifica digitale Codifica digitale Il computer e il sistema binario Il computer elabora esclusivamente numeri. Ogni immagine, ogni suono, ogni informazione per essere compresa e rielaborata dal calcolatore

Dettagli

Gli Array. Dichiarazione di un array

Gli Array. Dichiarazione di un array Gli Array Un array rappresenta una variabile indicizzata (ovvero contenente un indice) che viene utilizzata per contenere più elementi dello stesso tipo. Ogni array ha un nome al quale viene associato

Dettagli

04 - Logica delle dimostrazioni

04 - Logica delle dimostrazioni Università degli Studi di Palermo Facoltà di Economia CdS Sviluppo Economico e Cooperazione Internazionale Appunti del corso di Matematica 04 - Logica delle dimostrazioni Anno Accademico 013/014 D. Provenzano,

Dettagli

Note per il corso di Geometria Corso di laurea in Ing. Edile/Architettura. 4 Sistemi lineari. Metodo di eliminazione di Gauss Jordan

Note per il corso di Geometria Corso di laurea in Ing. Edile/Architettura. 4 Sistemi lineari. Metodo di eliminazione di Gauss Jordan Note per il corso di Geometria 2006-07 Corso di laurea in Ing. Edile/Architettura Sistemi lineari. Metodo di eliminazione di Gauss Jordan.1 Operazioni elementari Abbiamo visto che un sistema di m equazioni

Dettagli

Note sull algoritmo di Gauss

Note sull algoritmo di Gauss Note sull algoritmo di Gauss 29 settembre 2009 Generalità Un sistema lineare di m equazioni in n incognite x,..., x n è un espressione del tipo: a x + a 2 x 2 + + a n x n = b a 2 x + a 22 x 2 + + a 2n

Dettagli

Forme bilineari simmetriche

Forme bilineari simmetriche Forme bilineari simmetriche Qui il campo dei coefficienti è sempre R Definizione 1 Sia V uno spazio vettoriale Una forma bilineare su V è una funzione b: V V R tale che v 1, v 2, v 3 V b(v 1 + v 2, v 3

Dettagli

Lo sviluppo di un semplice programma e la dimostrazione della sua correttezza

Lo sviluppo di un semplice programma e la dimostrazione della sua correttezza Il principio di induzione Consideriamo inizialmente solo il principio di induzione per i numeri non-negativi, detti anche numeri naturali. Sia P una proprietà (espressa da una frase o una formula che contiene

Dettagli

Lezione 6 Introduzione al C++ Mauro Piccolo

Lezione 6 Introduzione al C++ Mauro Piccolo Lezione 6 Introduzione al C++ Mauro Piccolo [email protected] Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,

Dettagli

02 - Logica delle dimostrazioni

02 - Logica delle dimostrazioni Università degli Studi di Palermo Facoltà di Economia Dipartimento di Scienze Economiche, Aziendali e Statistiche Appunti del corso di Matematica 0 - Logica delle dimostrazioni Anno Accademico 015/016

Dettagli

Lista di esercizi 11 maggio 2016

Lista di esercizi 11 maggio 2016 Lista di esercizi 11 maggio 2016 1. Determinare il numero di sequenze binarie di lunghezza n che contengano almeno una coppia di 0 consecutivi. Soluzione. Potrebbe essere utile un programma di calcolo

Dettagli

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole. Excel VBA VBA Visual Basic for Application VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole. 2 Prima di iniziare. Che cos è una variabile?

Dettagli

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1. Sia T una stringa arbitraria di lunghezza n 1 su un alfabeto Σ. È sempre possibile

Dettagli

Riassumiamo le proprietà dei numeri reali da noi utilizzate nel corso di Geometria.

Riassumiamo le proprietà dei numeri reali da noi utilizzate nel corso di Geometria. Capitolo 2 Campi 2.1 Introduzione Studiamo ora i campi. Essi sono una generalizzazione dell insieme R dei numeri reali con le operazioni di addizione e di moltiplicazione. Nel secondo paragrafo ricordiamo

Dettagli

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,

Dettagli

METODI MATEMATICI PER L INFORMATICA

METODI MATEMATICI PER L INFORMATICA METODI MATEMATICI PER L INFORMATICA Tutorato Lezione 7 19/05/2016 Corso per matricole congrue a 1 Docente: Margherita Napoli Tutor: Amedeo Leo Ricorsione Esercizio 2 pagina 357 Trovare f(1), f(2), f(3),

Dettagli

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 27 marzo 2012 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,

Dettagli

Sistemi lineari - Parte Seconda - Esercizi

Sistemi lineari - Parte Seconda - Esercizi Sistemi lineari - Parte Seconda - Esercizi Terminologia Operazioni elementari sulle righe. Equivalenza per righe. Riduzione a scala per righe. Rango di una matrice. Forma canonica per righe. Eliminazione

Dettagli

Introduzione alla logica proposizionale

Introduzione alla logica proposizionale Introduzione alla logica proposizionale Mauro Bianco Questa frase è falsa Contents 1 Proposizioni 1 2 Altri operatori 4 Nota : Le parti delimitate da *** sono da considerarsi facoltative. 1 Proposizioni

Dettagli