Revdot Folding
The split accumulation chapter sorted the verifier's work by what it reads, and it folded the evaluation claims. One row of its table stayed open, which was the revdot product . That product reads two whole witness vectors, so a recursive verifier cannot compute it, and this chapter folds it instead.
A revdot claim contains a product of two unknown vectors, so it does not combine linearly as an evaluation claim does. Chapter 12 ended with the first sign of this, a cross term that the prover has to supply. We start from that example and find that its single challenge stops working at three claims. Repairing it leads to the error matrix and the challenges and . We then remove the two costs that this fold would place in a circuit, namely the commitment sums and the quadratic field arithmetic, and we finish with the different fold that Ragu's code runs at each step.
The Ragu Book and the code differ here
Book, revdot chapter: an error matrix with two challenges per layer, and for 133 claims.
Code at 3219e08, and the book's recursion chapter and endoscalar ledger: the fuse uses a quotient fold with one challenge per layer, and on the native side. Compression still uses an error matrix.
This site follows the code for what Ragu does. Sections 2 to 9 nevertheless teach the matrix, because it is the general construction, compression needs it, and the quotient fold is easiest to understand as a change to it. Section 10 makes that change, and Section 11 compares all the forms.
Reconstructed from code at commit 3219e08, not confirmed by the authors
The toy runs and the attacks are our own, checked by the script behind this page. The gate counts for the code's fold in Section 10 are our reading of its functions, and the authors have not published them. The code's comments credit the quotient identity to ProtoGalaxy, which we could not read, so we derive the identity here without relying on that paper.
Terminology
The book writes for the number of claims. Here remains the number of gates, as in every earlier chapter, so we write for the number of claims. The book uses "cross term" and "error term" interchangeably for an off-diagonal product. The code says "error terms" for the quotient coefficients of Section 10, which are different numbers, so we say cross term for a product and quotient coefficient for the code's values. The book's spot-check point is called , which is also the batching challenge of chapter 08, so we rename the spot-check point . We continue to say that claims fold and that a fuse is the PCD operation containing the folds.
1. The claim that remains
A step of the proof from chapter 09 ends up holding two commitments and a target value, and it needs to know that the committed vectors have that revdot product. Following the book's relation, a revdot claim has the instance and the witness , and it holds when
Chapter 09's proof gives the instance and the witness , , , . Checking the claim takes both parts. The two commitments recompute to the stated points, and .
The earlier chapters offer two ways to check such a claim, and each has a cost in the wrong place:
| Route | Who pays | Work for one claim, | What travels |
|---|---|---|---|
| Direct check (chapter 09) | Verifier | 8,192 field multiplications and 2 MSMs of size 8,192 | Both vectors |
| Split (chapter 05) | Prover | At least 3 FFTs over 16,384 points, about 114,688 multiplications each | Two commitments and a few values |
The direct check cannot go in a circuit, since a recursive verifier reads only instances. The split suits a verifier, but the prover would run its FFTs at every step of a long computation, and the book wants to confine that to the places in the tree where a short proof is needed.
Chapter 12 suggests a third route, in which we reduce many claims to one claim of the same form and leave the last one to a decider. The reduction has to handle many claims at once, because a fuse in Ragu's standard profile has 86 native and 72 nested revdot claims. The book names their sources, which are the consolidated equation of each circuit, the stage checks, and the accumulators of the previous step.
Chapter 09 listed two linear costs as targets for this part of the site. This chapter does not address either of them directly. The cost of already left the recursive path in chapter 12. The cost of computing remains after this chapter too, because a fold says nothing about whether was built from the right circuit, and the wiring chapter deals with that. What this chapter removes is the need for the split and its FFTs at most steps, as chapter 09 promised.
2. Two claims and one cross term
Start with two claims and weight the second by a challenge , as chapter 12 did. The commitments combine by linearity, so anyone can compute and . The value needs more care, because the revdot product is linear in each argument separately. Expanding both arguments gives four products:
The outer two products are the claimed values, which the verifier holds. The middle two involve one claim's and the other claim's , which no claim says anything about, so the prover supplies their sum .
Chapter 12 used inner products, so we reverse its vectors to write the same numbers as revdot products. Take , with , and , with . The two products that mix the claims are and , so modulo 43, as chapter 12 found. At the folded vectors are and , their revdot product is , and .
The new claim is , which has the same form as the old ones. The prover has to send before it learns , and the next count shows why:
Suppose the prover states the false . The two sides then differ by , where is the value it sends. We tried all 43 values of against all 43 values of . The honest never passes, and each of the other 42 values passes at exactly one . If the prover could choose after seeing , then it could solve this linear equation and pass every time.
So a false claim survives only if lands on one root. The argument is the root count of chapter 03, applied to a polynomial in whose constant term is the false claim's error.
3. Three claims break the single challenge
The natural extension gives claim the weight on both sides. Bilinearity gives one product for each pair, and we write the products as
Expanding for and collecting powers of gives
Look at the coefficient of . It adds the claim to two cross terms, and the verifier can check only this sum. If is false, the prover can move the error into a cross term, which it controls, and the polynomial in stays exactly right. To see this we need real claims, so we take three proofs of the step function from chapter 12's chain:
| Claim | Statement | |||||
|---|---|---|---|---|---|---|
| 0 | 13 | |||||
| 1 | 35 | |||||
| 2 | 39 |
The first two rows are the claims printed in chapters 09 and 12. The third row uses its own blinding factors, since this curve has so few points that repeated factors can land two different vectors on one commitment. Now we attack the fold:
Put chapter 09's false witness with in the middle slot, between the two later proofs of the table above. Its vectors give while its statement requires , so this claim is false by . The honest cross terms are , and , and the fold rejects at all 42 nonzero values of . The cheater sends instead, before it knows . At both sides equal , and running all 43 values of gives 43 passes. The output is a true claim, because the vectors and really have that revdot product, so the decider accepts it too.
The challenge did nothing here, because the error and its cancellation carried the same power of for every . Two claims escaped this problem because each of their diagonal entries has a power of to itself, and that stops being true at three claims. We therefore need weights under which no cross term can share a monomial with a diagonal entry.
4. Two challenges and the error matrix
Give the two sides independent weights, say on and on . Bilinearity gives
With and for two independent challenges, every cell has its own monomial , and the collision disappears. The book makes the same choice in a different form. It takes two challenges and , and it sets
so that and . Multiplying the weights gives
On the diagonal cancels and the weight is . The pair of exponents determines the cell , so no two cells share a monomial. The array of all the is called the error matrix. The folded claim is
where the verifier fills the diagonal of the last sum with its own and the prover supplies the other entries.

