Chapter 5 · Lectures 13 to 15
Differential Privacy
Every earlier chapter protected data in transit or at rest. This one studies safe releases from datasets about people, including statistics, query answers and synthetic records. A single privacy definition governs the mechanisms. The closing lower bounds show how accuracy, query volume and computation constrain any such release.
Lecture 13 (04/11/25) opened with lattice Identity-Based Encryption (IBE) and Attribute-Based Encryption (ABE), which belongs to Chapter 4, then started this chapter with sections 1 to 6 below. Lecture 14 (06/11/25) covers sections 7 to 9, advanced composition and the exponential mechanism with its applications. Lecture 15 (11/11/25) covers sections 10 to 13, SmallDB, the lower bounds, traitor tracing and game theory. Study plans for each: Lecture 13, Lecture 14, Lecture 15.
Section 1Data Exploitation, and Why Aggregation Fails to Protect
Lecture 13.
Social networks, financial records and medical records can all be represented as a dataset $x = (x_1, x_2, \ldots)$ whose rows describe people. Analysis draws information from those rows by correlating genotypes with phenotypes, matching medical outcomes to risk factors, publishing aggregate statistics, spotting outliers for intrusion detection and mining customer data to update a strategy.
Releasing aggregates while withholding the rows seems safer. Three attacks show why it is not a privacy guarantee.
The differential attack is the simplest. A small database makes it concrete. Publish the prefix sums of one column, $s_i = x_1 + \cdots + x_i$ for $i = 1, \ldots, n$. Every row is the difference of two published numbers, $x_i = s_i - s_{i-1}$, so these aggregate statistics determine the whole database. The same subtraction breaks any pair of overlapping groups. Ask how many people in the room did XYZ last night, then ask how many people other than the speaker did it; the difference of the two answers is a fact about one person.
The needle in a haystack attack works on genomic data. Aggregate statistics from a genome-wide association study can enable membership inference about whether a specific individual's genome sits in the case group, even when the group is large. The big bang attack combines statistics released from multiple overlapping datasets to reconstruct sensitive attributes outright. In each attack the published statistics can be inverted to recover private records.
What went wrong. In 2008 Homer and colleagues showed that a person's presence in a genome-wide association study cohort can be detected from published aggregate allele frequencies. The National Institutes of Health responded by restricting access to such data.
Two released datasets make the point concrete. In 2014 the NYC Taxi and Limousine Commission published 19 GB of taxi fare data whose identifiers, which looked like anonymized tokens, were MD5 (Message-Digest Algorithm 5) hashes of the driver's medallion and license number; once that was noticed the hashes were inverted against public records. The Netflix Prize dataset of 2006 to 2009, released to improve a recommendation engine, was de-anonymized by matching rating patterns against public IMDb (Internet Movie Database) reviews. The episode ended in a class action lawsuit.
Common mistake. Stripping names and identifiers feels like anonymization. In 2000 Latanya Sweeney showed that ZIP code, birth date and sex uniquely identify 87% of Americans. Ordinary attributes combine into fingerprints.
The deck draws four lessons.
- Privacy is a concern whenever a dataset is published.
- Releasing aggregates in place of raw rows does not remove the concern.
- Aggregates alone can break privacy.
- Overly accurate estimates of too many statistics are blatantly non-private. Accuracy is the attack surface. This is the recurring theme of the whole chapter.
The target for the rest of the chapter is a notion of privacy-preserving data analysis analogous to semantic security for encryption (where a ciphertext reveals nothing about its message): the analyst learns nothing new about Alice. The ideal form is sharper. The analyst learns the same thing whether Alice is in the dataset or is replaced by a random member of the population.
Anonymization and aggregation are both broken as privacy guarantees. The failures are structural. Overlapping aggregates subtract to individuals, auxiliary information turns correlations into identifications and published statistics can be inverted into private records. The chapter's definition is built to survive each of these.
Section 2The Definition, and What It Is Saying
Lecture 13.
Differential privacy asks that the outcome of an analysis be roughly equally likely whether or not any individual joins the dataset. Picture the same randomized process run on two databases that differ in one person. The two output distributions come out nearly the same, so an observer can barely tell which database produced the result. Alice goes away or Bob joins; no one-row change moves the odds by much. Changing the dataset wholesale is allowed to change the answers completely. Apple, Google and Microsoft use the definition in production.
What went wrong. In 2017 Tang and colleagues measured daily privacy loss on Apple's macOS 10.12 reaching $\eps = 6$, far above what users expected. A differential privacy claim without a stated, enforced budget is unverifiable.
A mechanism $M: \mathcal{X}^n \times \mathcal{Q} \to \mathcal{Y}$ gives $\eps$-differential privacy if for all pairs of neighboring datasets $x, x' \in \mathcal{X}^n$ and all queries $q \in \mathcal{Q}$,
$$\forall S \subseteq \mathcal{Y}, \qquad \Pr[M(x, q) \in S] \le e^{\eps} \cdot \Pr[M(x', q) \in S].$$Neighboring means the two datasets differ in a single row; write $x \sim x'$ for such a pair. The probability is over the randomness of $M$ alone.
Worked number. Read $\eps$ as the worst-case ratio $e^{\eps}$: $\eps = 0.1$ caps it at $1.11$, $\eps = 0.5$ at $1.65$ and $\eps = 1$ at $2.72$. At $\eps = 1$ your record can make any output at most $2.72$ times as likely.
The definition has three important consequences.
- Everything an adversary learns about one person could have been learned from the rest of the dataset, even without that person's participation. Population facts still come through. Differential privacy (DP) cannot license decisions about specific individuals.
- The guarantee is worst-case, over all datasets and against unbounded adversaries.
- The probability is over the mechanism's coins, never over a distribution on datasets.
Common mistake. Differential privacy is read as a promise that nothing about an individual can be learned. The guarantee is narrower: it bounds how much one record can move the output distribution. Aggregate facts such as smoking causing cancer still come through.
The workhorse query family is counting queries. A counting query is a predicate $q: \mathcal{X} \to \{0,1\}$ on rows, extended to datasets by counting the fraction of rows that satisfy it:
$$q(x) = \frac{1}{n} \sum_{i=1}^{n} q(x_i).$$Four subfamilies recur.
- Point functions $q_y(w) = 1$ iff (if and only if) $w = y$ answer the histogram.
- Threshold functions $q_y(w) = 1$ iff $w \le y$ answer the cumulative distribution.
- Attribute means $q_j(w) = w_j$ on $\mathcal{X} = \{0,1\}^d$ answer the one-way marginals, the fraction of the dataset possessing each attribute.
- Conjunctions of $t$ literals answer the $t$-way marginals. For instance $q(w) = w_2 \wedge \neg w_4$ asks what fraction of individuals have lung cancer and are non-smokers. Answering all such queries amounts to the $t$-way contingency table.
The definition bounds a probability ratio, pointwise in the output, by $e^{\eps}$. One row of input moves the odds of any transcript by at most that factor, against every adversary and every side information the adversary holds.
Section 3Postprocessing, Group Privacy and Basic Composition
Lecture 13.
If $M: \mathcal{X}^n \times \mathcal{Q} \to \mathcal{Y}$ is $\eps$-DP ($\eps$-differentially private) and $\Psi: \mathcal{Y} \to \mathcal{Z}$ is any randomized function, then $\Psi \circ M$ is $\eps$-DP.
Write $\Psi$ as a distribution over deterministic maps $\psi$. For any $z \in \mathcal{Z}$,
$$\Pr[\Psi \circ M(x) = z] = \mathbb{E}_{\psi}\, \Pr[M(x) = \psi^{-1}(z)] \le e^{\eps}\, \mathbb{E}_{\psi}\, \Pr[M(x') = \psi^{-1}(z)] = e^{\eps}\, \Pr[\Psi \circ M(x') = z].$$Postprocessing lets a curator hand the output to anyone, in any further processed form, without spending more privacy budget. Privacy is a property of the release. Nothing done to the release afterwards can amplify it.
Common mistake. The guarantee is treated as a property of the dataset. It attaches to the computation that produced the release. The same underlying data released twice spends privacy budget twice; each release is accounted separately.
If $M$ is $\eps$-DP, then for datasets $x, x'$ at distance $k = d(x, x')$, the outputs $M(x)$ and $M(x')$ satisfy $k\eps$-DP.
Walk from $x = x_0$ to $x' = x_k$ one row at a time and chain the definition:
$$\Pr[M(x_k) = y] \le e^{\eps} \Pr[M(x_{k-1}) = y] \le \cdots \le e^{k\eps} \Pr[M(x_0) = y].$$If $M_1, \ldots, M_k$ are $\eps$-DP and use independent randomness, then the joint mechanism $M(x) = (M_1(x), \ldots, M_k(x))$ is $k\eps$-DP.
The clean proof uses the privacy-loss random variable. Fix neighbors $x, x'$ and define
$$\Lambda_{M(x) \| M(x')}(y) = \ln \frac{\Pr[M(x) = y]}{\Pr[M(x') = y]}.$$When $\Lambda > 0$, the outcome $y$ is evidence that the dataset is $x$ over $x'$. $\eps$-DP is exactly the statement that $\Lambda \le \eps$ everywhere. For the joint mechanism the loss is a sum:
$$\Lambda_{M(x) \| M(x')}(y) = \sum_{i=1}^{k} \Lambda_{M_i(x) \| M_i(x')}(y_i) \le k\eps.$$Composition turns the definition into an engineering tool. Privacy loss accumulates across analyses, so a total budget can be split among many mechanisms. Private pieces can be combined into a larger analysis with a known total cost. The definition is immune to auxiliary information, current and future, yields group privacy automatically and composes.
Worked number. Five counting queries at $\eps = 0.2$ each spend a total of $5 \times 0.2 = 1.0$ under basic composition. A sixth identical query raises the bound to $1.2$, so a strict budget of $1.0$ permits only the first five.
Postprocessing is free, groups cost $k\eps$ and sequential analyses add their epsilons. Every mechanism later in the chapter is priced against these rules.
Section 4Randomized Response: The First Mechanism
Lecture 13.
The oldest private mechanism predates the definition by decades. The survey question is "did you XYZ last night?" Each respondent runs the two-coin protocol in the stage below. Flip a coin. On tails answer honestly. On heads flip a second coin and answer YES on heads and NO on tails, ignoring the question entirely.
History. Stanley Warner proposed randomized response in 1965 in the Journal of the American Statistical Association, four decades before the definition existed. It is the ancestor of what is now called local differential privacy.
The arithmetic is short. A person who did it answers YES with probability $1/2 + 1/4 = 3/4$. A person who did not answers YES with probability $1/4$. The worst-case ratio of the two is $3$, so the protocol is $\eps$-DP ($\eps$-differentially private) for $\eps = \ln 3 \approx 1.098$. The symmetric ratio $\Pr[\text{NO} \mid \text{did}]\,/\,\Pr[\text{NO} \mid \text{did not}] = 3$ gives the same bound, since the definition bounds the ratio in both directions.
Accuracy comes from inverting the expectation. The expected YES fraction is $\frac{1}{4}(1 - p) + \frac{3}{4}p = \frac{1}{4} + \frac{p}{2}$ where $p$ is the true fraction, so the unbiased estimator (whose expectation equals the true $p$) is $\hat{p} = 2 \cdot \#\text{YES}/n - 1/2$. Chebyshev's inequality bounds the error by $O(1/\sqrt{n})$, so the estimate improves with the room size and the price of privacy is a constant factor in the variance.
The mechanism generalizes to any counting query $q$. Answer each row truthfully with probability $1/2 + \eps$ and flip the answer with probability $1/2 - \eps$. On neighboring datasets differing in row $j$, the output ratio telescopes to the single changed row:
$$\frac{\Pr[M(x) = y]}{\Pr[M(x') = y]} = \frac{\Pr[M(x_j) = y_j]}{\Pr[M(x'_j) = y_j]} \le \frac{1/2 + \eps}{1/2 - \eps} \le e^{O(\eps)},$$for $\eps \le 1/4$, giving $O(\eps)$-DP. The estimator is unbiased after the linear correction $\hat{y} = \frac{1}{n}\sum_i \frac{1}{2\eps}(y_i - 1/2 + \eps)$. Its variance is at most $1/(4n\eps^2)$, so Chebyshev gives error $O(1/\sqrt{n}\,\eps)$. Randomized response pays $1/\sqrt{n}$; the next mechanism pays $1/n$.
Randomized Response in a Room Of $n$ People
Runs the two-coin protocol on a synthetic room, estimates the fraction $p$, and checks the $\ln 3$ privacy bound. The seed fixes every coin flip, so a run is reproducible.
Randomized response buys deniability with coins. Any single YES answer can be blamed on the second coin. The population fraction is still recoverable in expectation. The privacy parameter is $\ln 3$ and the error decays like $1/\sqrt{n}$.
Section 5The Laplace Mechanism: Noise Scaled to Sensitivity
Lecture 13.
The second mechanism perturbs the answer instead of the input. For a counting query, answer $M(x) = q(x) + \text{noise}$. Choose the noise distribution so that neighboring datasets, whose answers differ by at most $1/n$, produce densities within a factor $e^{\eps}$ at every point.
Common mistake. Any noise added to a statistic is assumed to make it private. The guarantee needs noise calibrated to the query's sensitivity inside a mechanism with a proof, such as the Laplace mechanism. Undocumented ad hoc noise carries no bound at all.
Let $L(\mu, \sigma)$ denote the Laplace density $\frac{1}{2\sigma} e^{-|z - \mu|/\sigma}$. For a counting query, the mechanism $M(x) = q(x) + z$ with $z \leftarrow L(0, 1/(\eps n))$ is $\eps$-DP ($\eps$-differentially private).
At any output $y$, the density ratio between neighbors is
$$\frac{f_{M(x)}(y)}{f_{M(x')}(y)} = e^{\frac{|y - q(x')| - |y - q(x)|}{\sigma}} \le e^{\frac{|q(x) - q(x')|}{\sigma}} \le e^{\frac{1/n}{1/(\eps n)}} = e^{\eps},$$where the first inequality is the reverse triangle inequality.
The maximum change in a query's answer under a single row change is its sensitivity, $\Delta = \max_{x \sim x'} |q(x) - q(x')|$ over neighboring datasets. A counting query over $n$ rows has sensitivity $1/n$, since changing one row moves the answer by at most $1/n$. The Laplace scale is the sensitivity divided by $\eps$, hence $\sigma = 1/(\eps n)$. A query over fewer people gets wider noise. The same query over 100 rows uses ten times the noise of the same query over 1000. This calibration, noise matched to how much one row can move the answer, is the pattern every mechanism in the chapter follows.
Worked number. Summing salaries bounded at $200{,}000$ gives sensitivity $200{,}000$. At $\eps = 0.1$ the Laplace scale is $2{,}000{,}000$, which swamps the answer. Clip salaries at $50{,}000$ first: the scale drops to $500{,}000$ and the noise falls fourfold.
- Dataset: $n = 1000$ rows, $400$ of which satisfy the predicate. The true answer is $q(x) = 400/1000 = 0.4$.
- Sensitivity: one row change moves the answer by at most $1/n = 0.001$.
- Scale: at budget $\eps = 1$ the noise is $\sigma = 1/(\eps n) = 0.001$.
- Release: draw $z \leftarrow L(0,\, 0.001)$ and output $y = 0.4 + z$.
- Accuracy: with probability at least $1 - \beta = 0.95$ the error satisfies $|y - 0.4| \le \ln(1/\beta) \cdot \sigma = \ln 20 \cdot 0.001 \approx 0.003$.
- Privacy: for any neighboring $x'$ the density ratio at any output is at most $e^{0.001/0.001} = e$, so the release is $1$-DP.
Common mistake. A smaller $\eps$ is treated as a free win. The Laplace scale equals sensitivity divided by $\eps$: halve $\eps$ and the noise doubles. Stronger privacy always trades against accuracy.
The accuracy side uses the tails. $L(0, \sigma)$ has mean $0$, standard deviation $\sqrt{2}\,\sigma$ and exponentially vanishing tails, $\Pr[|L(0, \sigma)| > \sigma t] \le e^{-t}$. Hence for any $0 < \beta \le 1$,
$$\Pr\big[\,|q(x) - y| > \ln(1/\beta) \cdot 1/(\eps n)\,\big] \le \beta,$$so with high probability the error is $O(1/(\eps n))$. Compare randomized response's $O(1/(\eps\sqrt{n}))$: for a single counting query the Laplace mechanism is a square root of $n$ more accurate.
The mechanism is not specific to counting queries. The proof used only the bound $|q(x) - q(x')| \le 1/n$ on neighbors. The right generalization is the global $\ell_1$-sensitivity of an arbitrary query $q: \mathcal{X}^n \to \R^d$:
$$\Delta_1 = \max_{x \sim x'} \|q(x) - q(x')\|_1 = \max_{x \sim x'} \sum_{i=1}^{d} |q(x)_i - q(x')_i|.$$For $q: \mathcal{X}^n \to \R^d$, the mechanism $M(x) = q(x) + (z_1, \ldots, z_d)$ with each $z_i \leftarrow L(0, \Delta_1/\eps)$ satisfies $\eps$-DP.
The Laplace Mechanism on One Counting Query
Releases a noisy count for a dataset of $n$ rows with $k$ ones, draws the noise histogram against the true answer, and checks both the accuracy bound and the density-ratio condition against the neighboring dataset.
The Laplace mechanism answers one query with error $O(1/(\eps n))$. Its privacy proof is one line of triangle inequality once the scale is fixed.
Section 6Approximate DP and the Gaussian Mechanism
Lecture 13.
Section 3 introduced the privacy-loss random variable $\Lambda(y) = \ln \frac{\Pr[M(x) = y]}{\Pr[M(x') = y]}$. $\eps$-Differentially Private (DP) is the statement that $\Lambda \le \eps$ at every output. Approximate DP relaxes that pointwise bound. A second parameter $\delta$ permits an additive probability term in the bound for every output event. The parameter $\delta$ is a failure probability. It is priced per person in the dataset, so it must stay very small.
A mechanism $M: \mathcal{X}^n \times \mathcal{Q} \to \mathcal{Y}$ gives $(\eps, \delta)$-differential privacy if for all neighboring $x, x'$ and all queries $q$,
$$\forall y \in \mathcal{Y}, \qquad \Pr[M(x, q) = y] \le e^{\eps} \cdot \Pr[M(x', q) = y] + \delta.$$For every output event, the probability under one neighboring dataset can exceed $e^{\eps}$ times the probability under the other by at most $\delta$.
The relaxation buys three things.
- Gaussian (bell-curve) noise, which gives better accuracy in high dimensions.
- Advanced composition, which answers $k$ queries with cumulative loss about $\sqrt{k}\,\eps$ instead of $k\eps$.
- Compatibility with cryptography that simulates a trusted center, which a later lecture takes up.
Let $q: \mathcal{X}^n \to \R^d$ have global $\ell_2$-sensitivity $\Delta_2 = \max_{x \sim x'} \|q(x) - q(x')\|_2$. For $0 < \eps < 1$, the mechanism $M(x) = q(x) + (z_1, \ldots, z_d)$ with each
$$z_i \sim N\!\left(0, \frac{2 \ln(1.25/\delta)\, \Delta_2^2}{\eps^2}\right)$$satisfies $(\eps, \delta)$-DP.
The relaxation pays in the comparison with Laplace. For every vector, $\|y\|_2 \le \|y\|_1 \le \sqrt{d}\,\|y\|_2$. Take the multivariate mean query on $x \in \{0,1\}^{n \times d}$. Then $\Delta_1 \le d/n$ while $\Delta_2 \le \sqrt{d}/n$. Laplace adds noise of magnitude $O(d/(n\eps))$; the Gaussian mechanism needs $O(\sqrt{d}\,\ln(1/\delta)/(n\eps))$ for roughly the same accuracy, a factor $\sqrt{d}$ better.
The privacy proof computes the distribution of the privacy loss directly. For $M(x) = q(x) + z$ with $z \leftarrow N(0, \sigma^2 I)$ and $v = q(x) - q(x')$,
$$\ln \frac{\Pr[M(x) = q(x) + z]}{\Pr[M(x') = q(x) + z]} = \frac{1}{\sigma^2} \sum_i \left(z_i v_i + \frac{v_i^2}{2}\right).$$The sum $\sum_i z_i v_i$ is Gaussian with variance $\sigma^2 \|v\|_2^2$, so the privacy loss is distributed as $N\big(\|v\|_2^2/(2\sigma^2),\; \|v\|_2^2/\sigma^2\big)$. Setting $\sigma = \Delta_2 \sqrt{t}/\eps$ and $t = 2\ln(2/\delta)$, a standard Gaussian tail bound gives $\Pr[\text{loss} > \eps] \le \delta$, which is exactly $(\eps, \delta)$-DP. The scale works out to roughly $\sigma \approx (\Delta_2/\eps)\sqrt{\ln(1/\delta)}$.
The relaxed definition keeps the structural properties, with the slack propagating.
- Postprocessing preserves $(\eps, \delta)$ unchanged.
- Group privacy over distance $k$ gives $(k\eps,\; k\delta\, e^{(k-1)\eps})$.
- Basic composition of $k$ mechanisms gives $(k\eps, k\delta)$.
Allowing a $\delta$-sized set of bad outcomes converts the Laplace template into the Gaussian one. The Gaussian tail is what makes advanced composition possible.
Section 7Advanced Composition
Lecture 14.
For all $\eps, \delta, \delta' > 0$, if $M_1, \ldots, M_k$ are $(\eps, \delta)$-DP (differentially private with slack $\delta$), then $M(x) = (M_1(x), \ldots, M_k(x))$ is $(\tilde{\eps}, \tilde{\delta})$-DP for
$$\tilde{\eps} = \eps\sqrt{2k \ln(1/\delta')} + k\eps \cdot \frac{e^{\eps} - 1}{e^{\eps} + 1}, \qquad \tilde{\delta} = k\delta + \delta'.$$In the high-privacy regime $(e^{\eps} - 1)/(e^{\eps} + 1) \approx \eps/2$, so the second term is about $k\eps^2/2$ and the square-root term dominates. The bound holds even in the adaptive setting, where each mechanism sees the previous transcript.
The proof reduces to a simple pair of random variables satisfying the definition. The pair $(U, V)$ takes values in $\{0, 1\}$; on value $v$ the ratio $\Pr[U = v]/\Pr[V = v]$ equals $e^{\eps}$ or $1/e^{\eps}$, with the remaining mass $\delta$ placed on declarations "I am $U$" and "I am $V$". A lemma maps any pair of mechanisms whose privacy loss stays within $\pm\eps$ with probability $1 - \delta$ onto this pair by randomized postprocessing, so it suffices to bound the privacy loss between $k$ copies of $U$ and $k$ copies of $V$.
Two events control the rest. Event $E_1$ is that some copy declares "I am $U$", which happens with probability at most $1 - (1-\delta)^k \le k\delta$. Conditioning on $E_1$ not happening, each step contributes a privacy loss of $+\eps$ with probability $e^{\eps}/(1 + e^{\eps})$ and $-\eps$ otherwise, so the expected total loss is $k\eps\,(e^{\eps} - 1)/(e^{\eps} + 1)$. Event $E_2$ is that the total loss exceeds its mean by $\beta\eps\sqrt{k}$; Hoeffding's concentration bound with range $[-\eps, \eps]$ gives $\Pr[E_2 \mid E_1] \le e^{-\beta^2/2}$. Choosing $\beta = \sqrt{2\ln(1/\delta')}$ makes that probability $\delta'$. The union of the two failure events is exactly $\tilde{\delta} = k\delta + \delta'$.
Composition Budgets, Basic Versus Advanced
Compares the two composition theorems on the same per-query epsilon, and shows how many queries each allows under a fixed total budget of 1.
Privacy loss grows like a square root in the number of compositions, at the price of a tiny slack $\delta'$. For small per-query epsilon and large $k$, advanced composition is the difference between a usable budget and an exhausted one.
Section 8The Exponential Mechanism
Lecture 14.
The mechanisms so far output numbers, while many private analyses must choose an object. The running example is a digital auction: one seller with infinitely many copies of a good, $n$ buyers with valuations $v_i$ and a price $p$ to be chosen to maximize the revenue $p \cdot |\{i : v_i \ge p\}|$. The revenue can drop sharply. If $v_1 = v_2 = 1$ and $v_3 = 3.01$, raising the price from $1$ to $1.01$ drops the revenue from $3$ to $1.01$. A private auction must choose a price without revealing the valuations that determine it.
The input is a dataset $x \in \mathcal{X}^n$, a set of objects $\mathcal{H}$ and a score function $s: \mathcal{X}^n \times \mathcal{H} \to \R$; only the dataset is private. With the score sensitivity
$$\Delta s = \max_{h \in \mathcal{H}}\; \max_{x, x':\, x \sim x'} |s(x, h) - s(x', h)|,$$the mechanism outputs $h \in \mathcal{H}$ with probability proportional to $\exp(\eps \cdot s(x, h)/(2\Delta s))$.
The exponential mechanism is $\eps$-DP.
Fix neighbors $x, x'$ and an output $y$. The ratio of output probabilities factors:
$$\frac{\Pr[M(x) = y]}{\Pr[M(x') = y]} = e^{\frac{\eps(s(x,y) - s(x',y))}{2\Delta s}} \cdot \frac{\sum_{h} e^{\frac{\eps\, s(x', h)}{2\Delta s}}}{\sum_{h} e^{\frac{\eps\, s(x, h)}{2\Delta s}}} \le e^{\eps/2} \cdot e^{\eps/2} = e^{\eps},$$the first factor from the sensitivity of $s$ at $y$, the second from termwise comparison of the two normalizers.
Let $s^*(x) = \max_{h} s(x, h)$ and $\mathcal{H}^*$ be the set of maximizers. Then
$$\Pr\!\left[s(M(x)) \le s^*(x) - \frac{2\Delta s}{\eps}\left(\ln \frac{|\mathcal{H}|}{|\mathcal{H}^*|} + \beta\right)\right] \le e^{-\beta}.$$Since $|\mathcal{H}^*| \ge 1$, the mechanism lands within $\frac{2\Delta s}{\eps}(\ln|\mathcal{H}| + \beta)$ of the best score with probability at least $1 - e^{-\beta}$.
The exponential mechanism converts any quality score into a private sampler. High scores become exponentially more likely. The privacy cost is set by how much one row can move the score. It is the workhorse for everything in the next three sections.
Section 9Applications: Auctions, Learning and Many Queries
Lecture 14.
The Laplace mechanism is a special case. Take $\mathcal{H} = \R$ and the score $s(x, h) = -|q(x) - h|$ for a query of sensitivity $\Delta$. Sampling with weight $\exp(-\eps|q(x) - h|/(2\Delta s))$ is the Laplace mechanism up to a factor of two in the noise. Revisiting the privacy proof removes the factor.
For the digital auction, discretize the prices to $\mathcal{H} = \{\alpha, 2\alpha, \ldots, 1\}$ and score each price by its revenue $s(x, p) = p \cdot |\{i : v_i \ge p\}|$. Since $p \le 1$ and one buyer changes the count by at most one, $\Delta s \le 1$. Rounding the optimal price $p^*$ down to the grid loses at most $\alpha n$ in revenue. The accuracy theorem loses another $\ln(1/\alpha)/\eps$. Choosing $\alpha = \ln(n)/(n\eps)$, the released price earns at least $p^* - \ln(n)/\eps$, which is near-optimal revenue with the valuations never released.
Private Probably Approximately Correct (PAC) learning follows the same pattern. The input is a concept class $\mathcal{C}$ of functions $\{0,1\}^d \to \{0,1\}$ and a training set of $n$ labeled examples from an unknown target $c^* \in \mathcal{C}$. The goal is to output $\hat{c}$ with low generalization error. In the non-private baseline, with $n = \Omega(\ln|\mathcal{C}|/\alpha^2)$ samples, some concept in $\mathcal{C}$ that makes zero training errors generalizes to error at most $\alpha/2$, by Chernoff's tail bound plus a union bound over the class. The private version applies the exponential mechanism with $\mathcal{H} = \mathcal{C}$ and score $s((x, y), h) = -|\{i : h(x_i) \ne y_i\}|/n$, which has sensitivity $\Delta s = 1/n$ and optimum $0$. The accuracy theorem then needs $n = \Omega\big(2\ln|\mathcal{C}|/\alpha^2 + \ln|\mathcal{C}|/(4\alpha\eps)\big)$. The output has generalization error at most $\alpha$. Privacy costs one extra term in the sample complexity, logarithmic in the class size and inverse-linear in $\eps$.
The last application is answering a whole set $\mathcal{Q}$ of $k$ queries. The naive route splits the budget. Laplace with $\eps_i = \eps/k$ per query and basic composition gives per-query error $O(k/(\eps n))$ and a uniform error $\alpha \le O(k \ln k/(\eps n))$ over all answers. The Gaussian mechanism with advanced composition instead gives $\alpha \le O(\sqrt{k \ln k \ln(1/\delta)}/(\eps n))$, which answers $k = o(n^2)$ queries accurately. Beyond that, per-query noise is the wrong tool, so the next section changes strategy.
The exponential mechanism supports private pricing and learning by assigning each possible output a score and calculating its sensitivity. Composition extends the same privacy accounting to batches of queries.
Section 10SmallDB: A Synthetic Dataset Instead of Answers
Lecture 15.
There exists an $\eps$-DP mechanism $M$ such that for every dataset $x \in \mathcal{X}^n$, with high probability $M(x)$ answers all queries in $\mathcal{Q}$ within error
$$\alpha \le O\!\left(\left(\frac{\log|\mathcal{X}| \cdot \log|\mathcal{Q}|}{\eps n}\right)^{1/3}\right),$$which handles far more than $n^2$ queries. Moreover $M(x)$ outputs a synthetic dataset $y \in \mathcal{X}^m$ of size $m = O(\log|\mathcal{Q}|/\alpha^2)$ such that for all $q \in \mathcal{Q}$, with high probability $|q(y) - q(x)| \le \alpha$.
The mechanism is the exponential mechanism with the synthetic datasets as objects and score $s(x, y) = -\max_{q \in \mathcal{Q}} |q(y) - q(x)|$. Output each $y \in \mathcal{X}^m$ with probability proportional to $\text{weight}(y) = \exp(-\eps n \cdot \max_{q} |q(y) - q(x)|/2)$. Privacy follows from the exponential mechanism's theorem at $\eps$.
Accuracy has two halves. For existence, a random sample $y^*$ of $m$ rows from $x$ satisfies $\mathbb{E}[q(y^*)] = q(x)$. Chernoff's tail bound plus a union bound over $\mathcal{Q}$ shows that with $m = O(\log|\mathcal{Q}|/\alpha^2)$ rows, some small dataset approximates every query to within $\alpha$. For sampling, the exponential mechanism's accuracy theorem, with $\Delta s = 1/n$ and $|\mathcal{H}| = |\mathcal{X}|^m$, shows the mechanism outputs such a dataset with high probability. Substituting $\alpha/2$ for $\alpha$ and solving gives the bound in the theorem.
The downside is computational. The exponential mechanism enumerates all of $\mathcal{Y}$, so the running time is $\Omega(|\mathcal{X}|^m) = \Omega(|\mathcal{X}|^{O(\log|\mathcal{Q}|/\alpha^2)})$. Answering all conjunction queries $\mathcal{Q}^t_{\wedge}(d)$ with error tending to zero requires $n = \omega(d^2/\eps)$ this way. Private multiplicative weights is the state of the art for linear queries $q: \mathcal{X} \to [0,1]$. It reaches the same accuracy $\alpha \le O(\sqrt{\log|\mathcal{X}| \cdot \log(1/\delta) \cdot \log|\mathcal{Q}|}/(\eps n))$ in time polynomial in $|\mathcal{Q}|$, $|\mathcal{X}|$ and $n/\alpha^2$.
SmallDB answers more than $n^2$ queries by releasing a small synthetic dataset instead of individual answers. The accuracy is information-theoretically optimal. The cost is exponential running time, which the lower bounds of the next two sections show is unavoidable in the worst case.
Section 11Reconstruction: Accuracy Itself Breaks Privacy
Lecture 15.
A mechanism $M: \mathcal{X}^n \to \mathcal{Y}$ is blatantly non-private if for every $x \in \mathcal{X}^n$, one can use $M(x)$ to compute $x' \in \mathcal{X}^n$ differing from $x$ in at most $n/10$ coordinates, with high probability. It is a weak notion on purpose. It only rules out reconstructing almost the entire dataset.
Take $\mathcal{X} = \{0,1\}$, so a dataset is a vector $x \in \{0,1\}^n$. A normalized inner-product query uses a selector $q \in \{0,1\}^n$ for a subset of the population. The answer $\langle q, x\rangle/n$ measures the correlation between that subset and the attribute. These can be rewritten as counting queries.
If for each $q \in \{0,1\}^n$ one is given a value $y_q$ with $|y_q - \langle q, x\rangle/n| \le \alpha$, then the $y_q$ determine an $x'$ differing from $x$ in at most a $4\alpha$ fraction of coordinates.
Pick any consistent $x'$, which exists since $x$ itself is consistent. Set $q_x = x$ and $q_{\bar{x}} = \bar{x}$. The Hamming distance (the number of coordinates where $x$ and $x'$ differ) decomposes through the two queries:
$$\frac{d(x, x')}{n} = \frac{\langle q_x, x\rangle - \langle q_x, x'\rangle + \langle q_{\bar{x}}, x\rangle - \langle q_{\bar{x}}, x'\rangle}{n} \le 4\alpha,$$each term bounded by one copy of the error $\alpha$ on each side.
The corollary is the punchline. A mechanism answering all $2^n$ normalized inner-product queries with $\alpha \le 1/40$ is blatantly non-private, since $4\alpha \le 1/10$. Additive error $\Omega(1)$ is therefore necessary for that many queries. The SmallDB error is tight. Dinur and Nissim strengthened this to an efficient attack. For any mechanism answering all such queries with accuracy $O(\alpha n)$, an efficient attacker reconstructs all but $O(\alpha^2)$ positions using only $O(n)$ queries. That result shows the Laplace and Gaussian mechanisms are tight as well.
What went wrong. In 2019 the United States Census Bureau disclosed that its staff had reconstructed individual records for about 46% of the 2010 population from published tables alone. Table releases are themselves a leakage channel; the 2020 census moved to differential privacy.
Reconstruction also explains why the definition of section 2 is worst-case. A guarantee that held only on average over some distribution on datasets would leave unprotected the datasets on which the published statistics invert. Those are the ones an adversary targets.
Reconstruction from Noisy Subset Queries
Answers all $2^n$ subset queries on a random dataset with error at most $\alpha$, then runs the consistency census: which datasets could have produced those answers, and how far they can be from the truth.
The fundamental law of the deck: overly accurate estimates of too many statistics are blatantly non-private. For sufficiently large query families, any private mechanism must incur error or limit the queries it answers. Differential privacy makes this trade-off explicit.
Section 12Traitor Tracing and the Computational Lower Bound
Lecture 15.
SmallDB and private multiplicative weights answer far more than $n^2$ queries over $\{0,1\}^d$ when $n$ is large compared to $d$, for instance $n \ge d^2$, in time exponential in $d$. This section shows the exponential time is inherent in the worst case. The proof tool is a traitor tracing scheme for preventing piracy over a broadcast channel.
A traitor tracing scheme gives each of $n$ users a secret key $sk_i$. The broadcaster encrypts a message $m$ under a broadcast key $bk$ as $c \leftarrow \Enc(bk, m)$. Every user decrypts with $m = \Dec(sk_i, c)$. If a coalition $S \subseteq [n]$ of users pools its keys and builds a pirate decoder $\mathbf{P}$, the tracing algorithm $\Tag(tk)$, given the tracing key $tk$, identifies at least one member of the coalition with high probability. Two pirate models matter.
- A stateless pirate is a program $\mathbf{P}$ handed to the tracer, useful if it decrypts honest ciphertexts.
- A stateful pirate is queried by the tracer on ciphertexts $c_1, \ldots, c_k$. Cooperativeness requires it to keep decrypting honest ciphertexts even after seeing malformed ones.
Assuming one-way functions (functions easy to compute and infeasible to invert), there is a traitor tracing scheme secure against stateful but cooperative pirates, with tracing query complexity $k(n, d) = O(n^2)$. Consequently, every $(1, 1/10n)$-DP mechanism for answering $k = k(n+1, d)$ counting queries within error $\alpha < 1/2$ on datasets of $n$ individuals from $\mathcal{X} = \{0,1\}^d$ must run in superpolynomial time in $d$.
The reduction has four steps.
- Set up the traitor tracing scheme with $n + 1$ users.
- Build a dataset $x$ holding the secret keys of all users except one, chosen at random.
- Define the counting queries $q_c(sk_i) = \Dec(sk_i, c)$. Then $M(x)$ approximates, within $\alpha$, the number of users in $x$ whose key decrypts $c$ to $1$. For a valid encryption of $m$, rounding recovers $m$ since $\alpha < 1/2$.
- Build the pirate program $\mathbf{P}((sk_i)_{i \in S}, c_1, \ldots, c_k) = (M(x, q_{c_1}), \ldots, M(x, q_{c_k}))$. Accuracy makes $\mathbf{P}$ cooperative. Postprocessing keeps it differentially private.
Tracing now contradicts privacy. By traceability, $\Tag$ outputs some coalition member with probability close to $1$, so for large $n$ some user $i^*$ is output with probability at least $1/2n$. Remove $i^*$ from the dataset. By $(1, 1/10n)$-DP that probability drops by at most a factor $e$ plus $1/10n$, leaving at least $1/(2en) - 1/(10en) = \Omega(1/n)$. But $i^*$ is absent from the new dataset. A tracer for a secure scheme cannot identify an absent user. The contradiction forces $\mathbf{P}$ untraceable, hence superpolynomial, and $M$ with it. As a corollary, assuming one-way functions, for every $n = \poly(d)$ no polynomial-time $(1, 1/10n)$-DP mechanism answers more than $O(n^2)$ queries over $\{0,1\}^d$ within $\alpha < 1/2$. The bound is tight, since $\Omega(n^2)$ counting queries can be answered accurately in polynomial time.
The concrete scheme behind the assumption is simple. Take any symmetric encryption $(\Enc, \Dec)$. The broadcast key is $bk = (sk_1, \ldots, sk_n)$. Encrypting a bit $b$ outputs $c = (\Enc(sk_1, b), \ldots, \Enc(sk_n, b))$; user $i$ decrypts the $i$-th component. Tracing uses hybrid ciphertexts $\TrEnc(sk, i) = (\Enc(sk_1, 1), \ldots, \Enc(sk_i, 1), \Enc(sk_{i+1}, 0), \ldots, \Enc(sk_n, 0))$, under which users $j \le i$ decrypt to $1$ and users $j > i$ decrypt to $0$. The tracer encrypts columns at random cut points $i_1, \ldots, i_k$, permutes them, queries the pirate on all of them and records, for each cut $i$, the fraction $p_i$ of pirate answers equal to $1$. Since $p_0 = 0$ and $p_n = 1$, some consecutive pair satisfies $p_{i^*} - p_{i^* - 1} \ge 1/n$. This $i^*$ lies in the coalition. If it did not, the key $sk_{i^*}$ would be unknown to the pirate. Encryption security makes adjacent hybrids indistinguishable, so the pirate could only guess which column is which. With $s = O(n^2 \ln n)$ repetitions per cut, Chernoff tail bounds keep every innocent gap below $1/n$. Fingerprinting codes, which embed a traceable mark in each user's key, improve the query complexity to $O(n^2)$.
The same idea rules out efficient synthetic data. SmallDB-style mechanisms output a compact representation of all answers, which corresponds to stateless pirates. For natural query families, the construction switches to digital signatures. The dataset holds $n$ rows $(m_i, \mathbf{S}(sk^*, m_i), vk^*)$ signed under one key pair. For each verification key $vk$ one query asks what fraction of rows are valid signatures under $vk$. An efficient curator producing synthetic data accurate for $vk^*$ must include a row with a valid signature under $vk^*$. If the message is new, unforgeability is violated; if it comes from $x$, differential privacy is violated, since each $m_i$ can appear with probability at most $e^{\eps}/2^n + \delta$. Via the Probabilistically Checkable Proof (PCP) theorem the signature check can be expressed with 2-way conjunctions. The resulting theorem says that, assuming one-way functions, there is some $\alpha > 0$ for which no polynomial-time $(1, 1/10n)$-DP mechanism with $n = \poly(d)$ can output synthetic data approximating all queries in $\mathcal{Q}^2_{\wedge}(d)$ within $\alpha$.
The information-theoretic lower bounds say privacy needs noise; the computational lower bounds say noise is not the only cost. Answering more than $O(n^2)$ queries in polynomial time would break traitor tracing, hence one-way functions. Exponential time in $d$ is the price SmallDB pays for a reason.
Section 13Differential Privacy and Game Theory
Lecture 15.
Every mechanism so far assumed the data already exists. The last part of the deck asks where it comes from, meaning why anyone participates, why they report truthfully and whether participation needs compensation. This is mechanism design territory, where the inputs are held by self-interested agents and the goal is to design the rules so that truth-telling is the easy strategy.
Differential privacy gives useful game-theoretic guarantees. Approximate truthfulness survives composition. Truthfulness is approximately a dominant strategy (the best move whatever the other agents do) even for coalitions of $k$ agents, degrading by $O(k\eps)$. Both properties are hard to get in ordinary mechanism design. Both come without money.
Differential privacy makes every report approximately as good as every other report, including malicious ones. Privacy makes lying harmless, which also makes truth unnecessary. Getting people to report truthfully, once harmless lying is possible, may still require compensation. That problem is much harder.
Differential privacy also serves as a tool inside game theory. A Nash equilibrium assigns each player a strategy such that no player benefits from switching alone; a correlated equilibrium lets players condition on correlated signals, such as a traffic light, and contains every Nash equilibrium plus more. Differential privacy has applications to mechanism design with correlated equilibria, where the correlating signal must be produced without revealing any player's input.
The open end is verification. Strictly incentivizing truth-telling in private mechanism design is hard, with two exceptions: settings where responses are verifiable and settings where agents care about the outcome. The hard cases are the ones with no observed outcome at all, the prevalence of drug use or the rate of cheating in a class, where nothing outside the survey ever corroborates a report. The deck closes the chapter by naming the remaining modeling challenge of how people currently value privacy, how they should value it and what promises a mechanism can credibly make.
The final slide restates the fundamental law: overly accurate estimates of too many statistics are blatantly non-private. The lower bounds of sections 11 and 12 limit how accurately broad query classes can be answered while preserving privacy.
Section 14Further Resources
- Programming Differential Privacy (Near and Abuah). A code-first book where every chapter is executable Python with a live in-browser Binder button.
- The Algorithmic Foundations of Differential Privacy (Dwork and Roth). The canonical theory text; its chapter order matches this course.
- A friendly introduction to differential privacy (Desfontaines). Minimal math with custom diagrams, plus separate posts on delta and on local versus central Differential Privacy (DP).
- OpenDP. A production DP library with real deployment epsilon choices.
- Wikipedia: Differential privacy. The informal then formal definition, a worked database example, the Laplace mechanism and composition.
- Wikipedia: Laplace distribution. Density plots and the quantile function used for sampling.
Further reading: Vadhan (2017), The Complexity of Differential Privacy, Chapter 7 of Tutorials on the Foundations of Cryptography (Yehuda Lindell, ed.), Springer.
Section 15Exercises
Drills first, then the mechanism calculations, then the two proofs the exam is most likely to ask for. Answers are worked out in full; the arithmetic has been checked against the labs on this page.
A randomized-response survey of $n = 500$ people receives 200 YES answers. Estimate the true fraction $p$ and give the typical error. Drill
The YES fraction is $200/500 = 0.4$. The estimator inverts $\text{YES fraction} = 1/4 + p/2$, giving $\hat{p} = 2 \cdot 0.4 - 1/2 = 0.3$. The typical error is $O(1/\sqrt{n})$ by Chebyshev; numerically $1/\sqrt{500} \approx 0.045$, so the estimate is $0.3 \pm 0.045$ or so. The randomized response lab reproduces this exact run with seed control.
In the generalized randomized response mechanism with parameter $\eps = 0.1$, compute the worst-case output ratio and the resulting privacy loss. Drill
Each row is reported truthfully with probability $1/2 + \eps = 0.6$ and flipped with probability $1/2 - \eps = 0.4$. On neighboring datasets the output ratio telescopes to the changed row, whose worst case is $0.6/0.4 = 1.5$. The privacy loss is $\ln 1.5 \approx 0.405$, so the mechanism is $0.405$-DP, consistent with the deck's $O(\eps)$ statement for $\eps \le 1/4$.
A counting query runs on $n = 2000$ rows with privacy budget $\eps = 0.5$. Compute the Laplace noise scale and the error bound holding with probability $1 - \beta$ for $\beta = 0.01$. Drill
The scale is $\sigma = 1/(\eps n) = 1/(0.5 \cdot 2000) = 0.001$. The tail bound $\Pr[|z| > \ln(1/\beta)\,\sigma] \le \beta$ gives an error of at most $\ln(100) \cdot 0.001 \approx 4.605 \cdot 10^{-3}$ with probability at least $0.99$. The Laplace lab checks both numbers on a live release.
A mechanism $M$ is $0.1$-DP. What guarantee holds for two datasets differing in 5 rows? What is the total loss for running $M$ twenty times on the same dataset? Drill
For group privacy, distance $k = 5$ costs $k\eps = 0.5$-DP, so output probabilities differ by a factor of at most $e^{0.5} \approx 1.65$. For basic composition, twenty runs cost $20 \cdot 0.1 = 2$-DP, a factor of $e^2 \approx 7.39$. Both follow by chaining the definition, one row or one mechanism at a time.
For a query with $\ell_2$-sensitivity $\Delta_2 = 1$, compute the Gaussian mechanism's noise standard deviation at $\eps = 1$ and $\delta = 10^{-5}$. Drill
The scale is $\sigma = \sqrt{2 \ln(1.25/\delta)} \cdot \Delta_2 / \eps$. With $\delta = 10^{-5}$, $\ln(1.25 \cdot 10^{5}) = \ln 1.25 + 5 \ln 10 \approx 0.223 + 11.513 = 11.736$, so $\sigma = \sqrt{2 \cdot 11.736} \approx \sqrt{23.47} \approx 4.84$. Compare Laplace at the same $\eps$, which would use scale $1/\eps = 1$ per coordinate for $\ell_1$-sensitivity $1$. The Gaussian mechanism is paying the $\delta$ slack in larger per-coordinate noise here, and wins once the dimension makes $\Delta_1$ much larger than $\Delta_2$.
Compose $k = 10^4$ mechanisms, each $(0.01, 0)$-DP, with advanced-composition slack $\delta' = 10^{-5}$. Compute the basic and advanced totals, then read off the saving. Calculation
Basic composition gives $k\eps = 100$. Advanced composition gives two terms. The first is $\eps\sqrt{2k \ln(1/\delta')} = 0.01 \cdot \sqrt{2 \cdot 10^4 \cdot 11.513} = 0.01 \cdot \sqrt{230258} \approx 0.01 \cdot 479.9 \approx 4.80$. The second is $k\eps \cdot (e^{\eps} - 1)/(e^{\eps} + 1)$; the fraction is $\tanh(\eps/2) = \tanh(0.005) \approx 0.005$, so the term is about $100 \cdot 0.005 = 0.5$. The advanced total is about $5.3$ at $\tilde{\delta} = 10^{-5}$, roughly a factor of 19 cheaper than the basic bound. The composition lab sweeps these parameters.
Show that the revenue score $s(x, p) = p \cdot |\{i : v_i \ge p\}|$ of the digital auction has sensitivity $\Delta s \le 1$, then state the resulting privacy of the exponential mechanism on it. Proof
Neighboring datasets differ in one buyer's valuation. For a fixed price $p$, the count $|\{i : v_i \ge p\}|$ changes by at most one, so the revenue changes by at most $p \cdot 1 \le 1$ since prices lie in $[0, 1]$. Hence $\Delta s \le 1$. The exponential mechanism sampling prices with weight $\exp(\eps \cdot s(x, p)/2)$ is $\eps$-DP by the privacy theorem of section 8. The accuracy theorem then gives revenue within $\ln(n)/\eps$ of optimal at the deck's choice of discretization.
Reproduce the reconstruction bound: given answers $y_q$ to all subset queries with error at most $\alpha$, show that any consistent $x'$ satisfies $d(x, x')/n \le 4\alpha$, then evaluate it at $\alpha = 1/40$. Proof
Take $q_x = x$ and $q_{\bar{x}} = \bar{x}$. Consistency gives four error bounds: $|y_{q_x} - \langle q_x, x\rangle/n| \le \alpha$, $|y_{q_x} - \langle q_x, x'\rangle/n| \le \alpha$. Apply the same pair of bounds to $q_{\bar{x}}$. The Hamming distance decomposes as
$$\frac{d(x, x')}{n} = \frac{\langle q_x, x\rangle - \langle q_x, x'\rangle}{n} + \frac{\langle q_{\bar{x}}, x\rangle - \langle q_{\bar{x}}, x'\rangle}{n},$$and each of the two differences is at most $2\alpha$ by a triangle inequality through the released value, for a total of $4\alpha$. At $\alpha = 1/40$ that is $1/10$. Any consistent candidate agrees with $x$ on at least $90\%$ of the rows, which is blatant non-privacy by definition. The reconstruction lab runs the full census and shows the bound holding on small datasets.
These pages are written by a student of the course. The mathematics is stated in the standard way. The formulation is the author's own, taken from no slide. Errors are the author's alone. Prof. Venturi bears no responsibility for them; where this page and the PDFs differ, the PDFs are authoritative and only material in them is examinable.