Salta al contenuto
Note per Studenti Esercizio - matrice V per V trasposta con V di Vandermonde, formula degli elementi e calcolo in tempo quadratico (compito del 4 settembre 2024, es. 2)

Esercizio - matrice V per V trasposta con V di Vandermonde, formula degli elementi e calcolo in tempo quadratico (compito del 4 settembre 2024, es. 2)

Esame
In questa pagina 3

Testo (compito d'esame del 4 settembre 2024 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 2, 17 punti). Data una sequenza di numeri complessi x=(x0,x1,…,xn−1)\mathbf x=(x_0,x_1,\dots,x_{n-1}), sia V=V(x)V=V(\mathbf x) la matrice di Vandermonde generata da x\mathbf x (dunque Vij=(xi)jV_{ij}=(x_i)^j, per 0≤i,j≤n−10\le i,j\le n-1). Sia VTV^T la trasposta di VV e sia W=VVTW=VV^T. Nel seguito, la complessità temporale va considerata come numero di operazioni aritmetiche tra scalari complessi.

  1. (a) [6 punti] Si ricavi una formula analitica per il generico elemento WijW_{ij} di WW, per 0≤i,j≤n−10\le i,j\le n-1. (Si presti attenzione al caso xixj=1x_ix_j=1.)
  2. (b) [5 punti] Sulla base della formula ricavata al punto (a), si proponga un algoritmo EVAL_W(x, i, j) per valutare la singola componente WijW_{ij} in tempo Tel=O(log⁡n)T_{el}=O(\log n) (e quindi l'intera matrice WW in tempo T=O(n2log⁡n)T=O(n^2\log n)).
  3. (c) [6 punti] Si proponga e si analizzi un algoritmo COMPUTE_W(x) che calcola l'intera matrice WW in tempo T=O(n2)T=O(n^2). (Suggerimento: si provi a evidenziare parti comuni nell'espressione associata a elementi WijW_{ij} diversi.)

Teoria usata: Polinomi - rappresentazione per coefficienti e per valori e convoluzioneun polinomio di grado limitato da n si rappresenta con n coefficienti o con n valori su n punti distinti (teorema di interpolazione, matrice di Vandermonde). Per coefficienti la somma costa n e il prodotto, la convoluzione lineare, n^2 prodotti e (n-1)^2 somme; per valori il prodotto costa 2n-1 prodotti ma serve una base estesa di almeno 2n-1 punti. Le conversioni generali costano troppo: valutazione n volte con Horner 2n(n-1), interpolazione con Gauss-Jordan n^3 o con Lagrange n^2. Serve una base speciale: la DFT.Polinomi - rappresentazione per coefficienti e per valori e convoluzione → (matrice di Vandermonde), Serie notevoli - geometrica, telescopica, armonicaLe serie di cui si conosce il carattere e da usare come termine di paragone: geometrica (converge a 1/(1-q) se |q|<1), telescopiche (somma b_1 - lim b_n, come Mengoli), armonica generalizzata (1/n^alpha converge se e solo se alpha>1).Serie notevoli - geometrica, telescopica, armonica → e SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie → (somma di una progressione geometrica), Esponenziazione veloce per quadrature successivepotenza x^n con un operatore associativo con elemento neutro, costo = numero di applicazioni dell'operatore; STUPID_POWER costa n-1, la sottostruttura x^n = (x^floor(n/2))^2 (per n dispari per x) dà POWER con T(n) = floor(log2 n) + (numero di bit a 1 di n) - 1, Theta(log n) (caso peggiore 2 floor(log2 n), n = 2^t - 1); versioni iterative POWER2 e POWER3 dalla rappresentazione binaria di n; esempio con la matrice di Fibonacci; il modello a costo unitario vale solo se l'operatore non fa crescere gli operandi.Esponenziazione veloce per quadrature successive → (potenza in O(log⁡n)O(\log n) prodotti), Operazioni tra matriciLe matrici m×n formano uno spazio vettoriale (somma e prodotto per scalare elemento per elemento); il prodotto righe per colonne corrisponde alla composizione di funzioni lineari, è associativo ma non commutativo; la trasposta scambia righe e colonne e (AB)^T = B^T A^T.Operazioni tra matrici → (prodotto righe per colonne).

Nessun elemento di WW richiede di moltiplicare matrici: la struttura di Vandermonde trasforma ogni elemento in una somma geometrica di ragione xixjx_ix_j.

(a) La formula di WijW_{ij}

Per definizione di prodotto righe per colonne, con (VT)kj=Vjk=xjk(V^T)_{kj}=V_{jk}=x_j^k: Wij=∑k=0n−1Vik (VT)kj=∑k=0n−1VikVjk=∑k=0n−1xik xjk=∑k=0n−1(xixj)k.W_{ij}=\sum_{k=0}^{n-1}V_{ik}\,(V^T)_{kj}=\sum_{k=0}^{n-1}V_{ik}V_{jk}=\sum_{k=0}^{n-1}x_i^k\,x_j^k=\sum_{k=0}^{n-1}(x_ix_j)^k. Posto b=xixjb=x_ix_j, è la somma dei primi nn termini della progressione geometrica di ragione bb (Serie notevoli - geometrica, telescopica, armonicaLe serie di cui si conosce il carattere e da usare come termine di paragone: geometrica (converge a 1/(1-q) se |q|<1), telescopiche (somma b_1 - lim b_n, come Mengoli), armonica generalizzata (1/n^alpha converge se e solo se alpha>1).Serie notevoli - geometrica, telescopica, armonica →, valida in C\mathbb C). Due casi:

  • se b=1b=1 ogni termine vale 11 e la somma è nn;
  • se b≠1b\ne1 la formula chiusa è bn−1b−1\dfrac{b^n-1}{b-1} (infatti (b−1)∑k<nbk=bn−1(b-1)\sum_{k<n}b^k=b^n-1 per telescopia).

Wij={nxixj=1,(xixj)n−1xixj−1xixj≠1.W_{ij}=\begin{cases}n&x_ix_j=1,\\[2mm]\dfrac{(x_ix_j)^n-1}{x_ix_j-1}&x_ix_j\ne1.\end{cases} Il caso xixj=1x_ix_j=1 va trattato a parte perché la formula chiusa darebbe 00\frac00. La matrice WW è simmetrica, Wij=WjiW_{ij}=W_{ji}, perché xixj=xjxix_ix_j=x_jx_i.

Esempio (n=3n=3, x=(2,12,3)\mathbf x=(2,\tfrac12,3)). V=(12411214139)V=\begin{pmatrix}1&2&4\\1&\frac12&\frac14\\1&3&9\end{pmatrix}. Gli elementi: W00W_{00}: b=4b=4, 43−14−1=21\frac{4^3-1}{4-1}=21 (infatti 1+4+16=211+4+16=21); W01W_{01}: b=2⋅12=1b=2\cdot\frac12=1, quindi W01=n=3W_{01}=n=3 (infatti 1+1+11+1+1); W02W_{02}: b=6b=6, 216−15=43\frac{216-1}{5}=43 (1+6+361+6+36); W11W_{11}: b=14b=\frac14, 1/64−11/4−1=2116\frac{1/64-1}{1/4-1}=\frac{21}{16}; W12W_{12}: b=32b=\frac32, 27/8−11/2=194\frac{27/8-1}{1/2}=\frac{19}4; W22W_{22}: b=9b=9, 729−18=91\frac{729-1}{8}=91. Quindi W=(21343321161944319491),W=\begin{pmatrix}21&3&43\\3&\frac{21}{16}&\frac{19}{4}\\43&\frac{19}{4}&91\end{pmatrix}, uguale a VVTVV^T calcolato per righe per colonne (controllo fatto anche con numpy su valori complessi casuali con un elemento forzato a xixj=1x_ix_j=1).

(b) Valutare un singolo elemento in O(log⁡n)O(\log n)

Si calcola b=xixjb=x_ix_j; se b=1b=1 si restituisce nn, altrimenti si restituisce (bn−1)/(b−1)\bigl(b^n-1\bigr)/(b-1) con la potenza per quadrature successive.

EVAL_W(x, i, j)
n <- x.len
b <- x[i] * x[j]
if b = 1 then return n
else return (POWER(b, n) - 1) / (b - 1)

POWER(b, n) esegue ⌊log⁡2n⌋\lfloor\log_2n\rfloor quadrature e popcount(n)−1\mathrm{popcount}(n)-1 prodotti per le cifre 11 dell'esponente (verificato contando i prodotti di un'implementazione, per esempio n=13n=13: 3+3−1=53+3-1=5 prodotti; n=100n=100: 6+3−1=86+3-1=8), in ogni caso al più 2⌊log⁡2n⌋2\lfloor\log_2n\rfloor. Le altre operazioni sono 11 prodotto (bb), 22 sottrazioni e 11 divisione. Quindi Tel≤2⌊log⁡2n⌋+4=O(log⁡n),T_{el}\le2\lfloor\log_2n\rfloor+4=O(\log n), e calcolare tutti gli n2n^2 elementi con questo algoritmo costa O(n2log⁡n)O(n^2\log n) (il confronto b=1b=1 è un test, non un'operazione aritmetica).

(c) L'intera matrice in O(n2)O(n^2)

Il costo log⁡n\log n per elemento viene dalla potenza (xixj)n(x_ix_j)^n. Ma (xixj)n=xin⋅xjn,(x_ix_j)^n=x_i^n\cdot x_j^n, cioè dipende da ii e da jj separatamente, e le n2n^2 potenze richieste sono prodotti delle sole nn potenze yi=xiny_i=x_i^n. Si calcolano allora una volta sola y=(x0n,…,xn−1n)\mathbf y=(x_0^n,\dots,x_{n-1}^n), e ogni elemento costa un numero costante di operazioni: Wij={nxixj=1,yiyj−1xixj−1altrimenti.W_{ij}=\begin{cases}n&x_ix_j=1,\\[1mm]\dfrac{y_iy_j-1}{x_ix_j-1}&\text{altrimenti.}\end{cases}

COMPUTE_W(x)
n <- x.len
for i <- 0 to n-1
    y[i] <- POWER(x[i], n)              { n chiamate, O(log n) l'una }
for i <- 0 to n-1
    for j <- 0 to n-1
        b <- x[i] * x[j]
        if b = 1 then W[i][j] <- n
        else W[i][j] <- (y[i]*y[j] - 1) / (b - 1)
return W

Costo. Primo ciclo: nn potenze, ciascuna al più 2⌊log⁡2n⌋2\lfloor\log_2n\rfloor prodotti, in tutto O(nlog⁡n)O(n\log n). Secondo doppio ciclo: ciascuno degli n2n^2 elementi richiede bb (11 prodotto), yiyjy_iy_j (11 prodotto), yiyj−1y_iy_j-1 e b−1b-1 (22 sottrazioni) e una divisione: 55 operazioni al più (solo 11 se b=1b=1). Totale T(n)≤5n2+2n⌊log⁡2n⌋=O(n2)(percheˊ nlog⁡n=O(n2)).T(n)\le5n^2+2n\lfloor\log_2n\rfloor=O(n^2)\quad(\text{perché }n\log n=O(n^2)). Verificato contando le operazioni di un'implementazione per n=2,4,5,8n=2,4,5,8: la parte dopo il precalcolo vale 5n25n^2 meno 44 per ogni elemento con b=1b=1 (per n=2n=2 con x1=1/x0x_1=1/x_0, i due elementi W01W_{01} e W10W_{10} costano 11 operazione invece di 55, quindi 12=20−812=20-8). Sfruttando la simmetria si calcolano solo gli elementi con j≥ij\ge i (n(n+1)/2n(n+1)/2) e si copiano gli altri: 52n(n+1)+O(nlog⁡n)\frac52n(n+1)+O(n\log n). Il costo Θ(n2)\Theta(n^2) è ottimo, perché la matrice ha n2n^2 elementi da scrivere.

Versione ripasso

Testo. Vij=xijV_{ij}=x_i^j (0≤i,j≤n−10\le i,j\le n-1), W=VVTW=VV^T. (a) [6] formula di WijW_{ij} (attenzione a xixj=1x_ix_j=1); (b) [5] EVAL_W(x,i,j) in O(log⁡n)O(\log n); (c) [6] COMPUTE_W(x) in O(n2)O(n^2) evidenziando le parti comuni. Teoria: Polinomi - rappresentazione per coefficienti e per valori e convoluzioneun polinomio di grado limitato da n si rappresenta con n coefficienti o con n valori su n punti distinti (teorema di interpolazione, matrice di Vandermonde). Per coefficienti la somma costa n e il prodotto, la convoluzione lineare, n^2 prodotti e (n-1)^2 somme; per valori il prodotto costa 2n-1 prodotti ma serve una base estesa di almeno 2n-1 punti. Le conversioni generali costano troppo: valutazione n volte con Horner 2n(n-1), interpolazione con Gauss-Jordan n^3 o con Lagrange n^2. Serve una base speciale: la DFT.Polinomi - rappresentazione per coefficienti e per valori e convoluzione →, Esponenziazione veloce per quadrature successivepotenza x^n con un operatore associativo con elemento neutro, costo = numero di applicazioni dell'operatore; STUPID_POWER costa n-1, la sottostruttura x^n = (x^floor(n/2))^2 (per n dispari per x) dà POWER con T(n) = floor(log2 n) + (numero di bit a 1 di n) - 1, Theta(log n) (caso peggiore 2 floor(log2 n), n = 2^t - 1); versioni iterative POWER2 e POWER3 dalla rappresentazione binaria di n; esempio con la matrice di Fibonacci; il modello a costo unitario vale solo se l'operatore non fa crescere gli operandi.Esponenziazione veloce per quadrature successive →, Serie notevoli - geometrica, telescopica, armonicaLe serie di cui si conosce il carattere e da usare come termine di paragone: geometrica (converge a 1/(1-q) se |q|<1), telescopiche (somma b_1 - lim b_n, come Mengoli), armonica generalizzata (1/n^alpha converge se e solo se alpha>1).Serie notevoli - geometrica, telescopica, armonica →.

  • (a) Wij=∑kxikxjk=∑k=0n−1(xixj)kW_{ij}=\sum_kx_i^kx_j^k=\sum_{k=0}^{n-1}(x_ix_j)^k, geometrica di ragione b=xixjb=x_ix_j: Wij=nW_{ij}=n se b=1b=1 (altrimenti 00\frac00), Wij=bn−1b−1W_{ij}=\frac{b^n-1}{b-1} se b≠1b\ne1. WW è simmetrica.
  • Esempio: n=3n=3, x=(2,12,3)\mathbf x=(2,\frac12,3): W00=21W_{00}=21, W01=3W_{01}=3 (b=1b=1), W02=43W_{02}=43, W11=2116W_{11}=\frac{21}{16}, W12=194W_{12}=\frac{19}4, W22=91W_{22}=91.
  • (b) b <- x[i]*x[j]; se b=1b=1 restituisce nn, altrimenti (POWER(b,n)-1)/(b-1). POWER fa ⌊log⁡2n⌋+popcount(n)−1≤2⌊log⁡2n⌋\lfloor\log_2n\rfloor+\mathrm{popcount}(n)-1\le2\lfloor\log_2n\rfloor prodotti; più 11 prodotto, 22 sottrazioni, 11 divisione: Tel≤2⌊log⁡2n⌋+4=O(log⁡n)T_{el}\le2\lfloor\log_2n\rfloor+4=O(\log n); tutta WW: O(n2log⁡n)O(n^2\log n).
  • (c) (xixj)n=xinxjn(x_ix_j)^n=x_i^nx_j^n: si precalcolano yi=xiny_i=x_i^n (nn potenze, O(nlog⁡n)O(n\log n)) e poi Wij=yiyj−1xixj−1W_{ij}=\frac{y_iy_j-1}{x_ix_j-1} (o nn se xixj=1x_ix_j=1) con 55 operazioni per elemento.
  • Costo di (c): T(n)≤5n2+2n⌊log⁡2n⌋=O(n2)T(n)\le5n^2+2n\lfloor\log_2n\rfloor=O(n^2); con la simmetria 52n(n+1)+O(nlog⁡n)\frac52n(n+1)+O(n\log n). Ottimo, perché l'output ha n2n^2 elementi.
  • Controllo: confronto con VVTVV^T per righe per colonne e conteggio delle operazioni per n=2,4,5,8n=2,4,5,8 (con xixj=1x_ix_j=1 forzato).
  • Errori tipici: dimenticare il caso xixj=1x_ix_j=1 (formula 00\frac00); ricalcolare (xixj)n(x_ix_j)^n per ogni coppia invece di usare yiyjy_iy_j; dire che il costo è O(n2log⁡n)O(n^2\log n) senza notare la parte comune.

Teoria collegata