Salta al contenuto
Note per Studenti Esercizio - elemento (h,k) di una matrice supercircolante (esercizi su supercircolanti e circolanti, es. SC 5)

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 (h,k)(h, k) di una matrice SC. Si proponga e si analizzi un algoritmo efficiente per determinare il valore dell'elemento AhkA_{hk} (dove 0≤h,k<n0 \le h, k < n) di una matrice supercircolante AA di ordine n=2pn = 2^p, a partire dalla prima riga di AA, vale a dire [A00,A01,…,A0,n−1][A_{00}, A_{01}, \dots, A_{0,n-1}]. Ha senso definire T(n)T(n) come il numero di operazioni sugli indici, anziché sui valori degli elementi di AA. Nota: un algoritmo efficiente dovrebbe avere T(n)=O(log⁡2n)T(n) = O(\log_2 n).

(Una matrice è supercircolante, SC, se n=1n = 1 oppure A=(A1A2A2A1)A = \begin{pmatrix} A_1 & A_2 \\ A_2 & A_1 \end{pmatrix} con A1,A2A_1, A_2 SC di ordine n2\frac n2.)

Idea

Una SC è determinata dalla sua prima riga r=[A00,…,A0,n−1]r = [A_{00}, \dots, A_{0,n-1}], ma ha n2n^2 elementi: costruire tutta la matrice costerebbe Θ(n2)\Theta(n^2) assegnamenti. Si vuole invece leggere un solo valore della riga. La struttura ricorsiva dice dove: la posizione (h,k)(h, k) cade in uno dei quattro quadranti, e i quadranti sono solo di due tipi, A1A_1 e A2A_2, le cui prime righe sono le due metà di rr.

Con indici da 00 e m=n2m = \frac n2:

posizione quadrante matrice
h<mh < m, k<mk < m alto a sinistra A1A_1
h<mh < m, k≥mk \ge m alto a destra A2A_2
h≥mh \ge m, k<mk < m basso a sinistra A2A_2
h≥mh \ge m, k≥mk \ge m basso a destra A1A_1

La matrice è A1A_1 quando hh e kk stanno nella stessa metà (h<mh < m equivale a k<mk < m), è A2A_2 altrimenti. Dentro il quadrante la posizione diventa (h mod m,k mod m)(h \bmod m, k \bmod m). La prima riga di A1A_1 è r[0..m−1]r[0..m-1] (prima metà di rr), quella di A2A_2 è r[m..n−1]r[m..n-1].

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 r[0..m−1]r[0..m-1] e r[m..n−1]r[m..n-1] 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 pp con n=2pn = 2^p. Per n=1n = 1 la matrice è [r0][r_0] e l'unico elemento è r0r_0. Per n>1n > 1, per la definizione di SC, AhkA_{hk} è l'elemento (h mod m,k mod m)(h \bmod m, k \bmod m) del quadrante in cui cade (h,k)(h, k); il quadrante è A1A_1 o A2A_2 secondo la tabella, ed è SC di ordine mm con prima riga la prima o la seconda metà di rr; per ipotesi induttiva la chiamata ricorsiva restituisce proprio quell'elemento.

Analisi. Ogni chiamata fa un numero costante cc di operazioni sugli indici (due confronti h<mh < m, k<mk < m, un confronto tra i risultati, due resti: c=5c = 5) e una chiamata su taglia n2\frac n2:

T(n)={0n=1,T ⁣(n2)+cn>1.T(n) = \begin{cases} 0 & n = 1, \\ T\!\left(\frac n2\right) + c & n > 1. \end{cases}

Srotolando: T(2p)=c⋅p=clog⁡2nT(2^p) = c \cdot p = c \log_2 n. 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 →): a=1a = 1, b=2b = 2, soglia n0=1n^0 = 1, w=c=Θ(1)w = c = \Theta(1), caso 2: T(n)=Θ(log⁡n)=O(log⁡2n)T(n) = \Theta(\log n) = O(\log_2 n), come richiesto. Con la convenzione c=5c = 5, T(n)=5log⁡2nT(n) = 5 \log_2 n.

