Dual Spaces
The dual space collects every continuous way to read a vector as a single number. Each readout is linear, each has a size, and together they see everything the primal space contains.
Why Does This Exist?
Optimization constraints, weak formulations of PDEs and attention scores all read vectors as scalars: a price times a quantity, a test function against a solution, a query against a key. The dual space organizes every such readout into a space of its own, with its own norm, so duality arguments (certificates, adjoints, biduals) run on rails.
This page defines the dual and computes one dual norm exactly. The finite-dimensional picture it generalizes is orthogonality and projections; rank language is in vector spaces and rank.
The one idea you need first
A linear functional maps vectors to scalars with . Continuous means bounded: . The dual keeps exactly the continuous ones.
Think of It Like This
Price tags on grocery shelves
Groceries are vectors (apples, bread, milk). A price tag is a functional: it reads any basket as one number, the total, linearly (twice the basket costs twice as much). The wall of all possible price tags is the dual space.
Some tags are wild (infinite on normal baskets): those are discontinuous and expelled. Where it stops: groceries live once, but tags can tag tags. That second wall, the bidual, sometimes matches the shop and sometimes dwarfs it (non-reflexive spaces).
How It Actually Works
The dual space holds all continuous linear functionals (or ), with the dual norm:
In plain words: the biggest readout over the unit ball. is always Banach, even when is not. Hahn-Banach extends functionals from subspaces without growing their norm, so the dual always separates points: for some unit functional reads off it. On Hilbert space, Riesz says every functional is inner product with one vector (, ).
Worked example
On with Euclidean norm, . By Cauchy-Schwarz, with , and attains it. So .
At : . The cap holds with room to spare.
Code
The dual norm of a coordinate functional is the representing vector's length.
import numpy as np
def dual_norm(w: np.ndarray) -> float: return float(np.linalg.norm(w)) # Riesz: functional norm equals vector norm
w = np.array([2.0, -1.0, 0.5])print(round(dual_norm(w), 3)) # -> 2.291print(float(w @ np.array([1.0, 0.0, 2.0]))) # -> 3.0Norm , readout : pairing and cap exactly as computed by hand.
Watch Out For
Assuming the dual looks like the primal
Symptom: treating as (it is ) or as (it is ), then missing functionals. Fix: memorize the three shifts (, with ); only Hilbert and reflexive () mirror cleanly.
Using discontinuous functionals as if bounded
Symptom: pointwise evaluation on (Dirac delta) treated as a continuous readout; approximations blow up. Fix: deltas are not -continuous; move to the Sobolev dual or use mollified evaluation with explicit width.
The Quick Version
- The dual collects continuous linear readouts with the sup-over-unit-ball norm.
- is always Banach; Hahn-Banach guarantees it separates every point.
- On Hilbert space each functional is inner product with one vector of equal norm.
- has dual norm .
- : duals shift exponents, rarely mirroring the primal.