Self-composition and the product blocks #
Section 14 of bs_lambda.txt composes the seed function with itself. For
f : Input W → Bool and g : Input V → Bool the block composition comp f g takes
one V-indexed input for each coordinate of W, applies g to each of them and feeds
the resulting W-indexed bit string to f.
iterFun f m is the m-fold self-composition F_m = f^{∘ m}, whose coordinate set is
the iterated product IterCoord V m ≃ V^m. The Cartesian-product blocks
B_{i_1} × ⋯ × B_{i_m} are iterBlock blk m, indexed by IterCoord ι m ≃ ι^m; they are
pairwise disjoint sensitive blocks of F_m at the all-zero input, whence
bs (F_m) ≥ k^m (card_pow_le_bs_iterFun).
The spectral half of Section 14, the ABKRT multiplicativity theorem
lambda (f ∘ g) = lambda f * lambda g, is imported by the document but proved here, in
BSLambda/Spectral/Multiplicative.lean.
Adapted for Lean Pool from Timeroot/BS_Lam at commit
7bd39a8d41ee7910d3296d0477ad18f8fff9d870; ported to Lean Pool with proof and dependency cleanup.
Block composition f ∘ g: N disjoint M-bit inputs, g applied to each, the N
resulting bits fed to f (Section 14 of bs_lambda.txt).
Equations
- BSLambda.comp f g x = f fun (w : W) => g fun (v : V) => x (w, v)
Instances For
The m-fold power V^m, realised as an iterated binary product so that
IterCoord V (m + 1) = V × IterCoord V m holds definitionally (Section 14). It is used
both as the coordinate set of iterFun f m and, at V := ι, as the index set of the
product blocks iterBlock blk m.
Equations
- BSLambda.IterCoord V 0 = PUnit.{?u.1 + 1}
- BSLambda.IterCoord V m.succ = (V × BSLambda.IterCoord V m)
Instances For
IterCoord V m is a finite type (Section 14).
Equations
- BSLambda.instFintypeIterCoord 0 = { elems := BSLambda.instFintypeIterCoord._aux_1, complete := ⋯ }
- BSLambda.instFintypeIterCoord m.succ = { elems := BSLambda.instFintypeIterCoord._aux_4 m (BSLambda.instFintypeIterCoord m), complete := ⋯ }
There are exactly k^m tuples, where k = #V (Section 14).
The Cartesian-product block B_{i_1} × ⋯ × B_{i_m} (Section 14).
Equations
- BSLambda.iterBlock blk 0 = fun (x : BSLambda.IterCoord ι 0) => Finset.univ
- BSLambda.iterBlock blk m.succ = fun (t : BSLambda.IterCoord ι (m + 1)) => blk t.1 ×ˢ BSLambda.iterBlock blk m t.2
Instances For
There is a single degenerate 0-fold product block, the whole (one-point) cube.
F_m = f^{∘ m}, the m-fold self-composition (Section 14). F_0 is the one-bit
identity function.
Equations
- BSLambda.iterFun f 0 = fun (x : BSLambda.Input (BSLambda.IterCoord V 0)) => x PUnit.unit
- BSLambda.iterFun f m.succ = BSLambda.comp f (BSLambda.iterFun f m)
Instances For
Slicing the all-zero input flipped on a product block A ×ˢ B: the v-slice is the
flip of B when v ∈ A, and the all-zero input otherwise (Section 14).
The key composition step of Section 14: if the inner function g is flipped from 0
to 1 by the block B, then comp f g on the product block A ×ˢ B feeds f exactly
the all-zero input flipped on A.
Flipping the Cartesian-product block B_{i_1} × ⋯ × B_{i_m} at the all-zero input
turns the value of F_m from 0 to 1 (Section 14).
Distinct index tuples give disjoint Cartesian-product blocks (Section 14).
Section 14: the k^m Cartesian-product blocks are pairwise disjoint sensitive
blocks of F_m at the all-zero input, so bs(F_m) ≥ k^m.