Esercizio - elemento (h,k) di una matrice supercircolante (esercizi su supercircolanti e circolanti, es. SC 5)
In questa pagina 4
Esercizio supplementare 5 sulle matrici supercircolanti, dalle note ed esercizi del corso di Algoritmi per l'Ingegneria (Ing. Informatica UniPD) su supercircolanti e circolanti. Teoria usata: Matrici circolanti e supercircolanti - algoritmi divide and conquerle matrici supercircolanti (quadranti alternati ricorsivi) hanno solo n valori distinti: somma in n operazioni, prodotto in 4n log2 n + n con il trucco (A1+A2)(B1+B2) e (A1-A2)(B1-B2) invece delle 4 chiamate (Theta(n^2)); gli autovalori sono la trasformata di Hadamard della prima riga (FHT, n log2 n) e il prodotto passa dalla base diagonalizzante; le matrici circolanti sono polinomi nella matrice di rotazione R, il loro prodotto è la convoluzione ciclica delle prime righe e si diagonalizzano con la matrice di Fourier: prodotto in O(n log n) con la FFT.Matrici circolanti e supercircolanti - algoritmi divide and conquer →, Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni → e Dimostrazioni, induzione e invariantiTecniche di dimostrazione (esempio, controesempio, assurdo), induzione con casi base multipli, invarianti di ciclo (inizializzazione, conservazione, uso alla fine), schema generale per provare la correttezza; esempi svolti su arrayMax, sequenza di bit e numeri di Fibonacci.Dimostrazioni, induzione e invarianti →.
Testo
Elemento di una matrice SC. Si proponga e si analizzi un algoritmo efficiente per determinare il valore dell'elemento (dove ) di una matrice supercircolante di ordine , a partire dalla prima riga di , vale a dire . Ha senso definire come il numero di operazioni sugli indici, anziché sui valori degli elementi di . Nota: un algoritmo efficiente dovrebbe avere .
(Una matrice è supercircolante, SC, se oppure con SC di ordine .)
Idea
Una SC è determinata dalla sua prima riga , ma ha elementi: costruire tutta la matrice costerebbe assegnamenti. Si vuole invece leggere un solo valore della riga. La struttura ricorsiva dice dove: la posizione cade in uno dei quattro quadranti, e i quadranti sono solo di due tipi, e , le cui prime righe sono le due metà di .
Con indici da e :
| posizione | quadrante | matrice |
|---|---|---|
| , | alto a sinistra | |
| , | alto a destra | |
| , | basso a sinistra | |
| , | basso a destra |
La matrice è quando e stanno nella stessa metà ( equivale a ), è altrimenti. Dentro il quadrante la posizione diventa . La prima riga di è (prima metà di ), quella di è .
Algoritmo ricorsivo
ELEM(r, h, k) { r = prima riga, lunghezza n = 2^p }
n <- length(r)
if n = 1 then return r[0]
m <- n / 2
if (h < m) = (k < m) { stessa metà: quadrante A1 }
then return ELEM(r[0..m-1], h mod m, k mod m)
else return ELEM(r[m..n-1], h mod m, k mod m) { quadrante A2 }(Per non copiare i sottovettori e basta passare un indice di partenza e la lunghezza: nel modello gli assegnamenti non si contano comunque, e la domanda è sulle operazioni sugli indici.)
Correttezza. Per induzione sull'esponente con . Per la matrice è e l'unico elemento è . Per , per la definizione di SC, è l'elemento del quadrante in cui cade ; il quadrante è o secondo la tabella, ed è SC di ordine con prima riga la prima o la seconda metà di ; per ipotesi induttiva la chiamata ricorsiva restituisce proprio quell'elemento.
Analisi. Ogni chiamata fa un numero costante di operazioni sugli indici (due confronti , , un confronto tra i risultati, due resti: ) e una chiamata su taglia :
Srotolando: . Master Theorem (Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni →): , , soglia , , caso 2: , come richiesto. Con la convenzione , .
Esempio (, , elemento ). : e , metà diverse, quadrante con prima riga , nuova posizione . Con , , : e , metà diverse, con prima riga , posizione . Con , , : e , stessa metà, con prima riga , posizione . Con restituisce . La riga (la sesta) della SC di ordine è , e l'elemento di colonna è ✓.
Algoritmo diretto con lo XOR
Guardando i bit di e si ottiene un'espressione chiusa.
Proposizione. , dove è lo XOR bit a bit.
Dimostrazione per induzione su . Base : , ✓. Passo: con , il bit più significativo (peso ) di e di dice in quale metà cadono, e , con , , .
- Se (stessa metà), il quadrante è con prima riga : per ipotesi ; e perché i bit di peso si annullano ().
- Se (metà diverse), il quadrante è con prima riga , cioè : per ipotesi ; e perché il bit di peso dello XOR vale .
L'algoritmo è return r[h XOR k]: un'operazione sugli indici (nel modello in cui lo XOR di interi di bit costa ; se si contano le operazioni sui singoli bit, sono , lo stesso ordine di grandezza dell'algoritmo ricorsivo). Per , : , , e ✓. Le righe sono permutazioni della prima perché è una permutazione di (è un'involuzione); la simmetria segue da .
Confronto con le circolanti. Per una matrice circolante () l'elemento si calcola con una sottrazione e un resto, per ogni (anche non potenza di ).
Verifica con un programma. Costruita la matrice SC piena per da una prima riga casuale, per tutte le coppie il valore coincide con ELEM e con .
Versione ripasso
Problema: dato (prima riga di una SC di ordine ) e , trovare con operazioni sugli indici, senza costruire la matrice ( elementi). Teoria: Matrici circolanti e supercircolanti - algoritmi divide and conquerle matrici supercircolanti (quadranti alternati ricorsivi) hanno solo n valori distinti: somma in n operazioni, prodotto in 4n log2 n + n con il trucco (A1+A2)(B1+B2) e (A1-A2)(B1-B2) invece delle 4 chiamate (Theta(n^2)); gli autovalori sono la trasformata di Hadamard della prima riga (FHT, n log2 n) e il prodotto passa dalla base diagonalizzante; le matrici circolanti sono polinomi nella matrice di rotazione R, il loro prodotto è la convoluzione ciclica delle prime righe e si diagonalizzano con la matrice di Fourier: prodotto in O(n log n) con la FFT.Matrici circolanti e supercircolanti - algoritmi divide and conquer →.
- Quadranti (, indici da ): cade in se e sono nella stessa metà (), in altrimenti; dentro il quadrante la posizione è . Prime righe: , .
- **
ELEM**: restituisce ; altrimenti sceglie la metà di e richiama con . Correttezza per induzione su dalla definizione di SC. - Costo: operazioni sugli indici per livello (due confronti, un confronto tra risultati, due resti: ): , , quindi (Master Theorem, caso 2: Master Theorem - enunciato, casi e applicazioniMaster Theorem per T(n) = aT(n/b) + w(n): si confronta w(n) con la funzione soglia n^(log_b a). Caso 1 (w minore di una potenza polinomiale): Theta(n^(log_b a)); caso 2 (w della stessa taglia): Theta(n^(log_b a) log n); caso 3 (w maggiore e regolare): Theta(w(n)). Prova completa dai livelli dell'albero, versione estesa (parti intere, n0 qualsiasi), esempi, e l'uso scorretto quando nessun caso si applica (w = n log n).Master Theorem - enunciato, casi e applicazioni →). Il copiare non costa; si passano indici.
- Esempio , : , ; , ; , : elemento .
- Forma chiusa: (XOR bit a bit). Induzione: stessa metà, i bit di peso si annullano e (quadrante ); metà diverse, (quadrante , che parte da ). Esempio . Costo: una operazione (XOR) o operazioni sui bit.
- Conseguenze: le righe sono permutazioni della prima ( è una permutazione), la matrice è simmetrica (). Per le circolanti: .
- Errori tipici: confondere quando il quadrante è (è quando le metà differiscono, non quando ); dimenticare di ridurre gli indici modulo prima della chiamata ricorsiva; usare indici da con lo XOR (serve da ); costruire tutta la matrice ().