Codice Gray. (versione Marzo 2007)
|
|
|
- Marcello Sarti
- 9 anni fa
- Visualizzazioni
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 Vediamo su un esempio come si può calcolare la complessità di un algoritmo... L esempio è un metodo semplice per ordinare arrays: insertion sort, o
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
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
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:
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
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à
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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,
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
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
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
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
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,
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
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
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?
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
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
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,
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),
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,
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
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
