Dinur's composition: alphabet reduction #
The powering step leaves a constraint graph over an enormous (though constant) alphabet. Composition brings the alphabet back down to a fixed one, at the cost of a constant factor in the unsatisfiability value that does not depend on the alphabet being reduced. That independence is what lets the powering step's gain win.
The construction: every vertex of the outer graph gets a block of positions
holding the Hadamard encoding of its label; every dart gets a proof for the
assembled tester of TesterCore, whose input tables are the encodings at its
two ends and whose constraint is the dart's relation, spelled out on encoded
pairs. The tester's reads make a MultiTest, and LocalTest turns it into a
binary constraint graph over the fixed alphabet Alpha ReadIdx.
Soundness decodes an assignment of the composed graph to one of the outer graph
by nearest codeword at every vertex. Whenever the decoded assignment violates a
dart, that dart's tester rejects on a 1/32 fraction of its random strings —
otherwise the tester's own soundness would produce a satisfying pair whose
encodings are close to both blocks, and closeness to a codeword pins the
decoded labels down. Each rejecting string costs one of the 22 edges it owns.
Main definitions #
Complexity.ReadIdx— the tester's22readsComplexity.RegCSP.compose— the composedMultiTestComplexity.RegCSP.decodeAssign— decoding an assignment of the composed graph
Main results #
Complexity.RegCSP.le_unsatVal_compose— the value drops by at most704Complexity.RegCSP.satisfiable_compose— satisfiability is preserved
The reads #
The tester's reads, by check: linearity of F (three), linearity of G
(three), consistency (six), the constraint (four), and the two input tables
(three each: the input coordinate and two self-correction reads).
- f1x : ReadIdx
- f1y : ReadIdx
- f1s : ReadIdx
- g2x : ReadIdx
- g2y : ReadIdx
- g2s : ReadIdx
- c3cQ : ReadIdx
- c3tQ : ReadIdx
- c3cX : ReadIdx
- c3xX : ReadIdx
- c3cY : ReadIdx
- c3yY : ReadIdx
- k4qG : ReadIdx
- k4tG : ReadIdx
- k4cF : ReadIdx
- k4lF : ReadIdx
- i5r : ReadIdx
- i5c : ReadIdx
- i5b : ReadIdx
- i6r : ReadIdx
- i6c : ReadIdx
- i6b : ReadIdx
Instances For
All twenty-two reads, in declaration order.
Equations
- One or more equations did not get rendered due to their size.
The reads are numbered by their own enumeration: there are twenty-two of them, so this is a lookup on a bounded key.
Signs and bits #
The checks as a formula on the bits read #
The tester's verdict as a formula on the bits it read.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
The bits the tester reads from the four tables.
Equations
- One or more equations did not get rendered due to their size.
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.f1x = F (Complexity.leftBlock (Complexity.Tester.blk1 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.f1y = F (Complexity.rightBlock (Complexity.Tester.blk1 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.f1s = F (Complexity.leftBlock (Complexity.Tester.blk1 z) + Complexity.rightBlock (Complexity.Tester.blk1 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.g2x = G (Complexity.leftBlock (Complexity.Tester.blk2 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.g2y = G (Complexity.rightBlock (Complexity.Tester.blk2 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.g2s = G (Complexity.leftBlock (Complexity.Tester.blk2 z) + Complexity.rightBlock (Complexity.Tester.blk2 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.c3cQ = G (Complexity.cQ (Complexity.Tester.blk3 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.c3cX = F (Complexity.cX (Complexity.Tester.blk3 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.c3xX = F (Complexity.qX (Complexity.Tester.blk3 z) + Complexity.cX (Complexity.Tester.blk3 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.c3cY = F (Complexity.cY (Complexity.Tester.blk3 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.c3yY = F (Complexity.qY (Complexity.Tester.blk3 z) + Complexity.cY (Complexity.Tester.blk3 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.k4qG = G (Complexity.rightBlock (Complexity.rightBlock (Complexity.Tester.blk4 z)))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.k4cF = F (Complexity.leftBlock (Complexity.rightBlock (Complexity.Tester.blk4 z)))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.i5r = Tt (Complexity.leftBlock (Complexity.Tester.blk5 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.i5c = F (Complexity.rightBlock (Complexity.Tester.blk5 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.i6r = Th (Complexity.leftBlock (Complexity.Tester.blk6 z))
- Complexity.Tester.readsOf Tt Th F G S z Complexity.ReadIdx.i6c = F (Complexity.rightBlock (Complexity.Tester.blk6 z))
Instances For
The verdict is the formula on the reads.
The composition #
A bit table on Cube B, as a vector indexed by Fin (2 ^ B).
Equations
- Complexity.RegCSP.vecOf t m = t ((Complexity.candIdx B).symm m)
Instances For
The tester's input variables for a pair of labels: the two encodings.
Equations
- Complexity.RegCSP.inputVec enc σ τ = Fin.append (Complexity.RegCSP.vecOf (Complexity.hadamard (enc σ))) (Complexity.RegCSP.vecOf (Complexity.hadamard (enc τ)))
Instances For
The satisfying set of a dart: the encoded pairs its relation accepts.
Equations
- Complexity.RegCSP.satSet enc R p = Finset.image (fun (st : β × β) => Complexity.RegCSP.inputVec enc st.1 st.2) {st : β × β | R.rel p.1 p.2 st.1 st.2 = true}
Instances For
The composed test: for each dart, the assembled tester on the encodings at its ends and its own proof tables.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The encoding block at a dart's head, as the tester's second input table.
Instances For
A dart's linear proof table.
Instances For
A dart's quadratic proof table.
Instances For
The composed test runs the tester.
Soundness #
Decoding an assignment of the composed graph: nearest codeword at each vertex.
Equations
- Complexity.RegCSP.decodeAssign enc R A v = Complexity.decodeLabel enc fun (r : Complexity.BooleanAnalysis.Cube B) => (Complexity.RegCSP.compose enc R).tableOf A (Sum.inl (v, r))
Instances For
A violated dart rejects a 1/32 fraction of its random strings.
Soundness of composition, per assignment: the composed graph's violated
fraction is at least the decoded assignment's, divided by 704 = 32 · 22.
Completeness #
The honest proof of a satisfying assignment: encodings at the vertices, and for each dart the Hadamard tables of the one-hot extension of its encoded pair.
Equations
- One or more equations did not get rendered due to their size.
- Complexity.RegCSP.honestTable enc R σ (Sum.inl (v, r)) = Complexity.hadamard (enc (σ v)) r
- Complexity.RegCSP.honestTable enc R σ (Sum.inr (Sum.inl (p, x_1))) = Complexity.hadamard (Complexity.oneHotExtend (Complexity.RegCSP.inputVec enc (σ p.1) (σ (R.graph.nbr p.1 p.2)))) x_1
Instances For
Completeness of composition.