Frame
Difficulty: moderate — 10 definitions, 1 abbreviations, 18 lemmas, 6 theorems, 0 examples.
Frame.crcStep
def Frame.crcStep✝ (poly reg : List Bool) (bit : Bool) : List Bool
Show details
| Frame.crcStep✝ poly reg bit = if reg.headD false = true then List.zipWith xor (reg.tail ++ [bit]) poly else reg.tail ++ [bit]
Complexity: 133 (size of the value term)
Outer dependencies: (none)
Lean core dependencies: Bool, Bool.xor, Eq, List, List.headD, List.tail, List.zipWith, ite
Frame.crcFrom
def Frame.crcFrom✝ (poly init bits : List Bool) : List Bool
Show details
| Frame.crcFrom✝ poly init bits = List.foldl (Frame.crcStep✝ poly) init bits
Complexity: 160 (size of the value term)
Outer dependencies: (none)
Inner dependencies: Frame.crcStep
Lean core dependencies: Bool, List, List.foldl
Frame.crc
def Frame.crc (poly bits : List Bool) : List Bool
Show details
| Frame.crc poly bits = Frame.crcFrom✝ poly (List.replicate poly.length false) bits
Complexity: 185 (size of the value term)
Outer dependencies: (none)
Inner dependencies: Frame.crcFrom
Lean core dependencies: Bool, List, List.length, List.replicate
Frame
structure Frame (poly : List Bool) (n k : ℕ) : Type
payload : Fin n → Bit
check : Fin k → Bit
instNonemptyFrame
instance instNonemptyFrame {poly : List Bool} {n k : ℕ} : Nonempty (Frame poly n k)
instNormFrame
instance instNormFrame {poly : List Bool} {n k : ℕ} : Norm (Frame poly n k)
Show details
| instNormFrame = { norm := fun e => ‖e.payload‖ + ‖e.check‖ }
Complexity: 91 (size of the value term)
Outer dependencies: Frame
Inner dependencies: Bit, instNormBit, instNormForallFin_computerNetworks
Frame.make
def Frame.make (poly : List Bool) (n : ℕ) (payload : Fin n → Bit) : Frame poly n poly.length
Show details
| Frame.make poly n payload = { payload := payload, check := fun i => (Frame.crc poly (List.ofFn fun j => payload j))[↑i]?.getD false }
Complexity: 101 (size of the value term)
Inner dependencies: Frame.crc
Lean core dependencies: Bool, Fin, List, List.length, List.ofFn, Nat, Option.getD
Used by: Frame.make_valid
Frame.valid
abbrev Frame.valid (poly : List Bool) {n : ℕ} (e : Frame poly n poly.length) : Prop
Show details
| Frame.valid poly e = ∀ (i : Fin poly.length), e.check i = (Frame.crc poly (List.ofFn fun j => e.payload j))[↑i]?.getD false
Complexity: 125 (size of the value term)
Outer dependencies: Frame
Lean core dependencies: Bool, Eq, Fin, List, List.length, List.ofFn, Nat, Option.getD
Frame.make_valid
theorem Frame.make_valid (poly : List Bool) (n : ℕ) (payload : Fin n → Bit) : Frame.valid poly (Frame.make poly n payload)
Show details
fun poly n payload x => rfl
Complexity: 45 (size of the value term)
Dependencies: Bit, Frame.make, Frame.valid
Used by: (none)
instFactPrimeOfNatNat_computerNetworks
instance instFactPrimeOfNatNat_computerNetworks✝ : Fact (Nat.Prime 2)
Show details
{ out := Nat.prime_two }
Complexity: 15 (size of the value term)
Outer dependencies: (none)
Mathlib dependencies: Fact, Nat.Prime, Nat.prime_two
Lean core dependencies: Nat
Used by: Frame.crcFrom_detects_single_bit_flip, Frame.crcStep_poly, Frame.crc_poly_dvd, Frame.eq_of_associated_gf2, Frame.generator_not_dvd_pow, Frame.toPoly, Frame.toPoly_append, Frame.toPoly_degree_lt, Frame.toPoly_ne_zero_of_any, Frame.toPoly_one_add_one, Frame.toPoly_replicate_false, Frame.toPoly_set_flip, Frame.toPoly_xor
Frame.toPoly
def Frame.toPoly✝ : List Bool → Polynomial (ZMod 2)
Show details
| Frame.toPoly✝ [] = 0 | Frame.toPoly✝ (b :: bs) = (if b = true then 1 else 0) * Polynomial.X ^ bs.length + Frame.toPoly✝ bs
Complexity: 100 (size of the value term)
Outer dependencies: instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: Polynomial, Polynomial.X, ZMod
Frame.toPoly_one_add_one
theorem Frame.toPoly_one_add_one✝ : 1 + 1 = 0
Show details
CharTwo.add_self_eq_zero 1
Complexity: 464 (size of the value term)
Dependencies: instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: CharTwo.add_self_eq_zero, Polynomial, ZMod
Used by: Frame.toPoly_xor
Frame.toPoly_append
theorem Frame.toPoly_append✝ (l : List Bool) (b : Bool) : Frame.toPoly✝ (l ++ [b]) = Polynomial.X * Frame.toPoly✝ l + if b = true then 1 else 0
Show details
fun l b => List.rec (of_eq_true (Eq.trans (congr (congrArg Eq (Eq.trans (Frame.toPoly.eq_2✝ b []) (Eq.trans (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrArg (HMul.hMul (if b = true then 1 else 0)) (pow_zero Polynomial.X)) (mul_one (if b = true then 1 else 0)))) 0) (add_zero (if b = true then 1 else 0))))) (Eq.trans (congrFun' (congrArg HAdd.hAdd (mul_zero Polynomial.X)) (if b = true then 1 else 0)) (zero_add (if b = true then 1 else 0)))) (eq_self (if b = true then 1 else 0)))) (fun c cs ih => Eq.mpr (id (congrFun' (congrArg Eq (Eq.trans (Frame.toPoly.eq_2✝ c (cs ++ [b])) (congr (congrArg HAdd.hAdd (congrArg (HMul.hMul (if c = true then 1 else 0)) (congrArg (HPow.hPow Polynomial.X) List.length_append))) ih))) (Polynomial.X * ((if c = true then 1 else 0) * Polynomial.X ^ cs.length + Frame.toPoly✝ cs) + if b = true then 1 else 0))) (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if c = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if c = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 0))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.pow_one_cast_of_isNat (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) (Nat.rawCast 1) { out := rfl }) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if c = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ cs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ cs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ cs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if c = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if c = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if c = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ cs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ cs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right (if c = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ cs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.zero_mul ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) + (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if c = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))))) l
Complexity: 1098140 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_one_cast_of_isNat, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_pos, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.rawCast, Polynomial, Polynomial.X, ZMod, add_zero, mul_one, pow_zero, zero_add
Lean core dependencies: Bool, Eq, Eq.mpr, Eq.symm, Eq.trans, List, List.length, List.length_append, Nat, True, congr, congrArg, congrFun', eq_self, id, ite, of_eq_true, rfl
Used by: Frame.crcStep_poly
Frame.toPoly_xor
theorem Frame.toPoly_xor✝ (a b : List Bool) (h : a.length = b.length) : Frame.toPoly✝ (List.zipWith xor a b) = Frame.toPoly✝ a + Frame.toPoly✝ b
Show details
fun a b h => List.rec (motive := fun a => ∀ (b : List Bool), a.length = b.length → Frame.toPoly✝ (List.zipWith xor a b) = Frame.toPoly✝ a + Frame.toPoly✝ b) (fun b h => match b, h with | [], h => of_eq_true (Eq.trans (congr (congrArg Eq (Eq.trans (congrArg Frame.toPoly✝ (Eq.trans List.zipWith_self (congrFun' (congrArg List.map (funext fun a => bne_self_eq_false a)) []))) Frame.toPoly.eq_1✝)) (add_zero 0)) (eq_self 0))) (fun x xs ih b h => match b, h with | y :: ys, h_1 => have h' := Eq.mp Nat.add_right_cancel_iff._simp_1 h_1; have hxor := Bool.casesOn (motive := fun t => x = t → (if (x ^^ y) = true then 1 else 0) = (if x = true then 1 else 0) + if y = true then 1 else 0) x (fun h_2 => Eq.ndrec (motive := fun x => (x :: xs).length = b.length → (x :: xs).length = (y :: ys).length → (if (x ^^ y) = true then 1 else 0) = (if x = true then 1 else 0) + if y = true then 1 else 0) (fun h h_3 => Bool.casesOn (motive := fun t => y = t → (if (false ^^ y) = true then 1 else 0) = (if false = true then 1 else 0) + if y = true then 1 else 0) y (fun h => Eq.ndrec (motive := fun y => (false :: xs).length = (y :: ys).length → (if (false ^^ y) = true then 1 else 0) = (if false = true then 1 else 0) + if y = true then 1 else 0) (fun h => of_eq_true (Eq.trans (congr (congrArg Eq (ite_cond_eq_false 1 0 (Eq.trans (congrFun' (congrArg Eq (bne_self_eq_false false)) true) Bool.false_eq_true))) (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_false 1 0 Bool.false_eq_true)) (ite_cond_eq_false 1 0 Bool.false_eq_true)) (add_zero 0))) (eq_self 0))) (Eq.symm h) h_3) (fun h => Eq.ndrec (motive := fun y => (false :: xs).length = (y :: ys).length → (if (false ^^ y) = true then 1 else 0) = (if false = true then 1 else 0) + if y = true then 1 else 0) (fun h => of_eq_true (Eq.trans (congr (congrArg Eq (ite_cond_eq_true 1 0 (Eq.trans (congrFun' (congrArg Eq (Eq.trans (Bool.bne_true false) Bool.not_false)) true) (eq_self true)))) (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_false 1 0 Bool.false_eq_true)) (ite_cond_eq_true 1 0 (eq_self true))) (zero_add 1))) (eq_self 1))) (Eq.symm h) h_3) (Eq.refl y)) (Eq.symm h_2) h h_1) (fun h_2 => Eq.ndrec (motive := fun x => (x :: xs).length = b.length → (x :: xs).length = (y :: ys).length → (if (x ^^ y) = true then 1 else 0) = (if x = true then 1 else 0) + if y = true then 1 else 0) (fun h h_3 => Bool.casesOn (motive := fun t => y = t → (if (true ^^ y) = true then 1 else 0) = (if true = true then 1 else 0) + if y = true then 1 else 0) y (fun h => Eq.ndrec (motive := fun y => (true :: xs).length = (y :: ys).length → (if (true ^^ y) = true then 1 else 0) = (if true = true then 1 else 0) + if y = true then 1 else 0) (fun h => of_eq_true (Eq.trans (congr (congrArg Eq (ite_cond_eq_true 1 0 (Eq.trans (congrFun' (congrArg Eq (Bool.bne_false true)) true) (eq_self true)))) (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_true 1 0 (eq_self true))) (ite_cond_eq_false 1 0 Bool.false_eq_true)) (add_zero 1))) (eq_self 1))) (Eq.symm h) h_3) (fun h => Eq.ndrec (motive := fun y => (true :: xs).length = (y :: ys).length → (if (true ^^ y) = true then 1 else 0) = (if true = true then 1 else 0) + if y = true then 1 else 0) (fun h => of_eq_true (Eq.trans (congr (congrArg Eq (ite_cond_eq_false 1 0 (Eq.trans (congrFun' (congrArg Eq (bne_self_eq_false true)) true) Bool.false_eq_true))) (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_true 1 0 (eq_self true))) (ite_cond_eq_true 1 0 (eq_self true))) Frame.toPoly_one_add_one✝)) (eq_self 0))) (Eq.symm h) h_3) (Eq.refl y)) (Eq.symm h_2) h h_1) (Eq.refl x); Eq.mpr (id (congr (congrArg Eq (Eq.trans (Frame.toPoly.eq_2✝ (x ^^ y) (List.zipWith xor xs ys)) (congr (congrArg HAdd.hAdd (congrArg (HMul.hMul (if (x ^^ y) = true then 1 else 0)) (congrArg (HPow.hPow Polynomial.X) (Eq.trans List.length_zipWith (congrFun' (congrArg min h') ys.length))))) (ih ys h')))) (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrArg (HMul.hMul (if x = true then 1 else 0)) (congrArg (HPow.hPow Polynomial.X) h'))) (Frame.toPoly✝ xs))) ((if y = true then 1 else 0) * Polynomial.X ^ ys.length + Frame.toPoly✝ ys)))) (Eq.mpr (id (congrArg (fun _a => (if (x ^^ y) = true then 1 else 0) * Polynomial.X ^ _a + (Frame.toPoly✝ xs + Frame.toPoly✝ ys) = (if x = true then 1 else 0) * Polynomial.X ^ ys.length + Frame.toPoly✝ xs + ((if y = true then 1 else 0) * Polynomial.X ^ ys.length + Frame.toPoly✝ ys)) (Nat.min_self ys.length))) (Eq.mpr (id (congrArg (fun _a => _a * Polynomial.X ^ ys.length + (Frame.toPoly✝ xs + Frame.toPoly✝ ys) = (if x = true then 1 else 0) * Polynomial.X ^ ys.length + Frame.toPoly✝ xs + ((if y = true then 1 else 0) * Polynomial.X ^ ys.length + Frame.toPoly✝ ys)) hxor)) (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (if x = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if x = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (if y = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if y = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf ys.length rfl (Eq.mpr (id (congrArg (fun _a => ys.length ^ Nat.rawCast 1 * Nat.rawCast 1 = ys.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right ys.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if x = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if y = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ xs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ xs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ ys) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ ys ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1 + (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if x = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if x = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf ys.length rfl (Eq.mpr (id (congrArg (fun _a => ys.length ^ Nat.rawCast 1 * Nat.rawCast 1 = ys.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right ys.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if x = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if x = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ xs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ xs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if y = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if y = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf ys.length rfl (Eq.mpr (id (congrArg (fun _a => ys.length ^ Nat.rawCast 1 * Nat.rawCast 1 = ys.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right ys.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if y = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ ys) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ ys ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if x = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt ((if y = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (ys.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ xs ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ ys ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))))))) a b h
Complexity: 1277256 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Proof dependencies: Frame.toPoly_one_add_one
Mathlib dependencies: Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.of_eq, Nat.rawCast, Polynomial, Polynomial.X, ZMod, add_zero, zero_add
Lean core dependencies: Bool, Bool.bne_false, Bool.bne_true, Bool.false_eq_true, Bool.not, Bool.not_false, Bool.xor, Eq, Eq.mp, Eq.mpr, Eq.symm, Eq.trans, False, False.elim, HEq, List, List.length, List.length_zipWith, List.map, List.zipWith, List.zipWith_self, Nat, Nat.add, Nat.min_self, True, bne, bne_self_eq_false, congr, congrArg, congrFun', eq_self, funext, id, ite, ite_cond_eq_false, ite_cond_eq_true, noConfusion_of_Nat, of_eq_true, rfl
Used by: Frame.crcStep_poly
Frame.toPoly_replicate_false
theorem Frame.toPoly_replicate_false✝ (n : ℕ) : Frame.toPoly✝ (List.replicate n false) = 0
Show details
fun n => Nat.recAux (of_eq_true (Eq.trans (congrFun' (congrArg Eq Frame.toPoly.eq_1✝) 0) (eq_self 0))) (fun n ih => of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans (Frame.toPoly.eq_2✝ false (List.replicate n false)) (Eq.trans (congr (congrArg HAdd.hAdd (Eq.trans (congr (congrArg HMul.hMul (ite_cond_eq_false 1 0 Bool.false_eq_true)) (congrArg (HPow.hPow Polynomial.X) List.length_replicate)) (zero_mul (Polynomial.X ^ n)))) ih) (add_zero 0)))) 0) (eq_self 0))) n
Complexity: 27006 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: Polynomial, Polynomial.X, ZMod, add_zero
Lean core dependencies: Bool, Bool.false_eq_true, Eq, Eq.trans, List.length, List.length_replicate, List.replicate, Nat, Nat.recAux, True, congr, congrArg, congrFun', eq_self, ite, ite_cond_eq_false, of_eq_true
Used by: (none)
Frame.toPoly_degree_lt
theorem Frame.toPoly_degree_lt✝ (l : List Bool) : (Frame.toPoly✝ l).degree < ↑l.length
Show details
fun l => List.rec (of_eq_true (Eq.trans (congrArg (LT.lt ⊥) (CharP.cast_eq_zero (WithBot ℕ) 0)) WithBot.bot_neg._simp_1)) (fun b bs ih => have h1 := Bool.casesOn (motive := fun t => b = t → ((if b = true then 1 else 0) * Polynomial.X ^ bs.length).degree ≤ ↑bs.length) b (fun h => Eq.symm h ▸ of_eq_true (Eq.trans (congrFun' (congrArg LE.le (congrArg Polynomial.degree (Eq.trans (congrFun' (congrArg HMul.hMul (ite_cond_eq_false 1 0 Bool.false_eq_true)) (Polynomial.X ^ bs.length)) (zero_mul (Polynomial.X ^ bs.length))))) ↑bs.length) bot_le._simp_1)) (fun h => Eq.symm h ▸ of_eq_true (Eq.trans (congrFun' (congrArg LE.le (Eq.trans (Eq.trans (congrArg Polynomial.degree (Eq.trans (congrFun' (congrArg HMul.hMul (ite_cond_eq_true 1 0 (eq_self true))) (Polynomial.X ^ bs.length)) (one_mul (Polynomial.X ^ bs.length)))) (Polynomial.degree_pow Polynomial.X bs.length)) (Eq.trans (Eq.trans (congrArg (HSMul.hSMul bs.length) Polynomial.degree_X) (nsmul_eq_mul bs.length 1)) (mul_one ↑bs.length)))) ↑bs.length) (Std.le_refl._simp_1 ↑bs.length))) (Eq.refl b); Trans.trans (Trans.trans rfl (Polynomial.degree_add_le ((if b = true then 1 else 0) * Polynomial.X ^ bs.length) (Frame.toPoly✝ bs))) (id (Eq.mpr (id (congrArg (fun _a => _a) (propext max_lt_iff))) ⟨lt_of_le_of_lt h1 (cast (Eq.symm Nat.cast_lt._simp_1) (Nat.lt_succ_self bs.length)), lt_trans ih (cast (Eq.symm Nat.cast_lt._simp_1) (Nat.lt_succ_self bs.length))⟩))) l
Complexity: 74611 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: CharP.cast_eq_zero, Polynomial, Polynomial.X, Polynomial.degree, Polynomial.degree_X, Polynomial.degree_add_le, Polynomial.degree_pow, WithBot, ZMod, lt_of_le_of_lt, lt_trans, max_lt_iff, mul_one, nsmul_eq_mul, one_mul
Lean core dependencies: And, Bool, Bool.false_eq_true, Eq, Eq.mpr, Eq.symm, Eq.trans, List, List.length, Nat, Nat.cast, Nat.lt_succ_self, True, cast, congrArg, congrFun', eq_self, id, ite, ite_cond_eq_false, ite_cond_eq_true, of_eq_true, rfl
Frame.toPoly_ne_zero_of_any
theorem Frame.toPoly_ne_zero_of_any✝ (l : List Bool) (h : l.any id = true) : Frame.toPoly✝ l ≠ 0
Show details
fun l h => List.rec (motive := fun l => l.any id = true → Frame.toPoly✝ l ≠ 0) (fun h => False.elim (Eq.mp Bool.false_eq_true h)) (fun b bs ih h => Bool.casesOn (motive := fun t => b = t → Frame.toPoly✝ (b :: bs) ≠ 0) b (fun h_1 => Eq.ndrec (motive := fun b => (id b || bs.any id) = true → Frame.toPoly✝ (b :: bs) ≠ 0) (fun h => Eq.mpr (id (congrFun' (congrArg Ne (Eq.trans (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrFun' (congrArg HMul.hMul (ite_cond_eq_false 1 0 Bool.false_eq_true)) (Polynomial.X ^ bs.length)) (zero_mul (Polynomial.X ^ bs.length)))) (Frame.toPoly✝ bs)) (zero_add (Frame.toPoly✝ bs)))) 0)) (ih (Eq.mpr (id (Eq.trans List.any_eq_true._simp_1 exists_eq_right._simp_1)) (Eq.mp (Eq.trans (congrArg (Or False) (Eq.trans List.any_eq_true._simp_1 exists_eq_right._simp_1)) (false_or (true ∈ bs))) (Eq.mp (Eq.trans (Bool.or_eq_true false (bs.any id)) (congrFun' (congrArg Or Bool.false_eq_true) (bs.any id = true))) h))))) (Eq.symm h_1) h) (fun h_1 => Eq.ndrec (motive := fun b => (id b || bs.any id) = true → Frame.toPoly✝ (b :: bs) ≠ 0) (fun h heq => have hdeg := Mathlib.Tactic.LinearCombination.eq_of_eq (Eq.mp (congrFun' (congrArg Eq (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrFun' (congrArg HMul.hMul (Eq.trans (ite_congr (eq_self true) (fun a => Eq.refl 1) fun a => Eq.refl 0) (if_true 1 0))) (Polynomial.X ^ bs.length)) (one_mul (Polynomial.X ^ bs.length)))) (Frame.toPoly✝ bs))) 0) heq) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.neg_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) Mathlib.Tactic.Ring.Common.neg_zero)) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0)))) (Mathlib.Tactic.Ring.Common.sub_pf (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) Mathlib.Tactic.Ring.Common.neg_zero) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0)))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)))); have hdegeq := Eq.mpr (id (congrArg (fun _a => _a.degree = (Frame.toPoly✝ bs).degree) hdeg)) (of_eq_true (Eq.trans (congrFun' (congrArg Eq (Polynomial.degree_neg (Frame.toPoly✝ bs))) (Frame.toPoly✝ bs).degree) (eq_self (Frame.toPoly✝ bs).degree))); have hlt := Frame.toPoly_degree_lt✝ bs; False.elim (Eq.mp (Eq.trans (congrFun' (congrArg LT.lt (Eq.trans (Polynomial.degree_pow Polynomial.X bs.length) (Eq.trans (Eq.trans (congrArg (HSMul.hSMul bs.length) Polynomial.degree_X) (nsmul_eq_mul bs.length 1)) (mul_one ↑bs.length)))) ↑bs.length) (lt_self_iff_false._simp_1 ↑bs.length)) (Eq.mp (congrArg (fun _a => _a < ↑bs.length) (Eq.symm hdegeq)) hlt))) (Eq.symm h_1) h) (Eq.refl b)) l h
Complexity: 523262 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Proof dependencies: Frame.toPoly_degree_lt
Mathlib dependencies: Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_congr, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Polynomial.degree, Polynomial.degree_X, Polynomial.degree_neg, Polynomial.degree_pow, Ring, WithBot, ZMod, mul_one, nsmul_eq_mul, one_mul, zero_add
Lean core dependencies: And, Bool, Bool.false_eq_true, Bool.or, Bool.or_eq_true, Eq, Eq.mp, Eq.mpr, Eq.symm, Eq.trans, Exists, False, False.elim, Int, Int.negOfNat, List, List.any, List.length, Nat, Nat.cast, Ne, Not, Or, True, congrArg, congrFun', eq_self, false_or, id, if_true, inferInstance, ite, ite_cond_eq_false, ite_congr, of_eq_true, rfl
Used by: Frame.generator_not_dvd_pow
Frame.crcStep_length
theorem Frame.crcStep_length✝ (poly reg : List Bool) (bit : Bool) (hk : 0 < poly.length) (h : reg.length = poly.length) : (Frame.crcStep✝ poly reg bit).length = poly.length
Show details
fun poly reg bit hk h => id (Decidable.casesOn (instDecidableEqBool (reg.headD false) true) (fun h_1 => Eq.mpr (id (congrFun' (congrArg Eq (congrArg List.length (if_neg h_1))) poly.length)) (Eq.mpr (id (congrFun' (congrArg Eq (Eq.trans List.length_append (congr (congrArg HAdd.hAdd (Eq.trans List.length_tail (congrFun' (congrArg HSub.hSub h) 1))) (zero_add 1)))) poly.length)) (Decidable.byContradiction fun a => Frame.crcStep_length._proof_1_2✝ poly reg hk h a))) fun h_1 => Eq.mpr (id (congrFun' (congrArg Eq (congrArg List.length (if_pos h_1))) poly.length)) (Eq.mpr (id (congrArg (fun _a => _a = poly.length) List.length_zipWith)) (Eq.mpr (id (Eq.trans (congrFun' (congrArg Eq (congrFun' (congrArg min (Eq.trans List.length_append (congr (congrArg HAdd.hAdd (Eq.trans List.length_tail (congrFun' (congrArg HSub.hSub h) 1))) (zero_add 1)))) poly.length)) poly.length) inf_eq_right._simp_1)) (Decidable.byContradiction fun a => Frame.crcStep_length._proof_1_1✝ poly reg hk h a))))
Complexity: 6128 (size of the value term)
Dependencies: Frame.crcStep
Mathlib dependencies: zero_add
Lean core dependencies: And, Bool, Bool.xor, Decidable, Decidable.byContradiction, Decidable.decide, Eq, Eq.mpr, Eq.symm, Eq.trans, False, GT.gt, Int, Int.add_one_le_of_lt, Int.natCast_add, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.ofNat_congr, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.ofNat_sub_dichotomy, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_0, Lean.Omega.LinearCombo.coordinate_eval_1, Lean.Omega.LinearCombo.coordinate_eval_2, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, List, List.headD, List.length, List.length_append, List.length_tail, List.length_zipWith, List.tail, List.zipWith, Nat, Nat.cast, Nat.lt_of_not_le, Nat.lt_or_gt_of_ne, Not, Or.elim, congr, congrArg, congrFun', id, if_neg, if_pos, ite, le_of_le_of_eq, of_decide_eq_true
Used by: Frame.crc_poly_dvd
Frame.crcStep_poly
theorem Frame.crcStep_poly✝ (poly : List Bool) (hk : 0 < poly.length) (reg : List Bool) (bit : Bool) (hreg : reg.length = poly.length) : Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcStep✝ poly reg bit) + (Polynomial.X * Frame.toPoly✝ reg + if bit = true then 1 else 0)
Show details
fun poly hk reg bit hreg => match reg, hreg with | [], hreg_1 => Classical.byContradiction fun a => Frame.crcStep_poly._proof_1_3✝ poly hk reg hreg hreg_1 | hd :: tl, hreg => have htl := hreg; have hshift := Frame.toPoly_append✝ tl bit; have hreghead := rfl; Bool.casesOn (motive := fun t => hd = t → Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcStep✝ poly (hd :: tl) bit) + (Polynomial.X * Frame.toPoly✝ (hd :: tl) + if bit = true then 1 else 0)) hd (fun h => Eq.ndrec (motive := fun hd => (hd :: tl).length = poly.length → Frame.toPoly✝ (hd :: tl) = (if hd = true then 1 else 0) * Polynomial.X ^ tl.length + Frame.toPoly✝ tl → Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcStep✝ poly (hd :: tl) bit) + (Polynomial.X * Frame.toPoly✝ (hd :: tl) + if bit = true then 1 else 0)) (fun hreg hreghead => have hcrc := of_eq_true (Eq.trans (congrFun' (congrArg Eq (ite_cond_eq_false (List.zipWith xor ((false :: tl).tail ++ [bit]) poly) ((false :: tl).tail ++ [bit]) (Eq.trans (congrFun' (congrArg Eq List.headD_eq_head?_getD) true) Bool.false_eq_true))) (tl ++ [bit])) (eq_self (tl ++ [bit]))); have hreghead' := of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans hreghead (Eq.trans (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrFun' (congrArg HMul.hMul (ite_cond_eq_false 1 0 Bool.false_eq_true)) (Polynomial.X ^ tl.length)) (zero_mul (Polynomial.X ^ tl.length)))) (Frame.toPoly✝ tl)) (zero_add (Frame.toPoly✝ tl))))) (Frame.toPoly✝ tl)) (eq_self (Frame.toPoly✝ tl))); Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ _a + (Polynomial.X * Frame.toPoly✝ (false :: tl) + if bit = true then 1 else 0)) hcrc)) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ _a + (Polynomial.X * Frame.toPoly✝ (false :: tl) + if bit = true then 1 else 0)) hshift)) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + (Polynomial.X * _a + if bit = true then 1 else 0)) hreghead')) (Exists.intro 0 (Eq.mpr (id (congrArg (fun _a => (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) = _a) (mul_zero (Polynomial.X ^ poly.length + Frame.toPoly✝ poly)))) (CharTwo.add_self_eq_zero (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0))))))) (Eq.symm h) hreg hreghead) (fun h => Eq.ndrec (motive := fun hd => (hd :: tl).length = poly.length → Frame.toPoly✝ (hd :: tl) = (if hd = true then 1 else 0) * Polynomial.X ^ tl.length + Frame.toPoly✝ tl → Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcStep✝ poly (hd :: tl) bit) + (Polynomial.X * Frame.toPoly✝ (hd :: tl) + if bit = true then 1 else 0)) (fun hreg hreghead => have hcrc := of_eq_true (Eq.trans (congrFun' (congrArg Eq (ite_cond_eq_true (List.zipWith xor ((true :: tl).tail ++ [bit]) poly) ((true :: tl).tail ++ [bit]) (Eq.trans (congrFun' (congrArg Eq List.headD_eq_head?_getD) true) (eq_self true)))) (List.zipWith xor (tl ++ [bit]) poly)) (eq_self (List.zipWith xor (tl ++ [bit]) poly))); have hlentl := Eq.mpr (id (congrFun' (congrArg Eq (Eq.trans List.length_append (congrArg (HAdd.hAdd tl.length) (zero_add 1)))) poly.length)) hreg; Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ _a + (Polynomial.X * Frame.toPoly✝ (true :: tl) + if bit = true then 1 else 0)) hcrc)) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ _a + (Polynomial.X * Frame.toPoly✝ (true :: tl) + if bit = true then 1 else 0)) (Frame.toPoly_xor✝ (tl ++ [bit]) poly hlentl))) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ _a + Frame.toPoly✝ poly + (Polynomial.X * Frame.toPoly✝ (true :: tl) + if bit = true then 1 else 0)) hshift)) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + Frame.toPoly✝ poly + (Polynomial.X * _a + if bit = true then 1 else 0)) hreghead)) (Eq.mpr (id (congrArg (Dvd.dvd (Polynomial.X ^ poly.length + Frame.toPoly✝ poly)) (congrArg (HAdd.hAdd ((Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + Frame.toPoly✝ poly)) (congrFun' (congrArg HAdd.hAdd (congrArg (HMul.hMul Polynomial.X) (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrFun' (congrArg HMul.hMul (Eq.trans (ite_congr (eq_self true) (fun a => Eq.refl 1) fun a => Eq.refl 0) (if_true 1 0))) (Polynomial.X ^ tl.length)) (one_mul (Polynomial.X ^ tl.length)))) (Frame.toPoly✝ tl)))) (if bit = true then 1 else 0))))) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ _a + Frame.toPoly✝ poly ∣ (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + Frame.toPoly✝ poly + (Polynomial.X * (Polynomial.X ^ tl.length + Frame.toPoly✝ tl) + if bit = true then 1 else 0)) (Eq.symm htl))) (Eq.mpr (id (congrArg (fun _a => _a + Frame.toPoly✝ poly ∣ (Polynomial.X * Frame.toPoly✝ tl + if bit = true then 1 else 0) + Frame.toPoly✝ poly + (Polynomial.X * (Polynomial.X ^ tl.length + Frame.toPoly✝ tl) + if bit = true then 1 else 0)) (pow_succ' Polynomial.X tl.length))) (Exists.intro 1 (Mathlib.Tactic.LinearCombination.eq_of_eq (Mathlib.Tactic.LinearCombination.add_eq_eq (CharTwo.add_self_eq_zero (Polynomial.X * Frame.toPoly✝ tl)) (CharTwo.add_self_eq_zero (if bit = true then 1 else 0))) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ tl) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ tl ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (if bit = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if bit = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf tl.length rfl (Eq.mpr (id (congrArg (fun _a => tl.length ^ Nat.rawCast 1 * Nat.rawCast 1 = tl.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right tl.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ tl) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ tl ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (if bit = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if bit = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (if bit = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 2) + ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 2 + (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf tl.length rfl (Eq.mpr (id (congrArg (fun _a => tl.length ^ Nat.rawCast 1 * Nat.rawCast 1 = tl.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right tl.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_one)) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ tl) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ tl ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ tl) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ tl ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (if bit = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if bit = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (if bit = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if bit = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (if bit = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ Nat.rawCast 1 * (Frame.toPoly✝ tl ^ Nat.rawCast 1 * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt ((if bit = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 2) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.sub_pf (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1)))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Eq.refl (Int.negOfNat 2)))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (if bit = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Eq.refl (Int.negOfNat 2))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) Mathlib.Tactic.Ring.Common.neg_zero)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (tl.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0)))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ tl) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 2)) (Eq.refl (Int.ofNat 0)))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (if bit = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 2)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))))))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero))))))))))))) (Eq.symm h) hreg hreghead) (Eq.refl hd)
Complexity: 4538566 (size of the value term)
Dependencies: Frame.crcStep, Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Proof dependencies: Frame.toPoly_append, Frame.toPoly_xor
Mathlib dependencies: CharTwo.add_self_eq_zero, Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_add, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.add_eq_eq, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_pos, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_one, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Ring, ZMod, one_mul, pow_succ', zero_add
Lean core dependencies: Bool, Bool.false_eq_true, Bool.xor, Classical.byContradiction, Decidable.decide, Eq, Eq.mpr, Eq.symm, Eq.trans, False, Int, Int.add_one_le_of_lt, Int.negOfNat, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.ofNat_congr, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_0, Lean.Omega.LinearCombo.coordinate_eval_1, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, List, List.headD, List.headD_eq_head?_getD, List.length, List.length_append, List.tail, List.zipWith, Nat, Nat.cast, Not, True, congrArg, congrFun', eq_self, id, if_true, inferInstance, ite, ite_cond_eq_false, ite_cond_eq_true, ite_congr, le_of_le_of_eq, of_decide_eq_true, of_eq_true, rfl
Used by: Frame.crc_poly_dvd
Frame.crc_poly_dvd
theorem Frame.crc_poly_dvd✝ (poly : List Bool) (hk : 0 < poly.length) (bits reg : List Bool) (hreg : reg.length = poly.length) : Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcFrom✝ poly reg bits) + (Polynomial.X ^ bits.length * Frame.toPoly✝ reg + Frame.toPoly✝ bits)
Show details
fun poly hk bits reg hreg => List.rec (motive := fun bits => ∀ (reg : List Bool), reg.length = poly.length → Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcFrom✝ poly reg bits) + (Polynomial.X ^ bits.length * Frame.toPoly✝ reg + Frame.toPoly✝ bits)) (fun reg hreg => Eq.mpr (id (congrArg (Dvd.dvd (Polynomial.X ^ poly.length + Frame.toPoly✝ poly)) (congrArg (HAdd.hAdd (Frame.toPoly✝ reg)) (congrFun' (congrArg HAdd.hAdd (Eq.trans (congrFun' (congrArg HMul.hMul (pow_zero Polynomial.X)) (Frame.toPoly✝ reg)) (one_mul (Frame.toPoly✝ reg)))) 0)))) (Exists.intro 0 (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ reg + (Frame.toPoly✝ reg + 0) = _a) (mul_zero (Polynomial.X ^ poly.length + Frame.toPoly✝ poly)))) (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ reg + _a = 0) (add_zero (Frame.toPoly✝ reg)))) (CharTwo.add_self_eq_zero (Frame.toPoly✝ reg)))))) (fun c cs ih reg hreg => have hreg' := Frame.crcStep_length✝ poly reg c hk hreg; have hIH := ih (Frame.crcStep✝ poly reg c) hreg'; have hstep := Frame.crcStep_poly✝ poly hk reg c hreg; id (id (Exists.casesOn hstep fun e he => Exists.casesOn hIH fun f hf => Exists.intro (f + Polynomial.X ^ cs.length * e) (Mathlib.Tactic.LinearCombination.eq_of_eq (Mathlib.Tactic.LinearCombination.add_eq_eq (Mathlib.Tactic.LinearCombination.add_eq_eq hf (Mathlib.Tactic.LinearCombination.mul_const_eq he (Polynomial.X ^ cs.length))) (Eq.symm (Mathlib.Tactic.LinearCombination.mul_const_eq (CharTwo.add_self_eq_zero (Frame.toPoly✝ (Frame.crcStep✝ poly reg c))) (Polynomial.X ^ cs.length)))) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℕ (Eq.refl 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.pow_one_cast_of_isNat (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) (Nat.rawCast 1) { out := rfl }) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ reg) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ reg ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ reg) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1)) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1)) + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if c = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if c = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left (if c = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ cs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ cs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1)) + (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf poly.length rfl (Eq.mpr (id (congrArg (fun _a => poly.length ^ Nat.rawCast 1 * Nat.rawCast 1 = poly.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right poly.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf f rfl (Eq.mpr (id (congrArg (fun _a => f ^ Nat.rawCast 1 * Nat.rawCast 1 = f ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (f ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right f (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right f (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (f ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf poly.length rfl (Eq.mpr (id (congrArg (fun _a => poly.length ^ Nat.rawCast 1 * Nat.rawCast 1 = poly.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right poly.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf e rfl (Eq.mpr (id (congrArg (fun _a => e ^ Nat.rawCast 1 * Nat.rawCast 1 = e ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (e ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (e ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) + 0)))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) + (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcStep✝ poly reg c)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcStep✝ poly reg c)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ (Frame.crcStep✝ poly reg c)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ (Frame.crcStep✝ poly reg c)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 2) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 2) + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ (List.foldl (Frame.crcStep✝ poly) (Frame.crcStep✝ poly reg c) cs) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ Nat.rawCast 1 * (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ reg ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if c = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ (Frame.crcStep✝ poly reg c) ^ Nat.rawCast 1 * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ cs ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))))))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf poly.length rfl (Eq.mpr (id (congrArg (fun _a => poly.length ^ Nat.rawCast 1 * Nat.rawCast 1 = poly.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right poly.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf f rfl (Eq.mpr (id (congrArg (fun _a => f ^ Nat.rawCast 1 * Nat.rawCast 1 = f ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (f ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf cs.length rfl (Eq.mpr (id (congrArg (fun _a => cs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = cs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right cs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf e rfl (Eq.mpr (id (congrArg (fun _a => e ^ Nat.rawCast 1 * Nat.rawCast 1 = e ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (e ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (e ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (f ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right f (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right e (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right f (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (e ^ Nat.rawCast 1 * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * (f ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (cs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (e ^ Nat.rawCast 1 * Nat.rawCast 1) + (f ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ⋯)) ⋯)) ⋯ ⋯) ⋯) ⋯)))))) ⋯ ⋯ ⋯
Complexity: 10361170 (size of the value term)
Dependencies: Frame.crcFrom, Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Proof dependencies: Frame.crcStep, Frame.crcStep_length, Frame.crcStep_poly
Mathlib dependencies: CharTwo.add_self_eq_zero, Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_add, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.add_eq_eq, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.LinearCombination.mul_const_eq, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_one_cast_of_isNat, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_pos, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Ring, ZMod, add_zero, one_mul, pow_zero
Lean core dependencies: Bool, Eq, Eq.mpr, Eq.symm, Eq.trans, Int, Int.negOfNat, List, List.foldl, List.length, Nat, congrArg, congrFun', id, inferInstance, ite, rfl
Frame.toPoly_set_flip
theorem Frame.toPoly_set_flip✝ (l : List Bool) (i : Fin l.length) : Frame.toPoly✝ l + Frame.toPoly✝ (l.set ↑i !l[i]) = Polynomial.X ^ (l.length - 1 - ↑i)
Show details
fun l i => List.rec (motive := fun l => ∀ (i : Fin l.length), Frame.toPoly✝ l + Frame.toPoly✝ (l.set ↑i !l[i]) = Polynomial.X ^ (l.length - 1 - ↑i)) (fun i => absurd i.isLt (of_eq_true (Eq.trans (congrArg Not not_lt_zero._simp_1) not_false_eq_true))) (fun b bs ih i => Fin.cases (id (Eq.mpr (id (congrArg (Eq ((if b = true then 1 else 0) * Polynomial.X ^ bs.length + Frame.toPoly✝ bs + ((if (!b) = true then 1 else 0) * Polynomial.X ^ bs.length + Frame.toPoly✝ bs))) (congrArg (HPow.hPow Polynomial.X) (congrFun' (congrArg HSub.hSub (Nat.add_sub_cancel bs.length 1)) 0)))) (have hxor := Bool.casesOn (motive := fun t => b = t → ((if b = true then 1 else 0) + if (!b) = true then 1 else 0) = 1) b (fun h => Eq.ndrec (motive := fun b => ∀ (i : Fin (b :: bs).length), ((if b = true then 1 else 0) + if (!b) = true then 1 else 0) = 1) (fun i => of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_false 1 0 Bool.false_eq_true)) (ite_cond_eq_true 1 0 (Eq.trans (congrFun' (congrArg Eq Bool.not_false) true) (eq_self true)))) (zero_add 1))) 1) (eq_self 1))) (Eq.symm h) i) (fun h => Eq.ndrec (motive := fun b => ∀ (i : Fin (b :: bs).length), ((if b = true then 1 else 0) + if (!b) = true then 1 else 0) = 1) (fun i => of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans (congr (congrArg HAdd.hAdd (ite_cond_eq_true 1 0 (eq_self true))) (ite_cond_eq_false 1 0 (Eq.trans (congrFun' (congrArg Eq Bool.not_true) true) Bool.false_eq_true))) (add_zero 1))) 1) (eq_self 1))) (Eq.symm h) i) (Eq.refl b); Mathlib.Tactic.LinearCombination.eq_of_eq (Mathlib.Tactic.LinearCombination.add_eq_eq (Mathlib.Tactic.LinearCombination.mul_eq_const hxor (Polynomial.X ^ bs.length)) (CharTwo.add_self_eq_zero (Frame.toPoly✝ bs))) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if (!b) = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left (if (!b) = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_one)) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (if (!b) = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_left (if (!b) = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * ((if (!b) = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))) (Mathlib.Tactic.Ring.Common.sub_pf (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1)))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.neg_mul (if (!b) = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1)))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Eq.refl (Int.negOfNat 2))))) Mathlib.Tactic.Ring.Common.neg_zero)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0)))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (if (!b) = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0)))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ bs) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 2)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))))))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero))))))) (fun j => have hcons := of_eq_true (eq_self (b :: bs.set ↑j !bs[↑j])); id (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (b :: bs) + Frame.toPoly✝ _a = Polynomial.X ^ ((b :: bs).length - 1 - ↑j.succ)) hcons)) (have hIH := ih j; have hll := rfl; have hlen := have hj := j.isLt; Eq.mpr (id (congrFun' (congrArg Eq (congrFun' (congrArg HSub.hSub (congrFun' (congrArg HSub.hSub hll) 1)) (↑j + 1))) (bs.length - 1 - ↑j))) (Decidable.byContradiction fun a => Frame.toPoly_set_flip._proof_1_4✝ b bs j hj a); Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (b :: bs) + Frame.toPoly✝ (b :: bs.set ↑j !bs[↑j]) = Polynomial.X ^ _a) hlen)) (Eq.mpr (id (congrFun' (congrArg Eq (congrArg (HAdd.hAdd ((if b = true then 1 else 0) * Polynomial.X ^ bs.length + Frame.toPoly✝ bs)) (congrFun' (congrArg HAdd.hAdd (congrArg (HMul.hMul (if b = true then 1 else 0)) (congrArg (HPow.hPow Polynomial.X) List.length_set))) (Frame.toPoly✝ (bs.set ↑j !bs[↑j]))))) (Polynomial.X ^ (bs.length - 1 - ↑j)))) (Mathlib.Tactic.LinearCombination.eq_of_eq (Mathlib.Tactic.LinearCombination.add_eq_eq (CharTwo.add_self_eq_zero ((if b = true then 1 else 0) * Polynomial.X ^ bs.length)) hIH) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bs) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bs ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.atom_pf (if b = true then 1 else 0) rfl (Eq.mpr (id (congrArg (fun _a => (if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1 = (if b = true then 1 else 0) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bs.length rfl (Eq.mpr (id (congrArg (fun _a => bs.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bs.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bs.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (bs.set ↑j !bs[↑j])) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (if b = true then 1 else 0) (Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf Polynomial.X (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (bs.length - 1 - ↑j) rfl (Eq.mpr (id (congrArg (fun _a => (bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1 = (bs.length - 1 - ↑j) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right (bs.length - 1 - ↑j) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt ((if b = true then 1 else 0) ^ Nat.rawCast 1 * (Polynomial.X ^ (bs.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ ((bs.length - 1 - ↑j) ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ bs ^ Nat.rawCast 1 * Nat.rawCast 1 + (Frame.toPoly✝ (bs.set ↑j !bs[↑j]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (bs.length - 1 - ↑j) ⋯ ⋯) ⋯) ⋯ ⋯) ⋯) ⋯))))))) ⋯) ⋯ ⋯
Complexity: 3622584 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: CharTwo.add_self_eq_zero, Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_add, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.add_eq_eq, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.LinearCombination.mul_eq_const, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_pos, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_one, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Ring, ZMod, add_zero, le_refl, zero_add
Lean core dependencies: And, Bool, Bool.false_eq_true, Bool.not, Bool.not_false, Bool.not_true, Decidable.byContradiction, Decidable.decide, Eq, Eq.mpr, Eq.symm, Eq.trans, False, Fin, Fin.cases, Fin.succ, Fin.val_lt_of_le, GT.gt, Int, Int.add_one_le_of_lt, Int.natCast_add, Int.natCast_nonneg, Int.negOfNat, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.ofNat_le_of_le, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.ofNat_sub_dichotomy, Lean.Omega.Int.ofNat_sub_sub, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_0, Lean.Omega.LinearCombo.coordinate_eval_1, Lean.Omega.LinearCombo.coordinate_eval_2, Lean.Omega.LinearCombo.coordinate_eval_3, Lean.Omega.LinearCombo.coordinate_eval_4, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, List, List.length, List.length_set, List.set, Nat, Nat.add_sub_cancel, Nat.cast, Nat.le_of_not_lt, Nat.lt_of_succ_lt_succ, Nat.lt_or_gt_of_ne, Not, Or.elim, True, absurd, congr, congrArg, congrFun', eq_self, id, inferInstance, ite, ite_cond_eq_false, ite_cond_eq_true, le_of_le_of_eq, not_false_eq_true, of_decide_eq_true, of_eq_true, rfl
Frame.eq_of_associated_gf2
theorem Frame.eq_of_associated_gf2✝ (a b : Polynomial (ZMod 2)) (h : Associated a b) : a = b
Show details
fun a b h => Exists.casesOn h fun u hu => have hu1 := Exists.casesOn (Polynomial.isUnit_iff.mp (Units.isUnit u)) fun r h => And.casesOn h fun hr hru => have hr1 := have hall := of_decide_eq_true (id (Eq.refl true)); hall r (IsUnit.ne_zero hr); Eq.mpr (id (congrArg (fun _a => _a = 1) (Eq.symm hru))) (Eq.mpr (id (congrArg (fun _a => Polynomial.C _a = 1) hr1)) (Eq.mpr (id (congrArg (fun _a => _a = 1) (map_one Polynomial.C))) (Eq.refl 1))); Eq.mp (congrArg (fun _a => _a = b) (mul_one a)) (Eq.mp (congrArg (fun _a => a * _a = b) hu1) hu)
Complexity: 43991 (size of the value term)
Dependencies: instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: Associated, IsUnit, IsUnit.ne_zero, Polynomial, Polynomial.C, Polynomial.isUnit_iff, RingHom, Units, Units.isUnit, ZMod, map_one, mul_one
Lean core dependencies: And, Bool, Decidable.decide, Eq, Eq.mp, Eq.mpr, Eq.symm, Exists, Nat, Ne, congrArg, id, of_decide_eq_true
Used by: Frame.generator_not_dvd_pow
Frame.pos_length_of_any
theorem Frame.pos_length_of_any✝ (poly : List Bool) (hpoly : poly.any id = true) : 0 < poly.length
Show details
fun poly hpoly => List.casesOn (motive := fun x => x.any id = true → 0 < x.length) poly (fun hpoly => False.elim (Eq.mp Bool.false_eq_true hpoly)) (fun b bs hpoly => of_eq_true (Eq.trans (lt_add_iff_pos_left._simp_1 0) (Eq.trans Order.lt_add_one_iff._simp_1 zero_le._simp_1))) hpoly
Complexity: 939 (size of the value term)
Dependencies: (none)
Lean core dependencies: Bool, Bool.false_eq_true, Eq, Eq.mp, Eq.trans, False, False.elim, List, List.any, List.length, Nat, True, id, of_eq_true
Frame.generator_not_dvd_pow
theorem Frame.generator_not_dvd_pow✝ (poly : List Bool) (hpoly : poly.any id = true) (n : ℕ) : ¬Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Polynomial.X ^ n
Show details
fun poly hpoly n hdvd => have hk := Frame.pos_length_of_any✝ poly hpoly; Exists.casesOn ((dvd_prime_pow Polynomial.prime_X n).mp hdvd) fun i h => And.casesOn h fun left hassoc => have heq := Frame.eq_of_associated_gf2✝ (Polynomial.X ^ poly.length + Frame.toPoly✝ poly) (Polynomial.X ^ i) hassoc; have hdeg1 := Eq.mpr (id (congrArg (fun _a => _a = ↑poly.length) (Polynomial.degree_add_eq_left_of_degree_lt (Eq.mpr (id (congrArg (fun _a => (Frame.toPoly✝ poly).degree < _a) (Polynomial.degree_X_pow poly.length))) (Frame.toPoly_degree_lt✝ poly))))) (Polynomial.degree_X_pow poly.length); have hdeg2 := Polynomial.degree_X_pow i; have hik := cast Nat.cast_inj._simp_1 (Eq.mp (congrArg (fun _a => _a = ↑poly.length) hdeg2) (Eq.mp (congrArg (fun _a => _a.degree = ↑poly.length) heq) hdeg1)); Frame.toPoly_ne_zero_of_any✝ poly hpoly (Mathlib.Tactic.LinearCombination.eq_of_eq (Eq.mp (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly = Polynomial.X ^ _a) hik) heq) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf poly.length rfl (Eq.mpr (id (congrArg (fun _a => poly.length ^ Nat.rawCast 1 * Nat.rawCast 1 = poly.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right poly.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf poly.length rfl (Eq.mpr (id (congrArg (fun _a => poly.length ^ Nat.rawCast 1 * Nat.rawCast 1 = poly.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right poly.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ poly) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ poly ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ poly ^ Nat.rawCast 1 * Nat.rawCast 1 + (Polynomial.X ^ (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.sub_pf (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) Mathlib.Tactic.Ring.Common.neg_zero)) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ poly) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (poly.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)))))
Complexity: 1099496 (size of the value term)
Dependencies: Frame.toPoly, instFactPrimeOfNatNat_computerNetworks
Proof dependencies: Frame.eq_of_associated_gf2, Frame.pos_length_of_any, Frame.toPoly_degree_lt, Frame.toPoly_ne_zero_of_any
Mathlib dependencies: Associated, Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Polynomial.degree, Polynomial.degree_X_pow, Polynomial.degree_add_eq_left_of_degree_lt, Polynomial.prime_X, Ring, WithBot, ZMod, dvd_prime_pow
Frame.crcFrom_detects_single_bit_flip
theorem Frame.crcFrom_detects_single_bit_flip✝ (poly : List Bool) (hpoly : poly.any id = true) (init : List Bool) (hinit : init.length = poly.length) (bits : List Bool) (i : Fin bits.length) : Frame.crcFrom✝ poly init (bits.set ↑i !bits[i]) ≠ Frame.crcFrom✝ poly init bits
Show details
fun poly hpoly init hinit bits i heq => have hk := Frame.pos_length_of_any✝ poly hpoly; have hA := Frame.crc_poly_dvd✝ poly hk bits init hinit; have hB := have this := Frame.crc_poly_dvd✝ poly hk (bits.set ↑i !bits[i]) init hinit; Eq.mp (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcFrom✝ poly init (bits.set ↑i !bits[i])) + (Polynomial.X ^ _a * Frame.toPoly✝ init + Frame.toPoly✝ (bits.set ↑i !bits[i]))) List.length_set) this; have hsum := dvd_add hA hB; have hcancel := Mathlib.Tactic.LinearCombination.eq_of_eq (Mathlib.Tactic.LinearCombination.add_eq_eq (CharTwo.add_self_eq_zero (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits))) (CharTwo.add_self_eq_zero (Polynomial.X ^ bits.length * Frame.toPoly✝ init))) (Mathlib.Tactic.LinearCombination.eq_rearrange (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.Common.sub_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bits.length rfl (Eq.mpr (id (congrArg (fun _a => bits.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bits.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bits.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ init) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ init ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bits) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bits ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bits.length rfl (Eq.mpr (id (congrArg (fun _a => bits.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bits.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bits.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ init) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ init ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (bits.set ↑i !bits[i])) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 2 + (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 2) + (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 + (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ bits) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ bits ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (bits.set ↑i !bits[i])) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2)))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_congr (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bits.length rfl (Eq.mpr (id (congrArg (fun _a => bits.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bits.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bits.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ init) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ init ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.mul_congr (Mathlib.Tactic.Ring.Common.pow_congr (Mathlib.Tactic.Ring.Common.atom_pf Polynomial.X rfl (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 = Polynomial.X ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.atom_pf bits.length rfl (Eq.mpr (id (congrArg (fun _a => bits.length ^ Nat.rawCast 1 * Nat.rawCast 1 = bits.length ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.pow_add (Mathlib.Tactic.Ring.Common.single_pow (Mathlib.Tactic.Ring.Common.mul_pow_mul (Mathlib.Tactic.Ring.Common.mul_pf_right bits.length (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Mathlib.Meta.NormNum.IsNat.of_raw ℕ 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.one_pow (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) { out := rfl }) (Eq.mpr (id (congrArg (fun _a => Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 = Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * _a) (Eq.symm rfl))) (Eq.refl (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1))) (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))))) (Mathlib.Tactic.Ring.Common.pow_zero (Polynomial.X ^ Nat.rawCast 1 * Nat.rawCast 1 + 0) rfl) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1)))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.Common.atom_pf (Frame.toPoly✝ init) rfl (Eq.mpr (id (congrArg (fun _a => Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 = Frame.toPoly✝ init ^ Nat.rawCast 1 * _a) (Eq.symm rfl))) (Eq.refl (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1)))) (Mathlib.Tactic.Ring.Common.add_mul (Mathlib.Tactic.Ring.Common.mul_add (Mathlib.Tactic.Ring.Common.mul_pf_left Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.mul_pf_right (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 1))))) (Mathlib.Tactic.Ring.Common.mul_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * Nat.rawCast 1)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0))) (Mathlib.Tactic.Ring.Common.zero_mul (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 1) + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap (Mathlib.Tactic.Ring.Common.add_overlap_pf Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1) (Eq.refl 2))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))) (Mathlib.Tactic.Ring.Common.add_pf_add_lt (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 2) (Mathlib.Tactic.Ring.Common.add_pf_zero_add (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 2) + 0)))) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) ^ Nat.rawCast 1 * Nat.rawCast 2) (Mathlib.Tactic.Ring.Common.add_pf_add_gt (Polynomial.X ^ (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) * (Frame.toPoly✝ init ^ Nat.rawCast 1 * Nat.rawCast 2)) (Mathlib.Tactic.Ring.Common.add_pf_add_zero (Frame.toPoly✝ bits ^ Nat.rawCast 1 * Nat.rawCast 1 + (Frame.toPoly✝ (bits.set ↑i !bits[i]) ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))) (Mathlib.Tactic.Ring.Common.sub_pf (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Eq.refl (Int.negOfNat 2))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Eq.refl (Int.negOfNat 2)))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ bits) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) (Mathlib.Tactic.Ring.Common.neg_add (Mathlib.Tactic.Ring.Common.neg_mul (Frame.toPoly✝ (bits.set ↑i !bits[i])) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Eq.refl (Int.negOfNat 1))))) Mathlib.Tactic.Ring.Common.neg_zero)))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ (Frame.crcFrom✝ poly init bits)) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 2)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero Polynomial.X (bits.length ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ init) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 2)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 2)) (Eq.refl (Int.ofNat 0)))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ bits) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.Common.add_overlap_pf_zero (Frame.toPoly✝ (bits.set ↑i !bits[i])) (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw (Polynomial (ZMod 2)) 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Polynomial (ZMod 2)) (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.Common.add_pf_zero_add 0))))))) (Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat (Polynomial (ZMod 2)) Nat.cast_zero)))); Frame.generator_not_dvd_pow✝ poly hpoly (bits.length - 1 - ↑i) (Eq.mp (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ _a) (Frame.toPoly_set_flip✝ bits i)) (Eq.mp (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ _a) hcancel) (Eq.mp (congrArg (fun _a => Polynomial.X ^ poly.length + Frame.toPoly✝ poly ∣ Frame.toPoly✝ (Frame.crcFrom✝ poly init bits) + (Polynomial.X ^ bits.length * Frame.toPoly✝ init + Frame.toPoly✝ bits) + (Frame.toPoly✝ _a + (Polynomial.X ^ bits.length * Frame.toPoly✝ init + Frame.toPoly✝ (bits.set ↑i !bits[i])))) heq) hsum)))
Complexity: 16784121 (size of the value term)
Dependencies: Frame.crcFrom
Proof dependencies: Frame.crc_poly_dvd, Frame.generator_not_dvd_pow, Frame.pos_length_of_any, Frame.toPoly, Frame.toPoly_set_flip, instFactPrimeOfNatNat_computerNetworks
Mathlib dependencies: CharTwo.add_self_eq_zero, Int.rawCast, Mathlib.Meta.NormNum.IsInt.of_raw, Mathlib.Meta.NormNum.IsInt.to_isNat, Mathlib.Meta.NormNum.IsInt.to_raw_eq, Mathlib.Meta.NormNum.IsNat.of_raw, Mathlib.Meta.NormNum.IsNat.to_isInt, Mathlib.Meta.NormNum.IsNat.to_raw_eq, Mathlib.Meta.NormNum.isInt_add, Mathlib.Meta.NormNum.isInt_neg, Mathlib.Meta.NormNum.isNat_add, Mathlib.Meta.NormNum.isNat_mul, Mathlib.Meta.NormNum.isNat_ofNat, Mathlib.Tactic.LinearCombination.add_eq_eq, Mathlib.Tactic.LinearCombination.eq_of_eq, Mathlib.Tactic.LinearCombination.eq_rearrange, Mathlib.Tactic.Ring.Common.add_congr, Mathlib.Tactic.Ring.Common.add_mul, Mathlib.Tactic.Ring.Common.add_overlap_pf, Mathlib.Tactic.Ring.Common.add_overlap_pf_zero, Mathlib.Tactic.Ring.Common.add_pf_add_gt, Mathlib.Tactic.Ring.Common.add_pf_add_lt, Mathlib.Tactic.Ring.Common.add_pf_add_overlap, Mathlib.Tactic.Ring.Common.add_pf_add_overlap_zero, Mathlib.Tactic.Ring.Common.add_pf_add_zero, Mathlib.Tactic.Ring.Common.add_pf_zero_add, Mathlib.Tactic.Ring.Common.atom_pf, Mathlib.Tactic.Ring.Common.mul_add, Mathlib.Tactic.Ring.Common.mul_congr, Mathlib.Tactic.Ring.Common.mul_pf_left, Mathlib.Tactic.Ring.Common.mul_pf_right, Mathlib.Tactic.Ring.Common.mul_pow_mul, Mathlib.Tactic.Ring.Common.mul_zero, Mathlib.Tactic.Ring.Common.neg_add, Mathlib.Tactic.Ring.Common.neg_mul, Mathlib.Tactic.Ring.Common.neg_zero, Mathlib.Tactic.Ring.Common.one_pow, Mathlib.Tactic.Ring.Common.pow_add, Mathlib.Tactic.Ring.Common.pow_congr, Mathlib.Tactic.Ring.Common.pow_zero, Mathlib.Tactic.Ring.Common.single_pow, Mathlib.Tactic.Ring.Common.sub_congr, Mathlib.Tactic.Ring.Common.sub_pf, Mathlib.Tactic.Ring.Common.zero_mul, Mathlib.Tactic.Ring.cast_zero, Mathlib.Tactic.Ring.of_eq, Nat.cast_zero, Nat.rawCast, Polynomial, Polynomial.X, Ring, ZMod, dvd_add
Lean core dependencies: Bool, Bool.not, Decidable.byContradiction, Decidable.decide, Eq, Eq.mp, Eq.mpr, Eq.symm, Eq.trans, Fin, Int, Int.add_one_le_of_lt, Int.negOfNat, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.ofNat_le_of_le, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_2, Lean.Omega.LinearCombo.coordinate_eval_3, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.tidy_sat, List, List.any, List.length, List.length_set, List.set, Nat, Nat.cast, Nat.le_of_not_lt, Ne, Not, congrArg, id, inferInstance, le_of_le_of_eq, of_decide_eq_true, rfl
Frame.crc_detects_single_bit_flip
theorem Frame.crc_detects_single_bit_flip (poly : List Bool) (hpoly : poly.any id = true) (bits : List Bool) (i : Fin bits.length) : Frame.crc poly (bits.set ↑i !bits[i]) ≠ Frame.crc poly bits
Show details
fun poly hpoly bits i => Frame.crcFrom_detects_single_bit_flip✝ poly hpoly (List.replicate poly.length false) (of_eq_true (Eq.trans (congrFun' (congrArg Eq List.length_replicate) poly.length) (eq_self poly.length))) bits i
Complexity: 16784348 (size of the value term)
Dependencies: Frame.crc
Proof dependencies: Frame.crcFrom_detects_single_bit_flip
Lean core dependencies: Bool, Bool.not, Decidable.byContradiction, Eq, Eq.trans, Fin, List, List.any, List.length, List.length_replicate, List.replicate, List.set, Nat, Ne, Not, True, congrArg, congrFun', eq_self, id, of_eq_true
Used by: (none)
Frame.crc32EthernetPoly
def Frame.crc32EthernetPoly✝ : List Bool
Show details
| Frame.crc32EthernetPoly✝ = List.ofFn fun i => Nat.testBit 79764919 (31 - ↑i)
Complexity: 75 (size of the value term)
Outer dependencies: (none)
Frame.crc32EthernetPoly_any
theorem Frame.crc32EthernetPoly_any✝ : Frame.crc32EthernetPoly✝.any id = true
Show details
of_decide_eq_true (id (Eq.refl true))
Complexity: 152 (size of the value term)
Dependencies: Frame.crc32EthernetPoly
Lean core dependencies: Bool, Decidable.decide, Eq, List.any, id, of_decide_eq_true
Frame.reflectIndex
def Frame.reflectIndex✝ (k : ℕ) (hk : k % 8 = 0) (i : Fin k) : Fin k
Show details
| Frame.reflectIndex✝ k hk i = ⟨8 * (↑i / 8) + (7 - ↑i % 8), ⋯⟩
Complexity: 179 (size of the value term)
Outer dependencies: (none)
Lean core dependencies: And, Bool, Decidable.byContradiction, Decidable.decide, Eq, Eq.symm, Eq.trans, False, Fin, Int, Int.add_one_le_of_lt, Int.emod_def, Int.lt_mul_ediv_self_add, Int.mul_ediv_self_le, Int.natCast_add, Int.natCast_ediv, Int.natCast_emod, Int.natCast_mul, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.isZero, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.mul_congr, Lean.Omega.Int.ofNat_congr, Lean.Omega.Int.ofNat_le_of_le, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.ofNat_sub_dichotomy, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_0, Lean.Omega.LinearCombo.coordinate_eval_1, Lean.Omega.LinearCombo.coordinate_eval_2, Lean.Omega.LinearCombo.coordinate_eval_3, Lean.Omega.LinearCombo.coordinate_eval_4, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.mul, Lean.Omega.LinearCombo.mul_eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, Nat, Nat.cast, Nat.le_of_not_lt, Ne, Not, Or, Or.elim, id, le_of_le_of_eq, of_decide_eq_true
Frame.reflectIndex_involutive
theorem Frame.reflectIndex_involutive✝ (k : ℕ) (hk : k % 8 = 0) (i : Fin k) : Frame.reflectIndex✝ k hk (Frame.reflectIndex✝ k hk i) = i
Show details
fun k hk i => Fin.ext (id (Decidable.byContradiction fun a => Frame.reflectIndex_involutive._proof_1_2✝ k i a))
Complexity: 1376 (size of the value term)
Dependencies: Frame.reflectIndex
Lean core dependencies: And, Bool, Decidable.byContradiction, Decidable.decide, Eq, Eq.symm, Eq.trans, False, Fin, Fin.ext, GT.gt, Int, Int.add_one_le_of_lt, Int.emod_def, Int.lt_mul_ediv_self_add, Int.mul_ediv_self_le, Int.natCast_add, Int.natCast_ediv, Int.natCast_emod, Int.natCast_mul, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.isZero, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.mul_congr, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.ofNat_sub_dichotomy, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_2, Lean.Omega.LinearCombo.coordinate_eval_3, Lean.Omega.LinearCombo.coordinate_eval_4, Lean.Omega.LinearCombo.coordinate_eval_5, Lean.Omega.LinearCombo.coordinate_eval_6, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.mul, Lean.Omega.LinearCombo.mul_eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, Nat, Nat.cast, Nat.lt_or_gt_of_ne, Ne, Not, Or, Or.elim, id, le_of_le_of_eq, of_decide_eq_true
Frame.reflectEquiv
def Frame.reflectEquiv✝ (k : ℕ) (hk : k % 8 = 0) : Equiv.Perm (Fin k)
Show details
| Frame.reflectEquiv✝ k hk = { toFun := Frame.reflectIndex✝ k hk, invFun := Frame.reflectIndex✝ k hk, left_inv := ⋯, right_inv := ⋯ }
Complexity: 1630 (size of the value term)
Outer dependencies: (none)
Inner dependencies: Frame.reflectIndex, Frame.reflectIndex_involutive
Mathlib dependencies: Equiv.Perm
Frame.reflectEquiv_symm
theorem Frame.reflectEquiv_symm✝ (k : ℕ) (hk : k % 8 = 0) : Equiv.symm (Frame.reflectEquiv✝ k hk) = Frame.reflectEquiv✝ k hk
Show details
fun k hk => rfl
Complexity: 1699 (size of the value term)
Dependencies: Frame.reflectEquiv
Mathlib dependencies: Equiv, Equiv.symm
Frame.ofFn_update
theorem Frame.ofFn_update✝ {k : ℕ} (f : Fin k → Bool) (i : Fin k) (v : Bool) : List.ofFn (Function.update f i v) = (List.ofFn f).set (↑i) v
Show details
fun {k} f i v => List.ext_getElem (of_eq_true (Eq.trans (congr (congrArg Eq List.length_ofFn) (Eq.trans List.length_set List.length_ofFn)) (eq_self k))) fun n h1 h2 => Eq.mpr (id (congrFun' (congrArg Eq (List.getElem_ofFn h1)) ((List.ofFn f).set (↑i) v)[n])) (Or.casesOn (eq_or_ne n ↑i) (fun h => Eq.ndrec (motive := fun n => ∀ (h1 : n < (List.ofFn (Function.update f i v)).length) (h2 : n < ((List.ofFn f).set (↑i) v).length), Function.update f i v ⟨n, List.getElem_ofFn._proof_1 h1⟩ = ((List.ofFn f).set (↑i) v)[n]) (fun h1 h2 => of_eq_true (Eq.trans (congr (congrArg Eq (dite_cond_eq_true (eq_self i))) (List.getElem_set_self h2)) (eq_self v))) (Eq.symm h) h1 h2) fun h => of_eq_true (Eq.trans (congr (congrArg Eq (dite_cond_eq_false (Eq.trans Frame.ofFn_update._simp_1_1✝ (eq_false h)))) (Eq.trans (List.getElem_set_ne (of_eq_true (Eq.trans (congrArg Not (eq_false (Ne.symm h))) not_false_eq_true)) h2) (List.getElem_ofFn (List.getElem_set_ne._proof_1 h2)))) (eq_self (f ⟨n, List.getElem_ofFn._proof_1 h1⟩))))
Complexity: 4443 (size of the value term)
Dependencies: (none)
Mathlib dependencies: Function.update, eq_or_ne
Lean core dependencies: Bool, Eq, Eq.mpr, Eq.symm, Eq.trans, False, Fin, Fin.ext_iff, List, List.ext_getElem, List.getElem_ofFn, List.getElem_set_ne, List.getElem_set_self, List.length, List.length_ofFn, List.length_set, List.ofFn, List.set, Nat, Ne, Ne.symm, Not, Or, True, congr, congrArg, congrFun', dite_cond_eq_false, dite_cond_eq_true, eq_false, eq_self, id, not_false_eq_true, of_eq_true
Frame.crc32Ethernet
def Frame.crc32Ethernet (n : ℕ) (hn : n % 8 = 0) (payload : Fin n → Bool) : List Bool
Show details
| Frame.crc32Ethernet n hn payload = List.map not (Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (List.ofFn (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)))).reverse
Complexity: 2016 (size of the value term)
Outer dependencies: (none)
Inner dependencies: Frame.crc32EthernetPoly, Frame.crcFrom, Frame.reflectEquiv
Mathlib dependencies: Equiv.Perm
Lean core dependencies: Bool, Bool.not, Eq, Fin, Function.comp, List, List.map, List.ofFn, List.replicate, List.reverse, Nat
Frame.crc32Ethernet_detects_single_bit_flip
theorem Frame.crc32Ethernet_detects_single_bit_flip (n : ℕ) (hn : n % 8 = 0) (payload : Fin n → Bool) (i : Fin n) : Frame.crc32Ethernet n hn (Function.update payload i !payload i) ≠ Frame.crc32Ethernet n hn payload
Show details
fun n hn payload i heq => have hraw := have h1 := List.map_injective_iff.mpr (fun x y => Bool.casesOn (motive := fun t => x = t → (!x) = !y → x = y) x (fun h => Eq.ndrec (motive := fun x => (!x) = !y → x = y) (Bool.casesOn (motive := fun t => y = t → (!false) = !y → false = y) y (fun h => Eq.ndrec (motive := fun y => (!false) = !y → false = y) (of_eq_true (Eq.trans (implies_congr (Eq.trans (congr (congrArg Eq Bool.not_false) Bool.not_false) (eq_self true)) (eq_self false)) imp_self._simp_1)) (Eq.symm h)) (fun h => Eq.ndrec (motive := fun y => (!false) = !y → false = y) (of_eq_true (Eq.trans (implies_congr (Eq.trans (congr (congrArg Eq Bool.not_false) Bool.not_true) Bool.true_eq_false) Bool.false_eq_true) imp_self._simp_1)) (Eq.symm h)) (Eq.refl y)) (Eq.symm h)) (fun h => Eq.ndrec (motive := fun x => (!x) = !y → x = y) (Bool.casesOn (motive := fun t => y = t → (!true) = !y → true = y) y (fun h => Eq.ndrec (motive := fun y => (!true) = !y → true = y) (of_eq_true (Eq.trans (implies_congr (Eq.trans (congr (congrArg Eq Bool.not_true) Bool.not_false) Bool.false_eq_true) Bool.true_eq_false) imp_self._simp_1)) (Eq.symm h)) (fun h => Eq.ndrec (motive := fun y => (!true) = !y → true = y) (of_eq_true (Eq.trans (implies_congr (Eq.trans (congr (congrArg Eq Bool.not_true) Bool.not_true) (eq_self false)) (eq_self true)) imp_self._simp_1)) (Eq.symm h)) (Eq.refl y)) (Eq.symm h)) (Eq.refl x)) heq; id (Eq.mp (congr (congrArg Eq (List.reverse_reverse (Frame.crcFrom✝ Frame.crc32EthernetPoly✝ [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true] (List.ofFn ((Function.update payload i !payload i) ∘ ⇑(Frame.reflectEquiv✝ n hn)))))) (List.reverse_reverse (Frame.crcFrom✝ Frame.crc32EthernetPoly✝ [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true] (List.ofFn (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)))))) (congrArg List.reverse h1)); have hcomp := have this := Function.update_comp_equiv payload (Frame.reflectEquiv✝ n hn) i !payload i; Eq.mp (congrArg (fun _a => (Function.update payload i !payload i) ∘ ⇑(Frame.reflectEquiv✝ n hn) = Function.update (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)) (_a i) !payload i) (Frame.reflectEquiv_symm✝ n hn)) this; let bits := List.ofFn (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)); have hbits := rfl; have hlen := of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans (congrArg List.length hbits) List.length_ofFn)) n) (eq_self n)); let j := Fin.cast (Eq.symm hlen) ((Frame.reflectEquiv✝ n hn) i); have hjdef := rfl; have hjval := rfl; have hval := of_eq_true (Eq.trans (congrFun' (congrArg Eq (Eq.trans (GetElem.getElem.congr_simp bits (List.ofFn (payload ∘ Frame.reflectIndex✝ n hn)) hbits j j (Eq.refl j) (id (Decidable.byContradiction fun a => Frame.crc32Ethernet_detects_single_bit_flip._proof_1_2 n hn payload i hlen hjval a))) (Eq.trans (Eq.trans (GetElem.getElem.congr_simp (List.ofFn (payload ∘ Frame.reflectIndex✝ n hn)) (List.ofFn (payload ∘ Frame.reflectIndex✝ n hn)) (Eq.refl (List.ofFn (payload ∘ Frame.reflectIndex✝ n hn))) (↑j) (↑(Frame.reflectIndex✝ n hn i)) hjval (hbits ▸ Eq.refl j ▸ id (Decidable.byContradiction fun a => Frame.crc32Ethernet_detects_single_bit_flip._proof_1_2 n hn payload i hlen hjval a))) (List.getElem_ofFn (hjval ▸ hbits ▸ Eq.refl j ▸ id (Decidable.byContradiction fun a => Frame.crc32Ethernet_detects_single_bit_flip._proof_1_2 n hn payload i hlen hjval a)))) (congrArg payload (Frame.reflectIndex_involutive✝ n hn i))))) (payload i)) (eq_self (payload i))); Frame.crcFrom_detects_single_bit_flip✝ Frame.crc32EthernetPoly✝ Frame.crc32EthernetPoly_any✝ (List.replicate 32 true) (of_eq_true (Eq.trans (congr (congrArg Eq (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd ⋯) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) (Eq.trans (congrArg List.length (Eq.trans List.ofFn_succ (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 31))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 31 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 30))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 30 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 29))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 29 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 28))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 28 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 27))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 27 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 26))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 26 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 25))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 25 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 24))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 24 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 23))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 23 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 22))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 22 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 21))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 21 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 20))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 20 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 19))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 19 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 18))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 18 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 17))) (Eq.trans (Eq.trans (congrArg List.ofFn (funext fun i => congrArg (Nat.testBit 79764919) (Nat.Simproc.sub_add_eq_comm 17 (↑i) 1))) List.ofFn_succ) (congr (congrArg List.cons (congrArg (Nat.testBit 79764919) (tsub_zero 16))) (Eq.trans (Eq.trans (congrArg List.ofFn ⋯) List.ofFn_succ) (congr (congrArg List.cons ⋯) (Eq.trans ⋯ ⋯)))))))))))))))))))))))))))))))))))) (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd (congrFun' (congrArg HAdd.hAdd ⋯) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1)) 1))) (eq_self 32))) bits j (Eq.mp (congrArg (fun _a => Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (bits.set ↑j !_a) = Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) bits) (Eq.symm hval)) (Eq.mp (congrArg (fun _a => Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (bits.set _a !payload i) = Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) bits) (Eq.symm hjval)) (Eq.mp (congrArg (fun _a => Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (_a.set ↑((Frame.reflectEquiv✝ n hn) i) !payload i) = Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) _a) (have this := rfl; this)) (Eq.mp (congrArg (fun _a => Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) _a = Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (List.ofFn (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)))) (Frame.ofFn_update✝ (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)) ((Frame.reflectEquiv✝ n hn) i) !payload i)) (Eq.mp (congrArg (fun _a => Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (List.ofFn _a) = Frame.crcFrom✝ Frame.crc32EthernetPoly✝ (List.replicate 32 true) (List.ofFn (payload ∘ ⇑(Frame.reflectEquiv✝ n hn)))) hcomp) hraw)))))
Complexity: 16954358 (size of the value term)
Dependencies: Frame.crc32Ethernet
Proof dependencies: Frame.crc32EthernetPoly, Frame.crc32EthernetPoly_any, Frame.crcFrom, Frame.crcFrom_detects_single_bit_flip, Frame.ofFn_update, Frame.reflectEquiv, Frame.reflectEquiv_symm, Frame.reflectIndex, Frame.reflectIndex_involutive
Mathlib dependencies: Equiv, Equiv.Perm, Equiv.symm, Function.update, Function.update_comp_equiv, List.map_injective_iff, tsub_self, tsub_zero, zero_add
Lean core dependencies: Bool, Bool.false_eq_true, Bool.not, Bool.not_false, Bool.not_true, Bool.true_eq_false, Decidable.byContradiction, Decidable.decide, Eq, Eq.mp, Eq.symm, Eq.trans, False, Fin, Fin.cast, Fin.succ, Fin.val_eq_zero, Function.Injective, Function.comp, Int, Int.add_one_le_of_lt, Int.sub_eq_zero_of_eq, Int.sub_nonneg_of_le, Lean.Omega.Coeffs.ofList, Lean.Omega.Constraint.addEquality_sat, Lean.Omega.Constraint.addInequality_sat, Lean.Omega.Constraint.combine_sat', Lean.Omega.Constraint.isImpossible, Lean.Omega.Constraint.not_sat'_of_isImpossible, Lean.Omega.Int.add_congr, Lean.Omega.Int.ofNat_congr, Lean.Omega.Int.ofNat_le_of_le, Lean.Omega.Int.ofNat_lt_of_lt, Lean.Omega.Int.sub_congr, Lean.Omega.LinearCombo, Lean.Omega.LinearCombo.add_eval, Lean.Omega.LinearCombo.coordinate, Lean.Omega.LinearCombo.coordinate_eval_3, Lean.Omega.LinearCombo.coordinate_eval_4, Lean.Omega.LinearCombo.coordinate_eval_5, Lean.Omega.LinearCombo.eval, Lean.Omega.LinearCombo.sub_eval, Lean.Omega.combo_sat', Lean.Omega.tidy_sat, List, List.getElem_ofFn, List.length, List.length_ofFn, List.map, List.ofFn, List.ofFn_succ, List.ofFn_zero, List.replicate, List.reverse, List.reverse_reverse, List.set, Nat, Nat.Simproc.sub_add_eq_comm, Nat.cast, Nat.le_of_not_lt, Nat.testBit, Nat.testBit_zero, Ne, Not, True, congr, congrArg, congrFun', decide_true, eq_self, funext, id, implies_congr, le_of_le_of_eq, of_decide_eq_true, of_eq_true, rfl
Used by: (none)
Dependency diagram
Drag to pan, Ctrl+scroll (or Cmd+scroll, or pinch on a touch screen) to zoom, click a node to jump to it.