We can test the repair against the attack that just succeeded:
We replay the cheat of Section 3, with the same false claim and the same shift of on the cross term in cell . The diagonal error now has weight and the shift has weight , so the two cancel only where or . Across all 1,806 pairs with the fold passes at 84, which is 0.047 of them. Half of those have , where reduces to and the other claims drop out of the check.
Section 9 counts the cheater's other options, and Section 11 shows that the book's other chapters write the same family of weights in other ways.
5. One fold on the toy curve
Here are the book's steps, in the order that the argument above requires:
Take the three true claims of Section 3. The prover computes the error matrix. The bold entries match the in the instances, so the prover leaves them out of its message and sends the other six.
| 13 | 37 | 19 | |
| 35 | 35 | 27 | |
| 36 | 27 | 39 |
The verifier sends and , so and . The weights on the are , and the weights on the are . Each cell of the next table is the matching weight times the entry above:
| 13 | 5 | 12 | |
| 13 | 25 | 30 | |
| 1 | 37 | 12 |
All nine cells sum to .
Both parties then finish their sides, and each part of the new claim comes from the same weights:
| Part | Computed from | Result |
|---|---|---|
| The nine cells above | 19 | |
| Prover, the same weights on the vectors | ||
| Prover, the same weights on the vectors | ||
| Prover, the same weights on the blinding factors |
The verifier's three rows touch only instances and cross terms. The blinding factors follow the vectors because each commitment is linear in its vector and its blinding factor together, as chapter 06 showed.
The decider now has one claim to check. It computes , which equals , and it recomputes both commitments, which gives and . Three revdot products and six commitment checks have become one and two.
An honest prover should pass whatever the challenges are, and it does:
Repeating the fold for all 1,806 pairs with gives a true output claim every time.
6. An accumulator of revdot claims
The output has the same form as each input, so it can serve as an accumulator. The book says exactly this. The instance of the accumulator is and its witness is , and each step places the old accumulator in the list along with the step's new claims. This explains the two names chapter 09 kept apart, since holds one step's trace while can hold an aggregate of many claims.
The accumulator sits beside the one from chapter 12, and the book lists both in the accumulator of one curve. Here is a chain over the first three proofs, which folds one new claim at each step:
| Step | New claim from | Cross terms | Accumulator instance | |||
|---|---|---|---|---|---|---|
| Start | Proof of | |||||
| Fold 1 | Proof of | |||||
| Fold 2 | Proof of |
Every vector still has 8 entries, because each fold takes a linear combination of vectors of that length. Suppose the chain stops here:
The decider receives the last accumulator. It finds , and with and both commitments recompute to the instance. It accepts.
The decider's work is two MSMs of size and one revdot product, once for the whole history. The prover pays for the cross terms at each step, and we can compare that with the alternative it avoids:
A fold of one accumulator and one new claim needs cross terms, at 8,192 multiplications each for dense vectors of entries, so 16,384 multiplications. The split of chapter 05 needs at least 3 FFTs of about 114,688 multiplications each, or 344,064, and then the prover still has to commit to two more polynomials.
The second figure counts radix-2 FFTs at multiplications over points, which is the usual estimate. The fold needs no product polynomial, since each cross term is one number computed with one pass over the vectors, and so most steps never run an FFT. The split comes back only in Section 11, where a proof leaves the tree.
7. Replacing the commitment sums with evaluations
The verifier of Section 5 computes and , which takes scalar multiplications. Inside a circuit those are operations on points whose coordinates lie in the wrong field. Chapter 13 could defer each one to the other circuit, but the book takes a different route that reuses a mechanism we already have.
The relation between commitments says that the polynomials behind them satisfy , as long as the commitments are binding. An identity between polynomials can be tested at a random point. So the prover names without the verifier computing it, the verifier sends a random , and the prover reports the values and . The verifier then checks
This is field arithmetic, which a circuit handles natively. It only means something if the reported values are true, so each value becomes an evaluation claim, for each and for the output. The side works in the same way. That makes claims, which join the list that chapter 12's accumulator folds anyway.
Take for the fold of Section 5. The prover sends these values:
| Polynomial | Value at | Weight | Polynomial | Value at | Weight |
|---|---|---|---|---|---|
| 16 | 1 | 39 | 1 | ||
| 5 | 36 | 8 | 35 | ||
| 6 | 6 | 1 | 21 | ||
| 17 | 39 |
Field arithmetic alone confirms both sums: and modulo 43.
The list now holds 8 claims, all at the single point . Running the fold of chapter 12 with , and gives , and the output . Its witness with commits to the same point and evaluates to the same value.
The challenge has to come after the prover names and , for the reason that every test at a random point needs. A wrong commitment shows up as a nonzero difference polynomial:
Suppose the prover names , a commitment to with its entry 4 raised by one, and reports true values for it. The linear check then fails at every except 0. A difference that vanishes at does as well as a difference can, and it passes at those 7 of the 43 values. Outside those roots the prover has to report a false value at , which makes that entry of the list a false evaluation claim for chapter 08 to catch.
The saving comes from how chapter 08's batching charges for its inputs. Its point combination takes one scalar multiplication per polynomial, however many points that polynomial is queried at, and the book makes this argument for why the total falls:
For the fold above with , computing the commitment sums directly takes scalar multiplications in the circuit. In the batched form each of the 8 polynomials takes one power of , so the proof's own and cost nothing extra when the list already contains them, and only and are new. That makes new scalar multiplications in place of , and they happen in the circuit on the other curve.
8. Two layers
The circuit still has to compute , which has terms. Factoring the weights lets it compute each level of the sum by repeated multiply-and-add, which is Horner's rule:
Each inner sum over entries takes multiplications, and the outer sum takes more, for a total of . Precomputing and adds two, which gives the book's constraints.
For the matrix of Section 5, the three inner sums at are , which take multiplications per row. The outer sum at takes more and gives , the same value as before. That is multiplications, plus the that precomputed and .
Quadratic growth is a problem because of the limit of gates per circuit. The book's example of 133 claims would need far more than that, and it notes that smaller circuits also lead to smaller commitments and faster verifiers later on. Since the cost is the square of the list's length, shorter lists help, so we can fold in stages.
The two-layer reduction
Divide the claims into groups of claims each. The book's steps are then as follows:
- First layer. The prover sends the cross terms within each group, which are values. The verifier sends and . Applying Section 4 to each group gives one intermediate claim .
- Second layer. The prover computes the cross terms between the intermediate claims and sends these values. The verifier sends fresh challenges and . Applying Section 4 to the intermediate claims gives the final claim.
The second layer's diagonal consists of the values , which the verifier computed in the first layer. Cross terms between claims in different groups never appear individually. They are bundled into the , which is why the count drops.

