Learn / Math / Bilinear Pairings
13. Bilinear Pairings
Groups & Curves · Lesson 14 of 18 · 3:28
The operation that makes Groth16 verification and KZG commitments actually work — a strange map that takes two points from two separate elliptic curve groups and connects them to a completely different group underneath.

The last lesson built elliptic curves: point addition, and scalar multiplication. Today builds the operation that makes Groth16 verification and KZG commitments actually work — the bilinear pairing. It’s a strange operation that takes two points and connects two completely separate worlds.

The big picture

A pairing is best understood as a bridge between two separate elliptic curve groups, landing somewhere entirely different on the other side.

P point in G₁ Q point in G₂ e(P, Q) GROUP Gₜ the multiplicative group of a finite field
Fig. 1 — P lives in G₁, Q lives in G₂, two separate elliptic curve groups. The pairing e(P, Q) bridges them into a third group, Gₜ, underneath.

It’s worth being precise about which group each piece actually belongs to, since PP, QQ, and the result are all different kinds of object: PP is a point in G1G_1, QQ is a point in G2G_2, and the output e(P,Q)e(P, Q) lands in a completely different group, GTG_T.

What Gₜ actually is

The output of a pairing is not a point on either curve — it’s a different kind of object entirely. GTG_T is the multiplicative group of a finite field: e(P,Q)e(P, Q) is a number, not a point.

What “bilinear” means

The word bilinear refers to one very specific, very useful algebraic property this operation has.

Bilinearity

e(a⋅P, b⋅Q)=e(P,Q)abe(a \cdot P,\ b \cdot Q) = e(P, Q)^{ab}

Scalars multiplied inside the pairing come back out as an exponent on the outside.

A numeric feel for it

A made-up number makes that scaling behavior concrete.

a numeric feel for it say e(P, Q) comes out to the number 5 e(2·P, Q) = 5² = 25 e(P, 3·Q) = 5³ = 125 e(2·P, 3·Q) = 5⁶ = 15,625 the scalars 2 and 3 multiply together in the exponent
Fig. 2 — if e(P, Q) happens to equal 5, scaling either input scales the exponent, and scaling both multiplies the two scalars together in that exponent.

Why this matters for ZK

Here’s the payoff: the bilinear property lets a verifier confirm a hidden multiplication happened correctly, without ever learning the actual numbers involved.

check a hidden multiplicative relationship between scalars the verifier never actually sees e(A,B) = e(C,D) ⇒ a·b = c·d this single check is how Groth16 and KZG verify a proof
Fig. 3 — checking e(A, B) = e(C, D) confirms a·b = c·d, without the verifier ever seeing a, b, c, or d.

That single check — one pairing equality, standing in for a multiplication the verifier never actually sees — is how Groth16 and KZG verify a proof.