Esempio (n=8n = 8, r=(a,b,c,d,e,f,g,h)r = (a, b, c, d, e, f, g, h), elemento (5,3)(5, 3)). m=4m = 4: h=5≥4h = 5 \ge 4 e k=3<4k = 3 < 4, metà diverse, quadrante A2A_2 con prima riga (e,f,g,h)(e, f, g, h), nuova posizione (5 mod 4,3 mod 4)=(1,3)(5 \bmod 4, 3 \bmod 4) = (1, 3). Con n=4n = 4, m=2m = 2, r=(e,f,g,h)r = (e, f, g, h): h=1<2h = 1 < 2 e k=3≥2k = 3 \ge 2, metà diverse, A2A_2 con prima riga (g,h)(g, h), posizione (1 mod 2,3 mod 2)=(1,1)(1 \bmod 2, 3 \bmod 2) = (1, 1). Con n=2n = 2, m=1m = 1, r=(g,h)r = (g, h): h=1≥1h = 1 \ge 1 e k=1≥1k = 1 \ge 1, stessa metà, A1A_1 con prima riga (g)(g), posizione (0,0)(0, 0). Con n=1n = 1 restituisce gg. La riga 55 (la sesta) della SC di ordine 88 è (f,e,h,g,b,a,d,c)(f, e, h, g, b, a, d, c), e l'elemento di colonna 33 è gg ✓.

Algoritmo diretto con lo XOR

Guardando i bit di hh e kk si ottiene un'espressione chiusa.

Proposizione. Ahk=rh⊕kA_{hk} = r_{h \oplus k}, dove ⊕\oplus è lo XOR bit a bit.

Dimostrazione per induzione su pp. Base n=1n = 1: h=k=0h = k = 0, r0⊕0=r0r_{0 \oplus 0} = r_0 ✓. Passo: con m=n2=2p−1m = \frac n2 = 2^{p-1}, il bit più significativo (peso mm) di hh e di kk dice in quale metà cadono, e h=htm+h′h = h_t m + h', k=ktm+k′k = k_t m + k' con ht,kt∈{0,1}h_t, k_t \in \{0, 1\}, h′=h mod mh' = h \bmod m, k′=k mod mk' = k \bmod m.

  • Se ht=kth_t = k_t (stessa metà), il quadrante è A1A_1 con prima riga r[0..m−1]r[0..m-1]: per ipotesi Ahk=rh′⊕k′A_{hk} = r_{h' \oplus k'}; e h⊕k=h′⊕k′h \oplus k = h' \oplus k' perché i bit di peso mm si annullano (ht⊕kt=0h_t \oplus k_t = 0).
  • Se ht≠kth_t \ne k_t (metà diverse), il quadrante è A2A_2 con prima riga r[m..n−1]r[m..n-1], cioè rj′=rm+jr'_j = r_{m + j}: per ipotesi Ahk=rh′⊕k′′=rm+(h′⊕k′)A_{hk} = r'_{h' \oplus k'} = r_{m + (h' \oplus k')}; e h⊕k=m+(h′⊕k′)h \oplus k = m + (h' \oplus k') perché il bit di peso mm dello XOR vale 11. ■\blacksquare

L'algoritmo è return r[h XOR k]: un'operazione sugli indici (nel modello in cui lo XOR di interi di log⁡2n\log_2 n bit costa O(1)O(1); se si contano le operazioni sui singoli bit, sono log⁡2n\log_2 n, lo stesso ordine di grandezza dell'algoritmo ricorsivo). Per n=8n = 8, (h,k)=(5,3)(h, k) = (5, 3): 5=10125 = 101_2, 3=01123 = 011_2, 5⊕3=1102=65 \oplus 3 = 110_2 = 6 e r6=gr_6 = g ✓. Le righe sono permutazioni della prima perché k↦h⊕kk \mapsto h \oplus k è una permutazione di {0,…,n−1}\{0, \dots, n-1\} (è un'involuzione); la simmetria Ahk=AkhA_{hk} = A_{kh} segue da h⊕k=k⊕hh \oplus k = k \oplus h.

