Canonical binary evaluation of a fixed natural polynomial — proof internals #
Each Horner layer is verified compositionally from multiply-add, fixed-constant addition, and clearing. The list proof alternates accumulator roles and carries a common polynomial value cap; consequently all layers fit one width-based space budget independent of their (potentially much larger) running time.
Canonical parked tape encoding of a natural for polynomial evaluation.
Equations
Instances For
theorem
Complexity.TM.binaryPolynomialEvalTM_hoareTimeSpace_frame_internal
{n : ℕ}
(inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx : Fin n)
(hdistinct : BinaryPolynomialDistinct inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx)
(p : Polynomial ℕ)
(inputValue inputLength initialSpace : ℕ)
(inp₀ : Tape)
(work₀ : Fin n → Tape)
(out₀ : Tape)
(hinput : (work₀ inputIdx).HasBinaryNat inputValue)
(hresult : (work₀ resultIdx).HasBinaryNat 0)
(hscratch : (work₀ scratchIdx).HasBinaryNat 0)
(hmulCounter : (work₀ mulCounterIdx).HasBinaryNat 0)
(haddCounter : (work₀ addCounterIdx).HasBinaryNat 0)
(hinp : Parked inp₀)
(hother :
∀ (i : Fin n),
i ≠ inputIdx → i ≠ resultIdx → i ≠ scratchIdx → i ≠ mulCounterIdx → i ≠ addCounterIdx → Parked (work₀ i))
(hout : Parked out₀)
(hworkSpace : ∀ (i : Fin n), (work₀ i).head ≤ initialSpace)
(hinputSpace : inp₀.head ≤ inputLength + initialSpace + 1)
:
(binaryPolynomialEvalTM inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx p).HoareTimeSpace
(binaryPolynomialFramePred inp₀ work₀ out₀)
(binaryPolynomialFramePred inp₀
(Function.update work₀ resultIdx (binaryPolynomialNatTape (Polynomial.eval inputValue p))) out₀)
(binaryPolynomialTime p inputValue) inputLength (binaryPolynomialSpace initialSpace p inputValue)
theorem
Complexity.TM.binaryPolynomialEvalTM_hoareTime_frame_internal
{n : ℕ}
(inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx : Fin n)
(hdistinct : BinaryPolynomialDistinct inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx)
(p : Polynomial ℕ)
(inputValue : ℕ)
(inp₀ : Tape)
(work₀ : Fin n → Tape)
(out₀ : Tape)
(hinput : (work₀ inputIdx).HasBinaryNat inputValue)
(hresult : (work₀ resultIdx).HasBinaryNat 0)
(hscratch : (work₀ scratchIdx).HasBinaryNat 0)
(hmulCounter : (work₀ mulCounterIdx).HasBinaryNat 0)
(haddCounter : (work₀ addCounterIdx).HasBinaryNat 0)
(hinp : Parked inp₀)
(hother :
∀ (i : Fin n),
i ≠ inputIdx → i ≠ resultIdx → i ≠ scratchIdx → i ≠ mulCounterIdx → i ≠ addCounterIdx → Parked (work₀ i))
(hout : Parked out₀)
:
(binaryPolynomialEvalTM inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx p).HoareTime
(binaryPolynomialFramePred inp₀ work₀ out₀)
(binaryPolynomialFramePred inp₀
(Function.update work₀ resultIdx (binaryPolynomialNatTape (Polynomial.eval inputValue p))) out₀)
(binaryPolynomialTime p inputValue)
theorem
Complexity.TM.binaryPolynomialEvalTM_isTransducer_internal
{n : ℕ}
(inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx : Fin n)
(p : Polynomial ℕ)
:
(binaryPolynomialEvalTM inputIdx resultIdx scratchIdx mulCounterIdx addCounterIdx p).IsTransducer
theorem
Complexity.TM.binaryPolynomialSpaceWidthPolynomial_eval_internal
(p : Polynomial ℕ)
(inputValue : ℕ)
:
Polynomial.eval inputValue (binaryPolynomialSpaceWidthPolynomial p) = 2 * binaryPolynomialValueCap p inputValue
theorem
Complexity.TM.binaryPolynomialSpace_bigO_internal
(initialSpace : ℕ)
(p : Polynomial ℕ)
:
BigO (fun (inputValue : ℕ) => binaryPolynomialSpace initialSpace p inputValue) fun (inputValue : ℕ) =>
Nat.log 2 inputValue