A run with six claims
We extend the chain to six proofs and take :
| Group | Slot | Statement | |||
|---|---|---|---|---|---|
| 0 | 0 | 13 | |||
| 0 | 1 | 35 | |||
| 0 | 2 | 39 | |||
| 1 | 0 | 3 | |||
| 1 | 1 | 7 | |||
| 1 | 2 | 38 |
The prover sends cross terms, listed row by row with the diagonal left out. The verifier then sends and , and both sides compute one intermediate instance per group. Group 0 holds the claims of Section 5, so its result is the one we already found.
| Group | Cross terms | |||
|---|---|---|---|---|
| 0 | 37; 19; 35; 27; 36; 27 | 19 | ||
| 1 | 31; 22; 9; 13; 13; 12 | 1 |
The prover now computes the cross terms between the two intermediate claims, and , and sends them. The verifier sends fresh challenges and . The diagonal entries are the that both sides already hold, so modulo 43.
The final instance is . The prover's vectors are and , whose revdot product is , and the decider accepts. The prover sent cross terms, where a single layer over six claims would have needed . The book's count for is constraints against .
Choosing M and N
Applying Horner's rule at each layer gives the book's count. The first layer costs for its groups plus for the precomputed values, and the second costs plus . The total is
The term favours small groups and the term favours few groups, so a balance exists:
| Room for | Constraints | ||
|---|---|---|---|
| One layer | 133 | 17,690 | |
| 133 | 2,572 | ||
| 136 | 1,363 | ||
| 133 | 1,276 | ||
| 138 | 1,337 | ||
| 135 | 1,380 |
Among all from 2 to 66, each with the smallest that gives room for 133 claims, the book's pair has the lowest count, 1,276. That is 93% below the single layer, and the book reports the same two counts.
9. Why cheating fails
This argument is informal. The toy curve permits forgeries, since every discrete log is known, so the counts below model a prover who holds real vectors and does not use those relations, except in the last example.
A false claim with honest cross terms
Take the false list of Section 3 and let the prover send every cross term honestly. The stated then differs from the true product by the diagonal error alone, , which is zero only at . The fold passes at 42 of the 1,806 pairs, all of them with , where the second and third claims drop out.
Those passes are a real weakness of , but a random challenge rarely takes that value. A false claim in slot 0 has weight and no such exception.
Choosing the cross terms
A cheater can also move the cross terms away from their honest values. The difference between the two sides then becomes a polynomial in and , nonzero because of the diagonal error, and multiplying by clears the negative powers and leaves total degree at most . The Schwartz–Zippel bound therefore allows at most of the pairs. The best attack we found raises by and by . The difference becomes , which vanishes for every at and , and it passes at 126 of the 1,806 pairs. The best of 300 random choices of offsets passes at 83.
On a 255-bit field, gives a bound of , which is below .
Sending cross terms after the challenges
Every count so far assumes that the prover fixes its cross terms first, which in a non-interactive proof means that the transcript absorbs them before it produces and :
At and , the false list fails with honest cross terms. A prover who already knows these challenges raises by , which solves one linear equation, and the fold passes. The same shift committed in advance passes at only 84 of the 1,806 pairs.
Two layers and fresh challenges
A false claim survives the first layer as a false intermediate claim, which the second layer then treats as an ordinary false claim in its diagonal:
Now place the false claim in group 0 of the six-claim run, with honest cross terms. At and the group's stated value differs from the true product by , and over all pairs the first layer passes at 42 of 1,806. That error sits in a diagonal slot of the second layer, in the group with weight 1, so with honest cross terms the second layer passes at 0 of its 1,806 pairs.
The book explains the fresh challenges by noting that the root-counting argument applies separately at each layer. That argument needs each layer's messages to come before that layer's challenges, and the second layer's messages depend on the first layer's result, so reusing the challenges breaks the order:
Suppose the second layer reused and . The prover learns them before it sends the second layer's cross terms, so it can compute the error in and cancel it through . At and the shift is . Doing this at every pair with passes all 1,764 of them. With fresh challenges the same message is fixed first, and it passes at 42 of the 1,806 pairs .
A false claim reaches the decider
As in chapter 12, the verifier checks arithmetic and has no way to know that a claim is true:
Start the chain of Section 6 from the false claim in place of the true one, keeping every later step honest.
| Step | Stated | True | Stated minus true |
|---|---|---|---|
| Start | 13 | 18 | 38 |
| Fold 1 | 7 | 12 | 38 |
| Fold 2 | 41 | 3 | 38 |
The verifier computes each new instance and sees nothing wrong. The accumulator sits in slot 0, whose diagonal weight is , so the gap of passes through each fold unchanged. The decider rejects the last accumulator because its product differs from its stated value.
A chain that never runs the decider has therefore established nothing about its revdot claims. The target of a new claim must also come from the statement and not from the prover, which is the lesson of chapter 09, and the old accumulator's instance must be tied to the previous proof, as chapter 12 showed. A comment in the code records the first of these two requirements.
Binding at the decider
The decider's check means something only because can be opened in one way:
Using the known discrete logs of the toy generators, a prover can state the false for the fold of Section 5 and present . This vector commits to the same , and its revdot product with is , so the decider accepts it.
On a real curve, such a vector would give a discrete log relation among the generators.
Assumptions
The reasoning relies on the discrete log relation assumption, and it treats the transcript hash as a random oracle, with each challenge drawn after the data it tests. It assumes that the circuit takes each target from the statement or the previous proof, and that the decider runs honestly. Private retries under Fiat–Shamir add to these chances. We do not analyse Ragu's scheme as a whole here.
10. The quotient fold in Ragu's fuse
The matrix has one remaining cost, which the table at the end of this section measures. The prover sends one field element per off-diagonal cell, and each of those values enters the circuit. The verifier uses them only through the weighted sum , so we can ask whether a shorter message could determine that sum. The code at 3219e08 answers this by changing the weights.
The derivation
Treat the claims as the values of one curve through the points . Let be the Lagrange basis polynomial that equals 1 at and 0 at the other nodes, and define
For three claims the nodes are , and the basis polynomials over have these coefficients of : , and . The vanishing polynomial is , with coefficients .
At the node these reduce to , and . So the difference
equals at node , and it vanishes at every node exactly when all the claims are true. A polynomial that vanishes at all nodes is a multiple of . Bilinearity gives the first term of as
which has degree at most . Since has degree , the quotient has degree at most , and therefore only coefficients. This is the shorter message. The prover sends the coefficients of , and the verifier sends one challenge . Evaluating at gives the new claim, with weights on both sides:
The value is right because . Notice that the prover's work has not shrunk, since the sum over still needs every product, including the diagonal.
A run with three claims
We reuse the matrix of Section 5, so the two folds can be compared directly:
Using the matrix of Section 5 in the expansion gives the coefficients of below.
| Polynomial | Coefficients |
|---|---|
Dividing by leaves no remainder and gives . The prover commits to these two coefficients before it sees the challenge.
The verifier sends . The three weights are , which gives , and the same weights apply on both sides, so and . The verifier computes , and , so the new value is . The prover's folded vectors are and , and their revdot product is . All 43 values of pass for these honest claims. The prover sent two field elements where the error matrix needed six.
Why one challenge is enough
Section 3 showed that one challenge with weights fails, so we need to see what has changed. Suppose claim is false. For any quotient the prover might send, the difference between the two sides is
and at node the last term vanishes because . The difference there equals , which is not zero. So no choice of can make this polynomial zero, and it has at most roots. In Section 3 the prover's message shared a power of with the false claim and could cancel it. Here the message is multiplied by , which is zero at the place where the false claim shows up.
Take the false list of Section 3, with slot 1 false by . We tried all values of the two quotient coefficients against all 43 values of . The best choice passes at 4 values of , which is the bound . Every choice passes at and , because at a node the weights select one claim and vanishes, so the fold checks only the claim in that slot. No choice passes at , the node of the false claim.
The passes at nodes show the fold's weak spot. The code's comments note it too, and they rely on a challenge hitting a node only with probability . The message order matters as before:
At the cheater needs , and one linear equation in the two coefficients provides it. This is why the code fixes the quotient before the challenge.
The code's comments give each layer a failure bound of for a challenge uniform on a set , and they put the nested challenges at . The largest reduction on the nested side has , which gives , and that is below .
Two layers in the code
The code still folds in two layers. The second layer treats the groups' values as its targets and has a fresh challenge :
For the six claims of Section 8 with the groups unchanged, the first layer commits to and . At the groups give values and . The second layer has two inputs, so its quotient has the single coefficient . At the final value is , which equals the revdot product of the final vectors. The prover sent field elements, where Section 8 sent 14.
Its comments give the reason for keeping two layers. The number of carried coefficients is for any split of a budget of slots, while the prover's count of revdot products depends on the split, and the choice of seven per group sits near the minimum. So the two layers now serve the prover more than the circuit. The next table applies the counts to the native parameters:
| For 98 slots, | Book's two-layer error matrix | Code's quotient fold | Quotient fold with one layer |
|---|---|---|---|
| Field elements the prover commits to | 770 | 97 | 97 |
| Revdot products the prover computes | 770 | 882 | 9,604 |
| Multiplication gates for the scalar fold | 871 | 262 | 484 |
The last row of the first column uses the book's formula, and the other two use our count of the multiplications in the code's Basis, which is per layer for the basis and per group. These rows cover only the folding of scalars. The circuit also computes the targets , and another circuit checks the folded evaluations.
By the same count, the nested side's has room for claims, commits to coefficients, and uses 213 multiplication gates for its scalar folds.
Locating the fold in the code
The formula appears in corrected, where target is , the loop is Horner's rule for , and self.z is :
let target = self.linear(dr, targets)?;
if quotient.is_empty() {
return Ok(target);
}
let mut q = quotient.last().expect("quotient").clone();
for coefficient in quotient[..quotient.len() - 1].iter().rev() {
q = q.mul(dr, r)?.add(dr, coefficient);
}
let correction = self.z.mul(dr, &q)?;
Ok(target.add(dr, &correction))
Reconstructed from code at commit 3219e08, not confirmed by the authors
- Parameters. The native side has 14 groups of 7, which gives 98 slots for its 86 claims, and the nested side has 10 groups of 8 for its 72. Unused slots stay zero.
- Order of messages. The fuse absorbs the first layer's stage commitment and squeezes , then absorbs the second layer's and squeezes , then absorbs the commitment for and and squeezes . The quotient coefficients sit in
inner_errorandouter_errorstages, which the staging chapter explains. - The circuit. The
collapsecircuit checks that each group folds to the value witnessed inouter_error, and that those values fold to the instance's . Its comments state that this last check is waived for the bootstrap step, which takes only dummy inputs. - The spot check. The code has no separate . It reuses , and it checks at and at , because each trace's contains . Both checks then read the same values , which saves separate queries.
- The commitments. The prover computes 's commitment with a small MSM over the children's commitments and commits to directly. These are the polynomials
AbAandAbBthat chapter 09 noticed. At the next fuse they enter as "raw" claims, with the child's as the target. This is the accumulator of Section 6. - The decider. The uncompressed verifier recomputes the revdot product of each claim that the proof carries.
- Blinding. The book's accumulator has and . The code stores each polynomial with its commitment and no such factors, as chapter 12 found for . Our runs include them to match chapter 09.
- Both curves. One set of challenges drives both sides' folds, as chapter 13 described for the other challenges, and the endoscalars chapter gives the lift.
All of this describes the Ragu revision at 3219e08. Tachyon, which has not activated on mainnet and whose design is still changing, pins a different Ragu revision and runs its steps against a mock of Ragu, so nothing at its pinned commit executes this fold.
11. Compression and the forms of the fold
Compression folds again when a proof leaves the tree, and here the matrix returns, with plain weights on the side and on the side. These are the same family as Section 4 under a change of names, where the plain weights' bases are the book's and :
For the fold of Section 5, the book's and correspond to the plain weights and , and these give the same , and . The form in the structured vectors chapter at the same and gives a different pair of vectors with revdot product , and its stated formula holds as well.
Its verifier does not read the cross terms either. The prover packs them into a vector and commits to it, and the public vector holds their weights in mirrored positions, so that the weighted sum becomes one more revdot product . With the numbers of Section 5 and one layer:
The six cross terms of Section 5, packed row by row, give . The public vector with the weights mirrored is , and . The diagonal contributes , so the target of the folded pair is , the value of from Section 5.
The fold then leaves three revdot claims, and one per layer, and the split of chapter 05 proves a random combination of them. This is the one place that pays for the product polynomial and its FFTs. The chapter on recursion in Ragu continues from there.
The Ragu Book and the code differ here
The sources contain four forms of this fold:
| Source | Weight on | Weight on | Prover's message for claims | Parameters |
|---|---|---|---|---|
| Book, revdot chapter | cross terms | , | ||
| Book, structured vectors | The whole matrix , with the diagonal enforced | None given | ||
| Code's fuse, book's recursion chapter | quotient coefficients | , native, , nested | ||
| Code's compression, book's compression chapter | One commitment to cross terms, and | Groups of 7 |
The first, second and fourth rows are one family of weights written in different ways. The book's revdot chapter also says that its 133 claims belong to "Ragu's fuse operation", whereas the code's fuse has 86 native claims and uses the third row. The site follows the code. We found no statement in the sources of why the fuse uses one form and compression another, so we offer none.
12. Where this chapter leaves us
This chapter took the following steps:
- A revdot claim has the instance and the witness , and neither the direct check nor the split suits every step of a long computation.
- Folding two claims with one challenge needs one cross term, but with three claims a cross term shares a power of with a claimed value, which lets a false claim pass at every .
- Independent weights give each cell of the error matrix its own monomial, and the book's choice is and . The prover sends the off-diagonal cells before the challenges.
- The result has the form of its inputs, so it serves as an accumulator, and steps avoid the split and its FFTs. A decider finishes with two MSMs and one revdot product.
- A spot check at a random replaces the commitment sums in the circuit with field arithmetic and evaluation claims for chapter 08's batching.
- Two layers with fresh challenges cut the quadratic field arithmetic, from constraints to .
- A false claim passes only at rare challenges, as long as each layer's messages come before that layer's challenges and nobody knows a relation among the generators. If it passes, it stays false until the decider.
- Ragu's fuse replaces the matrix with a quotient polynomial of coefficients and one challenge per layer, using Lagrange weights. Compression keeps a committed form of the matrix and then runs the split.
The fold accepts any whose vector has the right product, and we have not yet asked whether that vector contains the right circuit's wiring. The verifier's other linear cost, computing , concerns the same question. The next chapter answers it.