Skip to content

Standardize all Obsidian callouts to 7 approved semantic types#1

Draft
Copilot wants to merge 4 commits into
mainfrom
copilot/update-callout-uniformity
Draft

Standardize all Obsidian callouts to 7 approved semantic types#1
Copilot wants to merge 4 commits into
mainfrom
copilot/update-callout-uniformity

Conversation

Copilot AI commented Apr 16, 2026

Copy link
Copy Markdown
Contributor
  • Trovati tutti i callout > [!tip] Parole del Professore con inner callout > > [!tip]
  • Sostituito > > [!tip] con > > [!quote] in 46 occorrenze su 23 file del 2° Semestre

…46 occurrences, 23 files)

Agent-Logs-Url: https://github.com/Fede-7/Notes/sessions/27733932-3009-494c-a2d9-620e65691e03

Co-authored-by: Fede-7 <75255965+Fede-7@users.noreply.github.com>
…essore (46 occurrences, 23 files)

Agent-Logs-Url: https://github.com/Fede-7/Notes/sessions/1b88f354-81e6-4de4-9917-08a20cc83a78

Co-authored-by: Fede-7 <75255965+Fede-7@users.noreply.github.com>

@Fede-7 Fede-7 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Standard callout

Copilot AI added a commit that referenced this pull request Apr 18, 2026
…ix Lezione 10 and 11

Agent-Logs-Url: https://github.com/Fede-7/Notes/sessions/85dbb06a-800a-45fc-8c45-da98cc3bc18b

Co-authored-by: Fede-7 <75255965+Fede-7@users.noreply.github.com>
@Fede-7

Fede-7 commented Apr 18, 2026

Copy link
Copy Markdown
Owner

@copilot git apply --3way <<'EOF'
diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/APA_Lezione9.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/APA_Lezione9.md"
index 79ffe4f..b1f6c87 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/APA_Lezione9.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/APA_Lezione9.md"
@@ -193,8 +193,9 @@ usando la stima $\log_2(n!) = \Omega(n \log n)$ già dimostrata sopra.

8. Il significato del risultato

-> [!quote]
-> "Il fatto che voi non riusciate a trovare un algoritmo migliore non significa che non esista. O c'è un'argomentazione sufficientemente astratta che vi permette di quantificare su tutti i possibili modi di risolvere, oppure non avete modo di rispondere."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Il fatto che voi non riusciate a trovare un algoritmo migliore non significa che non esista. O c'è un'argomentazione sufficientemente astratta che vi permette di quantificare su tutti i possibili modi di risolvere, oppure non avete modo di rispondere."

La tecnica usata — astrarsi dalla struttura sintattica degli algoritmi e ragionare sulle classi di equivalenza definite dall'albero di decisione — è un esempio di approccio information-theoretic: si ragiona sul numero di output distinti che l'algoritmo deve essere in grado di produrre e si deduce il numero minimo di confronti necessari per discriminarli tutti.

@@ -202,7 +203,7 @@ Questo è diverso dall'analisi sintattica dei singoli algoritmi. Due algoritmi c


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Ogni algoritmo comparison-based per ordinamento ha un unico albero di decisione di ordine $n$: i percorsi nell'albero corrispondono alle esecuzioni.
  • L'altezza dell'albero = complessità caso peggiore; la lunghezza media dei percorsi = complessità caso medio.
  • Poiché ci sono $n!$ permutazioni distinte, l'albero ha almeno $n!$ foglie, e questo implica altezza $\geq \log_2(n!) = \Omega(n \log n)$.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 0.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 0.md"
    index 953f49b..b3a06cf 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 0.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 0.md"
    @@ -39,11 +39,11 @@ Il corso si divide in due macro-aree:

2. Progettazione degli algoritmi

Dato un problema, come si costruisce una soluzione algoritmica? Si seguono due principi fondamentali:

-> [!definition] Decomposizione
+> [!info] Decomposizione

Scomporre il problema in sottoproblemi più semplici, risolverli separatamente e comporre le soluzioni.
Esempio già visto: problema delle coppie → generazione + filtraggio/conteggio.

-> [!definition] Riduzione
+> [!info] Riduzione

Ridurre un problema a un problema già noto e risolverlo sfruttando quella soluzione.
Esempio già visto: ordinamento topologico → ridotto alla visita DFS su grafi.

@@ -58,7 +58,7 @@ Dato un problema, come si costruisce una soluzione algoritmica? Si seguono due p

Per analizzare matematicamente un algoritmo serve un ponte tra il mondo degli algoritmi e il mondo della matematica. Questo ponte è il modello RAM (Random Access Machine).

-> [!definition] Modello RAM
+> [!info] Modello RAM

Astrazione di un calcolatore con:

  • Memoria illimitata di celle accessibili a tempo costante (accesso diretto)
  • Un insieme di istruzioni elementari: operazioni aritmetiche, lettura/scrittura in memoria
    @@ -68,7 +68,7 @@ Per analizzare matematicamente un algoritmo serve un ponte tra il mondo degl
    $$T_A : \mathbb{N} \rightarrow \mathbb{R}^+$$
    Dove $n \in \mathbb{N}$ è la dimensione dell'input (es. numero di elementi di un array) e $T_A(n)$ è il numero di operazioni elementari necessarie.

-> [!note] Perché $\mathbb{R}^+$ e non $\mathbb{N}$?
+> [!info] Perché $\mathbb{R}^+$ e non $\mathbb{N}$?

Il numero di operazioni è un naturale, ma le espressioni che useremo (es. con logaritmi) assumono valori reali. Lavorare in $\mathbb{R}$ ci dà accesso a strumenti più potenti: derivate, integrali, limiti — tutti strumenti di $\mathbb{R}$ non disponibili (o difficili) nel discreto.

