Frame

Difficulty: moderate — 10 definitions, 1 abbreviations, 18 lemmas, 6 theorems, 0 examples.

definition abbreviation lemma theorem
legend
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

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

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

structure Frame (poly : List Bool) (n k : ℕ) : Type
  • payload : Fin n → Bit
  • check : Fin k → Bit
Show details

Outer dependencies: (none)

Inner dependencies: Bit

Lean core dependencies: Bool, Eq, Fin, HEq, List, Nat, eq_of_heq

instance instNonemptyFrame {poly : List Bool} {n k : ℕ} : Nonempty (Frame poly n k)
Show details
fun {poly} {n k} =>
  Nonempty.intro
    { payload := fun x => Classical.choice inferInstance,
      check := fun x => Classical.choice inferInstance }

Complexity: 57 (size of the value term)

Outer dependencies: Frame

Inner dependencies: Bit

Lean core dependencies: Bool, Fin, List, Nat, Nonempty, inferInstance

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

Mathlib dependencies: Norm, Real

Lean core dependencies: Bool, Fin, List, Nat

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)

Outer dependencies: Bit, Frame

Inner dependencies: Frame.crc

Lean core dependencies: Bool, Fin, List, List.length, List.ofFn, Nat, Option.getD

Used by: Frame.make_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

Inner dependencies: Bit, Frame.crc

Lean core dependencies: Bool, Eq, Fin, List, List.length, List.ofFn, Nat, Option.getD

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

Lean core dependencies: Bool, Fin, List, List.length, Nat, rfl

Used by: (none)

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

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)

Mathlib dependencies: Polynomial, Polynomial.X, ZMod

Lean core dependencies: Bool, Eq, Eq.mpr, Eq.symm, List, List.length, Nat, PProd, PUnit, Unit, Unit.unit, congrArg, id, ite

theorem Frame.toPoly_one_add_one✝ : 1 + 1 = 0
Show details
CharTwo.add_self_eq_zero 1

Complexity: 464 (size of the value term)

Mathlib dependencies: CharTwo.add_self_eq_zero, Polynomial, ZMod

Lean core dependencies: Eq, Nat

Used by: Frame.toPoly_xor

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)

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)

Proof dependencies: Frame.toPoly_one_add_one

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)

Mathlib dependencies: Polynomial, Polynomial.X, ZMod, add_zero

Used by: (none)

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)

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)

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

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

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)

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

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)

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

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)

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

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)

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)

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)

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

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

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

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

Used by: (none)

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)

Lean core dependencies: Bool, Fin, List, List.ofFn, Nat, Nat.testBit

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

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)

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

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)

Mathlib dependencies: Equiv.Perm

Lean core dependencies: Eq, Fin, Nat

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

Lean core dependencies: Eq, Fin, Nat, rfl

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

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)

Mathlib dependencies: Equiv.Perm

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

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.

definitionabbreviationlemmatheoremdeclared elsewheredependencyproof dependency
legend