The modular-counter permutation: state, period, and linear-size step circuit #
On 2 k bits split into a k-bit modulus a (leftWord) and a k-bit state b (rightWord),
ModulusCounter.power T advances b to (b + T) % a whenever 0 < a and b < a, and fixes all
other states (advance). For T = 1, this defines a permutation counterStep k = ModulusCounter.power 1 computed by a native De Morgan circuit of linear size at most 50 * k + 20
(counterStep_circuit, ModulusCounter.exists_linear_circuit).
Every active modulus 1 ≤ a ≤ 2 ^ k - 1 divides ModulusCounter.period k = lcm(1, …, 2 ^ k - 1),
and distinct exponents below ModulusCounter.period k give distinct Boolean functions
(ModulusCounter.powers_injective, counter_power_ne).
Main definitions #
Cslib.Circuits.Boolean.Iteration.ModulusCounter.advance: advancebbyTmoduloawhen0 < aandb < a.Cslib.Circuits.Boolean.Iteration.ModulusCounter.leftWord,Cslib.Circuits.Boolean.Iteration.ModulusCounter.rightWord,Cslib.Circuits.Boolean.Iteration.ModulusCounter.pack: split and packk-bit modulus and state words inBitString (k + k).Cslib.Circuits.Boolean.Iteration.ModulusCounter.power:T-step modular counter map onBitString (k + k).Cslib.Circuits.Boolean.Iteration.ModulusCounter.period:Nat.lcmUpto (2 ^ k - 1).Cslib.Circuits.Boolean.Iteration.ModulusCounter.stepValue: next counter word after one step.Cslib.Circuits.Boolean.Iteration.counterModulus,Cslib.Circuits.Boolean.Iteration.counterStepValue,Cslib.Circuits.Boolean.Iteration.counterStep,Cslib.Circuits.Boolean.Iteration.counterNextBits: top-level single-step modular counter permutation and helpers.
Main results #
Cslib.Circuits.Boolean.Iteration.ModulusCounter.power_bijective: the single-step counter map is a bijection.Cslib.Circuits.Boolean.Iteration.ModulusCounter.powers_injective: powers belowperiod kare pairwise distinct.Cslib.Circuits.Boolean.Iteration.ModulusCounter.exists_linear_circuit,Cslib.Circuits.Boolean.Iteration.counterStep_circuit:counterStep khas a De Morgan circuit of size at most50 * k + 20.
References #
- Adapted from lean/Proofs/{ModulusCounter,CounterCircuit}.lean in S. Schlesinger, Square-root circuit bounds for iterated functions.
Modular counter semantics and period #
Advance b by T modulo a when 0 < a and b < a; inactive pairs are fixed.
Instances For
The order lcm(1, …, 2 ^ k - 1) common to every active k-bit modular counter.
Instances For
Different residues modulo period k give different Boolean functions.
Linear-size step circuit #
Next counter word after one step: increment b modulo a when b < a.
Instances For
Equality of two available k-bit words costs at most 6 * k + 1 gates.
Synthesizing stepValue (a x) (b x) from available words and constants costs at most
50 * k + 18 gates.
Top-level counter definitions #
Single-step modular counter transition on natural numbers.
Instances For
Coordinate bits of
ModulusCounter.stepValue (ModulusCounter.leftWord x) (ModulusCounter.rightWord x).
Instances For
Distinct exponents below ModulusCounter.period k produce distinct counter powers.
The single-step modular counter counterStep k has a De Morgan circuit of size at most
50 * k + 20.