[!tip] Codifica dell'input
@@ -131,7 +131,7 @@ Far partire j da i invece che da 1: si evitano i confronti inutili (tutti

  1. return sam
$$T_3(n) = 6n + 4 \quad \Rightarrow \quad \Theta(n)$$
-> [!success] Miglioramento asintotico
+> [!tip] Miglioramento asintotico
> Da $\Theta($n^2$)$ a $\Theta(n)$: un ciclo annidato in meno produce un salto di classe di complessità.

### Algoritmo 4 — Soluzione a tempo costante (geometrica)
@@ -142,7 +142,7 @@ $$\text{risultato} = \frac{n^2 - n}{2} + n = \frac{n(n+1)}{2}$$
1. return n * (n + 1) / 2

$$T_4(n) = O(1)$$
-> [!success] Tempo costante
+> [!tip] Tempo costante

Nessun ciclo: la risposta si calcola in un numero fisso di operazioni indipendentemente da $n$.


@@ -158,7 +158,7 @@ $$T_4(n) = O(1)$$

Confrontare due funzioni punto per punto non è sempre possibile (potrebbero incrociarsi). Ci interessa il comportamento al crescere illimitato di $n$, cioè il regime asintotico.

-> [!important] Intuizione fondamentale
+> [!info] Intuizione fondamentale

Un algoritmo è intrinsecamente migliore di un altro se lo è indipendentemente dall'hardware su cui gira. Un computer può essere $c$ volte più veloce di un altro, ma questo fattore è costante e non dipende da $n$. Due algoritmi sono equivalenti se la differenza tra loro è solo una costante moltiplicativa fissa.

Le tre notazioni

@@ -173,7 +173,7 @@ Confrontare due funzioni punto per punto non è sempre possibile (potrebbero inc

$O$ grande — Limite superiore asintotico

-> [!definition] O grande
+> [!info] O grande

$$f(n) = O(g(n)) \iff \exists, c &gt; 0,\ \exists, n_0 &gt; 0 : \forall n \geq n_0,\quad f(n) \leq c \cdot g(n)$$
Interpretazione: $c$ è il fattore con cui posso rallentare l'esecutore di $g$ per renderlo peggio di $f$. Se esiste tale $c$ fissata a priori, allora $f$ non è peggio di $g$.

@@ -186,7 +186,7 @@ Confrontare due funzioni punto per punto non è sempre possibile (potrebbero inc

$\Omega$ grande — Limite inferiore asintotico

-> [!definition] Omega grande
+> [!info] Omega grande

$$f(n) = \Omega(g(n)) \iff \exists, c &gt; 0,\ \exists, n_0 &gt; 0 : \forall n \geq n_0,\quad f(n) \geq c \cdot g(n)$$
Duale di $O$ grande: $c$ è ora il fattore con cui accelero l'esecutore di $g$.

@@ -194,7 +194,7 @@ Duale di $O$ grande: $c$ è ora il fattore con cui accelero l'esecutore di $g$

$\Theta$ (Theta) — Equivalenza asintotica

-> [!definition] Theta
+> [!info] Theta

$$f(n) = \Theta(g(n)) \iff \exists, c_1, c_2 &gt; 0,\ \exists, n_0 &gt; 0 : \forall n \geq n_0,\quad c_1 \cdot g(n) \leq f(n) \leq c_2 \cdot g(n)$$
Equivale a: $f = O(g)$ e $f = \Omega(g)$.

diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 1.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 1.md"
index c2b83cc..13edaa1 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 1.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 1.md"
@@ -57,7 +57,7 @@ Da questo punto in poi, sia la condizione $O$ che quella $\Omega$ sono soddisfat
│ solo O vale │ O e Ω valgono entrambi


-> [!note]
+> [!info]
> Se $n_{0,2} > n_{0,1}$, c'è un intervallo $[n_{0,1}, n_{0,2})$ in cui vale solo $O$ ma non $\Omega$. Prendendo il massimo, si elimina questo problema.

---
@@ -110,7 +110,7 @@ flowchart LR
    style Ck fill:#fff3cd

-> [!note] Perché funziona quando $L = k$ (costante)
+> [!info] Perché funziona quando $L = k$ (costante)

Se $h$ tende a $k$ da sopra o da sotto, le oscillazioni diventano irrilevanti rispetto a costanti opportunamente scelte. Si trovano $c_1 &lt; k &lt; c_2$ tali che, da un certo $n_0$ in poi, $c_1 \leq h(n) \leq c_2$, ovvero $c_1 \cdot g(n) \leq f(n) \leq c_2 \cdot g(n)$ → definizione di $\Theta$.

[!tip] Quando usare De L'Hôpital
@@ -126,7 +126,7 @@ Vogliamo confrontare $f(n) = 4n^2 + 10n$ con $g(n) = n^2$.
$$L = \lim_{n \to \infty} \frac{4n^2 + 10n}{n^2} = \lim_{n \to \infty} \left(4 + \frac{10}{n}\right) = 4$$
$L$ è una costante positiva finita → $f(n) = \Theta($n^2$)$.

-> [!note] Proprietà generale sui polinomi
+> [!info] Proprietà generale sui polinomi

Per qualsiasi polinomio $f(n)$ di grado $d$ con coefficiente principale positivo:
$$f(n) = \Theta(n^d)$$
La dimostrazione è una generalizzazione diretta: tutti i termini di grado inferiore producono termini $\to 0$ nel rapporto con $n^d$.
@@ -186,7 +186,7 @@ Per $n \geq n_3$:
$$f(n) \leq c_1 \cdot g(n) \leq c_1 \cdot c_2 \cdot h(n)$$
Scelgo $c_3 = c_1 \cdot c_2 &gt; 0$ (prodotto di positivi). Ho dimostrato $f = O(h)$. $\square$

-> [!note] Stessa dimostrazione per $\Omega$ e $\Theta$
+> [!info] Stessa dimostrazione per $\Omega$ e $\Theta$

Il ragionamento è identico per $\Omega$. Per $\Theta$, si combina transitività di $O$ e $\Omega$.


@@ -215,10 +215,11 @@ Ora $\log c_1$ e $\log c_2$ sono costanti (anche potenzialmente negative, ma
$$\frac{\log g(n) + \log c_1}{\log g(n)} \leq \frac{\log f(n)}{\log g(n)} \leq \frac{\log g(n) + \log c_2}{\log g(n)}$$
I due lati tendono entrambi a 1 (poiché $\log g(n) \to \infty$ e le costanti sommative diventano irrilevanti) → per il metodo dei limiti, il rapporto tende a una costante positiva → $\Theta$.

-> [!quote]
-> "Il punto chiave è questo: una costante moltiplicativa, prendendo il logaritmo, diventa una costante additiva, e le costanti additive sono irrilevanti rispetto a funzioni che crescono all'infinito. Con l'esponenziale è il contrario: una costante moltiplicativa nell'esponente diventa un fattore moltiplicativo esponenziale, e quello non è più trascurabile."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Il punto chiave è questo: una costante moltiplicativa, prendendo il logaritmo, diventa una costante additiva, e le costanti additive sono irrilevanti rispetto a funzioni che crescono all'infinito. Con l'esponenziale è il contrario: una costante moltiplicativa nell'esponente diventa un fattore moltiplicativo esponenziale, e quello non è più trascurabile."

-> [!note] Generalizzazione: torri di esponenziali
+> [!info] Generalizzazione: torri di esponenziali

Il logaritmo "taglia" un solo livello di esponenziale. Per confrontare $2^{2^n}$ e $2^{4^n}$ bisognerebbe applicare il logaritmo due volte ($\log \log$). La torre degli esponenziali ha come inversa la torre dei logaritmi.


@@ -245,7 +246,7 @@ I due lati tendono entrambi a 1 (poiché $\log g(n) \to \infty$ e le costanti so

Senza il vincolo di contiguità, basterebbe sommare tutti i valori non negativi. Il vincolo di contiguità rende il problema non banale.

-> [!note] Gestione del caso "tutti negativi"
+> [!info] Gestione del caso "tutti negativi"

Se tutti i valori sono negativi, la sottosequenza ottimale è quella vuota, con somma 0. Per questo l'algoritmo parte con $\text{somma_massima} = 0$ — se non trova niente di meglio, la risposta sarà 0.

Quante sono le sottosequenze contigue?

@@ -291,7 +292,7 @@ $$\boxed{T(n) = \Theta(n^3)}$$

Anticipazione: verso l'algoritmo quadratico

-> [!note] (Verrà approfondito nella prossima lezione)
+> [!info] (Verrà approfondito nella prossima lezione)

Il ciclo interno fa lavoro inutile: ogni volta che $j$ avanza di 1, ricalcola da zero l'intera somma $\sum_{k=i}^{j} A[k]$, che era già stata calcolata al passo precedente!

@@ -299,16 +300,17 @@ Il ciclo interno fa lavoro inutile: ogni volta che $j$ avanza di 1, ricalcol
$$S([i, j+1]) = S([i, j]) + A[j+1]$$
cioè posso estendere la sottosequenza a destra in tempo costante, senza ricalcolare tutto. Questo elimina il ciclo k, abbassando la complessità da $O($n^3$)$ a $O($n^2$)$.

-> [!note] (Verrà approfondito nelle lezioni successive)
+> [!info] (Verrà approfondito nelle lezioni successive)

Abbassare ulteriormente da $O($n^2$)$ a $O(n)$ richiede di non analizzare tutte le sottosequenze, scartandone alcune con la garanzia formale che non possono contenere la soluzione ottima.

-> [!quote]
-> "Il numero di sottosequenze contigue è quadratico, quindi l'unico modo di abbassare rispetto al quadratico è non analizzare tutte le sottosequenze — devo avere un modo di scartarle con la certezza di non perdere quella buona."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Il numero di sottosequenze contigue è quadratico, quindi l'unico modo di abbassare rispetto al quadratico è non analizzare tutte le sottosequenze — devo avere un modo di scartarle con la certezza di non perdere quella buona."


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  1. $\Theta = O \cap \Omega$: la dimostrazione del verso non banale richiede di scegliere $n_0 = \max(n_{0,1}, n_{0,2})$ per garantire che entrambe le condizioni valgano contemporaneamente.
  2. Transitività: $O$, $\Omega$ e $\Theta$ sono transitive; la costante si ottiene come prodotto $c_3 = c_1 \cdot c_2$.
  3. Metodo dei limiti: $L=0 \Rightarrow o$; $L=\infty \Rightarrow \omega$; $L=k&gt;0 \Rightarrow \Theta$. Utile De L'Hôpital per forme indeterminate.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 2.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 2.md"
    index d4119b8..5de2df1 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 2.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 2.md"
    @@ -392,7 +392,7 @@ $$T_{\text{worst}}(n) = \Theta(n^2)$$

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  1. Da $\Theta(n^3)$ a $\Theta(n^2)$: eliminando il ciclo interno e mantenendo la somma incrementale tra iterazioni successive di $j$, si riduce il costo di valutazione di ogni sottosequenza da $O(n)$ a $O(1)$.
  2. Da $\Theta(n^2)$ a $\Theta(n)$ (Kadane): dimostrando che ogni sottosequenza contenente un prefisso di somma negativa e subottimale, si riduce lo spazio di ricerca da $\Theta(n^2)$ a $O(n)$ sottosequenze. L'algoritmo e ottimo (limite inferiore $\Omega(n)$).
  3. Due strategie di ottimizzazione: (a) ridurre il costo per soluzione, (b) ridurre il numero di soluzioni esaminate. La seconda e piu potente ma richiede una dimostrazione di correttezza.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 3.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 3.md"
    index 181e567..a0f2288 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 3.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 3.md"
    @@ -432,7 +432,7 @@ L'approccio usato per Merge Sort si generalizza a qualsiasi algoritmo ricorsivo:

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  1. Insertion Sort --- caso migliore: $t_j = 1$ per ogni $j$ (array ordinato) $\Rightarrow$ $T(n) = \Theta(n)$.
  2. Insertion Sort --- caso peggiore: $t_j = j$ per ogni $j$ (array ordinato al contrario) $\Rightarrow$ $T(n) = \Theta(n^2)$.
  3. Insertion Sort --- caso medio: il valore atteso $E[t_j] = \frac{j+1}{2}$ porta a $T(n) = \Theta(n^2)$. La conferma arriva anche dall'analisi delle inversioni: il numero medio di inversioni e $\frac{n(n-1)}{4} = \Theta(n^2)$.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 5.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 5.md"
    index 8060375..5a6701b 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 5.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 5.md"
    @@ -78,8 +78,9 @@ $$T(n) = \sum_{i=2}^{n} T_{\text{findmax}}(i) = \sum_{i=2}^{n} \Theta(i) = \Thet

Il problema di Selection Sort è che ogni chiamata a find_max parte da zero, dimenticando tutto quello che ha visto nelle chiamate precedenti. Eppure, durante la ricerca del massimo, l'algoritmo fa confronti e acquisisce informazioni sulle relazioni di ordine tra elementi — che vengono poi dimenticate.

-> [!quote]
-> "Se il nostro algoritmo ricordasse le cose che ha già visto, potrebbe evitare di fare confronti inutili nelle ricerche successive. La prima ricerca del massimo sarà sempre $\Theta(n)$ — non c'è modo di evitarlo su input arbitrario. Ma le ricerche successive potrebbero costare molto meno, se disponessimo dell'informazione accumulata in precedenza."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Se il nostro algoritmo ricordasse le cose che ha già visto, potrebbe evitare di fare confronti inutili nelle ricerche successive. La prima ricerca del massimo sarà sempre $\Theta(n)$ — non c'è modo di evitarlo su input arbitrario. Ma le ricerche successive potrebbero costare molto meno, se disponessimo dell'informazione accumulata in precedenza."

L'idea è mantenere una struttura dati che rappresenta un ordinamento parziale tra gli elementi: non sappiamo l'ordinamento totale, ma conosciamo alcune relazioni tra coppie. Questa struttura ha naturalmente forma di albero.

@@ -134,7 +135,7 @@ Da questa corrispondenza si ricavano le funzioni di navigazione dell'albero (con

$$\text{FiglioSinistro}(i) = 2i \qquad \text{FiglioDestra}(i) = 2i + 1 \qquad \text{Padre}(i) = \lfloor i/2 \rfloor$$

-> [!important] Proprietà strutturali dell'array
+> [!info] Proprietà strutturali dell'array

  • I nodi interni (quelli con almeno un figlio) occupano le posizioni $1$ a $\lfloor n/2 \rfloor$.
  • Le foglie occupano le posizioni $\lfloor n/2 \rfloor + 1$ a $n$.
  • Ogni array di lunghezza $n$ corrisponde implicitamente a un albero binario completo.
    @@ -265,7 +266,7 @@ flowchart LR

Totale: $T(n) = \Theta(n) + O(n \log n) = O(n \log n)$

-> [!important] Il costo è esattamente $\Theta(n \log n)$, non solo $O(n \log n)$
+> [!info] Il costo è esattamente $\Theta(n \log n)$, non solo $O(n \log n)$

Il limite inferiore $\Omega(n \log n)$ deriva dal Teorema degli Alberi di Decisione (che verrà dimostrato più avanti): nessun algoritmo di ordinamento basato su confronti può fare meglio di $\Omega(n \log n)$. Quindi HeapSort è asintoticamente ottimale.

Confronto finale

@@ -280,7 +281,7 @@ HeapSort combina i vantaggi di Merge Sort (complessità garantita $\Theta(n \log


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Selection Sort è il duale di Insertion Sort: seleziona le posizioni e cerca l'elemento. Ha sempre costo $\Theta(n^2)$ perché find_max è ottimale ma non ha memoria.
  • HeapSort nasce dall'idea di memorizzare le relazioni d'ordine viste durante la prima ricerca del massimo in una struttura dati (lo heap), evitando lavoro ridondante nelle ricerche successive.
  • Uno heap è un albero binario completo con la proprietà che ogni nodo è ≥ dei suoi figli. Il massimo è sempre in radice.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 6.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 6.md"
    index 135a0e6..211f043 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 6.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 6.md"
    @@ -42,8 +42,9 @@ Le stime superiori che avevamo dato erano: $O(n \log n)$ sia per BuildHeap che

BuildHeap applica Heapify a tutti i nodi interni, ma la gran parte delle chiamate avviene su nodi che sono radici di sottoalberi di altezza molto bassa. I nodi profondi (vicini alle foglie) sono molti, ma i loro sottoalberi sono piccoli. I nodi vicini alla radice (con sottoalberi alti) sono pochi.

-> [!quote]
-> "La stragrande maggioranza delle chiamate Heapify vengono fatte su heap in cui H è molto basso."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La stragrande maggioranza delle chiamate Heapify vengono fatte su heap in cui H è molto basso."

La struttura dell'analisi

@@ -245,12 +246,12 @@ $$T(n) = \begin{cases} \Theta(1) & \text{se } n \leq 1 \ \Theta(n) + T(k) + T(n

dove $k$ dipende dall'input. L'analisi richiede quindi di distinguere caso peggiore, caso migliore e caso medio, analogamente a quanto fatto per InsertionSort.

-> [!important] Implicazione
+> [!info] Implicazione

Il comportamento di QuickSort non dipende solo dalla dimensione dell'input, ma dai suoi valori. Se il pivot è sempre il minimo o il massimo, la partizione sarà sempre sbilanciata (1 elemento da un lato, $n-1$ dall'altro), degradando a $\Theta(n^2)$. La prossima lezione tratterà la soluzione di questa equazione di ricorrenza.


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • BuildHeap ha costo $\Theta(n)$, non $\Theta(n \log n)$: la maggior parte delle chiamate Heapify avviene su sottoalberi molto bassi.
  • HeapSort ha costo $\Theta(n \log n)$: la stima era stretta perché le prime $n/2$ chiamate costano ciascuna $\log n$.
  • QuickSort evita la fusione garantendo che ogni elemento della partizione sinistra sia $\leq$ di ogni elemento della destra.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 7.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 7.md"
    index 705c1ee..9717b31 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 7.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 7.md"
    @@ -118,12 +118,13 @@ Per il Teorema Master (caso 2): $T(n) = \Theta(n \log n)$.

Caso medio: in media su tutti i possibili input, il tempo atteso è $\Theta(n \log n)$. Questo verrà dimostrato nelle lezioni successive.

-> [!quote]
-> "Dovremo fare analisi di caso migliore, caso peggiore e eventualmente caso medio, analogamente a quanto fatto con InsertionSort."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Dovremo fare analisi di caso migliore, caso peggiore e eventualmente caso medio, analogamente a quanto fatto con InsertionSort."


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Partition termina in $\Theta(n)$: la somma degli incrementi di $i$ e dei decrementi di $j$ è al più $n+1$.
  • Si restituisce $j$ perché si ferma su un elemento $\leq x$ (corretto per la partizione sinistra); $i$ si ferma su un elemento $\geq x$ che potrebbe essere troppo grande.
  • Fermarsi sugli uguali è fondamentale per garantire R2 su array con elementi duplicati.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 8.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 8.md"
    index 93f20f1..de48573 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 8.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/Lezione 8.md"
    @@ -61,7 +61,7 @@ $$T(n) = \Theta(n \cdot h_{\max}) = \Theta(n \log n)$$

Per qualsiasi costante $\alpha$ con $0 &lt; \alpha &lt; 1$, se le partizioni sono sempre $\alpha n$ e $(1-\alpha)n$, si ottiene $T(n) = \Theta(n \log n)$.

-> [!important] Il sbilanciamento proporzionale non peggiora l'andamento asintotico
+> [!info] Il sbilanciamento proporzionale non peggiora l'andamento asintotico

Finché le due partizioni hanno dimensioni che sono entrambe frazioni costanti di $n$, l'algoritmo rimane $\Theta(n \log n)$. Solo quando una partizione è di dimensione costante (es. 1) si degrada a $\Theta(n^2)$.

Alternanza di partizioni perfette e pessime

@@ -70,8 +70,9 @@ Se QuickSort alterna livelli perfettamente bilanciati ($n/2, n/2$) e livelli com

$$T(n) = \Theta(n \cdot 2 \log_2 n) = \Theta(n \log n)$$

-> [!quote]
-> "Non è facile rovinare l'andamento del caso migliore in vari modi in cui ho provato ad avvicinarmi. Quindi sembra che questo algoritmo tendenzialmente si comporti sempre così."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Non è facile rovinare l'andamento del caso migliore in vari modi in cui ho provato ad avvicinarmi. Quindi sembra che questo algoritmo tendenzialmente si comporti sempre così."


@@ -188,7 +189,7 @@ Fissato $n$ e fissato l'algoritmo $A$, esiste un unico albero di decisione c


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Il caso peggiore di QuickSort è $\Theta(n^2)$ (pivot sempre estremo), ma questo è raro con la scelta casuale del pivot.
  • Qualsiasi sbilanciamento proporzionale (es. 1/10 e 9/10) mantiene la complessità a $\Theta(n \log n)$.
  • Il caso medio è $\Theta(n \log n)$, dimostrato per induzione con la tecnica della sommatoria in due parti.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 0.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 0.md"
    index 26e8f7b..fe5f406 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 0.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 0.md"
    @@ -148,7 +148,7 @@ L'organizzazione delle parti avviene secondo due criteri: favorire l'apprendimen

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • L'impresa è un'organizzazione che acquisisce input, li trasforma e produce output per generare reddito.
  • L'utile è il risultato economico positivo; una perdita non implica automaticamente il fallimento, ma è un rischio.
  • L'impresa è un sistema: tutte le sue parti devono essere interconnesse e orientate allo stesso obiettivo.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 1.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 1.md"
    index d756bda..d852e75 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 1.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione 1.md"
    @@ -173,7 +173,7 @@ Una prima rottura parziale del mercato si e verificata quando LG ha messo in

La vera rivoluzione e arrivata con Apple e il touchscreen. Questo cambiamento e stato cosi radicale che aziende leader come Nokia non sono riuscite a tenere il passo. Nokia esiste ancora oggi, ma vende principalmente telefoni con tasti grandi destinati a persone anziane: non ha piu la potenza mondiale che aveva vent'anni fa.

-> [!quote] Il docente sulla rivoluzione del touchscreen
+> [!tip] Il docente sulla rivoluzione del touchscreen

"C'e stata un'evoluzione che ha cambiato completamente il mondo. Aziende forti come Nokia, che erano leader del mercato, non sono riuscite a tenere il passo e si sono trovate, andando da li a poco, che Nokia esiste ma non fattura le stesse cose che fatturava prima."

Motorola

@@ -218,7 +218,7 @@ Il docente distingue nettamente tra giudizio politico e giudizio imprenditoriale

Berlusconi

-> [!quote] Il docente su Berlusconi imprenditore
+> [!tip] Il docente su Berlusconi imprenditore

"Berlusconi lo si puo criticare come uomo di politica. Ma come imprenditore? Come imprenditore Berlusconi e stato un grande. Ha iniziato cantando sulle navi da crociera, poi e diventato l'uomo piu ricco d'Italia e uno dei piu ricchi del mondo, perche ha saputo sfruttare la sua capacita imprenditoriale."

Dal punto di vista politico si puo essere d'accordo o meno, ma dal punto di vista imprenditoriale la sua capacita di costruire un impero mediatico e finanziario e indiscutibile. Il docente nota anche che i suoi rapporti internazionali (Trump, Putin) derivavano in parte dal suo status di grande imprenditore.
@@ -331,7 +331,7 @@ I video sono disponibili anche all'interno delle slide caricate su Teams.


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • L'impresa e un sistema cognitivo perche la componente umana acquisisce continuamente nuove conoscenze, a differenza delle macchine (conoscenza statica).
  • Gli elementi tangibili (immobilizzazioni materiali) e intangibili (immobilizzazioni immateriali come brevetti e marchi) coesistono nel bilancio, ma il sapere umano non vi compare.
  • L'impresa opera in tre mercati esterni: produzione (fornitori), lavoro (personale) e capitali (investitori e banche).
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_2_Relazioni_impresa_ambiente.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_2_Relazioni_impresa_ambiente.md"
    index dc14f16..95bf662 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_2_Relazioni_impresa_ambiente.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_2_Relazioni_impresa_ambiente.md"
    @@ -107,7 +107,7 @@ L'impresa che comprende il pattern di questa dinamica — ovvero che alcuni fatt

-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

La relazione tra impresa e ambiente è dinamica e multidimensionale. Non esiste una gerarchia fissa di influenze: a volte l'impresa condiziona il mercato, a volte è il mercato a vincolare l'impresa, a volte ancora fattori completamente esterni determinano i confini dello spazio d'azione aziendale. Comprendere come posizionare un singolo fattore lungo questo spettro di influenze è cruciale per la formulazione di strategie aziendali efficaci.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_3_Strategie_aziendali.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_3_Strategie_aziendali.md"
index 6649c26..fc657a7 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_3_Strategie_aziendali.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_3_Strategie_aziendali.md"
@@ -186,7 +186,7 @@ Il successo di una strategia dipende dalla sua coerenza con l'ambiente esterno e


-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

La gestione strategica è il processo attraverso il quale un'impresa formula e persegue scelte per mantenere un vantaggio competitivo. Una strategia efficace deve essere coerente sia con l'ambiente esterno sia con le risorse interne. Nel corso dei decenni, le strategie aziendali hanno seguito evoluzioni significative: dalla diversificazione dei prodotti alla focalizzazione sul vantaggio competitivo, fino all'innovazione e cooperazione contemporanea. La distinzione tra strategia (il piano complessivo) e tattica (le azioni specifiche) è fondamentale per comprendere come le imprese operano e competono.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_4_Sviluppo_aziendale_Ansoff.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_4_Sviluppo_aziendale_Ansoff.md"
index f8831ec..cc4514e 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_4_Sviluppo_aziendale_Ansoff.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_4_Sviluppo_aziendale_Ansoff.md"
@@ -290,7 +290,7 @@ Ciascuna strategia comporta profili di rischio, complessità, e potenziale di re


-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

I percorsi di sviluppo aziendale possono essere classificati secondo la matrice di Ansoff, che considera come cambiano il prodotto e il mercato. La penetrazione del mercato è la strategia conservativa di aumento della quota nel segmento attuale. Lo sviluppo del prodotto comporta innovazione senza uscire dal mercato attuale. Lo sviluppo del mercato significa espandere geograficamente o di segmento senza modificare il prodotto. La diversificazione è la strategia più ambiziosa e rischiosa. Ogni strategia è appropriata in contesti diversi e richiede analisi critica del business plan, comprensivo di analisi SWOT, visione e missione, analisi competitiva, e proiezioni finanziarie.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_5_Vincoli_istituzionali.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_5_Vincoli_istituzionali.md"
index 3564c5b..1f9156a 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_5_Vincoli_istituzionali.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_5_Vincoli_istituzionali.md"
@@ -182,7 +182,7 @@ Per comprendere pienamente l'economia aziendale, quindi, bisogna sempre guardare


-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

L'impresa è un sistema politico-istituzionale, socio-demografico, culturale-tecnologico e economico. La qualità di ciascuna di queste dimensioni nel contesto in cui l'impresa opera determina la sua capacità di nascere, crescere, e generare profitto. I vincoli burocratici, la tassazione, l'infrastruttura tecnologica, e le scelte politiche dei governi hanno impatto diretto sulla vitalità economica. L'analisi critica delle politiche pubbliche richiede di guardare oltre le giustificazioni ufficiali e chiedersi chi effettivamente beneficia dalle decisioni prese.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_6_Imprenditore_Manager_Stakeholder.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_6_Imprenditore_Manager_Stakeholder.md"
index 339a462..ca14679 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_6_Imprenditore_Manager_Stakeholder.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_6_Imprenditore_Manager_Stakeholder.md"
@@ -264,7 +264,7 @@ Questo approccio non è altruismo: è una strategia commerciale razionale. U


-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

L'imprenditore è il visionario che identifica opportunità e rischia i propri capitali per realizzarle. Il manager è l'esecutore razionale che implementa la visione dell'imprenditore in modo efficiente. L'efficacia riguarda il raggiungimento dell'obiettivo; l'efficienza riguarda il raggiungimento con minimo spreco di risorse. Un'impresa moderna non serve solo gli azionisti, ma un complesso di stakeholder (dipendenti, fornitori, clienti, comunità). La gestione consapevole di questi rapporti è una fonte di vantaggio competitivo sostenibile nel lungo termine.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_7_Barriere_Forze_Porter.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_7_Barriere_Forze_Porter.md"
index 9b75db9..cd4925b 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_7_Barriere_Forze_Porter.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Economia Aziendale/Lezione_7_Barriere_Forze_Porter.md"
@@ -268,7 +268,7 @@ Un settore attraente (ad es. tecnologia dei semiconduttori negli anni 2000)


-> [!summary] Riepilogo concettuale
+> [!abstract] Riepilogo concettuale

Le barriere di mercato — economiche, strategiche, e normative — determinano la struttura competitiva di un settore. Il modello di Porter delle cinque forze fornisce un framework per analizzare la competizione: minaccia di nuovi entranti, potere dei fornitori, potere dei clienti, rivalità tra competitor, e minaccia di prodotti sostitutivi. Un'azienda che comprende queste forze può formulare strategie difensive appropriate (aumentare le barriere, differenziarsi, innovare) per proteggere la propria redditività.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/LP_Lezione8.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/LP_Lezione8.md"
index ab56231..e4fe3a1 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/LP_Lezione8.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/LP_Lezione8.md"
@@ -117,8 +117,9 @@ flowchart LR
2. Inizializzatori espliciti: se un attributo è dichiarato con = valore, quel valore viene scritto.
3. Corpo del costruttore: esegue ulteriori inizializzazioni.

-> [!quote]
-> "Questo è un fattore di sicurezza. Se provate a usare un puntatore azzerato, vi darà fuori un'eccezione. È un compromesso vantaggioso tra sicurezza ed efficienza: la costruzione di oggetti è relativamente rara rispetto alle operazioni."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Questo è un fattore di sicurezza. Se provate a usare un puntatore azzerato, vi darà fuori un'eccezione. È un compromesso vantaggioso tra sicurezza ed efficienza: la costruzione di oggetti è relativamente rara rispetto alle operazioni."


@@ -257,7 +258,7 @@ Quando si studia un linguaggio nuovo, le caratteristiche del sistema di tipi da


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Java ha 8 tipi primitivi con dimensioni fisse su qualunque piattaforma; boolean non è mai compatibile con i tipi interi.
  • Gli oggetti vengono costruiti in tre strati: azzeramento → inizializzatori espliciti → costruttore. Gli attributi sono sempre inizializzati; le variabili locali devono essere inizializzate esplicitamente (controllo statico del compilatore).
  • Il passaggio parametri in Java è sempre per copia. Per i tipi reference si copia il puntatore: modifiche all'oggetto sono visibili fuori, ma riassegnare il parametro formale non lo è.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 0.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 0.md"
    index 4366c09..1f03d3c 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 0.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 0.md"
    @@ -42,8 +42,9 @@ Il corso si chiama "Linguaggi di Programmazione" al plurale per una ragione prec

La risposta pratica non è conoscerli tutti, ma capire le idee fondamentali con cui i linguaggi vengono costruiti. Queste idee sono poche, stabili nel tempo, e non dipendono dalla sintassi di un linguaggio specifico. Quando emerge un linguaggio nuovo, lo si "scompatta" nelle sue idee costituenti e lo si impara per delta rispetto a ciò che si conosce già.

-> [!quote]
-> "L'obiettivo specifico è insegnare a imparare velocemente un nuovo linguaggio, astraendo quelle che sono le caratteristiche di base. Queste cambiano di rado: è tanto tempo che non ne vedo comparire una completamente nuova."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "L'obiettivo specifico è insegnare a imparare velocemente un nuovo linguaggio, astraendo quelle che sono le caratteristiche di base. Queste cambiano di rado: è tanto tempo che non ne vedo comparire una completamente nuova."

Obiettivi del corso

@@ -191,7 +192,7 @@ flowchart TD


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I linguaggi proliferano perché categorie di problemi diverse richiedono strumenti espressivi diversi. Imparare le idee fondamentali (non le sintassi) permette adattamento rapido.
  • Le caratteristiche chiave — variabile, tipo, ricorsione, GC, OO, metaprogrammazione — sono state introdotte tra gli anni '50 e '70.
  • Un linguaggio è Turing-completo se i suoi programmi possono non terminare; SQL non lo è.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 1.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 1.md"
    index 9179252..1bb1c56 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 1.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 1.md"
    @@ -60,8 +60,9 @@ Quando si sceglie o si progetta un linguaggio, esistono diversi **criteri di val
    [!example] N-Queens in Prolog
    Nel libro di Sterling e Shapiro si trova un codice Prolog che risolve il problema delle N regine (piazzare N regine su una scacchiera NxN senza che si attacchino) in circa 10 righe. Tuttavia, comprendere quel codice richiede una conoscenza approfondita del paradigma logico e dell'unificazione.

-> [!quote]
-> "Quel codice che risolve il problema delle N regine e lungo 10 righe, una roba di questo genere. Pero io, che sono un esperto in linguaggi di programmazione logica, ci sono cresciuto --- per capire come funzionava ci ho passato il pomeriggio. Quindi concisione non vuol dire necessariamente leggibilita."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Quel codice che risolve il problema delle N regine e lungo 10 righe, una roba di questo genere. Pero io, che sono un esperto in linguaggi di programmazione logica, ci sono cresciuto --- per capire come funzionava ci ho passato il pomeriggio. Quindi concisione non vuol dire necessariamente leggibilita."

La semplicita puo anche significare semplicita sintattica: pochi costrutti, pochi modi di fare la stessa cosa, il che facilita l'apprendimento.

@@ -89,8 +90,9 @@ L'espressivita misura quante cose un linguaggio puo esprimere e quanto facilment

[!abstract] Definizione: Ortogonalita
Un linguaggio e ortogonale quando ha poche eccezioni alle proprie regole: e molto regolare, e dove si puo usare una categoria sintattica si possono usare tutte le sue istanziazioni. Dove trovo un identificatore, puo essere un identificatore qualsiasi; dove trovo una chiamata a funzione, puo essere una chiamata a qualsiasi funzione.

-> [!quote]
-> "I linguaggi moderni sono tutti molto ortogonali, perche vengono costruiti con grammatiche che dicono come ogni costrutto puo essere realizzato. Inizialmente, nel tempo di FORTRAN, i parser si scrivevano a mano e c'erano cose che si potevano usare in certi contesti ma non in altri."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "I linguaggi moderni sono tutti molto ortogonali, perche vengono costruiti con grammatiche che dicono come ogni costrutto puo essere realizzato. Inizialmente, nel tempo di FORTRAN, i parser si scrivevano a mano e c'erano cose che si potevano usare in certi contesti ma non in altri."

Portabilita e fattori esterni

@@ -172,8 +174,9 @@ bool member(int x, list L) {
}


-> [!quote]
-> "Questi due programmi hanno esattamente la stessa struttura. Cosa cambia? I blocchi con indentazione vs parentesi graffe, il terminatore punto-e-virgola, NOT vs punto esclamativo. Ma sono dettagli sintattici. Lo stesso paradigma vuol dire che lo stesso problema ha le stesse soluzioni algoritmiche."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Questi due programmi hanno esattamente la stessa struttura. Cosa cambia? I blocchi con indentazione vs parentesi graffe, il terminatore punto-e-virgola, NOT vs punto esclamativo. Ma sono dettagli sintattici. Lo stesso paradigma vuol dire che lo stesso problema ha le stesse soluzioni algoritmiche."

**Funzionale (pseudocodice / Lisp)**:

@@ -191,8 +194,9 @@ function member(x, L):
        (t (member x (rest L)))))

-> [!quote]
-> "Le parentesi di Lisp derivano dal fatto che e un linguaggio nato in accademia, dove si sono semplificati la vita nella costruzione del parser scegliendo questa sintassi molto semplice a liste. L'intenzione era metterci una sintassi piu amichevole all'esterno. Non e mai successo."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Le parentesi di Lisp derivano dal fatto che e un linguaggio nato in accademia, dove si sono semplificati la vita nella costruzione del parser scegliendo questa sintassi molto semplice a liste. L'intenzione era metterci una sintassi piu amichevole all'esterno. Non e mai successo."

C in stile funzionale (senza assegnamenti, con l'operatore ternario):

@@ -230,13 +234,15 @@ Esempi di uso di member in Prolog:
| member(X, [1,2,3]) | Quali X compaiono nella lista? | X=1; X=2; X=3 | | |
| member(1, L) | Quali liste contengono 1? | L=[1 | _]; L=[_,1 | _]; ... (infinite) |

-> [!quote]
-> "Lo stesso codice lo posso usare come funzione booleana, come generatore, come iteratore. Con poche righe si fa una semplice AI per giocare a Tris, dove lo stesso pezzo di codice lo uso per valutare strategie vincenti, per giocare, per esplorare le mosse successive."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Lo stesso codice lo posso usare come funzione booleana, come generatore, come iteratore. Con poche righe si fa una semplice AI per giocare a Tris, dove lo stesso pezzo di codice lo uso per valutare strategie vincenti, per giocare, per esplorare le mosse successive."

Conclusione sui paradigmi

-> [!quote]
-> "Imparato a risolvere il problema in un linguaggio, so risolverlo in qualunque linguaggio dello stesso paradigma. La curva di apprendimento si accelera molto: devo soltanto andarmi a vedere il manuale."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Imparato a risolvere il problema in un linguaggio, so risolverlo in qualunque linguaggio dello stesso paradigma. La curva di apprendimento si accelera molto: devo soltanto andarmi a vedere il manuale."

Oltre al paradigma, contano anche: il sistema di tipi, la gestione delle eccezioni, il supporto alla concorrenza.

@@ -293,8 +299,9 @@ Composizione di due funzioni: prima si trova la locazione (env), poi si legge

[!warning] Proprieta fondamentale
L'ambiente (env) e immutabile all'interno di un singolo contesto di esecuzione. Finche resto dentro una funzione, l'associazione nome-locazione non cambia. Cio che cambia e il contenuto della memoria (mem), modificato dagli assegnamenti. Quando si entra in un nuovo blocco o si fa una chiamata ricorsiva, si passa a un ambiente diverso.

-> [!quote]
-> "Quando faccio una chiamata al fattoriale, n viene associato dall'ambiente direttamente a 4 e non cambia per tutta l'esecuzione di quel livello di ricorsione. Quando faccio la chiamata ricorsiva e dentro n diventa 3, quello e un altro n perche sta in un altro contesto, in un ambiente diverso."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Quando faccio una chiamata al fattoriale, n viene associato dall'ambiente direttamente a 4 e non cambia per tutta l'esecuzione di quel livello di ricorsione. Quando faccio la chiamata ricorsiva e dentro n diventa 3, quello e un altro n perche sta in un altro contesto, in un ambiente diverso."


@@ -335,8 +342,9 @@ Nell'assegnamento x = x + 1:

[!warning] Regola fondamentale: env(mem(...)) non esiste mai
env vuole un nome (un simbolo del codice sorgente). mem restituisce un valore (un dato a runtime). Scrivere env(mem(...)) e sempre un errore concettuale: i due domini sono incompatibili.

-> [!quote]
-> "Quando ci dovete ragionare, partite dall'inizio della catena dei puntatori, da quello esplicito che sta li col nome, e procedete incrementalmente."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Quando ci dovete ragionare, partite dall'inizio della catena dei puntatori, da quello esplicito che sta li col nome, e procedete incrementalmente."


@@ -351,7 +359,7 @@ Per la prossima lezione: esercitarsi con vettori (a[i]), **dereferenziazio


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I criteri di valutazione di un linguaggio (semplicita, astrazione, espressivita, ortogonalita, portabilita) possono essere in tensione tra loro: la concisione non implica leggibilita.
  • Lo zucchero sintattico non aggiunge potere espressivo: e trattabile con un preprocessore.
  • Il paradigma determina radicalmente il modo di pensare al problema; all'interno dello stesso paradigma, le soluzioni sono strutturalmente isomorfe tra linguaggi diversi.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 3.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 3.md"
    index 6b6a4d1..dbf454a 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 3.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 3.md"
    @@ -196,8 +196,9 @@ Il puntatore all'env non locale punta sempre al record immediatamente precedente
    | Puntatore env | Salta record intermedi (verso il blocco contenitore) | Punta sempre al record precedente |
    | Usato da | Quasi tutti i linguaggi moderni | Primo LISP (poi sostituito da Scheme) |

-> [!quote]
-> "Scheme è praticamente uguale a LISP — stessa sintassi con tante parentesi — ma usa lo scoping statico proprio per eliminare l'incubo di predire il comportamento dei programmi con scope dinamico."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Scheme è praticamente uguale a LISP — stessa sintassi con tante parentesi — ma usa lo scoping statico proprio per eliminare l'incubo di predire il comportamento dei programmi con scope dinamico."


@@ -262,7 +263,7 @@ Il passaggio di un parametro può avvenire:


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I blocchi introducono namespace separati e permettono l'ereditarietà unidirezionale (interno vede esterno, non viceversa). Il mascheramento nasconde temporaneamente la variabile esterna con lo stesso nome.
  • Lo scope statico determina l'ambiente non locale guardando il testo del programma. È predittibile, debuggabile, usato in quasi tutti i linguaggi moderni.
  • Lo scope dinamico determina l'ambiente non locale dall'ordine delle chiamate a runtime. È impredicibile (indecidibile in generale) e storicamente abbandonato (LISP → Scheme).
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 4.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 4.md"
    index 7e170bd..93b83ef 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 4.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 4.md"
    @@ -35,10 +35,10 @@ In un linguaggio Pascal-like, la dichiarazione di un parametro formale determina
    | in-out per copia | in out | il parametro si legge e si scrive; valore copiato dentro e fuori | copia-in / copia-out |
    | in-out per riferimento | var (Pascal, per in-out) | il parametro si legge e si scrive; è un alias della variabile del chiamante | puntatore |

-> [!important] Errori a compile-time per modalità in
+> [!info] Errori a compile-time per modalità in

Un parametro dichiarato in non deve mai comparire a sinistra di un assegnamento. Il compilatore lo rileva staticamente. Se trovate questa violazione, il programma non compila e non ha senso costruire lo stack di attivazione.

-> [!important] Errori per modalità out
+> [!info] Errori per modalità out

Un parametro dichiarato out non deve essere letto prima di essere scritto. Poiché il suo valore iniziale è indefinito ("spazzatura"), leggerne il valore prima dell'inizializzazione è un errore.


@@ -277,7 +277,7 @@ Le funzioni restituiscono un valore singolo. In linguaggi "vecchi" si usa una ps


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Le modalità di passaggio parametri (in, out, in-out, per copia o per riferimento) determinano l'ambiente del parametro e quando le modifiche diventano visibili all'esterno.
  • Il passaggio per riferimento crea aliasing, che può produrre comportamenti controintuitivi.
  • Le macro C sono sostituzioni testuali senza ambiente protetto: possono causare conflitti di nomi, doppia valutazione di argomenti con side effect, e comportamenti imprevedibili.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 5.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 5.md"
    index a9e2b06..2ecb38d 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 5.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 5.md"
    @@ -35,10 +35,10 @@ In un linguaggio Pascal-like, la dichiarazione di un parametro formale determina
    | in-out per copia | in out | il parametro si legge e si scrive; valore copiato dentro e fuori | copia-in / copia-out |
    | in-out per riferimento | var (Pascal, per in-out) | il parametro si legge e si scrive; è un alias della variabile del chiamante | puntatore |

-> [!important] Errori a compile-time per modalità in
+> [!info] Errori a compile-time per modalità in

Un parametro dichiarato in non deve mai comparire a sinistra di un assegnamento. Il compilatore lo rileva staticamente. Se trovate questa violazione, il programma non compila e non ha senso costruire lo stack di attivazione.

-> [!important] Errori per modalità out
+> [!info] Errori per modalità out

Un parametro dichiarato out non deve essere letto prima di essere scritto. Poiché il suo valore iniziale è indefinito ("spazzatura"), leggerne il valore prima dell'inizializzazione è un errore.


@@ -277,7 +277,7 @@ Le funzioni restituiscono un valore singolo. In linguaggi "vecchi" si usa una ps


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Le modalità di passaggio parametri (in, out, in-out, per copia o per riferimento) determinano l'ambiente del parametro e quando le modifiche diventano visibili all'esterno.
  • Il passaggio per riferimento crea aliasing, che può produrre comportamenti controintuitivi.
  • Le macro C sono sostituzioni testuali senza ambiente protetto: possono causare conflitti di nomi, doppia valutazione di argomenti con side effect, e comportamenti imprevedibili.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 6.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 6.md"
    index b6f1dca..d817209 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 6.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 6.md"
    @@ -117,7 +117,7 @@ P2:
    B alias→ b (di Esercizio2)

-> [!important] Notazione per il passaggio per riferimento
+> [!info] Notazione per il passaggio per riferimento
> Non riscrivere il valore del parametro nel record di P2. Annotate esplicitamente l'alias, ad es. `A ≡ c (Esercizio2)`. Se li duplicate con il valore, dimenticate di aggiornare entrambe le copie quando il valore cambia.

### Esecuzione di P2
@@ -222,7 +222,7 @@ P1:

---

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione
> - Modalità `in` e `out` devono essere controllate per errori prima di costruire lo stack.
> - Il passaggio per riferimento crea alias: modifiche a un parametro si riflettono immediatamente sulla variabile originale, incluse eventuali successive letture dello stesso valore tramite altri nomi.
> - Il passaggio per copia isola le modifiche fino all'uscita dalla procedura (copia-out).
diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 7.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 7.md"
index 9556062..2d29808 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 7.md"	
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Linguaggi di programmazione/Lezione 7.md"	
@@ -28,7 +28,7 @@ tags: [LP, Java, JVM, bytecode, package, sintassi, garbage-collector, BNF]

## 1. Scelte di design per la sicurezza

-> [!important] Perché Java è progettato per la sicurezza del codice mobile
+> [!info] Perché Java è progettato per la sicurezza del codice mobile
> Java nasce con il requisito di poter eseguire codice proveniente dalla rete in modo sicuro. Le scelte di design riflettono questo obiettivo.

Le principali scelte di sicurezza del linguaggio sono:
@@ -45,8 +45,9 @@ Le principali scelte di sicurezza del linguaggio sono:

**Bytecode verifier**: prima di eseguire il bytecode, la JVM lo verifica. Questa verifica controlla che non vengano accedute zone di memoria non autorizzate, che lo stack non vada in overflow/underflow, e che non ci siano conversioni di tipo illegali. Anche un bytecode manipolato a mano (che aggira il compilatore) viene rilevato.

-> [!quote]
-> "Se volete un sistema sicuro con codice mobile, non avete tante scelte."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Se volete un sistema sicuro con codice mobile, non avete tante scelte."

---

@@ -71,7 +72,7 @@ flowchart LR
> [!tip] Vantaggio dell'implementazione mista
> Il costo della compilazione e dei controlli di tipo viene pagato una volta sola. L'esecuzione del bytecode è più fluida perché il bytecode è compatto e facile da interpretare. Il JIT ottimizza i pezzi critici per le prestazioni.

-> [!important] Portabilità
+> [!info] Portabilità
> Il bytecode è indipendente dalla piattaforma. Si compila una volta e si esegue su qualsiasi JVM, che può girare su qualsiasi sistema operativo e hardware. La JVM funge da mediatore tra il bytecode e il sistema sottostante.

---
@@ -198,7 +199,7 @@ I modificatori di visibilità sono (dal più restrittivo al meno): `private`, (d

---

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione
> - Java è progettato per eseguire codice mobile in modo sicuro: controllo indici, tipizzazione forte, no aritmetica puntatori, GC automatico, bytecode verifier.
> - La JVM implementa una strategia mista: `javac` compila a bytecode portabile, `java` (JVM) interpreta con JIT per i cicli critici.
> - I package organizzano il codice in namespace gerarchici corrispondenti a directory nel filesystem; gli import sono solo abbreviazioni.
diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 0.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 0.md"
index f1167d4..b66232e 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 0.md"	
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 0.md"	
@@ -21,14 +21,14 @@ tags:

## 📝 Esame

-> [!important] Modalità d'esame
+> [!info] Modalità d'esame
> - **Prova scritta** + **colloquio orale**
> - 6 CFU, nessun progetto
---

## Perché la Probabilità per l'Informatica?

-> [!quote] Idea chiave del corso
+> [!tip] Idea chiave del corso
> Telecomunicazioni e informatica trattano entrambe lo stesso oggetto: l'**informazione**. Le telecomunicazioni la trasferiscono *nello spazio* (da un luogo a un altro); l'informatica la trasferisce *nel tempo* (memorizzazione, compressione, correzione degli errori).
>
> Intrinseco nel concetto di informazione c'è l'**incertezza**: se non c'è incertezza su ciò che viene trasmesso, non c'è informazione da trasmettere.
@@ -65,7 +65,7 @@ graph TD
    style G fill:#f0a500,color:#fff

-> [!note] Cherry picking
+> [!info] Cherry picking

Essendo un corso da 6 CFU (vs 9 CFU del corso parallelo al 3° anno), alcuni argomenti come la compressione dati (Huffman, codifica aritmetica) e le passeggiate casuali su grafi non saranno trattati in dettaglio. Priorità: meno argomenti, ma compresi bene.

Statistica inferenziale vs descrittiva

@@ -84,7 +84,7 @@ graph TD

Il Discreto vs il Continuo

-> [!quote] Aforisma del prof
+> [!tip] Aforisma del prof

"Il discreto riempie la testa di idee; il continuo riempie la lavagna di formule. Se uno capisce bene le idee, le formule sono una conseguenza."


@@ -106,7 +106,7 @@ Può essere:

  • Numerabilmente infinito → es. numero di pacchetti in coda: $\Omega = \mathbb{N}_0$
  • Non numerabile (continuo) → es. tensione misurata ai capi di una resistenza (rumore termico): $\Omega = \mathbb{R}$

-> [!note] Discreto vs Continuo nella pratica
+> [!info] Discreto vs Continuo nella pratica

In realtà qualunque misura fisica è razionale (strumenti con cifre significative finite), ma quando i valori sono così tanti, si modella come continuo e poi si tronca. Il tempo viene solitamente schematizzato come continuo.

Evento

@@ -235,7 +235,7 @@ Le permutazioni di $n$ elementi sono tutte le $n$-uple ordinate senza ripetizion

Due $k$-uple che differiscono solo per l'ordine degli elementi sono considerate la stessa combinazione.

-> [!note] Ragionamento chiave
+> [!info] Ragionamento chiave

Tra tutte le $k$-uple ordinate senza ripetizione, ogni gruppo di $k!$ di esse (tutte le permutazioni degli stessi elementi) collassa in un'unica $k$-upla non ordinata. Quindi:
$$C(n, k) = \binom{n}{k} = \frac{n!}{k!,(n-k)!}$$

diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 1.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 1.md"
index c115f41..0a3190b 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 1.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 1.md"
@@ -71,7 +71,7 @@ Questo coefficiente è detto anche coefficiente binomiale.

[!example] Mani di poker
Mazzo da 52 carte, mano di 5 carte: $\binom{52}{5} = \frac{52!}{5! \cdot 47!} = 2.598.960$.

-> [!important] Equivalenza: sequenze binarie con $k$ uni
+> [!info] Equivalenza: sequenze binarie con $k$ uni

Il numero di sequenze binarie di lunghezza $n$ con esattamente $k$ uni (e $n-k$ zeri) è:
$$\binom{n}{k}$$
Questa interpretazione combinatoria del coefficiente binomiale è fondamentale per calcolare probabilità in esperimenti come "almeno $k$ successi in $n$ prove".
@@ -117,7 +117,7 @@ $$P(\text{colore qualsiasi}) = 4 \cdot \frac{56}{201.376} \approx 0{,}44%$$


Caso m-ario: Sequenze Binarie con Esattamente $k$ Uni

-> [!quote] Domanda:
+> [!tip] Domanda:
Data una sequenza di $n$ bit, quante sequenze hanno esattamente $k$ uni?

Ragionamento senza formula:
@@ -155,8 +155,9 @@ Questa definizione è matematicamente "zoppicante" per due motivi:

Nonostante ciò, l'approccio frequentistico è preferito da questo docente per una ragione pratica: rende le proprietà della probabilità intuitive, derivandole direttamente dalle proprietà degli insiemi, senza bisogno di assiomi astratti da dimostrare separatamente.

-> [!quote]
-> "Io do le carte napoletane, mi ha giocato a scopone, ho dieci carri per uno, poi la probabilità che gli do i sette carri... Con l'approccio teorico la gente cominciava a ragionare in percentuali assurde. Con quello frequentistico si ragiona automaticamente nel modo giusto."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Io do le carte napoletane, mi ha giocato a scopone, ho dieci carri per uno, poi la probabilità che gli do i sette carri... Con l'approccio teorico la gente cominciava a ragionare in percentuali assurde. Con quello frequentistico si ragiona automaticamente nel modo giusto."

La probabilità come misura

@@ -307,7 +308,7 @@ Il risultato è circa 70% — molto più alto di quanto l'intuizione suggerisce.


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Il coefficiente binomiale $\binom{n}{k}$ conta le sequenze binarie di lunghezza $n$ con esattamente $k$ uni: si deriva solo dal ragionamento sulle permutazioni degli indistinguibili.
  • La probabilità frequentistica $P(A) = \lim_{n \to \infty} N_A/n$ è intuitiva e permette di derivare tutte le proprietà dalle operazioni sugli insiemi.
  • Quando gli eventi elementari non sono equiprobabili, non si può usare il rapporto di cardinalità.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 2.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 2.md"
    index e56906c..199cfd5 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 2.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 2.md"
    @@ -98,8 +98,9 @@ Usando la definizione di probabilità condizionata, $P(A \cap E_i) = P(A \mid E_
    $$P(A) = \sum_{i=1}^{m} P(A \mid E_i) \cdot P(E_i)$$
    La probabilità di un evento $A$ si puo scomporre condizionando rispetto a una partizione dello spazio dei campioni.

-> [!quote]
-> "Questa legge, ragazzi, e importantissima. Si usa in tutti i calcoli probabilistici, in quasi tutti, perche a volte devo calcolare la probabilità di un evento ed e difficile, pero se mi metto in certe condizioni la devo scomporre in calcoli piu semplici. La useremo, la vedremo, ve la farò vedere negli esercizi."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Questa legge, ragazzi, e importantissima. Si usa in tutti i calcoli probabilistici, in quasi tutti, perche a volte devo calcolare la probabilità di un evento ed e difficile, pero se mi metto in certe condizioni la devo scomporre in calcoli piu semplici. La useremo, la vedremo, ve la farò vedere negli esercizi."


@@ -112,8 +113,9 @@ Tuttavia questa impostazione presenta due problemi fondamentali:

  1. Convergenza non specificata: non si e detto in che senso la frequenza di successo converge a un valore stabile; le prove devono essere indipendenti, ma l'indipendenza e essa stessa un concetto probabilistico (circolarità).
  2. Generalità non garantita: non c'e a priori nessuna garanzia che le proprietà trovate sotto certe ipotesi valgano in generale.

-> [!quote]
-> "Io vi ho promesso che vi avrei definito in modo piu rigoroso la probabilità. Tutto questo zoppica dal punto di vista non solo matematico, ma concettuale."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Io vi ho promesso che vi avrei definito in modo piu rigoroso la probabilità. Tutto questo zoppica dal punto di vista non solo matematico, ma concettuale."


@@ -167,8 +169,9 @@ Analogamente, $A \setminus B = A \cap B^c$: poiche $B^c \in \mathcal{E}$ (chiusu

L'insieme delle parti $2^\Omega$ e anch'esso un'algebra, ma e molto piu grande del necessario. Piu piccola di questi quattro elementi non e possibile.

-> [!quote]
-> "Non vi fate mai spaventare dai paroloni della matematica."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Non vi fate mai spaventare dai paroloni della matematica."


@@ -215,8 +218,9 @@ La terna $(\Omega, \mathcal{E}, P)$ prende il nome di spazio di probabilità

La $\sigma$-algebra garantisce che tutte le operazioni insiemistiche (unione, intersezione, complementazione, differenza) restino nel dominio di definizione della funzione $P$. Senza questa struttura, non si potrebbe essere certi di poter calcolare $P$ su combinazioni arbitrarie di eventi.
Come dice il professore: "i matematici pensano: io resto nel dominio di definizione dell'algebra."

-> [!quote]
-> "Vedete che noi abbiamo fatto tutto questo ambaradan. Dice, ma e tutta questa cosa complicata? Tu metti le tue prove, fatti la frequenza di successo... Tutto quello che abbiamo ricavato, qua non c'e niente. Io ti faccio vedere che tutto quello che tu hai ricavato prima, usando quella definizione, se volete, un po' farlocca di probabilità, io te lo ricavo come unica conseguenza degli assiomi di Kolmogorov."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Vedete che noi abbiamo fatto tutto questo ambaradan. Dice, ma e tutta questa cosa complicata? Tu metti le tue prove, fatti la frequenza di successo... Tutto quello che abbiamo ricavato, qua non c'e niente. Io ti faccio vedere che tutto quello che tu hai ricavato prima, usando quella definizione, se volete, un po' farlocca di probabilità, io te lo ricavo come unica conseguenza degli assiomi di Kolmogorov."


@@ -277,8 +281,9 @@ $$P(\emptyset) = P(\Omega^c) = 1 - P(\Omega) = 1 - 1 = 0$$

[!warning] Terminologia
L'insieme vuoto $\emptyset$ si chiama evento impossibile; lo spazio dei campioni $\Omega$ si chiama evento certo.

-> [!quote]
-> "Riprendo il giro per dirvi quanto e pesante questo. Abbiamo trovato le cose prima, le abbiamo trovate in modo facile. Ora dimostrarle diventa un giochino, perche gia sappiamo il risultato che dobbiamo tirare."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Riprendo il giro per dirvi quanto e pesante questo. Abbiamo trovato le cose prima, le abbiamo trovate in modo facile. Ora dimostrarle diventa un giochino, perche gia sappiamo il risultato che dobbiamo tirare."


@@ -288,8 +293,9 @@ $$P(\emptyset) = P(\Omega^c) = 1 - P(\Omega) = 1 - 1 = 0$$

Due eventi $A, B \in \mathcal{E}$ si dicono statisticamente indipendenti se:
$$P(A \cap B) = P(A) \cdot P(B)$$

-> [!quote]
-> "La nozione di indipendenza e fondamentale e moltissima statistica inferenziale si fonda su ipotesi di indipendenza, perche senza indipendenza una serie di convergenze [non valgono]. Voi avete dei grandi database, giocate quei file Excel per ricavarvi una serie di parametri globali. E ci sono delle ipotesi alla base: ipotesi di ergodicità, che a loro volta indicano ipotesi di indipendenza, per lo meno tra campioni sufficientemente lontani. Se no, la statistica descrittiva vale solo per quel campione di dati. Non e generalizzabile."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La nozione di indipendenza e fondamentale e moltissima statistica inferenziale si fonda su ipotesi di indipendenza, perche senza indipendenza una serie di convergenze [non valgono]. Voi avete dei grandi database, giocate quei file Excel per ricavarvi una serie di parametri globali. E ci sono delle ipotesi alla base: ipotesi di ergodicità, che a loro volta indicano ipotesi di indipendenza, per lo meno tra campioni sufficientemente lontani. Se no, la statistica descrittiva vale solo per quel campione di dati. Non e generalizzabile."

Indipendenza dei complementari

@@ -379,8 +385,9 @@ Questi $n$ eventi sono disgiunti (nel primo c'e $A_1$, nel secondo c'e $A_2$

$$\boxed{P(\text{esattamente uno}) = \sum_{i=1}^{n} p_i \prod_{\substack{j=1 \ j \neq i}}^{n} (1 - p_j)}$$

-> [!quote]
-> "E solo logica, ragazzi, pero vi dico anche che questa logica non la dovete dimenticare, perche poi quando andiamo sulle variabili aleatorie e un po' piu numerica la cosa, pero dovete sempre ricordarvi questa logica. Dovete formulare opportunamente le proposizioni."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "E solo logica, ragazzi, pero vi dico anche che questa logica non la dovete dimenticare, perche poi quando andiamo sulle variabili aleatorie e un po' piu numerica la cosa, pero dovete sempre ricordarvi questa logica. Dovete formulare opportunamente le proposizioni."


@@ -533,8 +540,9 @@ hanno tutti un esito binario. Codificando opportunamente (testa $\to 0$, cro

Il professore accenna al fatto che, per essere rigorosi, una variabile aleatoria deve essere un'applicazione misurabile: l'anti-immagine di ogni evento concernente $X$ deve essere un elemento della $\sigma$-algebra. Questa condizione garantisce che si possa calcolare la probabilità che $X$ assuma certi valori. Tuttavia, per il livello del corso, e sufficiente la definizione semplificata.

-> [!quote]
-> "Queste cose le ho studiate perche mi sono servite per la mia ricerca, e manco sono sicuro che mi siano servite veramente perche il mio advisor di dottorato era sadico e mi metteva in mano certi libri. Pero se uno deve fare ricerca in questo campo, e bene che certe cose le faccia."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Queste cose le ho studiate perche mi sono servite per la mia ricerca, e manco sono sicuro che mi siano servite veramente perche il mio advisor di dottorato era sadico e mi metteva in mano certi libri. Pero se uno deve fare ricerca in questo campo, e bene che certe cose le faccia."

Evento elementare nello spazio della variabile aleatoria

@@ -594,15 +602,16 @@ dove $n_0$ e il numero di volte in cui esce $0$ e $n_1 = n - n_0$ e il numero di

$$\bar{X}_n \xrightarrow{n \to \infty} 0 \cdot P(X=0) + 1 \cdot P(X=1) = \frac{1}{2} \stackrel{\text{def}}{=} E[X]$$

-> [!quote]
-> "Voi avete automaticamente detto, guarda, se io faccio $n$ prove, la meta delle volte mi viene $0$, la meta delle volte mi viene $1$. Voi ragionate inevitabilmente sulla frequenza di successo."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Voi avete automaticamente detto, guarda, se io faccio $n$ prove, la meta delle volte mi viene $0$, la meta delle volte mi viene $1$. Voi ragionate inevitabilmente sulla frequenza di successo."

[!warning] Attenzione
Il risultato $E[X] = \frac{1}{2}$ vale perche la variabile e equiprobabile. Il fatto che la media aritmetica converga al valore atteso e un risultato profondo che sarà formalizzato nelle lezioni successive.


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Le proprietà della probabilità derivate dalla frequenza di successo sono confermate dalla teoria assiomatica, dove diventano teoremi dimostrabili dai soli assiomi di Kolmogorov.
  • Un'algebra e una collezione di sottoinsiemi chiusa rispetto a unione e complementazione; la chiusura rispetto a intersezione e differenza segue dalle leggi di De Morgan.
  • Una $\sigma$-algebra estende la chiusura a unioni numerabili, ed e necessaria quando $\Omega$ e infinito numerabile.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 3.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 3.md"
    index 56a1f1f..6a00d92 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 3.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 3.md"
    @@ -68,8 +68,9 @@ Questo limite è il valore atteso della variabile aleatoria.
    [!warning] Media statistica vs media aritmetica
    La media statistica non coincide in generale con la media aritmetica dei valori dell'alfabeto. La media aritmetica pesa tutti i valori allo stesso modo ($1/M$ ciascuno); la media statistica è una media pesata con pesi $P_X(a_k)$. Solo quando la distribuzione è uniforme (tutti i valori equiprobabili) le due medie coincidono.

-> [!quote]
-> "La media statistica è il baricentro della distribuzione di probabilità: se mettete dei pesi sulle posizioni dell'asse reale, il baricentro cade dove c'è più massa di probabilità. È il numero verso cui converge la media campionaria quando fate tante prove."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La media statistica è il baricentro della distribuzione di probabilità: se mettete dei pesi sulle posizioni dell'asse reale, il baricentro cade dove c'è più massa di probabilità. È il numero verso cui converge la media campionaria quando fate tante prove."


@@ -200,8 +201,9 @@ Quando l'alfabeto è $\mathcal{X} = {1, 2, \ldots, M}$ (i primi $M$ interi pos

$$\sum_{k=1}^{M} k = \frac{M(M+1)}{2}$$

-> [!quote]
-> "La scoprì Gauss a sei anni, quando il maestro gli chiese di sommare i numeri da 1 a 100 pensando di tenerlo occupato per un'ora. Gauss scrisse l'ultimo numero accanto al primo, il penultimo accanto al secondo... e si accorse che ogni coppia faceva 101. Cinquanta coppie: $50 \times 101 = 5050$. Il maestro rimase a bocca aperta."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La scoprì Gauss a sei anni, quando il maestro gli chiese di sommare i numeri da 1 a 100 pensando di tenerlo occupato per un'ora. Gauss scrisse l'ultimo numero accanto al primo, il penultimo accanto al secondo... e si accorse che ogni coppia faceva 101. Cinquanta coppie: $50 \times 101 = 5050$. Il maestro rimase a bocca aperta."

Dimostrazione. Sia $S = 1 + 2 + \cdots + M$. Scriviamo la somma due volte, una in ordine crescente e una in ordine decrescente:

@@ -273,8 +275,9 @@ $$\boxed{E[X] = \lambda}$$

La media della Poisson è esattamente il parametro $\lambda$: un risultato elegante che conferma l'interpretazione di $\lambda$ come tasso medio.

-> [!quote]
-> "La Poisson è la distribuzione delle cose rare: eventi che singolarmente sono poco probabili, ma che vengono osservati su un numero enorme di occasioni. Quante macchine passano al casello in un minuto? Quanti pacchetti arrivano al router in un millisecondo? Quante persone entrano all'ufficio postale in un'ora? Tutte Poisson."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La Poisson è la distribuzione delle cose rare: eventi che singolarmente sono poco probabili, ma che vengono osservati su un numero enorme di occasioni. Quante macchine passano al casello in un minuto? Quanti pacchetti arrivano al router in un millisecondo? Quante persone entrano all'ufficio postale in un'ora? Tutte Poisson."

Applicazioni della distribuzione di Poisson

@@ -418,8 +421,9 @@ $$P(T \mid S) + P(O \mid S) = \frac{3}{5} + \frac{2}{5} = 1 \quad \checkmark$$

[!warning] L'aggiornamento bayesiano: a priori vs a posteriori
Prima del lancio, la probabilità che il dado fosse truccato era $P(T) = 1/3 \approx 33%$. Dopo aver osservato l'uscita del $6$, la probabilità è salita a $P(T \mid S) = 3/5 = 60%$. L'osservazione ha aggiornato la nostra credenza: poiché il $6$ è molto più probabile con il dado truccato ($1/2$ vs $1/6$), la sua uscita è un'evidenza a favore dell'ipotesi "dado truccato".

-> [!quote]
-> "Bayes è questo: prima di vedere i dati avete un'opinione — la probabilità a priori. Poi vedete i dati e aggiornate l'opinione — ottenete la probabilità a posteriori. Se i dati sono coerenti con la vostra ipotesi, la probabilità sale; se non lo sono, scende. Questo è il cuore dell'inferenza statistica."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Bayes è questo: prima di vedere i dati avete un'opinione — la probabilità a priori. Poi vedete i dati e aggiornate l'opinione — ottenete la probabilità a posteriori. Se i dati sono coerenti con la vostra ipotesi, la probabilità sale; se non lo sono, scende. Questo è il cuore dell'inferenza statistica."


@@ -475,12 +479,13 @@ Per questo motivo, nella pratica, accanto alla media si calcolano sempre altri i

  • La mediana: il valore che divide la distribuzione a metà (il 50% dei dati sta sopra, il 50% sotto). È robusta rispetto agli outlier.
  • La varianza (che vedremo nelle prossime lezioni): misura la dispersione dei dati attorno alla media. Se la varianza è alta, la media da sola è poco informativa.

-> [!quote]
-> "Se uno mette la testa nel forno e i piedi nel congelatore, in media sta bene. Ecco perché la media da sola non basta: bisogna sempre guardare anche quanto i dati si disperdono attorno ad essa."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Se uno mette la testa nel forno e i piedi nel congelatore, in media sta bene. Ecco perché la media da sola non basta: bisogna sempre guardare anche quanto i dati si disperdono attorno ad essa."


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Il valore atteso $E[X] = \sum_k a_k P_X(a_k)$ è il baricentro della distribuzione e il limite della media campionaria per la legge dei grandi numeri.
  • Bernoulli $\text{Ber}(p)$: l'esperimento più semplice (successo/fallimento), con media $E[X] = p$.
  • Binomiale $\text{Bin}(n,p)$: somma di $n$ Bernoulli indipendenti, PMF $= \binom{n}{k}p^k(1-p)^{n-k}$, media $= np$.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 4.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 4.md"
    index e083d9e..1b0c3a5 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 4.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 4.md"
    @@ -135,7 +135,7 @@ Il valore efficace (root mean square) è:

$$x_{\text{rms}} = \sqrt{E[X^2]}$$

-> [!note] Terminologia RMS
+> [!info] Terminologia RMS

Il termine inglese "root mean square" indica che si prende la radice del valor medio del quadrato. La notazione $x_{\text{rms}}^2 = E[X^2]$ (il quadrato del valore efficace = valore quadratico medio) può essere fonte di confusione.

[!example] Corrente alternata e valore efficace
diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 5.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 5.md"
index 4eee44f..95be62e 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 5.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 5.md"
@@ -119,7 +119,7 @@ La covarianza misura il grado di co-variazione tra due variabili:

  • Negativa: le deviazioni tendono a essere di segno opposto (se $X$ è sopra la media, $Y$ tende ad essere sotto).
  • Zero: non esiste una tendenza lineare di co-variazione.

-> [!important] Indipendenza implica incorrelazione
+> [!info] Indipendenza implica incorrelazione

Se $X$ e $Y$ sono indipendenti, allora $\text{Cov}(X, Y) = 0$:
$$E[XY] = E[X]E[Y] \quad \Rightarrow \quad \text{Cov}(X,Y) = 0$$
Però l'implicazione non vale al contrario: variabili non correlate (covarianza nulla) non sono necessariamente indipendenti.
@@ -204,15 +204,17 @@ graph TD

Le frecce indicano implicazioni. Convergenza con prob. 1 e convergenza in media quadratica sono entrambe forti, ma non si implicano a vicenda. Entrambe implicano la convergenza in probabilità (la più debole).

-> [!quote]
-> "La probabilità è definita come il limite della frequenza di successo. Questo ha senso matematico rigoroso: la frequenza converge alla probabilità in media quadratica e in probabilità. La nostra definizione era corretta fin dall'inizio."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "La probabilità è definita come il limite della frequenza di successo. Questo ha senso matematico rigoroso: la frequenza converge alla probabilità in media quadratica e in probabilità. La nostra definizione era corretta fin dall'inizio."

Nota sul problema circolare

La definizione frequentistica richiede che le prove siano indipendenti — ma l'indipendenza è essa stessa un concetto probabilistico. L'approccio formale (assiomi di Kolmogorov) risolve questo problema: si definisce prima la probabilità assiomaticamente, poi si dimostra che la frequenza converge a essa.

-> [!quote]
-> "Il professore Conte me lo contesta sempre: per definire la probabilità usi la frequenza, ma per dire che è una frequenza hai bisogno dell'indipendenza, che è un concetto probabilistico. È il cane che si morde la coda. In realtà non serve strettamente l'indipendenza: basta un'asintotica indipendenza."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Il professore Conte me lo contesta sempre: per definire la probabilità usi la frequenza, ma per dire che è una frequenza hai bisogno dell'indipendenza, che è un concetto probabilistico. È il cane che si morde la coda. In realtà non serve strettamente l'indipendenza: basta un'asintotica indipendenza."


@@ -259,12 +261,13 @@ Per la roulette ($b = 36$, $a = 18/37$): $g(k) = 34 \cdot 2^{k-1} + 1$.

[!warning] Paradosso della martingala
Se il limite di puntata $S \to \infty$ (patrimonio infinito, nessun limite), la martingala garantisce di vincere con probabilità 1 — ed è per questo che i casinò impongono un limite massimo di puntata. Con un qualunque limite finito $S$, il guadagno medio è negativo per il giocatore (il banco ha sempre un vantaggio statistico).

-> [!quote]
-> "Il guadagno medio per $S \to \infty$ diverge. Ma attenzione: fare il limite di $S$ al denominatore non è lo stesso che calcolare il guadagno con $S$ infinito. La convergenza è in probabilità, non puntuale. Questo è un esempio di convergenza in probabilità che non implica nulla sul limite dei valori attesi."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Il guadagno medio per $S \to \infty$ diverge. Ma attenzione: fare il limite di $S$ al denominatore non è lo stesso che calcolare il guadagno con $S$ infinito. La convergenza è in probabilità, non puntuale. Questo è un esempio di convergenza in probabilità che non implica nulla sul limite dei valori attesi."


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • La varianza misura l'aleatorietà: $\sigma_X^2$ piccolo significa variabile concentrata intorno alla media. La coppia $(\mu_X, \sigma_X)$ caratterizza globalmente $X$.
  • La disuguaglianza di Chebyshev quantifica quanto raramente una variabile si discosta dalla media: $P(|X-\mu_X| \geq k\sigma_X) \leq 1/k^2$.
  • Media è lineare: $E[aX+b] = aE[X]+b$. Varianza è invariante per traslazione e covariante per scala: $\text{Var}(aX+b) = a^2\text{Var}(X)$.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 6.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 6.md"
    index 7356456..d30e9ef 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 6.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 6.md"
    @@ -164,7 +164,7 @@ $$p_X(x) = \sum_{y \in \mathcal{Y}} p_{XY}(x, y), \qquad p_Y(y) = \sum_{x \in \m

Dimostrazione: L'evento ${X = x}$ è l'unione disgiunta degli eventi ${X = x, Y = y}$ al variare di $y$. Per l'assioma di additività di Kolmogorov: $P(X=x) = \sum_y P(X=x, Y=y)$.

-> [!important] Asimmetria congiunta ↔ marginali
+> [!info] Asimmetria congiunta ↔ marginali

  • Congiunta implica marginali: data la PMF congiunta, le marginali sono univocamente determinate (per somma).
  • Marginali non implicano congiunta: date le due PMF marginali, esistono in generale molte congiunte compatibili con esse.

@@ -227,7 +227,7 @@ Il caso di due variabili si generalizza naturalmente.

Marginalizzazione gerarchica: Una PMF di ordine $n$ implica tutte le PMF di ordine inferiore. Sommando su tutti i valori di $X_k$, si ottiene la PMF congiunta delle restanti $n-1$ variabili.

-> [!important] La gerarchia va solo verso il basso
+> [!info] La gerarchia va solo verso il basso

La conoscenza di ordine $n$ implica la conoscenza di ordine $n-1$, $n-2$, ..., fino a 1. Non vale il contrario: le marginali di ordine inferiore non determinano quella di ordine superiore (salvo indipendenza).

Esempio: terne di bit

@@ -270,7 +270,7 @@ Cioè, la PMF marginale di $X$ è la media rispetto a $Y$ della PMF condizio


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Una coppia di variabili aleatorie è caratterizzata dalla PMF congiunta: una tabella di $|\mathcal{X}| \times |\mathcal{Y}|$ numeri non negativi che sommano a 1.
  • Dalla congiunta si ricavano le marginali per somma (marginalizzazione). Il viceversa non vale in generale.
  • Due variabili sono indipendenti se e solo se la congiunta si fattorizza nel prodotto delle marginali.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 7.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 7.md"
    index 66d88b2..d5112f1 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 7.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 7.md"
    @@ -130,7 +130,7 @@ $$H(X) = p \log_2 \frac{1}{p} + (1-p) \log_2 \frac{1}{1-p}$$

Proprietà: $0 \leq H(X) \leq 1$, con $H(X) = 1$ se e solo se $p = 1/2$.

-> [!important] Implicazione per i file compressi
+> [!info] Implicazione per i file compressi

Una variabile Bernoulliana porta al più 1 bit di informazione, e esattamente 1 bit solo quando $p = 1/2$ (i due valori sono equiprobabili). Un file compresso idealmente è una sequenza binaria in cui 0 e 1 sono equiprobabili e statisticamente indipendenti: questa è la condizione di massima complessità informazionale.

Entropia di una variabile quaternaria uniforme

@@ -141,8 +141,9 @@ $$H(X) = 4 \cdot \frac{1}{4} \log_2 4 = \log_2 4 = 2 \text{ bit}$$

Una variabile quaternaria equiprobabile porta 2 bit di informazione, coerentemente con il fatto che 4 valori si codificano con 2 bit binari.

-> [!quote]
-> "Una variabile bistabile trasporta una quantità di informazione che è al più un bit."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Una variabile bistabile trasporta una quantità di informazione che è al più un bit."


@@ -296,7 +297,7 @@ $$P(6,5) = \frac{1}{2} \cdot \frac{1}{36} + \frac{1}{2} \cdot \frac{1}{20} = \fr

Confronto: $P(6,5)$ vs. $P(5,6)$

-> [!important] Asimmetria della coppia $(6,5)$ vs $(5,6)$
+> [!info] Asimmetria della coppia $(6,5)$ vs $(5,6)$

Per il calcolo di $P(X_1=5, X_2=6)$: dato $X_1=5$ (dispari), si cambia dado. Quindi, se il primo dado era onesto, il secondo è truccato (e viceversa). Questo cambia radicalmente le probabilità:

  • Dado onesto primo: $P(X_1=5|\text{onesto})=1/6$. Dato $X_1=5$ (dispari), si usa il dado truccato: $P(X_2=6|\text{truccato})=1/2$. Contributo: $1/6 \cdot 1/2 = 1/12$.
    @@ -308,7 +309,7 @@ $$P(6,5) = \frac{1}{2} \cdot \frac{1}{36} + \frac{1}{2} \cdot \frac{1}{20} = \fr

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Nel canale binario simmetrico la probabilità di errore è $\varepsilon$ indipendentemente dall'input; il caso peggiore è $\varepsilon=1/2$ (l'uscita non dà informazioni sull'ingresso).
  • L'entropia $H(X) = E[\log_2(1/p_X(X))]$ misura la quantità media di informazione in bit; per una variabile Bernoulliana vale al più 1 bit, raggiunto con $p=1/2$.
  • La PMF marginale è la media della PMF condizionale rispetto alla variabile condizionante.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 8.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 8.md"
    index de449b2..e8b0c3c 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 8.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 8.md"
    @@ -144,7 +144,7 @@ $$K_{\mathbf{x}} = E!\left[(\mathbf{x} - \boldsymbol{\mu})(\mathbf{x} - \boldsy

Il caso si generalizza a $n$ variabili: la matrice $K$ è $n \times n$, con $K_{ij} = \text{Cov}(X_i, X_j)$.

-> [!important] Importanza nella data analysis e nel machine learning
+> [!info] Importanza nella data analysis e nel machine learning

La matrice di covarianza è fondamentale in machine learning, analisi dei componenti principali (PCA), stima MMSE (Minimum Mean Square Error) e in generale in tutti i metodi statistici che lavorano con vettori di dati. Se $K$ è diagonale, le variabili sono incorrelate.


@@ -179,8 +179,9 @@ $$f_X(x) = \lim_{\delta x \to 0} \frac{P(x - \delta x/2 \leq X \leq x + \delta x

[!warning] La densità non è una probabilità
$f_X(x_0)$ non è la probabilità che $X = x_0$. La probabilità di un singolo punto è 0. La densità è la "concentrazione" di probabilità in un intorno di $x_0$: più è alta, più è probabile trovare $X$ vicino a $x_0$.

-> [!quote]
-> "Chiamare il massimo della densità il 'valore più probabile' mi dà una pugnalata a sangue freddo. Il massimo della densità si chiama correttamente il valore modale."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Chiamare il massimo della densità il 'valore più probabile' mi dà una pugnalata a sangue freddo. Il massimo della densità si chiama correttamente il valore modale."

La teoria sarà ripresa in dettaglio nella prossima lezione, con il concetto di funzione di distribuzione cumulativa (CDF) e con tutti gli strumenti del caso continuo.

@@ -287,7 +288,7 @@ La Funzione Generatrice dei Momenti (MGF) è uno strumento potente per lo st

Per dimostrare rigorosamente il Teorema del Limite Centrale, si calcola la MGF della somma standardizzata e si mostra che converge alla MGF della gaussiana standard $\mathcal{N}(0,1)$, che è $M(t) = e^{t^2/2}$.

-> [!important] Criterio di convergenza in pratica
+> [!info] Criterio di convergenza in pratica

Per verificare se una sequenza di distribuzioni converge a quella di una variabile aleatoria nota (es. gaussiana), calcolare le MGF e controllare se la convergenza vale punto per punto.


@@ -295,7 +296,7 @@ Per dimostrare rigorosamente il Teorema del Limite Centrale, si calcola la M


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Il teorema della media condizionale permette di calcolare la media totale condizionando su una variabile ausiliaria, scomponendo problemi complessi in sottoproblemi più semplici.
  • La distribuzione di Poisson è chiusa rispetto al subcampionamento bernoulliano: $N \sim \text{Poisson}(\lambda)$ e $M|N \sim \text{Bin}(N,p)$ implicano $M \sim \text{Poisson}(\lambda p)$.
  • La covarianza misura la co-variazione lineare tra due variabili; il coefficiente di correlazione la normalizza in $[-1,1]$.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 9.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 9.md"
    index 0ed0361..5c95d98 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 9.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Metodi Statistici dell' Informazione/Lezione 9.md"
    @@ -110,7 +110,7 @@ dove $c_i$ è un punto del sottointervallo $i$ per il teorema del valor medio. Q

$$E[X] = \int_{-\infty}^{+\infty} x, f_X(x), dx$$

-> [!important] Implicazione pratica: la quantizzazione vettoriale
+> [!info] Implicazione pratica: la quantizzazione vettoriale

Shannon (1948) dimostrò che per digitalizzare dati analogici in modo ottimo non conviene quantizzare campione per campione, ma blocchi di dati grandi tutti insieme (quantizzazione vettoriale). Un quantizzatore su $\mathbb{R}^n$ è asintoticamente molto più efficiente di $n$ quantizzatori scalari indipendenti. Questo è il fondamento della codifica a blocchi usata in tutti i sistemi di compressione moderni.


@@ -193,7 +193,7 @@ La convenienza di lavorare con la CDF è che $P(X \leq x \mid A)$ è sempre ben


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • La CDF $F_X(x) = P(X \leq x)$ è definita per qualsiasi variabile aleatoria; è monotona crescente, vale 0 a $-\infty$ e 1 a $+\infty$.
  • PDF e CDF sono equivalenti: $f_X(x) = F_X'(x)$ e $F_X(x) = \int_{-\infty}^x f_X(t), dt$.
  • Il valore atteso continuo $E[X] = \int x f_X(x), dx$ si giustifica come limite di medie di variabili quantizzate.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 0.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 0.md"
    index b1170fa..69896d6 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 0.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 0.md"
    @@ -24,7 +24,7 @@ tags:

📝 Esame

-> [!important] Modalità d'esame
+> [!info] Modalità d'esame

  1. Prova scritta — domande aperte + esercizi (lettura e interpretazione di codice, non scrittura)
  2. Prova orale — accessibile solo dopo aver superato lo scritto

@@ -44,7 +44,7 @@ tags:

Cos'è un Sistema Operativo?

-> [!quote] Definizione
+> [!tip] Definizione

Un Sistema Operativo è un programma che gestisce le risorse hardware di un calcolatore, facendo da intermediario tra utente e macchina. È il primo strato software che si pone tra l'hardware e le applicazioni.

Obiettivi principali

@@ -99,7 +99,7 @@ graph TB

Kernel vs Programmi di sistema

-> [!note] Distinzione fondamentale
+> [!info] Distinzione fondamentale

  • Kernel (nucleo): parte più interna; unico programma con accesso completo all'hardware; opera in Kernel Mode (modalità privilegiata)
  • Programmi di sistema: estendono le funzionalità del kernel (shell, utilità di sistema, ecc.)
  • Applicazioni: tutto ciò che non è né kernel né programma di sistema
    @@ -274,7 +274,7 @@ gantt

Dual Mode — Modalità Duale

-> [!important] Principio fondamentale
+> [!info] Principio fondamentale

Il sistema opera sempre in una di due modalità, distinte da un bit hardware:

  • Kernel Mode: accesso completo all'hardware, operazioni privilegiate
  • User Mode: operazioni limitate; per accedere all'hardware si deve richiedere al kernel tramite system call
    @@ -288,15 +288,16 @@ gantt

Per evitare che un processo utente occupi la CPU indefinitamente:

-> [!note]
+> [!info]

Un timer hardware invia periodicamente un interrupt alla CPU, riportando il controllo al kernel. Questo garantisce che nessun processo possa monopolizzare la CPU.

Protezione della Memoria

Il kernel assegna ad ogni processo uno spazio di indirizzamento con registro base e registro limite:
$$\text{indirizzo fisico} = \text{base} + \text{indirizzo logico} \quad \text{se} \quad \text{indirizzo logico} \leq \text{limite}$$
-> [!tip]
-> La CPU lavora con indirizzi logici (disaccoppiati dalla RAM fisica). I controlli di accesso sono eseguiti in hardware per motivi di velocità. Il SO "apparecchia la tavola", poi l'hardware fa i controlli.
+> [!tip] Parole del Professore
+> > [!quote]
+> > La CPU lavora con indirizzi logici (disaccoppiati dalla RAM fisica). I controlli di accesso sono eseguiti in hardware per motivi di velocità. Il SO "apparecchia la tavola", poi l'hardware fa i controlli.


diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 1.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 1.md"
index fe19161..433a30f 100644
--- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 1.md"
+++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 1.md"
@@ -39,7 +39,7 @@ Il sistema operativo deve fornire un insieme ampio di servizi. Deve mettere a di

Il SO è anche un monitor: non solo alloca le risorse, ma tiene costantemente traccia di tutto quello che sta succedendo sulla macchina. Per ogni processo sa quali file sono aperti, quali risorse sono allocate, chi sono gli utenti coinvolti. Mantiene per questo una serie di strutture dati interne al kernel. Vengono anche garantiti meccanismi di protezione (accesso controllato alle risorse tra processi interni) e sicurezza (difesa da accessi non autorizzati dall'esterno).

-> [!important] Protezione ≠ Sicurezza
+> [!info] Protezione ≠ Sicurezza

La protezione riguarda l'interno: garantisce che processi utente non accedano a zone di memoria o operazioni non consentite. La sicurezza riguarda l'esterno: autenticazione, difesa da intrusioni. Sono concetti e meccanismi distinti.


@@ -131,8 +131,9 @@ Questo è ciò che il compilatore genera quando si compila una chiamata come wr 6. Esegue la routine di servizio. 7. Scrive il risultato in rax` e ritorna al processo utente.

-> [!quote]
-> "È come se voi vi siete già messi d'accordo su dove stanno le chiavi di casa. Io ho lasciato le chiavi nel solito posto. Il kernel già sa in quali cassetti aprire per trovare i dati."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "È come se voi vi siete già messi d'accordo su dove stanno le chiavi di casa. Io ho lasciato le chiavi nel solito posto. Il kernel già sa in quali cassetti aprire per trovare i dati."

[!example] Esempio dall'alto: il comando cp
Il comando cp input.txt output.txt è un programma C che si compone di decine di system call:
@@ -199,7 +200,7 @@ La scelta dipende sempre dai trade-off: velocità vs modularità, sicurezza vs p


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Le system call sono il confine tra user space e kernel space: l'unico canale di comunicazione controllato.
  • API (alto livello, portabile) e ABI (livello macchina) sono due cose distinte; non c'è mapping 1:1 garantito.
  • Le API POSIX sono lo standard Unix-like che useremo nel corso per la programmazione concorrente in C.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 2.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 2.md"
    index 7ff77ef..7b7eea0 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 2.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 2.md"
    @@ -149,8 +149,9 @@ Svantaggio: overhead di comunicazione. Ogni volta che un modulo deve comunic

Approccio usato dai kernel moderni (Linux, Solaris, Windows). Il kernel ha un nucleo fisso a cui si possono agganciare/sganciare moduli dinamicamente, senza ricompilare. I moduli vengono linkati dentro il kernel → nessun overhead di message passing, ma comunque compartimentazione del codice.

-> [!quote]
-> "È simile al microkernel per l'idea di compartimentazione, ma senza il message passing. I moduli stanno dentro il kernel, si parlano direttamente."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "È simile al microkernel per l'idea di compartimentazione, ma senza il message passing. I moduli stanno dentro il kernel, si parlano direttamente."

Sistemi Ibridi

@@ -335,7 +336,7 @@ if (pid < 0) {


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • La virtualizzazione tipo 1 (bare metal) è più efficiente del tipo 2 (hosted); entrambe si distinguono dall'emulazione, che riproduce software l'intera architettura.
  • I kernel moderni sono ibridi: prendono idee dal monolitico (prestazioni), dal microkernel (modularità) e dalla struttura modulare (estendibilità).
  • Un processo è un programma in esecuzione con un proprio spazio di memoria, un program counter e un ciclo di vita.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 3.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 3.md"
    index 12c92b8..79959c7 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 3.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 3.md"
    @@ -553,7 +553,7 @@ La capacita del canale di comunicazione determina il comportamento:

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • Il formato degli eseguibili in Linux e passato da .out a .elf; il loader usa l'header del file per caricare i segmenti nello spazio di indirizzamento virtuale.
  • Ogni processo ha uno spazio virtuale che include sia la zona user mode che una mappatura del kernel (shared tra tutti i processi).
  • L'exit status e un intero opaco che va letto con macro bit a bit (WIFEXITED, WEXITSTATUS).
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 4.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 4.md"
    index d3b1483..cf5ee2c 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 4.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 4.md"
    @@ -480,7 +480,7 @@ gcc -Wall -g hello.c -o hello

-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • La shell è l'interfaccia testuale con il sistema operativo; bash è la shell standard su Linux
  • La compilazione è una pipeline a 4 fasi: preprocessore → compilatore → assemblatore → linker
  • GCC permette di fermarsi a ciascuna fase con i flag -E, -S, -c
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 5.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 5.md"
    index 6634f9d..633bf4e 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 5.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 5.md"
    @@ -37,7 +37,7 @@ Un thread è un flusso esecutivo che condivide lo spazio di indirizzamento d
    | Economia | Creare e distruggere un thread è più veloce di un processo; il context switch è più leggero (lo stack è più piccolo) |
    | Scalabilità | Su architetture multicore, thread diversi possono girare su core diversi contemporaneamente |

-> [!important] Thread e architetture multicore
+> [!info] Thread e architetture multicore

Con l'aumentare del numero di core nelle CPU moderne (es. 16 core fisici, 24 hardware thread), la capacità di parallelizzare tramite thread diventa un principio architetturale fondamentale, non solo un'ottimizzazione.


@@ -119,8 +119,9 @@ Tutti gli user thread di un processo si mappano su un unico kernel thread. L

  • Se un thread si blocca (es. su I/O), si bloccano tutti (il kernel vede un unico thread bloccato).
  • Nessun vero parallelismo su multicore.

-> [!quote]
-> "Questo poteva avere un senso quando avevamo architetture single core. Adesso che sono architetture multicore non si utilizza questo tipo di mapping."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Questo poteva avere un senso quando avevamo architetture single core. Adesso che sono architetture multicore non si utilizza questo tipo di mapping."

One-to-one

@@ -180,7 +181,7 @@ La libreria POSIX Threads (pthread.h) è lo standard per la gestione dei t
| pthread_self() | Restituisce il TID del thread corrente |
| pthread_attr_init(attr) | Inizializza gli attributi del thread |

-> [!important] Prototipo della funzione di avvio
+> [!info] Prototipo della funzione di avvio

Ogni funzione passata a pthread_create deve avere questa firma:

void *start_function(void *arg);

@@ -289,7 +290,7 @@ for (int i = 0; i < N; i++) {


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I thread condividono lo spazio di indirizzamento del processo: comunicano direttamente ma possono andare in conflitto (race condition).
  • La legge di Amdahl mostra che la parte seriale limita lo speedup ottenibile con più core.
  • User thread e kernel thread sono distinti; i modelli di mapping (many-to-one, one-to-one, many-to-many) definiscono come vengono collegati.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 7.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 7.md"
    index ed06322..a5537c6 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 7.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 7.md"
    @@ -207,7 +207,7 @@ Lo dispatcher è il componente che materialmente trasferisce il controllo de
    | Waiting time | Minimizzare il tempo medio in coda Ready | Tutti |
    | Response time | Minimizzare il tempo alla prima risposta | Processi interattivi |

-> [!important] Minimizzare la varianza è spesso più importante della media
+> [!info] Minimizzare la varianza è spesso più importante della media

Un sistema con tempi di risposta imprevedibili (alta varianza) è percepito come inaffidabile anche se la media è bassa. Ridurre la varianza aumenta la predicibilità e la fiducia dell'utente.


@@ -282,7 +282,7 @@ I burst più recenti pesano di più; i burst più vecchi **sfumano esponenzialme


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I segnali ordinari pending non si accumulano: N invii → 1 sola consegna. I segnali real-time invece si accodano.
  • Una maschera impostata prima del lancio dei thread viene ereditata da tutti i figli; impostata dopo, vale solo per il thread corrente.
  • La cancellazione deferred (default) aspetta un cancellation point; si possono aggiungere cancellation point artificiali con pthread_testcancel().
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 8.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 8.md"
    index 7f2266f..4d1701d 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 8.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 8.md"
    @@ -206,8 +206,9 @@ Ogni processo ha:

Selezione: tra i processi eligibili, si sceglie quello con la virtual deadline più ravvicinata (EDF applicato alle deadline virtuali).

-> [!quote]
-> "Se quello di prima era orientato alla fairness pesata su priorità, questo nuovo è orientato alla reattività pesata, considerando priorità e deadline."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Se quello di prima era orientato alla fairness pesata su priorità, questo nuovo è orientato alla reattività pesata, considerando priorità e deadline."

Confronto CFS vs. EEVDF

@@ -250,7 +251,7 @@ Core ad alte prestazioni (big) e core a basso consumo (LITTLE) sullo stesso chip


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • RMS: priorità statica basata sulla frequenza; garantisce le deadline finché l'utilizzo totale ≤ $n(2^{1/n}-1)$ (69% per $n \to \infty$).
  • EDF: priorità dinamica basata sulla deadline più ravvicinata; ottimale — se esiste uno scheduling fattibile, EDF lo trova.
  • Linux CFS: virtual runtime con "orologio truccato" in base alla priorità; albero rosso-nero per selezione O(1).
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 9.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 9.md"
    index 9cada49..b09b226 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 9.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/Lezione 9.md"
    @@ -185,12 +185,12 @@ Con più core, lo scheduler deve anche decidere su quale core eseguire ogni
  • Push migration: un processo verifica periodicamente i carichi e sposta task dai core sovraccarichi.
  • Pull migration: un core idle va a "rubare" task dalla coda di un core occupato.

-> [!important] Affinità del processore (CPU affinity)
+> [!info] Affinità del processore (CPU affinity)

Un thread che ha già eseguito su un core ha i suoi dati in quella cache. Migrarlo su un altro core implica invalidare la cache → costo. Lo scheduler tende a mantenere un thread sullo stesso core (soft affinity) o può forzarlo (hard affinity).


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • SRTF (SJF preemptive) prelaziona quando arriva un processo con burst rimanente più breve; minimizza il tempo di attesa medio meglio di SJF non-preemptive.
  • La priorità fissa causa starvation; l'aging la previene alzando la priorità dei processi che aspettano.
  • Round-Robin è equo e senza starvation; il quanto deve essere abbastanza grande rispetto al context switch ma abbastanza piccolo per garantire reattività.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione10.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione10.md"
    index cad6dba..a52027d 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione10.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione10.md"
    @@ -34,11 +34,12 @@ Gli algoritmi di scheduling possono essere valutati con approcci di diverso live

Simulazione — Si simulano gli arrivi e i tempi di elaborazione con generatori casuali. Più realistico, ma pur sempre limitato. Il vero banco di prova è l'implementazione diretta nel kernel.

-> [!important] Il vero banco di prova
+> [!info] Il vero banco di prova

L'unico modo per valutare davvero un algoritmo di scheduling sofisticato è inserirlo nel kernel e osservarne il comportamento nel sistema completo. L'algoritmo vive in un ecosistema e interagisce con tutto il resto: un algoritmo teoricamente ottimo può risultare non performante in pratica. Ad esempio, l'EEVDF di Linux è stato proposto come lavoro scientifico diversi anni prima di essere integrato nel kernel, proprio per la cautela necessaria nel sostituire un algoritmo già in produzione.

-> [!quote]
-> "Finché si trattano algoritmi molto semplici, si possono modellare in astratto, però poi per valutare effettivamente l'impatto reale bisogna immergerlo dentro il kernel."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Finché si trattano algoritmi molto semplici, si possono modellare in astratto, però poi per valutare effettivamente l'impatto reale bisogna immergerlo dentro il kernel."


@@ -55,8 +56,9 @@ La soluzione con contatore esplicita il problema in modo ancora più chiaro: un

[!example] Corsa critica sul contatore
Supponiamo counter = 5. Il thread 1 legge 5 nel registro R1, aggiorna R1 a 6. Prima di scrivere in memoria, lo scheduler cede la parola al thread 2, che legge 5 nel registro R2, aggiorna R2 a 4, scrive 4 in memoria. Poi il thread 1 scrive 6. Il risultato finale è 6 invece di 5. Se avessero operato atomicamente, qualunque ordine avrebbe prodotto 5.

-> [!quote]
-> "Voi che cosa state ipotizzando, lanciando due thread? Che tutte queste siano operazioni atomiche. Se fossero atomiche, chi arriva prima, chi arriva dopo... non è un problema."
+> [!tip] Parole del Professore
+> > [!quote]
+> > "Voi che cosa state ipotizzando, lanciando due thread? Che tutte queste siano operazioni atomiche. Se fossero atomiche, chi arriva prima, chi arriva dopo... non è un problema."

Il problema si amplifica su sistemi multicore dove c'è parallelismo reale: i thread girano su core distinti e accedono a memoria condivisa contemporaneamente. In più, le cache possono introdurre ulteriori problemi di consistenza: una modifica tenuta in cache può non essere ancora propagata in memoria globale.

@@ -204,7 +206,7 @@ Questo garantisce che ogni processo che aspetta verrà servito nell'ordine circo


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • La valutazione deterministica degli algoritmi di scheduling è quella richiesta ai compiti; il vero banco di prova è l'implementazione nel kernel.
  • Le corse critiche nascono dall'interfogliamento di istruzioni macchina su variabili condivise: anche counter++ non è atomica.
  • Un corretto meccanismo per la sezione critica deve garantire mutua esclusione, progresso e bounded waiting.
    diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione11.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione11.md"
    index 3e5a726..4db9683 100644
    --- "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione11.md"
    +++ "b/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Sistemi Operativi/SO_Lezione11.md"
    @@ -80,7 +80,7 @@ void spinlock_release(int *lock) {
    | Adatto a | Sistemi multicore, kernel | Programmazione applicativa |
    | Analogia | Macchina al semaforo col motore acceso | Macchina che si spegne e si riavvia |

-> [!important] Spin lock su sistemi single-core
+> [!info] Spin lock su sistemi single-core

Su un solo core, lo spin lock è dannoso: il processo che aspetta occupa il 100% della CPU, impedendo al processo che tiene il lock di eseguire e liberarlo. Su multicore invece un core può dedicarsi allo spinning mentre un altro esegue il processo che deve rilasciare il lock.


@@ -297,7 +297,7 @@ Gli spin lock non fanno context switch ma sprecano CPU. I mutex sospendono il pr


-> [!summary] Punti chiave della lezione
+> [!abstract] Punti chiave della lezione

  • I semafori generalizzano i mutex: un semaforo binario equivale a un mutex, un semaforo contatore permette $k$ accessi contemporanei.
  • Il problema produttore-consumatore si risolve elegantemente con tre semafori (mutex, empty, full).
  • I monitor garantiscono mutua esclusione strutturalmente; le variabili di condizione permettono ai processi di sospendersi in attesa di una condizione, lasciando entrare altri.

EOF

Copilot AI commented Apr 18, 2026

Copy link
Copy Markdown
Contributor Author

@copilot git apply --3way <<'EOF'
diff --git "a/00 - Obsidian Notes/2\302\260 Anno/2\302\260 Semestre/Analisi e progettazione di algoritmi/APA_Lezione9.md" "b/00 - Obsidian Notes/2\302\260 Anno/2\302...

Both changes from the patch are already applied in the current branch:

  • The bare > [!quote] was wrapped as > [!tip] Parole del Professore + > > [!quote] (commits e8675d5841b5ff)
  • [!summary] was changed to [!abstract] (commit b14e3e7)

The file already matches the desired state from the patch.

Copilot AI requested a review from Fede-7 April 18, 2026 13:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants