Documentation

Complexitylib.Models.TuringMachine.Subroutines.BinaryMulAdd

Canonical binary multiply-add #

This module exposes a nested repeated-addition machine over five pairwise-distinct canonical binary work tapes. It preserves both operands, updates only the accumulator, and restores both private counters to canonical zero. The resource contract gives a width-based all-prefix space bound.

Main results #

theorem Complexity.TM.binaryMulAddIntoTM_hoareTime_frame {n : } (leftIdx rightIdx accIdx mulCounterIdx addCounterIdx : Fin n) (hdistinct : BinaryMulAddDistinct leftIdx rightIdx accIdx mulCounterIdx addCounterIdx) (leftValue rightValue accValue : ) (inp₀ : Tape) (work₀ : Fin nTape) (out₀ : Tape) (hleft : (work₀ leftIdx).HasBinaryNat leftValue) (hright : (work₀ rightIdx).HasBinaryNat rightValue) (hacc : (work₀ accIdx).HasBinaryNat accValue) (hmulCounter : (work₀ mulCounterIdx).HasBinaryNat 0) (haddCounter : (work₀ addCounterIdx).HasBinaryNat 0) (hinp : Parked inp₀) (hother : ∀ (i : Fin n), i leftIdxi rightIdxi accIdxi mulCounterIdxi addCounterIdxParked (work₀ i)) (hout : Parked out₀) :
(binaryMulAddIntoTM leftIdx rightIdx accIdx mulCounterIdx addCounterIdx).HoareTime (fun (inp : Tape) (work : Fin nTape) (out : Tape) => inp = inp₀ work = work₀ out = out₀) (fun (inp : Tape) (work : Fin nTape) (out : Tape) => inp = inp₀ work = Function.update work₀ accIdx ((Tape.init (List.map Γ.ofBool (accValue + leftValue * rightValue).bits)).move Dir3.right) out = out₀) (binaryMulAddTime leftValue rightValue accValue)

Multiply-add changes only the accumulator, from accValue to accValue + leftValue * rightValue; both operands and both zero counters are restored literally.

theorem Complexity.TM.binaryMulAddIntoTM_hoareTimeSpace_frame {n : } (leftIdx rightIdx accIdx mulCounterIdx addCounterIdx : Fin n) (hdistinct : BinaryMulAddDistinct leftIdx rightIdx accIdx mulCounterIdx addCounterIdx) (leftValue rightValue accValue inputLength initialSpace : ) (inp₀ : Tape) (work₀ : Fin nTape) (out₀ : Tape) (hleft : (work₀ leftIdx).HasBinaryNat leftValue) (hright : (work₀ rightIdx).HasBinaryNat rightValue) (hacc : (work₀ accIdx).HasBinaryNat accValue) (hmulCounter : (work₀ mulCounterIdx).HasBinaryNat 0) (haddCounter : (work₀ addCounterIdx).HasBinaryNat 0) (hinp : Parked inp₀) (hother : ∀ (i : Fin n), i leftIdxi rightIdxi accIdxi mulCounterIdxi addCounterIdxParked (work₀ i)) (hout : Parked out₀) (hworkSpace : ∀ (i : Fin n), (work₀ i).head initialSpace) (hinputSpace : inp₀.head inputLength + initialSpace + 1) :
(binaryMulAddIntoTM leftIdx rightIdx accIdx mulCounterIdx addCounterIdx).HoareTimeSpace (fun (inp : Tape) (work : Fin nTape) (out : Tape) => inp = inp₀ work = work₀ out = out₀) (fun (inp : Tape) (work : Fin nTape) (out : Tape) => inp = inp₀ work = Function.update work₀ accIdx ((Tape.init (List.map Γ.ofBool (accValue + leftValue * rightValue).bits)).move Dir3.right) out = out₀) (binaryMulAddTime leftValue rightValue accValue) inputLength (binaryMulAddSpace initialSpace leftValue rightValue accValue)

Time-and-space multiply-add contract. Every reachable configuration stays within the stated width-based bound.

theorem Complexity.TM.binaryMulAddIntoTM_isTransducer {n : } (leftIdx rightIdx accIdx mulCounterIdx addCounterIdx : Fin n) :
(binaryMulAddIntoTM leftIdx rightIdx accIdx mulCounterIdx addCounterIdx).IsTransducer

Binary multiply-add never moves its output head left.