Confronto con le circolanti. Per una matrice circolante (Ahk=r(k−h) mod nA_{hk} = r_{(k-h) \bmod n}) l'elemento si calcola con una sottrazione e un resto, per ogni nn (anche non potenza di 22).

Verifica con un programma. Costruita la matrice SC piena per n=1,2,4,…,64n = 1, 2, 4, \dots, 64 da una prima riga casuale, per tutte le coppie (h,k)(h, k) il valore AhkA_{hk} coincide con ELEM(r,h,k)(r, h, k) e con rh⊕kr_{h \oplus k}.

Versione ripasso

Problema: dato rr (prima riga di una SC di ordine n=2pn = 2^p) e (h,k)(h, k), trovare AhkA_{hk} con O(log⁡2n)O(\log_2 n) operazioni sugli indici, senza costruire la matrice (n2n^2 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 (m=n2m = \frac n2, indici da 00): (h,k)(h, k) cade in A1A_1 se hh e kk sono nella stessa metà (h<m  ⟺  k<mh < m \iff k < m), in A2A_2 altrimenti; dentro il quadrante la posizione è (h mod m,k mod m)(h \bmod m, k \bmod m). Prime righe: A1→r[0..m−1]A_1 \to r[0..m-1], A2→r[m..n−1]A_2 \to r[m..n-1].
  • **ELEM**(r,h,k)(r, h, k): n=1n = 1 restituisce r0r_0; altrimenti sceglie la metà di rr e richiama con (h mod m,k mod m)(h \bmod m, k \bmod m). Correttezza per induzione su pp dalla definizione di SC.
  • Costo: cc operazioni sugli indici per livello (due confronti, un confronto tra risultati, due resti: c=5c = 5): T(n)=T(n2)+cT(n) = T(\frac n2) + c, T(1)=0T(1) = 0, quindi T=clog⁡2n=Θ(log⁡n)T = c\log_2 n = \Theta(\log n) (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 n=8n = 8, (5,3)(5, 3): A2A_2, (1,3)(1, 3); A2A_2, (1,1)(1, 1); A1A_1, (0,0)(0, 0): elemento r6=gr_6 = g.
  • Forma chiusa: Ahk=rh⊕kA_{hk} = r_{h \oplus k} (XOR bit a bit). Induzione: stessa metà, i bit di peso mm si annullano e h⊕k=h′⊕k′h \oplus k = h' \oplus k' (quadrante A1A_1); metà diverse, h⊕k=m+(h′⊕k′)h \oplus k = m + (h' \oplus k') (quadrante A2A_2, che parte da rmr_m). Esempio 5⊕3=1012⊕0112=1102=65 \oplus 3 = 101_2 \oplus 011_2 = 110_2 = 6. Costo: una operazione (XOR) o log⁡2n\log_2 n operazioni sui bit.
  • Conseguenze: le righe sono permutazioni della prima (k↦h⊕kk \mapsto h \oplus k è una permutazione), la matrice è simmetrica (h⊕k=k⊕hh \oplus k = k \oplus h). Per le circolanti: Ahk=r(k−h) mod nA_{hk} = r_{(k - h) \bmod n}.
  • Errori tipici: confondere quando il quadrante è A2A_2 (è quando le metà differiscono, non quando h≥mh \ge m); dimenticare di ridurre gli indici modulo mm prima della chiamata ricorsiva; usare indici da 11 con lo XOR (serve da 00); costruire tutta la matrice (Θ(n2)\Theta(n^2)).

Teoria collegata