Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Multilinear extensions and sum-check

Sum-check lets Akita prove a sum over an exponentially large table without putting that table in the proof. It replaces one claim about all table entries with short polynomial messages and one final evaluation claim.

This chapter builds the protocol from a four-entry example. It then explains the compressed messages and unequal-size batching used by the implementation.

A table is also a polynomial

Consider a table indexed by two bits:

002
105
017
1111

There is exactly one polynomial that agrees with this table on the four Boolean points and has degree at most one in each variable. It is the multilinear extension of the table:

The four terms are selectors. At , for example, only the second selector is one, so the polynomial returns .

The general selector for two Boolean vectors is

It is one when and zero at every other Boolean point. For a table , its multilinear extension is therefore

The polynomial also accepts field values that are not bits. This is what makes it useful in a proof. The verifier can derive a random field point from the transcript and ask for one value there.

Table order in Akita

Akita stores Boolean tables in little-endian order. Coordinate is the least significant index bit, so adjacent entries differ in . The example above is stored as [2, 5, 7, 11].

Binding replaces each adjacent pair with

The four-entry table becomes a two-entry table. Binding the next coordinate leaves one value, which is . The implementation calls this operation a fold.

multilinear_eval in akita-algebra/src/poly.rs evaluates a table this way. fold_evals_in_place provides the mutable fold used throughout prover code. EqPolynomial in akita-algebra/src/eq_poly.rs builds the equality selectors in the same index order.

What sum-check proves

Suppose the prover claims

where has degree at most in each variable. Directly checking the claim would take evaluations. Sum-check reduces it one variable at a time.

In round zero, the prover sends the univariate polynomial

The verifier checks

It then samples a challenge from the transcript and replaces the claim with . Round one does the same for the next variable:

After rounds, every variable has been bound. The verifier checks the final claim against , computed from the protocol's final oracle values. The large Boolean sum has become one evaluation at a random point.

A complete two-round example

Return to the table [2, 5, 7, 11]. Its claimed Boolean sum is

The first round polynomial sums over :

The verifier checks . Suppose its first challenge is . The new claim is .

The second round polynomial is

Again, . If the next challenge is , the final claim is . Evaluating the original multilinear extension at also gives .

Real challenges are unpredictable field elements derived from the transcript. Small integers are used here only to make every step visible.

Why a false claim is caught

At the start of a round, the previous claim fixes the sum . The prover may try to send a different degree- polynomial that has the same sum. Two distinct degree- polynomials agree at no more than field points. A fresh random challenge therefore exposes that substitution except with probability at most in that round.

Across rounds, the usual bound is

Akita chooses large challenge fields, so this algebraic error is small. The complete security argument also accounts for transcript challenges, commitment binding, and every other reduction. Those pieces are assembled in Security model and parameters.

The extraction argument uses a related fact. A degree- round polynomial is determined by distinct evaluations. If an extractor can obtain accepting continuations from the same transcript prefix, it can reconstruct that round polynomial. This is the special-soundness property used when sum-check is connected to commitment binding.

Akita sends one fewer coefficient

Write a round polynomial as

The verifier already knows the current claim . Since

the linear coefficient is determined by

The proof sends only [c0, c2, ..., cd]. The verifier recovers the missing linear contribution while evaluating the message at the next challenge. This saves one field element in every round without changing the protocol.

The types UnivariatePoly and CompressedPoly in jolt-poly own this rule. akita-serialization preserves Akita's wire encoding. Proof decoding is headerless: the verifier derives each expected coefficient count from the proof shape rather than trusting a length supplied by the proof.

Every ordinary round message must retain at least its constant coefficient. The prover compresses the zero polynomial to [0], including when its full coefficient vector is empty. An empty compressed message is malformed: the verifier cannot use it to reconstruct the linear coefficient from the incoming claim. Both ordinary sum-check drivers check the round count, nonempty messages, and degree bounds before absorbing any data in their own replay. A caller may already have absorbed the public statement or batching data before entering a driver.

A single stored coefficient can still represent a linear polynomial, so its degree estimate is one. Ordinary rounds require a degree bound of at least one, even for constant polynomials. A zero-round proof instead has no messages and leaves the input claim for the final oracle check. These rules differ from equality-factored sum-check, where a valid constant inner polynomial has an empty message and its constant term is recovered from the normalized claim.

Batching several claims

Akita often needs several sum-checks at the same point in the protocol. Running them separately would repeat challenges and round messages. Instead, the transcript derives one random coefficient for each instance and the prover sends the linear combination of their round polynomials.

If all instances have the same number of variables, their initial claims combine as

The same coefficients combine every round polynomial and the final oracle values. A false component is therefore hidden only if the random linear combination happens to cancel it.

Instances with different numbers of variables

The current implementation right-aligns every instance in the longest challenge vector. If the longest instance has variables and one shorter instance has variables, the shorter instance receives constant dummy rounds before its first real round.

A dummy polynomial for running claim is the constant . Its two Boolean evaluations sum to , and evaluating it at any challenge returns . After all dummy rounds, the claim has been divided by . Therefore the batch starts that instance at

The dummy rounds reduce it back to exactly when the instance becomes active. Its real variables then use the suffix

of the shared challenge vector. This is the offset = max_num_rounds - n rule in batched_sumcheck.rs.

Where to inspect the implementation

RuleImplementation
Evaluate a multilinear tableakita-algebra/src/poly.rs
Build equality-polynomial tablesakita-algebra/src/eq_poly.rs
Represent and compress round polynomialsjolt-poly/src/univariate.rs and jolt-poly/src/compressed_univariate.rs
Define prover and verifier instance contractsakita-sumcheck/src/traits.rs
Encode proofs and verify ordinary roundsakita-sumcheck/src/types.rs
Batch claims and right-align shorter instancesakita-sumcheck/src/batched_sumcheck.rs

For a review, check these facts together:

  1. Table indexing and challenge order agree.
  2. Every round polynomial respects the declared degree bound.
  3. The transcript absorbs the claim and round message before sampling the challenge that depends on it.
  4. Proof decoding derives the round count and message width from trusted configuration.
  5. The final output claim is compared with the expected oracle evaluation.
  6. Batched instances use the same coefficients, offsets, and challenge slices on the prover and verifier paths.

The next chapter explains the specialized form used when every summand contains a known equality polynomial.