import ContractExact namespace SAct open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats FloatLib.Numerics Real abbrev F64:=FloatFormat.binary64 def dyM (n k:Nat):Model F64 := Model.roundDyadic F64 ⟨true,n, -(k:Int)⟩ @[inline] def toF (m:Model F64):Float:=Float.ofModel (Model.toFloatModel m) def tT:FloatArray := ⟨Array.ofFn (n:=64) fun j=>toF (Model.Transcendentals.CorrectlyRounded.exp (dyM j.val 6))⟩ def tM:FloatArray := ⟨Array.ofFn (n:=64) fun j=>toF (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j.val 6))⟩ def tE:FloatArray := ⟨Array.ofFn (n:=88) fun i=>toF (Model.Transcendentals.CorrectlyRounded.exp (dyM i.val 0))⟩ structure SC where (a b c d e f g:Float) @[noinline] def sc:SC:=⟨Float.ofBits 0xbf56c16c16c16c17,Float.ofBits 0x3f81111111111111,Float.ofBits 0xbfa5555555555555, Float.ofBits 0x3fc5555555555555,Float.ofBits 0xbfe0000000000000,Float.ofBits 0x3ff0000000000000,Float.ofBits 0x4000000000000000⟩ def tP:FloatArray:=⟨Array.ofFn (n:=256) fun j=>Float.ofBits ((j.val.toUInt64+873)<<<52)⟩ @[inline] def hq (r:Float):Float:=let C:=sc; let r2:=r*r; ((C.a*r+C.b)*r2+(C.c*r+C.d))*r2+(C.e*r+C.f) @[inline] def rnd (Y:UInt64):UInt32 := let ef:=Y>>>52 let f:=Y&&&0xFFFFFFFFFFFFF if 897 ≤ ef&&ef ≤ 1022&&1024 ≤ f&&f < 0xFFFFFFFFFFC00 && 2048 < (Y&&&0x1FFFFFFF)-0xFFFFC00 then ((Y+0x10000000)>>>29).toUInt32-0xC0000000 else 0xFFFFFFFF @[inline] def kOf (ee m:UInt64):UInt64:=if 144-ee < 24 then m>>>(144-ee) else 0 @[inline] def rOf (ee m:UInt64):Float := (if 144-ee < 24 then m&&&((1<<<(144-ee))-1) else m).toInt64.toFloat * tP.get! ee.toNat @[inline] def sgF (w:UInt32):UInt32 := let a:=w&&&0x7FFFFFFF if a < 0x00800000||0x7F800000 ≤ a then (if a==0 then 0x3F000000 else 0xFFFFFFFF) else if w < 0x80000000&&0x41900000 ≤ a then 0x3F800000 else if 0x42AE0000 ≤ a then 0xFFFFFFFF else let ee:=(a>>>23).toUInt64 let m:=((a&&&0x7FFFFF)|||0x800000).toUInt64 let k:=kOf ee m let r:=rOf ee m let t:=(tE.get! (k>>>6).toNat*tT.get! (k&&&63).toNat) * (sc.f-r*hq r) let d:=sc.f+t let y:=if w < 0x80000000 then sc.f/d else t/d rnd y.toBits @[inline] def thF (w:UInt32):UInt32 := let a:=w&&&0x7FFFFFFF if a < 0x00800000||0x7F800000 ≤ a then (if a==0 then w else 0xFFFFFFFF) else if 0x41180000 ≤ a then (w&&&0x80000000)+0x3F800000 else let ee:=(a>>>23).toUInt64+1 let m:=((a&&&0x7FFFFF)|||0x800000).toUInt64 let k:=kOf ee m let r:=rOf ee m let y:=if k < 64 then let nu:=tT.get! k.toNat*(r*hq r)-tM.get! k.toNat nu/(sc.g-nu) else let t:=(tE.get! (k>>>6).toNat*tT.get! (k&&&63).toNat) * (sc.f-r*hq r) (sc.f-t)/(sc.f+t) let o:=rnd y.toBits if o==0xFFFFFFFF then o else o+(w&&&0x80000000) def sg (w:UInt32):UInt32:=let o:=sgF w; if o==0xFFFFFFFF then sigmoidCR w else o def th (w:UInt32):UInt32:=let o:=thF w; if o==0xFFFFFFFF then tanhCR w else o noncomputable abbrev one:Float:=Float.ofBits 0x3ff0000000000000 noncomputable abbrev two:Float:=Float.ofBits 0x4000000000000000 noncomputable def rv (x:Float):ℝ:=Model.toReal (Model.ofFloatModel x.toModel) def fv (x:Float):Prop:=Model.isFinite (Model.ofFloatModel x.toModel)=true noncomputable def eW (w:UInt32):UInt64:=((w&&&0x7FFFFFFF)>>>23).toUInt64 noncomputable def mW (w:UInt32):UInt64:=((w&&&0x7FFFFFFF&&&0x7FFFFF)|||0x800000).toUInt64 noncomputable def cv (ee m:UInt64):ℝ:=(m.toNat:ℝ)*2^((ee.toNat:ℤ)-150) noncomputable def eT (k:UInt64) (r:Float):Float := (tE.get! (k>>>6).toNat*tT.get! (k&&&63).toNat)*(one-r*hq r) noncomputable def thM (ee m:UInt64):Float := let k:=kOf ee m let r:=rOf ee m if k < 64 then let nu:=tT.get! k.toNat*(r*hq r)-tM.get! k.toNat nu/(two-nu) else (one-eT k r)/(one+eT k r) noncomputable def thY (w:UInt32):Float:=thM (eW w+1) (mW w) noncomputable def sgY (w:UInt32):Float := let t:=eT (kOf (eW w) (mW w)) (rOf (eW w) (mW w)) if w < 0x80000000 then one/(one+t) else t/(one+t) theorem zp (k:ℕ):(2:ℝ)^(-(k:ℤ))=1/2^k:=by rw [zpow_neg,zpow_natCast,one_div] theorem fv_iff (x:Float):fv x ↔ x.isFinite=true:=by rw [fv, ← Model.toDyadic?_isSome_eq_isFinite,Model.toDyadic?_ieee_eq_model _ (by decide), Model.toModel_ofFloatModel] show _ ↔ x.toModel.unpack.isFinite=true cases x.toModel.unpack <;> rfl theorem pmax:(2:ℝ)^(60:ℕ) ≤ Model.toReal (Model.posMaxFinite F64):=by have h:=Model.abs_signed_mul_bpow_le_toReal_posMaxFinite F64 false 1 60 (by decide) (by decide) simp only [Bool.false_eq_true,ite_false,Nat.cast_one,one_mul] at h change |(2:ℝ)^(60:ℤ)| ≤ _ at h rw [abs_of_pos (by positivity)] at h exact_mod_cast h theorem p4:(4:ℝ) ≤ Model.toReal (Model.posMaxFinite F64):=le_trans (by norm_num) pmax theorem opF {z:Float} {M:Model F64} {v:ℝ} (e:Model.ofFloatModel z.toModel=M) (hf:Model.isFinite M=true) (hv:Model.toReal M=Model.roundAt F64 v) : fv z∧rv z=Model.roundAt F64 v:=⟨by unfold fv; rw [e]; exact hf,by unfold rv; rw [e]; exact hv⟩ theorem mulF (x y:Float) (hx:fv x) (hy:fv y) (hb : |rv x*rv y| ≤ 4) : fv (x*y)∧rv (x*y)=Model.roundAt F64 (rv x*rv y):=by have hm : |rv x| * |rv y| ≤ Model.toReal (Model.posMaxFinite F64):=by rw [← abs_mul]; exact hb.trans p4 exact opF (z:=x*y) (ExecFloat.Binary.toModel_ofFloat_mul_of_isFinite x y ((fv_iff x).1 hx) ((fv_iff y).1 hy)) (Model.isFinite_mul_of_abs_mul_le_posMaxFinite _ _ (by decide) hx hy hm) (Model.toReal_mul_eq_roundAt_of_abs_mul_le_posMaxFinite _ _ (by decide) hx hy hm) theorem addF (x y:Float) (hx:fv x) (hy:fv y) (h1 : |rv x| ≤ 2) (h2 : |rv y| ≤ 2) (_ : |rv x+rv y| ≤ 4):fv (x+y)∧rv (x+y)=Model.roundAt F64 (rv x+rv y):=by have hm : |rv x| + |rv y| ≤ Model.toReal (Model.posMaxFinite F64):=le_trans (by linarith) p4 exact opF (z:=x+y) (ExecFloat.Binary.toModel_ofFloat_add_of_isFinite x y ((fv_iff x).1 hx) ((fv_iff y).1 hy)) (Model.isFinite_add_of_abs_add_le_posMaxFinite _ _ (by decide) hx hy hm) (Model.toReal_add_eq_roundAt_of_abs_add_le_posMaxFinite _ _ (by decide) hx hy hm) theorem subF (x y:Float) (hx:fv x) (hy:fv y) (h1 : |rv x| ≤ 2) (h2 : |rv y| ≤ 2) (_ : |rv x-rv y| ≤ 4):fv (x-y)∧rv (x-y)=Model.roundAt F64 (rv x-rv y):=by have hm : |rv x| + |rv y| ≤ Model.toReal (Model.posMaxFinite F64):=le_trans (by linarith) p4 exact opF (z:=x-y) (ExecFloat.Binary.toModel_ofFloat_sub_of_isFinite x y ((fv_iff x).1 hx) ((fv_iff y).1 hy)) (Model.isFinite_sub_of_abs_add_le_posMaxFinite _ _ (by decide) hx hy hm) (Model.toReal_sub_eq_roundAt_of_abs_add_le_posMaxFinite _ _ (by decide) hx hy hm) theorem divF (x y:Float) (hx:fv x) (hy:fv y) (h0:rv y≠0) (hb : |rv x/rv y| ≤ 4) : fv (x/y)∧rv (x/y)=Model.roundAt F64 (rv x/rv y):=by have hz:Model.isZero (Model.ofFloatModel y.toModel)=false:=by cases hz:Model.isZero (Model.ofFloatModel y.toModel) · rfl · exact absurd (Model.toReal_eq_zero_of_isZero _ hz) h0 exact opF (z:=x/y) (ExecFloat.Binary.toModel_ofFloat_div_of_isFinite x y ((fv_iff x).1 hx) ((fv_iff y).1 hy)) (Model.isFinite_div_of_abs_div_le_posMaxFinite _ _ (by decide) hx hy hz (hb.trans p4)) (Model.toReal_div_eq_roundAt_of_abs_div_le_posMaxFinite _ _ (by decide) hx hy hz (hb.trans p4)) theorem inv2le {a b:ℕ} (h:a ≤ b):(1:ℝ)/2^b ≤ 1/2^a := one_div_le_one_div_of_le (by positivity) (pow_le_pow_right₀ (by norm_num) h) theorem rndA (x:ℝ) : |Model.roundAt F64 x-x| ≤ 1/2^53 * |x| + 1/2^256:=by have h:=Model.abs_roundAt_sub_le_unitRoundoffAt F64 x rw [Model.unitRoundoffAt_eq,Model.underflowErrorAt_eq] at h have e1:(2:ℝ)^(-((F64.fracWidth:ℤ)+1))=2^(-((53:ℕ):ℤ)):=by congr 1 have e2:(2:ℝ)^(FloatFormat.minSubnormalExponent F64-1) = 2^(-((1075:ℕ):ℤ)):=by congr 1 rw [e1,e2,zp,zp] at h exact h.trans (add_le_add le_rfl (inv2le (a:=256) (b:=1075) (by norm_num))) def Rel (a b δ:ℝ):Prop := |a-b| ≤ δ * |b| def Ap (x:Float) (X d:ℝ):Prop:=fv x∧Rel (rv x) X d theorem Rel.mono {a b d e:ℝ} (h:Rel a b d) (hde:d ≤ e):Rel a b e := h.trans (mul_le_mul_of_nonneg_right hde (abs_nonneg _)) theorem Rel.le {a b d:ℝ} (h:Rel a b d) : |a| ≤ (1+d) * |b| := by have:=abs_sub_abs_le_abs_sub a b; unfold Rel at h; linarith theorem Rel.ge {a b d:ℝ} (h:Rel a b d):(1-d) * |b| ≤ |a| := by have:=abs_sub_abs_le_abs_sub b a; rw [abs_sub_comm] at this; unfold Rel at h; linarith theorem Rel.zero {a b d:ℝ} (h:Rel a b d) (hb:b=0):a=0:=by unfold Rel at h; rw [hb,abs_zero,mul_zero,sub_zero] at h; exact abs_nonpos_iff.1 h theorem Rel.trans {a b c d e:ℝ} (h1:Rel a b d) (h2:Rel b c e) (hd:0 ≤ d:=by norm_num) : Rel a c (d+e+d*e):=by have hb:=h2.le unfold Rel at * calc |a-c| ≤ |a-b| + |b-c| := abs_sub_le a b c _ ≤ d * |b| + e * |c| := add_le_add h1 h2 _ ≤ d*((1+e) * |c|)+e * |c| := by gcongr _=(d+e+d*e) * |c| := by ring theorem Rel.mul {a1 b1 a2 b2 d1 d2:ℝ} (h1:Rel a1 b1 d1) (h2:Rel a2 b2 d2) (hd1:0 ≤ d1:=by norm_num) : Rel (a1*a2) (b1*b2) (d1+d2+d1*d2):=by have ha2:=h2.le unfold Rel at * rw [abs_mul b1 b2] calc |a1*a2-b1*b2| = |(a1-b1)*a2+b1*(a2-b2)| := by ring_nf _ ≤ |a1-b1| * |a2| + |b1| * |a2-b2| := by rw [← abs_mul, ← abs_mul]; exact abs_add_le _ _ _ ≤ (d1 * |b1|)*((1+d2) * |b2|) + |b1| * (d2 * |b2|):=by apply add_le_add · exact mul_le_mul h1 ha2 (abs_nonneg _) (mul_nonneg hd1 (abs_nonneg _)) · exact mul_le_mul_of_nonneg_left h2 (abs_nonneg _) _=(d1+d2+d1*d2)*(|b1| * |b2|):=by ring theorem Rel.div {a1 b1 a2 b2 d1 d2:ℝ} (h1:Rel a1 b1 d1) (h2:Rel a2 b2 d2) (hb2:b2≠0) (hd1:0 ≤ d1:=by norm_num) (hd2:0 ≤ d2:=by norm_num) (hd2':d2 < 1:=by norm_num) : Rel (a1/a2) (b1/b2) ((d1+d2)/(1-d2)):=by have hB:0 < |b2| := abs_pos.2 hb2 have ha2:=h2.ge have hA:0 < |a2| := lt_of_lt_of_le (mul_pos (by linarith) hB) ha2 unfold Rel at * rw [div_sub_div _ _ (abs_pos.1 hA) hb2,abs_div,abs_mul,abs_div] have hnum : |a1*b2-a2*b1| ≤ (d1+d2) * |b1| * |b2| := by calc |a1*b2-a2*b1| = |(a1-b1)*b2-b1*(a2-b2)| := by ring_nf _ ≤ |a1-b1| * |b2| + |b1| * |a2-b2| := by rw [← abs_mul, ← abs_mul]; exact abs_sub _ _ _ ≤ d1 * |b1| * |b2| + |b1| * (d2 * |b2|):=by apply add_le_add · exact mul_le_mul_of_nonneg_right h1 (abs_nonneg _) · exact mul_le_mul_of_nonneg_left h2 (abs_nonneg _) _=(d1+d2) * |b1| * |b2| := by ring rw [div_le_iff₀ (mul_pos hA hB)] have h1d:0 < 1-d2:=by linarith calc |a1*b2-a2*b1| ≤ (d1+d2) * |b1| * |b2| := hnum _=(d1+d2)/(1-d2)*(|b1| / |b2|)*((1-d2) * |b2| * |b2|):=by field_simp _ ≤ (d1+d2)/(1-d2)*(|b1| / |b2|)*(|a2| * |b2|):=by apply mul_le_mul_of_nonneg_left _ (by positivity) exact mul_le_mul_of_nonneg_right ha2 (abs_nonneg _) theorem Rel.add {a1 b1 a2 b2 d:ℝ} (h1:Rel a1 b1 d) (h2:Rel a2 b2 d) (hb1:0 ≤ b1) (hb2:0 ≤ b2):Rel (a1+a2) (b1+b2) d:=by unfold Rel at * rw [abs_of_nonneg hb1] at h1; rw [abs_of_nonneg hb2] at h2 rw [abs_of_nonneg (add_nonneg hb1 hb2)] calc |a1+a2-(b1+b2)| = |(a1-b1)+(a2-b2)| := by ring_nf _ ≤ |a1-b1| + |a2-b2| := abs_add_le _ _ _ ≤ d*b1+d*b2:=add_le_add h1 h2 _=d*(b1+b2):=by ring theorem rnd52 {x:ℝ} (hx:1/2^203 ≤ |x|) : Rel (Model.roundAt F64 x) x (1/2^52):=by unfold Rel; linarith [rndA x] theorem rndR {v b d:ℝ} (h:Rel v b d) (hd:d ≤ 1/2) (hb:b=0∨1/2^202 ≤ |b|) : Rel (Model.roundAt F64 v) b (d+1/2^51):=by rcases hb with hb | hb · rw [h.zero hb,Model.roundAt_zero,hb]; unfold Rel; simp · have h1:1/2 * |b| ≤ (1-d) * |b| := mul_le_mul_of_nonneg_right (by linarith) (abs_nonneg _) exact ((rnd52 (by linarith [h.ge])).trans h).mono (by linarith) theorem opR {z:Float} {v b d:ℝ} (hz : |v| ≤ 4 → fv z∧rv z=Model.roundAt F64 v) (h:Rel v b d) (hb:b=0∨1/2^202 ≤ b) (hB:b ≤ 2) (h0:0 ≤ b:=by positivity) (hd:d ≤ 1/2:=by norm_num):Ap z b (d+1/2^51):=by rw [← abs_of_nonneg h0] at hB have h1:(1+d) * |b| ≤ 3/2*2:=mul_le_mul (by linarith) hB (abs_nonneg _) (by norm_num) obtain ⟨f,e⟩:=hz (by linarith [h.le]) exact ⟨f,by rw [e]; exact rndR h hd (by rwa [abs_of_nonneg h0])⟩ theorem sgnW (u:UInt64):(u&&&0x8000000000000000 != 0)=(u>>>63 != 0):=by apply Bool.eq_iff_iff.2 simp only [bne_iff_ne,ne_eq, ← UInt64.toNat_inj] rw [UInt64.toNat_and,UInt64.toNat_shiftRight] change ¬(UInt64.toNat u)&&&2^(63:ℕ)=0 ↔ ¬(UInt64.toNat u)>>>63=0 rw [Nat.and_two_pow,Nat.shiftRight_eq_div_pow,Nat.testBit_eq_decide_div_mod_eq] have d:(UInt64.toNat u)/2^(63:ℕ) < 2:=Nat.div_lt_of_lt_mul u.toNat_lt rw [Nat.mod_eq_of_lt d] generalize (UInt64.toNat u)/2^(63:ℕ)=b at d ⊢ interval_cases b <;> simp theorem fldW (a:UInt64):Model.ofModelBits (fmt:=F64) a.toBitVec = Model.ofFields F64 (a>>>63 != 0) ((a>>>52)&&&2047).toNat (a&&&0xFFFFFFFFFFFFF).toNat:=by have d:Model.expField (Model.ofModelBits (fmt:=F64) a.toBitVec) = ((a>>>52)&&&2047).toNat:=rfl have e:Model.fracField (Model.ofModelBits (fmt:=F64) a.toBitVec) = (a&&&0xFFFFFFFFFFFFF).toNat:=rfl have g:Model.signBit (Model.ofModelBits (fmt:=F64) a.toBitVec) = (a>>>63 != 0):=by rw [← sgnW]; apply Bool.eq_iff_iff.mpr; simp only [Model.signBit,bne_iff_ne,ne_eq] rw [← UInt64.toBitVec_inj]; exact Iff.rfl rw [← Model.ofFields_signBit_expField_fracField (Model.ofModelBits (fmt:=F64) a.toBitVec),d,e,g] theorem valW (a:UInt64) (h0:((a>>>52)&&&2047).toNat≠0) (h1:((a>>>52)&&&2047).toNat < 2047) : Model.isFinite (Model.ofModelBits (fmt:=F64) a.toBitVec)=true ∧ Model.toReal (Model.ofModelBits (fmt:=F64) a.toBitVec) = (if (a>>>63 != 0) then (-1:ℝ) else 1)*((2^52+(a&&&0xFFFFFFFFFFFFF).toNat:ℕ):ℝ) * (2:ℝ)^((((a>>>52)&&&2047).toNat:ℤ)-1075):=by rw [fldW] have hf:(a&&&0xFFFFFFFFFFFFF).toNat < 2^F64.fracWidth:=by rw [UInt64.toNat_and]; exact lt_of_le_of_lt Nat.and_le_right (by decide) have he:((a>>>52)&&&2047).toNat < 2^F64.expWidth:=by show _ < 2^11; omega refine ⟨?_,?_⟩ · rw [Model.isFinite_ofFields _ _ _ _ he hf] show (((a>>>52)&&&2047).toNat != 2047)=true simp only [bne_iff_ne,ne_eq]; omega · rw [Model.toReal_ofFields_normal _ _ _ _ h0 (by show _ < 2047; exact h1) hf] simp only [show F64.fracWidth=52 from rfl, show F64.exponentBias=1023 from rfl,Model.pow2_eq_two_pow] change _*(2:ℝ)^_=_ congr 2 simp only [Int.ofNat_eq_natCast]; ring theorem ofBitsM (a:UInt64) (hv:¬ (a>>>52)&&&2047=2047) : Model.ofFloatModel (Float.ofBits a).toModel=Model.ofModelBits (fmt:=F64) a.toBitVec:=by have e1:Model.ofFloatModel (Float.ofBits a).toModel = Model.canonicalizeModel (Model.ofModelBits (fmt:=F64) a.toBitVec):=by show Model.ofFloatModel (Float.Model.ofBits a)=_ unfold Float.Model.ofBits; exact Model.ofFloatModel_pack _ rw [e1]; apply Model.canonicalizeModel_eq_self refine ⟨fun hE _=>absurd hE ?_⟩ intro hE; apply hv have:=congrArg BitVec.toNat hE have k1:F64.toModel.exponentBits=11:=rfl have k2:F64.toModel.mantissaBitsWithoutImplicit=52:=rfl simp [Float.Model.UnpackedFloat.unpackExponent,Model.toModelBits,Model.ofModelBits,k1,k2] at this change (BitVec.extractLsb' 52 11 (a.toBitVec:BitVec 64)).toNat=2047 at this rw [BitVec.extractLsb'_toNat] at this apply UInt64.toNat_inj.mp simp only [UInt64.toNat_and,UInt64.toNat_shiftRight,UInt64.reduceToNat] rw [show (2047:ℕ)=2^(11:ℕ)-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] simp only [UInt64.toNat_toBitVec,Nat.shiftRight_eq_div_pow] at this ⊢ have:=a.toNat_lt; omega theorem rvB (a:UInt64) (h0:((a>>>52)&&&2047).toNat≠0) (h1:((a>>>52)&&&2047).toNat < 2047) : fv (Float.ofBits a)∧rv (Float.ofBits a) = (if (a>>>63 != 0) then (-1:ℝ) else 1)*((2^52+(a&&&0xFFFFFFFFFFFFF).toNat:ℕ):ℝ) * (2:ℝ)^((((a>>>52)&&&2047).toNat:ℤ)-1075):=by have hv:¬ (a>>>52)&&&2047=2047:=fun h=>by rw [h] at h1; simp at h1 have ⟨f,v⟩:=valW a h0 h1 exact ⟨by unfold fv; rw [ofBitsM a hv]; exact f,by unfold rv; rw [ofBitsM a hv]; exact v⟩ theorem modelW (y:Float):Model.ofFloatModel y.toModel = Model.ofModelBits (fmt:=F64) y.toBits.toBitVec:=rfl theorem rndExact (d:FloatLib.Numerics.Dyadic) (l:d.significand < 2^(53:ℕ)) (g : -1074 ≤ d.exponent) (e : |d.toReal| ≤ 4):Model.roundAt F64 d.toReal=d.toReal:=by have ⟨h,j⟩:=Model.roundDyadic_of_representable F64 (by decide) d d.significand 0 (by simp only [pow_zero,mul_one]) l g (e.trans p4) rw [← Model.toReal_roundDyadic_eq_roundAt _ (by decide) d h,j] theorem i64F (i:Int64) (e:(Int.natAbs (Int64.toInt i)) < 2^(53:ℕ)) : fv i.toFloat∧rv i.toFloat=(Int64.toInt i):=by have g:Model.ofFloatModel i.toFloat.toModel = Model.roundDyadic FloatFormat.binary64 (FloatLib.Numerics.Dyadic.ofScaledInt (Int64.toInt i) 0):=by have h:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat_int64ToFloat i rw [FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat] at h rw [h, ← Model.ofModel_ofInt_eq_intToFloat FloatFormat.binary64 (by decide)] exact Model.ofModel_ofInt_eq_roundDyadic FloatFormat.binary64 (by decide) _ have d:(FloatLib.Numerics.Dyadic.ofScaledInt (Int64.toInt i) 0).toReal=(Int64.toInt i):=by rw [← FloatLib.Numerics.Dyadic.cast_toRat,FloatLib.Numerics.Dyadic.ofScaledInt_toRat]; simp have hb : |((Int64.toInt i:ℤ):ℝ)| ≤ (2:ℝ)^(60:ℕ):=by have h3:((Int.natAbs (Int64.toInt i):ℕ):ℝ) = |((Int64.toInt i:ℤ):ℝ)| := by rw [← Int.cast_natCast,Int.natCast_natAbs,Int.cast_abs] have:((Int.natAbs (Int64.toInt i):ℕ):ℝ) ≤ (2:ℝ)^(53:ℕ):=by exact_mod_cast e.le rw [← h3]; linarith only [this] have ⟨j,l⟩:=Model.roundDyadic_of_representable FloatFormat.binary64 (by decide) (FloatLib.Numerics.Dyadic.ofScaledInt (Int64.toInt i) 0) (Int.natAbs (Int64.toInt i)) 0 (by simp [FloatLib.Numerics.Dyadic.ofScaledInt]) e (by simp [FloatLib.Numerics.Dyadic.ofScaledInt]; decide) (by rw [d]; exact hb.trans pmax) exact ⟨by rw [fv,g]; exact j,by rw [rv,g,l,d]⟩ theorem i64U (u:UInt64) (h:u.toNat < 2^25):fv u.toInt64.toFloat∧rv u.toInt64.toFloat=u.toNat:=by have e:Int64.toInt u.toInt64=u.toNat:=by show u.toBitVec.toInt=_ rw [BitVec.toInt_eq_toNat_cond,UInt64.toNat_toBitVec] split <;> omega have ⟨f,v⟩:=i64F u.toInt64 (by rw [e]; simp only [Int.natAbs_natCast]; omega) exact ⟨f,by rw [v,e]; simp⟩ theorem pw2 (ee:UInt64) (h1:1 ≤ ee.toNat) (h2:ee.toNat ≤ 134) : fv (Float.ofBits ((ee+873)<<<52)) ∧ rv (Float.ofBits ((ee+873)<<<52))=(2:ℝ)^((ee.toNat:ℤ)-150):=by have q:((ee+873)<<<52).toNat=(ee.toNat+873)*2^52:=by rw [UInt64.toNat_shiftLeft,UInt64.toNat_add] simp only [UInt64.reduceToNat,Nat.shiftLeft_eq] rw [Nat.mod_eq_of_lt (a:=ee.toNat+873) (by omega)] simp only [Nat.reduceMod]; omega have f1:(((ee+873)<<<52>>>52)&&&2047).toNat=ee.toNat+873:=by rw [UInt64.toNat_and,UInt64.toNat_shiftRight,q] simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] rw [Nat.mul_div_cancel _ (by positivity),show (2047:ℕ)=2^11-1 from rfl, Nat.and_two_pow_sub_one_eq_mod]; omega have f2:(((ee+873)<<<52)&&&0xFFFFFFFFFFFFF).toNat=0:=by rw [UInt64.toNat_and,q]; simp only [UInt64.reduceToNat] rw [show (4503599627370495:ℕ)=2^52-1 from rfl,Nat.and_two_pow_sub_one_eq_mod]; simp have f3:((ee+873)<<<52>>>63 != 0)=false:=by rw [show (ee+873)<<<52>>>63=0 from UInt64.toNat_inj.mp (by rw [UInt64.toNat_shiftRight,q]; simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] exact Nat.div_eq_of_lt (by omega))]; rfl have ⟨f,v⟩:=rvB ((ee+873)<<<52) (by rw [f1]; omega) (by rw [f1]; omega) refine ⟨f,?_⟩ rw [v,f1,f2,f3,show ((ee.toNat+873:ℕ):ℤ)-1075=(ee.toNat:ℤ)-150 + -52 by push_cast; ring, zpow_add₀ two_ne_zero] norm_num; ring theorem tPe (ee:UInt64) (h:ee.toNat < 256):tP.get! ee.toNat=Float.ofBits ((ee+873)<<<52):=by show (Array.ofFn _)[ee.toNat]! = _ rw [getElem!_pos _ _ (by simpa using h),Array.getElem_ofFn]; simp theorem redSpec (ee m:UInt64) (he1:1 ≤ ee.toNat) (he2:ee.toNat ≤ 134) (hm2:m.toNat < 2^24) : fv (rOf ee m)∧0 ≤ rv (rOf ee m)∧rv (rOf ee m) ≤ 1/64 ∧ (rv (rOf ee m)=0∨1/2^150 ≤ rv (rOf ee m)) ∧ cv ee m=((kOf ee m).toNat:ℝ)/64+rv (rOf ee m):=by have hs:(144-ee).toNat=144-ee.toNat:=by rw [UInt64.toNat_sub_of_le _ _ (by rw [UInt64.le_iff_toNat_le]; simp; omega)]; simp generalize hS:144-ee.toNat=s at hs set rI:=(if 144-ee < 24 then m&&&((1<<<(144-ee))-1) else m) with hrI have hk:(kOf ee m).toNat=m.toNat/2^s∧rI.toNat=m.toNat%2^s:=by unfold kOf; rw [hrI] by_cases hc:144-ee < 24 · have hc':s < 24:=by rw [UInt64.lt_iff_toNat_lt,hs] at hc; simpa using hc simp only [hc,ite_true] constructor · rw [UInt64.toNat_shiftRight,hs,Nat.mod_eq_of_lt (by omega),Nat.shiftRight_eq_div_pow] · rw [UInt64.toNat_and,UInt64.toNat_sub_of_le,UInt64.toNat_shiftLeft,hs] · simp only [UInt64.reduceToNat,Nat.mod_eq_of_lt (show s < 64 by omega),Nat.shiftLeft_eq, one_mul] rw [Nat.mod_eq_of_lt (show 2^s < 2^64 from Nat.pow_lt_pow_right (by norm_num) (by omega)), Nat.and_two_pow_sub_one_eq_mod] · rw [UInt64.le_iff_toNat_le,UInt64.toNat_shiftLeft,hs] simp only [UInt64.reduceToNat,Nat.mod_eq_of_lt (show s < 64 by omega),Nat.shiftLeft_eq, one_mul] rw [Nat.mod_eq_of_lt (show 2^s < 2^64 from Nat.pow_lt_pow_right (by norm_num) (by omega))] exact Nat.one_le_two_pow · have hc':24 ≤ s:=by rw [UInt64.lt_iff_toNat_lt,hs] at hc; simp at hc; omega simp only [hc,ite_false] have:m.toNat < 2^s:=lt_of_lt_of_le hm2 (Nat.pow_le_pow_right (by norm_num) hc') exact ⟨by simp [Nat.div_eq_of_lt this],(Nat.mod_eq_of_lt this).symm⟩ have hP:(0:ℝ) < 2^((ee.toNat:ℤ)-150):=by positivity have e2:(2:ℝ)^s*2^((ee.toNat:ℤ)-150)=1/64:=by rw [← zpow_natCast, ← zpow_add₀ two_ne_zero,show ((s:ℕ):ℤ)+((ee.toNat:ℤ)-150) = -6 by omega] norm_num have hrs:rI.toNat < 2^s:=by rw [hk.2]; exact Nat.mod_lt _ (by positivity) have hval:(rI.toNat:ℝ)*2^((ee.toNat:ℤ)-150) ≤ 1/64:=by rw [← e2]; exact mul_le_mul_of_nonneg_right (by exact_mod_cast hrs.le) hP.le have hr25:rI.toNat < 2^25:=by rw [hk.2]; exact lt_of_le_of_lt (Nat.mod_le _ _) (by omega) have ⟨fi,vi⟩:=i64U rI hr25 have ⟨fp,vp⟩:=pw2 ee he1 he2 have ⟨fr,vr⟩:=mulF _ _ fi fp (by rw [vi,vp,abs_of_nonneg (by positivity)]; linarith only [hval]) have e0:rOf ee m=rI.toInt64.toFloat*Float.ofBits ((ee+873)<<<52):=by show rI.toInt64.toFloat*tP.get! ee.toNat=_; rw [tPe ee (by omega)] have hex:rv (rOf ee m)=(rI.toNat:ℝ)*2^((ee.toNat:ℤ)-150):=by rw [e0,vr,vi,vp, ← FloatLib.Numerics.Dyadic.toReal_mk_false] exact rndExact _ (by show rI.toNat < 2^53; omega) (by show (-1074:ℤ) ≤ (ee.toNat:ℤ)-150; omega) (by rw [FloatLib.Numerics.Dyadic.toReal_mk_false,abs_of_nonneg (by positivity)]; linarith only [hval]) rw [hex] refine ⟨e0 ▸ fr,by positivity,hval,?_,?_⟩ · rcases Nat.eq_zero_or_pos rI.toNat with h0 | h0 · left; rw [h0]; simp · right have h2:(1:ℝ)/2^150 ≤ 2^((ee.toNat:ℤ)-150):=by rw [← zp]; exact zpow_le_zpow_right₀ (by norm_num) (by omega) exact h2.trans (le_mul_of_one_le_left hP.le (by exact_mod_cast h0)) · unfold cv; rw [hk.1] have hm:m.toNat=2^s*(m.toNat/2^s)+rI.toNat:=by rw [hk.2]; exact (Nat.div_add_mod _ _).symm rw [show (m.toNat:ℝ)=(2^s*(m.toNat/2^s)+rI.toNat:ℕ) by rw [← hm]] push_cast rw [add_mul,mul_comm ((2:ℝ)^s),mul_assoc,e2]; ring theorem gLB (C:ℝ):C*exp (-C) ≤ 1-exp (-C):=by have h:=mul_le_mul_of_nonneg_left (add_one_le_exp C) (exp_pos (-C)).le rw [mul_add,mul_one, ← exp_add,neg_add_cancel,exp_zero] at h linarith theorem canonR (m:Model F64) : Model.toReal (Model.canonicalizeModel m)=Model.toReal m:=by rw [Model.toReal_eq_unpackedToReal_toModel (by decide), Model.toReal_eq_unpackedToReal_toModel (by decide),Model.toModel_canonicalizeModel] theorem canonF (m:Model F64) : Model.isFinite (Model.canonicalizeModel m)=Model.isFinite m:=by rw [← Model.toDyadic?_isSome_eq_isFinite, ← Model.toDyadic?_isSome_eq_isFinite, Model.toDyadic?_ieee_eq_model _ (by decide),Model.toDyadic?_ieee_eq_model _ (by decide), Model.toModel_canonicalizeModel] theorem toF_spec (m:Model F64) : (fv (toF m) ↔ Model.isFinite m=true)∧rv (toF m)=Model.toReal m:=by have e:Model.ofFloatModel (toF m).toModel=Model.canonicalizeModel m := Model.ofFloatModel_toFloatModel m exact ⟨by unfold fv; rw [e,canonF],by unfold rv; rw [e,canonR]⟩ theorem dyM_spec (n k:ℕ) (hn:n < 2^53) (hk:k ≤ 1000) : Model.isFinite (dyM n k)=true ∧ Model.toReal (dyM n k) = -((n:ℝ)*2^(-(k:ℤ))):=by have hv:(⟨true,n, -(k:ℤ)⟩:FloatLib.Numerics.Dyadic).toReal = -((n:ℝ)*2^(-(k:ℤ))):=by rw [Model.Dyadic.toReal_mk] change (if true=true then (-1:ℝ) else 1)*(n:ℝ)*(2:ℝ)^(-(k:ℤ))=_ simp have hb : |(⟨true,n, -(k:ℤ)⟩:FloatLib.Numerics.Dyadic).toReal| ≤ Model.toReal (Model.posMaxFinite F64):=by refine le_trans ?_ pmax rw [hv,abs_neg,abs_of_nonneg (by positivity)] have h1:(n:ℝ) ≤ 2^(53:ℕ):=by exact_mod_cast hn.le have h2:(2:ℝ)^(-(k:ℤ)) ≤ 1:=zpow_le_one_of_nonpos₀ (by norm_num) (by omega) calc (n:ℝ)*2^(-(k:ℤ)) ≤ 2^(53:ℕ)*1:=by gcongr _ ≤ 2^(60:ℕ):=by norm_num have hmin:F64.minSubnormalExponent = -1074:=rfl have ⟨h,j⟩:=Model.roundDyadic_of_representable F64 (by decide) ⟨true,n, -(k:ℤ)⟩ n 0 (by simp) hn (by rw [hmin]; show (-1074:ℤ) ≤ -(k:ℤ); omega) hb exact ⟨h,by unfold dyM; rw [j,hv]⟩ theorem expLB {x:ℝ} (hx:x ≤ 100):1/2^200 ≤ exp (-x):=by have h1:exp (-100) ≤ exp (-x):=exp_le_exp.2 (by linarith) have h2:exp 1 ≤ 3:=by have:=Real.exp_one_lt_d9; linarith have h3:exp (100:ℝ) ≤ 3^(100:ℕ):=by rw [show (100:ℝ)=((100:ℕ):ℝ)*1 by norm_num,Real.exp_nat_mul] exact pow_le_pow_left₀ (exp_pos 1).le h2 100 have h4:(3:ℝ)^(100:ℕ) ≤ 2^(200:ℕ):=by norm_num have h5:exp (-100)=1/exp 100:=by rw [Real.exp_neg,one_div] refine le_trans ?_ h1; rw [h5] exact one_div_le_one_div_of_le (exp_pos _) (h3.trans h4) theorem getT (j:ℕ) (hj:j < 64) : tT.get! j=toF (Model.Transcendentals.CorrectlyRounded.exp (dyM j 6)):=by show (Array.ofFn _)[j]! = _ rw [getElem!_pos _ _ (by simpa using hj),Array.getElem_ofFn] theorem getM (j:ℕ) (hj:j < 64) : tM.get! j=toF (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j 6)):=by show (Array.ofFn _)[j]! = _ rw [getElem!_pos _ _ (by simpa using hj),Array.getElem_ofFn] theorem getE (i:ℕ) (hi:i < 88) : tE.get! i=toF (Model.Transcendentals.CorrectlyRounded.exp (dyM i 0)):=by show (Array.ofFn _)[i]! = _ rw [getElem!_pos _ _ (by simpa using hi),Array.getElem_ofFn] theorem expTab (n k:ℕ) (hn:n < 2^53) (hk:k ≤ 1000) (hx:(n:ℝ)*2^(-(k:ℤ)) ≤ 100) : Ap (toF (Model.Transcendentals.CorrectlyRounded.exp (dyM n k))) (exp (-((n:ℝ)*2^(-(k:ℤ))))) (1/2^52):=by have ⟨hf,hv⟩:=dyM_spec n k hn hk have hr:exp (Model.toReal (dyM n k)) < Model.Transcendentals.Certified.overflowThreshold F64:=by refine lt_of_le_of_lt ?_ (Model.Transcendentals.CorrectlyRounded.one_lt_overflowThreshold (by decide)) have h0:(0:ℝ) ≤ n*2^(-(k:ℤ)):=by positivity rw [hv]; exact exp_le_one_iff.2 (by linarith) have h1:=Model.Transcendentals.CorrectlyRounded.toReal_exp_eq_roundAt (by decide) hf hr (budget := {}) have h2:=Model.Transcendentals.CorrectlyRounded.isFinite_exp (by decide) hf hr (budget := {}) have ⟨f3,v3⟩:=toF_spec (Model.Transcendentals.CorrectlyRounded.exp (dyM n k)) refine ⟨f3.2 h2,?_⟩ rw [v3,h1,hv] refine rnd52 ?_ rw [abs_of_pos (exp_pos _)] exact le_trans (inv2le (by norm_num)) (expLB hx) theorem tT_spec (j:ℕ) (hj:j < 64) : Ap (tT.get! j) (exp (-((j:ℝ)/64))) (1/2^52):=by have e:(j:ℝ)/64=(j:ℝ)*2^(-((6:ℕ):ℤ)):=by norm_num; ring have hj':(j:ℝ) ≤ 64:=by exact_mod_cast hj.le rw [getT j hj,e] exact expTab j 6 (by omega) (by norm_num) (by rw [← e]; linarith) theorem tE_spec (i:ℕ) (hi:i < 88) : Ap (tE.get! i) (exp (-(i:ℝ))) (1/2^52):=by have e:(i:ℝ)=(i:ℝ)*2^(-((0:ℕ):ℤ)):=by norm_num have hi':(i:ℝ) ≤ 88:=by exact_mod_cast hi.le rw [getE i hi]; conv=>arg 2; rw [e] exact expTab i 0 (by omega) (by norm_num) (by rw [← e]; linarith) theorem tM_spec (j:ℕ) (hj:j < 64) : Ap (tM.get! j) (exp (-((j:ℝ)/64))-1) (1/2^52):=by have ⟨hf,hv⟩:=dyM_spec j 6 (by omega) (by norm_num) have hv':Model.toReal (dyM j 6) = -((j:ℝ)/64):=by rw [hv]; norm_num; ring have h0:(0:ℝ) ≤ j:=by positivity have hE:exp (-((j:ℝ)/64)) ≤ 1:=exp_le_one_iff.2 (by linarith) have hr:exp (Model.toReal (dyM j 6))-1 < Model.Transcendentals.Certified.overflowThreshold F64:=by refine lt_of_le_of_lt ?_ (Model.Transcendentals.CorrectlyRounded.one_lt_overflowThreshold (by decide)) rw [hv']; linarith have h1:=Model.Transcendentals.CorrectlyRounded.toReal_expMinus1_eq_roundAt (by decide) hf hr (budget := {}) have h2:=Model.Transcendentals.CorrectlyRounded.isFinite_expMinus1 (by decide) hf hr (budget := {}) have ⟨f3,v3⟩:=toF_spec (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j 6)) rw [getM j hj] refine ⟨f3.2 h2,?_⟩ rw [v3,h1,hv'] rcases Nat.eq_zero_or_pos j with h0 | h0 · subst h0; unfold Rel; simp [Model.roundAt_zero] · refine rnd52 ?_ have hx:(1:ℝ)/64 ≤ (j:ℝ)/64:=by have:(1:ℝ) ≤ j:=by exact_mod_cast h0 linarith have h3:(1:ℝ)/3 ≤ exp (-((j:ℝ)/64)):=by have:=Real.exp_one_lt_d9 refine le_trans ?_ (exp_le_exp.2 (show -1 ≤ -((j:ℝ)/64) by have:(j:ℝ) ≤ 63:=by exact_mod_cast (by omega:j ≤ 63) linarith)) rw [Real.exp_neg,le_inv_comm₀ (by norm_num) (exp_pos 1)]; linarith have:=mul_le_mul hx h3 (by norm_num) (by positivity) rw [abs_of_nonpos (by linarith)] linarith only [gLB ((j:ℝ)/64),this] theorem cstE (a:UInt64) (s:Bool) (f e:ℕ) (h:(a>>>63 != 0)=s∧(a&&&0xFFFFFFFFFFFFF).toNat=f ∧ ((a>>>52)&&&2047).toNat=e∧e≠0∧e < 2047:=by decide):fv (Float.ofBits a) ∧ rv (Float.ofBits a)=(if s then -1 else 1)*((2^52+f:ℕ):ℝ)*2^((e:ℤ)-1075):=by obtain ⟨hs,hf,he,h0,h1⟩:=h; subst hs hf he; exact rvB a h0 h1 theorem cst (a:UInt64) (s:Bool) (f e:ℕ) (q:ℝ) (h:(a>>>63 != 0)=s ∧ (a&&&0xFFFFFFFFFFFFF).toNat=f∧((a>>>52)&&&2047).toNat=e∧e≠0∧e < 2047:=by decide) (hq : |(if s then -1 else 1)*((2^52+f:ℕ):ℝ)*2^((e:ℤ)-1075)-q| ≤ 1/2^52:=by norm_num [abs_le]):fv (Float.ofBits a) ∧ |rv (Float.ofBits a)-q| ≤ 1/2^52:=by have ⟨f,v⟩:=cstE a s f e h; exact ⟨f,by rw [v]; exact hq⟩ theorem kone:fv one∧rv one=1:=by have ⟨f,v⟩:=cstE 0x3ff0000000000000 false 0 1023; exact ⟨f,by rw [v]; norm_num⟩ theorem ktwo:fv two∧rv two=2:=by have ⟨f,v⟩:=cstE 0x4000000000000000 false 0 1024; exact ⟨f,by rw [v]; norm_num⟩ theorem hstep {s r c:Float} {S R C:ℝ} (hs:fv s) (hr:fv r) (hc:fv c) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (he : |rv s-S| ≤ 1/2^50) (hC : |rv c-C| ≤ 1/2^52) (hS : |S| ≤ 1:=by norm_num [abs_div]) (hC1 : |C| ≤ 3/2:=by norm_num [abs_div]) : fv (s*r+c) ∧ |rv (s*r+c)-(S*R+C)| ≤ 1/2^50 ∧ |S*R+C| ≤ 1/64 + |C| := by have a1 : |rv s| ≤ 2:=by linarith only [abs_sub_abs_le_abs_sub (rv s) S,he,hS] have a2 : |rv s*R| ≤ 1/32:=by rw [abs_mul,abs_of_nonneg h0]; exact (mul_le_mul a1 h1 h0 (by norm_num)).trans (by norm_num) have a3 : |rv s*R-S*R| ≤ 1/2^56:=by rw [← sub_mul,abs_mul,abs_of_nonneg h0]; exact (mul_le_mul he h1 h0 (by positivity)).trans (by norm_num) obtain ⟨fm,vm⟩:=mulF s r hs hr (by rw [hR]; linarith only [a2]) rw [hR] at vm have a4:=rndA (rv s*R); rw [← vm] at a4 have a5 : |rv (s*r)| ≤ 1/16:=by linarith only [abs_sub_abs_le_abs_sub (rv (s*r)) (rv s*R),a4,a2] have a6 : |rv c| ≤ 2:=by linarith only [abs_sub_abs_le_abs_sub (rv c) C,hC,hC1] have a8 : |rv (s*r)+rv c| ≤ 3:=by linarith only [abs_add_le (rv (s*r)) (rv c),a5,a6] obtain ⟨fa,va⟩:=addF _ c fm hc (by linarith only [a5]) a6 (by linarith only [a8]) have a7:=rndA (rv (s*r)+rv c); rw [← va] at a7 have a9 : |S*R| ≤ 1/64:=by rw [abs_mul,abs_of_nonneg h0]; exact (mul_le_mul hS h1 h0 (by norm_num)).trans (by norm_num) refine ⟨fa,?_,by linarith only [abs_add_le (S*R) C,a9]⟩ have b1:=abs_le.1 a7; have b2:=abs_le.1 a4; have b3:=abs_le.1 a3; have b4:=abs_le.1 hC rw [abs_le]; constructor <;> linarith only [b1.1,b1.2,b2.1,b2.2,b3.1,b3.2,b4.1,b4.2,a2,a8,abs_nonneg (rv s*R)] noncomputable def Q6 (R:ℝ):ℝ := ((((-1/720*R+1/120)*R + -1/24)*R+1/6)*R + -1/2)*R+1 theorem hqC {R R2 Y P2 P3:ℝ} (h0:0 ≤ R) (h1:R ≤ 1/64) (q1:0 ≤ R2) (q:|R2-R*R| ≤ 1/2^53*|R*R|+1/2^256) (e6:|Y-(((-1/720*R+1/120)*R2+P2)*R2+P3)| ≤ 1/2^50) (e2:|P2-(-1/24*R+1/6)| ≤ 1/2^50) (e3:|P3-(-1/2*R+1)| ≤ 1/2^50):|Y-Q6 R| ≤ 3/2^50:=by have R0:=mul_self_nonneg R have R1:R*R ≤ 1/4096:=(mul_le_mul h1 h1 h0 (by norm_num)).trans (by norm_num) rw [abs_of_nonneg R0] at q have D:|R2-R*R| ≤ 1/2^64:=q.trans (by linarith only [R1]) have D2:=(abs_le.1 D).2 have k1:|(P2-(-1/24*R+1/6))*R2| ≤ 1/2^50*(1/32):=by rw [abs_mul,abs_of_nonneg q1]; exact mul_le_mul e2 (by linarith only [D2,R1]) q1 (by positivity) have u:=add_nonneg q1 R0 have w:=mul_le_mul (show -1/720*R+1/120 ≤ 1/120 by linarith only [h0]) (show R2+R*R ≤ 1 by linarith only [D2,R1]) u (by norm_num) have x:=mul_nonneg (show (0:ℝ) ≤ -1/720*R+1/120 by linarith only [h1]) u have k2:|(R2-R*R)*((-1/24*R+1/6)+(-1/720*R+1/120)*(R2+R*R))| ≤ 1/2^64*1:=by rw [abs_mul]; exact mul_le_mul D (abs_le.2 ⟨(show (-1:ℝ) ≤ 0+0 by norm_num).trans (add_le_add (by linarith only [h1]) x), (add_le_add (show -1/24*R+1/6 ≤ 1/6 by linarith only [h0]) w).trans (by norm_num)⟩) (abs_nonneg _) (by positivity) have E:Y-Q6 R=(Y-(((-1/720*R+1/120)*R2+P2)*R2+P3))+(P2-(-1/24*R+1/6))*R2+(R2-R*R)*((-1/24*R+1/6)+(-1/720*R+1/120)*(R2+R*R))+(P3-(-1/2*R+1)):=by unfold Q6; ring rw [E]; exact ((abs_add_le _ _).trans (add_le_add ((abs_add_le _ _).trans (add_le_add ((abs_add_le _ _).trans (add_le_add e6 k1)) k2)) e3)).trans (by norm_num) theorem hqSpec (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) : fv (hq r) ∧ |rv (hq r)-Q6 R| ≤ 3/2^50:=by obtain ⟨f5,c5⟩:=cst 0xbf56c16c16c16c17 true 1901519842667543 1013 (-1/720) obtain ⟨f4,c4⟩:=cst 0x3f81111111111111 false 300239975158033 1016 (1/120) obtain ⟨f3,c3⟩:=cst 0xbfa5555555555555 true 1501199875790165 1018 (-1/24) obtain ⟨f2,c2⟩:=cst 0x3fc5555555555555 false 1501199875790165 1020 (1/6) obtain ⟨f1,c1⟩:=cst 0xbfe0000000000000 true 0 1022 (-1/2) obtain ⟨f0,c0⟩:=cst 0x3ff0000000000000 false 0 1023 1 have ⟨g1,e1,b1⟩:=hstep f5 hr f4 hR h0 h1 (c5.trans (by norm_num)) c4 have ⟨g2,e2,b2⟩:=hstep f3 hr f2 hR h0 h1 (c3.trans (by norm_num)) c2 have ⟨g3,e3,b3⟩:=hstep f1 hr f0 hR h0 h1 (c1.trans (by norm_num)) c0 have R0:=mul_self_nonneg R have R1:R*R ≤ 1/4096:=(mul_le_mul h1 h1 h0 (by norm_num)).trans (by norm_num) obtain ⟨g4,e4⟩:=mulF r r hr hr (by rw [hR,abs_of_nonneg R0]; exact R1.trans (by norm_num)) have q0:=rndA (rv r*rv r); rw [← e4,hR] at q0 have q1:0 ≤ rv (r*r):=by rw [e4]; have:=Model.roundAt_mono F64 (mul_self_nonneg (rv r)); rwa [Model.roundAt_zero] at this have q3:rv (r*r) ≤ 1/64:=by have:=(abs_le.1 q0).2; rw [abs_of_nonneg R0] at this; linarith only [this,R1] set p2:=Float.ofBits 0xbfa5555555555555*r+Float.ofBits 0x3fc5555555555555 set p3:=Float.ofBits 0xbfe0000000000000*r+Float.ofBits 0x3ff0000000000000 have k2:=(abs_sub_abs_le_abs_sub _ _).trans e2 have k3:=(abs_sub_abs_le_abs_sub _ _).trans e3 have ⟨g5,e5,b5⟩:=hstep (C:=rv p2) g1 g4 g2 rfl q1 q3 e1 (by simp) (b1.trans (by norm_num [abs_div])) (by linarith only [k2,b2,abs_of_pos (show (0:ℝ) < 1/6 by norm_num)]) obtain ⟨g6,e6,-⟩:=hstep (C:=rv p3) g5 g4 g3 rfl q1 q3 e5 (by simp) (b5.trans (by linarith only [k2,b2,abs_of_pos (show (0:ℝ) < 1/6 by norm_num)])) (by linarith only [k3,b3,abs_of_pos (show (0:ℝ) < 1 by norm_num)]) exact ⟨g6,hqC h0 h1 q1 q0 e6 e2 e3⟩ theorem trunc (R:ℝ) (h0:0 ≤ R) (h1:R ≤ 1/64) : |(1-exp (-R))-R*Q6 R| ≤ R/2^48:=by have h:=Real.exp_bound (x := -R) (by rw [abs_neg,abs_of_nonneg h0]; linarith) (n:=7) (by norm_num) have hs : ∑ m ∈ Finset.range 7,(-R)^m/(m.factorial:ℝ)=1-R*Q6 R:=by simp only [Finset.sum_range_succ,Finset.sum_range_zero,Nat.factorial,Q6]; push_cast; ring rw [hs,abs_neg,abs_of_nonneg h0] at h rw [show (1-exp (-R))-R*Q6 R = -(exp (-R)-(1-R*Q6 R)) by ring,abs_neg] refine h.trans ?_ have h6:R^6 ≤ (1/64)^6:=pow_le_pow_left₀ h0 h1 6 have hc:((Nat.succ 7:ℕ):ℝ)/((Nat.factorial 7:ℕ)*(7:ℕ))=1/4410:=by norm_num [Nat.factorial] rw [hc] calc R^7*(1/4410)=R*(R^6/4410):=by ring _ ≤ R*((1/64)^6/4410):=by gcongr _ ≤ R*(1/2^48):=mul_le_mul_of_nonneg_left (by norm_num) h0 _=R/2^48:=by ring theorem gSpec (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (hR0:R=0∨1/2^150 ≤ R) : Ap (r*hq r) (1-exp (-R)) (1/2^47):=by obtain ⟨fq,eq⟩:=hqSpec r R hr hR h0 h1 have hT:=trunc R h0 h1 have hE:=add_one_le_exp (-R) have hG:R*(63/64) ≤ 1-exp (-R):=by have:=mul_le_mul_of_nonneg_left (show 63/64 ≤ exp (-R) by linarith only [hE,h1]) h0 linarith only [gLB R,this] have e1 : |R*rv (hq r)-R*Q6 R| ≤ R*(3/2^50):=by rw [← mul_sub,abs_mul,abs_of_nonneg h0]; exact mul_le_mul_of_nonneg_left eq h0 have hv:Rel (rv r*rv (hq r)) (1-exp (-R)) (15/2^51):=by unfold Rel; rw [hR,abs_of_nonneg (show (0:ℝ) ≤ 1-exp (-R) by linarith only [hG,h0])] have:=abs_sub_le (R*rv (hq r)) (R*Q6 R) (1-exp (-R)) rw [abs_sub_comm (R*Q6 R)] at this; linarith only [this,e1,hT,hG,h0] have:=opR (mulF r (hq r) hr fq) hv (by rcases hR0 with hz | hz · left; rw [hz,neg_zero,exp_zero,sub_self] · right; linarith only [hG,hz]) (by linarith only [hE,h1]) (by linarith only [hG,h0]) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem Rel.neg {a b d:ℝ} (h:Rel a b d):Rel (-a) (-b) d:=by unfold Rel at *; rw [abs_neg b,show -a - -b = -(a-b) by ring,abs_neg]; exact h theorem Rel.b2 {a b d:ℝ} (h:Rel a b d) (hb : |b| ≤ 1) (hd:d ≤ 1:=by norm_num) : |a| ≤ 2:=by have:=mul_le_mul (show 1+d ≤ 2 by linarith) hb (abs_nonneg _) (by norm_num); linarith [h.le] theorem rel1 {d:ℝ} (hd:0 ≤ d):Rel 1 1 d:=by unfold Rel; simpa using hd theorem thirdE:(1:ℝ)/3 ≤ exp (-1):=by have:=Real.exp_one_lt_d9 rw [Real.exp_neg,le_inv_comm₀ (by norm_num) (exp_pos 1)]; linarith theorem halfE:exp (-1) ≤ 1/2:=by have:=Real.exp_one_gt_d9 rw [Real.exp_neg,inv_le_comm₀ (exp_pos 1) (by norm_num)]; linarith theorem kij (k:UInt64):(k>>>6).toNat=k.toNat/64∧(k&&&63).toNat=k.toNat%64:=by constructor · rw [UInt64.toNat_shiftRight]; simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] · rw [UInt64.toNat_and]; simp only [UInt64.reduceToNat] rw [show (63:ℕ)=2^6-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] theorem cast64 (k:ℕ):((k/64:ℕ):ℝ)+((k%64:ℕ):ℝ)/64=(k:ℝ)/64:=by have:(k:ℝ)=64*((k/64:ℕ):ℝ)+((k%64:ℕ):ℝ):=by exact_mod_cast (Nat.div_add_mod k 64).symm rw [this]; ring theorem erSpec (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (hR0:R=0∨1/2^150 ≤ R):Ap (one-r*hq r) (exp (-R)) (1/2^50):=by obtain ⟨fg,rg⟩:=gSpec r R hr hR h0 h1 hR0 obtain ⟨f1,v1⟩:=kone have hE:=add_one_le_exp (-R) have hG0:0 ≤ 1-exp (-R):=by linarith only [gLB R,mul_nonneg h0 (exp_pos (-R)).le] have hg:=rg; unfold Rel at hg; rw [abs_of_nonneg hG0] at hg have r0:Rel (rv one-rv (r*hq r)) (exp (-R)) (1/2^51):=by unfold Rel; rw [v1,abs_of_pos (exp_pos _),show 1-rv (r*hq r)-exp (-R) = -(rv (r*hq r)-(1-exp (-R))) by ring,abs_neg] linarith only [hg,hE,h1] have:=opR (subF _ _ f1 fg (by rw [v1]; norm_num) (rg.b2 (by rw [abs_of_nonneg hG0]; linarith only [exp_pos (-R)]))) r0 (Or.inr (by linarith only [hE,h1])) (by linarith only [exp_le_one_iff.2 (by linarith only [h0] : -R ≤ 0)]) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem expT (k:UInt64) (hk:k.toNat < 5632) (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (hR0:R=0∨1/2^150 ≤ R) : Ap (eT k r) (exp (-((k.toNat:ℝ)/64+R))) (1/2^48):=by obtain ⟨hki,hkj⟩:=kij k obtain ⟨fE,rE⟩:=tE_spec (k.toNat/64) (by omega) obtain ⟨fT,rT⟩:=tT_spec (k.toNat%64) (Nat.mod_lt _ (by norm_num)) obtain ⟨fer,rer⟩:=erSpec r R hr hR h0 h1 hR0 have hk':(k.toNat:ℝ)/64 ≤ 88:=by have:(k.toNat:ℝ) ≤ 5632:=by exact_mod_cast hk.le linarith only [this] have hk0:(0:ℝ) ≤ (k.toNat:ℝ)/64:=by positivity have eq2:exp (-((k.toNat/64:ℕ):ℝ))*exp (-(((k.toNat%64:ℕ):ℝ)/64)) = exp (-((k.toNat:ℝ)/64)):=by rw [← exp_add, ← cast64 k.toNat]; ring_nf have eq3:exp (-((k.toNat:ℝ)/64))*exp (-R)=exp (-((k.toNat:ℝ)/64+R)):=by rw [← exp_add]; ring_nf have p1:=expLB (x:=(k.toNat:ℝ)/64) (by linarith only [hk']) have p2:=expLB (x:=(k.toNat:ℝ)/64+R) (by linarith only [hk',h1]) have q1:exp (-((k.toNat:ℝ)/64)) ≤ 1:=exp_le_one_iff.2 (by linarith only [hk0]) have q2:exp (-((k.toNat:ℝ)/64+R)) ≤ 1:=exp_le_one_iff.2 (by linarith only [hk0,h0]) have ⟨fET,rET⟩:=opR (mulF _ _ fE fT) (rE.mul rT) (Or.inr (by rw [eq2]; linarith only [p1])) (by rw [eq2]; linarith only [q1]) rw [eq2] at rET have ⟨ft,rt⟩:=opR (mulF _ _ fET fer) (rET.mul rer) (Or.inr (by rw [eq3]; linarith only [p2])) (by rw [eq3]; linarith only [q2]) rw [eq3] at rt unfold eT; rw [hki,hkj] exact ⟨ft,rt.mono (by norm_num)⟩ theorem expP (j:ℕ) (hj:j < 64) (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (hR0:R=0∨1/2^150 ≤ R) : Ap (tT.get! j*(r*hq r)) (exp (-((j:ℝ)/64))*(1-exp (-R))) (9/2^50):=by obtain ⟨fT,rT⟩:=tT_spec j hj obtain ⟨fg,rg⟩:=gSpec r R hr hR h0 h1 hR0 have hj':(j:ℝ) ≤ 63:=by exact_mod_cast (by omega:j ≤ 63) have hE1:exp (-((j:ℝ)/64)) ≤ 1:=exp_le_one_iff.2 (by linarith only [(by positivity:(0:ℝ) ≤ j)]) have hE4:1/3 ≤ exp (-((j:ℝ)/64)):=thirdE.trans (exp_le_exp.2 (by linarith only [hj'])) have hE:=add_one_le_exp (-R) have hG:=mul_le_mul_of_nonneg_left (show 63/64 ≤ exp (-R) by linarith only [hE,h1]) h0 have hG0:0 ≤ 1-exp (-R):=by linarith only [gLB R,hG,h0] have:=opR (mulF _ _ fT fg) (rT.mul rg) (by rcases hR0 with hz | hz · left; rw [hz,neg_zero,exp_zero,sub_self,mul_zero] · right; linarith only [mul_le_mul_of_nonneg_right hE4 hG0,gLB R,hG,hz]) (by linarith only [mul_le_mul_of_nonneg_right hE1 hG0,hE,h1]) (mul_nonneg (exp_pos _).le hG0) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem expU (j:ℕ) (hj:j < 64) (r:Float) (R:ℝ) (hr:fv r) (hR:rv r=R) (h0:0 ≤ R) (h1:R ≤ 1/64) (hR0:R=0∨1/2^150 ≤ R) : Ap (tT.get! j*(r*hq r)-tM.get! j) (1-exp (-((j:ℝ)/64+R))) (5/2^47):=by obtain ⟨fp,rp⟩:=expP j hj r R hr hR h0 h1 hR0 obtain ⟨fM,rM⟩:=tM_spec j hj have hj0:(0:ℝ) ≤ j:=by positivity have hj':(j:ℝ) ≤ 63:=by exact_mod_cast (by omega:j ≤ 63) have hE1:exp (-((j:ℝ)/64)) ≤ 1:=exp_le_one_iff.2 (by linarith only [hj0]) have hE:=add_one_le_exp (-R) have hG0:0 ≤ 1-exp (-R):=by linarith only [gLB R,mul_nonneg h0 (exp_pos (-R)).le] have hEG:0 ≤ exp (-((j:ℝ)/64))*(1-exp (-R)):=mul_nonneg (exp_pos _).le hG0 have rMn:Rel (-rv (tM.get! j)) (1-exp (-((j:ℝ)/64))) (9/2^50):=by have:=rM.neg; rw [neg_sub] at this; exact this.mono (by norm_num) have es:=rp.add rMn hEG (by linarith only [hE1]) rw [show exp (-((j:ℝ)/64))*(1-exp (-R))+(1-exp (-((j:ℝ)/64))) = 1-exp (-((j:ℝ)/64+R)) by rw [neg_add,exp_add]; ring, ← sub_eq_add_neg] at es have hN3:=mul_le_mul_of_nonneg_left (thirdE.trans (exp_le_exp.2 (by linarith only [hj',h1] : -1 ≤ -((j:ℝ)/64+R)))) (by positivity:(0:ℝ) ≤ (j:ℝ)/64+R) have hN:=gLB ((j:ℝ)/64+R) have hP1 : |exp (-((j:ℝ)/64))*(1-exp (-R))| ≤ 1:=by rw [abs_of_nonneg hEG]; linarith only [mul_le_mul_of_nonneg_right hE1 hG0,hE,h1] have hM1 : |exp (-((j:ℝ)/64))-1| ≤ 1:=by rw [abs_of_nonpos (by linarith only [hE1])]; linarith only [exp_pos (-((j:ℝ)/64))] have:=opR (subF _ _ fp fM (rp.b2 hP1) (rM.b2 hM1)) es (by rcases hR0 with hz | hz · rcases Nat.eq_zero_or_pos j with hj1 | hj1 · left; rw [hz,hj1]; simp · right have:(1:ℝ) ≤ j:=by exact_mod_cast hj1 linarith only [hN,hN3,this,h0] · right; linarith only [hN,hN3,hz,hj0]) (by linarith only [exp_pos (-((j:ℝ)/64+R))]) (by linarith only [hN,hN3,hj0,h0]) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem dSpec (t:Float) (T d:ℝ) (ht:fv t) (hR:Rel (rv t) T d) (hT0:0 ≤ T) (hT1:T ≤ 1) (hd0:0 ≤ d:=by norm_num) (hd:d ≤ 1/4:=by norm_num) : Ap (one+t) (1+T) (d+1/2^51):=by obtain ⟨f1,v1⟩:=kone have ha:Rel (rv one+rv t) (1+T) d:=by rw [v1]; exact (rel1 hd0).add hR (by norm_num) hT0 exact opR (addF _ _ f1 ht (by rw [v1]; norm_num) (hR.b2 (by rw [abs_of_nonneg hT0]; exact hT1) (by linarith only [hd]))) ha (Or.inr (by linarith only [hT0])) (by linarith only [hT1]) (by linarith only [hT0]) (by linarith only [hd]) theorem dPos {x:Float} {D d:ℝ} (h:Rel (rv x) D d) (hd:d < 1) (hD:0 < D):rv x≠0 := fun e=>by have:=h.ge; rw [e,abs_zero,abs_of_pos hD] at this linarith only [this,mul_pos (by linarith only [hd]:(0:ℝ) < 1-d) hD] theorem qSpec {x d:Float} {X D dx dd:ℝ} (hx:fv x) (hd:fv d) (rx:Rel (rv x) X dx) (rd:Rel (rv d) D dd) (hD:1 ≤ D) (hD2:D ≤ 2) (hX0:1/2^201 ≤ X) (hX1:X ≤ 2) (hdx:0 ≤ dx:=by norm_num) (hdd:0 ≤ dd:=by norm_num) (hdd1:dd ≤ 1/8:=by norm_num) (hdx1:dx ≤ 1/8:=by norm_num):Ap (x/d) (X/D) ((dx+dd)/(1-dd)+1/2^51):=by have hq:X/D ≤ 2:=by rw [div_le_iff₀ (by linarith only [hD])]; linarith only [hD,hX1] have hq0:1/2^202 ≤ X/D:=by rw [le_div_iff₀ (by linarith only [hD])]; linarith only [hD2,hX0] exact opR (divF _ _ hx hd (dPos rd (by linarith only [hdd1]) (by linarith only [hD]))) (rx.div rd (by linarith only [hD]) hdx hdd (by linarith only [hdd1])) (Or.inr hq0) hq (le_trans (by positivity) hq0) (by rw [div_le_iff₀ (by linarith only [hdd1])]; linarith only [hdd1,hdx1,hdd]) theorem sgTail (t:Float) (T:ℝ) (ht:fv t) (hR:Rel (rv t) T (1/2^48)) (hT0:1/2^200 ≤ T) (hT1:T ≤ 1) : Ap (one/(one+t)) (1/(1+T)) (1/2^44)∧Ap (t/(one+t)) (T/(1+T)) (1/2^44):=by obtain ⟨f1,v1⟩:=kone have hT:0 ≤ T:=le_trans (by positivity) hT0 obtain ⟨fd,rd⟩:=dSpec t T _ ht hR hT hT1 have h1:Rel (rv one) 1 0:=by rw [v1]; exact rel1 le_rfl have a:=qSpec f1 fd h1 rd (by linarith only [hT]) (by linarith only [hT1]) (by norm_num) (by norm_num) have b:=qSpec ht fd hR rd (by linarith only [hT]) (by linarith only [hT1]) (le_trans (inv2le (by norm_num)) hT0) (by linarith only [hT1]) exact ⟨⟨a.1,a.2.mono (by norm_num)⟩,⟨b.1,b.2.mono (by norm_num)⟩⟩ theorem thTailT (t:Float) (T:ℝ) (ht:fv t) (hR:Rel (rv t) T (1/2^48)) (hT0:0 < T) (hT1:T ≤ 1/2):Ap ((one-t)/(one+t)) ((1-T)/(1+T)) (1/2^44):=by obtain ⟨f1,v1⟩:=kone obtain ⟨fd,rd⟩:=dSpec t T _ ht hR hT0.le (by linarith only [hT1]) have hT:0 < 1-T:=by linarith only [hT1] have r0:Rel (rv one-rv t) (1-T) (1/2^48):=by unfold Rel at hR ⊢; rw [abs_of_pos hT0] at hR; rw [v1,abs_of_pos hT] rw [show 1-rv t-(1-T) = -(rv t-T) by ring,abs_neg]; linarith only [hR,hT1] have ⟨fn,rn⟩:=opR (subF _ _ f1 ht (by rw [v1]; norm_num) (hR.b2 (by rw [abs_of_pos hT0]; linarith only [hT1]))) r0 (Or.inr (by linarith only [hT1])) (by linarith only [hT0]) hT.le have:=qSpec fn fd rn rd (by linarith only [hT0]) (by linarith only [hT1]) (by linarith only [hT1]) (by linarith only [hT0]) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem thTailU (nu:Float) (N:ℝ) (hn:fv nu) (hR:Rel (rv nu) N (5/2^47)) (hN0:1/2^200 ≤ N) (hN1:N ≤ 2/3):Ap (nu/(two-nu)) (N/(2-N)) (1/2^44):=by obtain ⟨f2,v2⟩:=ktwo have hN:0 < N:=lt_of_lt_of_le (by positivity) hN0 have hN2:0 < 2-N:=by linarith only [hN1] have r0:Rel (rv two-rv nu) (2-N) (5/2^48):=by unfold Rel at hR ⊢; rw [abs_of_pos hN] at hR; rw [v2,abs_of_pos hN2] rw [show 2-rv nu-(2-N) = -(rv nu-N) by ring,abs_neg]; linarith only [hR,hN1] have ⟨fd,rd⟩:=opR (subF _ _ f2 hn (by rw [v2]; norm_num) (hR.b2 (by rw [abs_of_pos hN]; linarith only [hN1]))) r0 (Or.inr (by linarith only [hN1])) (by linarith only [hN]) hN2.le have:=qSpec hn fd hR rd (by linarith only [hN1]) (by linarith only [hN]) (le_trans (inv2le (by norm_num)) hN0) (by linarith only [hN1]) exact ⟨this.1,this.2.mono (by norm_num)⟩ theorem thCore (ee m:UInt64) (he1:1 ≤ ee.toNat) (he2:ee.toNat ≤ 134) (hm:m.toNat < 2^24) (hc0:1/2^150 ≤ cv ee m) (hc:cv ee m < 19) : Ap (thM ee m) ((1-exp (-cv ee m))/(1+exp (-cv ee m))) (1/2^44):=by obtain ⟨fr,r0,r1,rz,hid⟩:=redSpec ee m he1 he2 hm unfold thM; dsimp only split_ifs with hk64 · have hk':(kOf ee m).toNat < 64:=by rwa [UInt64.lt_iff_toNat_lt] at hk64 obtain ⟨fn,rn⟩:=expU _ hk' _ _ fr rfl r0 r1 rz rw [← hid] at rn have h63:((kOf ee m).toNat:ℝ) ≤ 63:=by exact_mod_cast (by omega:(kOf ee m).toNat ≤ 63) have hE3:1/3 ≤ exp (-cv ee m):=thirdE.trans (exp_le_exp.2 (by linarith only [hid,h63,r1])) have hc3:=mul_le_mul_of_nonneg_left hE3 (le_trans (by positivity) hc0) have:=thTailU _ _ fn rn (by linarith only [gLB (cv ee m),hc3,hc0]) (by linarith only [hE3]) rwa [show (2:ℝ)-(1-exp (-cv ee m))=1+exp (-cv ee m) by ring] at this · have hk':64 ≤ (kOf ee m).toNat:=by rw [UInt64.lt_iff_toNat_lt] at hk64; simpa using hk64 have h64:(64:ℝ) ≤ (kOf ee m).toNat:=by exact_mod_cast hk' obtain ⟨ft,rt⟩:=expT _ (by exact_mod_cast (by linarith only [hid,h64,r0,hc] : ((kOf ee m).toNat:ℝ) < 5632)) _ _ fr rfl r0 r1 rz rw [← hid] at rt exact thTailT _ _ ft rt (exp_pos _) (le_trans (exp_le_exp.2 (by linarith only [hid,h64,r0])) halfE) theorem rse (f m:ℕ) (hw:f%2^29+1024 < 2^28∨2^28+1024 < f%2^29) (hm1:2^52+f ≤ m+1024) (hm2:m ≤ 2^52+f+1024) : roundShiftRightEven m 29=2^23+(f+2^28)/2^29:=by rw [roundShiftRightEven_def] have e1:Nat.shiftRight m 29=m/2^29:=Nat.shiftRight_eq_div_pow m 29 have e2:Nat.shiftLeft (m/2^29) 29=m/2^29*2^29:=Nat.shiftLeft_eq _ _ simp only [show (29==0)=false from rfl,Bool.false_eq_true,ite_false,e1,e2, show 29-1=28 from rfl] split_ifs <;> omega theorem rndN (Y:UInt64) (h:rnd Y≠0xFFFFFFFF) : 897 ≤ Y.toNat/2^52∧Y.toNat/2^52 ≤ 1022∧1024 ≤ Y.toNat%2^52 ∧ Y.toNat%2^52+1024 < 2^52 ∧ (Y.toNat%2^52%2^29+1024 < 2^28∨2^28+1024 < Y.toNat%2^52%2^29) ∧ (rnd Y).toNat=(Y.toNat/2^52-896)*2^23+(Y.toNat%2^52+2^28)/2^29 ∧ ((Y>>>52)&&&2047).toNat=Y.toNat/2^52 ∧ (Y&&&0xFFFFFFFFFFFFF).toNat=Y.toNat%2^52∧(Y>>>63 != 0)=false:=by have hY:=Y.toNat_lt have hf:(Y&&&0xFFFFFFFFFFFFF).toNat=Y.toNat%2^52:=by rw [UInt64.toNat_and]; simp only [UInt64.reduceToNat] rw [show (4503599627370495:ℕ)=2^52-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] unfold rnd at h ⊢; dsimp only at h ⊢ split at h · rename_i hc rw [ite_eq_left hc] simp only [Bool.and_eq_true,decide_eq_true_eq] at hc obtain ⟨⟨⟨⟨c1,c2⟩,c3⟩,c4⟩,c5⟩:=hc rw [UInt64.le_iff_toNat_le,UInt64.toNat_shiftRight] at c1 c2 rw [UInt64.le_iff_toNat_le,hf] at c3 rw [UInt64.lt_iff_toNat_lt,hf] at c4 rw [UInt64.lt_iff_toNat_lt,UInt64.toNat_sub,UInt64.toNat_and] at c5 simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] at c1 c2 c3 c4 c5 rw [show (536870911:ℕ)=2^29-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] at c5 have hm:Y.toNat%2^52%2^29=Y.toNat%2^29:=Nat.mod_mod_of_dvd _ (by norm_num) refine ⟨c1,c2,c3,by omega,by rw [hm]; omega,?_,?_,hf,?_⟩ · rw [UInt32.toNat_sub,UInt64.toNat_toUInt32,UInt64.toNat_shiftRight,UInt64.toNat_add] simp only [UInt64.reduceToNat,UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] omega · rw [UInt64.toNat_and,UInt64.toNat_shiftRight] simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] rw [show (2047:ℕ)=2^11-1 from rfl,Nat.and_two_pow_sub_one_eq_mod]; omega · have:Y>>>63=0:=UInt64.toNat_inj.mp (by rw [UInt64.toNat_shiftRight]; simp only [UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] omega) rw [this]; rfl · exact absurd rfl h theorem rwN (neg:Bool) (ef f m:ℕ) (h1:897 ≤ ef) (h2:ef ≤ 1022) (h3:1024 ≤ f) (h4:f+1024 < 2^52) (hw:f%2^29+1024 < 2^28∨2^28+1024 < f%2^29) (hm1:2^52+f ≤ m+1024) (hm2:m ≤ 2^52+f+1024) : FastRound.roundW neg m ((ef:ℤ)-1075) = (if neg then 0x80000000 else 0)+UInt32.ofNat ((ef-896)*2^23+(f+2^28)/2^29):=by have hL:m.log2=52:=by rw [Nat.log2_eq_iff (by omega)]; omega unfold FastRound.roundW simp only [hL,show 52-23=29 from rfl,rse f m hw hm1 hm2,FastRound.p23,FastRound.p24] have hq:(f+2^28)/2^29 ≤ 2^23:=by omega rw [ite_eq_left ⟨by norm_num,by omega,by omega,by omega,by omega⟩,add_assoc] refine congrArg (fun x=>(if neg=true then 2147483648 else 0)+x) ?_ generalize (f+2^28)/2^29=q at * apply UInt32.toNat_inj.mp simp only [UInt32.toNat_add,UInt32.toNat_shiftLeft,Nat.toUInt32,UInt32.toNat_ofNat',UInt32.reduceToNat, Nat.reduceMod,Nat.shiftLeft_eq] split_ifs <;> omega theorem encl {y v P:ℝ} {M:ℕ} (hR:Rel y v (1/2^44)) (hv:0 < v) (hP:0 < P) (hy:y=M*P) (hM:M < 2^53) : ((M:ℝ)-1024)*P ≤ v∧v ≤ ((M:ℝ)+1024)*P:=by unfold Rel at hR; rw [abs_of_pos hv,hy] at hR have h1:(M:ℝ)*P ≤ 2^53*P:=mul_le_mul_of_nonneg_right (by exact_mod_cast hM.le) hP.le have h2:=abs_le.1 hR constructor <;> linarith only [h2.1,h2.2,h1,hv,hP] theorem wordOK (a:UInt32) (h1:2^23 ≤ a.toNat%2^31) (h2:a.toNat%2^31 < 255*2^23) : expOf a≠255∧(decodeD a).significand≠0:=by have he:(expOf a).toNat=a.toNat/2^23%256:=by simp only [expOf,UInt32.toNat_and,UInt32.toNat_shiftRight,UInt32.reduceToNat,Nat.reduceMod, Nat.shiftRight_eq_div_pow] rw [show (255:ℕ)=2^8-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have ha:=a.toNat_lt have hx:a.toNat/2^23%256=a.toNat%2^31/2^23:=by omega refine ⟨fun h => ?_,?_⟩ · have:=congrArg UInt32.toNat h; rw [he] at this; simp at this; omega · unfold decodeD have hne:¬ expOf a=0:=fun h=>by have:=congrArg UInt32.toNat h; rw [he] at this; simp at this; omega simp only [hne,ite_false]; omega theorem fin (y:Float) (v:ℝ) (hv:0 < v) (hR:Rel (rv y) v (1/2^44)) (ho:rnd y.toBits≠0xFFFFFFFF) (neg:Bool) {z:Model Fmt} (hz:Model.toReal z=Model.roundAt Fmt (if neg then -v else v)) : toWord z=(if neg then 0x80000000 else 0)+rnd y.toBits:=by obtain ⟨h1,h2,h3,h4,hw,hN,hef,hf,hs⟩:=rndN y.toBits ho generalize y.toBits.toNat/2^52=ef at * generalize y.toBits.toNat%2^52=f at * have hyv:rv y=((2^52+f:ℕ):ℝ)*2^((ef:ℤ)-1075):=by unfold rv; rw [modelW] have ⟨_,v1⟩:=valW y.toBits (by omega) (by omega) rw [v1,hef,hf,hs]; simp have ⟨lo,hi⟩:=encl hR hv (by positivity) hyv (by omega) have hr:rnd y.toBits=UInt32.ofNat ((ef-896)*2^23+(f+2^28)/2^29) := UInt32.toNat_inj.mp (by rw [hN,UInt32.toNat_ofNat']; omega) have hW1:=rwN neg ef f (2^52+f-1024) h1 h2 h3 h4 hw (by omega) (by omega) have hW2:=rwN neg ef f (2^52+f+1024) h1 h2 h3 h4 hw (by omega) (by omega) rw [← hr] at hW1 hW2 have hok:=wordOK ((if neg then 0x80000000 else 0)+rnd y.toBits) (by cases neg <;> simp [UInt32.toNat_add] <;> omega) (by cases neg <;> simp [UInt32.toNat_add] <;> omega) have c1:(((2^52+f-1024:ℕ):ℤ):ℝ)=((2^52+f:ℕ):ℝ)-1024:=by rw [Int.cast_natCast,Nat.cast_sub (by omega)]; push_cast; ring have c2:(((2^52+f+1024:ℕ):ℤ):ℝ)=((2^52+f:ℕ):ℝ)+1024:=by push_cast; ring cases neg · rw [FastRound.roundW_signed _ _ _ (by omega)] at hW1 hW2 simp only [Bool.false_eq_true,ite_false] at hW1 hW2 hz ⊢ exact FastRound.bracket_spec (by omega) (by omega) hW1 hW2 hok.1 hok.2 (by rw [c1]; exact lo) (by rw [c2]; exact hi) hz · rw [FastRound.roundW_signed _ _ _ (by omega)] at hW1 hW2 simp only [ite_true] at hW1 hW2 hz ⊢ refine FastRound.bracket_spec (by omega) (by omega) hW2 hW1 hok.1 hok.2 ?_ ?_ hz · rw [Int.cast_neg,c2]; linarith only [hi] · rw [Int.cast_neg,c1]; linarith only [lo] theorem toReal_ofW' (w:UInt32) (hfin:expOf w≠255) : Model.toReal (ofW w) = (if (decodeD w).negative then -1 else 1)*((decodeD w).significand*(2:ℝ)^(decodeD w).exponent):=by rw [Model.toReal_eq,ofW,toDyadic_ofUInt32 _ hfin] simp only [FloatLib.Numerics.Dyadic.toReal,FloatLib.Numerics.Dyadic.cast_signedSignificand] ring theorem dec32 (w:UInt32) : (eW w).toNat=(expOf w).toNat∧(mW w).toNat=2^23+(fracOf w).toNat ∧ (w&&&0x7FFFFFFF).toNat=(expOf w).toNat*2^23+(fracOf w).toNat ∧ (fracOf w).toNat < 2^23 ∧ (signOf w=true ↔ 0x80000000 ≤ w) ∧ (w&&&0x80000000).toNat=(if signOf w then 2^31 else 0):=by unfold eW mW have hw:=w.toNat_lt have ha:(w&&&0x7FFFFFFF).toNat=w.toNat%2^31:=by rw [UInt32.toNat_and]; simp only [UInt32.reduceToNat] rw [show (2147483647:ℕ)=2^31-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have he:(expOf w).toNat=w.toNat/2^23%256:=by simp only [expOf,UInt32.toNat_and,UInt32.toNat_shiftRight,UInt32.reduceToNat,Nat.reduceMod, Nat.shiftRight_eq_div_pow] rw [show (255:ℕ)=2^8-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have hf:(fracOf w).toNat=w.toNat%2^23:=by simp only [fracOf,UInt32.toNat_and,UInt32.reduceToNat] rw [show (8388607:ℕ)=2^23-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have hs:(w&&&0x80000000).toNat=w.toNat/2^31*2^31:=by rw [UInt32.toNat_and]; simp only [UInt32.reduceToNat] rw [show (2147483648:ℕ)=2^31 from rfl,Nat.and_two_pow] rw [Nat.testBit_eq_decide_div_mod_eq] have:w.toNat/2147483648=0∨w.toNat/2147483648=1:=by omega rcases this with h | h <;> simp [h] refine ⟨?_,?_,?_,?_,?_,?_⟩ · rw [UInt32.toNat_toUInt64,UInt32.toNat_shiftRight,ha,he] simp only [UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow]; omega · rw [UInt32.toNat_toUInt64,UInt32.toNat_or,UInt32.toNat_and,ha,hf] simp only [UInt32.reduceToNat] rw [show (8388607:ℕ)=2^23-1 from rfl,Nat.and_two_pow_sub_one_eq_mod, show (8388608:ℕ)=2^23 from rfl,Nat.or_two_pow_eq_add_of_lt (Nat.mod_lt _ (by positivity))] omega · rw [ha,he,hf]; omega · rw [hf]; exact Nat.mod_lt _ (by positivity) · unfold signOf rw [UInt32.le_iff_toNat_le] simp only [bne_iff_ne,ne_eq, ← UInt32.toNat_inj,hs,UInt32.reduceToNat] constructor <;> intro h <;> omega · unfold signOf rw [hs] by_cases h:w.toNat/2^31=0 · have:(w&&&0x80000000)=0:=UInt32.toNat_inj.mp (by rw [hs,h]; rfl) simp [this]; omega · have h1:w.toNat/2^31=1:=by omega have:(w&&&0x80000000)≠0:=fun e=>by have:=congrArg UInt32.toNat e; rw [hs,h1] at this; simp at this simp [this]; omega theorem xval (w:UInt32) (h0:expOf w≠0) (h1:expOf w≠255) : Model.toReal (ofW w)=(if signOf w then -1 else 1) * (((2^23+(fracOf w).toNat:ℕ):ℝ)*(2:ℝ)^(((expOf w).toNat:ℤ)-150)):=by rw [toReal_ofW' w h1] unfold decodeD simp only [h0,ite_false] noncomputable def C32 (ex fr:ℕ):ℝ:=((2^23+fr:ℕ):ℝ)*(2:ℝ)^((ex:ℤ)-150) theorem C32_lt (ex fr E0 F0:ℕ) (hfr:fr < 2^23) (hF0:F0 < 2^23) (h:ex*2^23+fr < E0*2^23+F0):C32 ex fr < C32 E0 F0:=by unfold C32 rcases Nat.lt_or_ge ex E0 with he | he · have h1:((2^23+fr:ℕ):ℝ)*(2:ℝ)^((ex:ℤ)-150) < (2:ℝ)^(24:ℕ)*2^((ex:ℤ)-150):=by apply mul_lt_mul_of_pos_right _ (by positivity); exact_mod_cast (by omega:2^23+fr < 2^24) have h2:(2:ℝ)^(24:ℕ)*2^((ex:ℤ)-150) ≤ (2:ℝ)^(23:ℕ)*2^((E0:ℤ)-150):=by rw [← zpow_natCast, ← zpow_natCast, ← zpow_add₀ two_ne_zero, ← zpow_add₀ two_ne_zero] exact zpow_le_zpow_right₀ (by norm_num) (by push_cast; omega) have h3:(2:ℝ)^(23:ℕ)*2^((E0:ℤ)-150) ≤ ((2^23+F0:ℕ):ℝ)*2^((E0:ℤ)-150):=by apply mul_le_mul_of_nonneg_right _ (by positivity); exact_mod_cast (by omega:2^23 ≤ 2^23+F0) linarith · have hee:ex=E0:=by omega subst hee apply mul_lt_mul_of_pos_right _ (by positivity); exact_mod_cast (by omega:2^23+fr < 2^23+F0) theorem C32_le (ex fr E0 F0:ℕ) (hfr:fr < 2^23) (hF0:F0 < 2^23) (h:E0*2^23+F0 ≤ ex*2^23+fr):C32 E0 F0 ≤ C32 ex fr:=by rcases (Nat.lt_or_ge (E0*2^23+F0) (ex*2^23+fr)) with h' | h' · exact (C32_lt E0 F0 ex fr hF0 hfr h').le · have:E0=ex∧F0=fr:=by omega rw [this.1,this.2] theorem e18:exp (-18) ≤ 1/2^25:=by have h1:(2.7:ℝ) ≤ exp 1:=by have:=Real.exp_one_gt_d9; linarith have h2:(2.7:ℝ)^(18:ℕ) ≤ exp 18:=by rw [show (18:ℝ)=((18:ℕ):ℝ)*1 by norm_num,Real.exp_nat_mul] exact pow_le_pow_left₀ (by norm_num) h1 18 rw [Real.exp_neg,inv_eq_one_div] exact one_div_le_one_div_of_le (by positivity) (le_trans (by norm_num) h2) theorem sgS (w:UInt32) (he1:expOf w≠255) : Model.toReal (sigmoidModel (ofW w))=Model.roundAt Fmt (realSigmoid (Model.toReal (ofW w))) := (toReal_sigmoidModel (fmt:=Fmt) (by decide) (input:=Model.ofUInt32 w) (by simp [isFinite_ofUInt32,he1])).2 theorem thS (w:UInt32) (he1:expOf w≠255) : Model.toReal (tanhModel (ofW w))=Model.roundAt Fmt (tanh (Model.toReal (ofW w))) := (toReal_tanhModel (fmt:=Fmt) (by decide) (input:=Model.ofUInt32 w) (by simp [isFinite_ofUInt32,he1])).2 theorem sgZero (w:UInt32) (h:(w&&&0x7FFFFFFF)=0):sigmoidCR w=0x3F000000:=by obtain ⟨_,_,ha,hfr,_,_⟩:=dec32 w rw [h] at ha; simp at ha have he:expOf w=0:=UInt32.toNat_inj.mp (by simp; omega) have hf:fracOf w=0:=UInt32.toNat_inj.mp (by simp; omega) have hx:Model.toReal (ofW w)=0:=by rw [toReal_ofW' w (by simp [he])]; unfold decodeD; simp [he,hf] have hspec:=sgS w (by simp [he]) rw [hx] at hspec change toWord (sigmoidModel (ofW w))=_ have hv:realSigmoid 0=((2^23:ℤ):ℝ)*2^(-24:ℤ):=by unfold realSigmoid; norm_num have hw:finishWord (2^23) (-24) false=0x3F000000 := (FastRound.roundW_signed false (2^23) (-24) (by norm_num)).symm.trans (by decide) exact FastRound.bracket_spec (by norm_num) (by norm_num) hw hw (by decide) (by decide) (le_of_eq hv.symm) (le_of_eq hv) hspec theorem thZero (w:UInt32) (h:(w&&&0x7FFFFFFF)=0):tanhCR w=w:=by have hw:=w.toNat_lt have ha:(w&&&0x7FFFFFFF).toNat=w.toNat%2^31:=by rw [UInt32.toNat_and]; simp only [UInt32.reduceToNat] rw [show (2147483647:ℕ)=2^31-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] rw [h] at ha; simp at ha have:w=0∨w=0x80000000:=by rcases (show w.toNat=0∨w.toNat=2147483648 by omega) with e | e · left; exact UInt32.toNat_inj.mp (by rw [e]; rfl) · right; exact UInt32.toNat_inj.mp (by rw [e]; rfl) rcases this with e | e <;> subst e <;> decide theorem wv (w:UInt32) (h0:2^23 ≤ (w&&&0x7FFFFFFF).toNat) (h1:(w&&&0x7FFFFFFF).toNat < 0x7F800000) : expOf w≠255∧Model.toReal (ofW w)=(if signOf w then -1 else 1)*cv (eW w) (mW w) ∧ cv (eW w) (mW w)=C32 (expOf w).toNat (fracOf w).toNat∧(mW w).toNat < 2^24:=by obtain ⟨hee,hm,ha,hfr, -, -⟩:=dec32 w have he0:expOf w≠0:=fun e=>by have:=congrArg UInt32.toNat e; simp at this; omega have he1:expOf w≠255:=fun e=>by have:=congrArg UInt32.toNat e; simp at this; omega have hc:cv (eW w) (mW w)=C32 (expOf w).toNat (fracOf w).toNat:=by unfold cv C32; rw [hee,hm] exact ⟨he1,by rw [xval w he0 he1,hc]; rfl,hc,by omega⟩ theorem satW (neg:Bool) (v:ℝ) (h1:1-1/2^25 ≤ v) (h2:v ≤ 1) {z:Model Fmt} (hz:Model.toReal z=Model.roundAt Fmt (if neg then -v else v)) : toWord z=(if neg then 0x80000000 else 0)+0x3F800000:=by have e1:(((2^25-1:ℤ):ℝ)*2^(-25:ℤ))=1-1/2^25:=by norm_num have e2:(((2^25:ℤ):ℝ)*2^(-25:ℤ))=1:=by norm_num cases neg · exact FastRound.bracket_spec (lo:=2^25-1) (hi:=2^25) (e := -25) (v:=v) (by norm_num) (by norm_num) ((FastRound.roundW_signed false (2^25-1) _ (by norm_num)).symm.trans (by decide)) ((FastRound.roundW_signed false (2^25) _ (by norm_num)).symm.trans (by decide)) (by decide) (by decide) (by rw [e1]; exact h1) (by rw [e2]; exact h2) (by simpa using hz) · exact FastRound.bracket_spec (lo := -(2^25)) (hi := -(2^25-1)) (e := -25) (v := -v) (by norm_num) (by norm_num) ((FastRound.roundW_signed true (2^25) _ (by norm_num)).symm.trans (by decide)) ((FastRound.roundW_signed true (2^25-1) _ (by norm_num)).symm.trans (by decide)) (by decide) (by decide) (by rw [Int.cast_neg,neg_mul,e2]; linarith only [h2]) (by rw [Int.cast_neg,neg_mul,e1]; linarith only [h1]) (by simpa using hz) theorem sgSat (w:UInt32) (h1:w < 0x80000000) (h2:0x41900000 ≤ w&&&0x7FFFFFFF) (h3:w&&&0x7FFFFFFF < 0x7F800000):sigmoidCR w=0x3F800000:=by obtain ⟨_,_,ha,hfr,hs, -⟩:=dec32 w rw [UInt32.le_iff_toNat_le] at h2; rw [UInt32.lt_iff_toNat_lt] at h3 simp only [UInt32.reduceToNat] at h2 h3 obtain ⟨he1,hx,hc, -⟩:=wv w (by omega) h3 have hneg:signOf w=false:=by cases hh:signOf w · rfl · exact absurd (hs.1 hh) (UInt32.not_le.2 h1) have h18:18 ≤ cv (eW w) (mW w):=by rw [hc]; exact le_trans (by unfold C32; norm_num) (C32_le _ _ 131 1048576 hfr (by norm_num) (by omega)) have hspec:=sgS w he1 rw [hx,hneg] at hspec have hE:exp (-cv (eW w) (mW w)) ≤ 1/2^25 := le_trans (exp_le_exp.2 (by linarith only [h18])) e18 have hp:=exp_pos (-cv (eW w) (mW w)) have:=satW false (realSigmoid (cv (eW w) (mW w))) (by unfold realSigmoid; rw [le_div_iff₀ (by linarith only [hp])]; linarith only [hE,hp]) (realSigmoid_lt_one _).le (z:=sigmoidModel (ofW w)) (by simpa using hspec) change toWord (sigmoidModel (ofW w))=_ simpa using this theorem thSat (w:UInt32) (h2:0x41180000 ≤ w&&&0x7FFFFFFF) (h3:w&&&0x7FFFFFFF < 0x7F800000) : tanhCR w=(w&&&0x80000000)+0x3F800000:=by obtain ⟨_,_,ha,hfr, -, hsb⟩:=dec32 w rw [UInt32.le_iff_toNat_le] at h2; rw [UInt32.lt_iff_toNat_lt] at h3 simp only [UInt32.reduceToNat] at h2 h3 obtain ⟨he1,hx,hc, -⟩:=wv w (by omega) h3 have h95:19/2 ≤ cv (eW w) (mW w):=by rw [hc]; exact le_trans (by unfold C32; norm_num) (C32_le _ _ 130 1572864 hfr (by norm_num) (by omega)) have hspec:=thS w he1 rw [hx] at hspec have hE:exp (-2*cv (eW w) (mW w)) ≤ 1/2^26:=by have:=mul_le_mul (le_trans (exp_le_exp.2 (by linarith only [h95] : -2*cv (eW w) (mW w)+1 ≤ -18)) e18) halfE (exp_pos _).le (by norm_num) rw [← exp_add,show -2*cv (eW w) (mW w)+1 + -1 = -2*cv (eW w) (mW w) by ring] at this linarith only [this] have hp:=exp_pos (-2*cv (eW w) (mW w)) have hf:=satW (signOf w) (tanh (cv (eW w) (mW w))) (by rw [tanh_eq_exp_neg_two,le_div_iff₀ (by linarith only [hp])]; linarith only [hE,hp]) (Real.tanh_lt_one _).le (z:=tanhModel (ofW w)) (by rw [hspec]; cases signOf w <;> simp [Real.tanh_neg]) change toWord (tanhModel (ofW w))=_ rw [hf]; congr 1 apply UInt32.toNat_inj.mp; rw [hsb]; cases signOf w <;> simp theorem sgMain (w:UInt32) (h0:2^23 ≤ (w&&&0x7FFFFFFF).toNat) (h1:(w&&&0x7FFFFFFF).toNat < 0x42AE0000) (h:rnd (sgY w).toBits≠0xFFFFFFFF) : sigmoidCR w=rnd (sgY w).toBits:=by obtain ⟨hee,hm,ha,hfr,hs, -⟩:=dec32 w obtain ⟨he1,hx,hc,hm2⟩:=wv w h0 (by omega) have h87:cv (eW w) (mW w) < 87:=by rw [hc]; exact (C32_lt _ _ 133 3014656 hfr (by norm_num) (by omega)).trans_eq (by unfold C32; norm_num) obtain ⟨fr,r0,r1,rz,hid⟩:=redSpec (eW w) (mW w) (by omega) (by omega) hm2 have hk:((kOf (eW w) (mW w)).toNat:ℝ) < 5632:=by linarith obtain ⟨ft,rt⟩:=expT _ (by exact_mod_cast hk) _ _ fr rfl r0 r1 rz rw [← hid] at rt obtain ⟨⟨fy1,ry1⟩,⟨fy2,ry2⟩⟩:=sgTail _ _ ft rt (expLB (by linarith)) (exp_le_one_iff.2 (by linarith)) have hspec:=sgS w he1 change toWord (sigmoidModel (ofW w))=_ rw [hx] at hspec have hpT:=exp_pos (-cv (eW w) (mW w)) unfold sgY at h ⊢; dsimp only at h ⊢ by_cases hw:w < 0x80000000 · have hsg:signOf w=false:=by cases hh:signOf w · rfl · exact absurd (hs.1 hh) (UInt32.not_le.2 hw) rw [ite_eq_left hw] at h ⊢ simp only [hsg,Bool.false_eq_true,ite_false,one_mul] at hspec have hv:realSigmoid (cv (eW w) (mW w))=1/(1+exp (-cv (eW w) (mW w))):=rfl rw [hv] at hspec have:=fin _ _ (by positivity) ry1 h false (z:=sigmoidModel (ofW w)) (by simpa using hspec) simpa using this · have hsg:signOf w=true:=hs.2 (UInt32.not_lt.1 hw) rw [ite_eq_right hw] at h ⊢ simp only [hsg,ite_true,neg_mul,one_mul] at hspec have hv:realSigmoid (-cv (eW w) (mW w)) = exp (-cv (eW w) (mW w))/(1+exp (-cv (eW w) (mW w))):=by unfold realSigmoid; rw [neg_neg] have h1:exp (cv (eW w) (mW w))*exp (-cv (eW w) (mW w))=1:=by rw [← exp_add]; simp field_simp; linarith rw [hv] at hspec have:=fin _ _ (by positivity) ry2 h false (z:=sigmoidModel (ofW w)) (by simpa using hspec) simpa using this theorem tanhPos (c:ℝ) (hc:0 < c):0 < tanh c:=by rw [tanh_eq_exp_neg_two] have:exp (-2*c) < 1:=Real.exp_lt_one_iff.2 (by linarith) have hp:=exp_pos (-2*c) exact div_pos (by linarith) (by linarith) theorem thMain (w:UInt32) (h0:2^23 ≤ (w&&&0x7FFFFFFF).toNat) (h1:(w&&&0x7FFFFFFF).toNat < 0x41180000) (h:rnd (thY w).toBits≠0xFFFFFFFF) : tanhCR w=rnd (thY w).toBits+(w&&&0x80000000):=by obtain ⟨hee,hm,ha,hfr, -, hsb⟩:=dec32 w obtain ⟨he1,hx,hc,hm2⟩:=wv w h0 (by omega) have h95:cv (eW w) (mW w) < 19/2:=by rw [hc]; exact (C32_lt _ _ 130 1572864 hfr (by norm_num) (by omega)).trans_eq (by unfold C32; norm_num) have hc1:(1:ℝ)/2^150 ≤ cv (eW w) (mW w):=by unfold cv have h1:(1:ℝ) ≤ (mW w).toNat:=by exact_mod_cast (by omega:1 ≤ (mW w).toNat) have h2:(1:ℝ)/2^150 ≤ 2^(((eW w).toNat:ℤ)-150):=by rw [← zp]; exact zpow_le_zpow_right₀ (by norm_num) (by omega) exact h2.trans (le_mul_of_one_le_left (by positivity) h1) have he:(eW w+1).toNat=(eW w).toNat+1:=by rw [UInt64.toNat_add]; simp; omega have h2:cv (eW w+1) (mW w)=2*cv (eW w) (mW w):=by unfold cv; rw [he]; push_cast rw [show ((eW w).toNat:ℤ)+1-150=((eW w).toNat:ℤ)-150+1 by ring,zpow_add₀ two_ne_zero] ring obtain ⟨fy,ry⟩:=thCore (eW w+1) (mW w) (by omega) (by omega) hm2 (by rw [h2]; linarith) (by rw [h2]; linarith) rw [h2,show (1-exp (-(2*cv (eW w) (mW w))))/(1+exp (-(2*cv (eW w) (mW w)))) = tanh (cv (eW w) (mW w)) by rw [tanh_eq_exp_neg_two,neg_mul]] at ry have hspec:=thS w he1 change toWord (tanhModel (ofW w))=_ rw [hx] at hspec have hf:=fin _ _ (tanhPos _ (by linarith)) ry h (signOf w) (z:=tanhModel (ofW w)) (by rw [hspec]; cases signOf w <;> simp [Real.tanh_neg]) rw [hf,add_comm] congr 1 apply UInt32.toNat_inj.mp rw [hsb]; cases signOf w <;> simp theorem sgF_eq (w:UInt32):sgF w = if (w&&&0x7FFFFFFF < 0x00800000||0x7F800000 ≤ w&&&0x7FFFFFFF) then (if w&&&0x7FFFFFFF==0 then 0x3F000000 else 0xFFFFFFFF) else if (w < 0x80000000&&0x41900000 ≤ w&&&0x7FFFFFFF) then 0x3F800000 else if 0x42AE0000 ≤ w&&&0x7FFFFFFF then 0xFFFFFFFF else rnd (sgY w).toBits:=rfl theorem thF_eq (w:UInt32):thF w = if (w&&&0x7FFFFFFF < 0x00800000||0x7F800000 ≤ w&&&0x7FFFFFFF) then (if w&&&0x7FFFFFFF==0 then w else 0xFFFFFFFF) else if 0x41180000 ≤ w&&&0x7FFFFFFF then (w&&&0x80000000)+0x3F800000 else if rnd (thY w).toBits==0xFFFFFFFF then rnd (thY w).toBits else rnd (thY w).toBits+(w&&&0x80000000):=rfl theorem sgF_spec (w:UInt32) (h:sgF w≠0xFFFFFFFF):sigmoidCR w=sgF w:=by rw [sgF_eq] at h ⊢ by_cases c1:(w&&&0x7FFFFFFF < 0x00800000||0x7F800000 ≤ w&&&0x7FFFFFFF)=true · rw [ite_eq_left c1] at h ⊢ by_cases c2:(w&&&0x7FFFFFFF==0)=true · rw [ite_eq_left c2]; exact sgZero w (by simpa using c2) · rw [ite_eq_right c2] at h; exact absurd rfl h rw [ite_eq_right c1] at h ⊢ simp only [Bool.or_eq_true,decide_eq_true_eq,not_or,UInt32.not_lt,UInt32.not_le] at c1 by_cases c3:(w < 0x80000000&&0x41900000 ≤ w&&&0x7FFFFFFF)=true · rw [ite_eq_left c3]; simp only [Bool.and_eq_true,decide_eq_true_eq] at c3; exact sgSat w c3.1 c3.2 c1.2 rw [ite_eq_right c3] at h ⊢ by_cases c4:0x42AE0000 ≤ w&&&0x7FFFFFFF · rw [ite_eq_left c4] at h; exact absurd rfl h rw [ite_eq_right c4] at h ⊢ rw [UInt32.not_le,UInt32.lt_iff_toNat_lt] at c4; rw [UInt32.le_iff_toNat_le] at c1 exact sgMain w c1.1 c4 h theorem thF_spec (w:UInt32) (h:thF w≠0xFFFFFFFF):tanhCR w=thF w:=by rw [thF_eq] at h ⊢ by_cases c1:(w&&&0x7FFFFFFF < 0x00800000||0x7F800000 ≤ w&&&0x7FFFFFFF)=true · rw [ite_eq_left c1] at h ⊢ by_cases c2:(w&&&0x7FFFFFFF==0)=true · rw [ite_eq_left c2]; exact thZero w (by simpa using c2) · rw [ite_eq_right c2] at h; exact absurd rfl h rw [ite_eq_right c1] at h ⊢ simp only [Bool.or_eq_true,decide_eq_true_eq,not_or,UInt32.not_lt,UInt32.not_le] at c1 by_cases c3:0x41180000 ≤ w&&&0x7FFFFFFF · rw [ite_eq_left c3]; exact thSat w c3 c1.2 rw [ite_eq_right c3] at h ⊢ by_cases c4:(rnd (thY w).toBits==0xFFFFFFFF)=true · rw [ite_eq_left c4] at h; exact absurd (beq_iff_eq.1 c4) h rw [ite_eq_right c4] at h ⊢ rw [UInt32.not_le,UInt32.lt_iff_toNat_lt] at c3; rw [UInt32.le_iff_toNat_le] at c1 exact thMain w c1.1 c3 (by simpa using c4) theorem sg_eq:sg=sigmoidCR:=by funext w unfold sg dsimp only by_cases h:sgF w=0xFFFFFFFF · simp [h] · rw [ite_eq_right (by simpa using h)]; exact (sgF_spec w h).symm theorem th_eq:th=tanhCR:=by funext w unfold th dsimp only by_cases h:thF w=0xFFFFFFFF · simp [h] · rw [ite_eq_right (by simpa using h)]; exact (thF_spec w h).symm end SAct namespace Cv1 open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats @[inline]def c1Ok(s:ConvShape):Bool:= s.w==1&&s.kw==1&&s.strideH==1&&s.strideW==1&&s.padT==0&&s.padL==0&&s.padB==0&&s.padR==0&&s.dilH==1&&s.dilW==1&&0USize.toNat local postfix:max "и"=>Fin.val open _root_ renaming FloatArray->ἀ,ite_true->ἁ,ite_false->ἂ,rfl->ἅ,UInt64->ἆ,UInt32->ἇ,Nat->Ἀ,Int->Ἁ,Array->Ἂ,USize->Ἄ,Float->Ἅ,Bool->Ἆ open Bool renaming true->ἃ,false->ἄ open ExactRuntime renaming Word->Ἃ open ExactRuntime hiding ConvShape windowAt conv2dWith conv2dSpec depthwiseWith depthwiseSpec avgpoolWith avgpoolSpec maxpoolSpec open FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats structure ConvShape where cin:Nat h:Nat w:Nat cout:Nat kh:Nat kw:Nat stride:Nat pad:Nat def ConvShape.ho (s:ConvShape):Nat:=(s.h+2*s.pad-s.kh)/s.stride+1 def ConvShape.wo (s:ConvShape):Nat:=(s.w+2*s.pad-s.kw)/s.stride+1 @[inline] def windowAt (s:ConvShape) (inp:Array Word) (y x t:Nat):Word := let c:=t/(s.kh*s.kw) let dy:=t/s.kw%s.kh let dx:=t%s.kw let yy:=y*s.stride+dy let xx:=x*s.stride+dx if yy < s.pad∨xx < s.pad∨yy-s.pad ≥ s.h∨xx-s.pad ≥ s.w then 0 else inp[(c*s.h+(yy-s.pad))*s.w+(xx-s.pad)]! @[specialize] def conv2dWith (dot:DotFn) (s:ConvShape) (relu:Bool) (inp wts b:Array Word) : Array Word := let k:=s.cin*s.kh*s.kw Array.ofFn (n:=s.cout*(s.ho*s.wo)) fun q => let o:=q.val/(s.ho*s.wo) let y:=q.val/s.wo%s.ho let x:=q.val%s.wo act relu <| dot (k+1) (fun t=>if t < k then windowAt s inp y x t else oneW) (fun t=>if t < k then wts[o*k+t]! else b[o]!) def conv2dSpec:=conv2dWith dotOf @[specialize] def depthwiseWith (dot:DotFn) (s:ConvShape) (relu:Bool) (inp wts b:Array Word):Array Word := let k:=s.kh*s.kw Array.ofFn (n:=s.cin*(s.ho*s.wo)) fun q => let c:=q.val/(s.ho*s.wo) let y:=q.val/s.wo%s.ho let x:=q.val%s.wo act relu <| dot (k+1) (fun t=>if t < k then windowAt s inp y x (c*k+t) else oneW) (fun t=>if t < k then wts[c*k+t]! else b[c]!) def depthwiseSpec:=depthwiseWith dotOf @[inline] def poolAt (h w k:Nat) (inp:Array Word) (ch y x t:Nat):Word := inp[(ch*h+y*k+t/k)*w+x*k+t%k]! @[specialize] def avgpoolWith (dot:DotFn) (c h w k:Nat) (inp:Array Word):Array Word := Array.ofFn (n:=c*(h/k*(w/k))) fun q => let ch:=q.val/(h/k*(w/k)) let y:=q.val/(w/k)%(h/k) let x:=q.val%(w/k) let s:=dot (k*k) (poolAt h w k inp ch y x) (fun _=>oneW) toWord (Model.div (ofW s) (ofW (natW (k*k)))) def avgpoolSpec:=avgpoolWith dotOf def maxpoolSpec (c h w k:Nat) (inp:Array Word):Array Word := Array.ofFn (n:=c*(h/k*(w/k))) fun q => let ch:=q.val/(h/k*(w/k)) let y:=q.val/(w/k)%(h/k) let x:=q.val%(w/k) toWord <| (List.range (k*k)).foldl (fun acc t => Model.maximum acc (ofW (poolAt h w k inp ch y x t))) (ofW (poolAt h w k inp ch y x 0)) open Submission renaming windowAt->ll,ConvShape->lR,poolAt->nI,avgpoolSpec->n9,avgpoolWith->pa open Nat renaming shiftRight_eq_div_pow->β,mod_eq_of_lt->γ,and_two_pow_sub_one_eq_mod->ζ,mul_le_mul_right->ι,shiftLeft_eq->ο,pow_le_pow_right->Θ,zero_add->Κ,add_mul_mod_self_right->Μ,succ_mul->Ο,add_mul_div_right->Ρ,add_comm->Τ,mod_lt->ϊ,div_eq_of_lt->ώ,mul_comm->Ϗ,mul_lt_mul_of_pos_right->ϐ,add_zero->ϑ,mul_lt_mul''->ϕ,lt_log2_self->ϙ,mul_assoc->Ϛ,div_add_mod->ϛ,and_le_right->ϝ,div_lt_of_lt_mul->Ϟ,zero_le->ϟ,add_mul->Ϡ,toUInt64_eq->Ϣ,two_pow_add_eq_or_of_lt->Ϥ,mul_le_mul->ϧ,div_le_div_right->ϭ,mul_pos->Ϯ,log2_self_le->ϰ,add_sub_cancel_left->ϱ,zero_mul->ϳ,pos_of_ne_zero->ϵ,two_pow_pos->϶,div_lt_iff_lt_mul->ϸ,mul_one->ϻ open USize renaming lt_iff_toNat_lt->ε,le_size->ς,toNat_zero->Ϧ open UInt64 renaming toNat_add->η,le_iff_toNat_le->θ,lt_iff_toNat_lt->μ,toNat_shiftRight->ν,toNat_inj->ξ,toNat_sub_of_le->χ,toNat_shiftLeft->ψ,toNat_ofNat_of_lt'->Α,toNat_and->Ε,toNat_sub->Ζ,toNat_zero->ϋ,toNat_mul->ύ,le_trans->ϗ,toNat_toUInt32->Ϫ open Bool renaming false_eq_true->υ,and_eq_true->Η,eq_iff_iff->ϓ open UInt32 renaming toNat_inj->Β,lt_iff_toNat_lt->Ι,toNat_and->Ξ,toNat_shiftRight->Υ,toNat_toUInt64->ϩ,toNat_shiftLeft->ϴ open Array renaming getElem_ofFn->Λ,size_ofFn->Ϝ,size_push->ϣ open Finset renaming sum_range_succ->Ν,sum_congr->ϔ,mem_range->ϥ open Model renaming isNaN_eq_false_of_toDyadic?_some->Χ,toReal_roundDyadic_eq_roundAt->ό,toModel_ofFloatModel->ϒ,isFinite_roundDyadic_of_isIEEE_of_abs_toReal_le_posMaxFinite->Ϙ,isInf_eq_false_of_toDyadic?_some->ϡ,abs_signed_mul_bpow_le_toReal_posMaxFinite->ϫ,roundDyadicGeneral_eq_roundDyadic->Ϻ open FloatLib.Numerics.Dyadic renaming cast_toRat->ϖ,toRat_eq_zero_iff->ϲ open Int renaming natAbs_mul->Ϩ,abs_eq_natAbs->Ϲ open Model.Reduction renaming dot_status_eq_zero_of_finite->Ϭ open Model.Reduction.Internal renaming dotState_exact_toRat->ϯ open List renaming foldl_cons->Ϸ open UInt64 renaming reduceToNat->kA,ofNat->lh,toNat->lq,toNat_div->ml,toNat_or->my,toNat_ofNat->mY,toNat_mod->nB,toNat_toBitVec->nR,size->n0,toNat_one->pS open ExactRuntime renaming expOf->kB,Word->kF,idxOf->kG,mantOf->kM,toDyadic_ofUInt32->kV,toWord->kW,signOf->k9,oneW->ld,mantOf_lt_24->lB,decodeD_toRat->lG,ofW->lI,fracOf->lK,Fmt->lU,finishWord->md,finishWord_of_ne->mf,linearSpec->mj,stableNormDomain->mq,dotOf->ms,sqrtRational->mK,expOf_toNat_lt->mO,isFinite_ofUInt32->m6,ofIntDyadic->nb,decodeD->nh,rowMean->no,dallNZ->nC,ofUInt32_bits->pu,act->p8 open FloatLib.Floats.Formats.BinaryInterchange.FloatFormat renaming binary64->kC open USize renaming reduceToNat->kD,size->kX,toNat_add->lJ,toNat_one->mA,ofNat_add->mC,size_eq_two_pow->nT open FloatLib.Floats.Formats.BinaryInterchange.Model renaming roundDyadic->kE,ofFloatModel->kI,ofUInt32->kT,toReal->ls,unpackedToReal->lw,roundedMantissa_shift_quotient->lF,roundDyadic_of_representable->lL,roundAt_mono->lM,toReal_add_eq_roundAt->mH,isFinite->mN,toNatBits_lt_two_pow->mQ,posMaxFinite->mR,modelSignBit->mS,ofNatBits_toNatBits->m3,roundAt->ns,maximum->nt,ofFloatModel_pack->nu,ofFloat32Model->n5,roundRatScaled->n6,add->pb,fma->pd,div->pf,ofModel->pv,roundAt_zero->pD,pow2->p7 open Nat renaming reduceMod->kH,pow_lt_pow_right->lu,mul_lt_mul_of_lt_of_le->ly,add_right_comm->lO,testBit_eq_decide_div_mod_eq->lW,toUSize_eq->lX,div_div_eq_div_mul->lY,le_mul_of_pos_left->lZ,succ_le_of_lt->l7,le_div_iff_mul_le->mc,le_log2->mu,add_mul_div_left->mv,log2_eq_iff->mz,div_eq_of_lt_le->mG,and_one_is_mod->mP,pow_add->m7,log2_lt->m9,one_shiftLeft->na,reducePow->nr,abs_cast->nE,add_one_mul->nO,cast_ofNat->nZ,one_mul->n4,div_le_div_left->pq,div_mul_le_self->pr,add_assoc->pA,cast_one->pJ,cast_sub->pO,sub_zero->pQ open FloatArray renaming emptyWithCapacity->kJ,size->kS,uget->nN,set!->pY open Array renaming ofFn->kK,getElem?_eq_getElem->lC,emptyWithCapacity->lQ,getElem?_eq_none->l5,ext->mi,replicate->mB,getElem?_ofFn->mE,ext_getElem?->mU,size_map->m0,all_eq_true->np,getElem_push_lt->nU,getElem_push_eq->nV,uset_eq_set->pP open Float.Model.UnpackedFloat renaming unpack->kL,mul->lc,accuracyOfFraction->lP,roundWithAccuracy->nk,unpackExponent->nX,round->pp,isFinite->pE,compare->pI,Sign->pK,pack->pT open UInt32 renaming reduceToNat->kN,ofNat->lA,toNat_ofNat'->lE,toNat_add->mh,toNat->mJ,toNat_zero->nj,toNat_max->nw,toNat_sub_of_le->nG,toNat_or->nK,lt_asymm->nP,toNat_sub->pU open FloatLib.Numerics renaming binaryRadix->kO,shiftRightJam->kQ,Dyadic->kU,roundQuotientEven->la,roundShiftRightEven_shiftRightJam->lS open Finset renaming range->kP,sum_range_succ'->lV,sum_sub_distrib->nF,sum_add_distrib->nJ,sum_mul->n8 open FloatLib.Numerics.Dyadic renaming ofScaledInt->kR,signedSignificand->lr,toReal->mb,cast_signedSignificand->nf,ofScaledInt_toRat->nD,add_toRat->pF,mul_toRat->pG,toRat->pR open Float.Model renaming totalExponent->kY,add->pW,mul->pX open FloatLib.Floats.Formats.Flocq renaming bpow->kZ open Float.Model.Format renaming binary64->k0,binary32->li open FloatLib.Numerics.RationalBinary renaming floorLog2->lf,scaleByPowerOfTwo->l9,scaleByPowerOfTwo_ofNat->mw,lessThanPowerOfTwo->mM,atLeastPowerOfTwo->mZ open List renaming range->lj,foldl_append->l6,range_succ->mD,foldl_nil->mT,range'->pV open FloatLib.Numerics.FixedWord renaming roundShiftRightEven->lk open Float.Model.UnpackedFloat.ExtendedMantissa renaming shiftRightOne->lm open BitVec renaming toInt_eq_toNat_cond->lv open Float32 renaming ofBits->lx open Int renaming cast_zero->lH,cast_abs->mI,ofNat_eq_natCast->nY,ModEq->pe,log->ph open Bool renaming false_ne_true->lN,or_eq_true->nM open FloatLib.Floats.Formats.BinaryInterchange.Model.Reduction.Internal renaming dotState->lT,State->me open FloatLib.Floats.ExecFloat.Binary renaming toModel_ofFloat_int64ToFloat->ma,toModel_ofFloat->m5 open FloatLib.Numerics.Radix renaming toReal->mg open FloatLib.Floats.Formats.BinaryInterchange.Model.Reduction.Semantics renaming finiteDot_toList_eq_slice->mL,finiteDotSlice->nQ open MulZeroClass renaming zero_mul->nv open System.Platform renaming numBits->nx open FloatLib.Floats.Formats.BinaryInterchange.Model.Proof renaming div_eq_spec->ny open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 renaming ofUInt32_roundRatScaled->nA,toUInt32_ofFields->n7,toUInt32->ps,roundRatScaled->pC open Option renaming some->pj open Min renaming min->po open Decidable renaming not_not->pM open Or renaming inl->pZ open FloatLib.Floats.Formats.BinaryInterchange.Model.Spec renaming div->p0 open _root_ renaming zpow_natCast->AA,getElem!_pos->AB,ite_eq_right->AC,ite_eq_left->AD,mul_le_mul_of_nonneg_right->AE,pow_add->AF,zpow_le_zpow_right₀->AG,mul_lt_mul_of_pos_right->AI,decide_eq_true_eq->AJ,zpow_add₀->AK,two_ne_zero->AL,bne_iff_ne->AM,lt_of_lt_of_le->AN,lt_of_le_of_lt->AO,le_rfl->AP,beq_iff_eq->AQ,dite_eq_left->AT,pow_le_pow_right₀->AU,one_div_pow_le_one_div_pow_of_le->AV,abs_of_pos->AW,lt_irrefl->AX,abs_sub_abs_le_abs_sub->AY,le_trans->AZ,abs_nonneg->Aa,zpow_sub₀->Ac,abs_of_nonneg->Ad,abs_mul->Ae,mul_nonneg->Af,abs_add_le->Ag,zero_add->Ai,ne_eq->Ak,ite_false->Am,getElem!_neg->An,lt_trans->Ao,mul_assoc->Ap,decide_eq_true_iff->As,add_zero->Av,abs_sub_comm->Aw,apply_ite->Ax,beq_self_eq_true->Az,abs_le->A3,pow_succ->A4,abs_zero->A5,decide_eq_true->A6,gt_iff_lt->BC,abs_neg->BE,lt_of_mul_lt_mul_right->BF open USize renaming reduceToNat->AH,size->Al,toNat_mul->BO,ofNat_mul->BP open FloatArray renaming emptyWithCapacity->AR open Array renaming emptyWithCapacity->AS,replicate->Ah,ofFn->Aj,mkEmpty->A0,size_uset->BT,size_set!->BU open Nat renaming log2->Aq,div_add_mod'->Au,mod_le->Ay,mul_zero->A7,pos_iff_ne_zero->BD,shiftLeft_zero->BH,one_le_two_pow->BI,eq_or_lt_of_le->BJ,add_sub_cancel->BK,add_sub_of_le->BQ open Model renaming div->Ar,ofFloatModel->BB,toReal_eq->BR open Or renaming inr->BA open UInt32 renaming ofBitVec->BG open Float32 renaming ofBits->BL open Bool renaming not_eq_true'->BM open ZMod renaming natCast_mod->BN open List renaming range'_succ->BS open Float.Model.Format renaming targetExponent->BV open USize renaming toNat->J0 open Nat renaming toUSize->G0,lt_of_le_of_lt->C0,toUInt64->I0,add_le_add_left->J1,le_add_right->V1,lt_of_lt_of_le->U1,add_lt_add_left->O1,lt_of_sub_eq_succ->N1,add_le_add_right->L1 open Array renaming size->O0 open Nat renaming le_trans->J2,le_of_lt_succ->U2,le_add_left->N2,le_of_ble_eq_true->K3,sub_eq_zero_iff_le->V3,mul_le_mul_left->X3,le_of_eq->Y3,le_mul_of_pos_right->U3,not_lt->O3,add_le_add->M3,add_lt_add_right->B3,cast_nonneg->C3,le_of_lt->I3,sub_add_cancel->J4,le_of_not_lt->V4,sub_add_eq->W4,lt_succ_of_le->Z4,sub_le->Y4,cast_mul->G4,lt_succ_self->U4,le_of_sub_eq_zero->P4,sub_succ_lt_self->M4,lt_irrefl->N4,cast_pow->B4,le_antisymm->C4,sub_lt_left_of_lt_add->D4,lt_trans->I4,cast_add->K5,lt_of_le_of_ne->W5,le_of_succ_le->X5,strong_induction_on->Z5,sub_le_sub_right->G5,sub_lt_sub_left->U5,add_sub_cancel'->R5,le_sub_of_add_le->M5,cast_le->N5,lt_of_lt_of_eq->B5,not_lt_zero->C5,div_le_self->J6,div_one->W6,lt_add_of_pos_right->X6,pair->U6,add_lt_add_of_lt_of_le->R6,ofNat_nonneg->T6,lt_succ_of_lt->N6,zero_lt_of_lt->F6,add_lt_add->L6,cast_succ->X7,lt_or_ge->Z7,sub_ne_zero_of_lt->G7,min_le_left->O7,mul_lt_mul_of_pos_left->M7,eq_of_mul_eq_mul_right->N7,lt_of_succ_le->D7,lt_of_succ_lt->E7,add_left_cancel->F7,lt_of_not_le->J8,mod_eq_sub_mod->K8,ne_of_lt->W8,mul_add_div->R8,mul_add_mod->S8,le_succ->N8,ne_of_gt->C8,sub_sub->D8,not_le->I8,succ_ne_zero->W9,sub_le_of_le_add->O9,min_eq_left->R9,lt_succ_iff_lt_or_eq->S9,cast_pos->T9,sub_le_sub_left->N9,succ_le_succ->C9,eq_zero_or_pos->E9,succ_pos->I9,cast_zero->A9,sub_add_comm->Qf,not_le_of_lt->Qh,zero_lt_succ->Qk,max_eq_right->Qm,cast_ne_zero->Qo,max_eq_left->Qv,lt->Qw,lt_div_mul_add->Qy,le_add_right_of_le->Ja,lt_trichotomy->Jd,le_succ_of_le->Jf,add_sub_self_left->Jj,min_le_right->Jp,lt_of_mul_lt_mul_right->Jq,add_lt_add_of_le_of_lt->Jr,cast_lt->Ju,le_refl->Jv,mod_one->Jw,and_two_pow->Jy,lt_of_add_lt_add_left->Jz,add_mul_mod_self_left->Kc,succ_add_eq_add_succ->Kg,pred->Ki,sub_succ->Kj,mul_succ->Kk,reduceLT->Kl,one_lt_two->Kq,exists_eq_add_of_le->Kr,sub_pos_of_lt->Ku,le->Va,min_eq_right->Vl,log2_le_self->Vm,sub_le_iff_le_add->Vo,mul->Vq,sub_lt->Vu,add_right_cancel->Vv,zero_lt_two->Vx,one_le_cast->Vy,not_succ_le_self->Vz,mod_add_div->Wa,add_add_add_comm->We,eq_sub_of_add_eq->Wh,div_self->Wj,div_eq_zero_iff->Wk,pow_lt_pow_succ->Wo,lt_add_one->Xa,two_mul->Xe,mod_mul->Xf,mod_mod_of_dvd->Xg,div_mod_unique->Xh,mul_div_cancel->Xk,le_of_add_le_add_right->Xn,reduceAdd->Xo,add_left_comm->Xv,add_mod_right->Xw,add_sub_assoc->Xz,lt_of_sub_pos->Zb,max_le->Zg,eq_of_mul_eq_mul_left->Zh,mod_add_div'->Zj,succ_lt_succ->Zk,add_mod_left->Zl,le_of_not_le->Zw,pos_of_mul_pos_right->Zy,pos_of_mul_pos_left->Yo,mod_add_mod->Yt,mul_ne_zero->Yu,cast_natAbs->Yv,lt_add_left->Ga,one_le_iff_ne_zero->Gd,div_pos->Gf,lt_of_succ_lt_succ->Gh,sub_le_iff_le_add'->Gi,dvd_of_mod_eq_zero->Gj,lt_of_add_right_lt->Gk,bitwise_rec_lemma->Go,mul_div_mul_right->Gp,sub_eq_zero_of_le->Gy,sub_lt_iff_lt_add->Gz,mul_mod_mul_right->Ha,add_lt_of_lt_sub->Hc,sub_lt_sub_right->Hf,cast->Hg,unpair->Hh,div_le_of_le_mul->Hm,reduceMul->Hp,lt_mul_div_succ->Hv,zero_div->Hx,pow_succ->Hy,mul_right_comm->Hz,log2_def->Ua,zero_mod->Uh,div_mul_cancel->Ul,card_Ico->Ur,ne_zero_of_lt->Uy,add_div_right->Uz,one_pos->Oc,lt_add_right->Oh,one_le_ofNat->Oi,not_lt_of_le->Ok,mul_mod_left->Ol,mul_eq_zero->Op,add_mod_mod->Oq,lt_succ_iff->Ov,sub_mul_div->Ox,le_min->Oy,add->Pg open USize renaming ofNat->O2,toNat_ofNat_of_lt'->W3,le_iff_toNat_le->V6,toNat_inj->D6,toNat_sub_of_le->L7,toNat_ofNat'->X9,toNat_lt_size->Jx,add_assoc->Kd,ofNat_toNat->Kv,toNat_ofNat->Kw,add_zero->Xc,add_sub_cancel->Hj,zero_mul->Pj,add_comm->Pk open Real renaming sqrt->J3,sqrt_mul->Xq,sqrt_le_sqrt->Zc,sqrt_sq->Zs,sqrt_nonneg->Zx,sq_sqrt->Uq open UInt64 renaming toUInt32->N3,toNat_ofNat'->P6,sub_add_cancel->Vp,not_lt->Xm,toNat_max->Zz,le_of_lt->Yw,toBitVec_inj->Hq,ofNat_toNat->Ub,lt_irrefl->Od,ofNat_mul->Om,add_zero->Oo,le_refl->Pf open ExactRuntime renaming rationalWord->K4,ConvShape->D5,depthwiseSpec->M6,conv2dSpec->I6,conv2dWith->P7,sv->M8,PoolShape->F8,roundRational->Qb,rmsnormSpec->Qp,finiteWord->Qq,windowAt->Jl,depthwiseWith->Jt,avgpoolSpec->Kn,maxpoolSpec->Ko,rmsnormStable->Xu,rowVariance->Yb,poolOut->Ho open Array renaming size_replicate->X4,usize->Qc,size_set->Qd,getElem_set->Je,getElem_map->Kt,size_append->Ky,foldl_induction->Vs,uset->Vw,set!_eq_setIfInBounds->Xj,size_empty->Yd,uget->Hd,setIfInBounds->Hr,size_extract->Uw open Int renaming ofNat_le->O4,cast_natCast->P5,natCast_nonneg->G6,toNat->J7,natAbs->K7,add_le_add_right->G8,sub_le_sub_right->U9,toNat_of_nonneg->B9,neg_ofNat_le_natCast->Qi,cast_add->Qj,natAbs_natCast->Qt,cast_sum->Jg,cast_mul->Jh,neg_nonpos_of_nonneg->Km,ofNat_zero_le->Kx,sub_le_self->Wi,toNat_of_nonpos->Wp,add_le_add->Wy,reducePow->Xl,add_lt_add_of_lt_of_le->Xp,le_add_of_sub_right_le->Xt,le_sub_left_of_add_le->Zd,lt_zpow_succ_log_self->Ze,cast->Zn,ofNat_lt->Zp,neg_nonneg_of_nonpos->Zv,natAbs_cast->Yp,natAbs_neg->Gn,natAbs_pow->Gs,zpow_log_le_self->He,lt_of_add_one_le->Hi,sub_le_sub_left->Hs,add_le_add_left->Hw,ofNat->Uc,cast_one->Ud,cast_neg->Ue,cast_pow->Uf,lt_of_lt_of_le->Uj,toNat_le->Um,toNat_le_toNat->Uv,negSucc->Oa,ofNat_nonneg->Oj,natCast_pow->Ou,natCast_pos->Ow open Float.Model renaming pack->J5,ofBits->Ug,sub->Ot open UInt32 renaming toUSize->O5,le_iff_toNat_le->C6,toUInt64->H9,and_assoc->Vk,toNat_one->Og open ExactRuntime.ConvShape renaming depthwise->F5,cpg->B7,ekh->Q9,ekw->J9,ho->Y9,wo->G9,taps->L9,opg->Qa open Float renaming ofBits->I5,sqrt->W7,fma->Ui,ofModel->Po open Finset renaming Ico->L5,sum_range_zero->I7,sum_nonneg->O8,abs_sum_le_sum_abs->Z9,sum_le_card_nsmul->Ql,sum_empty->Qn,sum_eq_sum_Ico_succ_bot->Qz,sum_Ico_eq_sum_range->Jn,sum_const->Vj,sum_le_sum->Xx,card_range->Xy,range_zero->Za,Ico_self->Gc,mul_sum->Gv,mem_image->Oe,mem_Ico->Pm open Model renaming modelSignBit->K6,unpackedToReal_finite->E6,ofModelBits->U8,ofFields_signBit_expField_fracField->Jm,unpackedToReal->Jo,modelSign->Ka,unpackedToReal_zero->Kb,toDyadic?_ofFields_of_isFinite->Kh,ofFloatModel_pack->Ks,signBit->Vf,eq_of_toReal_eq_of_nonzero->Vg,canonicalizeModel_eq_self->Vt,isFinite->Wq,ofFloatModel_injective->Ws,ofFields->Wt,toReal->Zi,isZero->Zq,isFinite_ofFields->Yg,canonicalizeModel->Yj,ieeeRoundDyadic->Gq,pow2_eq_two_pow->Gr,fracField->Os,sqrt->Pa,expField->Pe,roundAt->Pn open Pinned renaming kernels->Z6,dotFn_eq_dotOf->Q8,maxpoolW_eq->Ux open Float.Model.UnpackedFloat renaming normalize->O6,add->Jc,beq_iff_ne_notANumber_and_eq->Xi,unpackSign->Uk,beq->Pc open Int64 renaming toInt->B6,ofInt->Ob open Rat renaming cast_mul->V7,cast_ofNat->U7,cast_natCast->R7,cast_zpow->X8,cast_intCast->D9,cast_add->Ji,cast_div->Jk,cast_lt->Gl,cast_sub->Uo,cast_neg->Up,cast_sum->Us,cast_pow->Ut,cast_nonneg->Oz open Bool renaming and_eq_true_iff->T7,eq_false_iff->M9,and_false->Gm,false_and->Gu,and_eq_false_iff->Gw,not_false->Pd open Fin renaming val->C7 open FloatLib.Numerics.StaticStorage renaming lt_capacity->K9 open System.Platform renaming numBits_eq->Js open BitVec renaming toNat_sub_of_lt->Kz,extractLsb'_toNat->Zo,toNat_sub_of_le->Gg,toNat->Pq open OfNat renaming ofNat->Ve,ofNat_ne_zero->Wm open List renaming range_zero->Wg open Ne renaming symm->Ww open ByteArray renaming size->Wx,empty->Yy,uset->Gx,uget->Ph local instance:AddLeftMono Real:=inferInstance local instance:AddRightMono Real:=inferInstance local instance:AddLeftStrictMono Real:=inferInstance local instance:PosMulReflectLT Real:=inferInstance local instance:AddLeftMono Nat:=inferInstance local instance:AddLeftStrictMono Nat:=inferInstance local instance:LawfulBEq ἆ:=inferInstance local instance:LawfulBEq ἇ:=inferInstance section open FloatLib.Numerics lemma cm_h1(j L:Ἀ)(h:j+25<=L):j+1<=L∧23<=L-j∧23<=L:=⟨(J1 ((by decide):1<=25) j).trans h,M5 (by rw[Τ];exact (J1 ((by decide):23<=25) j).trans h),(N2 23 j).trans ((J1 ((by decide):23<=25) j).trans h)⟩ lemma cm_h2(e:Ἁ)(j L:Ἀ)(h:j+25<=L)(c:(L:Ἁ)+e< -126):∃a:Ἀ,e- -149=Oa a∧e+j- -149=Oa (a-j)∧a-j+1=a+1-j∧j+2<=a+1:=by obtain⟨a,v,y⟩:∃a:Ἀ,e- -149=Oa a∧j+2<=a:=⟨(J7 (-(e+149)-1)),by omega,by omega⟩ exact⟨a,v,by (clear * - v y;omega),(Qf ((V1 j 2).trans y)).symm,y.trans (N8 a)⟩ lemma cm(s:Ἆ)(m:Ἀ)(e:Ἁ)(j:Ἀ)(h:j+25<=(Aq m)): kE lU ⟨s,kQ m j,e+j⟩=kE lU ⟨s,m,e⟩:=by have g:m≠0:=by rintro rfl;simp at h have k:=cm_h1 j _ h have o:2^(Aq m)<=m:=ϰ g;have u:2^(j+1)<=m:=AZ (Θ (by norm_num) k.1) o;have d:(Aq (kQ m j))=(Aq m)-j:=log2_shiftRightJam m j;have t:kQ m j≠0:=shiftRightJam_ne_zero m j (AZ (Θ (by norm_num) (N8 j)) u);rw[<-Ϻ,<-Ϻ];simp only[Model.roundDyadicGeneral,t,g,AQ,Am,d];clear d o u t g;rw[(by rw[pO ((V1 j 25).trans h)];ring:(((Aq m)-j:Ἀ):Ἁ)+(e+j)=((Aq m):Ἁ)+e),show Fmt.fracWidth=23 from ἅ,show Fmt.minSubnormalExponent=-149 from ἅ,show Fmt.minNormalExponent=-126 from ἅ,AD k.2.1,AD k.2.2];split_ifs with c1 c2 rfl;congr 1;obtain⟨a,v,w,x,y⟩:=cm_h2 e j _ h c2;rw[v,w];dsimp only;rw[x];exact lS m j (a+1) y;congr 1;rw[Nat.sub_right_comm _ j];exact lS m j _ (M5 h) end lemma ab(n:Ἀ)(f:Ἀ->ἇ)(k:Ἀ)(d:kf (C7 i))[k]! =f k:=by rw[AB _ k (by simpa using d),Λ] namespace Core noncomputable def tm(a b:Ἃ):Ἁ:=sv a*sv b*2^(idxOf a+idxOf b) noncomputable def af(n:Ἀ)(fa fb:Ἀ->Ἃ):Ἁ:=∑k∈kP n,tm (fa k) (fb k) def aG(n:Ἀ)(fa fb:Ἀ->Ἃ):Prop:=∀k,kexpOf (fa k)≠255/\expOf (fb k)≠255 lemma aK(n:Ἀ)(d e:Ἀ->kF): af (n+1) d e=af n d e+tm (d n) (e n):=by unfold af;rw[Ν] lemma gm(A B:Ἂ ἇ)(i c:Ἀ): dsum A B i c=∑k∈kP c,tm A[i+k]! B[i+k]!:=by induction c generalizing i with |zero=>simp[dsum] |succ c d=> rw[dsum,d (i+1),lV,add_comm];exact congrArg₂ _ (ϔ rfl λk _=>by rw[((by exact Kg i k):i+1+k=i+(k+1))]) rfl lemma cH(n:Ἀ)(d e:Ἀ->kF): dsum (kK (n:=n) λi=>d (C7 i)) (kK (n:=n) λi=>e (C7 i)) 0 n= af n d e:=by rw[gm,af];exact ϔ rfl λk g=>by rw[ϥ]at g;rw[Κ,ab n d k g,ab n e k g] theorem bI_h1{s a p c d:Ἆ}(h1:s=(false||c))(h2:a=(true&&d)):(s&&(a||(!p&&false)))=(c&&d):=by rw[h1,h2,Bool.false_or,Bool.true_and,Gm,Bool.or_false] theorem bI_h2(A B:Ἂ kF)(n:Ἀ)(S:Ἁ)(hS:dsum A B 0 n=S)(hA:A.size=n)(hB:B.size=n)(m:∀k∀k (j:k<(X.map (kT (fmt:=lU))).size),mN (X.map (kT (fmt:=lU)))[k]=ἃ:=λX h k j=>by rw[Kt,m6];exact AM.2 (h k (B5 j m0)) have e:=x A λk w=>AB A k w▸(m k (hA▸w)).1 have g:=x B λk w=>AB B k w▸(m k (hB▸w)).2 have ha:0+(A.map (kT (fmt:=lU))).size<=(A.map (kT (fmt:=lU))).size:=Y3 (Κ _) have hb:0+(A.map (kT (fmt:=lU))).size<=(B.map (kT (fmt:=lU))).size:=Y3 ((Κ _).trans l) have j:∀k,0<=k->k<0+(A.map (kT (fmt:=lU))).size->kB A[k]!≠255/\kB B[k]!≠255:=λk _ F=>m k (B5 F ((Κ _).trans hL)) have d:=(finiteDotSlice_eq A B 0 _ ha hb j).trans ((congrArg (λs=>(dsum A B 0 s:ℚ)*2^(-298:ℤ)) hL).trans (congrArg (λt:Ἁ=>(t:ℚ)*2^(-298:ℤ)) hS)) have y:=(ϯ (destination:=lU) _ _ l).trans d unfold dotSpec rw[←Model.Reduction.map_value_dot] by_cases v:S=0 · rw[v,finishWord_zero,Ϭ lU _ _ .nearest l e g ((ϲ _).1 (y.trans (by rw[v,lH,zero_mul])))] obtain⟨z,D⟩:=dotStateLoop_flags A B ({}:me lU) 0 _ ha hb j simp only[Except.map] exact congrArg (λb=>kW (Model.zero lU b)) ((bI_h1 z D).trans (congrArg (λs=>decide (s≠0)&&nC A B 0 s) hL)) · have hnz:Model.Reduction.Semantics.finiteDot (A.map (kT (fmt:=lU))).toList (B.map (kT (fmt:=lU))).toList≠.ok 0:=by rw[Model.Reduction.Semantics.finiteDot_toList_eq_slice _ _ l] intro h;injection h with h;rw[d]at h;exact v (Int.cast_eq_zero.1 ((mul_eq_zero.1 h).resolve_right (zpow_ne_zero _ AL))) rw[Model.Reduction.dot_status_eq_round_of_finite_nonzero lU _ _ .nearest l e g hnz] simp only[Except.map] exact(mf _ _ _ _ v y).symm lemma bI(n:Ἀ)(o p:Ἀ->kF)(u:aG n o p): ms n o p=md (af n o p) (-298) (decide (n≠0)&& nC (kK (n:=n) λi=>o (C7 i)) (kK (n:=n) λi=>p (C7 i)) 0 n):=by rw[ms];exact bI_h2 _ _ n _ (cH n o p) Ϝ Ϝ λk j=>by rw[ab n o k j,ab n p k j];exact u k j lemma bT(n:Ἀ)(d e:Ἀ->kF)(g:aG n d e) (h:af n d e≠0): ms n d e=md (af n d e) (-298) ἄ:=by rw[bI n d e g];simp only[md,h,Am] @[inline]def f5(w:ἇ):ἆ:=if(w>>>23)&&&255!=0 then 1 else 0 @[inline]def mW(w:ἇ):ἆ:=(H9 (w&&&8388607))|||(f5 w<<<23) @[inline]def iW(w:ἇ):ἆ:=(H9 ((w>>>23)&&&255))-f5 w noncomputable def ae(x:ἆ):Ἁ:=x.toBitVec.toInt lemma gr(w:ἇ):(mJ (w&&&8388607))<2^(23:Ἀ):=by rw[Ξ];exact AO ϝ (by decide) lemma an(w:ἇ):(lq (mW w))=kM w:=by have g:=gr w;rw[mW,f5,kM,kB,lK];by_cases d:(w>>>23)&&&255=0 .simp[d] .have e:((w>>>23)&&&255!=0)=ἃ:=by simpa using d simp only[e,d,ἁ,ἂ];rw[my,ϩ,show(lq ((1:ἆ)<<<23))=2^(23:Ἀ)*1 from ἅ,Nat.or_comm,<-Ϥ g,ϻ,Τ] lemma am(w:ἇ):(lq (iW w))=kG w:=by rw[iW,f5,kG,kB];have g:=mO w;rw[kB]at g;by_cases e:(w>>>23)&&&255=0;simp[e];have d:1<=(mJ ((w>>>23)&&&255)):=BD.2 λh=>e (Β.1 (by simpa using h));simp only[(by simpa using e:((w>>>23)&&&255!=0)=true),e,ἁ,ἂ];rw[χ _ _ (θ.2 (by simpa[ϩ]using d)),ϩ];rfl lemma ap_h1(n:Ἀ)(e:n<2^(32:Ἀ)):¬(decide (n/2^(31:Ἀ)%2=1)).toNat*2^(31:Ἀ)=0↔2^(31:Ἀ)<=n:=by by_cases h:2^(31:Ἀ)<=n ·rw[(mG (by (clear * - h;omega)) (by (clear * - e;omega)):n/2^(31:Ἀ)=1)];exact iff_of_true (by decide) h rw[ώ (by omega)];exact iff_of_false (by decide) h lemma ap(w:ἇ):k9 w=ἃ↔2^(31:Ἀ)<=(mJ w):=by rw[k9];have d:(w&&&0x80000000).toNat=w.toNat&&&2^(31:Ἀ):=by rw[Ξ];rfl rw[Jy,lW]at d;rw[AM,Ak,<-Β,d];exact ap_h1 _ w.toNat_lt lemma fy(w:ἇ):(w>>>31!=0)=k9 w:=by have d:(mJ (w>>>31))=(mJ w)/2^(31:Ἀ):=by rw[Υ];simp[β] have:=w.toNat_lt;rw[ϓ,AM,Ak,<-Β,d,ap];simp @[inline]def sx(k x:ἆ):ἆ:=bif x>>>k==0 then x else x>>>k @[inline]def sr(k x r:ἆ):ἆ:=bif x>>>k==0 then r else r+k @[inline]def ai(x0:ἆ):ἆ:= let x1:=sx 32 x0 let r1:=sr 32 x0 0 let x2:=sx 16 x1 let r2:=sr 16 x1 r1 let x3:=sx 8 x2 let r3:=sr 8 x2 r2 let x4:=sx 4 x3 let r4:=sr 4 x3 r3 let x5:=sx 2 x4 let r5:=sr 2 x4 r4 sr 1 x5 r5 noncomputable def f7(value shift:ἆ):ἆ:= let quotient:=value>>>shift let remainder:=value&&&((1<<half then quotient+1 else if(quotient&&&1)==0 then quotient else quotient+1 @[inline]def de(value shift:ἆ):ἆ:= let quotient:=value>>>shift let remainder:=value&&&((1<<half then 1 else 0) @[inline]def aW(value shift:ἆ):ἆ:= if shift==0 then value else if shift<64 then de value shift else if shift==64 then(if value>0x8000000000000000 then 1 else 0) else 0 @[inline]def c9(sign:Ἆ)(e f:ἇ):ἇ:= (if sign then(0x80000000:ἇ)else 0)|||((e&&&255)<<<23)|||(f&&&8388607) @[inline]def d0(n:ἆ):ἇ:= (N3 (if n<8388608 then 0 else n-8388608)) @[inline]def az(sign:Ἆ)(product scale:ἆ):ἇ:= if product==0 then if sign then 0x80000000 else 0 else let leading:=ai product let position:=leading+scale if position<172 then let fraction:= if scale<149 then aW product (149-scale)else product<<<(scale-149) if fraction==0 then(if sign then 0x80000000 else 0) else if fraction==8388608 then c9 sign 1 0 else c9 sign 0 (N3 fraction) else let roundedMantissa:= if leading<23 then product<<<(23-leading)else aW product (leading-23) let carry:=roundedMantissa==16777216 let normalizedPosition:=if carry then position+1 else position if normalizedPosition>425 then(if sign then 0xff800000 else 0x7f800000) else let normalizedMantissa:=if carry then 8388608 else roundedMantissa c9 sign (N3 (normalizedPosition-171)) (d0 normalizedMantissa) open Model.NativeBinary32 in lemma bo(n k:Ἀ)(h:n>>>k≠0):(Aq n)=k+(Aq (n>>>k)):=by rw[β]at h⊢;have e:=(mc (϶ k)).1 (ϰ h);have d:=(ϸ (϶ k)).1 (ϙ (n:=n/2^k));rw[mz (λz=>h (by rw[z,Hx]))];simp only[Hy,m7]at d⊢;rw[Ϗ (2^k)];exact⟨e,by rwa[Hz]at d⟩ lemma d7(x:ἆ):(Aq (lq x))<64:=by by_cases h:(lq x)=0 .simp[h] .exact(m9 h).mpr x.toNat_lt lemma cx(j r x k:ἆ)(p:(lq k)<=32)(o:0<(lq k)) (d:(Aq (lq j))=(lq r)+(Aq (lq x)))(m:(lq x)<2^(2*(lq k))): (Aq (lq j))=(lq (sr k x r))+(Aq (lq (sx k x)))/\(lq (sx k x))<2^(lq k):=by have e:(lq (x>>>k))=(lq x)>>>(lq k):=by rw[ν,γ (by (clear * - p o;omega))] rw[sx,sr];by_cases g:x>>>k=0;simp only[g,Az,Bool.cond_true];use d;simpa[e,β,Wk]using congrArg lq g;simp only[(by simpa using g:(x>>>k==0)=ἄ),Bool.cond_false];have q:=bo (lq x) (lq k) λh=>g (ξ.mp (by simpa[e]using h));have l:=d7 j;use(by rw[η,γ (by clear*-d l p;omega),e];clear*-d q;omega);rw[e,β];exact Ϟ (m7 _ _ _▸m.trans_eq (by congr 1;exact Xe k.toNat)) lemma dr(n:Ἀ)(h:n<2):(Aq n)=0:=by rw[Ua,AC (by exact Qh h)] lemma aA(x:ἆ):ai x=x.log2:=by apply ξ.1;rw[show (lq x.log2)=(Aq (lq x))from ἅ];have d:(lq x)<2^(2*(lq (32:ἆ))):=x.toNat_lt;have⟨o,e⟩:=cx x 0 x 32 (by decide) (by decide) (by simp only [ϋ,Ai]) d;obtain⟨p,g⟩:=cx x _ _ 16 (by decide) (by decide) o (by simpa using e);obtain⟨q,h⟩:=cx x _ _ 8 (by decide) (by decide) p (by simpa using g);obtain⟨r,j⟩:=cx x _ _ 4 (by decide) (by decide) q (by simpa using h);obtain⟨t,l⟩:=cx x _ _ 2 (by decide) (by decide) r (by simpa using j);obtain⟨u,m⟩:=cx x _ _ 1 (by decide) (by decide) t (by simpa using l);rw[dr (lq (sx 1 (sx 2 (sx 4 (sx 8 (sx 16 (sx 32 x))))))) (by simpa using m)]at u;dsimp only[ai];clear*-u;omega lemma gH_h1(a x k:Ἀ)(p:a>>s)&&&1))=(lq (v>>>s))%2:=by rw[Ε,pS,mP] have p:=ϊ (lq v) (϶ (lq s));have j:(lq ((v&&&((1<<>>s)&&&1)))=(lq v)%2^(lq s)+(lq (v>>>s))%2:=by rw[η,e,d,γ (gH_h1 _ _ _ p m)] have l:((v>>>s)&&&1==0)=decide ((lq (v>>>s))%2=0):=by rw[<-d,ϓ,AQ,As,<-ξ,ϋ] simp only[de,f7,BC,μ,j,e,l,AJ];clear e d j l m p g;have:=ϊ (lq (v>>>s)) ((by decide):0<2);generalize (lq (v>>>s))%2=b at *;generalize (lq (1<<<(s-1)))=H at *;generalize (lq v)%2^(lq s)=R at *;exact gH_h2 _ _ _ _ this lemma eP_h1(e d:ἆ):aW e d=(if d==0 then e else if d<64 then f7 e d else if d==64 then(if e>0x8000000000000000 then 1 else 0) else 0):=by rw[aW];by_cases a:(d==0)=true;rw[AD a,AD a];rw[AC a,AC a];by_cases b:d<64;rw[AD b,AD b,gH _ _ (fun h=>a (by subst h;rfl)) b];rw[AC b,AC b] lemma eP(e d:ἆ): aW e d=lk e (lq d):=by rw[eP_h1,f7,lk];have p:=d.toNat_lt;by_cases g:d=0;subst g;rfl;have j:(lq d)≠0:=λh=>g (ξ.1 (h.trans ϋ.symm));simp only[g,AQ,j,reduceIte,Ub,(ξ.1 ((Α ((Y4 _ _).trans_lt p)).trans (χ d 1 (θ.2 (Gd.2 j))).symm):lh ((lq d)-1)=d-1),<-show(d<64)↔(lq d)<64 from μ,(by rw[<-ξ];rfl:d=64↔(lq d)=64)] open Model.NativeBinary32 in lemma eJ(d:Ἆ)(e f:Ἀ): c9 d (lA e) (lA f)=mkBits d e f:=by rw[c9,mkBits];cases d<;>rfl lemma bY(x:ἆ):(N3 x)=lA (lq x):=(by rfl) lemma c5(n:ἆ):d0 n=lA ((lq n)-8388608):=by rw[d0];split<;>rename_i h<;>rw[μ]at h<;>rw[bY] .rw[show (lq n)-8388608=0 by simp at h;omega];rfl .rw[χ _ _ (by rw[θ];simp at h⊢;exact l7 h)];rfl open Model.NativeBinary32 in lemma bE(g:Ἆ)(d e:ἆ): az g d e=roundProduct g d e:=by unfold az roundProduct;simp only[aA,eP,c5,bY];rw[show(1:ἇ)=lA 1 from rfl,show(0:ἇ)=lA 0 from rfl];simp only[eJ,FloatLib.Numerics.FixedWord.log2Word_eq_log2] open Model.NativeBinary32 in lemma bD(w:ἇ):kW (ofUInt32 w)=w:=by have h:=toUInt32_ofUInt32 w;unfold ps at h;unfold kW;conv_rhs=>rw[<-h] exact Β.mp (γ (BitVec.isLt _)) open Model.NativeBinary32 in lemma aJ(g:Ἆ)(m d:ἆ)(h:(lq d)<=506): az g m d=kW (kE lU ⟨g,(lq m),((lq d):Ἁ)-298⟩):=by rw[bE,roundProduct_eq_roundDyadic _ _ _ h,show kE lU ⟨g,(lq m),((lq d):Ἁ)-298⟩=ofUInt32 (roundDyadic ⟨g,(lq m),Uc (lq d)-298⟩) from(ofUInt32_roundDyadic _).symm,bD] noncomputable def aw(hi lo:ἆ):Ἁ:=ae hi*2^(64:Ἀ)+(lq lo) @[inline]def aF(hi lo:ἆ):ἆ:=if hi>>>63!=0 then(0:ἆ)-lo else lo @[noinline]def aQ(hi lo:ἆ):ἆ:= if hi>>>63!=0 then(if lo==0 then(0:ἆ)-hi else~~~hi)else hi lemma gB(d:ἆ):(d>>>63!=0)=decide (2^(63:Ἀ)<=(lq d)):=by have e:(lq (d>>>63))=(lq d)/2^(63:Ἀ):=by rw[ν];simp[β] have:=d.toNat_lt;rw[ϓ,AM,Ak,<-ξ,e,As];simp lemma bN(d e:ἆ): aw d e=((lq d)*2^(64:Ἀ)+(lq e):Ἁ)-(if 2^(63:Ἀ)<=(lq d)then 2^(128:Ἀ) else 0):=by rw[aw,ae];rw[lv,nR];omega lemma fk_h1(e:Ἀ)(m:e<18446744073709551616):(K7 ((e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456))=(18446744073709551616-e)*18446744073709551616/\(e:Ἁ)*18446744073709551616<340282366920938463463374607431768211456:=by have k:(e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456=-(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by rw[G4,pO m.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by exact_mod_cast Ϯ (Ku m) (϶ 64) exact⟨by rw[k,Gn,Yp],by rw[←sub_neg,k];exact neg_neg_of_pos p⟩ lemma fk_h2(e d:Ἀ)(m:e<18446744073709551616)(o:d<18446744073709551616):(K7 ((e:Ἁ)*18446744073709551616+d-340282366920938463463374607431768211456))=(18446744073709551615-e)*18446744073709551616+(18446744073709551616-d)/\(e:Ἁ)*18446744073709551616+d<340282366920938463463374607431768211456:=by have k:(e:Ἁ)*18446744073709551616+d-340282366920938463463374607431768211456=-(((18446744073709551615-e)*18446744073709551616+(18446744073709551616-d):Ἀ):Ἁ):=by rw[K5,G4,pO (U2 m),pO o.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551615-e)*18446744073709551616+(18446744073709551616-d):Ἀ):Ἁ):=by exact_mod_cast (Ku o).trans_le (N2 _ _) exact⟨by rw[k,Gn,Yp],by rw[←sub_neg,k];exact neg_neg_of_pos p⟩ lemma fk_h3(x:Ἀ)(h:0>>63!=0):=by have m:=e.toNat_lt;have o:=d.toNat_lt;rw[aQ,aF,bN,gB];by_cases j:2^(63:Ἀ)<=(lq e);simp only[j,decide_true,ἁ];by_cases g:d=0;subst g;simp only[Az,ἁ,ϋ];rw[Ζ];simp only [Xl,CharP.cast_eq_zero,Av,nr,ϋ,sub_self,sub_neg,AJ];rw[γ (fk_h3 _ ((϶ 63).trans_le j))];exact fk_h1 _ m;have l:(lq d)≠0:=λh=>g (ξ.1 (by simpa using h));simp only[show(d==0)=false by simpa using g,υ,Am];rw[Ζ,UInt64.toNat_not];simp only [Xl,Nat.add_one_sub_one,nr,ϋ,Av,sub_neg,AJ];rw[γ (fk_h3 _ (ϵ l))];exact fk_h2 _ _ m o;simp only[j,decide_false,υ,ἂ];simp only [Xl,sub_zero,nr,decide_eq_false_iff_not,not_lt];exact⟨by norm_cast,(by positivity)⟩ @[noinline]def au(hi lo B:ἆ):ἆ:= if hi==0&&lo==0 then 4294967296 else if B>442 then 4294967296 else let neg:=hi>>>63!=0 let mlo:=aF hi lo let mhi:=aQ hi lo if mhi==0 then(H9 (az neg mlo B)) else if mhi>>>32==0 then let q:=(mhi<<<32)+(mlo>>>32) (H9 (az neg (if mlo&&&0xFFFFFFFF==0 then q else q|||1) (B+32))) else(H9 (az neg (if mlo==0 then mhi else mhi|||1) (B+64))) lemma toUInt32_toUInt64(x:ἇ):(N3 (H9 x))=x:=(by simp only [UInt32.toUInt32_toUInt64]) lemma i6_h1(e d:Ἀ):(e*2^(64:Ἀ)+d)/2^(32:Ἀ)=e*2^(32:Ἀ)+d/2^(32:Ἀ)/\(e*2^(64:Ἀ)+d)%2^(32:Ἀ)=d%2^(32:Ἀ):=by have k:e*2^(64:Ἀ)+d=d+e*2^(32:Ἀ)*2^(32:Ἀ):=by rw[Ϛ];exact Τ _ _ exact⟨by rw[k,Ρ _ _ (϶ 32),Τ],by rw[k,Μ]⟩ lemma i6_h2(e d:Ἀ)(h:e<2^(32:Ἀ))(j:d<2^(64:Ἀ)):e*4294967296+d/4294967296<18446744073709551616:=(O1 ((ϸ (϶ 32)).2 j) _).trans_le ((Ο _ _).symm.trans_le (ι _ h)) lemma i6_h3(X Y:ἆ)(m r:ℕ)(l:(lq X)=m)(k:(lq Y)=r):(lq (if Y==0 then X else X|||1))=if (r==0)=true then m else m|||1:=by by_cases c:r=0 · rw[AD (AQ.mpr (ξ.mp (k.trans (c.trans ϋ.symm)))),AD (AQ.mpr c)];exact l · rw[AC (fun q=>c (k.symm.trans ((congrArg lq (AQ.mp q)).trans ϋ))),AC (fun q=>c (AQ.mp q)),my,l,pS] lemma i6(e d:ἆ)(h:(lq e)<2^(32:Ἀ)): (lq (if d&&&0xFFFFFFFF==0 then(e<<<32)+(d>>>32) else((e<<<32)+(d>>>32))|||1))= kQ ((lq e)*2^(64:Ἀ)+(lq d)) 32:=by have l:(lq ((e<<<32)+(d>>>32)))=(lq e)*2^(32:Ἀ)+(lq d)/2^(32:Ἀ):=by rw[η,ψ,ν];simp only[kA,kH,ο,β,Yt];exact γ (i6_h2 _ _ h d.toNat_lt) obtain⟨q1,q2⟩:=i6_h1 (lq e) (lq d);simp only[kQ,q1,q2];exact i6_h3 _ _ _ _ l ((Ε _ _).trans (ζ _ 32)) lemma i7(e d:ἆ): (lq (if d==0 then e else e|||1))= kQ ((lq e)*2^(64:Ἀ)+(lq d)) 64:=by have l:=d.toNat_lt;have g:((lq e)*2^(64:Ἀ)+(lq d))/2^(64:Ἀ)=(lq e):=(by omega);have h:((lq e)*2^(64:Ἀ)+(lq d))%2^(64:Ἀ)=(lq d):=(by exact Nat.mul_add_mod_of_lt l);rw[kQ];rw[g,h];by_cases j:(lq d)=0<;>simp[j,my,<-ξ] lemma eN(s:Ἆ)(q B J:ἆ)(M:Ἀ) (e:(lq q)=kQ M (lq J))(h:(lq B)<=442)(j:(lq J)<=64) (d:2^((lq J)+25)<=M): az s q (B+J)=kW (kE lU ⟨s,M,((lq B):Ἁ)-298⟩):=by have g:(lq (B+J))=(lq B)+(lq J):=by simp[η];(clear * - h j;omega) rw[aJ _ _ _ (by (clear * - h j g;omega)),e,g,<-cm s M _ (lq J) ((mu (BD.1 (AN (by positivity) d))).2 d)];congr 3;(clear * -;omega) lemma dq_h3(d e:Ἀ)(hd:d<2^(64:Ἀ))(he:e<2^(64:Ἀ))(j:(d:Ἁ)*2^(64:Ἀ)+e-2^(128:Ἀ)=0):d=0/\e=0:=by have N:d*2^(64:Ἀ)+e<2^(128:Ἀ):=(O1 he _).trans_le ((Ο d _).symm.trans_le (ι _ hd)) have h:((d*2^(64:Ἀ)+e:Ἀ):Ἁ)=((2^(128:Ἀ):Ἀ):Ἁ):=by push_cast;exact sub_eq_zero.1 j exact absurd N (by rw[Nat.cast_inj.1 h];exact AX _) lemma dq_h4(d e:Ἀ)(j:(d:Ἁ)*2^(64:Ἀ)+e-0=0):d=0/\e=0:=by obtain⟨h1,h2⟩:=Nat.add_eq_zero_iff.1 (by exact_mod_cast (sub_zero ((d:Ἁ)*2^(64:Ἀ)+e)).symm.trans j:d*2^(64:Ἀ)+e=0) exact⟨(Op.1 h1).resolve_right (BD.1 (϶ 64)),h2⟩ lemma dq_h1(a b:Ἀ)(v:a≠0):2^(57:Ἀ)<=a*2^(64:Ἀ)+b:=((by decide):2^(57:Ἀ)<=2^(64:Ἀ)).trans ((lZ _ (ϵ v)).trans (V1 _ _)) lemma dq_h2(a b:Ἀ)(u:2^(32:Ἀ)<=a):2^(89:Ἀ)<=a*2^(64:Ἀ)+b:=((by decide):2^(89:Ἀ)<=2^(32:Ἀ)*2^(64:Ἀ)).trans ((ι _ u).trans (V1 _ _)) lemma dq(d e B:ἆ)(h:au d e B<4294967296): aw d e≠0/\(lq B)<=442/\ (N3 (au d e B))= kW (kE lU (nb (aw d e) (((lq B):Ἁ)-298))):=by obtain⟨m,o⟩:=fk d e;rw[au]at h⊢;by_cases t:(d==0&&e==0)=ἃ · rw[AD t]at h;exact (Od _ h).elim rw[AC t]at h⊢;have w:aw d e≠0:=λj=>t (by rw[bN]at j;simp only[Η,AQ,<-ξ,ϋ];split at j;exact dq_h3 _ _ d.toNat_lt e.toNat_lt j;exact dq_h4 _ _ j);by_cases p:B>442 · rw[AD p]at h;exact (Od _ h).elim rw[AC p]at h⊢;have g:(lq B)<=442:=θ.1 (Xm.1 p) refine⟨w,g,?_⟩;rw[nb,o,m];have r:=ν (aQ d e) 32;rw[β]at r by_cases j:(aQ d e==0)=true · rw[AD j,(congrArg lq (AQ.1 j)).trans ϋ,ϳ,Κ,toUInt32_toUInt64,aJ _ _ _ (g.trans ((by decide):442<=506))] rw[AC j];have v:(lq (aQ d e))≠0:=λl=>j (by simp[<-ξ,l]) by_cases l:(aQ d e>>>32==0)=true · rw[AD l];have q:(lq (aQ d e))<2^(32:Ἀ):=J8 fun h=>BD.1 (Gf h (϶ 32)) (r.symm.trans (congrArg lq (AQ.1 l))) rw[toUInt32_toUInt64];exact eN _ _ _ 32 _ (i6 _ _ q) g (by decide) (dq_h1 _ _ v) rw[AC l];have u:2^(32:Ἀ)<=(lq (aQ d e)):=O3.1 fun x=>l (AQ.2 (ξ.1 (r.trans (ώ x)))) rw[toUInt32_toUInt64];exact eN _ _ _ 64 _ (i7 _ _) g (by decide) (dq_h2 _ _ u) lemma aY(n:Ἀ)(e g:Ἀ->kF)(l m B:ἆ) (j:aG n e g)(d:af n e g=aw l m*2^(lq B)) (h:au l m B<4294967296):ms n e g=(N3 (au l m B)):=by have⟨q,r,p⟩:=dq l m B h;have o:af n e g≠0:=d▸mul_ne_zero q (by positivity) rw[bT n e g j o,p];refine mf _ _ _ _ o ?_;rw[toRat_ofIntDyadic,d];push_cast;rw[Ac AL,AA];field_simp @[inline]def ar(N:ἆ):ἆ:=(N+(0x3FFFFFFFFF:ἆ)+((N>>>39)&&&1))>>>39 noncomputable def a8(lb v B:ἆ):ἆ:= let m:=aF v v let L:=ai m let E:=L+B-172 if m-lb<0x8000000000000000-lb/\E<253 then((v>>>63)<<<31)+((E<<<23)+ar (m<<<(62-L))) else 4294967296 noncomputable def bP(hi lo B:ἆ):ἆ:= let r:=if hi=(0:ἆ)-(lo>>>63)then a8 1 lo B else 4294967296 if r=4294967296 then au hi lo B else r lemma gA(n:Ἆ)(e f:ἇ): (mJ (c9 n e f))=(if n then 2^(31:Ἀ) else 0)+(mJ e)%2^(8:Ἀ)*2^(23:Ἀ)+(mJ f)%2^(23:Ἀ):=by have j:=ϊ (mJ e) ((by positivity):0<2^(8:Ἀ));have d:(mJ ((e&&&255)<<<23|||(f&&&8388607)))=2^(23:Ἀ)*((mJ e)%2^(8:Ἀ))+(mJ f)%2^(23:Ἀ):=by rw[nK,(by rw[ϴ,Ξ,show(mJ (255:ἇ))=2^(8:Ἀ)-1 from ἅ,ζ,ο,Ϗ];exact γ (by simp only [kN,kH,nr];omega):(mJ ((e&&&255)<<<23))=2^(23:Ἀ)*((mJ e)%2^(8:Ἀ))),Ξ,show(mJ (8388607:ἇ))=2^(23:Ἀ)-1 from ἅ,ζ,<-Ϥ (ϊ (mJ f) ((by positivity):0<2^(23:Ἀ)))] rw[c9,UInt32.or_assoc];cases n .simp only[υ,ἂ,UInt32.zero_or,d];clear*-;ring simp only[ἁ,nK,d];rw[show(mJ (0x80000000:ἇ))=2^(31:Ἀ)*1 from ἅ,<-Ϥ (by clear*-j;omega)];clear*-;ring lemma bM_h1_h1(k r G:Ἀ)(x M:ἆ)(y:(lq x)=62+G+k)(w:110<=G)(v:G<363)(j:k<2)(m:8388608<=(lq M))(q:(lq M)<2^(24:Ἀ))(h:k*2^(23:Ἀ)+(lq M)=r):(mJ (N3 (x-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 M))%2^(23:Ἀ)=(G-110)*2^(23:Ἀ)+r:=by obtain⟨d,rfl⟩:=Kr w;obtain⟨e,f⟩:=Kr m have l:(lq (x-171))=d+k+1:=by rw[χ x 171 (θ.2 (by rw[y];show 171<=_;exact ((by decide):171<=62+110).trans ((J1 (V1 110 d) 62).trans (V1 _ k)))),y];show 62+(110+d)+k-171=_;rw[show 62+(110+d)+k=d+k+1+171 by ring,BK] have hdk:d+k+1<2^(8:Ἀ):=by clear*-v j;omega have hee:e<2^(23:Ἀ):=by rw[f]at q;exact Jz q rw[Ϫ,l,c5,lE,f,ϱ,ϱ,γ (hdk.trans (by decide):d+k+1<2^(32:Ἀ)),γ (hdk:d+k+1<2^(8:Ἀ)),γ (hee.trans (by decide):e<2^(32:Ἀ)),γ hee,<-h,f];simp only[Ϡ,n4,pA];rfl theorem bM_h1(g R:ἆ)(w:110<=(lq g))(v:(lq g)<363)(t:2^(23:Ἀ)<=(lq R)/\(lq R)<=2^(24:Ἀ)):(mJ (N3 ((if (R==16777216)=ἃ then 62+g+1 else 62+g)-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 (if (R==16777216)=ἃ then 8388608 else R)))%2^(23:Ἀ)=((lq g)-110)*2^(23:Ἀ)+(lq R):=by have H:=bM_h1_h1 have y:(lq (62+g))=62+(lq g):=(η 62 g).trans (γ ((O1 v 62).trans (by decide):62+(lq g)<2^(64:Ἀ))) split .rename_i c;have:R=16777216:=by simpa using c subst this;exact H 1 _ _ _ _ (by rw[η,y];exact γ ((B3 (O1 v 62) 1).trans (by decide):62+(lq g)+1<2^(64:Ἀ))) w v (by decide) (by decide) (by decide) ἅ rename_i c;have c:¬R=16777216:=by simpa using c exact H 0 _ _ _ _ y w v (by decide) t.1 (lt_of_le_of_ne t.2 (λe=>c (ξ.1 e))) (Κ _) lemma bM_h2(x b:Ἀ)(h:b<2):(x+274877906943+b)/2^(39:Ἀ)=x/2^(39:Ἀ)+if 2^(38:Ἀ)rename_i c · exact mG (by rw[lO];exact L1 c 274877906943) ((R6 (B3 s _) (U2 h)).trans_le (by decide)) · exact ώ (by rw[lO];exact (L1 (not_lt.1 c) _).trans_lt (by decide)) lemma bM_h3(Q R b:Ἀ)(hR:R<2^(39:Ἀ))(hb:b<2)(hQ:Q<2^(24:Ἀ)):(Q+if 274877906944<(R+b)%2^(64:Ἀ) then 1 else 0)%2^(64:Ἀ)=Q+if 2^(38:Ἀ)by have e:(lq (62+g))=62+(lq g):=(η 62 g).trans (γ ((O1 v 62).trans (by decide):62+(lq g)<2^(64:Ἀ)));have:=μ.1 h;rw[e]at this;exact absurd this (not_lt.2 (J1 w 62)) lemma bM_h6(N:Ἀ)(p:N<2^(63:Ἀ)):N+274877906943<18446744073709551616/\N+274877906943+N/549755813888%2<18446744073709551616:=⟨(B3 p _).trans (by decide),(R6 (B3 p _) (U2 (ϊ _ ((by positivity):0<2)))).trans_le (by decide)⟩ lemma bM(n:Ἆ)(N g:ἆ)(o:2^(62:Ἀ)<=(lq N))(p:(lq N)<2^(63:Ἀ))(w:110<=(lq g)) (v:(lq g)<363): (mJ (az n N g))=(if n then 2^(31:Ἀ) else 0)+(((lq g)-110)*2^(23:Ἀ)+(lq (ar N)))/\ 2^(23:Ἀ)<=(lq (ar N))/\(lq (ar N))<=2^(24:Ἀ):=by have l:(lq (N>>>39))=(lq N)/2^(39:Ἀ):=by simp[β] have j:(lq ((N>>>39)&&&1))=(lq N)/2^(39:Ἀ)%2:=by simp[l,mP] have m:(lq (ar N))=(lq N)/2^(39:Ἀ)+if 2^(38:Ἀ)<(lq N)%2^(39:Ἀ)+(lq N)/2^(39:Ἀ)%2 then 1 else 0:=by obtain⟨b1,b3⟩:=bM_h6 _ p;rw[ar];simp(disch:=assumption) only[ν,η,j,kA,β,nr,γ];exact bM_h2 _ _ (ϊ _ ((by positivity):0<2)) have d:2^(23:Ἀ)<=(lq N)/2^(39:Ἀ)/\(lq N)/2^(39:Ἀ)<2^(24:Ἀ):=⟨(mc (϶ 39)).2 ((Y3 ἅ).trans o),(ϸ (϶ 39)).2 (p.trans_eq ἅ)⟩ have e:2^(23:Ἀ)<=(lq (ar N))/\(lq (ar N))<=2^(24:Ἀ):=by rw[m];split;exact⟨d.1.trans (N8 _),d.2⟩;exact⟨d.1,d.2.le⟩ have h:(lq (aW N (62-23)))=(lq (ar N)):=by rw[m];show(lq (de N 39))=_;rw[de];simp only[show((1:ἆ)<<<39)-1=0x7FFFFFFFFF from ἅ,show(1:ἆ)<<<(39-1)=0x4000000000 from ἅ,BC,μ,η,(Ε _ _▸ζ _ 39:(lq (N&&&0x7FFFFFFFFF))=(lq N)%2^(39:Ἀ)),j,l,Ax lq,kA];clear*-d;exact bM_h3 _ _ _ (ϊ (lq N) (϶ 39)) (ϊ _ ((by positivity):0<2)) d.2 have q:ai N=62:=by rw[aA];apply ξ.1;rw[show (lq N.log2)=(Aq (lq N))from ἅ,mz (BD.1 ((϶ 62).trans_le o))];exact⟨o,p⟩ refine⟨?_,e⟩;rw[az];simp only[q,(by simp[<-ξ];exact Uy o:(N==0)=ἄ),bM_h5 g w v,((by decide):¬(62:ἆ)<23),ἂ,υ];generalize aW N (62-23)=R at h⊢;have t:2^(23:Ἀ)<=(lq R)/\(lq R)<=2^(24:Ἀ):=h▸e;rw[<-h];clear l j m h q o p d e;rw[AC (by split<;>simp[μ]<;>first|exact (bM_h4 _ v).1|exact (bM_h4 _ v).2),gA,pA,Nat.add_left_cancel_iff];exact bM_h1 g R w v t lemma cl(n:Ἆ)(M σ:ἆ)(e:(lq M)≠0)(d:(lq σ)<=506): az n M σ=md ((if n then-((lq M):Ἁ)else (lq M))*2^(lq σ)) (-298) ἄ:=by rw[aJ _ _ _ d];refine(mf _ _ _ _ (mul_ne_zero (by split<;>omega) (pow_ne_zero _ AL)) ?_).symm;cases n<;>simp[pR,lr,Ac,div_eq_mul_inv,Ap] lemma f9(v:ἆ):(v>>>63=0/\(lq v)<2^(63:Ἀ))\/(v>>>63=1/\2^(63:Ἀ)<=(lq v)):=by have:=v.toNat_lt;simp only[<-ξ,ν];simp[β];omega lemma dZ_h3(S:Ἀ)(hS:S<63+2^(64:Ἀ))(q:(18446744073709551444+S)%18446744073709551616<253):(18446744073709551444+S)%18446744073709551616=S-172/\172<=S/\S<425:=by rcases Z7 S 172 with h|h · rw[γ (O1 h _:18446744073709551444+S<18446744073709551616)]at q;exact absurd ((V1 _ _).trans_lt q) (by decide) · have e:18446744073709551444+S=(S-172)+18446744073709551616:=by rw[show (18446744073709551616:Ἀ)=18446744073709551444+172 from ἅ,Xv,J4 h] have s1:S-172<18446744073709551616:=D4 h (hS.trans ((by decide):63+2^(64:Ἀ)<172+18446744073709551616)) rw[e,Xw,γ s1]at q⊢;exact⟨ἅ,h,(tsub_lt_tsub_iff_right h).1 (q:S-172<425-172)⟩ lemma dZ_h4(S a:Ἀ)(k:S<425)(N:a<=2^(24:Ἀ)):(S-172)*2^(23:Ἀ)+a<2^(64:Ἀ)/\2^(31:Ἀ)+((S-172)*2^(23:Ἀ)+a)%2^(64:Ἀ)<2^(64:Ἀ)/\0+((S-172)*2^(23:Ἀ)+a)%2^(64:Ἀ)<2^(64:Ἀ):=by have b:(S-172)*2^(23:Ἀ)+a<2^(31:Ἀ):=(M3 (ι (2^(23:Ἀ)) (G5 k.le 172)) N).trans_lt (by decide) rw[γ (b.trans (by decide)),Κ];exact⟨b.trans (by decide),(O1 b _).trans (by decide),b.trans (by decide)⟩ lemma dZ_h1(l B:Ἀ)(y:172<=l+B)(k:l+B<425)(A:l<63):62-l<=B/\B-(62-l)=l+B-62/\110<=B-(62-l)/\B-(62-l)<363/\B<=506/\B-(62-l)<=506:=by have u2:B-(62-l)=l+B-62:=(Nat.sub_sub_right _ (U2 A)).trans (congrArg (·-62) (Τ _ _)) rw[u2];exact⟨Vo.2 (((by decide):62<=172).trans (y.trans_eq (Τ _ _))),ἅ,M5 y,(G5 (U2 k) 62).trans_lt (by decide),(N2 _ _).trans (k.le.trans ((by decide):425<=506)),(Y4 _ _).trans (k.le.trans ((by decide):425<=506))⟩ lemma dZ_h2(S:Ἀ)(k:S<425):(S-172)*2^(23:Ἀ)%2^(64:Ἀ)=(S-172)*2^(23:Ἀ):=γ ((ι (2^(23:Ἀ)) (G5 k.le 172)).trans_lt (by decide)) lemma dZ_h6(l B:Ἀ)(y:172<=l+B)(A:l<63):110<=B:=Nat.le_of_add_le_add_left (y.trans (L1 (U2 A) _):62+110<=62+B) lemma dZ(p v B:ἆ)(r:1<=(lq p))(g:(lq p)<=2^(63:Ἀ))(h:a8 p v B≠4294967296): (lq p)<=(lq (aF v v))/\(lq (aF v v))<2^(63:Ἀ)/\110<=(lq B)/\(lq B)<=424/\ a8 p v B=(H9 (az (v>>>63!=0) (aF v v) B)):=by dsimp only[a8]at h⊢;split at h;swap;exact(h ἅ).elim;rename_i E;rw[AD E];obtain⟨F,q⟩:=E;generalize aF v v=m at F q⊢;have j:(lq p)<=(lq m)/\(lq m)<2^(63:Ἀ):=by have H:=Hc ((μ.1 F).trans_eq (χ 0x8000000000000000 p (θ.2 g)));have E:(lq m)=(lq (m-p))+(lq p):=(congrArg lq (Vp m p).symm).trans ((η _ _).trans (γ (H.trans (by decide))));exact⟨(N2 _ _).trans_eq E.symm,E.trans_lt H⟩ have o:(lq m)≠0:=C8 (r.trans j.1);have r:(lq (ai m))=(Aq (lq m)):=by rw[aA];rfl have t:=ϰ o;have g:=@ϙ (lq m);have A:=(m9 o).2 j.2;generalize ai m=L at r q⊢;generalize (Aq (lq m))=l at r t g A;obtain⟨x,y,k⟩:(lq (L+B-172))=l+(lq B)-172/\172<=l+(lq B)/\l+(lq B)<425:=by rw[μ]at q;rw[Ζ,η,r,Oq]at q⊢;exact dZ_h3 _ (L6 A B.toNat_lt) q refine⟨j.1,j.2,dZ_h6 _ _ y A,U2 ((N2 _ _).trans_lt k),?_⟩;have D:(lq (62-L))=62-l:=by rw[χ _ _ (by rw[θ,r];exact U2 A),r]<;>rfl have z:(lq m)*2^(62-l)<2^(63:Ἀ):=AN (ϐ g (϶ _)) (by rw[<-AF];exact Θ (by decide) (Y3 (by rw[lO,R5 (U2 A)])));have w:(lq (m<<<(62-L)))=(lq m)*2^(62-l):=by rw[ψ,D,ο,γ (AO (Y4 _ _) (by decide):62-l<64),γ (z.trans ((by decide):2^(63:Ἀ)<2^(64:Ἀ)))] obtain⟨lb,u2,c1,c2,c3,c4⟩:=dZ_h1 l (lq B) y k A;have u:(lq (B-(62-L)))=(lq B)-(62-l):=by rw[χ _ _ (by rw[θ,D];exact lb),D] obtain⟨K,M,N⟩:=bM (v>>>63!=0) (m<<<(62-L)) (B-(62-L)) (w▸AZ (Eq.le (by rw[<-AF,R5 (U2 A)])) (ι _ t)) (w▸z) (by rw[u];exact c1) (by rw[u];exact c2);rw[<-ξ,ϩ,(by rw[cl _ m B o c3,cl _ (m<<<(62-L)) (B-(62-L)) (by rw[w];exact Yu o (϶ _).ne') (by rw[u];exact c4),w,u];refine congrArg (md · (-298) ἄ) ?_;obtain⟨d,J⟩:∃d,(lq B)=62-l+d:=⟨(lq B)-(62-l),(R5 lb).symm⟩;rw[J,ϱ];push_cast;split<;>ring:az (v>>>63!=0) m B=az (v>>>63!=0) (m<<<(62-L)) (B-(62-L))),K,u,η,η,(by rcases f9 v with⟨e,-⟩|⟨e,-⟩<;>rw[e]<;>rfl:(lq ((v>>>63)<<<31))=(if(v>>>63!=0)then 2^(31:Ἀ) else 0)),(by rw[ψ,x];simp only[kA,kH,ο];exact dZ_h2 _ k:(lq ((L+B-172)<<<23))=(l+(lq B)-172)*2^(23:Ἀ))];rw[(by rw[u2,D8]:(lq B)-(62-l)-110=l+(lq B)-172)];obtain⟨d1,d2,d3⟩:=dZ_h4 _ _ k N;split<;>rw[γ,γ]<;>with_reducible first|exact d1|exact d2|exact d3 lemma fd(d v B:ἆ)(o:1<=(lq d))(j:(lq d)<=2^(63:Ἀ))(h:a8 d v B≠4294967296): a8 d v B=au ((0:ἆ)-(v>>>63)) v B:=by obtain⟨m,-,-,p,e⟩:=dZ d v B o j h;rw[e];have l:v≠0:=by rintro rfl;exact absurd m (by show¬(lq d)<=0;(clear * - o j;omega)) have g:¬B>442:=by simp[μ];(clear * - p;omega) symm;unfold au aQ aF;rcases f9 v with⟨e,-⟩|⟨e,-⟩;simp[e,l,g];rw[e,show(0:ἆ)-1=0xFFFFFFFFFFFFFFFF from ἅ];simp[l,g,show(0xFFFFFFFFFFFFFFFF:ἆ)>>>63=1 from ἅ,show~~~(0xFFFFFFFFFFFFFFFF:ἆ)=0 from ἅ] lemma dY(g d B:ἆ):bP g d B=au g d B:=by unfold bP;dsimp only;by_cases e:g=(0:ἆ)-(d>>>63) .rw[AD e];split .rfl .rename_i h;rw[e];exact fd 1 d B (by decide) (by decide) h .rw[AC e,AD rfl] end Core open Core lemma cn(w:kF):kW (lI w)=w:=by apply Β.mp;rw[kW,lI,Model.toNatBits,pu,lE];exact γ w.toBitVec.isLt lemma aR(z:Model lU):lI (kW z)=z:=by have h:z.toNatBits<2^(32:Ἀ):=mQ z;rw[lI,kW,kT,lE,γ h];exact m3 z namespace Dense lemma ac{k n:Ἄ}(h:ksplit<;>push_cast<;>omega noncomputable def bj(x:ἇ):ἇ:=x&&&0x7FFFFFFF lemma aM(x:ἇ):(mJ (bj x))=(mJ x)%2^(31:Ἀ):=by rw[bj];rw[Ξ];exact ζ _ 31 lemma aN(x:ἇ):(mJ (kB x))=(mJ (bj x))/2^(23:Ἀ):=by have:(mJ (kB x))=(mJ x)/2^(23:Ἀ)%2^(8:Ἀ):=by unfold kB;rw[Ξ,Υ];simp only[kN,kH,β];exact ζ _ 8 rw[this,aM,show 2^(31:Ἀ)=2^(23:Ἀ)*2^(8:Ἀ) by norm_num,Nat.mod_mul_right_div_self] lemma eZ(x:ἇ):kB x=0↔(mJ (bj x))<2^(23:Ἀ):=by rw[<-Β,aN];simp only [nr,nj,Wk,Wm,false_or];try omega lemma jO(x:ἇ):kG x=(mJ (bj x))/2^(23:Ἀ)-1:=by have a:=aN x;rw[kG];split<;>rename_i h .rw[ώ ((eZ x).mp h)] .rw[a] lemma aT(x:ἇ):kG x=(mJ (kB x))-1:=by rw[jO,aN] lemma jW(w:ἇ):(mJ w)/2^(23:Ἀ)=(mJ (kB w))+256*((mJ w)/2^(31:Ἀ)):=by rw[aN,aM];have:=w.toNat_lt;(clear * -;omega) lemma bm(x:ἇ):(mJ (kB x))<256:=by rw[aN,aM];omega lemma fe(w:ἇ):(mJ (w&&&8388607))=(mJ w)%2^(23:Ἀ):=by rw[Ξ];exact ζ _ 23 lemma eR(w:ἇ):|sv w|<2^(24:Ἀ):=by have:=lB w;rw[sv];split<;>simp<;>exact D7 this def lz(y n:ἆ):ἆ:=if y=0 then n else lz (y>>>1) (n+1) termination_by (lq y) decreasing_by have:(lq y)≠0:=λe=>by simp_all[<-ξ] rw[ν];simp[β];exact Go this abbrev bl(k:Ἀ):Ἀ:=if k=0 then 0 else (Aq k)+1 lemma iZ(y:ἆ):bl (lq y)<=64:=by rw[bl];split;. (clear * -;omega) rename_i h;have:=(m9 h).mpr y.toNat_lt;exact Order.add_one_le_iff.mpr this lemma ed(y:ἆ):(lq (y>>>1))=(lq y)/2:=by rw[ν];simp[β] lemma dA(k:Ἀ):bl (k/2)=(Aq k):=by rw[bl];rw[Ua k];by_cases d:2<=k .rw[AC (by omega),AD d] .rw[AD (by omega),AC d] lemma dD(y n:ἆ)(h:(lq n)+bl (lq y)<=64):(lq (lz y n))=(lq n)+bl (lq y):=by rw[lz];by_cases d:y=0 .rw[AD d];subst d;simp .rw[AC d];have j:(lq (n+1))=(lq n)+1:=by rw[η];simp;(clear * - h;omega) have g:(lq y)≠0:=λe=>d (ξ.mp (by simpa using e));have l:bl (lq y)=bl ((lq y)/2)+1:=by rw[dA];simp[bl,g] rw[dD (y>>>1) (n+1) (by rwa[j,ed,lO,pA,←l]),j,ed,l,lO,pA] termination_by (lq y) decreasing_by rw[ed];exact Go g @[inline]def lg(x:ἆ):ἆ:=lz (x>>>1) 0 lemma i8(x:ἆ):lg x=x.log2:=by apply ξ.mp;rw[lg,dD _ _ (by have:=iZ (x>>>1);simpa using this),ed,dA,ϋ,Κ];rfl @[inline]def c0(lb v B:ἆ):ἆ:= let m:=Core.aF v v let L:=lg m let E:=L+B-172 if m-lb<0x8000000000000000-lb/\E<253 then((v>>>63)<<<31)+((E<<<23)+Core.ar (m<<<(62-L))) else 4294967296 lemma ez:c0=a8:=by funext d v B;rw[c0,a8,aA,i8] @[inline]def b9(hi lo B:ἆ):ἆ:= let r:=if hi=(0:ἆ)-(lo>>>63)then c0 1 lo B else 4294967296 if r=4294967296 then Core.au hi lo B else r lemma dp:b9=bP:=by funext d e B;rw[b9,bP,ez] lemma cD{k:Ἄ}{a:Ἂ ἇ}(h:k>>1>>>(63-s))+(if l'0);have hM:=ϛ M (2^(64:Ἀ)) generalize M/2^(64:Ἀ)=a,M%2^(64:Ἀ)=b at *;subst hM have k:2^(64:Ἀ)<=L+b:=not_lt.1 λh=>absurd ((γ h)▸c) (not_lt.2 (V1 L b)) have s:H+a+1<2^(64:Ἀ):=by clear*-g k;omega rw[K8 k,γ (D4 k (L6 hL hb)),γ ((U4 _).trans s),γ s];clear*-k;omega lemma fD_h2(H L M:Ἀ)(hL:L<2^(64:Ἀ))(g:H*2^(64:Ἀ)+L+M<2^(128:Ἀ))(c:¬(L+M%2^(64:Ἀ))%2^(64:Ἀ)0);have hM:=ϛ M (2^(64:Ἀ)) generalize M/2^(64:Ἀ)=a,M%2^(64:Ἀ)=b at *;subst hM have k:L+b<2^(64:Ἀ):=J8 λh=>c (by rw[K8 h,γ (D4 h (L6 hL hb))];exact D4 h ((O1 hb L).trans_eq (Τ L _))) have s:H+a<2^(64:Ἀ):=by clear*-g;omega rw[γ k,ϑ,γ s,γ s];ring lemma fD(h l m s:ἆ)(j:(lq s)<=60) (g:(lq h)*2^(64:Ἀ)+(lq l)+(lq m)*2^(lq s)<2^(128:Ἀ)): (lq (gd h l m s).1)*2^(64:Ἀ)+(lq (gd h l m s).2)=(lq h)*2^(64:Ἀ)+(lq l)+(lq m)*2^(lq s):=by have d:(lq (63-s))=63-(lq s):=by rw[χ _ _ (by simp[θ];exact AZ j (by decide))];rfl have e:(lq m)/2/2^(63-(lq s))=(lq m)*2^(lq s)/2^(64:Ἀ):=by rw[lY,show(2:Ἀ)^(64:Ἀ)=2^(1:Ἀ)*2^(63-(lq s))*2^(lq s) by rw[<-AF,<-AF];congr 1;rw[pA,J4 (AZ j (by decide))],pow_one,Gp _ _ ((by positivity):0<2^(lq s))] have:=l.toNat_lt;simp only[gd,μ,η,ψ,ν,d,ο,β,γ (AO j (by decide):(lq s)<64),γ (AO (Y4 _ _) (by decide):63-(lq s)<64),kA,kH,pow_one,e];clear d e j;split<;>simp only[kA];exact fD_h1 _ _ _ ‹_› g ‹_›;exact fD_h2 _ _ _ ‹_› g ‹_› @[specialize]def jG(fa fb:Ἀ->Ἃ)(n t:Ἀ)(B:ἆ):ἆ:= if tἋ)(n:Ἀ)(B:ἆ)(t:Ἀ)(pH pL nH nL:ἆ):ἆ:= if texact (by decide)),ku_h1_h2 e d];push_cast;ring lemma ku(h e g d:ἆ)(l:(lq h)*2^(64:Ἀ)+(lq e)<2^(126:Ἀ)) (j:(lq g)*2^(64:Ἀ)+(lq d)<2^(126:Ἀ)): aw (h-g-(if ecases k9 v<;>simp only[Bool.true_beq,Bool.false_beq,Bool.not_true,Pd,υ,↓reduceIte,neg_mul,mul_neg,neg_neg,Ap] lemma fE_h2(u v:Ἃ)(h:kM u*kM v=0):tm u v=0:=by unfold tm sv;rcases Op.1 h with h|h<;>rw[h]<;>simp only[A9,neg_zero,ite_self,zero_mul,mul_zero] lemma fE_h4{c:Prop}[Decidable c]{a b k:ἆ}(j:(if c then a else b)kF)(n:Ἀ)(B:ἆ)(hn:n<2^(18:Ἀ)): ∀k t (r u o p:ἆ),n-t=k->t<=n->aG t d g-> (lq r)*2^(64:Ἀ)+(lq u)<=t*2^(108:Ἀ)->(lq o)*2^(64:Ἀ)+(lq p)<=t*2^(108:Ἀ)-> af t d g=((((lq r)*2^(64:Ἀ)+(lq u):Ἀ):Ἁ)-(((lq o)*2^(64:Ἀ)+(lq p):Ἀ):Ἁ))* 2^(lq B)-> dl d g n B t r u o p<4294967296->ms n d g=(N3 (dl d g n B t r u o p)):=by intro k;induction k<;>intro t r u o p hk ht S I G J j .obtain rfl:t=n:=C4 ht (V3.1 hk);rw[dl,AC (AX _)]at j⊢;exact aY _ _ _ _ _ _ S (by rw[J,ku _ _ _ _ (I.trans_lt ((ϐ hn (by decide)).trans_le (by decide))) (G.trans_lt ((ϐ hn (by decide)).trans_le (by decide)))]) j rename_i k e;obtain⟨X,y⟩:tif h:sF (by simp[h]);have i1:=idxOf_le _ K;have i2:=idxOf_le _ M;have Q:(lq (iW (d t)+iW (g t)))=kG (d t)+kG (g t):=by rw[η,am,am,γ ((M3 i1 i2).trans_lt (by decide))] rw[Q]at R;have E:(lq (iW (d t)+iW (g t)-B))=kG (d t)+kG (g t)-(lq B):=by rw[χ _ _ (θ.2 (Q▸not_lt.1 R)),Q] rw[E]at O;have l:kM (d t)*kM (g t)*2^(kG (d t)+kG (g t)-(lq B))<=2^(108:Ἀ):=(ϧ v.le (Θ (by norm_num) (not_lt.1 O))).trans_eq (by norm_num) generalize w:kM (d t)*kM (g t)*2^(kG (d t)+kG (g t)-(lq B))=T at l;have A:tm (d t) (g t)=(if k9 (d t)==k9 (g t)then(T:Ἁ)else-T)*2^(lq B):=w▸fE_h1 _ _ _ (not_lt.1 R) have V:=λH L (ah:(lq H)*2^(64:Ἀ)+(lq L)<=t*2^(108:Ἀ))=>fD H L _ _ (E▸not_lt.1 O) (by rw[U,E,w];exact (M3 ah l).trans_lt (((Ο t _).symm.trans_le (ι _ X)).trans_lt ((ϐ hn (by decide)).trans (by decide))));rw[U,E,w]at V;cases c:(k9 (d t)==k9 (g t))<;>simp only[c,ἁ,Am,υ]at A j⊢ .have q:=V o p G;refine e (t+1) r u _ _ y X x (I.trans m) (by rw[q];exact Ο t _▸M3 G l) ?_ j;rw[D,J,q,A,K5 _ T];ring have q:=V r u I;refine e (t+1) _ _ o p y X x (by rw[q];exact Ο t _▸M3 I l) (G.trans m) ?_ j;rw[D,J,q,A,K5 _ T];ring @[inline]def gf(n:Ἀ)(fa fb:Ἀ->Ἃ):Ἃ:= let r:=if n<262144 then dl fa fb n (jG fa fb n 0 1023) 0 0 0 0 0 else 4294967296 if r<4294967296 then (N3 r)else dotOf n fa fb lemma bO(n:Ἀ)(d e:Ἀ->kF):gf n d e=ms n d e:=by unfold gf;dsimp only;by_cases g:n<262144 .rw[AD g];split .exact(fE d e n _ (by exact D7 g) _ 0 0 0 0 0 rfl (by exact ϟ n) (λ_ h=>absurd h (by (clear * - h;omega))) ((by simp)) ((by simp)) (by simp[af]) ‹_›).symm .rfl .rw[AC g,AC (by decide)] @[noinline]def aD(n:Ἀ)(relu:Ἆ)(X W b:@&Ἂ Ἃ)(xo s j:Ἀ):Ἃ:= act relu (gf (n+1) (λt=>if tif trfl lemma gV(x y:Ἅ)(d:fv x)(e:fv y): kI (x+y).toModel=pb (kI x.toModel) (kI y.toModel):=by change kI (pW x.toModel y.toModel)=_;rw[pW,nu];have h:=Model.add_eq_ofModel_add_of_isFinite (fmt:=kC) (by decide) (kI x.toModel) (kI y.toModel) (by rw[ϒ];exact(fO x).1 d) (by rw[ϒ];exact(fO y).1 e);rw[ϒ,ϒ]at h;exact h.symm lemma pm(E:Ἁ)(e:E<=971):(2:ℝ)^E<=ls (mR kC):=by have h:=ϫ kC ἄ 1 E (by decide) (e.trans_eq (by decide));simp only[υ,Am,pJ,one_mul]at h;change|(2:ℝ)^E|<=_ at h;simpa only[AW (zpow_pos ((by norm_num):(0:ℝ)<2) E)]using h open FloatLib.Floats.Formats.Flocq in lemma re(x:ℝ)(E:Ἁ)(g:-1021<=E)(e:|x|<(2:ℝ)^E): |Pn kC x-x|<=(2:ℝ)^(E-53)/2:=by by_cases d:x=0 .subst x;rw[pD,sub_zero,A5];positivity have h:magnitude kO x<=E:=magnitude_le_of_abs_lt_bpow _ x E d e;apply(Model.abs_roundAt_sub_le kC x).trans;apply div_le_div_of_nonneg_right _ (by norm_num);change ulp kO (Model.fexpOf kC) x<=(2:ℝ)^(E-53);rw[ulp.of_ne_zero _ _ x d];change(2:ℝ)^(max (magnitude kO x-53) (-1074))<=(2:ℝ)^(E-53);apply AG (by norm_num);(clear * - g h;omega) lemma ii(x y:Ἅ)(d:fv x)(e:fv y)(j:|rv x+rv y|<=ls (mR kC)): fv (x+y)/\rv (x+y)=ns kC (rv x+rv y):=by have h:=gV x y d e;have g:=Model.isFinite_add_of_abs_toReal_add_le_posMaxFinite (kI x.toModel) (kI y.toModel) (by decide) d e j;exact⟨by rwa[fv,h],by rw[rv,h];exact mH _ _ (by decide) g⟩ lemma e8(x y:Ἅ)(l:fv x)(m:fv y)(E:Ἁ)(j:-1021<=E)(d:E<=971) (e:|rv x+rv y|<(2:ℝ)^E): fv (x+y)/\|rv (x+y)-(rv x+rv y)|<=(2:ℝ)^(E-53)/2:=by have⟨g,h⟩:=ii x y l m (e.le.trans (pm E d));exact⟨g,by rw[h];exact re _ E j e⟩ lemma rx(d:kU)(l:d.significand<2^(53:Ἀ))(g:-1074<=d.exponent) (e:|d.toReal|<=(2:ℝ)^(971:Ἁ)): ns kC d.toReal=d.toReal:=by have⟨h,j⟩:=lL kC (by decide) d d.significand 0 ((by simp only [pow_zero,mul_one])) l g (e.trans (pm 971 AP));rw[<-ό _ (by decide) d h,j] lemma jJ(x y:Ἅ)(o:fv x)(p:fv y)(d:kU)(g:d.toReal=rv x+rv y) (m:d.significand<2^(53:Ἀ))(l:-1074<=d.exponent)(e:|d.toReal|<=(2:ℝ)^(971:Ἁ)): fv (x+y)/\rv (x+y)=rv x+rv y:=by have⟨h,j⟩:=ii x y o p (by rw[<-g];exact e.trans (pm 971 AP));exact⟨h,by rw[j,<-g];exact rx d m l e⟩ lemma dB(i:Int64)(e:(K7 (B6 i))<2^(53:Ἀ)):fv i.toFloat/\rv i.toFloat=(B6 i):=by have g:kI i.toFloat.toModel=kE kC (kR (B6 i) 0):=by have h:=ma i;rw[m5]at h;rw[h,<-Model.ofModel_ofInt_eq_intToFloat kC (by decide)];exact Model.ofModel_ofInt_eq_roundDyadic kC (by decide) _ have d:(kR (B6 i) 0).toReal=(B6 i):=by rw[<-ϖ,nD];simp have⟨j,l⟩:=lL kC (by decide) (kR (B6 i) 0) (K7 (B6 i)) 0 (by simp[kR]) e (by simp[kR];decide) (by rw[d];exact AZ (((by rw[<-mI,Ϲ];exact_mod_cast e.le:|((B6 i):ℝ)|<=(2:ℝ)^(53:Ἀ)).trans_eq (AA _ _).symm).trans (AG (by norm_num) (by norm_num))) (pm 971 AP));exact⟨by rw[fv,g];exact j,by rw[rv,g,l,d]⟩ lemma jP(x y:Ἅ):kI (x*y).toModel= pv kC (lc k0 x.toModel.unpack y.toModel.unpack):=by change kI (pX x.toModel y.toModel)=_;rw[pX,nu] lemma iR(b:BitVec 64)(s:pK)(m:Ἀ)(e:Ἁ)(h:0< m) (d:kL k0 b=.finite s m e h): 2^(52:Ἀ)<=m\/e=-1074:=by revert d;rw[kL];dsimp only;split;split<;>intro d<;>cases d;split;split;intro d;cases d;rename_i l _;intro d;injection d with _ _ j;right;rw[<-j,l];decide;intro d;injection d with _ g _;left;rw[<-g,BitVec.toNat_append];exact AZ (by decide) Nat.left_le_or lemma jo_h1(X:Ἀ)(a:Ἁ)(h:52<=X):a<=(X:Ἁ)+1+a-53:=Zd (G8 (G8 (O4.2 h) 1) a) lemma jo_h2:∀s t:pK,(if mS (s*t) then (-1:ℝ) else 1)=(if mS s then -1 else 1)*(if mS t then -1 else 1):=fun | .negative, .negative =>((neg_one_mul (-1:ℝ)).trans (neg_neg 1)).symm | .negative, .positive =>(mul_one (-1:ℝ)).symm | .positive, .negative =>(one_mul (-1:ℝ)).symm | .positive, .positive =>(one_mul (1:ℝ)).symm lemma jo_h3(a b:ℝ)(O P:Ἀ)(g h:Ἁ):a*b*((O*P:Ἀ):ℝ)*(2:ℝ)^(g+h)=a*O*2^g*(b*P*2^h):=by rw[G4,AK AL,mul_mul_mul_comm a b,mul_mul_mul_comm] lemma jo(x y:Ἅ)(G:fv x)(H:fv y)(z:|rv x*rv y|<=(2:ℝ)^(971:Ἁ)): fv (x*y)/\rv (x*y)=ns kC (rv x*rv y):=by have t:=(fO x).1 G;have u:=(fO y).1 H;have E:x.toModel.unpack=kL k0 x.toModel.toBits.toBitVec:=ἅ;have F:y.toModel.unpack=kL k0 y.toModel.toBits.toBitVec:=ἅ;rw[iL x,iL y]at z⊢;unfold fv rv;rw[jP];generalize x.toModel.unpack=X at t E z⊢;generalize y.toModel.unpack=Y at u F z⊢;cases X<;>cases Y<;>simp only[pE,υ]at t u case finite.finite l o g v m p h w=> have A:=iR _ l o g v E.symm;have B:=iR _ m p h w F.symm;have r:g+h<=BV k0 (kY (o*p) (g+h)):=by change g+h<=max ((Aq (o*p):Ἁ)+1+(g+h)-53) (-1074);apply le_max_iff.2;rcases A with A|A;exact pZ (jo_h1 _ _ ((mu (Ϯ v w).ne').2 (AZ A (U3 o w))));rcases B with B|B;exact pZ (jo_h1 _ _ ((mu (Ϯ v w).ne').2 (AZ B (lZ p v))));exact BA ((congrArg₂ HAdd.hAdd A B).trans_le (by decide)) let q:kU:=⟨mS (l*m),o*p,g+h⟩;have D:Ka (mS (l*m))=l*m:=by cases l<;>cases m<;>rfl have d:q.toReal=lw (.finite l o g v)*lw (.finite m p h w):=((congrArg (·*(2:ℝ)^(g+h)) ((nf q).trans (congrArg (·*((o*p:Ἀ):ℝ)) (jo_h2 l m)))).trans (jo_h3 _ _ o p g h)).trans (congrArg₂ (·*·) (E6 l o g v) (E6 m p h w)).symm have j:=Ϙ kC (by decide) q (by rw[d];exact z.trans (pm 971 AP));rw[(by rw[lc,Model.roundWithAccuracy_exact_eq_round_of_le_targetExponent _ _ _ _ r];simp only[kE,show kC.isIEEE=ἃ from ἅ,ἁ,Gq,q,D];rfl:pv kC (lc k0 (.finite l o g v) (.finite m p h w))=kE kC q)];exact⟨j,by rw[ό _ (by decide) q j,d]⟩ all_goals simp only[lc,Model.isFinite_ofModel_zero kC (by decide),Model.toReal_ofModel_zero kC (by decide),Kb,nv,mul_zero,and_self,pD] lemma bJ(s:Ἆ)(m:Ἀ)(e:Ἁ): (⟨s,m,e⟩:kU).toReal=(if s then-(m:ℝ)else m)*(2:ℝ)^e:=by rw[mb,nf];split<;>simp def pw:Ἀ->Ἅ | 0=>(1:Int64).toFloat | k+1=>let p:=pw k;p+p def p149:Ἅ:=pw 149 lemma iJ(k:Ἀ)(g:k<=900):fv (pw k)/\rv (pw k)=(2:ℝ)^k:=by induction k with |zero=>have:=dB 1 (by decide);rw[F.pw];exact⟨this.1,by rw[this.2];simp only [Int64.reduceToInt,Ud,pow_zero]⟩ |succ k e=> have⟨f,v⟩:=e (by exact X5 g);have d:(⟨ἄ,1,((k+1:Ἀ):Ἁ)⟩:kU).toReal=(2:ℝ)^(k+1):=by rw[bJ];simp only[υ,Am,pJ,one_mul];exact AA 2 (k+1) have:=jJ (F.pw k) (F.pw k) f f _ (by rw[d,v,A4];ring) ((by decide):(1:Ἀ)<2^(53:Ἀ)) ((by exact Qi 1074 (k+1)):(-1074:Ἁ)<=((k+1:Ἀ):Ἁ)) (by rw[d,AW (by positivity),<-AA];exact AG (by norm_num) (by (clear * - g;omega)));rw[F.pw];exact⟨this.1,by rw[this.2,v,A4];ring⟩ def nm:Ἅ:=(-1:Int64).toFloat def P:ἀ:=⟨Aj (n:=512) λi=>if (C7 i)<256 then pw ((C7 i)-1)else nm*pw ((C7 i)-256-1)⟩ lemma gL:(kS P)=512:=by simp[P,kS] lemma iV(i:Ἄ)(h:(J0 i)<(kS P)): P.uget i h=if (J0 i)<256 then pw ((J0 i)-1)else nm*pw ((J0 i)-256-1):=by simp[P,nN] lemma eS(w:ἇ):(mJ (kB w))=(mJ (w<<<1))/2^(24:Ἀ):=by rw[aN,aM,ϴ];simp only[kN,kH,ο];have:=w.toNat_lt;(clear * -;omega) lemma dg(w:ἇ):(mJ (w>>>23))=(mJ w)/2^(23:Ἀ):=by rw[Υ];simp[β] @[inline]def dw(w:ἇ):Ἅ:= (Core.mW w).toInt64.toFloat*P.uget (O5 (w>>>23)) (by rw[gL,aC,dg];have:=w.toNat_lt;exact Ϟ this) lemma aV(z e:Ἁ):(nb z e).toReal=(z:ℝ)*(2:ℝ)^e:=by rw[<-ϖ,toRat_ofIntDyadic];push_cast;rfl lemma aE(x y:Ἅ)(o:fv x)(p:fv y)(z e:Ἁ)(g:rv x*rv y=(z:ℝ)*(2:ℝ)^e) (m:(K7 z)<2^(53:Ἀ))(l:-1074<=e)(d:|(z:ℝ)*(2:ℝ)^e|<=(2:ℝ)^(971:Ἁ)): fv (x*y)/\rv (x*y)=(z:ℝ)*(2:ℝ)^e:=by have⟨h,j⟩:=jo x y o p (by rw[g];exact d);have:=rx (nb z e) m l (by rw[aV];exact d);rw[aV]at this;exact⟨h,by rw[j,g,this]⟩ lemma bg(w:ἇ):(K7 (sv w))<2^(24:Ἀ):=by have:=lB w;rw[sv];split<;>simp<;>exact D7 this lemma bL(a b c:Ἀ)(e:a+b<=c)(h:c<=971)(z:Ἁ)(g:(K7 z)<2^a): |(z:ℝ)*(2:ℝ)^(b:Ἁ)|<=(2:ℝ)^(971:Ἁ):=by rw[Ae,AW ((by positivity):(0:ℝ)<2^(b:Ἁ)),AA];have d:|(z:ℝ)|<=2^a:=by rw[<-mI,Ϲ];exact_mod_cast g.le refine(AE d (by positivity)).trans ?_;rw[<-AF,<-AA];exact AG (by norm_num) (by (clear * - e h;omega)) lemma mV(u:ἆ)(n:Ἀ)(d:(lq u)=n)(e:n<2^(25:Ἀ)): fv u.toInt64.toFloat/\rv u.toInt64.toFloat=(n:Ἁ):=by have:(B6 u.toInt64)=n:=by rw[show (B6 u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [Qt,nr];omega) lemma qV_h3(x q:Ἀ)(H:x+256*q<256):q=0:=by omega lemma qV_h4(x q:Ἀ)(H:¬x+256*q<256)(hb:x<256)(t:q<2):q=1:=by omega lemma qV_h1(x c:Ἀ)(h:x<256):x-c<=900:=(Y4 _ _).trans (h.le.trans (by decide)) lemma qV_h2(x c:Ἀ)(h:x<256):1+(x-c)<=971:=(J1 ((Y4 _ _).trans h.le) 1).trans (by decide) lemma qV_h5(x w:Ἀ)(H:x+256*(w/2^(31:Ἀ))<256):¬2^(31:Ἀ)<=w:=by omega lemma qV_h6(x w:Ἀ)(H:¬x+256*(w/2^(31:Ἀ))<256)(hb:x<256):2^(31:Ἀ)<=w:=by omega lemma qV(c:Ἀ)(A:ἀ)(m:∀i h,A.uget i h=if (J0 i)<256 then pw ((J0 i)-c)else nm*pw ((J0 i)-256-c)) (w:ἇ)(h):fv (A.uget (O5 (w>>>23)) h)/\∃σ:Ἁ, (∀v,k9 v=k9 w->σ*kM v=sv v)/\(K7 σ)=1/\ rv (A.uget (O5 (w>>>23)) h)=σ*2^((mJ (kB w))-c):=by have hb:=bm w;have hw:=w.toNat_lt;have d:=ap w;obtain⟨j,l⟩:=iJ ((mJ (kB w))-c) (qV_h1 _ _ hb);rw[m,aC,dg,jW];split .rename_i H;rw[(qV_h3 _ _ H),A7,ϑ];exact⟨j,1,λv g=>by rw[sv,g,AC (by rw[d];exact qV_h5 _ _ H)];ring,ἅ,by rw[l];push_cast;ring⟩ .rename_i H;rw[(qV_h4 _ _ H hb (Ϟ hw)),ϻ,BK];have e:=dB (-1) (by decide);rw[((by decide):(B6 (-1:Int64))=-1)]at e;have:fv (nm*F.pw ((mJ (kB w))-c))/\rv (nm*F.pw ((mJ (kB w))-c))=((-1:Ἁ):ℝ)*2^(((mJ (kB w))-c:Ἀ):Ἁ):=aE _ _ e.1 j _ _ (by rw[e.2,l,AA]) (by decide) (by exact Qi 1074 ((expOf w).toNat-c)) (bL 1 _ 971 (qV_h2 _ _ hb) AP _ (by decide));exact⟨this.1,-1,λv g=>by rw[sv,g,AD (d.mpr (qV_h6 _ _ H hb))];ring,ἅ,by rw[this.2,AA]⟩ lemma dG_h1(q K X c:Ἀ)(r:q<=2)(hK:K<2^(24:Ἀ))(hX:X<256):q*K<2^(25:Ἀ)∧-1074<=((X-c:Ἀ):Ἁ)∧25+(X-c)<=971:=⟨(ι K r).trans_lt ((M7 hK (by decide)).trans_le (by decide)),(by decide:(-1074:Ἁ)<=0).trans (C3 _),(J1 ((Y4 _ _).trans hX.le) 25).trans (by decide)⟩ lemma dG(c q:Ἀ)(A:ἀ)(o:∀i h,A.uget i h=if (J0 i)<256 then pw ((J0 i)-c)else nm*pw ((J0 i)-256-c)) (u:ἆ)(v w:ἇ)(h)(r:q<=2)(x:(lq u)=q*kM v) (t:k9 v=k9 w)(p:(q:ℝ)*2^((mJ (kB w))-c)=2^kG v): fv (u.toInt64.toFloat*A.uget (O5 (w>>>23)) h)/\ rv (u.toInt64.toFloat*A.uget (O5 (w>>>23)) h)=(sv v:ℝ)*2^kG v:=by obtain⟨k,k2,k3⟩:=dG_h1 q (kM v) _ c r (lB v) (bm w);have⟨g,j⟩:=mV u _ x k;have⟨l,σ,d,m,y⟩:=qV c A o w h;have e:(K7 (((q*kM v:Ἀ):Ἁ)*σ))<2^(25:Ἀ):=by rw[Ϩ,m,ϻ];exact k have:=aE _ _ g l _ ((mJ (kB w))-c:Ἀ) (by rw[j,y,AA];push_cast;ring) (Ao e (by norm_num)) k2 (bL 25 _ 971 k3 AP _ e);exact⟨this.1,by rw[this.2,<-p,AA,<-d v t];push_cast;ring⟩ lemma cI(w:ἇ)(_:kB w≠255):fv (dw w)/\rv (dw w)=(sv w:ℝ)*2^kG w:= dG 1 1 P iV _ w w _ (by exact NeZero.one_le) (by simp[an]) rfl (by simp[aT]) lemma xbF(a b:Ἅ)(h:rv a=rv b)(z:rv a≠0):a=b:=congrArg Po (Ws (Vg h z)) lemma xbM{a b:Ἅ}(h:a.toModel=b.toModel):a=b:=congrArg Po h def xbKv(i:Nat):Int:=(if i%256=0 then 0 else 8388608)-i*8388608+i/256*4294967296 def xbKf(i:Nat):Ἅ:=(Ob (xbKv i)).toFloat def xbK:ἀ:=⟨kK (n:=512) fun i=>xbKf i.val⟩ lemma xbL:xbK.size=512:=by simp[xbK,kS] lemma xbU(i:Ἄ)(h):xbK.uget i h=xbKf i.toNat:=by simp[xbK,nN] @[inline]def xbW(w:ἇ):Ἅ:=(w.toInt32.toInt64.toFloat+xbK.uget (O5 (w>>>23)) (by rw[xbL,aC,dg];exact Ϟ w.toNat_lt))*P.uget (O5 (w>>>23)) (by rw[gL,aC,dg];exact Ϟ w.toNat_lt) lemma xbA(w:ἇ):w.toInt32.toInt64.toFloat+xbKf (w>>>23).toNat=(Core.mW w).toInt64.toFloat:=by have hn:=w.toNat_lt;have hi:=dg w;have he:kB w=0↔w.toNat%2^31<2^23:=by rw[eZ,aM] have hf:(lK w).toNat=w.toNat%2^23:=fe w have hm:(kM w:Int)=w.toNat%2^23+(if w.toNat%2^31<2^23 then 0 else 8388608):=by unfold kM;simp only[hf,he];split<;>omega have hc:=mV (Core.mW w) _ (an w) ((lB w).trans (by decide)) by_cases z:kM w=0 ·have:w.toNat=0∨w.toNat=2147483648:=by rw[z]at hm;split at hm<;>omega rcases this with h|h<;>[rw[show w=0 from Β.1 h];rw[show w=2147483648 from Β.1 h]]<;>exact xbM (by decide) generalize(w>>>23).toNat=i at hi⊢ have ha:fv w.toInt32.toInt64.toFloat∧rv w.toInt32.toInt64.toFloat=if 2*w.toNat<2^32 then (w.toNat:Int) else w.toNat-2^32:=by have e:B6 w.toInt32.toInt64=if 2*w.toNat<2^32 then (w.toNat:Int) else w.toNat-2^32:=by rw[Int32.toInt_toInt64];exact lv _ rw[←e];exact dB _ (by rw[e];split<;>omega) have kv:B6 (Ob (xbKv i))=xbKv i:=by unfold xbKv;apply Int64.toInt_ofInt_of_le<;>split<;>omega have hb:fv (xbKf i)∧rv (xbKf i)=xbKv i:=by have:=dB (Ob (xbKv i)) (by rw[kv];unfold xbKv;split<;>omega);rw[kv]at this;exact this have hr:((kM w:Int):ℝ)=rv w.toInt32.toInt64.toFloat+rv (xbKf i):=by rw[ha.2,hb.2,←(by unfold xbKv;rw[hm];split<;>split<;>split<;>omega:(if 2*w.toNat<2^32 then (w.toNat:Int) else w.toNat-2^32)+xbKv i=kM w)];push_cast;ring have hd:=jJ _ _ ha.1 hb.1 (kR (kM w) 0) (by rw[←hr,←ϖ,nD];simp) (by simp[kR];exact (lB w).trans (by decide)) (by simp[kR]) (by rw[←ϖ,nD];simp;exact_mod_cast (lB w).le.trans (Θ (by decide) (by decide):2^24<=2^971)) apply xbF _ _ (by rw[hd.2,←hr,hc.2]);rw[hd.2,←hr];exact_mod_cast z lemma xbE(w:ἇ):xbW w=dw w:=by rw[xbW,dw,xbU,aC,xbA] lemma dJ_h1(a b:Ἀ)(h:a<256)(k:b<256):48+(a-1+(b-1))<=971:=AZ (J1 (M3 ((Y4 _ _).trans h.le) ((Y4 _ _).trans k.le)) _) (by decide) lemma dJ(x w:ἇ)(j:kB x≠255)(h:kB w≠255): fv (dw x*dw w)/\rv (dw x*dw w)=(tm x w:ℝ):=by have⟨e,l⟩:=cI x j;have⟨g,m⟩:=cI w h;have d:(K7 (sv x*sv w))<2^(48:Ἀ):=by rw[Ϩ];exact(ϕ (bg x) (bg w)).trans_eq (by norm_num) have:=aE _ _ e g (sv x*sv w) (kG x+kG w:Ἀ) (by rw[l,m,AA,AF];push_cast;ring) (Ao d (by norm_num)) (by linarith only []) (bL 48 _ 971 (by rw[aT,aT];exact dJ_h1 _ _ (bm x) (bm w)) AP _ d);refine⟨this.1,?_⟩;rw[this.2,tm,AA];push_cast;ring @[inline]def eF(b:ἆ):ἆ:=(b>>>52)&&&2047 @[inline]def mF(b:ἆ):ἆ:=(b&&&0xfffffffffffff)|||0x10000000000000 lemma jT(u:ἆ):(u&&&0x8000000000000000!=0)=(u>>>63!=0):=by apply ϓ.2;simp only[AM,Ak,<-ξ];rw[Ε,ν];change¬(lq u)&&&2^(63:Ἀ)=0↔¬(lq u)>>>63=0;rw[Jy,β,lW];have d:(lq u)/2^(63:Ἀ)<2:=Ϟ u.toNat_lt rw[γ d];generalize (lq u)/2^(63:Ἀ)=b at d⊢;interval_cases b<;>simp lemma ij(v:Ἅ):kI v.toModel=Wt kC (v.toBits>>>63!=0) ((lq ((v.toBits>>>52)&&&2047))) ((lq (v.toBits&&&0xfffffffffffff))):=by have d:Pe (kI v.toModel)=(lq ((v.toBits>>>52)&&&2047)):=ἅ;have e:Os (kI v.toModel)=(lq (v.toBits&&&0xfffffffffffff)):=ἅ;have g:Vf (kI v.toModel)=(v.toBits>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Vf,AM,Ak];rw[<-Hq];exact Iff.rfl rw[<-Jm (kI v.toModel),d,e,g] lemma fq(v:Ἅ):(lq ((v.toBits>>>52)&&&2047))<2^(11:Ἀ)/\(lq (v.toBits&&&0xfffffffffffff))<2^(52:Ἀ):=by rw[Ε];exact⟨AO ϝ (by decide),AO ϝ (by decide)⟩ lemma dV(v:Ἅ)(e:fv v)(g:¬eF v.toBits=0): rv v=(⟨v.toBits>>>63!=0,(lq (v.toBits&&&0xfffffffffffff))+2^(52:Ἀ), ((lq (eF v.toBits)):Ἁ)-1075⟩:kU).toReal:=by unfold F.eF at g⊢;have⟨j,l⟩:=fq v;have d:(lq ((v.toBits>>>52)&&&2047))≠0:=λh=>g (ξ.mp (by simpa using h));unfold fv at e;unfold rv;rw[ij]at e⊢;rw[BR,Kh _ _ _ _ j l e,AC d];simp only[show kC.fracWidth=52 from ἅ,show kC.exponentBias=1023 from ἅ,Gr];congr 2<;>(try simp only[nY,nZ])<;>ring lemma aR(z:Model lU):lI (kW z)=z:=by have h:z.toNatBits<2^(32:Ἀ):=mQ z;rw[lI,kW,kT,lE,γ h];exact m3 z lemma ef(w:kF)(d:kB w≠255):ls (lI w)=(sv w:ℝ)*(2:ℝ)^((kG w:Ἁ)-149):=by rw[lI,BR,kV w d];change (nh w).toReal=_;rw[<-ϖ,lG];push_cast;rfl lemma iD(w:kF)(j:kB w≠255)(m:w&&&0x7FFFFFFF≠0):ls (lI w)≠0:=by rw[ef w j];refine mul_ne_zero ?_ (zpow_ne_zero _ (by norm_num));have l:kM w≠0:=by rw[kM];split;rename_i d;have e:=(eZ w).1 d;rw[aM]at e;have g:(mJ (bj w))≠0:=λh=>m (Β.1 (h.trans nj.symm));rw[aM]at g;rw[lK,fe];(clear * - e g;omega);exact Ww (NeZero.ne' (2^23+(fracOf w).toNat)) rw[sv];split<;>simp[l] lemma iN(d e g:kU)(p:d.toReal<=e.toReal)(q:e.toReal<=g.toReal) (E:kW (kE lU d)=kW (kE lU g)) (w:kB (kW (kE lU d))≠255)(F:kW (kE lU d)&&&0x7FFFFFFF≠0) (D:|e.toReal|<=(2:ℝ)^(127:Ἁ)): kW (kE lU e)=kW (kE lU d):=by have j:=aR (kE lU d);have m:=aR (kE lU g);rw[<-E]at m;have o:mN (kE lU d)=ἃ:=by rw[<-j,lI,m6];simpa using w have v:=Ϙ lU (by decide) e (D.trans (by have h:=ϫ lU ἄ (2^(23:Ἀ)) (127-23) (by decide) (by decide);simp only[υ,ἂ,one_mul]at h;change|((2^(23:Ἀ):Ἀ):ℝ)*(2:ℝ)^((127:Ἁ)-23)|<=_ at h;rwa[((by norm_num):((2^(23:Ἀ):Ἀ):ℝ)*(2:ℝ)^((127:Ἁ)-23)=(2:ℝ)^(127:Ἁ)),AW (by positivity)]at h));have G:=ό lU (by decide) d o;have A:=ό lU (by decide) e v;have H:=ό lU (by decide) g (by rw[<-m,j];exact o);have y:=lM lU p;have z:=lM lU q;have l:=m.symm.trans j;rw[<-G,<-A]at y;rw[<-A,<-H,l]at z;have x:=le_antisymm z y;rw[Vg x (by rw[x,<-j];exact iD _ w F)] lemma jx_h1(r q:Ἀ)(t:r+q*2^(29:Ἀ)<2^(53:Ἀ))(o:q%2<2):(r+q*2^(29:Ἀ))*2^(10:Ἀ)+274877906943<2^(64:Ἀ)∧(r+q*2^(29:Ἀ))*2^(10:Ἀ)+274877906943+q%2<2^(64:Ἀ):=⟨(B3 (ϐ t (by decide)) _).trans_le (by decide),(R6 (B3 (ϐ t (by decide)) _) (U2 o)).trans_le (by decide)⟩ lemma jx(x:Ἀ)(t:x<2^(53:Ἀ))(m:x%2^(29:Ἀ)≠2^(28:Ἀ)): (lq (ar (lh (x*2^(10:Ἀ)))))=(x+2^(28:Ἀ))/2^(29:Ἀ):=by have d:(lq (lh (x*2^(10:Ἀ))))=x*2^(10:Ἀ):=Α ((ϐ t (by decide)).trans_le (by decide));generalize lh (x*2^(10:Ἀ))=N at d;unfold ar;simp only[ν,η,Ε,d,kA,kH,β,mP];rw[(by rw[(by norm_num:(2:Ἀ)^(39:Ἀ)=2^(29:Ἀ)*2^(10:Ἀ)),Gp _ _ (by positivity)]:x*2^(10:Ἀ)/2^(39:Ἀ)=x/2^(29:Ἀ))];obtain⟨q,r,p,rfl⟩:∃q r,r<2^(29:Ἀ)/\x=r+q*2^(29:Ἀ):=⟨x/2^(29:Ἀ),x%2^(29:Ἀ),ϊ _ (by norm_num),(Zj x _).symm⟩;rw[Ρ _ _ (by norm_num),ώ p,Κ];rw[Μ,γ p]at m;have o:=ϊ q ((by decide):0<2);rw[γ (jx_h1 r q t o).1,γ (jx_h1 r q t o).2,show(r+q*2^(29:Ἀ))*2^(10:Ἀ)+274877906943+q%2=(r*2^(10:Ἀ)+274877906943+q%2)+2^(39:Ἀ)*q by ring,show r+q*2^(29:Ἀ)+2^(28:Ἀ)=(r+2^(28:Ἀ))+2^(29:Ἀ)*q by ring,mv _ _ (by norm_num),mv _ _ (by norm_num),(by grind:(r*2^(10:Ἀ)+274877906943+q%2)/2^(39:Ἀ)=(r+2^(28:Ἀ))/2^(29:Ἀ))] @[inline,irreducible]def ak(S:Ἅ)(h:ἆ):ἆ:= let b:=S.toBits let f:=b&&&0xfffffffffffff let E:=eF b let d:=h+1075-E let g:=(1:ἆ)<<>>29 if d<=26&&E-1195<253&&u-(g+1)<536870911-(g+g)&&r&&&8388607!=0 then ((b>>>63)<<<31)+r-0x255000000 else 4294967296 lemma rb_h1(x:Ἀ):x%2^(63:Ἀ)+268435456<2^(64:Ἀ)∧x%2^(63:Ἀ)+268435456=(x%2^(52:Ἀ)+2^(28:Ἀ))+x/2^(52:Ἀ)%2^(11:Ἀ)*2^(23:Ἀ)*2^(29:Ἀ):=⟨(B3 (ϊ _ (by decide)) _).trans_le (by decide),by rw[show (2:Ἀ)^(63:Ἀ)=2^(52:Ἀ)*2^(11:Ἀ) by norm_num,Xf];ring⟩ lemma rb(b:ἆ)(h:(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29&&&8388607!=0)=true): 2^(28:Ἀ)<=(lq (b&&&0xfffffffffffff))/\(lq (b&&&0xfffffffffffff))+2^(28:Ἀ)<2^(52:Ἀ):=by simp only[AM,Ak,<-ξ,Ε,ν,η,kA,kH,β]at h⊢;have:=b.toNat_lt;rw[ζ _ 63,ζ _ 23,γ (rb_h1 (lq b)).1,(rb_h1 (lq b)).2,Ρ _ _ (by norm_num),Μ]at h;rw[ζ _ 52];have:=ϊ (lq b) ((by norm_num):0<2^(52:Ἀ));clear*-h this;omega lemma j3_h1(f G:Ἀ)(l:G<=2^(26:Ἀ))(t:2^(28:Ἀ)<=f∧f+2^(28:Ἀ)<2^(52:Ἀ))(x:G+1<=(f+2^(28:Ἀ))%2^(29:Ἀ)∧(f+2^(28:Ἀ))%2^(29:Ἀ)+G<2^(29:Ἀ)):G+1<=(f+2^(28:Ἀ))%2^(29:Ἀ)∧(f+2^(28:Ἀ))%2^(29:Ἀ)+G<2^(29:Ἀ)∧G<=f∧f+G<2^(52:Ἀ):=⟨x.1,x.2,l.trans ((by norm_num:(2:Ἀ)^(26:Ἀ)<=2^(28:Ἀ)).trans t.1),(J1 (l.trans (by norm_num:(2:Ἀ)^(26:Ἀ)<=2^(28:Ἀ))) _).trans_lt t.2⟩ lemma j3_h2(H E:Ἀ)(o:(2^(64:Ἀ)-E+(H+1075)%2^(64:Ἀ))%2^(64:Ἀ)<=26)(p:(2^(64:Ἀ)-1195+E)%2^(64:Ἀ)<253)(w:H<2^(63:Ἀ))(u:E<2048):(2^(64:Ἀ)-E+(H+1075)%2^(64:Ἀ))%2^(64:Ἀ)=H+1075-E∧H+1075-E<=26∧E<=H+1075∧1195<=E∧E<=1447:=by omega lemma j3_h3(A b:ἆ)(G R:Ἀ)(ha:(lq A)=R)(hb:(lq b)=G)(l:G<=67108864)(q:A-(b+1)<536870911-(b+b)):G+1<=R∧R+G<536870912:=by have e:=congrArg lq (sub_add_cancel A (b+1)) have q':=μ.1 q rw[χ (536870911:ἆ) (b+b) (θ.2 (by rw[η,hb,γ (C0 (M3 l l) (by decide))];exact J2 (M3 l l) (by decide))),η,hb,γ (C0 (M3 l l) (by decide))] at q' rw[η,η,hb,pS,γ (C0 (L1 l 1) (by decide)),ha,γ (U1 (R6 (q'.trans_le (Y4 _ _)) (L1 l 1)) (by decide))] at e rw[<-e];exact⟨N2 _ _,by rw[pA,lO G 1 G,<-pA];exact Zk (Hc q')⟩ lemma j3_h4(f:ἆ)(v:(lq f)<4503599627370496):(lq ((f+268435456)&&&536870911))=((lq f)+268435456)%536870912:=by rw[Ε,η,γ (U1 (B3 v _) (by decide))];exact ζ _ 29 lemma j3(h E f:ἆ)(w:(lq h)<2^(63:Ἀ))(u:(lq E)<2048)(v:(lq f)<2^(52:Ἀ)) (o:h+1075-E<=26)(p:E-1195<253) (q:((f+268435456)&&&536870911)-(((1:ἆ)<<<(h+1075-E))+1)< 536870911-(((1:ἆ)<<<(h+1075-E))+((1:ἆ)<<<(h+1075-E)))) (t:2^(28:Ἀ)<=(lq f)/\(lq f)+2^(28:Ἀ)<2^(52:Ἀ)): (lq E)<=(lq h)+1075/\(lq h)+1075-(lq E)<=26/\1195<=(lq E)/\(lq E)<=1447/\ 2^((lq h)+1075-(lq E))+1<=((lq f)+2^(28:Ἀ))%2^(29:Ἀ)/\ ((lq f)+2^(28:Ἀ))%2^(29:Ἀ)+2^((lq h)+1075-(lq E))<2^(29:Ἀ)/\ 2^((lq h)+1075-(lq E))<=(lq f)/\(lq f)+2^((lq h)+1075-(lq E))<2^(52:Ἀ):=by have m:=Ζ (h+1075) E;rw[η] at m;rw[θ,m]at o;rw[μ,Ζ]at p;obtain⟨n,d,a,b,c⟩:=j3_h2 _ _ o p w u;have g:=m.trans n refine⟨a,d,b,c,j3_h1 _ _ (Θ (by decide) d) t (j3_h3 _ _ _ _ (j3_h4 f v) (by rw[ψ,g,γ (AO d (by decide)),pS,na,γ (lu (by decide) (AO d (by decide)))]) (Θ (by decide) d) q)⟩ lemma j4(f G:Ἀ)(g:1<=G)(h:f<2^(52:Ἀ))(j:G+1<=(f+2^(28:Ἀ))%2^(29:Ἀ)) (l:(f+2^(28:Ἀ))%2^(29:Ἀ)+G<2^(29:Ἀ))(d:G<=f)(e:f+G<2^(52:Ἀ)): (f+2^(52:Ἀ)-G)%2^(29:Ἀ)≠2^(28:Ἀ)/\(f+2^(52:Ἀ)+G)%2^(29:Ἀ)≠2^(28:Ἀ)/\ (f+2^(52:Ἀ)-G+2^(28:Ἀ))/2^(29:Ἀ)=2^(23:Ἀ)+(f+2^(28:Ἀ))/2^(29:Ἀ)/\ (f+2^(52:Ἀ)+G+2^(28:Ἀ))/2^(29:Ἀ)=2^(23:Ἀ)+(f+2^(28:Ἀ))/2^(29:Ἀ):=by (clear * - g j l d;omega) lemma g0_h1(s E f:Ἀ)(m:1195<=E)(o:E<2^(11:Ἀ))(p:f<2^(52:Ἀ))(q:s<2):(2^(64:Ἀ)-0x255000000+(s*2^(31:Ἀ)+(E*2^(52:Ἀ)+f+268435456)/2^(29:Ἀ)))%2^(64:Ἀ)=s*2^(31:Ἀ)+((E-1085-110)*2^(23:Ἀ)+(2^(23:Ἀ)+(f+2^(28:Ἀ))/2^(29:Ἀ))):=by rw[show E*2^(52:Ἀ)+f+268435456=(f+2^(28:Ἀ))+2^(29:Ἀ)*(E*2^(23:Ἀ)) by ring,mv _ _ (by decide)] have r:(f+2^(28:Ἀ))/2^(29:Ἀ)<2^(23:Ἀ)+1:=Ϟ ((B3 p _).trans_le (by decide)) generalize (f+2^(28:Ἀ))/2^(29:Ἀ)=k at * obtain⟨e,rfl⟩:=Kr m rw[show 1195+e-1085-110=e by clear*-;omega,show 2^(64:Ἀ)-0x255000000+(s*2^(31:Ἀ)+(k+(1195+e)*2^(23:Ἀ)))=2^(64:Ἀ)+(s*2^(31:Ἀ)+(e*2^(23:Ἀ)+(2^(23:Ἀ)+k))) by ring,Zl,γ ((M3 (ι (2^(31:Ἀ)) (U2 q)) (M3 (ι (2^(23:Ἀ)) ((N2 e 1195).trans_lt o).le) (J1 (U2 r) _))).trans_lt (by decide))] lemma g0_h2(s E f:Ἀ)(o:E<2^(11:Ἀ))(p:f<2^(52:Ἀ))(q:s<2):s*2^(31:Ἀ)<2^(64:Ἀ)∧E*2^(52:Ἀ)+f+268435456<2^(64:Ἀ):=⟨(ϐ q (by decide)).trans_le (by decide),(B3 (((O1 p (E*2^(52:Ἀ))).trans_eq (Ο E _).symm).trans_le (ι _ o)) 268435456).trans_le (by decide)⟩ lemma g0(b:ἆ)(m:1195<=(lq (eF b))): (UInt64.toNat (((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000))= (lq b)/2^(63:Ἀ)*2^(31:Ἀ)+(((lq (eF b))-1085-110)*2^(23:Ἀ)+ (2^(23:Ἀ)+((lq (b&&&0xfffffffffffff))+2^(28:Ἀ))/2^(29:Ἀ))):=by have h:=b.toNat_lt;have d:(lq b)%2^(63:Ἀ)=(lq b)/2^(52:Ἀ)%2^(11:Ἀ)*2^(52:Ἀ)+(lq b)%2^(52:Ἀ):=(by rw[(by norm_num:(2:Ἀ)^(63:Ἀ)=2^(52:Ἀ)*2^(11:Ἀ)),Xf];ring);have q:(lq b)/2^(63:Ἀ)<2:=Ϟ h;have e:(lq (F.eF b))=(lq b)/2^(52:Ἀ)%2^(11:Ἀ):=by unfold F.eF;simp only[Ε,ν,kA,kH,β];exact ζ _ 11 have g:(lq (b&&&0xfffffffffffff))=(lq b)%2^(52:Ἀ):=by rw[Ε];exact ζ _ 52 have j:(lq (b&&&0x7FFFFFFFFFFFFFFF))=(lq b)%2^(63:Ἀ):=by rw[Ε];exact ζ _ 63 have l:(lq (b>>>63))=(lq b)/2^(63:Ἀ):=by simp only[ν,kA,kH,β] rw[e]at m⊢;rw[g,Ζ,η,ψ,l,ν,η,j,d];simp only[kA,kH,β,ο,Oq];have o:=ϊ ((lq b)/2^(52:Ἀ)) (϶ 11);have p:=ϊ (lq b) (϶ 52);generalize (lq b)/2^(52:Ἀ)%2^(11:Ἀ)=E at*;generalize (lq b)%2^(52:Ἀ)=f at*;generalize (lq b)/2^(63:Ἀ)=s at*;clear*-m o p q;rw[γ (g0_h2 s E f o p q).1,γ (g0_h2 s E f o p q).2];exact g0_h1 s E f m o p q lemma ce_h1(g G:Ἀ)(v:g<2^(52:Ἀ))(I:G<=g)(J:g+G<2^(52:Ἀ)):2^(62:Ἀ)<=(g+2^(52:Ἀ)-G)*2^(10:Ἀ)/\(g+2^(52:Ἀ)-G)*2^(10:Ἀ)<2^(63:Ἀ)/\2^(62:Ἀ)<=(g+2^(52:Ἀ)+G)*2^(10:Ἀ)/\(g+2^(52:Ἀ)+G)*2^(10:Ἀ)<2^(63:Ἀ)/\G<=g+2^(52:Ἀ)/\Gsimp only[υ,Am,ἁ] · rw[Κ,γ (b.trans (by decide)),γ (a.trans (by decide))];exact⟨b.ne,c.ne'⟩ · refine⟨?_,by rw[Zl,γ (a.trans (by decide))];exact c.ne'⟩ rw[show (2^(31:Ἀ):Ἀ)=2^(23:Ἀ)*2^(8:Ἀ) from rfl,Τ,mv _ _ (by decide),Xw,γ (b.trans (by decide))];exact b.ne lemma ce(S:Ἅ)(hS:fv S)(h:ἆ)(hh:(lq h)<2^63)(T:Ἁ) (L:|rv S-(T:ℝ)|<=(2:ℝ)^((lq h):Ἁ))(aL:|(T:ℝ)|<=(2:ℝ)^(425:Ἁ)) (hc:ak S h<4294967296):T≠0/\(N3 (ak S h))=md T (-298) false:=by unfold ak at hc⊢ dsimp only at hc⊢ split at hc swap exact absurd hc (by decide) rename_i o rw[AD o] simp only[Η,AJ]at o obtain⟨⟨⟨c1,c2⟩,c3⟩,c4⟩:=o have y:(lq (F.eF S.toBits))<2048:=(fq S).1 have v:=(fq S).2 obtain⟨d1,d2,e1,e2,X,Y,I,J⟩:=j3 h _ _ hh y v c1 c2 c3 (rb _ c4) have D:=g0 _ e1 have x:=dV _ hS (λh0=>by simp[h0]at e1) have O:(if(S.toBits>>>63!=0)=true then 2^(31:Ἀ) else 0)=(lq S.toBits)/2^(63:Ἀ)*2^(31:Ἀ):=by clear*- simp only[AM,Ak,<-ξ,ν,kA,kH,β,ϋ] have:(lq S.toBits)/2^(63:Ἀ)<2:=Ϟ S.toBits.toNat_lt generalize (lq S.toBits)/2^(63:Ἀ)=b at this⊢ rcases b with _|_|b rfl rfl exact(C5 _ (Gh (Gh this))).elim rw[<-O]at D have d:(lq (F.eF S.toBits-1085))=(lq (F.eF S.toBits))-1085:=χ _ _ (θ.mpr (AZ (by decide) e1)) have j:(lq (F.eF S.toBits-1085))<=506:=(by rw[d];exact(G5 e2 1085).trans (by decide)) generalize (S.toBits>>>63!=0)=E,F.eF S.toBits-1085=e5 at D x d j generalize a2:(lq (F.eF S.toBits))=l at d j D x d1 d2 e1 e2 X Y I J y generalize hg:2^((lq h)+1075-l)=G at X Y I J generalize a3:(lq (S.toBits&&&0xfffffffffffff))=g at D x X Y I J v have as:1<=G:=hg▸BI obtain⟨b5,b6,al⟩:110<=l-1085/\l-1085<363/\l-1085-110<=252:=⟨M5 e1,(G5 e2 1085).trans_lt (by decide),(G5 (G5 e2 1085) 110).trans (by decide)⟩ obtain⟨b1,b2,b3,b4,K,z,b7,b9⟩:=ce_h1 _ _ v I J have hq:(g+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=(ϭ (L1 (Nat.le_sub_one_of_lt v) _)).trans (by decide) have U:=Α (b2.trans (by decide)) have n3:=Α (b4.trans (by decide)) obtain⟨F,-,-⟩:=bM E _ e5 (b1.trans_eq U.symm) (U.trans_lt b2) (b5.trans_eq d.symm) (d.trans_lt b6) obtain⟨w3,-,-⟩:=bM E _ e5 (b3.trans_eq n3.symm) (n3.trans_lt b4) (b5.trans_eq d.symm) (d.trans_lt b6) obtain⟨w,t3,k1,k3⟩:=j4 g G as v X Y I J rw[jx _ b7 w,k1,d]at F rw[jx _ b9 t3,k3,d]at w3 generalize(g+2^(28:Ἀ))/2^(29:Ἀ)=q,l-1085-110=k at F w3 D hq al generalize hR:az E (lh ((g+2^(52:Ἀ)-G)*2^(10:Ἀ))) e5=R at F have r:az E (lh ((g+2^(52:Ἀ)+G)*2^(10:Ἀ))) e5=R:=by apply Β.mp;rw[F,w3] have qv:(N3 (((S.toBits>>>63)<<<31)+(((S.toBits&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000))=R:=by apply Β.mp;rw[F,Ϫ,D,γ];exact Jr (by split<;>decide) ((M3 (ι (2^(23:Ἀ)) al) (J1 hq (2^(23:Ἀ)))).trans_lt (by decide)) have V:kB R≠255:=by unfold kB;intro Q;have p:=congrArg mJ Q;simp only[Ξ,Υ,F,kN,kH,β]at p;rw[ζ _ 8]at p;exact (ce_h2 E k q al hq).1 p have W:R&&&0x7FFFFFFF≠0:=by intro Q;have p:=congrArg mJ Q;simp only[Ξ,F,kN]at p;rw[ζ _ 31]at p;exact (ce_h2 E k q al hq).2 p rw[qv] subst hR rw[aJ _ _ _ j,U,d]at V W⊢ rw[aJ _ _ _ j,aJ _ _ _ j,U,n3,d]at r generalize g+2^(52:Ἀ)=Mn at x K z V W r⊢ generalize rv S=sr at x L rw[bJ]at x have hU:(2:ℝ)^((lq h):Ἁ)=(G:ℝ)*(2:ℝ)^((l:Ἁ)-1075):=by rw[<-hg,B4,nZ,<-AA] rw[<-AK AL,show (((lq h):Ἀ):Ἁ)=(((lq h)+1075-l:Ἀ):Ἁ)+((l:Ἁ)-1075) by rw[pO d1,K5,nZ];exact((sub_add_sub_cancel _ _ _).trans (add_sub_cancel_right _ _)).symm] have t(m:Ἀ):((m*2^(10:Ἀ):Ἀ):ℝ)*(2:ℝ)^(((l-1085:Ἀ):Ἁ)-298)=(m:ℝ)*(2:ℝ)^((l:Ἁ)-1075)*2^(-298:Ἁ):=by have e:(2:ℝ)^(((l-1085:Ἀ):Ἁ)-298)*(2:ℝ)^(10:Ἁ)=(2:ℝ)^((l:Ἁ)-1075)*(2:ℝ)^(-298:Ἁ):=by rw[<-AK AL,<-AK AL,(by rw[pO (AZ (by decide) e1),nZ];ring:(((l-1085:Ἀ):Ἁ)-298)+10=((l:Ἁ)-1075)+(-298))] have ah:((m*2^(10:Ἀ):Ἀ):ℝ)=(m:ℝ)*(2:ℝ)^(10:Ἁ):=by rw[G4,B4,nZ,<-AA];rfl rw[ah,Ap (m:ℝ) ((2:ℝ)^(10:Ἁ)),mul_comm ((2:ℝ)^(10:Ἁ)),e,<-Ap] have q:(0:ℝ)<(2:ℝ)^(-298:Ἁ):=(by positivity) have N:|(nb T (-298)).toReal|<=(2:ℝ)^(127:Ἁ):=by rw[aV,Ae,AW q] exact(AE aL q.le).trans_eq (by rw[<-AK AL];rfl) have hu:(0:ℝ)<(2:ℝ)^((l:Ἁ)-1075):=(by positivity) have aH:(G:ℝ)simp only[υ,Am,ἁ]at x<;>rw[x]at w B · have M:T≠0:=λh0=>by rw[h0,lH,sub_zero]at B;exact not_lt.mpr B aH' refine⟨M,?_⟩ unfold md rw[AC M] refine(iN _ _ _ ?_ ?_ r.symm V W N).symm<;>rw[aV,bJ]<;>simp only[υ,Am]<;>rw[t] refine AE ?_ q.le rw[pO K,sub_mul] exact sub_le_comm.mp B refine AE ?_ q.le rw[K5,add_mul] exact neg_le_sub_iff_le_add.mp w · have M:T≠0:=by intro h0 rw[h0,lH]at w exact not_le.mpr aH' (by linear_combination w) refine⟨M,?_⟩ unfold md rw[AC M] rw[<-r]at V W refine((iN _ _ _ ?_ ?_ r V W N).trans r).symm<;>rw[aV,bJ]<;>simp only[ἁ,neg_mul]<;>rw[t] rw[K5] linear_combination AE B q.le rw[pO K] linear_combination AE w q.le @[specialize]def ao(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ):Ἅ:= if tἉ)(e:Ἁ)(B:ℝ)(g:∀tintro _;simpa using d |succ t h=> intro j;rw[Ν,<-add_assoc];push_cast;linarith only [Ag ((e:ℝ)+∑s∈kP t,(z s:ℝ)) (z t),h (by exact X5 j),g t j,h,j,g] structure A8 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ noncomputable def A8.f(s:A8):Ἀ->Ἅ | 0=>s.a0 | 1=>s.a1 | 2=>s.a2 | 3=>s.a3 | 4=>s.a4 | 5=>s.a5 | 6=>s.a6 | _=>s.a7 lemma uk{i k:Ἄ}{S:Ἀ}(d:(J0 k)<8)(h:(J0 i)+8<=S)(e:S<2^(32:Ἀ)): (J0 (i+k))Ἅ)(N:Ἀ)(Y:ἀ):ἀ:= if (kS Y)q¬q=a->b<=q:=⟨N1 l,by rw[r,W4,l,BK],r.trans_le (N1 l),λe=>(N6 e).trans_eq r.symm,λh e=>r.trans_le (W5 h (Ww e))⟩ lemma bk(f:Ἀ->Ἅ)(N:Ἀ):∀k (Y:ἀ),N-(kS Y)=k->(kS Y)<=N-> (kS (bQ f N Y))=N/\(∀q<(kS Y),(bQ f N Y).data[q]! =Y.data[q]!)/\ ∀q,(kS Y)<=q->q(bQ f N Y).data[q]! =f q:=by intro k;induction k<;>intro Y l j .obtain⟨c,e⟩:=bk_h1 _ _ l j;rw[bQ,AC c];exact⟨e,λq _=>ἅ,λq a b=>absurd (AO a b) c⟩ rename_i p;have r:=bW Y (f (kS Y));obtain⟨u,v,w,x,y⟩:=bk_h2 _ _ _ _ l r;rw[bQ,AD u];have⟨m,g,o⟩:=p (Y.push (f (kS Y))) v w;refine⟨m,λq e=>?_,λq h d=>?_⟩;rw[g q (x e),pg _ _ _ e.step,AD e];by_cases e:q=(kS Y);subst e;rw[g _ (r▸(by simp only [lt_add_iff_pos_right,Order.lt_one_iff])),pg _ _ _ (by simp only [lt_add_iff_pos_right,Order.lt_one_iff]),AC (AX _)];exact o q (y h e) d lemma jp(v:Ἅ)(h:(lq (eF v.toBits))<2047):fv v:=by rw[fv,ij,Yg _ _ _ _ (fq v).1 (fq v).2];change(lq (v.toBits>>>52&&&2047))<2047 at h;rw[show kC.encoding=.ieee from ἅ,((by decide):kC.expAllOnesNat=2047),AM,Ak];exact W8 h lemma fK(v:Ἅ)(o:fv v):|rv v|<(2:ℝ)^(((lq (eF v.toBits)):Ἁ)-1022):=by have H:∀(x:ℝ)(M k:ℕ)(e f:ℤ),|x|=M->M<2^k->e+k=f->|x*(2:ℝ)^e|<(2:ℝ)^f:=λx M k e f h d w=>by have p:(0:ℝ)<(2:ℝ)^e:=by positivity rw[Ae,h,AW p,<-w,AK AL,AA,mul_comm ((2:ℝ)^e)] exact AI ((Ju.mpr d).trans_eq (B4 2 k)) p have Q:∀(s:Ἆ)(M:ℕ),|(if s then-(M:ℝ)else M)|=M∧|(if s then(-1:ℝ)else 1)*M|=M:=λs M=>by cases s · exact⟨nE M,(congrArg abs (one_mul (M:ℝ))).trans (nE M)⟩ · exact⟨(BE _).trans (nE M),(congrArg abs (neg_one_mul (M:ℝ))).trans ((BE _).trans (nE M))⟩ by_cases g:F.eF v.toBits=0 · have d:=(fq v).2 have l:(lq ((v.toBits>>>52)&&&2047))=0:=by rw[F.eF]at g;rw[g];rfl rw[rv,ij,l] generalize (lq (v.toBits&&&0xfffffffffffff))=m at d⊢ by_cases e:m=0 · rw[e,Model.toReal_eq_zero_of_isZero _ ((Model.isZero_ofFields _ _ _ _ (϶ _) (϶ _)).trans rfl),A5] positivity rw[Model.toReal_ofFields_subnormal _ _ _ e d] exact H _ m 52 _ _ (Q _ m).2 d (by rw[g];decide) rw[dV v o g,bJ] exact H _ _ 53 _ _ (Q _ _).1 (B3 (fq v).2 _) (by (clear * -;omega)) lemma jz(x y:Ἅ)(r:fv x)(t:fv y)(q:fv (x+y))(E:Ἁ)(l:-1074<=E)(u:E<=971) (h:|rv (x+y)|<(2:ℝ)^E):|rv x+rv y|<(2:ℝ)^E:=by have p:=gV x y r t;have v:=mH (kI x.toModel) (kI y.toModel) (by decide) (by rw[fv]at q;rwa[<-p]);unfold rv at h;rw[p,v]at h have m:|(2:ℝ)^E|<=(2:ℝ)^(971:Ἁ):=by rw[AW (by positivity)];exact AG (by norm_num) u have a:(⟨ἄ,1,E⟩:kU).toReal=2^E:=by simp only[bJ,υ,ἂ,pJ,one_mul] have b:(⟨ἃ,1,E⟩:kU).toReal=-2^E:=by simp only[bJ,ἁ,pJ,one_mul,neg_mul] have g:=rx _ (by norm_num) l (a▸m);have e:=rx ⟨ἃ,1,E⟩ (by norm_num) l (by rw[b,BE];exact m);rw[a]at g;rw[b]at e;have w:=abs_lt.1 h exact abs_lt.2 ⟨not_le.1 λd=>(w.1.trans_le ((lM kC d).trans_eq e)).false,not_le.1 λd=>((g.symm.trans_le (lM kC d)).trans_lt w.2).false⟩ @[specialize]def sT(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ)(m:ἆ):Ἅ×ἆ:= if trename_i h<;>rw[μ]at h<;>omega lemma jg(p:Ἀ->Ἅ)(n:Ἀ):∀k t a m,n-t=k->(lq m)<=(lq (sT p n t a m).2):=by intro k;induction k<;>intro t a m h<;>rw[sT];rw[AC (by omega)];rename_i d;rw[AD (N1 h)];dsimp only;have:=d (t+1) (a+p t) (if mἍ)(z:Ἀ->Ἁ)(u:Ἁ)(n K:Ἀ)(x:1<=K)(y:K<=1993) (E:∀tt<=n->fv a-> |rv a-((u:ℝ)+∑s∈kP t,(z s:ℝ))|<=t*(2:ℝ)^((K:Ἁ)-1076)-> (lq (sT p n t a M).2)<=K-> fv (sT p n t a M).1/\ |rv (sT p n t a M).1-((u:ℝ)+∑s∈kP n,(z s:ℝ))|<=n*(2:ℝ)^((K:Ἁ)-1076):=by intro m;induction m with |zero=>intro t a M D Q e o g;obtain rfl:t=n:=C4 Q (V3.1 D);rw[sT,AC (AX _)];exact⟨e,o⟩ |succ m G=> intro t a M D Q e o g;have d:tlinarith only[H,I,J,L,N] lemma cw(n:Ἀ)(d e:Ἀ->kF)(g:aG n d e)(S:Ἅ)(m:fv S)(h:ἆ) (q:(lq h)<2^(63:Ἀ))(o:|rv S-(af n d e:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (l:|(af n d e:ℝ)|<=(2:ℝ)^(425:Ἁ))(p:ak S h<4294967296): (N3 (ak S h))=ms n d e:=by have⟨j,r⟩:=ce S m h q _ o l p;rw[r,bT n d e g j] def aO(A:Ἂ Ἃ)(i:Ἄ)(m:ἇ):ἇ:= if h:i>>23)&&&255 aO A (i+1) (if m (mJ m)<=(mJ (aO A i m))/\∀q,(J0 i)<=q->q<(O0 A)->(mJ (kB A[q]!))<=(mJ (aO A i m)):=by intro k;induction k with |zero=>intro i m l;have c:=not_lt.2 (P4 l);rw[aO,dite_eq_right (λh=>c (cD h))];exact⟨AP,λq g d=>absurd (AO g d) c⟩ |succ k v=> intro i m l;have h:iby split<;>rename_i j<;>rw[Ι]at j<;>clear*-j<;>omega obtain⟨t,u⟩:=v (i+1) (if m<(A.uget i (cD h)>>>23)&&&255 then(A.uget i (cD h)>>>23)&&&255 else m) (by rw[ac h];exact congrArg Ki l);rw[r]at t;refine⟨AZ (le_max_left _ _) t,λq g d=>?_⟩;by_cases o:q=(J0 i);subst o;rw[<-cC A i (cD h),kB];exact AZ (le_max_right _ _) t;exact u q (by rw[ac h];exact g.lt_of_ne' o) d lemma bd(A:Ἂ kF)(j:(O0 A)by simp[e]at d g;(clear * - g d;omega),by rw[aT];exact G5 d 1⟩ @[specialize]def bC(k:Ἀ->Ἆ)(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ):Ἅ:= if tἍ)(n:Ἀ):∀m t a,n-t=m->ao p n t a=bC (λ_=>ἄ) p n t a:=by intro m;induction m<;>intro t a h<;>rw[ao,bC] .have q:=O3.2 (V3.1 h);rw[AC q,AC q] .rename_i ih;have q:=N1 h;rw[AD q,AD q];exact ih _ _ ((Kj n t).trans (congrArg Ki h)) lemma dM(p:Ἀ->Ἅ)(n:Ἀ):∀m t a,n-t=m->ao p n t a=bC (λ_=>ἄ) p n t a:=dM_h1 p n lemma dL(k:Ἀ->Ἆ)(p:Ἀ->Ἅ)(z:Ἀ->Ἁ)(d:Ἁ)(P L n:Ἀ) (Q:∀tz t=0)(V:∀tt<=n->fv a-> |rv a-((d:ℝ)+∑s∈kP t,(z s:ℝ))|<=t*((2:ℝ)^(P+L)*2^(-54:Ἁ))-> fv (bC k p n t a)/\ |rv (bC k p n t a)-((d:ℝ)+∑s∈kP n,(z s:ℝ))|<=n*((2:ℝ)^(P+L)*2^(-54:Ἁ)):=by have K:=cv n z d _ V v have X:(2:ℝ)^L*(2^L*2^(-54:Ἁ))<=1:=by rw[<-Ap,<-AF,<-AA,<-AK AL];exact zpow_le_one_of_nonpos₀ one_le_two (by clear*-w;omega) have q:(0:ℝ)<2^(-54:Ἁ):=(by positivity) have u:(0:ℝ)<2^P:=(by positivity) have r:(0:ℝ)<2^L:=(by positivity) intro m induction m with |zero=> intro t a O S o j obtain rfl:t=n:=C4 S (V3.1 O) rw[bC,AC (AX _)] exact⟨o,j⟩ |succ m y=> intro t a O S o j have h:tἍ)(bpf:Unit->Ἅ)(aB:Unit->Ἃ):Ἃ:= let r:=sT p n 0 (bpf ()) 0 let c:=if 1<=(lq r.2)/\(lq r.2)<=1993/\1076<=(lq r.2)+L then ak r.1 (I0 ((lq r.2)+L-1076))else 4294967296 if c<4294967296 then act relu (N3 c)else aB () theorem kRV(w:ἇ)(A:Ἀ)(hw:w.toNat=2^(31:Ἀ)+A)(hA:A<255*2^(23:Ἀ)):reluW w=0:=by have a3:A<2^(31:Ἀ):=hA.trans (by decide) have h1:(w&&&0x80000000!=0)=true:=by rw[AM,Ak,<-Β,Ξ];change ¬w.toNat&&&2^(31:Ἀ)=0 rw[Jy,hw,Nat.testBit_two_pow_add_eq,Nat.testBit_lt_two_pow a3];decide have q:A/2^(23:Ἀ)<255:=(ϸ (by decide)).2 hA have h2:(expOf w=255)=False:=by apply eq_false;intro z;have t:=congrArg mJ z unfold expOf at t;rw[Ξ,Υ,β,hw] at t change (2^(31:Ἀ)+A)/2^(23:Ἀ)&&&(2^(8:Ἀ)-1)=255 at t rw[ζ,show 2^(31:Ἀ)+A=A+2^(23:Ἀ)*2^(8:Ἀ) from by rw[Τ];rfl,mv _ _ (by decide),Xw,γ (q.trans (by decide))] at t exact absurd t (W8 q) unfold reluW;rw[AD (by simp only[h1,h2,decide_false,Gu,Pd,Bool.and_self])] open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in theorem kMB(e f:Ἀ)(he:e<256):(mkBits true e f).toNat=2^(31:Ἀ)+e*2^(23:Ἀ)+f%2^(23:Ἀ):=by unfold mkBits;simp only[ἁ] have a1:((1:ἇ)<<<31).toNat=2^(31:Ἀ):=by decide have a2:((lA e&&&0xff)<<<23).toNat=e<<<23:=by rw[ϴ,Ξ,lE] simp only[kN] rw[show (255:Ἀ)=2^(8:Ἀ)-1 from rfl,ζ,γ (by (clear * - he;omega):e%2^(32:Ἀ)<2^(8:Ἀ)),γ (by (clear * - he;omega):e<2^(32:Ἀ))] show (e<<<(23%32))%2^(32:Ἀ)=_;rw[ο];exact γ (by norm_num;(clear * - he;omega)) have a3:(lA f&&&0x007fffff).toNat=f%2^(23:Ἀ):=by rw[Ξ,lE];simp only[kN] rw[show (8388607:Ἀ)=2^(23:Ἀ)-1 from rfl,ζ,Xg _ (by decide)] rw[nK,nK,a1,a2,a3] have r:f%2^(23:Ἀ)<2^(23:Ἀ):=ϊ _ (by decide) have b1:(2^(31:Ἀ)|||e<<<23)=(2^(8:Ἀ)*1+e)<<<23:=by rw[Ϥ (by (clear * - he;omega):e<2^(8:Ἀ)) 1,Nat.shiftLeft_or_distrib];congr 1 rw[b1,←Nat.shiftLeft_add_eq_or_of_lt r,ο];ring open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in theorem kRD_h1{c:Prop}{i:Decidable c}{a b:ἇ}(ha:c->reluW a=0)(hb:¬c->reluW b=0):reluW (@ite _ c i a b)=0:=by by_cases h:c · rw[AD h];exact ha h · rw[AC h];exact hb h theorem kRD_h2(e f:Ἀ)(he:e<255):reluW (FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32.mkBits true e f)=0:= kRV _ _ ((kMB e f (N6 he)).trans (pA _ _ _)) ((O1 (ϊ f (by decide)) _).trans_le (by rw[<-Ο];exact ι _ he)) theorem kRD_h3(x:Int)(h:¬127by decide) fun _=>kRD_h1 (fun _=>kRD_h1 (fun _=>by decide) fun _=>kRD_h1 (fun _=>kRD_h2 1 0 (by decide)) fun _=>kRD_h2 0 _ (by decide)) fun _=>kRD_h1 (fun _=>by decide) fun h=>kRD_h2 _ _ (kRD_h3 _ h) open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in theorem kRN(T:Ἁ)(h:T<0):p8 true (md T (-298) false)=0:=by have hT:T≠0:=by omega unfold md;rw[AC hT] rw[show kE lU (ofIntDyadic T (-298))=ofUInt32 (roundDyadic (ofIntDyadic T (-298))) from (ofUInt32_roundDyadic _).symm,bD] unfold p8;rw[AD rfl] exact kRD _ (by simp[ofIntDyadic,h]) theorem kNg(S:Ἅ)(m:fv S)(h:ἆ)(q:(lq h)<2^(63:Ἀ))(T:Ἁ)(o:|rv S-(T:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (c1:(S.toBits>>>63!=0)=true)(c2:h+1024<=eF S.toBits):T<0:=by have hE:(lq h)+1024<=(lq (eF S.toBits)):=by have t:=θ.1 c2;rwa[η,γ (by simp only[kA];(clear * - q;omega))] at t have g:¬eF S.toBits=0:=fun z=>by rw[z] at hE;simp at hE have r:=dV S m g;rw[bJ] at r;simp only[c1,ἁ] at r generalize (lq (S.toBits&&&0xfffffffffffff))=F at r generalize (lq (eF S.toBits))=E at r hE generalize (lq h)=H at o hE have k1:(2:ℝ)^((H:Ἁ)+1)<=(2:ℝ)^(52:Ἁ)*(2:ℝ)^((E:Ἁ)-1075):=by rw[<-AK AL];exact AG one_le_two (by (clear * - hE;omega)) have k3:(2:ℝ)^(52:Ἁ)<=((F+2^(52:Ἀ):Ἀ):ℝ):=by rw[K5,B4,nZ,zpow_ofNat];exact le_add_of_nonneg_left (C3 _) have k6:(0:ℝ)<(2:ℝ)^(H:Ἁ):=zpow_pos two_pos _ have s1:rv S<=-((2:ℝ)^(H:Ἁ)*2):=by rw[r,neg_mul,<-zpow_add_one₀ AL];exact neg_le_neg (k1.trans (AE k3 (zpow_nonneg zero_le_two _))) exact Int.cast_lt_zero.1 ((neg_le_sub_iff_le_add.1 (A3.1 o).1).trans_lt (lt_neg_iff_add_neg.1 (s1.trans_lt (neg_lt_neg (lt_mul_of_one_lt_right k6 one_lt_two))))) theorem kTF0(relu:Ἆ)(n:Ἀ)(d e:Ἀ->kF)(g:aG n d e)(S:Ἅ)(m:fv S)(h:ἆ)(q:(lq h)<2^(63:Ἀ)) (o:|rv S-(af n d e:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (c:(relu&&(S.toBits>>>63!=0)&&h+1024<=eF S.toBits)=true):(0:Ἃ)=p8 relu (ms n d e):=by simp only[Η,AJ] at c obtain⟨⟨r,c1⟩,c2⟩:=c have t:=kNg S m h q _ o c1 c2 rw[r,bT n d e g (by (clear * - t;omega))];exact (kRN _ t).symm theorem kEB(E:Ἀ)(m:E<2048)(l:(2^(64:Ἀ)-1195+E)%2^(64:Ἀ)<253):1195<=E∧E-1085-110<253:=by omega theorem kAkN(S:Ἅ)(h:ἆ)(e:ak S h<4294967296)(c1:(S.toBits>>>63!=0)=true):p8 true (N3 (ak S h))=0:=by unfold p8;rw[AD rfl] unfold ak at e⊢;dsimp only at e⊢;split at e;swap;exact absurd e (by decide);rename_i d;rw[AD d];simp only[Η,AJ]at d;obtain⟨⟨⟨-,l⟩,-⟩,-⟩:=d have m:(lq (eF S.toBits))<2048:=by rw[eF,Ε];exact AO ϝ (by decide) rw[μ,Ζ]at l;simp only[kA]at l obtain⟨E1,E2⟩:=kEB _ m l have s0:(lq S.toBits)/2^(63:Ἀ)≠0:=by have t:=c1;simp only[AM,Ak,<-ξ,ν,kA]at t;simpa[β] using t have s2:(lq S.toBits)/2^(63:Ἀ)<2:=(ϸ (by decide)).2 (S.toBits.toNat_lt.trans_eq (by norm_num)) have s1:(lq S.toBits)/2^(63:Ἀ)=1:=by (clear * - s0 s2;omega) have f0:(lq (S.toBits&&&0xfffffffffffff))<2^(52:Ἀ):=Ε S.toBits 0xfffffffffffff▸AO ϝ (by decide) have r:((lq (S.toBits&&&0xfffffffffffff))+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=U2 ((ϸ (by decide)).2 (by (clear * - f0;omega))) rw[μ]at e;simp only[kA]at e refine kRV _ _ (by rw[Ϫ,γ e,g0 S.toBits E1,s1,n4]) ?_ generalize ((lq S.toBits&&&0xfffffffffffff)+2^(28:Ἀ))/2^(29:Ἀ)=k at r have g:((lq (eF S.toBits))-1085-110)*2^(23:Ἀ)<=252*2^(23:Ἀ):=ι _ (U2 E2) (clear * - E2 r;omega) @[inline]def tf(relu:Ἆ)(S:Ἅ)(hh:ἆ)(sl:Unit->Ἃ):Ἃ:= if relu&&(S.toBits>>>63!=0)&&hh+1024<=eF S.toBits then 0 else let c:=ak S hh if c<4294967296 then act relu (N3 c)else sl () @[inline]def tw(relu:Ἆ)(S:Ἅ)(hh:ἆ)(L n:Ἀ)(p:Ἀ->Ἅ)(bpf:Unit->Ἅ) (aB:Unit->Ἃ):Ἃ:=tf relu S hh λ_=>tS relu L n p bpf aB @[inline]def hG(e:Ἃ)(ix ib L:Ἀ):Ἆ×ἆ:= let p:=48+ix+max ((mJ e)-1) 55 (decide (e<255/\p+L<=425),(I0 (max p ib+2*L-54))) @[inline]def tG(relu:Ἆ)(S:Ἅ)(e:Ἃ)(ix ib L:Ἀ)(sl fb:Unit->Ἃ):Ἃ:= let h:=hG e ix ib L if h.1 then tf relu S h.2 sl else fb () theorem mA11 (x:ℕ):x&&&2047=x%2048:=ζ x 11 theorem mA63 (x:ℕ):x&&&9223372036854775807=x%9223372036854775808:=ζ x 63 theorem mA8 (x:ℕ):x&&&255=x%256:=ζ x 8 theorem kAkF(S:Ἅ)(h:ἆ)(e:ak S h<4294967296):kB (N3 (ak S h))≠255:=by unfold ak at e ⊢; unfold F.eF at e ⊢; dsimp only at e ⊢ generalize S.toBits=b at e ⊢ split at e · rename_i c; rw [AD c] simp only [Η,AJ] at c obtain ⟨⟨⟨-, l⟩, -⟩, -⟩:=c have hB:=b.toNat_lt simp only [μ,Ζ,Ε,ν,kA,kH,nr,β,mA11] at l hB have hX:b.toNat%9223372036854775808/4503599627370496=b.toNat/4503599627370496%2048:=by (clear * -;omega) have hR:1195*8388608 ≤ (((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29).toNat∧(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29).toNat ≤ 1448*8388608:=by simp only [η,Ε,ν,kA,kH,nr,Hp,β,mA63]; (clear * - l hX;omega) have hs:((b>>>63)<<<31).toNat=0∨((b>>>63)<<<31).toNat=2147483648:=by simp only [ψ,ν,kA,kH,nr,ο,β]; (clear * - hB;omega) generalize (((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)=R at hR ⊢ generalize (b>>>63)<<<31=s at hs ⊢ intro hq; have hq':=congrArg mJ hq unfold kB at hq' simp only [Ζ,η,kA,kH,nr,β,Ξ,Υ,kN,Ϫ,mA8] at hq' (clear * - hR hs hq';omega) · exact absurd e (by decide) lemma jE_h1(P L:Ἀ)(J:P+L<=425)(D:L<=27):P+2*L-54<2^(63:Ἀ)∧((L+P:Ἀ):Ἁ)<=425:=⟨by rw[Xe,<-pA];exact (Y4 _ _).trans_lt ((M3 J D).trans_lt (by decide)),O4.2 ((Τ L P).trans_le J)⟩ lemma jE_h2(K L:Ἀ)(y:K<=1993)(D:L<=27):K+L-1076<2^(63:Ἀ):=(Y4 _ _).trans_lt ((M3 y D).trans_lt (by decide)) lemma jE(g:Ἆ)(n:Ἀ)(d e:Ἀ->kF)(p:Ἀ->Ἅ)(h:Unit->Ἅ)(u:ἆ)(P L:Ἀ) (B:Unit->kF) (K:∀sE s M.le) (E n AP) n AP).trans ?_;have y:(n:ℝ)+1<=2^L:=mod_cast((N8 _).trans N:n+1<=2^L);refine(AE y (pow_nonneg zero_le_two _)).trans ?_;rw[<-AF,<-AA];exact AG one_le_two (jE_h1 P L J D).2 by_cases RZ:(g&&(S.toBits>>>63!=0)&&u+1024<=eF S.toBits)=true · unfold tw tf;rw[AD RZ];exact kTF0 g (n+1) d e j S I u (by rw[x];exact (jE_h1 P L J D).1) v RZ unfold tw tf tS;rw[AC RZ];dsimp only;split .rename_i w;rw[cw _ _ _ j _ I u (by rw[x];exact (jE_h1 P L J D).1) v o w] generalize A:sT p n 0 (h ()) 0=r;split .rename_i t;split .rename_i w;obtain⟨m,l⟩:=iM _ _ (tm (d n) (e n)) n (lq r.2) t.1 t.2.1 K n 0 _ 0 rfl (ϟ _) q.1 (by simp only[q.2,I7,Av,sub_self,A5,A9,zero_mul,le_refl]) (by rw[A]) rw[A,<-F]at l;rw[A]at m;have H:(lq ((I0 ((lq r.2)+L-1076))))=(lq r.2)+L-1076:=by rw[Ϣ,Α (by rw[n0];exact(O9 (J1 (D.trans (by decide)) _)).trans_lt r.2.toNat_lt)] refine congrArg _ (cw _ _ _ j _ m _ (by rw[H];exact jE_h2 _ L t.2.1 D) (l.trans ?_) o w);rw[H];refine(AE y (zpow_nonneg zero_le_two _)).trans_eq ?_;rw[<-AA,<-AK AL];exact congrArg (λz:Ἁ=>(2:ℝ)^z) (by (clear * - t;omega)) .exact G .rw[AC (by decide)];exact G lemma gg(X:ἀ)(i:Ἀ):X.get! i=X.data[i]!:=by rcases X with⟨d⟩;rfl lemma f8(v:Ἅ)(r:Ἀ):A8.f ⟨v,v,v,v,v,v,v,v⟩ r=v:=by unfold A8.f;split<;>rfl @[specialize]def da{α:Type}(f:Ἀ->α)(N:Ἀ)(a:Ἂ α):Ἂ α:= if (O0 a)α)(N:Ἀ):∀k (a:Ἂ α),N-(O0 a)=k->(O0 a)<=N->(∀i (h:i<(O0 a)),a[i]=f i)->da f N a=kK (n:=N) λq=>f (C7 q):=by intro k;induction k with |zero=>intro a j g d;rw[da,AC (O3.2 (P4 j))];exact mi ((C4 g (P4 j)).trans Ϝ.symm) λi e e2=>(d i e).trans (Λ e2).symm |succ k l=>intro a j g d;rw[da,AD (N1 j)];exact l _ ((congrArg (N-·) (ϣ _)).trans ((W4 _ _ _).trans (congrArg (·-1) j))) ((ϣ _).trans_le (N1 j)) λi h=>if q:iα)(N:Ἀ): da f N (lQ N)=kK (n:=N) λq=>f (C7 q):=by exact iC_h1 f N _ _ rfl (ϟ N) λi h=>(C5 i h).elim lemma dN(n:Ἀ)(e d:Ἀ->kF):∀c i,i+c=n-> nC (kK (n:=n+1) λt=>if (C7 t)if (C7 t)e (C7 t)) (kK (n:=n) λt=>d (C7 t)) i c:=by intro c;induction c with |zero=>intro i h;obtain rfl:i=n:=(by exact Vv h);simp only[nC,ab (i+1) (λt=>if t< i then d t else ld) i (by exact lt_add_one i),ab (i+1) (λt=>if t< i then e t else 0x80000000) i (by exact lt_add_one i),AX,Am];rfl |succ c g=>intro i h;rw[nC,g (i+1) (by (clear * - h;omega)),nC,ab (n+1) (λt=>if tif tkF)(h:0if tif tby split;exacts[(g t ‹_›).symm,(by decide)],bI _ _ _ g,aK,dN n d e n 0 (Κ n)];congr 1 .simp only[AX,Am,((by decide):tm ld 0x80000000=0),Av];exact ϔ rfl λt j=>by simp only[AD (ϥ.mp j)];unfold tm;rw[Τ];ring simp[h.ne'] theorem kStep (a x:Ἅ) (A X ea:ℝ) (K:ℕ) (hK:K ≤ 971) (ha:fv a) (hx:fv x) (hX:rv x=X) (hea : |rv a-A| ≤ ea) (hB : |A+X| + ea < (2:ℝ)^K) : fv (a+x) ∧ |rv (a+x)-(A+X)| ≤ ea+(2:ℝ)^K*(2:ℝ)^(-54:ℤ):=by obtain ⟨h2,h3⟩:=i5 a x ha hx K hK (by rw [hX, ← sub_add_cancel (rv a) A,add_assoc]; exact (Ag _ _).trans_lt ((add_le_add hea AP).trans_lt ((add_comm _ _).trans_lt hB))) rw [hX] at h3 refine ⟨h2,?_⟩ rw [← sub_add_sub_cancel (rv (a+x)) (rv a+X) (A+X),add_sub_add_right_eq_sub,add_comm ea] exact (Ag _ _).trans (add_le_add h3 hea) theorem kSeq (p:ℕ → Ἅ) (z:ℕ → ℤ) (u:ℝ) (n K:ℕ) (B:ℝ) (hK:K ≤ 971) (hp : ∀ t < n,fv (p t)∧rv (p t)=z t) (hS : ∀ t ≤ n, |u + ∑ s ∈ kP t,(z s:ℝ)| ≤ B) (hBK:B+n*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)) < (2:ℝ)^K) : ∀ m t a,n-t=m → t ≤ n → fv a → |rv a-(u + ∑ s ∈ kP t,(z s:ℝ))| ≤ t*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)) → fv (ao p n t a) ∧ |rv (ao p n t a)-(u + ∑ s ∈ kP n,(z s:ℝ))| ≤ n*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)):=by have hu:(0:ℝ) ≤ (2:ℝ)^K*(2:ℝ)^(-54:ℤ):=Af (pow_nonneg zero_le_two K) (zpow_nonneg zero_le_two _) intro m; induction m with | zero => intro t a D Q e o; obtain rfl:t=n:=C4 Q (V3.1 D) rw [ao,AC (AX _)]; exact ⟨e,o⟩ | succ m G => intro t a D Q e o have d:t < n:=N1 D rw [ao,AD d] obtain ⟨q,N⟩:=hp t d have hB1:=hS (t+1) d rw [Ν, ← add_assoc] at hB1 have:=kStep a (p t) _ _ _ K hK e q N o ((add_le_add hB1 (AE (N5.2 Q) hu)).trans_lt hBK) refine G (t+1) (a+p t) (by rw[W4,D,BK]) d this.1 ?_ rw [Ν, ← add_assoc,X7,add_one_mul]; exact this.2 theorem kE1 (n:ℕ) (d e:ℕ → Ἃ) (p:ℕ → Ἅ) (h0:Ἅ) (P L:ℕ) (K : ∀ s < n,fv (p s)∧rv (p s)=tm (d s) (e s)) (q:fv h0∧rv h0=tm (d n) (e n)) (E : ∀ s ≤ n, |(tm (d s) (e s):ℝ)| ≤ 2^P) (N:n+2 ≤ 2^L) (D:L ≤ 27) (J:P+L ≤ 425) : fv (ao p n 0 h0) ∧ |rv (ao p n 0 h0)-(af (n+1) d e:ℝ)| ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=by have hL1:((n:ℝ)+1)+1 ≤ (2:ℝ)^L:=by exact_mod_cast N have pP:(0:ℝ) < 2^P:=by positivity have hU:(0:ℝ) < (2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ):=by positivity have hn:(n:ℝ) < 2^L:=by exact_mod_cast ((U4 n).trans_le ((N8 _).trans N)) have hE:2^L*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ) := (((Ap _ _ _).symm.trans (congrArg (· * (2:ℝ)^(-54:ℤ)) ((AF (2:ℝ) L (P+L)).symm.trans (AA (2:ℝ) (L+(P+L))).symm))).trans (AK AL _ _).symm).trans_le (AG one_le_two (by clear * -; omega)) have hE2:(2:ℝ)^(((P+2*L-54:ℕ)):ℤ) ≤ 2^P := (AA (2:ℝ) _).trans_le (AU one_le_two (Vo.2 (J1 (X3 2 D) P))) have hS : ∀ t ≤ n, |(tm (d n) (e n):ℝ) + ∑ s ∈ kP t,(tm (d s) (e s):ℝ)| ≤ (n+1)*2^P:=fun t ht => (Ag _ _).trans ((add_le_add (E n AP) ((Z9 _ _).trans (((Xx (fun s hs=>E s ((ϥ.1 hs).le.trans ht))).trans_eq ((Vj _).trans ((congrArg (· • (2:ℝ)^P) (Xy t)).trans (nsmul_eq_mul _ _)))).trans (AE (N5.2 ht) pP.le)))).trans_eq ((add_comm _ _).trans (add_one_mul _ _).symm)) have hBK:(n+1)*(2:ℝ)^P+n*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) < (2:ℝ)^(P+L) := (add_lt_add_of_le_of_lt AP ((AI hn hU).trans_le (hE.trans hE2))).trans_le ((add_one_mul _ _).symm.trans_le ((AE hL1 pP.le).trans_eq ((mul_comm _ _).trans (AF _ _ _).symm))) have R:=kSeq p (fun s=>tm (d s) (e s)) (tm (d n) (e n)) n (P+L) ((n+1)*2^P) (J.trans (by decide)) K hS hBK n 0 h0 (pQ n) (ϟ n) q.1 (((congrArg abs (sub_eq_zero.2 (q.2.trans ((Av _).symm.trans (congrArg ((tm (d n) (e n):ℝ) + ·) (I7 _).symm))))).trans A5).trans_le (Af (C3 0) hU.le)) refine ⟨R.1,?_⟩ exact (congrArg (fun x => |rv (ao p n 0 h0)-x|) ((congrArg Zn (Ν (fun s=>tm (d s) (e s)) n)).trans ((Qj _ _).trans ((congrArg (· + ((tm (d n) (e n):ℤ):ℝ)) (Jg _ _)).trans (add_comm _ _))))).trans_le (R.2.trans ((AE hn.le hU.le).trans hE)) theorem kHG (n:ℕ) (d e':ℕ → Ἃ) (e:Ἃ) (ix ib:ℕ) (hd : ∀ s < n,idxOf (d s) ≤ ix) (he : ∀ s < n,(expOf (e' s)).toNat ≤ e.toNat) (hb : |(tm (d n) (e' n):ℝ)| ≤ 2^ib) : ∀ s ≤ n, |(tm (d s) (e' s):ℝ)| ≤ 2^(max (48+ix+max (e.toNat-1) 55) ib):=by intro s hs rcases Z7 s n with h | h · have i1:=hd s h; have i2:=he s h have j2:idxOf (e' s) ≤ max (e.toNat-1) 55:=by unfold idxOf; split_ifs; exact ϟ _; exact (G5 i2 1).trans (le_max_left _ _) have A : ∀ w:Ἃ, |(sv w:ℝ)| ≤ 2^24:=fun w=>(show |(sv w:ℝ)| = mantOf w by unfold sv; split_ifs <;> simp only [Ue,P5,BE,nE]).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) rw [tm,Jh,Jh,Uf,Int.cast_ofNat,Ae,Ae,AW (by positivity:(0:ℝ) < 2^(idxOf (d s)+idxOf (e' s)))] calc |(sv (d s):ℝ)| * |(sv (e' s):ℝ)| * 2^(idxOf (d s)+idxOf (e' s)) ≤ 2^24*2^24*2^(ix+max (e.toNat-1) 55) := mul_le_mul (mul_le_mul (A _) (A _) (Aa _) (by positivity)) (AU one_le_two (M3 i1 j2)) (by positivity) (by positivity) _=2^(48+ix+max (e.toNat-1) 55):=by rw [← AF, ← AF, ← pA] _ ≤ _:=AU one_le_two (le_max_left _ _) · obtain rfl:s=n:=C4 hs h exact hb.trans (AU one_le_two (le_max_right _ _)) theorem kc0:(0:Ἄ).toNat=0:=by simp only [Ϧ] theorem kc1:(1:Ἄ).toNat=1:=by simp only [kD] theorem kc2:(2:Ἄ).toNat=2:=by simp only [kD] theorem kc3:(3:Ἄ).toNat=3:=by simp only [kD] theorem kc4:(4:Ἄ).toNat=4:=by simp only [kD] theorem kc5:(5:Ἄ).toNat=5:=by simp only [kD] theorem kc6:(6:Ἄ).toNat=6:=by simp only [kD] theorem kc7:(7:Ἄ).toNat=7:=by simp only [kD] theorem kc8:(8:Ἄ).toNat=8:=by simp only [kD] theorem kSm (a b:Ἄ) (h:a.toNat+b.toNat < 2^(31:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by have:2^(32:Ἀ) ≤ 2^nx:=ς rw [lJ]; exact γ (by omega) theorem aos (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:t < n):ao p n t a=ao p n (t+1) (a+p t):=by rw [ao,AD h] theorem aoe (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:n ≤ t):ao p n t a=a:=by rw [ao,AC (by exact O3.mpr h)] structure WcE {K V:Type} (f:K → V) where k:K v:V h:v=f k @[inline] def wcAeq (a b:Ἂ ἇ):Ἆ := withPtrEq a b (fun _=>a==b) (fun h=>by subst h; exact Az a) theorem wcAeq_ok {a b:Ἂ ἇ} (h:wcAeq a b=true):a=b:=eq_of_beq h @[inline] def wcK3eq (a b:Ἂ ἇ × Nat × Nat):Ἆ := a.2.1==b.2.1&&a.2.2==b.2.2&&wcAeq a.1 b.1 theorem wcK3eq_ok (a b:Ἂ ἇ × Nat × Nat) (h:wcK3eq a b=true):a=b:=by obtain ⟨a1,a2,a3⟩:=a; obtain ⟨b1,b2,b3⟩:=b simp only [wcK3eq,Η,AQ] at h obtain ⟨⟨h2,h3⟩,h1⟩:=h; rw [wcAeq_ok h1,h2,h3] def wcFind {K V:Type} {f:K → V} (eq:K → K → Ἆ) (ok : ∀ a b,eq a b=true → a=b) (a:K) (s:Ἂ (WcE f)):Option {v // v=f a} := s.findSome? fun e=>if hk:eq e.k a=true then some ⟨e.v,by rw [e.h,ok _ _ hk]⟩ else none theorem wcSub {β:Type} {b:β} (x y : {v // v=b}):x=y:=Subtype.ext (x.2.trans y.2.symm) @[inline] def wcGet3 {K V:Type} {f:K → V} {α:Type} (eq:K → K → Ἆ) (ok : ∀ a b,eq a b=true → a=b) (r:ST.Ref Unit (Ἂ (WcE f))) (n:Nat) (a:K) (pk:K → α) : {v // v=f a} := let o:=ST.Prim.Ref.get r (Void.mk ()) match o.val.findIdx? (fun e=>eq e.k a) with | some i => if h:i < o.val.size then if hk:eq o.val[i].k a=true then withPtrAddr (pk o.val[i].k) (fun p1=>withPtrAddr (pk a) (fun p2 => if p1=p2 then (⟨o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩ : {v // v=f a}) else let e2:WcE f:=⟨a,o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩ let o2:=ST.Prim.Ref.swap r (#[e2] ++ o.val.eraseIdx i h) o.state if o2.val.size=0 then ⟨f a,rfl⟩ else ⟨o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else ⟨f a,rfl⟩ else ⟨f a,rfl⟩ | none => let e:WcE f:=⟨a,f a,rfl⟩ let o2:=ST.Prim.Ref.swap r (#[e] ++ (if o.val.size < n then o.val else o.val.pop)) o.state match wcFind eq ok a o2.val with | some y=>y | none=>⟨e.v,e.h⟩ def tchPg (P:ἀ) (i:Nat) (s:Ἅ):Nat → Ἅ | 0=>s | f+1=>if i < P.size then tchPg P (i+8) (s+P[i]!) f else s def tchP (P:ἀ):Ἅ:=tchPg P 0 0 (P.size/8+1) @[inline] def wcGet3T {K V:Type} {f:K → V} {α:Type} (eq:K → K → Ἆ) (ok : ∀ a b,eq a b=true → a=b) (r:ST.Ref Unit (Ἂ (WcE f))) (n:Nat) (a:K) (pk:K → α) (tk:V → Ἅ) (ne:Nat) : {v // v=f a} := let o:=ST.Prim.Ref.get r (Void.mk ()) match o.val.findIdx? (fun e=>eq e.k a) with | some i => if h:i < o.val.size then if hk:eq o.val[i].k a=true then withPtrAddr (pk o.val[i].k) (fun p1=>withPtrAddr (pk a) (fun p2 => if p1=p2 then (⟨o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩ : {v // v=f a}) else let e2:WcE f:=⟨a,o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩ let o2:=ST.Prim.Ref.swap r (#[e2] ++ o.val.eraseIdx i h) o.state let o3:=ST.Prim.Ref.get r o2.state if o2.val.size=0 then ⟨f a,rfl⟩ else if (o3.val.foldl (fun (t:Ἅ) e=>t+tk e.v) 0 0 (min ne o3.val.size)).toBits==0x7FF4000000000001 then ⟨f a,rfl⟩ else ⟨o.val[i].v,by rw [o.val[i].h,ok _ _ hk]⟩) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else ⟨f a,rfl⟩ else ⟨f a,rfl⟩ | none => let e:WcE f:=⟨a,f a,rfl⟩ let o2:=ST.Prim.Ref.swap r (#[e] ++ (if o.val.size < n then o.val else o.val.pop)) o.state let o3:=ST.Prim.Ref.get r o2.state if (o3.val.foldl (fun (t:Ἅ) e=>t+tk e.v) 0 0 (min ne o3.val.size)).toBits==0x7FF4000000000001 then ⟨f a,rfl⟩ else match wcFind eq ok a o2.val with | some y=>y | none=>⟨e.v,e.h⟩ theorem s5nb:2^(32:Ἀ) ≤ 2^nx:=by rcases Js with h|h <;> rw [h] <;> decide theorem s5uA {a b:Ἄ} (h:a.toNat+b.toNat < 2^(32:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by rw [lJ,γ (by have:=s5nb; exact K9 h this)] theorem s5uL {W:Ἂ ἇ}{k:Ἄ}(h:k>>24).toNat=(kB w).toNat:=((Υ _ _).trans (β _ _)).trans (eS w).symm theorem s5tu (k:Nat)(h:k<2^(32:Ἀ)):(k.toUSize).toNat=k:=by simp only [G0]; exact γ (by have:=s5nb; exact K9 h this) theorem s5fmax(l:List ἇ):∀ m0:ἇ,m0.toNat ≤ (l.foldl (fun (m v:ἇ)=>if mif mexact fun _=>⟨le_refl _,fun _ h=>nomatch h⟩ |cons y l ih=> intro m0;simp only[Ϸ];obtain⟨i1,i2⟩:=ih (if m0simp only[c,ἁ,ἂ]at i1 i2⊢ ·exact⟨AZ (Ι.mp c).le i1,fun x hx=>(List.mem_cons.mp hx).elim (fun h=>h▸i1) (i2 x)⟩ ·exact⟨i1,fun x hx=>(List.mem_cons.mp hx).elim (fun h=>h▸AZ (V4 fun g=>c (Ι.mpr g)) i1) (i2 x)⟩ structure A16 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ b0:Ἅ b1:Ἅ b2:Ἅ b3:Ἅ b4:Ἅ b5:Ἅ b6:Ἅ b7:Ἅ def rMu(W:Ἂ Ἃ)(k e:Ἄ)(m:Ἃ):Ἃ:= if h:k>>24 termination_by (J0 e)-(J0 k) decreasing_by all_goals (rw[ac h];exact M4 eб kб h) def tBi(W:Ἂ Ἃ)(n ow o8 t:Ἄ)(o k:Ἄ)(A:ἀ):ἀ:= if h:odw a.1[k]!) (a.2.1*a.2.2) (AR (a.2.1*a.2.2)) @[noinline] def wcDS:ST.Ref Unit (Ἂ (WcE wcDF)):=(ST.Prim.mkRef #[] (Void.mk ())).val theorem s5tBi_inv (W:Ἂ ἇ)(n ow o8 t:Ἄ)(B:Nat) (hB:(ow.toNat+16)*n.toNat<2^(31:Ἀ))(ho8:o8.toNat≤ow.toNat+16)(hW:ow.toNat*n.toNat≤W.size)(hWs:W.size<2^(32:Ἀ))(htn:t.toNat intro o k A hm ho hk hA; have z:=V3.1 hm; rw [tBi,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only exact ⟨by rw[hA,C4 ho z],fun i _=>rfl,fun p h1 h2=>absurd (h1.trans_lt h2) (not_lt.2 z)⟩ | succ m ih => intro o k A hm ho hk hA have h1:o.toNat < o8.toNat:=N1 hm have q1:(o.toNat+1)*n.toNat ≤ (ow.toNat+16)*n.toNat:=ι _ (l7 (h1.trans_le ho8)) have e1:(o+1).toNat=o.toNat+1:=by rw [s5uA (a:=o) (b:=1) (by simp; clear*-h1 ho8 hO hB; omega)]; simp have q2:=nO o.toNat n.toNat have e2:(k+n).toNat=(o.toNat+1)*n.toNat+t.toNat:=by rw [s5uA (a:=k) (b:=n) (by rw [hk]; clear*-htn q1 q2 hB; omega),hk,q2]; exact lO _ _ _ rw [tBi,AT (by rw [ε]; exact h1)] have hA':(A.push (if oby show (A.data.push v).size=A.data.size+1; simp rw [hp,e1,hA,pA] obtain ⟨r1,r2,r3⟩:=ih (o+1) (k+n) _ (by rw [e1,←D8,hm,BK]) (by rw [e1]; exact h1) (by rw [e2,e1]) hA' refine ⟨r1,fun i hi=>by rw [r2 i (by rw [e1]; exact N6 hi),s5push_get,AD (by rw[hA];exact hi)],fun p hp1 hp2 => ?_⟩ rcases Z7 o.toNat p with hp | hp · exact r3 p (by rw [e1]; exact hp) hp2 · have pe:p=o.toNat:=C4 hp hp1 subst pe rw [r2 _ (by rw [e1]; exact U4 _),s5push_get,AC (by rw[hA];exact AX _),AD hA.symm] by_cases hw:o < ow · have hw':=ε.mp hw have kb:k.toNat < W.size:=by rw [hk]; have:=ι n.toNat (l7 hw'); rw [Ο] at this; exact (O1 htn _).trans_le (this.trans hW) have kl:k < W.usize:=by have uz:W.usize.toNat=W.size%kX:=by simp [Qc] rw [ε,uz,γ (hWs.trans_le ς)]; exact kb rw [AD hw,AT kl,AD hw',s5uget,hk] · have hw':¬ o.toNat < ow.toNat:=fun h=>hw (ε.mpr h) rw [AC hw,AC hw'] theorem s5rMu_spec_h1 (x v:ἇ):x ≤ (if x>>24).toNat ≤ (rMu W k e x).toNat ∧ ∀ j,k.toNat≤j → jintro k e x hm he; have z:=P4 hm; rw [rMu,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; exact ⟨le_refl _,fun j h1 h2=>absurd (h1.trans_lt h2) (not_lt.2 z)⟩ | succ m ih => intro k e x hm he have h1:k.toNat < e.toNat:=N1 hm have e1:(k+1).toNat=k.toNat+1:=by rw [s5uA (a:=k) (b:=1) (by rw[mA]; exact C0 h1 (he.trans_lt hWs))]; simp rw [rMu,AT (by rw [ε]; exact h1)] have kl:k < W.usize:=by have uz:W.usize.toNat=W.size%kX:=by simp [Qc] rw [ε,uz,γ (hWs.trans_le ς)]; exact h1.trans_le he simp only [AT kl] obtain ⟨i1,i2⟩:=ih (k+1) e _ (by rw[e1,←D8,hm,BK]) he have mono : ∀ a b:ἇ,a ≤ b → (a>>>24).toNat ≤ (b>>>24).toNat:=fun a b h=>by simp only [Υ,β]; exact ϭ (C6.mp h) set v:=W.uget k (s5uL kl)<<<1 obtain ⟨mx1,mx2⟩:=s5rMu_spec_h1 x v refine ⟨AZ (mono _ _ mx1) i1,fun j hj1 hj2 => ?_⟩ rcases Z7 k.toNat j with hj | hj · exact i2 j (by rw [e1]; exact hj) hj2 · have je:j=k.toNat:=le_antisymm hj hj1 subst je rw [← s5exp, ← s5uget W k (s5uL kl)]; exact AZ (mono _ _ mx2) i1 theorem s5da_spec{α:Type}[Inhabited α](f:Nat->α)(N:Nat):∀ m (a:Ἂ α),N-a.size=m→a.size≤N→(∀ iintro a hm ha hi; have z:=P4 hm; rw [da,AC (not_lt.2 z)]; exact ⟨le_antisymm ha z,fun i h=>hi i (h.trans_le z)⟩ | succ m ih => intro a hm ha hi; rw [da,AD (N1 hm)] refine ih _ (by simp; (clear * - hm ha;omega)) (by simp; exact N1 hm) (fun i h => ?_) simp at h rcases Z7 i a.size with h1|h1 · rw [AB _ i (by simp; exact X5 h1),nU h1, ← AB a i h1]; exact hi i h1 · have:i=a.size:=le_antisymm h h1 subst this; rw [AB _ _ (by simp),nV] theorem s5wcGet3_val {K V:Type} {f:K → V} {a:K} (x : {v // v=f a}):x.1=f a:=x.2 theorem kMm (a b:Ἄ) (h:a.toNat*b.toNat < 2^(31:Ἀ)):(a*b).toNat=a.toNat*b.toNat:=by have:2^(32:Ἀ) ≤ 2^nx:=ς rw [BO]; exact γ (by omega) theorem kFU (S:ἀ) (i:Ἄ) (h:i.toNat < S.size):S.uget i h=S.data[i.toNat]! := by rcases S with ⟨d⟩; simp only [nN,kS] at h ⊢; rw [AB d i.toNat h]; rfl theorem kXU (X:Ἂ Ἃ)(i:Ἄ)(h:(J0 i)<(O0 X))(c:ℕ)(hc:(J0 i)=c):X.uget i h=X[c]! := by subst hc; rw [AB X (J0 i) h]; rfl theorem kIx7 (a k:Ἄ) (c:ℕ) (hk:k.toNat=c) (hc:c ≤ 7) (S:ἀ) (h:a.toNat+7 < S.size) (h2:a.toNat+7 < 2^(31:Ἀ)) : (a+k).toNat < S.size:=by rw [kSm a k (by (clear * - hk hc h2;omega))]; (clear * - hk hc h;omega) theorem kTB (w:Ἃ) (F E:ℕ) (K:idxOf w ≤ F) (al:174+F ≤ E) : |(tm ld w:ℝ)| ≤ 2^E := have H1:(tm ld w).natAbs ≤ 2^23*2^24*2^(126+F):=(Ϩ _ _).trans_le (ϧ ((Ϩ _ _).trans_le (ϧ (by decide) (bg w).le)) ((Gs 2 _).trans_le (Θ two_pos (M3 (by decide) K)))) have H2:2^23*2^24*2^(126+F) ≤ 2^E:=(m7 2 47 (126+F)).symm.trans_le (Θ two_pos (((pA 47 126 F).symm.trans_le (L1 (by decide:173 ≤ 174) F)).trans al)) (mI.symm.trans (Yv _).symm:|(tm ld w:ℝ)|=_).trans_le (((N5 (α:=ℝ)).mpr (H1.trans H2)).trans_eq ((B4 2 E).trans (congrArg (·^E) nZ))) theorem kLS (n c:ℕ) (I:ℕ → ℕ) (f:ℕ → ℤ) (hI : ∀ k < c,I k < n) (hm : ∀ a b,a < b → b < c → I a < I b) (hz : ∀ s < n,(∀ k < c,I k≠s) → f s=0) : ∑ k ∈ kP c,f (I k) = ∑ s ∈ kP n,f s:=by have inj:Set.InjOn I (kP c):=by intro a ha b hb e simp only [Finset.coe_range,Set.mem_Iio] at ha hb rcases Jd a b with h | h | h · exact absurd e (W8 (hm a b h hb)) · exact h · exact absurd e.symm (W8 (hm b a h ha)) rw [← Finset.sum_image (fun a ha b hb e=>inj ha hb e)] apply Finset.sum_subset · intro s hs; simp only [Oe,ϥ] at hs ⊢ obtain ⟨k,hk,rfl⟩:=hs; exact hI k hk · intro s hs hn; simp only [Oe,ϥ,not_exists,not_and] at hs hn exact hz s hs (fun k hk e=>hn k hk e) theorem kGB1T (g:Ἆ) (n c j:ℕ) (l:ℕ → Ἃ) (W b:Ἂ Ἃ) (I:ℕ → ℕ) (p p':ℕ → Ἅ) (e:Ἃ) (t E L F:ℕ) (B:Unit → Ἃ) (A : ∀ s < n,expOf (l s)≠255∧idxOf (l s) ≤ t) (hw : ∀ s < n,(expOf W[j*n+s]!).toNat ≤ e.toNat) (K:expOf b[j]! ≠ 255∧idxOf b[j]! ≤ F) (al:174+F ≤ E) (H:n+2 ≤ 2^L) (r:L ≤ 27) (S:E+L ≤ 425) (hc:c ≤ n) (hI : ∀ k < c,I k < n) (hm : ∀ a b,a < b → b < c → I a < I b) (hz : ∀ s < n,(∀ k < c,I k≠s) → tm (l s) W[j*n+s]! = 0) (hp : ∀ k < c,expOf W[j*n+I k]! ≠ 255 → fv (p k)∧rv (p k)=tm (l (I k)) W[j*n+I k]!) (hp' : ∀ s < n,expOf W[j*n+s]! ≠ 255 → fv (p' s)∧rv (p' s)=tm (l s) W[j*n+s]!) (hB:B ()=p8 g (ms (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!))) : tG g (ao p c 0 (dw ld*dw b[j]!)) e t E L (fun _=>tS g L n p' (fun _=>dw ld*dw b[j]!) B) B = p8 g (ms (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)):=by unfold tG; dsimp only; split swap; · exact hB rename_i h1 have h1':e < 255∧48+t+max (e.toNat-1) 55+L ≤ 425:=of_decide_eq_true h1 obtain ⟨he,hpL⟩:=h1' let P:=max (48+t+max (e.toNat-1) 55) E have hPL:P+L ≤ 425:=(max_add_add_right _ _ L).symm.trans_le (max_le hpL S) have hq:(hG e t E L).2.toNat=P+2*L-54:=by unfold hG; dsimp only rw [Α (AO ((Y4 _ _).trans ((congrArg (P + ·) (Xe L)).trans_le ((pA P L L).symm.trans_le ((M3 hPL r).trans (by decide)))):_ ≤ 1000) (by decide))] have Ew : ∀ s < n,expOf W[j*n+s]! ≠ 255:=fun s hs h=>Qh (Ι.1 he) ((congrArg mJ h).symm.trans_le (hw s hs)) have EB:=kHG n (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!) e t E (fun s hs=>(congrArg idxOf (AD hs)).trans_le (A s hs).2) (fun s hs=>(congrArg (fun w=>(expOf w).toNat) (AD hs)).trans_le (hw s hs)) ((congrArg₂ (fun a b => |((tm a b:ℤ):ℝ)|) (AC (AX n)) (AC (AX n))).trans_le (kTB _ F E K.2 al)) have EC:=kHG c (fun k=>if k < c then l (I k) else ld) (fun k=>if k < c then W[j*n+I k]! else b[j]!) e t E (fun k hk=>(congrArg idxOf (AD hk)).trans_le (A _ (hI k hk)).2) (fun k hk=>(congrArg (fun w=>(expOf w).toNat) (AD hk)).trans_le (hw _ (hI k hk))) ((congrArg₂ (fun a b => |((tm a b:ℤ):ℝ)|) (AC (AX c)) (AC (AX c))).trans_le (kTB _ F E K.2 al)) have hg:aG (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):=fun k hk => if hkn:k < n then ⟨fun H=>(A k hkn).1 ((congrArg expOf (AD hkn)).symm.trans H),fun H=>Ew k hkn ((congrArg expOf (AD hkn)).symm.trans H)⟩ else ⟨fun H=>(by decide:expOf ld≠255) ((congrArg expOf (AC hkn)).symm.trans H),fun H=>K.1 ((congrArg expOf (AC hkn)).symm.trans H)⟩ have R:=kE1 c (fun k=>if k < c then l (I k) else ld) (fun k=>if k < c then W[j*n+I k]! else b[j]!) p (dw ld*dw b[j]!) P L (fun k hk=>(hp k hk (Ew _ (hI k hk))).imp_right (fun H=>H.trans (congrArg Zn (congrArg₂ tm (AD hk) (AD hk))).symm)) ((dJ ld b[j]! (by decide) K.1).imp_right (fun H=>H.trans (congrArg Zn (congrArg₂ tm (AC (AX c)) (AC (AX c)))).symm)) EC ((L1 hc 2).trans H) r hPL have hsum:(af (c+1) (fun k=>if k < c then l (I k) else ld) (fun k=>if k < c then W[j*n+I k]! else b[j]!):ℤ) = af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!) := (Ν _ c).trans ((congrArg₂ (·+·) ((ϔ rfl fun k hk=>congrArg₂ tm (AD (ϥ.1 hk)) (AD (ϥ.1 hk))).trans ((kLS n c I (fun s=>tm (l s) W[j*n+s]!) hI hm hz).trans (ϔ rfl fun s hs=>congrArg₂ tm (AD (ϥ.1 hs)) (AD (ϥ.1 hs))).symm)) ((congrArg₂ tm (AC (AX c)) (AC (AX c))).trans (congrArg₂ tm (AC (AX n)) (AC (AX n))).symm)).trans (Ν _ n).symm) show tw g _ _ L n p' (fun _=>dw ld*dw b[j]!) B=_ exact jE g n _ _ p' (fun _=>dw ld*dw b[j]!) (hG e t E L).2 P L B (fun s hs=>(hp' s hs (Ew s hs)).imp_right (fun H=>H.trans (congrArg Zn (congrArg₂ tm (AD hs) (AD hs))).symm)) ((dJ ld b[j]! (by decide) K.1).imp_right (fun H=>H.trans (congrArg Zn (congrArg₂ tm (AC (AX n)) (AC (AX n)))).symm)) hg EB H r hPL hq hB _ R.1 (by rw [hq, ← hsum]; exact R.2) theorem kAD (n:ℕ) (relu:Ἆ) (X W b:Ἂ Ἃ) (r o:ℕ) : aD n relu X W b (r*n) 1 o=act relu (dotOf (n+1) (fun t=>if t < n then X[r*n+t]! else oneW) (fun t=>if t < n then W[o*n+t]! else b[o]!)):=by unfold aD; rw [bO]; simp only [ϻ] theorem kAddS (a b:ἆ) (h:a.toNat+b.toNat < 2^(63:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by rw [η]; exact γ (I4 h (by decide)) theorem kOfS (n:ℕ) (h:n < 2^(63:Ἀ)):n.toUInt64.toNat=n:=by rw [Ϣ,P6]; exact γ (I4 h (by decide)) theorem kE64 (e:Ἃ):e.toUInt64.toNat=e.toNat:=ϩ e lemma s5gS(x y:Ἅ)(d:fv x)(e:fv y): kI (x-y).toModel=Model.sub (kI x.toModel) (kI y.toModel):=by change kI (Ot x.toModel y.toModel)=_;rw[Ot,nu] have h:=Model.sub_eq_ofModel_sub_of_isFinite (fmt:=kC) (by decide) (kI x.toModel) (kI y.toModel) (by rw[ϒ];exact(fO x).1 d) (by rw[ϒ];exact(fO y).1 e) rw[ϒ,ϒ]at h;exact h.symm lemma s5iS(x y:Ἅ)(d:fv x)(e:fv y)(j:|rv x-rv y|<=ls (mR kC)): fv (x-y)/\rv (x-y)=ns kC (rv x-rv y):=by have h:=s5gS x y d e have g:=Model.isFinite_sub_of_abs_toReal_sub_le_posMaxFinite (kI x.toModel) (kI y.toModel) (by decide) d e j exact⟨by rwa[fv,h],by rw[rv,h];exact Model.toReal_sub_eq_roundAt _ _ (by decide) g⟩ lemma s5ofb(a:ἆ)(hv:¬(a>>>52)&&&2047=2047):kI (I5 a).toModel=U8 (fmt:=kC) a.toBitVec:=by have e1:kI (I5 a).toModel=Yj (U8 (fmt:=kC) a.toBitVec):=by show BB (Ug a)=_ unfold Ug;exact Ks _ rw[e1];apply Vt refine ⟨fun hE _=>absurd hE ?_⟩ intro hE;apply hv have:=congrArg Pq hE have k1:FloatFormat.binary64.toModel.exponentBits=11:=rfl have k2:FloatFormat.binary64.toModel.mantissaBitsWithoutImplicit=52:=rfl simp [nX,Model.toModelBits,U8,k1,k2] at this change (BitVec.extractLsb' 52 11 (a.toBitVec:BitVec 64)).toNat=2047 at this rw[Zo] at this apply ξ.mp simp only[Ε,ν,kA] rw[show (2047:Nat)=2^(11:Ἀ)-1 from rfl,ζ] simp only[nR,β] at this ⊢ have:=a.toNat_lt;omega lemma s5fld(a:ἆ):U8 (fmt:=kC) a.toBitVec=Wt kC (a>>>63!=0) ((lq ((a>>>52)&&&2047))) ((lq (a&&&0xfffffffffffff))):=by have d:Pe (U8 (fmt:=kC) a.toBitVec)=(lq ((a>>>52)&&&2047)):=ἅ have e:Os (U8 (fmt:=kC) a.toBitVec)=(lq (a&&&0xfffffffffffff)):=ἅ have g:Vf (U8 (fmt:=kC) a.toBitVec)=(a>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Vf,AM,Ak];rw[<-Hq];exact Iff.rfl rw[<-Jm (U8 (fmt:=kC) a.toBitVec),d,e,g] lemma s5pw(m:ℕ)(z:Ἁ):((2^m:ℕ):ℝ)*(2:ℝ)^(z-m)=(2:ℝ)^z:=by rw[B4,Nat.cast_two,<-AA,<-AK AL];congr 1;ring lemma s5and(w:ἇ):(mJ (w&&&0x80000000))=(if (mJ w)/2^(31:Ἀ)%2=1 then 2^(31:Ἀ) else 0):=by rw[Ξ];simp only[kN];rw[show (2147483648:ℕ)=2^(31:Ἀ) from rfl,Jy,lW] by_cases c:(mJ w)/2147483648%2=1<;>simp[c] theorem kReluW(relu:Ἆ)(w:ἇ)(hw:expOf w≠255): w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))=act relu w:=by have l:=w.toNat_lt have b:(mJ (w>>>31))=(mJ w)/2^(31:Ἀ):=by rw[Υ];simp[β] have fa:w&&&(4294967295:ἇ)=w:=by apply Β.mp;rw[Ξ];simp only[kN] rw[show (4294967295:ℕ)=2^(32:Ἀ)-1 from rfl,ζ];exact γ l have s1:=s5and w unfold act reluW rcases Z7 (mJ w) (2^(31:Ἀ)) with c|c · have h0:w>>>31=0:=Β.mp (by rw[b,nj];exact ώ c) have hz:(w&&&0x80000000)=0:=Β.mp (by rw[s1,AC (by (clear * - l c;omega)),nj]) cases relu<;>simp[h0,hz] · have h1:w>>>31=1:=Β.mp (by rw[b,Og];exact mG c l) have hn:(w&&&0x80000000)≠0:=fun q=>by have:=congrArg mJ q;rw[s1,AD (by (clear * - l c;omega))]at this;simp at this cases relu<;>simp[h1,hn,hw,fa] lemma zaa(n:Ἀ)(h:n<2^(32:Ἀ)):(J0 (G0 n))=n:=Dense.aa (AN h ς) lemma jV(a:Ἂ ἇ):(J0 a.usize)<=(O0 a):=by exact Ay _ _ lemma uL{a:Ἂ ἇ}{i:Ἄ}(h:i⟨Ah (2^((C7 k)+7)) (Dense.F.dw 0)⟩ def zPq(n:Ἀ):ἀ:= let k:=Aq n+1-7 if k<10 then ZPq[k]!else⟨Ah n (Dense.F.dw 0)⟩ lemma uU{Y:ἀ}{i:Ἄ}(g:izPs_h1 n q (h.trans_eq X4)⟩ lemma zPs(n:Ἀ):n<=(kS (zPq n))/\((kS (zPq n))<=2^(16:Ἀ)\/(kS (zPq n))=n)/\∀q<(kS (zPq n)),(zPq n).data[q]! =Dense.F.dw 0:=by dsimp only[zPq];split;rw[AB ZPq _ (by rwa[ZPq,Ϝ])];simp only[ZPq,Λ,kS,X4];refine⟨(ϙ (n:=n)).le.trans (Θ (by decide) (by exact le_tsub_add)),.inl (Θ (by decide) (by omega)),zPs_h1 _⟩;exact zPs_h2 n def wdU(K:Ἂ Ἃ)(i n:Ἄ)(Y:ἀ):ἀ:= if h:i(kS (wdU K i n Y))=(kS Y):=by intro m;induction m with |zero=>intros;rw[wdU,dite_eq_right (λh=>by have:=ε.mp h;omega)] |succ m r=>intro i Y e;have h:isimp only[uZ] lemma wdUs(K:Ἂ kF)(n:Ἄ)(hK:(O0 K)<2^(32:Ἀ)):∀m (i:Ἄ)(Y:ἀ),(J0 n)-(J0 i)=m->(J0 n)<=(kS Y)->(kS Y)<2^(32:Ἀ)->(∀q<(kS Y),Y.data[q]! =if q< (J0 i) then Dense.F.dw K[q]! else Dense.F.dw 0)-> ∀q<(J0 n),(wdU K i n Y).data[q]! =Dense.F.dw K[q]!:=by intro m;induction m with |zero=> intro i Y e a b c q hq;rw[wdU,dite_eq_right (λh=>G7 (ε.1 h) e),c q (AN hq a),AD (AN hq (P4 e))] |succ m ih=> intro i Y e a b c;have h:i?_ rw[sz]at hq;rw[fuS _ _ _ _ _ hq,Dense.ac h,c q hq];by_cases q1:(J0 i)=q .subst q1;rw[AD ἅ,AD (by exact lt_add_one iб),kr] .rw[AC q1];by_cases q2:q< (J0 i) .rw[AD q2,AD (N6 q2)] .rw[AC q2,AC (by (clear * - g k q1 q2;omega))] .rename_i k;refine ih (i+1) Y hE a b λq hq=>?_ rw[c q hq,Dense.ac h];by_cases q2:q< (J0 i) .rw[AD q2,AD (N6 q2)] .by_cases q3:q=(J0 i) .subst q3;rw[AC q2,AD (by exact lt_add_one iб),An K _ (λhh=>k (ε.2 (kz▸hh)))];rfl .rw[AC q2,AC (by (clear * - q2 q3;omega))] theorem Lk2(t n S:ℕ)(h:t < n)(hX:8*n≤S):8*t+7 < S:=by omega theorem Lkd(R r:ℕ)(h:r < R):R-(r+1) < R-r:=U5 h (U4 r) theorem k7d1:1≤7:=K3 rfl theorem k7d2:2≤7:=K3 rfl theorem k7d3:3≤7:=K3 rfl theorem k7d4:4≤7:=K3 rfl theorem k7d5:5≤7:=K3 rfl theorem k7d6:6≤7:=K3 rfl theorem k7d7:7≤7:=K3 rfl def kX8(Wd XT:ἀ)(wo n:Ἄ)(hW:(J0 wo)+(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 wo)+(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ))(t:Ἄ)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ):A8:= if h:tἍ)(c k k1 l:Ἀ)(u v:Ἅ)(Ez:z=y)(I:y.f l=ao f c k1 u)(hk1:k1=k+1)(hu:u=v+f k)(ht:k ∀ l,l<8 -> (kX8 Wd XT wo n hW hX h31 t a0 a1 a2 a3 a4 a5 a6 a7).f l = ao (fun s=>XT.data[8*s+l]!*Wd.data[(J0 wo)+s]!) (J0 n) (J0 t) (A8.f ⟨a0,a1,a2,a3,a4,a5,a6,a7⟩ l):=by intro m; induction m with | zero => intro t a0 a1 a2 a3 a4 a5 a6 a7 H l hl have z:=P4 H;rw[(kX8.eq_1 Wd XT wo n hW hX h31 t a0 a1 a2 a3 a4 a5 a6 a7).trans (dite_eq_right (by rw[ε];exact O3.2 z)),aoe _ _ _ _ z] | succ m IH => intro t a0 a1 a2 a3 a4 a5 a6 a7 H l hl have ht:(J0 t) < (J0 n):=N1 H have h:t < n:=ε.mpr ht have h8:(J0 (8*t))=8*(J0 t):=by rw[kMm _ _ (by rw[kc8];exact AO (X3 8 (I3 ht)) h31.2),kc8] have hw:(J0 (wo+t))=(J0 wo)+(J0 t):=kSm _ _ (AO (J1 (I3 ht) _) h31.1) exact kX8_spec_h2 _ _ _ _ _ _ _ _ _ ((kX8.eq_1 Wd XT wo n hW hX h31 t a0 a1 a2 a3 a4 a5 a6 a7).trans (AT h)) (IH (t+1) _ _ _ _ _ _ _ _ (by rw[ac h,W4,H,BK]) l hl) (ac h) ((kX8_spec_h1 _ _ _ _ _ _ _ _ _ _ _ (by rw[h8];exact AO ((J1 ((by decide):7<=8) _).trans (X3 8 ht)) h31.2) _ _ _ _ _ _ _ _ l hl).trans (by rw [kFU,hw,h8])) ht @[inline] def cEq(F a:Ἅ):ἆ:=let e:=eF (F*a).toBits;if (1078:ἆ)p then hb else p) if c<(4294967296:ἆ) then (let w:=N3 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) else (0xFFFFFFFF:ἇ) @[inline] def mx2(a c:ἆ):ἆ:=if aG7 (ε.mp h) hk,fun h=>G7 h hk⟩ def sTb(X:Ἂ Ἃ)(Wd:ἀ)(xo wo n:Ἄ)(hX:(J0 xo)+(J0 n)<=(O0 X)∧(J0 xo)+(J0 n)<2^(31:Ἀ)) (hW:(J0 wo)+(J0 n)<=(kS Wd)∧(J0 wo)+(J0 n)<2^(31:Ἀ))(t:Ἄ)(a:Ἅ)(m:ἆ):Ἅ×ἆ:= if h:t sTb X Wd xo wo n hX hW t a m=sT (fun s=>dw X[(J0 xo)+s]!*Wd.get! ((J0 wo)+s)) (J0 n) (J0 t) a m:=by intro k;induction k with |zero=>intro t a m hk;rw[sTb,dite_eq_right (kS0 t n hk).1,sT,AC (kS0 t n hk).2] |succ k ih=> intro t a m hk;obtain⟨h1,h2⟩:=kSt t n k hk have q1:=(kUb xo t n _ (ε.mp h1) hX).2 have q2:=(kUb wo t n _ (ε.mp h1) hW).2 have u1:∀hh,X.uget (xo+t) hh=X[(J0 xo)+(J0 t)]! :=fun hh=>by rw[AB X _ (q1▸hh)];simp only[Hd,q1] have u2:∀hh,Wd.uget (wo+t) hh=Wd.get! ((J0 wo)+(J0 t)):=fun hh=>by rw[ug,gg,q2] rw[sTb,AT h1,sT,AD (ε.mp h1)];dsimp only;rw[u1,u2,ih (t+1) _ _ h2,ac h1] @[noinline]def tR(relu:Ἆ)(L:Ἀ)(r:Ἅ×ἆ)(aB:Unit->Ἃ):Ἃ:= let c:=if 1<=(lq r.2)/\(lq r.2)<=1993/\1076<=(lq r.2)+L then ak r.1 (I0 ((lq r.2)+L-1076))else 4294967296 if c<4294967296 then act relu (N3 c)else aB () theorem sTB_h(a n:Ἀ)(h:a+n<2^(31:Ἀ)):(J0 (G0 a))=a∧(J0 (G0 n))=n:= ⟨W3 (AN (AN ((V1 a n).trans_lt h) (by decide)) ς),W3 (AN (AN ((N2 n a).trans_lt h) (by decide)) ς)⟩ @[noinline]def sTB(X:Ἂ Ἃ)(Wd:ἀ)(n:Ἀ)(row j:Ἄ)(a0:Ἅ):Ἅ×ἆ:= if h:(J0 row)*n+n<=(O0 X)∧(J0 row)*n+n<2^(31:Ἀ)∧(J0 j)*n+n<=(kS Wd)∧(J0 j)*n+n<2^(31:Ἀ) then sTb X Wd (G0 ((J0 row)*n)) (G0 ((J0 j)*n)) (G0 n) (by rw[(sTB_h _ _ h.2.1).1,(sTB_h _ _ h.2.1).2];exact⟨h.1,h.2.1⟩) (by rw[(sTB_h _ _ h.2.2.2).1,(sTB_h _ _ h.2.2.2).2];exact⟨h.2.2.1,h.2.2.2⟩) 0 a0 0 else sT (fun s=>dw X[(J0 row)*n+s]!*Wd.get! ((J0 j)*n+s)) n 0 a0 0 theorem sTB_eq(X:Ἂ Ἃ)(Wd:ἀ)(n:Ἀ)(row j:Ἄ)(a0:Ἅ):sTB X Wd n row j a0=sT (fun s=>dw X[(J0 row)*n+s]!*Wd.get! ((J0 j)*n+s)) n 0 a0 0:=by unfold sTB;split · rename_i h;rw[sTb_eq _ _ _ _ _ _ _ _ 0 a0 0 rfl,(sTB_h _ _ h.2.1).1,(sTB_h _ _ h.2.1).2,(sTB_h _ _ h.2.2.2).1,Ϧ] · rfl theorem kQb(xb t n Qu:Ἀ)(h:t(J0 q)=xb+8*(J0 t)-> sTq Y Q vo n hY Qu hQ t q a m=sT (fun s=>Y.get! ((J0 vo)+s)*Q.get! (xb+8*s)) (J0 n) (J0 t) a m:=by intro k;induction k with |zero=>intro t q a m hk hq;rw[sTq,dite_eq_right (fun h=>(kS0 t n hk).1 h.1),sT,AC (kS0 t n hk).2] |succ k ih=> intro t q a m hk hq;obtain⟨h1,h2⟩:=kSt t n k hk have h3:qby rw[ug,gg,q1] have u2:∀hh,Q.uget q hh=Q.get! (xb+8*(J0 t)):=fun hh=>by rw[ug,gg,hq] rw[sTq,AT ⟨h1,h3⟩,sT,AD (ε.mp h1)];dsimp only;rw[u1,u2,ih (t+1) (q+8) _ _ h2 (by rw[q8,ac h1,hq,Kk,pA]),ac h1] @[noinline]def sTQ(Y Q:ἀ)(n vo xb:Ἀ)(a0:Ἅ):Ἅ×ἆ:= if h:vo+n<=(kS Y)∧vo+n<2^(31:Ἀ)∧xb+8*n<=(kS Q)+7∧(kS Q)+8<2^(31:Ἀ)∧xb<2^(31:Ἀ) then sTq Y Q (G0 vo) (G0 n) (by rw[(sTB_h _ _ h.2.1).1,(sTB_h _ _ h.2.1).2];exact⟨h.1,h.2.1⟩) (G0 (kS Q)) (by rw[(sTB_h _ _ h.2.2.2.1).1];exact⟨rfl,h.2.2.2.1⟩) 0 (G0 xb) a0 0 else sT (fun s=>Y.get! (vo+s)*Q.get! (xb+8*s)) n 0 a0 0 theorem sTQ_eq(Y Q:ἀ)(n vo xb:Ἀ)(a0:Ἅ):sTQ Y Q n vo xb a0=sT (fun s=>Y.get! (vo+s)*Q.get! (xb+8*s)) n 0 a0 0:=by unfold sTQ;split · rename_i h;have e:=sTB_h _ _ h.2.1 rw[sTq_eq _ _ _ _ _ _ _ xb (by rw[e.2,(sTB_h _ _ h.2.2.2.1).1];exact h.2.2.1) _ 0 _ a0 0 rfl (by rw[Ϧ,W3 (AN (AN h.2.2.2.2 (by decide)) ς)];rfl),e.1,e.2,Ϧ] · rfl noncomputable def bXfb(relu:Ἆ)(X W b E:Ἂ Ἃ)(Wd:ἀ)(ix ib L N:Ἀ):Ἄ->Ἄ->Ἅ->Ἃ:=fun (row j:Ἄ)(v:Ἅ)=>tG relu v E[(J0 j)]! ix ib L (λ_=>tR relu L (sTB X Wd N row j (dw oneW*dw b[(J0 j)]!)) λ_=>aD N relu X W b ((J0 row)*N) 1 (J0 j)) (λ_=>aD N relu X W b ((J0 row)*N) 1 (J0 j)) def kX16(Wd XT:ἀ)(wo wp n:Ἄ)(hW:(J0 wo)+(J0 n)<=(kS Wd))(hP:(J0 wp)+(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 wo)+(J0 n)<2^(31:Ἀ)∧(J0 wp)+(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ))(t:Ἄ)(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7:Ἅ):A16:= if h:t (⟨(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a0,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a1,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a2,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a3,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a4,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a5,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a6,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).a7⟩:A8)=kX8 Wd XT wo n hW hX ⟨h31.1,h31.2.2⟩ t a0 a1 a2 a3 a4 a5 a6 a7 ∧ (⟨(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b0,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b1,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b2,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b3,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b4,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b5,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b6,(kX16 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).b7⟩:A8)=kX8 Wd XT wp n hP hX ⟨h31.2.1,h31.2.2⟩ t c0 c1 c2 c3 c4 c5 c6 c7:=by intro m; induction m with | zero => intro t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 H have z:=P4 H rw[(kX16.eq_1 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).trans (dite_eq_right (by rw[ε];exact O3.2 z)), (kX8.eq_1 Wd XT wo n hW hX ⟨h31.1,h31.2.2⟩ t a0 a1 a2 a3 a4 a5 a6 a7).trans (dite_eq_right (by rw[ε];exact O3.2 z)), (kX8.eq_1 Wd XT wp n hP hX ⟨h31.2.1,h31.2.2⟩ t c0 c1 c2 c3 c4 c5 c6 c7).trans (dite_eq_right (by rw[ε];exact O3.2 z))] exact ⟨rfl,rfl⟩ | succ m IH => intro t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 H have ht:(J0 t) < (J0 n):=N1 H have h:t < n:=ε.mpr ht rw[(kX16.eq_1 Wd XT wo wp n hW hP hX h31 t a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7).trans (AT h), (kX8.eq_1 Wd XT wo n hW hX ⟨h31.1,h31.2.2⟩ t a0 a1 a2 a3 a4 a5 a6 a7).trans (AT h), (kX8.eq_1 Wd XT wp n hP hX ⟨h31.2.1,h31.2.2⟩ t c0 c1 c2 c3 c4 c5 c6 c7).trans (AT h)] exact IH (t+1) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by rw[ac h,W4,H,BK]) @[inline] def dwA(w:ἇ):Ἅ:=(Core.mW w).toInt64.toFloat*P.uget (O5 ((w>>>23)&&&255)) (by rw[gL,aC,Ξ];exact AO ϝ (by decide)) theorem k8i (k r:Ἄ)(n:ℕ)(hk:(J0 k)<=n)(h8:8*n+7<2^31)(hr:(J0 r)<8):(J0 (8*k+r))=8*(J0 k)+(J0 r):=by have e8k:(J0 (8*k))=8*(J0 k):=by rw [kMm _ _ (by rw [kc8]; exact (X3 8 hk).trans_lt (C0 (V1 _ _) h8)),kc8] rw [kSm _ _ (by rw [e8k]; exact C0 (M3 (X3 8 hk) (U2 hr)) h8),e8k] def dRw8(X:Ἂ ἇ)(i n r k:Ἄ)(Y:ἀ)(a:Ἅ)(hX:(J0 i)+(J0 n)<=(O0 X))(hY:8*(J0 n)+8<=(kS Y))(hB:(J0 i)+(J0 n)<2^31/\8*(J0 n)+7<2^31)(hr:(J0 r)<8):ἀ:= if h:k intro k Y a hY hm; rw [dRw8]; split · rename_i h; exact absurd hm (G7 (ε.mp h)) · exact uZ _ _ _ _ | succ m ih => intro k Y a hY hm; have h1:(J0 k) < (J0 n):=N1 hm rw [dRw8,AT (ε.mpr h1)]; rw [ih (k+1) _ _ _ (by rw [ac (ε.mpr h1),W4,hm,BK]),uZ] theorem kBRn (b r n:Ἄ)(l:ℕ)(hr:(J0 r)intro r Y hY hm; rw [dX8,dite_eq_right (show ¬ r < lim from fun h=>G7 (ε.mp h) hm)] | succ m ih => intro r Y hY hm; have h1:(J0 r) < (J0 lim):=N1 hm rw [dX8,AT (ε.mpr h1)]; rw [ih (r+1) _ _ (by rw [ac (ε.mpr h1),W4,hm,BK]),dRw8_size X _ _ _ _ _ _ _ 0 Y 0 hY rfl] theorem wcDF_spec (W:Ἂ Ἃ)(ow n:Ἀ):(kS (wcDF (W,ow,n)))=ow*n ∧ ∀k,k(wcDF (W,ow,n)).data[k]! =dw W[k]! := by have B:=bk (λk=>dw W[k]!) (ow*n) _ (AR (ow*n)) rfl (by simp[AR,kS]) unfold wcDF; exact ⟨B.1,fun k hk=>B.2.2 k (by simp[AR,kS]) hk⟩ def tPg8(W:Ἂ ἇ)(n ow G gi:Ἄ)(A:ἀ):ἀ:= if h:girMu a.1 (G0 (o*a.2.2)) (G0 (o*a.2.2+a.2.2)) 0) a.2.1 (AS a.2.1) (tPg8 a.1 (G0 a.2.2) (G0 a.2.1) (G0 ((a.2.1+7)/8)) 0 (AR (a.2.2*(8*((a.2.1+7)/8)))),E,E.foldl (fun (m v:ἇ)=>if mif odkEq_ok a b) dkS 32 (W,b,ow,n) (fun k=>k.1) (fun v=>tchP v.Q) 3 def dkGs(W b:@& Ἂ ἇ)(ow n:Nat)(s:@& Ἂ (WcE dkF))(i:Nat):{v//v=dkF (W,b,ow,n)}:= if h:iwithPtrAddr W (fun p2=> if p1=p2 then (if hk:dkEq s[i].k (W,b,ow,n)=true then ⟨s[i].v,by rw[s[i].h,dkEq_ok _ _ hk]⟩ else dkGo W b ow n) else dkGs W b ow n s (i+1)) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else dkGo W b ow n termination_by s.size-i theorem kSh (w:ἇ):(w&&&0x7FFFFFFF)>>>23=(w>>>23)&&&255:=by apply Β.1; rw [Υ,Ξ,Ξ,Υ] simp only [β] rw [show (0x7FFFFFFF:ἇ).toNat=2^(31:Ἀ)-1 by decide,ζ,show (255:ἇ).toNat=2^(8:Ἀ)-1 by decide,ζ] simp only [nr,kN,kH]; omega theorem kAbsDw (w:ἇ):dwA w=dw (w&&&0x7FFFFFFF):=by have h1:Core.mW (w&&&0x7FFFFFFF)=Core.mW w:=by unfold Core.mW f5; rw [kSh,Vk,Vk,show (0x7FFFFFFF&&&8388607:ἇ)=8388607 by decide,show (255&&&255:ἇ)=255 by decide] unfold dwA dw; rw [h1]; congr 2; rw [kSh] def dRw(X:Ἂ ἇ)(i n o k:Ἄ)(Y:ἀ)(a:Ἅ)(hX:(J0 i)+(J0 n)<=(O0 X))(hY:(J0 o)+(J0 n)<(kS Y))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):ἀ:= if h:k(kS (dRw X i n o k Y a hX hY hB))=(kS Y):=by intro m;induction m with | zero=>intro k Y a hY hm;rw[dRw,dite_eq_right (by rw[ε];(clear * - hm;omega))];exact uZ _ _ _ _ | succ m ih=>intro k Y a hY hm;have h1:(J0 k)<(J0 n):=by exact N1 hm rw[dRw,AT (ε.mpr h1)];dsimp only;rw[ih _ _ _ _ (by rw[ac (ε.mpr h1)];(clear * - hm h1;omega)),uZ] def dOw(X:Ἂ ἇ)(n m R r:Ἄ)(Y:ἀ)(hX:(J0 R)*(J0 n)<=(O0 X))(hY:(J0 R)*(J0 m)<=(kS Y))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):ἀ:= if h:rby simp only[ϑ]at h;simp only[nC,h,Gu] |m+1,i,h=>by rw[nC,zrNC a q m (i+1) (by rw[show i+1+m=i+(m+1) by omega];exact h),Gm] @[noinline] def sQ2(relu:Ἆ)(n:Nat)(X W b E:Ἂ ἇ)(ix ib L:Nat)(Y Q:ἀ)(vo rn j:Nat)(hh:ἆ)(v:Ἅ):ἇ:= let tg:=fun (_:Unit)=>tG relu v E[j]! ix ib L (fun _=>tR relu L (sTQ Y Q n vo (j/8*n*8+j%8) (dw oneW*dw b[j]!)) fun _=>aD n relu X W b rn 1 j) (fun _=>aD n relu X W b rn 1 j) if (E[j]!).toUInt64<(255:ἆ)&&hh<=(372:ἆ) then tf relu v hh tg else tg () theorem dOw_size(X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):∀ k (r:Ἄ)(Y:ἀ)(hY:(J0 R)*(J0 m)<=(kS Y)),(J0 R)-(J0 r)=k->(kS (dOw X n m R r Y hX hY hm hB))=(kS Y):=by intro k;induction k with | zero=>intro r Y hY hk;rw[dOw,dite_eq_right (by rw[ε];(clear * - hk;omega))] | succ k ih=>intro r Y hY hk;have h1:(J0 r)<(J0 R):=by exact N1 hk rw[dOw,AT (ε.mpr h1)];dsimp only;rw[ih _ _ _ (by rw[ac (ε.mpr h1)];(clear * - hk h1;omega)),dRw_size _ _ _ _ _ _ _ 0 _ _ _ rfl] theorem s5tPt8_inv_h1 (n g t:Ἄ)(ow:Nat)(hB:(ow+16)*n.toNat<2^(31:Ἀ))(h8:g.toNat+8≤ow+16)(h1:t.toNat intro t A hm ht hA; have z:=V3.1 hm; rw [tPt,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only have:t.toNat=n.toNat:=le_antisymm ht z exact ⟨by rw [hA,this],fun i _=>rfl,fun s l h1 h2 _=>absurd (h1.trans_lt h2) (not_lt.2 z)⟩ | succ m ih => intro t A hm ht hA have h1:t.toNat < n.toNat:=N1 hm have e1:(t+1).toNat=t.toNat+1:=ac (ε.mpr h1) have hsc:B+t.toNat*8-g16.toNat+g16.toNat=B+t.toNat*8:=J4 (Ja (hgB.resolve_right (F6 h1).ne')) have e8:B+(t+1).toNat*8=B+t.toNat*8+8:=by rw [e1,Ϡ,n4,pA] rw [tPt,AT (by rw [ε]; exact h1)] obtain ⟨b1,b2,b3⟩:=s5tBi_inv W n ow (g16+8) t (B+t.toNat*8-g16.toNat) hB (e16.trans_le h8) hW hWs h1 _ g16 (g16*n+t) A rfl ((V1 _ 8).trans_eq e16.symm) (s5tPt8_inv_h1 n g16 t _ hB h8 h1) (hA.trans hsc.symm) obtain ⟨r1,r2,r3⟩:=ih (t+1) _ (by rw[e1,←D8,hm,BK]) (by rw [e1]; exact h1) (by rw [b1,e16,e8, ← pA,hsc]) refine ⟨r1,fun i hi=>(r2 i (e8 ▸ U1 hi (V1 _ _))).trans (b2 i (hsc.symm ▸ hi)),fun s l hs1 hs2 hl => ?_⟩ rcases Z7 t.toNat s with hs | hs · exact r3 s l (by rw [e1]; exact hs) hs2 hl · have se:s=t.toNat:=le_antisymm hs hs1 subst se have:=b3 (g16.toNat+l) (V1 _ _) (by rw[e16]; exact O1 hl _) rw [← pA,hsc] at this exact (r2 _ (by rw [e8]; exact O1 hl _)).trans this theorem s5tPg8_inv (W:Ἂ ἇ)(n ow G:Ἄ) (hB:(ow.toNat+16)*n.toNat<2^(31:Ἀ))(hO:ow.toNat+16<2^(31:Ἀ))(hW:ow.toNat*n.toNat≤W.size)(hWs:W.size<2^(32:Ἀ))(hG:8*G.toNat≤ow.toNat+7) : ∀ m (gi:Ἄ)(A:ἀ),G.toNat-gi.toNat=m → gi.toNat≤G.toNat → A.size=8*gi.toNat*n.toNat → let R:=tPg8 W n ow G gi A R.size=8*G.toNat*n.toNat∧(∀ i<8*gi.toNat*n.toNat,R.data[i]! = A.data[i]!) ∧ (∀ g s l,gi.toNat ≤ g → g < G.toNat → s < n.toNat → l < 8 → R.data[8*g*n.toNat+s*8+l]! = if 8*g+l < ow.toNat then dw W[(8*g+l)*n.toNat+s]! else 0):=by intro m; induction m with | zero => intro gi A hm hgi hA; have z:=V3.1 hm; rw [tPg8,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only have:gi.toNat=G.toNat:=le_antisymm hgi z exact ⟨by rw [hA,this],fun i _=>rfl,fun g s l h1 h2 _ _=>absurd (h1.trans_lt h2) (not_lt.2 z)⟩ | succ m ih => intro gi A hm hgi hA have h1:gi.toNat < G.toNat:=N1 hm have e1:(gi+1).toNat=gi.toNat+1:=ac (ε.mpr h1) have eg:(8*gi).toNat=8*gi.toNat:=by rw [kMm _ _ (by rw[kc8]; (clear * - hO hG h1 e1;omega)),kc8] have e16:(8*gi+8)=(8*gi)+8:=rfl rw [tPg8,AT (by rw [ε]; exact h1)] obtain ⟨b1,b2,b3⟩:=s5tPt8_inv W n ow (8*gi) (8*gi.toNat*n.toNat) hB hO (by rw[eg]; (clear * - hG h1 e1;omega)) hW hWs (by rcases E9 n.toNat with h|h · exact BA h · exact pZ (by rw[eg]; exact U3 _ h)) _ 0 A rfl (by simp only [Ϧ,zero_le]) (by simp only [Ϧ,zero_mul,Av]; exact hA) simp only [Ϧ,ϳ,ϑ] at b1 b2 b3 have sz:8*gi.toNat*n.toNat+n.toNat*8=8*(gi.toNat+1)*n.toNat:=by ring obtain ⟨r1,r2,r3⟩:=ih (gi+1) _ (by rw[e1,←D8,hm,BK]) (by rw [e1]; exact h1) (by rw [b1,e1,sz]) refine ⟨r1,fun i hi=>by rw [r2 i (by rw [e1, ← sz]; exact Oh (nб*8) hi),b2 i hi],fun g s l hg1 hg2 hs hl => ?_⟩ rcases Z7 gi.toNat g with hg | hg · exact r3 g s l (by rw [e1]; exact hg) hg2 hs hl · have ge:g=gi.toNat:=le_antisymm hg hg1 subst ge rw [r2 _ (by rw [e1, ← sz]; have:=ι 8 (show s+1≤n.toNat by exact Order.add_one_le_iff.mpr hs); rw[Ϡ,n4] at this; (clear * - hs hl;omega)),b3 s l (ϟ _) hs hl,eg] theorem tPg8_n0 (W:Ἂ ἇ)(n ow G:Ἄ)(hn:n.toNat=0) : ∀ m (gi:Ἄ)(A:ἀ),G.toNat-gi.toNat=m → (tPg8 W n ow G gi A).size=A.size:=by intro m; induction m with | zero=>intro gi A hm; rw [tPg8,dite_eq_right (by rw [ε]; (clear * - hm;omega))] | succ m ih => intro gi A hm; have h1:gi.toNat < G.toNat:=by exact N1 hm rw [tPg8,AT (by rw [ε]; exact h1),ih (gi+1) _ (by rw[ac (ε.mpr h1)]; (clear * - hm h1;omega)),tPt,dite_eq_right (by rw [ε]; exact Std.Rxo.size_eq_zero_iff_not_le.mp hn)] theorem wcT8F_panel (W:Ἂ ἇ)(ow n:Nat)(hB:(ow+16)*n<2^(31:Ἀ))(hW:ow*n≤W.size)(hWs:W.size<2^(32:Ἀ)) : let WT:=(wcT8F (W,ow,n)).1 WT.size=n*(8*((ow+7)/8)) ∧ ∀ t < n, ∀ g l,l < 8 → 8*g+l < 8*((ow+7)/8) → WT.data[(g*n+t)*8+l]! = if 8*g+l < ow then dw W[(8*g+l)*n+t]! else 0:=by rcases E9 n with hO|hO · subst hO; refine ⟨?_,fun t ht=>by (clear * - ht;omega)⟩; simp only [wcT8F]; rw [tPg8_n0 _ _ _ _ (by simp only [lX,X9,Uh]) _ _ _ rfl]; simp only [ϳ]; rfl · have e1:=s5tu n (by have:=lZ n (show 0 ?_⟩ show (tPg8 W n.toUSize ow.toUSize ((ow+7)/8).toUSize 0 _).data[_]! = _ rw [show (g*n+t)*8+l=8*g*n+t*8+l by ring] exact r3 g t l (ϟ _) (by (clear * - hl hgl;omega)) ht hl theorem wcT8F_exp (W:Ἂ ἇ)(ow n:Nat)(hB:(ow+16)*n<2^(31:Ἀ))(hW:ow*n≤W.size)(hWs:W.size<2^(32:Ἀ)) : let c:=wcT8F (W,ow,n) c.2.1.size=ow∧(∀ orMu W (o*n).toUSize (o*n+n).toUSize 0) ow _ (lQ ow) rfl (by simp) (fun i h=>by simp at h) simp only [wcT8F] refine ⟨d1,fun o ho s hs => ?_,fun o ho => ?_⟩ · rw [d2 o ho] have q1:(o+1)*n ≤ ow*n:=ι _ ho have q2:=nO o n have e1:=s5tu (o*n) (by (clear * - hW hWs hs q1 q2;omega)); have e2:=s5tu (o*n+n) (by (clear * - hW hWs q1 q2;omega)) exact (s5rMu_spec W hWs _ (o*n).toUSize (o*n+n).toUSize 0 rfl (by rw [e2]; (clear * - hW q1 q2 e2;omega))).2 (o*n+s) (by rw [e1]; exact V1 (o*n) s) (by rw [e2]; exact O1 hs (o*n)) · have mem:(da (fun o=>rMu W (o*n).toUSize (o*n+n).toUSize 0) ow (lQ ow))[o]! ∈ (da (fun o=>rMu W (o*n).toUSize (o*n+n).toUSize 0) ow (lQ ow)).toList:=by rw [AB _ o (by exact B5 ho (id (Eq.symm d1)))]; exact Array.getElem_mem_toList _ rw [← Array.foldl_toList]; exact (s5fmax _ 0).2 _ mem theorem kRR_h1 (n:ℤ):(0:ℝ) < (2:ℝ)^n:=zpow_pos two_pos n theorem kRR (z:ℝ) : |ns kC z-z| ≤ (2:ℝ)^(-53:ℤ)*|z| + (2:ℝ)^(-1075:ℤ):=by by_cases hs : |z| < (2:ℝ)^(-1021:ℤ) · have h:=re z (-1021) AP hs rw [show ((-1021:ℤ)-53) = -1075+1 by decide,AK AL,zpow_one,mul_div_cancel_right₀ _ AL] at h exact h.trans (le_add_of_nonneg_left (Af (kRR_h1 _).le (Aa z))) · push_neg at hs have hz:0 < |z| := AN (kRR_h1 _) hs have h1 : |z| < (2:ℝ)^(ph 2 |z| + 1):=by have:=Ze (R:=ℝ) (b:=2) (by norm_num) |z|; simpa using this have h2:(2:ℝ)^(ph 2 |z|) ≤ |z| := by have:=He (R:=ℝ) (b:=2) (by norm_num) hz; simpa using this have h3:(-1021:ℤ) ≤ ph 2 |z| := by have:=(Int.zpow_le_iff_le_log (R:=ℝ) (b:=2) (x:=-1021) (by norm_num) hz).1 (by exact_mod_cast hs); exact this have h:=re z (ph 2 |z| + 1) (by exact Int.le_add_one h3) h1 rw [sub_eq_add_neg (ph 2 |z| + 1),add_right_comm (ph 2 |z|),AK AL,AK AL,zpow_one,mul_div_cancel_right₀ _ AL] at h exact h.trans ((AE h2 (kRR_h1 _).le).trans ((mul_comm _ _).trans_le (le_add_of_nonneg_right (kRR_h1 _).le))) theorem kRA (x y:Ἅ)(hx:fv x)(hy:fv y)(h:|rv x+rv y|<(2:ℝ)^(971:ℤ)) : fv (x+y) ∧ |rv (x+y)-(rv x+rv y)| ≤ (2:ℝ)^(-53:ℤ)*|rv x+rv y|+(2:ℝ)^(-1075:ℤ):=by have ⟨g,e⟩:=ii x y hx hy (h.le.trans (pm 971 (by norm_num))) exact ⟨g,by rw [e]; exact kRR _⟩ theorem kRM (x y:Ἅ)(hx:fv x)(hy:fv y)(h:|rv x*rv y|<=(2:ℝ)^(971:ℤ)) : fv (x*y) ∧ |rv (x*y)-(rv x*rv y)| ≤ (2:ℝ)^(-53:ℤ)*|rv x*rv y|+(2:ℝ)^(-1075:ℤ):=by have ⟨g,e⟩:=jo x y hx hy h exact ⟨g,by rw [e]; exact kRR _⟩ theorem kSR_h (A t c d e:ℝ) (hA:0 ≤ A) (ht:0 ≤ t) (htT:t ≤ 134217728) (hc:c=(1/9007199254740992+1/9444732965739290427392)*A+1/9007199254740992) (E:e ≤ 1/9007199254740992*(A+t*c)+1/1208925819614629174706176) (P:d ≤ t*c):d+e ≤ (t+1)*c:=by have k:t*c≤134217728*c:=AE htT (hc▸by positivity) linear_combination P+E+1/9007199254740992*k+66060287/633825300114114700748351602688*hA+(1/67108864-1)*hc theorem kSR (p:ℕ→Ἅ)(z:ℕ→ℝ)(c0 A:ℝ)(n:ℕ)(hn:n≤134217728) (hp:∀ tAa _)) hA generalize hc':(1/9007199254740992+1/9444732965739290427392)*A+1/9007199254740992=c have hc:=hc'.symm have hc0:0 ≤ c:=by rw [hc]; exact add_nonneg (Af (by norm_num) hA0) (by norm_num) intro m; induction m with | zero => intro t a D Q e o; obtain rfl:t=n:=C4 Q (V3.1 D) rw [ao,AC (AX _)]; exact ⟨e,o⟩ | succ m G => intro t a D Q e o have ht:t < n:=N1 D rw [ao,AD ht] obtain ⟨fp,rp⟩:=hp t ht have hS : |c0 + ∑ s∈kP (t+1),z s| ≤ A:=by refine AZ ?_ hA refine (Ag _ _).trans (add_le_add AP ((Z9 _ _).trans ?_)) exact Finset.sum_le_sum_of_subset_of_nonneg (fun x hx=>ϥ.2 (AN (ϥ.1 hx) ht)) (fun _ _ _=>Aa _) have hsucc:c0 + ∑ s∈kP (t+1),z s=(c0 + ∑ s∈kP t,z s)+z t:=by rw [Ν]; ring have htT:(t:ℝ) ≤ 134217728:=by exact_mod_cast (I3 ht).trans hn have htc:(t:ℝ)*c ≤ 134217728*c:=AE htT hc0 rw [hsucc] at hS have hy : |rv a+rv (p t)| ≤ A+t*c:=by rw [rp,show rv a+z t=(rv a-(c0 + ∑ s∈kP t,z s))+((c0 + ∑ s∈kP t,z s)+z t) by ring,add_comm A] exact (Ag _ _).trans (add_le_add o hS) have h971:A+t*c < (2:ℝ)^(971:ℤ):=by have e1:(2:ℝ)^(971:ℤ)=2^(960:ℤ)*2^(11:ℤ):=AK AL 960 11 have e3:(1:ℝ) ≤ 2^(960:ℤ):=one_le_zpow₀ one_le_two (by decide) have e4:(2:ℝ)^(11:ℤ)=2048:=by norm_num rw [e1,e4]; generalize (2:ℝ)^(960:ℤ)=X at hA2 e3 ⊢; linarith only [htc,hc,hA2,e3,hA0] obtain ⟨f2,r2⟩:=kRA a (p t) e fp (AO hy h971) refine G (t+1) _ (by rw [W4,D,BK]) ht f2 ?_ have e53:(2:ℝ)^(-53:ℤ)=1/9007199254740992:=by norm_num [zpow_neg] have e80:(2:ℝ)^(-80:ℤ)=1/1208925819614629174706176:=by norm_num [zpow_neg] have e75:(2:ℝ)^(-1075:ℤ) ≤ 1/1208925819614629174706176 := e80 ▸ AG one_le_two (by norm_num) rw [e53] at r2 have E : |rv (a+p t)-(rv a+rv (p t))| ≤ 1/9007199254740992*(A+t*c)+1/1208925819614629174706176 := r2.trans (add_le_add (mul_le_mul_of_nonneg_left hy (one_div_nonneg.2 (by norm_num))) e75) have:=(add_comm _ _).trans_le (kSR_h A t c _ _ hA0 (C3 _) htT hc E o) rw [X7,hsucc, ← rp] refine (abs_sub_le _ (rv a+rv (p t)) _).trans ?_ rw [add_sub_add_right_eq_sub]; exact this theorem kMsk (w:ἇ):kB (w&&&0x7FFFFFFF)=kB w∧kG (w&&&0x7FFFFFFF)=kG w∧sv (w&&&0x7FFFFFFF) = |sv w| := by have hs:k9 (w&&&0x7FFFFFFF)=false:=by unfold k9; rw [Vk,show (0x7FFFFFFF&&&0x80000000:ἇ)=0 by decide,UInt32.and_zero]; decide have he:kB (w&&&0x7FFFFFFF)=kB w:=by unfold kB; apply Β.1; rw [Ξ,Ξ,Υ,Υ,Ξ] simp only [β] rw [show (0x7FFFFFFF:ἇ).toNat=2^(31:Ἀ)-1 by decide,ζ,show (0xFF:ἇ).toNat=2^(8:Ἀ)-1 by decide,ζ,ζ] simp only [nr,kN,kH]; (clear * -;omega) have hf:lK (w&&&0x7FFFFFFF)=lK w:=by unfold lK; rw [Vk,show (0x7FFFFFFF&&&0x7FFFFF:ἇ)=0x7FFFFF by decide] have hm:kM (w&&&0x7FFFFFFF)=kM w:=by unfold kM; rw [he,hf] refine ⟨he,by unfold kG; rw [he],?_⟩ unfold sv; rw [hs,hm]; simp only [υ,ἂ]; by_cases h:k9 w=true <;> simp [h] lemma mV53(u:ἆ)(n:Ἀ)(d:(lq u)=n)(e:n<2^(53:Ἀ)): fv u.toInt64.toFloat/\rv u.toInt64.toFloat=(n:Ἁ):=by have:(B6 u.toInt64)=n:=by rw[show (B6 u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [Qt,nr];exact D7 e) theorem kCE (F a:Ἅ)(hZ:fv (F*a)) : |rv (F*a)| < (2:ℝ)^(((cEq F a).toNat:ℤ)+56)∧(cEq F a).toNat ≤ 969:=by have h:=fK (F*a) hZ have hb:(eF (F*a).toBits).toNat < 2048:=by unfold eF; rw [Ε]; exact AO ϝ (by decide) unfold cEq; dsimp only split · rename_i hc have hc':1078 < (eF (F*a).toBits).toNat:=by rw [μ] at hc; simpa using hc have e:(eF (F*a).toBits-1078).toNat=(eF (F*a).toBits).toNat-1078:=by rw [χ _ _ (Yw hc)]; rfl rw [e] refine ⟨?_,by (clear * - hb hc';omega)⟩ have:((((eF (F*a).toBits).toNat-1078:ℕ)):ℤ)+56=(((eF (F*a).toBits).toNat:ℕ):ℤ)-1022:=by (clear * - hb hc';omega) rw [this]; exact h · rename_i hc have hc':(eF (F*a).toBits).toNat ≤ 1078:=by rw [μ] at hc; simp at hc; (clear * - hc;omega) refine ⟨AN h (AG (by norm_num) (by simp; exact V4 hc)),by simp⟩ theorem kWinR (nn T Λ lf zr B S M X P Hb H Ib R v:ℝ) (hn1:1 ≤ nn) (hnT:nn+2 ≤ T) (hT:T ≤ 134217728) (hT4:4 ≤ T) (hΛ0:0 ≤ Λ) (hΛ : |lf-Λ| ≤ nn*((1/9007199254740992+1/9444732965739290427392)*Λ+1/9007199254740992)) (hv0:0 ≤ v) (hv:v ≤ 1/1208925819614629174706176) (hZ : |zr-(9*(nn+1))*lf| ≤ 1/9007199254740992*|(9*(nn+1))*lf| + v) (hZb : |zr| < X) (hX:72057594037927936 ≤ X) (hB0:0 ≤ B) (hB:B*2 ≤ Ib) (hS0:0 ≤ S) (hS:S ≤ M*Λ) (hM:0 ≤ M) (hMX:M*X=P*72057594037927936) (hTI:T*Ib=Hb*1125899906842624) (hHP:P ≤ H) (hHb:Hb ≤ H) (hHbig:21267647932558653966460912964485513216*T ≤ Hb) (hR1:P*9007199254740992 ≤ R) (hR2:Ib*4 ≤ R) : nn*((1/9007199254740992+1/9444732965739290427392)*(B+S)+1/9007199254740992) ≤ H ∧ B+S+H ≤ H*4503599627370496∧B+S ≤ R:=by have hnn0:=zero_le_one.trans hn1 have hnT':nn ≤ T:=by linear_combination hnT have h27:=hnT'.trans hT have hT0:=hnn0.trans hnT' have hW0:(0:ℝ) ≤ 9*(nn+1):=Af (T6 _) (add_nonneg hnn0 zero_le_one) have G:=(le_abs_self _).trans ((Aw Λ lf).trans_le (hΛ.trans (AE h27 (add_nonneg (Af (by norm_num) hΛ0) (by norm_num))))) have A:=(sub_le_iff_le_add'.1 (AY _ zr)).trans (add_le_add hZb.le (((Aw _ zr).trans_le hZ).trans (add_le_add_right hv _))) have F1:9*(nn+1)*Λ ≤ X*(1+1/8388608):=by have w:=mul_le_mul_of_nonneg_left (add_le_add_left h27 1) (T6 9) generalize 9*(nn+1)=W at hW0 w A ⊢ linear_combination (70368744177664/70368743129087:ℝ)*(mul_le_mul_of_nonneg_left G hW0+le_abs_self (W*lf))+(633825300114114700748351602688/633825290669372657441063305217:ℝ)*A+(1048576/70368743129087:ℝ)*w+(554597052006948792370591694849/5316911903911424829191363170649767936:ℝ)*hX have F3:9*(nn+1)*S ≤ P*72057594037927936*(1+1/8388608):=(mul_le_mul_of_nonneg_left hS hW0).trans ((mul_left_comm _ _ _).trans_le ((mul_le_mul_of_nonneg_left F1 hM).trans_eq (by rw [← Ap,hMX]))) have TB:=(mul_le_mul_of_nonneg_left hB hT0).trans hTI.le have b2:=Af hB0 zero_le_two have hH1:=(Oi.trans hT4).trans ((le_mul_of_one_le_left hT0 Oi).trans (hHbig.trans hHb)) have Q:=(AE (mul_le_mul_of_nonneg_left (add_le_add_left hn1 1) (T6 9)) hS0).trans F3 have B8:=(AE hB zero_le_four).trans hR2 refine ⟨?_,?_,?_⟩ · linear_combination (1048577/18889465931478580854784:ℝ)*((AE hnT' b2).trans TB)+(1048577/85002596691653613846528:ℝ)*F3+(1048577/9444732965739290427392:ℝ)*hS0+(1/9007199254740992:ℝ)*h27+(2932034153131/3298534883328:ℝ)*hHP+(1048577/16777216:ℝ)*hHb+(160342103381/3298534883328:ℝ)*hH1 · linear_combination (1/8:ℝ)*((AE hT4 b2).trans TB)+(1/18:ℝ)*Q+(12009600437977088/3:ℝ)*hHP+(140737488355328:ℝ)*hHb+(1078985979068413/3:ℝ)*hH1 · linear_combination (1/8:ℝ)*B8+(1/18:ℝ)*Q+(2796203/6291456:ℝ)*hR1+(2708821/6291456:ℝ)*((Af b2 zero_le_four).trans B8) theorem kZ0:fv (0:Ἅ)∧rv (0:Ἅ)=0:=by refine ⟨by rw [fO]; rfl,?_⟩ rw [iL,show (0:Ἅ).toModel.unpack = .zero .positive from rfl]; simp [lw,Model.unpackedToDyadic?] theorem kTB2 (w:Ἃ) (F E:ℕ) (K:idxOf w ≤ F) (al:174+F ≤ E) : |(tm ld w:ℝ)| * 2 ≤ 2^E:=by have h:(tm ld w).natAbs*2 ≤ 2^E:=by rw [tm,Ϩ,Ϩ,Gs,(by decide:(sv ld).natAbs=2^23),(by decide:idxOf ld=126)] refine J2 (ι 2 (ϧ (X3 _ (bg w).le) (Θ (n:=2) (by decide) (J1 K 126)))) ?_ rw [← m7, ← m7, ← Hy] exact Θ (by decide) (by (clear * - al;omega)) rw [← mI,Ϲ,P5] exact_mod_cast h theorem kTW (x w:Ἃ) (e:ℕ) (hw:(kB w).toNat ≤ e) : |(tm x w:ℝ)| ≤ (|(sv x:ℝ)| * 2^(kG x))*2^(max e 56+23):=by have a : |(sv w:ℝ)| ≤ 2^24:=by have:=bg w; rw [← mI,Ϲ]; exact_mod_cast this.le have b:24+kG w ≤ max e 56+23:=by rw [aT]; (clear * - hw;omega) have e1:(tm x w:ℝ)=(sv x:ℝ)*2^(kG x)*((sv w:ℝ)*2^(kG w)):=by unfold tm; push_cast; ring rw [e1,Ae,Ae,Ae,AW (by positivity:(0:ℝ) < 2^kG x),AW (by positivity:(0:ℝ) < 2^kG w)] refine mul_le_mul_of_nonneg_left ?_ (by positivity) calc |(sv w:ℝ)| * 2^kG w ≤ 2^(24:Ἀ)*2^kG w:=AE a (by positivity) _=2^(24+kG w):=by rw [AF] _ ≤ 2^(max e 56+23):=AU (by norm_num) b theorem kL1 (n:ℕ)(l:ℕ→Ἃ)(Lf:Ἅ)(A:∀ sdw (l k&&&0x7FFFFFFF)) n 0 0) : fv Lf ∧ |rv Lf - ∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s))| ≤ n*((1/9007199254740992+1/9444732965739290427392)*(∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s)))+1/9007199254740992) ∧ ∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s)) ≤ 2^(304:Ἀ) ∧ |rv Lf| ≤ 2^(306:Ἀ):=by have A' : ∀ s < n,(kB (l s)).toNat≠255:=fun s hs h=>A s hs (Β.1 (by rw [h]; rfl)) have Hl : ∀ s < n,fv (dw (l s&&&0x7FFFFFFF))∧rv (dw (l s&&&0x7FFFFFFF)) = |(sv (l s):ℝ)| * 2^(kG (l s)):=by intro s hs; obtain ⟨m1,m2,m3⟩:=kMsk (l s) have:=cI (l s&&&0x7FFFFFFF) (by rw [m1]; exact A s hs) exact ⟨this.1,by rw [this.2,m2,m3,mI]⟩ have hcast : ∀ s, |(sv (l s):ℝ)| * 2^(kG (l s))=(((sv (l s)).natAbs*2^(kG (l s)):ℕ):ℝ):=fun s=>by rw [← mI,Ϲ,P5,G4,B4,nZ] have hS : ∑ s∈kP n,(sv (l s)).natAbs*2^(kG (l s)) ≤ 2^(304:Ἀ):=by refine (Ql _ _ (2^(277:Ἀ)) fun s hs => ?_).trans ?_ · exact (ϧ (bg (l s)).le (Θ Vx ((aT (l s)).trans_le (O9 (U2 (W5 (U2 (bm (l s))) (A' s (ϥ.1 hs)))))))).trans_eq (m7 2 24 253).symm · rw [Xy,smul_eq_mul]; exact (ι _ hn27).trans_eq (m7 2 27 277).symm have hnR:(n:ℝ) ≤ 134217728:=N5.2 hn27 have hΛS:((∑ s∈kP n,(sv (l s)).natAbs*2^(kG (l s)):ℕ):ℝ) = ∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s)):=by rw [Nat.cast_sum]; exact ϔ rfl fun s _=>(hcast s).symm generalize hΛ : ∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s))=Λ at hΛS ⊢ have hΛ0:0 ≤ Λ:=hΛS ▸ C3 _ have hΛb:Λ ≤ 2^(304:Ἀ):=hΛS ▸ (N5.2 hS).trans_eq (by rw [B4,nZ]) have h304:(2:ℝ)^(304:Ἀ) ≤ (2:ℝ)^(960:ℤ):=by rw [← AA]; exact AG one_le_two (by decide) have RL:=kSR (fun k=>dw (l k&&&0x7FFFFFFF)) (fun s => |(sv (l s):ℝ)| * 2^(kG (l s))) 0 Λ n hn27 Hl (by rw [A5,Ai, ← hΛ]; exact (ϔ rfl (fun s _=>by rw [hcast s,nE])).le) (hΛb.trans h304) n 0 0 (pQ n) (ϟ _) kZ0.1 (by rw [kZ0.2,I7,A9,zero_mul,Av,sub_self,A5]) rw [← hL,hΛ,Ai] at RL refine ⟨RL.1,RL.2,hΛb,?_⟩ have t:=AY (rv Lf) Λ rw [Ad hΛ0] at t have X1:(1:ℝ) ≤ 2^(304:Ἀ):=(pow_zero (2:ℝ)).symm.trans_le (AU one_le_two (ϟ _)) rw [A4 (2:ℝ) 305,A4 (2:ℝ) 304] linear_combination t.trans (RL.2.trans (AE hnR (add_nonneg (Af (by positivity) hΛ0) (by positivity))))+(70368745226241/70368744177664:ℝ)*hΛb+(211106231484415/70368744177664:ℝ)*X1 theorem kZq (n:ℕ)(Lf:Ἅ)(hn27:n ≤ 134217728)(hf:fv Lf)(hb:|rv Lf| ≤ 2^(306:Ἀ)) : fv ((I0 (9*(n+1))).toInt64.toFloat*Lf) ∧ |rv ((I0 (9*(n+1))).toInt64.toFloat*Lf)-(9*((n:ℝ)+1))*rv Lf| ≤ 1/9007199254740992*|(9*((n:ℝ)+1))*rv Lf| + (2:ℝ)^(-1075:ℤ) ∧ |rv ((I0 (9*(n+1))).toInt64.toFloat*Lf)| < (2:ℝ)^((cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat+56) ∧ (cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat ≤ 969 := have a:=X3 9 (C9 hn27) have FN:=mV53 (I0 (9*(n+1))) (9*(n+1)) (kOfS _ (a.trans_lt (by decide))) (a.trans_lt (by decide)) have e:((9*(n+1):ℕ):ℝ)=9*((n:ℝ)+1):=(G4 _ _).trans (congrArg₂ (·*·) nZ (X7 n)) have hFn:=FN.2.trans ((P5 _).trans e) have Zr:=kRM _ Lf FN.1 hf (((Ae _ _).trans (congrArg (·*|rv Lf|) ((congrArg abs hFn).trans (Ad ((C3 _).trans_eq e))))).trans_le ((mul_le_mul (e.symm.trans_le (((N5 (α:=ℝ)).mpr (a.trans (by decide))).trans_eq ((B4 2 31).trans (congrArg (·^31) nZ)))) hb (Aa _) (pow_nonneg zero_le_two 31)).trans ((AF (2:ℝ) 31 306).symm.trans_le ((AA (2:ℝ) (31+306)).symm.trans_le (AG one_le_two (by decide)))))) have CE:=kCE _ Lf Zr.1 ⟨Zr.1,hFn▸(by norm_num [zpow_neg]:(2:ℝ)^(-53:ℤ)=1/9007199254740992)▸Zr.2,CE.1.trans_eq ((congrArg (HPow.hPow (2:ℝ)) (K5 _ 56).symm).trans (AA _ _)),CE.2⟩ theorem kWinS (n L ib e c:ℕ) (Λ lf zr B Sm:ℝ) (hn:0dw (l k&&&0x7FFFFFFF)) n 0 0) (hc: max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat ≤ 372) : aG (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!) ∧ fv (ao p n 0 (dw ld*dw b[j]!)) ∧ |rv (ao p n 0 (dw ld*dw b[j]!))-(af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((max (ib+L-50) (max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat)):ℕ):ℤ) ∧ |(af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv (ao p n 0 (dw ld*dw b[j]!))| ≤ (2:ℝ)^(((max (ib+L-50) (max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat))+52:ℕ):ℤ):=by have hL2:2 ≤ L:=V4 fun hl=>absurd (Xn (Hn.trans (Θ Vx (U2 hl)):n+2 ≤ 0+2)) (Qh hn) have hn27:n ≤ 134217728:=(V1 n 2).trans (Hn.trans (Θ Vx r)) obtain ⟨R1,R2,R3,R4⟩:=kL1 n l Lf A hn27 hL obtain ⟨Z1,Z2,Z3, -⟩:=kZq n Lf hn27 R1 R4 have Ew : ∀ s < n,kB W[j*n+s]! ≠ 255:=fun s hs h'=>absurd (hw s hs) (h' ▸ Qh he) have hT:=Z9 (fun s=>(tm (l s) W[j*n+s]!:ℝ)) (kP n) generalize hSm : ∑ s∈kP n, |(tm (l s) W[j*n+s]!:ℝ)| = Sm at hT have hS0:0 ≤ Sm:=(Aa _).trans hT have hSM:Sm ≤ 2^(max e 56+23) * ∑ s∈kP n, |(sv (l s):ℝ)| * 2^(kG (l s)):=by rw [← hSm,Gv]; exact Xx (fun s hs=>(kTW _ _ e (hw s (ϥ.1 hs))).trans_eq (mul_comm _ _)) have hΛ0:=nonneg_of_mul_nonneg_right (hS0.trans hSM) (pow_pos (by norm_num) _) have Wn:=kWinS n L ib e _ _ _ _ _ Sm hn Hn r S (Nat.le_of_add_right_le al) hL2 hc hΛ0 R2 Z2 Z3 (Aa _) (kTB2 _ H ib K.2 al) hS0 hSM have hld:kB ld≠255:=by decide have hd:=dJ ld b[j]! hld K.1 have RV:=kSR p (fun s=>(tm (l s) W[j*n+s]!:ℝ)) (tm ld b[j]!:ℝ) (|(tm ld b[j]!:ℝ)|+Sm) n hn27 hp (by rw [hSm]) (Wn.2.2.trans ((AU (by norm_num) (K3 rfl:425 ≤ 960)).trans_eq (AA (2:ℝ) 960).symm)) n 0 _ (pQ n) (ϟ _) hd.1 (by rw [hd.2,I7,Av,sub_self,A5,A9,zero_mul]) have hAF:(af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)=(tm ld b[j]!:ℝ) + ∑ s∈kP n,(tm (l s) W[j*n+s]!:ℝ):=by rw [aK,Qj,af,Jg,add_comm,AC (AX n),AC (AX n)] exact congrArg _ (ϔ rfl (fun s hs=>have h:=ϥ.1 hs; congrArg₂ (fun a b=>((tm a b:ℤ):ℝ)) (AD h) (AD h))) have hsum:=(Ag (tm ld b[j]!:ℝ) _).trans (add_le_add AP hT) rw [hAF] refine ⟨?_,RV.1,?_,?_,?_⟩ · intro k hk; by_cases hkn:k < n · simp only [AD hkn]; exact ⟨A k hkn,Ew k hkn⟩ · simp only [AC hkn]; exact ⟨hld,K.1⟩ · exact (RV.2.trans Wn.1).trans_eq (AA _ _).symm · exact (hsum.trans Wn.2.2).trans_eq (AA (2:ℝ) 425).symm · rw [AA,AF,show (2:ℝ)^(52:Ἀ)=4503599627370496 by norm_num] exact ((sub_le_iff_le_add'.1 (AY _ _)).trans (add_le_add hsum (RV.2.trans Wn.1))).trans Wn.2.1 theorem kAD2 (n:ℕ) (relu:Ἆ) (X W b:Ἂ Ἃ) (xo o:ℕ) : aD n relu X W b xo 1 o=act relu (dotOf (n+1) (fun t=>if t < n then X[xo+t]! else oneW) (fun t=>if t < n then W[o*n+t]! else b[o]!)):=by unfold aD; rw [bO]; simp only [ϻ,ϻ] theorem kZQ2 (v:Ἅ)(e cq hb:ἆ)(relu:Ἆ)(n:ℕ)(D Wf:ℕ→Ἃ)(Fb:Ἃ)(hfb:Fb=p8 relu (ms (n+1) D Wf)) (hw:∀ p:ἆ,p=(if e<(56:ἆ) then (56:ἆ) else e)+cq → e<(255:ἆ) → p ≤ (372:ἆ) → aG (n+1) D Wf∧fv v ∧ |rv v-(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^(((if hb>p then hb else p).toNat:ℕ):ℤ) ∧ |(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if hb>p then hb else p).toNat)+52:ℕ):ℤ)∧(if hb>p then hb else p).toNat ≤ 600) : (if zq2 v e relu cq hb==(0xFFFFFFFF:Ἃ) then Fb else zq2 v e relu cq hb)=p8 relu (ms (n+1) D Wf):=by unfold zq2; dsimp only generalize hp:(if e<(56:ἆ) then (56:ἆ) else e)+cq=p by_cases W:e < 255∧p ≤ 372 · obtain ⟨g,fv1,b1,b2,_,b6⟩:=hw p hp.symm W.1 W.2 have cT:(decide (e < 255)&&decide (p ≤ 372))=true:=by simp [W.1,W.2] simp only [cT,ἁ] generalize hP:(if hb>p then hb else p)=P at b1 b6 ⊢ by_cases hc:ak v P < (4294967296:ἆ) · have R:=cw (n+1) D Wf g v fv1 P (by (clear * - b6;omega)) b1 b2 hc rw [AD hc,kReluW relu _ (kAkF v P hc),R] by_cases hf:p8 relu (ms (n+1) D Wf)=0xFFFFFFFF · rw [hf]; simp only [Az,ἁ]; rw [hfb,hf] · have hn:(p8 relu (ms (n+1) D Wf)==0xFFFFFFFF)=false:=by simpa using hf simp only [hn,υ,ἂ] · simp only [AC hc,Az,ἁ]; exact hfb · have cF:(decide (e < 255)&&decide (p ≤ 372))=false:=Gw.2 ((not_and_or.1 W).imp decide_eq_false decide_eq_false) simp only [cF,υ,ἂ,Az,ἁ]; exact hfb theorem kSQ2 (relu:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix ib L H:ℕ)(Y Q:ἀ)(vo rn j:ℕ)(hh:ἆ)(v:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(hbF:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ ib)(Hn:n+2 ≤ 2^L)(x:L≤27)(z:ib+L≤425) (hEv:∀ sY.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (hw:(E[j]!).toUInt64 < 255 → hh ≤ 372 → aG (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^((hh.toNat:ℕ):ℤ) ∧ |(af (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ)) : sQ2 relu n X W b E ix ib L Y Q vo rn j hh v=p8 relu (ms (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)):=by have hp : ∀ k < n,kB W[j*n+k]! ≠ 255 → fv ((fun s=>Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) k) ∧ rv ((fun s=>Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) k)=tm ((fun s=>X[rn+s]!) k) W[j*n+k]! := by intro k hk h; simp only; rw [hYv k hk,hQv k hk]; exact dJ _ _ (F _).1 h have hp' : ∀ k < n,kB W[j*n+k]! ≠ 255 → fv ((fun s=>Y.get! (vo+s)*Q.get! (j/8*n*8+j%8+8*s)) k) ∧ rv ((fun s=>Y.get! (vo+s)*Q.get! (j/8*n*8+j%8+8*s)) k)=tm ((fun s=>X[rn+s]!) k) W[j*n+k]! := by intro k hk h; simp only [gg]; rw [hYv k hk,hQv k hk]; exact dJ _ _ (F _).1 h have G:=kGB1T relu n n j (fun s=>X[rn+s]!) W b (fun k=>k) (fun s=>Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) (fun s=>Y.get! (vo+s)*Q.get! (j/8*n*8+j%8+8*s)) E[j]! ix ib L H (fun _=>aD n relu X W b rn 1 j) (fun s _=>F _) hEv (hbF j) M Hn x z AP (fun k hk=>hk) (fun _ _ h1 _=>h1) (fun s hs h=>absurd rfl (h s hs)) hp hp' (kAD2 _ _ _ _ _ _ _) rw [← hv] at G unfold sQ2; dsimp only simp only [sTQ_eq] split · rename_i hg simp only [Η,AJ] at hg obtain ⟨g,fv1,b1,b2⟩:=hw hg.1 hg.2 by_cases RZ:(relu&&(v.toBits>>>63!=0)&&hh+1024<=eF v.toBits)=true · unfold tf; rw [AD RZ] exact kTF0 relu (n+1) _ _ g v fv1 hh (by have:=θ.1 hg.2; simp at this; (clear * - this;omega)) b1 RZ unfold tf; rw [AC RZ]; dsimp only; split · rename_i hk rw [cw (n+1) _ _ g v fv1 hh (by have:=θ.1 hg.2; simp at this; (clear * - this;omega)) b1 b2 hk] · exact G · exact G theorem kCEb (F a:Ἅ):(cEq F a).toNat ≤ 969:=by have hb:(eF (F*a).toBits).toNat < 2048:=by unfold eF; rw [Ε]; exact AO ϝ (by decide) unfold cEq; dsimp only; split · rename_i hc rw [χ _ _ (Yw hc)]; simp only [kA,tsub_le_iff_right,Xo,ge_iff_le]; exact U2 hb · simp only [ϋ,zero_le] theorem kOutW_h1 (e c:ἆ) (h:e.toNat < 255) (hc:c.toNat ≤ 969) : ((if e < (56:ἆ) then (56:ἆ) else e)+(23+c)).toNat=max e.toNat 56+23+c.toNat:=by have q:(23+c).toNat=23+c.toNat:=γ (C0 (J1 hc 23) (by decide)) have m:(if e < (56:ἆ) then (56:ἆ) else e).toNat=max e.toNat 56:=by by_cases g:e < (56:ἆ) · rw [AD g]; exact (Qm (I3 (show e.toNat < 56 from g))).symm · rw [AC g]; exact (Qv (V4 (show ¬ e.toNat < 56 from g))).symm rw [η,m,q, ← pA] exact γ (C0 (M3 (L1 (Zg.2 ⟨I3 h,by decide⟩) 23) hc) (by decide)) theorem kOutW_h2 (a b:ἆ):(if a > b then a else b).toNat=max a.toNat b.toNat:=by by_cases g:a > b · rw [AD g]; exact (Qv (I3 (show b.toNat < a.toNat from g))).symm · rw [AC g]; exact (Qm (V4 (show ¬ b.toNat < a.toNat from g))).symm theorem kOutW (n:ℕ)(X W b E:Ἂ Ἃ)(ix ib L H:ℕ)(Y Q:ἀ)(vo rn j:ℕ)(cq hb p:ἆ)(v Lf:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(hbF:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ ib)(Hn:n+2 ≤ 2^L)(x:L≤27)(z:ib+L≤425)(hn:0Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (hLf:Lf=ao (fun k=>dw (X[rn+k]! &&& 0x7FFFFFFF)) n 0 0) (hcq:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat Lf) (hhb:hb=(ib+L-50).toUInt64) (hp:p=(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) (he:(E[j]!).toUInt64 < 255) (hp372:p ≤ 372) : aG (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((if hb>p then hb else p).toNat:ℕ):ℤ) ∧ |(af (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if hb>p then hb else p).toNat)+52:ℕ):ℤ)∧(if hb>p then hb else p).toNat ≤ 600:=by have eN:=kE64 E[j]! have c:=kCEb (I0 (9*(n+1))).toInt64.toFloat Lf generalize hcc:(cEq (I0 (9*(n+1))).toInt64.toFloat Lf)=cc at hcq c have e:(E[j]!).toNat < 255:=he have tp:p.toNat=max (E[j]!).toNat 56+23+cc.toNat:=by rw [hp,hcq]; exact kOutW_h1 _ _ e c have hk:max (E[j]!).toNat 56+23+cc.toNat ≤ 372:=tp ▸ hp372 have Wn:=kWin n (fun s=>X[rn+s]!) W b j (E[j]!).toNat ib L H (fun s=>Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) Lf (fun s _=>(F _).1) hEv e (hbF j) M Hn x z hn (fun s hs=>by rw [hYv s hs,hQv s hs]; exact dJ _ _ (F _).1 (fun h'=>absurd (hEv s hs) (h' ▸ Qh e))) hLf (hcc ▸ hk) rw [hcc] at Wn rw [kOutW_h2,hhb,kOfS _ (C0 (J2 (Y4 _ _) z) (by decide)),tp,hv] exact ⟨Wn.1,Wn.2.1,Wn.2.2.1,Wn.2.2.2.1,Wn.2.2.2.2,Zg.2 ⟨J2 (Y4 _ _) (J2 z (by decide)),J2 hk (by decide)⟩⟩ theorem kOut (relu:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix ib L H:ℕ)(Y Q:ἀ)(vo rn j:ℕ)(cq hb:ἆ)(v Lf:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(hbF:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ ib)(Hn:n+2 ≤ 2^L)(x:L≤27)(z:ib+L≤425)(hn:0Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (hLf:Lf=ao (fun k=>dw (X[rn+k]! &&& 0x7FFFFFFF)) n 0 0) (hcq:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat Lf) (hhb:hb=(ib+L-50).toUInt64) : (if zq2 v (E[j]!).toUInt64 relu cq hb==(0xFFFFFFFF:Ἃ) then sQ2 relu n X W b E ix ib L Y Q vo rn j (if hb > (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq then hb else (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) v else zq2 v (E[j]!).toUInt64 relu cq hb) = p8 relu (ms (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)):=by refine kZQ2 v _ cq hb relu n _ _ _ ?_ (fun p hp he hp372=>kOutW n X W b E ix ib L H Y Q vo rn j cq hb p v Lf F hbF M Hn x z hn hEv hYv hQv hv hLf hcq hhb hp he hp372) refine kSQ2 relu n X W b E ix ib L H Y Q vo rn j _ v F hbF M Hn x z hEv hYv hQv hv (fun he hh => ?_) have hle:(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq ≤ 372:=by refine ϗ ?_ hh generalize (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq=a split · exact Yw (by assumption) · exact Pf _ have:=kOutW n X W b E ix ib L H Y Q vo rn j cq hb _ v Lf F hbF M Hn x z hn hEv hYv hQv hv hLf hcq hhb rfl he hle exact ⟨this.1,this.2.1,this.2.2.1,this.2.2.2.1⟩ theorem kFS (Y:ἀ)(i:Ἄ)(v:Ἅ)(h:(J0 i)<(kS Y))(q:ℕ):(Y.uset i v h).data[q]! = if (J0 i)=q then v else Y.data[q]! := by by_cases hq:q < (kS Y) · exact fuS Y i v h q hq · have:(J0 i)≠q:=by omega rw [AC this]; cases Y; simp only [FloatArray.uset,kS] at hq h ⊢ rw [An _ _ (by simp only [pP,Qd,not_lt]; exact V4 hq),An _ _ (by exact Not.imp hq fun a=>a)] theorem dRw_spec (X:Ἂ ἇ)(i n o:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)) : ∀ m (k:Ἄ)(Y:ἀ)(a:Ἅ)(hY:(J0 o)+(J0 n)<(kS Y)),(J0 n)-(J0 k)=m → (J0 k) ≤ (J0 n) → ∀ q, (dRw X i n o k Y a hX hY hB).data[q]! = if q=(J0 o)+(J0 n) then ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 k) a else if (J0 o)+(J0 k) ≤ q∧q < (J0 o)+(J0 n) then dw X[(J0 i)+(q-(J0 o))]! else Y.data[q]! := by intro m; induction m with | zero => intro k Y a hY hm hk q have e:=P4 hm rw[dRw,dite_eq_right (mt ε.mp (O3.mpr e)),kFS,kSm o n hB.2,ao,AC (O3.mpr e),AC (fun(g:_∧_)=>O3.mpr (J2 (J1 e _) g.1) g.2)] exact ite_cond_congr (propext eq_comm) | succ m ih => intro k Y a hY hm hk q have h1:=N1 hm have h2:=ac (ε.mpr h1) rw[ao,AD h1,dRw,AT (ε.mpr h1)]; dsimp only rw[ih (k+1) _ _ _ (by rw[h2,← D8,hm,BK]) (by rw[h2]; exact h1) q,h2,kFS,kSm o k (I4 (O1 h1 _) hB.2),kXU _ _ _ _ (kSm i k (I4 (O1 h1 _) hB.1)),kAbsDw] refine congrArg (ite _ _) ?_ by_cases g2:oб+(kб+1)≤q∧qg2 ⟨W5 g.1 g3,g.2⟩)] theorem dRw8_spec (X:Ἂ ἇ)(i n r:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(hB:(J0 i)+(J0 n)<2^31/\8*(J0 n)+7<2^31)(hr:(J0 r)<8) : ∀ m (k:Ἄ)(Y:ἀ)(a:Ἅ)(hY:8*(J0 n)+8<=(kS Y)),(J0 n)-(J0 k)=m → (J0 k) ≤ (J0 n) → ∀ q, (dRw8 X i n r k Y a hX hY hB hr).data[q]! = if q=8*(J0 n)+(J0 r) then ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 k) a else if q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n) then dw X[(J0 i)+q/8]! else Y.data[q]! := by intro m; induction m with | zero => intro k Y a hY hm hk q have e:(J0 k)=(J0 n):=C4 hk (P4 hm) have nl:¬ (J0 k) < (J0 n):=fun h=>N4 _ (h.trans_le e.ge) have eao:ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 k) a=a:=by rw [ao,AC nl] rw [dRw8,dite_eq_right (show ¬ k < n from fun h=>nl (ε.mp h)),kFS,k8i n r (J0 n) (le_refl _) hB.2 hr,eao, AC (show ¬(q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n)) from fun h=>nl (h.2.1.trans_lt h.2.2))] by_cases hq:q=8*(J0 n)+(J0 r) · rw [AD hq.symm,AD hq] · rw [AC (show ¬(8*(J0 n)+(J0 r)=q) from fun h=>hq h.symm),AC hq] | succ m ih => intro k Y a hY hm hk q have h1:(J0 k) < (J0 n):=N1 hm have a1:=ac (ε.mpr h1) rw [dRw8,AT (ε.mpr h1)] rw [ih (k+1) _ _ _ (by rw [a1,W4,hm,BK]) (by rw [a1]; exact h1) q,a1,kFS,k8i k r (J0 n) h1.le hB.2 hr] rw [kXU X (i+k) _ ((J0 i)+(J0 k)) (kSm i k ((O1 h1 _).trans hB.1))] have eao:ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 k) a=ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) ((J0 k)+1) (a+dw (X[(J0 i)+(J0 k)]! &&& 0x7FFFFFFF)):=by rw [ao,AD h1] rw [kAbsDw, ← eao] by_cases hq:q=8*(J0 n)+(J0 r) · rw [AD hq,AD hq] rw [AC hq,AC hq] by_cases hA:q%8=(J0 r)∧(J0 k)+1 ≤ q/8∧q/8 < (J0 n) · rw [AD hA,AD (show q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n) from ⟨hA.1,X5 hA.2.1,hA.2.2⟩)] rw [AC hA] by_cases hk8:8*(J0 k)+(J0 r)=q · subst hk8 have d1:(8*(J0 k)+(J0 r))/8=(J0 k):=by rw [R8 (by decide),ώ hr,ϑ] have d2:(8*(J0 k)+(J0 r))%8=(J0 r):=by rw [S8,γ hr] rw [AD rfl,AD (show (8*(J0 k)+(J0 r))%8=(J0 r)∧(J0 k) ≤ (8*(J0 k)+(J0 r))/8∧(8*(J0 k)+(J0 r))/8 < (J0 n) from ⟨d2,d1.ge,by rw [d1]; exact h1⟩),d1] · have hn:¬(q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n)):=by intro h; apply hk8 have e8:q/8=(J0 k):=C4 (U2 (J8 fun h'=>hA ⟨h.1,h',h.2.2⟩)) h.2.1 rw [← e8, ← h.1]; exact ϛ q 8 rw [AC hk8,AC hn] theorem dX8_spec_h1{α:Type}(f:ℕ→ℕ→α)(g:ℕ→α)(Yq YD FR GR:α)(q N R L R1 k0 j s:ℕ)(hq:8*j+s=q)(hs8:s < 8)(hr8:R < 8)(h1:R < L)(hR1:R1=R+1)(hk0:k0=0)(hFR:FR=f R j)(hGR:GR=g R)(hYD:YD=if q=8*N+R then GR else if s=R∧k0 ≤ j∧j < N then FR else Yq): (if q < 8*N+8∧R1 ≤ s∧s < L then (if j < N then f s j else g s) else YD)=if q < 8*N+8∧R ≤ s∧s < L then (if j < N then f s j else g s) else Yq:=by subst hR1 hk0 hFR hGR hYD hq by_cases hs:s=R · subst hs rw [AC (fun h=>Vz s h.2.1)] rcases Jd j N with hj|hj|hj · rw [AC (fun e=>W8 hj (Zh (by decide) (Vv e))),AD ⟨rfl,ϟ _,hj⟩,AD ⟨(O1 hs8 _).trans_le (L1 (X3 8 hj.le) 8),le_refl s,h1⟩,AD hj] · subst hj rw [AD rfl,AD ⟨O1 hs8 _,le_refl s,h1⟩,AC (N4 j)] · rw [AC (fun e=>C8 hj (Zh (by decide) (Vv e))),AC (fun h=>Nat.lt_asymm h.2.2 hj),AC (fun h=>O3.2 (((Kk 8 N).symm.trans_le (X3 8 hj)).trans (V1 _ _)) h.1)] · by_cases hc:8*j+s < 8*N+8∧R ≤ s∧s < L · rw [AD ⟨hc.1,W5 hc.2.1 (Ww hs),hc.2.2⟩,AD hc] · rw [AC (fun h=>hc ⟨h.1,X5 h.2.1,h.2.2⟩),AC (fun e=>hs (((S8 8 j s).trans (γ hs8)).symm.trans ((congrArg (·%8) e).trans ((S8 8 N R).trans (γ hr8))))),AC (fun h=>hs h.1),AC hc] theorem dX8_spec (X:Ἂ ἇ)(b n lim:Ἄ)(hX:(J0 b)+(J0 lim)*(J0 n)<=(O0 X))(hB:(J0 b)+(J0 lim)*(J0 n)<2^31/\8*(J0 n)+7<2^31)(hl:(J0 lim)<=8) : ∀ m (r:Ἄ)(Y:ἀ)(hY:8*(J0 n)+8<=(kS Y)),(J0 lim)-(J0 r)=m → (J0 r) ≤ (J0 lim) → ∀ q, (dX8 X b n lim r Y hX hY hB hl).data[q]! = if q < 8*(J0 n)+8∧(J0 r) ≤ q%8∧q%8 < (J0 lim) then (if q/8 < (J0 n) then dw X[(J0 b)+(q%8)*(J0 n)+q/8]! else ao (fun t=>dw (X[(J0 b)+(q%8)*(J0 n)+t]! &&& 0x7FFFFFFF)) (J0 n) 0 0) else Y.data[q]! := by intro m; induction m with | zero => intro r Y hY hm hr q have e:(J0 r)=(J0 lim):=C4 hr (P4 hm) rw [dX8,dite_eq_right (fun h=>N4 _ ((ε.mp h).trans_le e.ge))]; exact (AC (fun h=>N4 _ (h.2.1.trans_lt (h.2.2.trans_le e.ge)))).symm | succ m ih => intro r Y hY hm hr q have h1:(J0 r) < (J0 lim):=N1 hm have a1:=ac (ε.mpr h1) have K:=kBRn b r n (J0 lim) h1 hB.1 have hr8:(J0 r) < 8:=h1.trans_le hl rw [dX8,AT (ε.mpr h1)]; exact (ih (r+1) _ _ ((congrArg ((J0 lim)-·) a1).trans ((Kj _ _).trans (congrArg Ki hm))) (a1.trans_le h1) q).trans (dX8_spec_h1 (fun s t=>dw X[(J0 b)+s*(J0 n)+t]!) (fun s=>ao (fun t=>dw (X[(J0 b)+s*(J0 n)+t]! &&& 0x7FFFFFFF)) (J0 n) 0 0) _ _ _ _ q _ _ _ _ _ (q/8) (q%8) (ϛ q 8) (ϊ _ (by decide)) hr8 h1 a1 rfl (congrArg (fun i=>dw X[i+q/8]!) K.1) (congrArg (fun i=>ao (fun t=>dw (X[i+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 0) 0) K.1) (dRw8_spec X _ n r _ _ hr8 _ 0 Y 0 hY rfl (ϟ _) q)) theorem kOutWm (n:ℕ)(l:ℕ→Ἃ)(W b E:Ἂ Ἃ)(ib L H:ℕ)(j:ℕ)(cq hb p:ἆ)(f:ℕ→Ἅ)(v Lf:Ἅ) (A:∀ sdw (l k&&&0x7FFFFFFF)) n 0 0) (hcq:23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat ≤ cq.toNat)(hcq2:cq.toNat ≤ 992)(hhb:hb=(ib+L-50).toUInt64) (hp:p=(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) (he:(E[j]!).toUInt64 < 255) (hp372:p ≤ 372) : aG (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((if hb>p then hb else p).toNat:ℕ):ℤ) ∧ |(af (n+1) (fun s=>if s < n then l s else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if hb>p then hb else p).toNat)+52:ℕ):ℤ)∧(if hb>p then hb else p).toNat ≤ 600:=by have eN:=kE64 E[j]! have hc9:=kCEb (I0 (9*(n+1))).toInt64.toFloat Lf generalize hcc:(cEq (I0 (9*(n+1))).toInt64.toFloat Lf)=cc at hcq hc9 have the:(E[j]!).toNat < 255:=by have:=μ.1 he; rw [eN] at this; exact this have hm:(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64).toNat=max (E[j]!).toNat 56:=by split · rename_i h; have:=μ.1 h; rw [eN] at this; exact (Qm this.le).symm · rename_i h; have:=μ.not.1 h; rw [eN] at this; rw [eN]; exact (Qv (V4 this)).symm have tp:p.toNat=max (E[j]!).toNat 56+cq.toNat:=by rw [hp,kAddS _ _ (by rw [hm]; exact C0 (M3 (Zg.2 ⟨the.le,(by decide)⟩) hcq2) (by decide)),hm] have t372:p.toNat ≤ 372:=θ.1 hp372 have thb:hb.toNat=ib+L-50:=by rw [hhb]; exact kOfS _ ((Y4 _ _).trans_lt (C0 z (by decide))) have th:(if hb>p then hb else p).toNat=max (ib+L-50) p.toNat:=by rw [← thb]; split · rename_i h; exact (Qv (μ.1 h).le).symm · rename_i h; exact (Qm (V4 (μ.not.1 h))).symm have hk:max (E[j]!).toNat 56+23+cc.toNat ≤ max (E[j]!).toNat 56+cq.toNat:=by rw [pA]; exact J1 hcq _ have Wn:=kWin n l W b j (E[j]!).toNat ib L H f Lf A hEv the hbF M Hn x z hn (hpp0 the) hLf (by rw [hcc]; exact hk.trans (tp.symm.trans_le t372)) rw [hcc] at Wn have mono : ∀ a c:ℕ,a ≤ c → (2:ℝ)^((a:ℕ):ℤ) ≤ (2:ℝ)^((c:ℕ):ℤ):=fun a c h=>AG (by norm_num) (by exact_mod_cast h) have hXY:max (ib+L-50) (max (E[j]!).toNat 56+23+cc.toNat) ≤ (if hb>p then hb else p).toNat:=by rw [th,tp]; exact max_le_max_left _ hk rw [hv] exact ⟨Wn.1,Wn.2.1,Wn.2.2.1.trans (mono _ _ hXY),Wn.2.2.2.1,Wn.2.2.2.2.trans (mono _ _ (L1 hXY 52)), by rw [th]; exact Zg.2 ⟨(Y4 _ _).trans (z.trans (by decide)),t372.trans (by decide)⟩⟩ theorem kMx2 (a c:ἆ):a.toNat ≤ (mx2 a c).toNat∧c.toNat ≤ (mx2 a c).toNat∧((mx2 a c).toNat=a.toNat∨(mx2 a c).toNat=c.toNat):=by unfold mx2; split · rename_i h; have:=μ.1 h; exact ⟨this.le,le_refl _,BA rfl⟩ · rename_i h; have:=μ.not.1 h; exact ⟨le_refl _,V4 this,pZ rfl⟩ theorem kMx8 (f:ℕ→ἆ)(B:ℕ)(hf:∀ r<8,(f r).toNat ≤ B) : (∀ r<8,(f r).toNat ≤ (mx2 (mx2 (mx2 (f 0) (f 1)) (mx2 (f 2) (f 3))) (mx2 (mx2 (f 4) (f 5)) (mx2 (f 6) (f 7)))).toNat) ∧ (mx2 (mx2 (mx2 (f 0) (f 1)) (mx2 (f 2) (f 3))) (mx2 (mx2 (f 4) (f 5)) (mx2 (f 6) (f 7)))).toNat ≤ B:=by have a01:=kMx2 (f 0) (f 1); have a23:=kMx2 (f 2) (f 3); have a45:=kMx2 (f 4) (f 5); have a67:=kMx2 (f 6) (f 7) have b0:=kMx2 (mx2 (f 0) (f 1)) (mx2 (f 2) (f 3)); have b1:=kMx2 (mx2 (f 4) (f 5)) (mx2 (f 6) (f 7)) have c:=kMx2 (mx2 (mx2 (f 0) (f 1)) (mx2 (f 2) (f 3))) (mx2 (mx2 (f 4) (f 5)) (mx2 (f 6) (f 7))) have u2 : ∀ a c:ἆ,a.toNat ≤ B → c.toNat ≤ B → (mx2 a c).toNat ≤ B:=fun a c ha hc => (kMx2 a c).2.2.elim (fun e=>e.trans_le ha) (fun e=>e.trans_le hc) have T0:=b0.1.trans c.1; have T1:=b0.2.1.trans c.1; have T2:=b1.1.trans c.2.1; have T3:=b1.2.1.trans c.2.1 refine ⟨fun r hr => ?_,u2 _ _ (u2 _ _ (u2 _ _ (hf 0 (by decide)) (hf 1 (by decide))) (u2 _ _ (hf 2 (by decide)) (hf 3 (by decide)))) (u2 _ _ (u2 _ _ (hf 4 (by decide)) (hf 5 (by decide))) (u2 _ _ (hf 6 (by decide)) (hf 7 (by decide))))⟩ interval_cases r exacts [a01.1.trans T0,a01.2.1.trans T0,a23.1.trans T1,a23.2.1.trans T1,a45.1.trans T2,a45.2.1.trans T2,a67.1.trans T3,a67.2.1.trans T3] theorem kHB (a0 l0:ℕ)(h1:50 ≤ a0)(h2:a0+l0 ≤ 425):a0.toUInt64+l0.toUInt64-(50:ἆ)=(a0+l0-50).toUInt64:=by have t:a0+l0 < 2^63:=C0 h2 (by decide) have e1:a0.toUInt64.toNat=a0:=kOfS _ ((V1 _ _).trans_lt t) have e2:l0.toUInt64.toNat=l0:=kOfS _ ((N2 _ _).trans_lt t) have e3:(a0.toUInt64+l0.toUInt64).toNat=a0+l0:=by rw [kAddS _ _ (by rw [e1,e2]; exact t),e1,e2] apply ξ.1 rw [χ _ _ (by rw [θ,e3]; exact h1.trans (V1 _ _)),e3,kOfS _ ((Y4 _ _).trans_lt t)]; simp theorem kCR (F a:Ἅ):((23:ἆ)+cEq F a).toNat=23+(cEq F a).toNat∧((23:ἆ)+cEq F a).toNat ≤ 992:=by have:=kCEb F a have e:((23:ἆ)+cEq F a).toNat=23+(cEq F a).toNat:=kAddS _ _ (C0 (J1 this 23) (by decide)) exact ⟨e,by rw [e]; exact J1 this 23⟩ theorem gXb_spec_h2(Z Y:ἀ)(X:Ἂ Ἃ)(b nn l z r0 n:Ἀ)(hz:z=0)(hn:nn=n)(hb:b=r0*n)(hl:l<=8)(hY:∀q,q<8*n+8->Y.data[q]! =dw 0) (D:∀q,Z.data[q]! =if q<8*nn+8∧z<=q%8∧q%8dw (X[b+(q%8)*nn+t]! &&& 0x7FFFFFFF)) nn 0 0) else Y.data[q]!): (∀s,s∀r,r<8->Z.data[8*s+r]! =if rZ.data[8*n+r]! =ao (fun k=>dw (X[(r0+r)*n+k]! &&& 0x7FFFFFFF)) n 0 0):=by subst hz hb hn refine ⟨fun s hs r hr=>?_,fun r hr=>?_⟩ · have q1:(8*s+r)%8=r:=(S8 8 s r).trans (γ hr) have q2:(8*s+r)/8=s:=by rw[R8 (by decide),ώ hr,ϑ] have c1:8*s+r<8*nn+8:=(O1 hr _).trans_le (L1 (X3 8 hs.le) 8) refine (D _).trans ?_ rw[q1,q2,AD hs,Ϡ] exact if_congr ⟨fun h=>h.2.2,fun h=>⟨c1,ϟ _,h⟩⟩ rfl (hY _ c1) · have r8:r<8:=hr.trans_le hl have q1:(8*nn+r)%8=r:=(S8 8 nn r).trans (γ r8) have q2:(8*nn+r)/8=nn:=by rw[R8 (by decide),ώ r8,ϑ] refine (D _).trans ?_ rw[q1,q2,AC (N4 nn),Ϡ] exact AD ⟨O1 r8 _,ϟ _,hr⟩ structure YM where Y:ἀ m:ἇ theorem dTe(T:ἀ)(hT:T=P)(w:ἇ):(J0 (O5 ((w>>>23)&&&255)))<(kS T):=by rw[hT,gL,aC,Ξ];exact AO ϝ (by decide) theorem dTs(T:ἀ)(hT:T=P)(w:ἇ):(J0 (O5 (w>>>23)))<(kS T):=by rw[hT,gL,aC,dg];have:=w.toNat_lt;exact Ϟ this theorem dR1(k:Ἄ)(h:(J0 k)+1<2^(32:Ἀ)):(J0 (k+1))=(J0 k)+1:=by have:2^(32:Ἀ) ≤ 2^nx:=ς;rw[lJ,kc1];exact γ (by omega) theorem dR5(k:Ἄ)(h:(J0 k)+4<2^(32:Ἀ)):(J0 (k+4))=(J0 k)+4:=by have:2^(32:Ἀ) ≤ 2^nx:=ς;rw[lJ,kc4];exact γ (by omega) def dRwM(X:Ἂ ἇ)(i n o k:Ἄ)(Y:ἀ)(a:Ἅ)(m:ἇ)(T:@& ἀ)(hT:T=P)(hX:(J0 i)+(J0 n)<=(O0 X))(hY:(J0 o)+(J0 n)<(kS Y))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):YM:= if h:k>>23)&&&255 let f0:=(Core.mW w0).toInt64.toFloat let e1:=(w1>>>23)&&&255 let f1:=(Core.mW w1).toInt64.toFloat let e2:=(w2>>>23)&&&255 let f2:=(Core.mW w2).toInt64.toFloat let e3:=(w3>>>23)&&&255 let f3:=(Core.mW w3).toInt64.toFloat let a2:=a+f0*T.uget (O5 e0) (dTe T hT w0)+f1*T.uget (O5 e1) (dTe T hT w1)+f2*T.uget (O5 e2) (dTe T hT w2)+f3*T.uget (O5 e3) (dTe T hT w3) let m1:=if m>>23)) (dTs T hT w0) let d1:=f1*T.uget (O5 (w1>>>23)) (dTs T hT w1) let d2:=f2*T.uget (O5 (w2>>>23)) (dTs T hT w2) let d3:=f3*T.uget (O5 (w3>>>23)) (dTs T hT w3) dRwM X i n o (k+1+1+1+1) ((((Y.uset (o+k) d0 (by rw[kSm o k (by omega)];omega)).uset (o+(k+1)) d1 (by rw[uZ,kSm o (k+1) (by rw[c1];omega),c1];omega)).uset (o+(k+1+1)) d2 (by rw[uZ,uZ,kSm o (k+1+1) (by rw[c2];omega),c2];omega)).uset (o+(k+1+1+1)) d3 (by rw[uZ,uZ,uZ,kSm o (k+1+1+1) (by rw[c3];omega),c3];omega)) a2 (if m3>>23)&&&255 let f:=(Core.mW w).toInt64.toFloat dRwM X i n o (k+1) (Y.uset (o+k) (f*T.uget (O5 (w>>>23)) (dTs T hT w)) (by rw[kSm o k (by omega)];omega)) (a+f*T.uget (O5 e) (dTe T hT w)) (if m(dRwM X i n o k Y a m P rfl hX hY hB).Y=dRw X i n o k Y a hX hY hB:=by intro _ k Y a m hY ht;clear ht fun_induction dRwM X i n o k Y a m P rfl hX hY hB with | case1 k Y a m hY h b1 b2 hk h4 q c1 c2 c3 w0 w1 w2 w3 e0 f0 e1 f1 e2 f2 e3 f3 a2 m1 m2 m3 d0 d1 d2 d3 ih=> simp only[dite_eq_ite]at ih;rw[ih];symm rw[dRw,AT h];dsimp only rw[dRw,AT (ε.mpr (by rw[c1];omega))];dsimp only rw[dRw,AT (ε.mpr (by rw[c2];omega))];dsimp only rw[dRw,AT (ε.mpr (by rw[c3];omega))];rfl | case2 k Y a m hY h b1 b2 hk h4 w e f ih=>simp only[dite_eq_ite]at ih;rw[ih];symm;rw[dRw,AT h];rfl | case3 k Y a m hY h=>rw[dRw,dite_eq_right h] theorem dRwM_m(X:Ἂ ἇ)(i n o:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):∀ t (k:Ἄ)(Y:ἀ)(a:Ἅ)(m:ἇ)(hY:(J0 o)+(J0 n)<(kS Y)),(J0 n)-(J0 k)=t-> (mJ m)<=(mJ (dRwM X i n o k Y a m P rfl hX hY hB).m)/\∀q,(J0 k)<=q->q<(J0 n)->(mJ (kB X[(J0 i)+q]!))<=(mJ (dRwM X i n o k Y a m P rfl hX hY hB).m):=by have r:∀m e:ἇ,(mJ (if mby split<;>rename_i j<;>rw[Ι]at j<;>clear*-j<;>omega intro _ k Y a m hY ht;clear ht fun_induction dRwM X i n o k Y a m P rfl hX hY hB with | case1 k Y a m hY h b1 b2 hk h4 q c1 c2 c3 w0 w1 w2 w3 e0 f0 e1 f1 e2 f2 e3 f3 a2 m1 m2 m3 d0 d1 d2 d3 ih=> simp only[dite_eq_ite]at ih;obtain⟨u,v⟩:=ih have c4:(J0 (k+1+1+1+1))=(J0 k)+4:=by rw[dR1 (k+1+1+1) (by rw[c3];omega),c3] have r3:=r m3 e3;have r2:(mJ m3)=_:=r m2 e2;have r1:(mJ m2)=_:=r m1 e1;have r0:(mJ m1)=_:=r m e0 have x0:(mJ (kB X[(J0 i)+(J0 k)]!))=(mJ e0):=by rw[←kSm i k (by omega),←cC X (i+k) (by rw[kSm i k (by omega)];omega),kB] have x1:(mJ (kB X[(J0 i)+((J0 k)+1)]!))=(mJ e1):=by rw[←c1,←kSm i (k+1) (by rw[c1];omega),←cC X (i+(k+1)) (by rw[kSm i (k+1) (by rw[c1];omega),c1];omega),kB] have x2:(mJ (kB X[(J0 i)+((J0 k)+2)]!))=(mJ e2):=by rw[←c2,←kSm i (k+1+1) (by rw[c2];omega),←cC X (i+(k+1+1)) (by rw[kSm i (k+1+1) (by rw[c2];omega),c2];omega),kB] have x3:(mJ (kB X[(J0 i)+((J0 k)+3)]!))=(mJ e3):=by rw[←c3,←kSm i (k+1+1+1) (by rw[c3];omega),←cC X (i+(k+1+1+1)) (by rw[kSm i (k+1+1+1) (by rw[c3];omega),c3];omega),kB] refine⟨by omega,fun q g d=>?_⟩ by_cases g4:(J0 k)+4<=q · exact v q (by rw[c4];exact g4) d · rcases (by omega:q=(J0 k)∨q=(J0 k)+1∨q=(J0 k)+2∨q=(J0 k)+3) with rfl|rfl|rfl|rfl<;>omega | case2 k Y a m hY h b1 b2 hk h4 w e f ih=> simp only[dite_eq_ite]at ih;obtain⟨u,v⟩:=ih have r0:=r m e have x0:(mJ (kB X[(J0 i)+(J0 k)]!))=(mJ e):=by rw[←kSm i k (by omega),←cC X (i+k) (by rw[kSm i k (by omega)];omega),kB] refine⟨by omega,fun q g d=>?_⟩ by_cases g1:(J0 k)+1<=q · exact v q (by rw[ac h];exact g1) d · rcases (by omega:q=(J0 k)) with rfl;omega | case3 k Y a m hY h=>exact⟨le_refl _,fun q g d=>absurd (AO g d) (by rw[ε]at h;omega)⟩ def dOwM(X:Ἂ ἇ)(n m R r:Ἄ)(Y:ἀ)(mx:ἇ)(hX:(J0 R)*(J0 n)<=(O0 X))(hY:(J0 R)*(J0 m)<=(kS Y))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):YM:= if h:r(dOwM X n m R r Y mx hX hY hm hB).Y=dOw X n m R r Y hX hY hm hB:=by intro k;induction k with | zero=>intro r Y mx hY hk;have h0:¬ rG7 (ε.mp h) hk rw[dOwM,dOw];simp only [dite_eq_right h0] | succ k ih=> intro r Y mx hY hk;have h1:(J0 r)<(J0 R):=N1 hk rw[dOwM,dOw];simp only [AT (ε.mpr h1)] rw[ih (r+1) _ _ _ (by rw[ac (ε.mpr h1),W4,hk,BK])] congr 1 exact dRwM_Y _ _ _ _ _ _ _ _ _ _ _ _ rfl theorem dOwM_m(X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):∀ k (r:Ἄ)(Y:ἀ)(mx:ἇ)(hY:(J0 R)*(J0 m)<=(kS Y)),(J0 R)-(J0 r)=k-> (mJ mx)<=(mJ (dOwM X n m R r Y mx hX hY hm hB).m)/\∀q,(J0 r)*(J0 n)<=q->q<(J0 R)*(J0 n)->(mJ (kB X[q]!))<=(mJ (dOwM X n m R r Y mx hX hY hm hB).m):=by intro k;induction k with | zero=>intro r Y mx hY hk;have h0:¬ rG7 (ε.mp h) hk rw[dOwM];simp only [dite_eq_right h0] exact⟨le_refl _,fun q g d=>absurd (AO g d) (fun h=>by have:=Jq h;omega)⟩ | succ k ih=> intro r Y mx hY hk;have h1:(J0 r)<(J0 R):=N1 hk rw[dOwM];simp only [AT (ε.mpr h1)] have hr:=h1 have q2:((J0 r)+1)*(J0 n)<=(J0 R)*(J0 n):=ι _ hr have e1:(J0 (r*n))=(J0 r)*(J0 n):=kMm _ _ (C0 (ϧ (I3 hr) (Va.intro hm.symm)) hB) have q1:((J0 r)+1)*(J0 m)<=(J0 R)*(J0 m):=ι _ hr have q3:(J0 R)*(J0 n)<=(J0 R)*(J0 m):=X3 _ (Va.intro hm.symm) have e2:(J0 (r*m))=(J0 r)*(J0 m):=kMm _ _ (C0 (ι _ (I3 hr)) hB) have P1:(J0 (r*n))+(J0 n)<=(O0 X):=J2 (Y3 ((congrArg (·+J0 n) e1).trans (nO _ _).symm)) (J2 q2 hX) have P2:(J0 (r*m))+(J0 n)<(kS Y):=U1 (O1 (Y3 hm.symm) _) (J2 (Y3 ((congrArg (·+J0 m) e2).trans (nO _ _).symm)) (J2 q1 hY)) have P3:(J0 (r*n))+(J0 n)<2^(31:Ἀ)/\(J0 (r*m))+(J0 n)<2^(31:Ἀ):=⟨C0 (J2 (Y3 ((congrArg (·+J0 n) e1).trans (nO _ _).symm)) (J2 q2 q3)) hB,I4 (O1 (Y3 hm.symm) _) (C0 (J2 (Y3 ((congrArg (·+J0 m) e2).trans (nO _ _).symm)) q1) hB)⟩ have hY2:(J0 R)*(J0 m)<=kS (dRwM X (r*n) n (r*m) 0 Y 0 mx P rfl P1 P2 P3).Y:=by rw[dRwM_Y X (r*n) n (r*m) P1 P3 _ 0 Y 0 mx P2 rfl];exact J2 hY (Y3 (dRw_size X (r*n) n (r*m) _ _ _ 0 Y 0 _ rfl).symm) obtain⟨u1,u2⟩:=ih (r+1) (dRwM X (r*n) n (r*m) 0 Y 0 mx P rfl P1 P2 P3).Y (dRwM X (r*n) n (r*m) 0 Y 0 mx P rfl P1 P2 P3).m hY2 (by rw[ac (ε.mpr h1),W4,hk,BK]) obtain⟨v1,v2⟩:=dRwM_m X (r*n) n (r*m) P1 P3 _ 0 Y 0 mx P2 rfl refine⟨v1.trans u1,fun q g d=>?_⟩ by_cases o2:q<(J0 r)*(J0 n)+(J0 n) · have w:=v2 (q-(J0 r)*(J0 n)) (by rw[kc0];exact ϟ _) (by omega) rw[e1,show (J0 r)*(J0 n)+(q-(J0 r)*(J0 n))=q by omega] at w exact w.trans u1 · exact u2 q (by rw[ac (ε.mpr h1),Ο];omega) d lemma bdM(A:Ἂ kF)(m:ἇ)(hm:∀q,q<(O0 A)->(mJ (kB A[q]!))<=(mJ m))(h:m<255)(q:Ἀ): kB A[q]!≠255/\kG A[q]!<=(mJ m)-1:=by have g:=Ι.mp h;have d:(mJ (kB A[q]!))<=(mJ m):=by by_cases d:q<(O0 A) .exact hm q d .rw[An A q d];exact ϟ _ refine⟨λe=>by simp[e]at d g;(clear * - g d;omega),by rw[aT];exact G5 d 1⟩ theorem dOw_spec_h1 {r R n m x y B:Ἀ} (h1:Qw r R) (hnm:Qw n m) (hB:Qw (Vq R m) B) (hX:Va (Vq R n) x) (hY:Va (Vq R m) y) : Qw (Vq r n) B∧Qw (Vq r m) B∧(∀ a,a=Vq r n → Va (Pg a n) x)∧(∀ a,a=Vq r m → Qw (Pg a n) y)∧(∀ a,a=Vq r n → Qw (Pg a n) B)∧(∀ a,a=Vq r m → Qw (Pg a n) B):=by have q1:=J2 (Y3 (Ο r m).symm) (ι m h1) have q2:=J2 (Y3 (Ο r n).symm) (ι n h1) have q3:=X3 R (I3 hnm) exact ⟨C0 ((V1 _ _).trans (q2.trans q3)) hB,C0 ((V1 _ _).trans q1) hB,fun _ h=>h ▸ q2.trans hX,fun _ h=>h ▸ U1 (O1 hnm _) (q1.trans hY),fun _ h=>h ▸ C0 (q2.trans q3) hB,fun _ h=>h ▸ I4 (O1 hnm _) (C0 q1 hB)⟩ theorem dOw_spec (X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)) : ∀ k (r:Ἄ)(Y:ἀ)(hY:(J0 R)*(J0 m)<=(kS Y)),(J0 R)-(J0 r)=k → (J0 r) ≤ (J0 R) → (∀ q,q < (J0 r)*(J0 m) → (dOw X n m R r Y hX hY hm hB).data[q]! = Y.data[q]!) ∧ ∀ r' t,r' < (J0 R) → (J0 r) ≤ r' → t ≤ (J0 n) → (dOw X n m R r Y hX hY hm hB).data[r'*(J0 m)+t]! = if t=(J0 n) then ao (fun s=>dw (X[r'*(J0 n)+s]! &&& 0x7FFFFFFF)) (J0 n) 0 0 else dw X[r'*(J0 n)+t]! := by intro k; induction k with | zero => intro r Y hY hk hr exact ⟨fun q _=>by rw [dOw,dite_eq_right (mt ε.mp (O3.2 (V3.1 hk)))],fun r' t h1 h2 _=>(N4 r' (U1 h1 ((V3.1 hk).trans h2))).elim⟩ | succ k ih => intro r Y hY hk hr have h1:=N1 hk have hnm:=B5 (U4 _) hm.symm obtain ⟨a1,a2,a3,a4,a5,a6⟩:=dOw_spec_h1 h1 hnm hB hX hY have e1:=kMm r n a1 have e2:=kMm r m a2 have hr1:=ac (ε.mpr h1) have P1:=a3 _ e1 have P2:=a4 _ e2 have P3:=And.intro (a5 _ e1) (a6 _ e2) rw [dOw,AT (ε.mpr h1)]; dsimp only obtain ⟨I1,I2⟩:=ih (r+1) (dRw X _ n _ 0 Y 0 P1 P2 P3) (J2 hY (Y3 (dRw_size X _ n _ P1 P3 _ 0 Y 0 P2 rfl).symm)) ((congrArg (Nat.sub R.toNat) hr1).trans ((Kj _ _).trans (congrArg Ki hk))) (J2 (Y3 hr1) h1) have D:=dRw_spec X _ n _ P1 P3 _ 0 Y 0 P2 rfl (kc0 ▸ ϟ _) refine ⟨fun q hq => ?_,fun r' t h2 h3 h4 => ?_⟩ · rw [I1 q (U1 hq (ι _ ((N8 _).trans (Y3 hr1.symm)))),D q,e2,AC (by exact W8 (U1 hq (V1 _ _))),AC (by exact fun h=>O3.2 ((V1 _ _).trans h.1) hq)] rcases Z7 r.toNat r' with h5 | h5 · exact I2 r' t h2 (J2 (Y3 hr1) h5) h4 · obtain rfl:=C4 h5 h3 rw [I1 _ (by rw [hr1,Ϡ,n4]; exact O1 (C0 h4 hnm) _),D, ← e2, ← e1] by_cases ht:t=n.toNat · subst ht; rw [AD rfl,AD rfl,kc0] · rw [AC (by exact fun h=>ht (F7 h)),AC ht,AD (by exact ⟨J1 (ϟ _) _,O1 (W5 h4 ht) _⟩),ϱ] noncomputable def oV(relu:Ἆ)(n:Nat)(X W b E:Ἂ ἇ)(ix ib L:Nat)(Y Q:ἀ)(vo rn:Nat)(cq hb:ἆ)(j:Nat)(v:Ἅ):ἇ:= if zq2 v (E[j]!).toUInt64 relu cq hb==(0xFFFFFFFF:Ἃ) then sQ2 relu n X W b E ix ib L Y Q vo rn j (if hb > (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq then hb else (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) v else zq2 v (E[j]!).toUInt64 relu cq hb noncomputable def lsel(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(k:Nat):Ἅ:= if k=0 then a0 else if k=1 then a1 else if k=2 then a2 else if k=3 then a3 else if k=4 then a4 else if k=5 then a5 else if k=6 then a6 else a7 theorem kAS (a:Ἂ ἇ)(i:Ἄ)(x:ἇ)(h:(J0 i)<(O0 a))(q:ℕ):(a.uset i x h)[q]! = if (J0 i)=q then x else a[q]! := by rw [pP] by_cases hq:q < (O0 a) · rw [AB (a.set (J0 i) x h) q (by simp only [Qd]; exact hq),AB a q hq,Je] · have:(J0 i)≠q:=by omega rw [AC this,An (a.set (J0 i) x h) q (by simp only [Qd,not_lt]; exact V4 hq),An a q hq] theorem kOutV (relu:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix ib L H:ℕ)(Y Q:ἀ)(vo rn j:ℕ)(cq hb:ἆ)(v Lf:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(hbF:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ ib)(Hn:n+2 ≤ 2^L)(x:L≤27)(z:ib+L≤425)(hn:0Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (hLf:Lf=ao (fun k=>dw (X[rn+k]! &&& 0x7FFFFFFF)) n 0 0) (hcq:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat Lf) (hhb:hb=(ib+L-50).toUInt64) : oV relu n X W b E ix ib L Y Q vo rn cq hb j v=p8 relu (ms (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)):=by unfold oV; exact kOut relu n X W b E ix ib L H Y Q vo rn j cq hb v Lf F hbF M Hn x z hn hEv hYv hQv hv hLf hcq hhb theorem wcBF_spec (b:Ἂ Ἃ)(ow N:Ἀ):(kS (wcBF (b,ow,N)))=N ∧ ∀k,k(wcBF (b,ow,N)).data[k]! = if kif oB.2.2 k (by simp[AR,kS]) hk⟩ theorem sMb1(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(h:(J0 t)<(J0 nu)) : (J0 (vo+t))=(J0 vo)+(J0 t)∧(J0 (i0+8*t))=(J0 i0)+8*(J0 t) ∧ (J0 (vo+t))<(kS Y)∧(J0 (i0+8*t))+7<(kS Q)∧(J0 (i0+8*t))+7<2^(31:Ἀ)∧(J0 (t+1))=(J0 t)+1:=by have e8:(J0 (8*t))=8*(J0 t):=by rw[kMm 8 t (by rw[kc8];clear * - h hQ;omega),kc8] have a1:=kSm vo t (by clear * - h hY;omega); have a2:=kSm i0 (8*t) (by rw[e8];clear * - h hQ;omega) have e1:=kSm t 1 (by rw[kc1];clear * - h hY;omega); rw[kc1] at e1 rw[e8] at a2 exact ⟨a1,a2,by rw[a1];exact U1 (O1 h _) hY.1,by rw[a2];clear * - h hQ;omega,by rw[a2];clear * - h hQ;omega,e1⟩ theorem sMb(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(h:(J0 t)<(J0 nu))(h2:(J0 t)+1<(J0 nu)) : (J0 (t+2))=(J0 t)+2 ∧ (J0 (vo+(t+1)))=(J0 vo)+((J0 t)+1)∧(J0 (i0+8*(t+1)))=(J0 i0)+8*((J0 t)+1) ∧ (J0 (vo+(t+1)))<(kS Y)∧(J0 (i0+8*(t+1)))+7<(kS Q)∧(J0 (i0+8*(t+1)))+7<2^(31:Ἀ):=by have e1:=kSm t 1 (by rw[kc1];clear * - h hY;omega); rw[kc1] at e1 have e2:=kSm t 2 (by rw[kc2];clear * - h2 hY;omega); rw[kc2] at e2 have e9:(J0 (8*(t+1)))=8*((J0 t)+1):=by rw[kMm 8 (t+1) (by rw[kc8,e1];clear * - h2 hQ;omega),kc8,e1] have a1:=kSm vo (t+1) (by rw[e1];clear * - h2 hY;omega); have a2:=kSm i0 (8*(t+1)) (by rw[e9];clear * - h2 hQ;omega) rw[e1] at a1; rw[e9] at a2 exact ⟨e2,a1,a2,by rw[a1];exact U1 (O1 h2 _) hY.1,by rw[a2];clear * - h2 hQ;omega,by rw[a2];clear * - h2 hQ;omega⟩ theorem Lq0(R r:ℕ)(h:R-r=0):¬r < R:=O3.mpr (V3.mp h) theorem Lqs(R r k:ℕ)(h:R-r=k+1):r < R∧R-(r+1)=k:=⟨N1 h,by rw[Kj,h];rfl⟩ theorem Lqd(R r:ℕ)(h:r < R):R-(r+1) < R-r:=U5 h (U4 r) theorem Lq2(R r:ℕ)(h:r+1 < R):R-(r+1+1) < R-r:=U5 (E7 h) (N6 (U4 r)) theorem Lql(a j m c:ℕ)(h:j < m)(hc:a+m<=c):a+j < c:=U1 (O1 h a) hc theorem Lqn(a j m q:ℕ)(h:m<=j):¬(a+j<=q∧q < a+m):=fun g=>N4 _ (C0 ((J1 h a).trans g.1) g.2) theorem Lqa(a b m:ℕ):¬(a+(b+1)≤a+b∧a+b < a+m):=fun g=>Vz _ g.1 theorem Lqb(a b m:ℕ)(h:b < m):a+b≤a+b∧a+b < a+m:=⟨Jv _,O1 h a⟩ theorem Lqc(a b m q:ℕ)(g:a+(b+1)≤q∧q < a+m):a+b≤q∧q < a+m:=⟨X5 g.1,g.2⟩ theorem Lqe(a b m q:ℕ)(g:¬(a+(b+1)≤q∧q < a+m))(e:¬a+b=q):¬(a+b≤q∧q < a+m):=fun g'=>g ⟨W5 g'.1 e,g'.2⟩ theorem Lqf(a r r' w o o':ℕ)(g1:r+1≤r')(h3:o < w):(a+r')*w+o'≠(a+r)*w+o:=by have m:=ι w (J1 g1 a); rw [show a+(r+1)=(a+r)+1 from rfl,Ο] at m exact C8 (U1 (O1 h3 _) (m.trans (V1 _ _))) theorem Lwq(a g l:ℕ)(hl:l < 8):(8*a ≤ 8*g+l∧8*g+l < 8*a+8) ↔ g=a:=by omega theorem Lw1(o r:ℕ)(hr:r < 8):8*o+8≤8*(o+1)+r∧8*(o+1)+r < 8*o+8+8:=(Lwq (o+1) (o+1) r hr).mpr rfl theorem Lw2(o r:ℕ):8*(o+1)+r-(8*o+8)=r:=ϱ (8*o+8) r theorem Lw8(x o r:ℕ)(f:x=8*o+8):8*(o+1)+r-x=r:=by rw[f];exact Lw2 o r theorem Lw3(o o' r:ℕ)(hr:r < 8)(e:¬o'=o+1):¬(8*o+8≤8*o'+r∧8*o'+r < 8*o+8+8):=fun g=>e ((Lwq (o+1) o' r hr).mp g) theorem Lw4(o r:ℕ)(hr:r < 8):8*o≤8*o+r∧8*o+r < 8*o+8:=⟨V1 _ _,O1 hr _⟩ theorem Lw5(o o' r:ℕ)(hr:r < 8)(e:¬o'=o):¬(8*o≤8*o'+r∧8*o'+r < 8*o+8):=fun g=>e ((Lwq o o' r hr).mp g) theorem Lw6(o o':ℕ)(h:o' < o+1+1)(e1:¬o'=o+1)(e0:¬o'=o):o' < o:=W5 (U2 (W5 (U2 h) e1)) e0 theorem Lw7(o o' w:ℕ)(ho:o' < w)(h2:¬o+1 < w)(e0:¬o'=o):o' < o:=W5 (U2 (U1 ho (V4 h2))) e0 theorem n5d0:0≤7:=K3 rfl theorem n5d1:1≤7:=K3 rfl theorem n5d2:2≤7:=K3 rfl theorem n5d3:3≤7:=K3 rfl theorem n5d4:4≤7:=K3 rfl theorem n5d5:5≤7:=K3 rfl theorem n5d6:6≤7:=K3 rfl theorem n5d7:7≤7:=K3 rfl theorem sMbT(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(ht0:(J0 t)<=(J0 nu)):(J0 (t+1))=(J0 t)+1:=by rw[kSm t 1 (by rw[kc1];clear * - ht0 hQ;omega),kc1] theorem fzPU(m:Float.Model):J5 m.unpack=m:=by apply FloatLib.Floats.Formats.BinaryInterchange.Model.ofFloatModel_injective rw[nu] change pv kC (FloatLib.Floats.Formats.BinaryInterchange.Model.toModel (kI m))=kI m exact FloatLib.Floats.Formats.BinaryInterchange.Model.canonicalizeModel_eq_self _ (FloatLib.Floats.Formats.BinaryInterchange.Model.isModelCanonical_ofFloatModel m) open FloatLib.Floats.Formats.BinaryInterchange in theorem fzRN(M E:Int)(sp:Float.Model.Format):pp sp (Ka (decide (M<0))) M.natAbs E=O6 sp M E .positive:=by rcases lt_trichotomy M 0 with h|h|h ·have c:compare M 0=.lt:=Int.compare_eq_lt.mpr h;have ha:M.natAbs=(-M).toNat:=by omega simp only[O6,c,Ka,h,decide_true,ἁ,ha] ·subst h;simp[O6,Ka] ·have c:compare M 0=.gt:=Int.compare_eq_gt.mpr h;have ha:M.natAbs=M.toNat:=by omega simp only[O6,c,Ka,not_lt.mpr h.le,decide_false,υ,↓reduceIte,ha] theorem fzSS(M E:Int):(FloatLib.Numerics.Dyadic.mk (decide (M<0)) M.natAbs E).signedSignificand=M:=by unfold lr by_cases h:M<0 ·simp[h,abs_of_neg h] ·simp[h,Ad (not_lt.mp h)] open FloatLib.Floats.Formats.BinaryInterchange in theorem fzVD(M1 E1 M2 E2:Int)(h:(M1:ℚ)*2^E1=(M2:ℚ)*2^E2):J5 (O6 k0 M1 E1 .positive)=J5 (O6 k0 M2 E2 .positive):=by by_cases h1:M1=0 ·have h2:M2=0:=by subst h1;simp at h rcases h with h|h ·exact_mod_cast h ·exact absurd h (by positivity) subst h1;subst h2;rfl have h2:M2≠0:=by intro h2;subst h2;simp at h rcases h with h|h ·exact h1 (by exact_mod_cast h) ·exact absurd h (by positivity) apply Ws rw[Ks,Ks,← fzRN,← fzRN] have e:=ExactRuntime.roundDyadic_congr FloatFormat.binary64 (by decide) ⟨decide (M1<0),M1.natAbs,E1⟩ ⟨decide (M2<0),M2.natAbs,E2⟩ (by simpa using h1) (by simpa using h2) (by simp only[pR,fzSS];exact h) simp[Model.roundDyadic,Gq] at e exact e theorem fzZ(s:pK):(J5 (.zero s)).unpack=.zero s:=by cases s<;>rfl open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSA(s:pK)(n:ℤ):((s.apply n:ℤ):ℝ)=(if K6 s=true then -1 else 1)*(n:ℝ):=by cases s<;>simp[Float.Model.UnpackedFloat.Sign.apply,K6] open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSM(s1 s2:pK):(if K6 (s1*s2)=true then (-1:ℝ) else 1)=(if K6 s1=true then -1 else 1)*(if K6 s2=true then -1 else 1):=by cases s1<;>cases s2<;>simp[K6] theorem fzBP(e:ℤ):kZ kO e=(2:ℝ)^e:=by simp[kZ,kO,mg] theorem fzAL(m:ℕ)(e t:ℤ)(h:t≤e):((m<<<(e-t).toNat:ℕ):ℝ)*(2:ℝ)^t=(m:ℝ)*(2:ℝ)^e:=by rw[ο];push_cast rw[Ap,← AA,← AK (by norm_num:(2:ℝ)≠0)] congr 2;omega open Float.Model.UnpackedFloat FloatLib.Floats.Formats.BinaryInterchange in theorem fzFma(x y z:Ἅ)(hX:x.toModel.unpack.isFinite=true)(hY:y.toModel.unpack.isFinite=true)(hP:(x*y).toModel.unpack.isFinite=true) (hV:Jo (x*y).toModel.unpack=Jo x.toModel.unpack*Jo y.toModel.unpack):Ui x y z=z+x*y:=by show (⟨x.toModel.fma y.toModel z.toModel⟩:Ἅ)=⟨z.toModel+(x*y).toModel⟩ congr 1 show J5 (fma .binary64 x.toModel.unpack y.toModel.unpack z.toModel.unpack)=J5 (add .binary64 z.toModel.unpack (x*y).toModel.unpack) have e3:(x*y).toModel=J5 (mul .binary64 x.toModel.unpack y.toModel.unpack):=rfl generalize hPd:(x*y).toModel.unpack=P at hP hV ⊢ rw[e3] at hPd generalize x.toModel.unpack=X at hX hV hPd ⊢ generalize y.toModel.unpack=Y at hY hV hPd ⊢ generalize z.toModel.unpack=Z cases X with | notANumber=>simp[isFinite] at hX | infinity s1=>simp[isFinite] at hX | zero s1=> cases Y with | notANumber=>simp[isFinite] at hY | infinity s2=>simp[isFinite] at hY | zero s2=> have hp:P=.zero (s1*s2):=by rw[← hPd];exact fzZ _ subst hp cases Z with | notANumber=>rfl | infinity s3=>rfl | zero s3=>cases s1<;>cases s2<;>cases s3<;>rfl | finite s3 m3 e3 h3=>rfl | finite s2 m2 e2 h2=> have hp:P=.zero (s1*s2):=by rw[← hPd];exact fzZ _ subst hp cases Z with | notANumber=>rfl | infinity s3=>rfl | zero s3=>cases s1<;>cases s2<;>cases s3<;>rfl | finite s3 m3 e3 h3=>rfl | finite s1 m1 e1 h1=> cases Y with | notANumber=>simp[isFinite] at hY | infinity s2=>simp[isFinite] at hY | zero s2=> have hp:P=.zero (s1*s2):=by rw[← hPd];exact fzZ _ subst hp cases Z with | notANumber=>rfl | infinity s3=>rfl | zero s3=>cases s1<;>cases s2<;>cases s3<;>rfl | finite s3 m3 e3 h3=>rfl | finite s2 m2 e2 h2=> have hm1:(0:ℝ) < m1:=by exact_mod_cast h1 have hm2:(0:ℝ) < m2:=by exact_mod_cast h2 have hVne:Jo P≠0:=by rw[hV,E6,E6,fzBP,fzBP] cases s1<;>cases s2<;>simp[K6,hm1.ne',hm2.ne']<;>exact⟨zpow_ne_zero _ (by norm_num),zpow_ne_zero _ (by norm_num)⟩ cases P with | notANumber=>simp[isFinite] at hP | infinity sP=>simp[isFinite] at hP | zero sP=>exact absurd (Kb sP) hVne | finite sP mP eP hmP=> cases Z with | notANumber=>rfl | infinity s3=>rfl | zero s3=> show J5 (mul .binary64 (.finite s1 m1 e1 h1) (.finite s2 m2 e2 h2))=J5 (.finite sP mP eP hmP) rw[← hPd,fzPU] | finite s3 m3 e3 h3=> apply fzVD rw[E6,E6,E6,fzBP,fzBP,fzBP] at hV have A:=fzAL (m1*m2) (e1+e2) (min (e1+e2) e3) (min_le_left _ _) have B:=fzAL m3 e3 (min (e1+e2) e3) (min_le_right _ _) have C:=fzAL m3 e3 (min e3 eP) (min_le_left _ _) have D:=fzAL mP eP (min e3 eP) (min_le_right _ _) have E:=fzSM s1 s2 have F:(2:ℝ)^(e1+e2)=(2:ℝ)^e1*(2:ℝ)^e2:=AK (by norm_num) _ _ push_cast at A rw[← Rat.cast_inj (α:=ℝ)] simp only[V7,Ji,D9,X8,U7,Qj,fzSA,P5] linear_combination (if K6 (s1*s2)=true then (-1:ℝ) else 1)*A+(if K6 s3=true then (-1:ℝ) else 1)*B-(if K6 s3=true then (-1:ℝ) else 1)*C-(if K6 sP=true then (-1:ℝ) else 1)*D+((m1:ℝ)*m2*(2:ℝ)^(e1+e2))*E-hV+((if K6 s1=true then (-1:ℝ) else 1)*(if K6 s2=true then (-1:ℝ) else 1)*m1*m2)*F def Yarm:Bool:=!(System.Platform.target.startsWith "x86") @[inline] def fM(arm:Ἆ)(a x q:Ἅ):Ἅ:=if arm then Ui x q a else a+x*q abbrev FMok(arm:Ἆ)(Q Y:ἀ)(vo i0 nu:Ἄ):Prop:=∀ s<(J0 nu),∀ l<8,∀ a:Ἅ,fM arm a Y.data[(J0 vo)+s]! Q.data[(J0 i0)+8*s+l]! = a+Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+l]! theorem FMok_f(Q Y:ἀ)(vo i0 nu:Ἄ):FMok false Q Y vo i0 nu:=fun _ _ _ _ _=>rfl theorem fzD(arm:Ἆ)(w:ἇ)(hw:kB w≠255)(q:Ἅ)(hq:(∃ v,kB v≠255∧q=dw v)∨q=0)(a:Ἅ):fM arm a (dw w) q=a+dw w*q:=by cases arm;·rfl show Ui (dw w) q a=a+dw w*q have X:=cI w hw rcases hq with ⟨v,hv,rfl⟩|rfl ·have V:=cI v hv;have P:=dJ w v hw hv apply fzFma _ _ _ ((fO _).1 X.1) ((fO _).1 V.1) ((fO _).1 P.1) rw[← iL,← iL,← iL,P.2,X.2,V.2];unfold tm;push_cast;ring ·have Z:=kZ0;have P:=jo (dw w) 0 X.1 Z.1 (by rw[Z.2,mul_zero,A5];positivity) apply fzFma _ _ _ ((fO _).1 X.1) ((fO _).1 Z.1) ((fO _).1 P.1) rw[← iL,← iL,← iL,P.2,Z.2,mul_zero];simp [pD] @[inline] def sM1(arm:Ἆ)(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(h:(J0 t)<(J0 nu))(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ):A8:= have C:=sMb1 Q Y vo nu i0 hY hQ t h let i:=i0+8*t let x:=Y.uget (vo+t) C.2.2.1 ⟨fM arm a0 x (Q.uget (i+0) (kIx7 i 0 0 kc0 n5d0 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a1 x (Q.uget (i+1) (kIx7 i 1 1 kc1 n5d1 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a2 x (Q.uget (i+2) (kIx7 i 2 2 kc2 n5d2 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a3 x (Q.uget (i+3) (kIx7 i 3 3 kc3 n5d3 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a4 x (Q.uget (i+4) (kIx7 i 4 4 kc4 n5d4 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a5 x (Q.uget (i+5) (kIx7 i 5 5 kc5 n5d5 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a6 x (Q.uget (i+6) (kIx7 i 6 6 kc6 n5d6 Q C.2.2.2.1 C.2.2.2.2.1)),fM arm a7 x (Q.uget (i+7) (kIx7 i 7 7 kc7 n5d7 Q C.2.2.2.1 C.2.2.2.2.1))⟩ theorem sM1_spec(arm:Ἆ)(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(hF:FMok arm Q Y vo i0 nu)(t:Ἄ)(h:(J0 t)<(J0 nu))(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) : sM1 arm Q Y vo nu i0 hY hQ t h a0 a1 a2 a3 a4 a5 a6 a7=⟨a0+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+0]!,a1+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+1]!,a2+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+2]!,a3+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+3]!,a4+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+4]!,a5+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+5]!,a6+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+6]!,a7+Y.data[(J0 vo)+(J0 t)]! * Q.data[(J0 i0)+8*(J0 t)+7]!⟩:=by have C:=sMb1 Q Y vo nu i0 hY hQ t h have ex : ∀ h,Y.uget (vo+t) h=Y.data[(J0 vo)+(J0 t)]! := fun h=>by rw [kFU,C.1] have eq : ∀ (k:Ἄ)(c:ℕ)(hk:(J0 k)=c)(hc:c≤7) h,Q.uget ((i0+8*t)+k) h=Q.data[(J0 i0)+8*(J0 t)+c]! := fun k c hk hc h=>by rw [kFU,kSm (i0+8*t) k (C0 (J1 (hk ▸ hc) _) C.2.2.2.2.1),hk,C.2.1] unfold sM1; simp (disch:=decide) only [ex,eq 0 0 kc0 n5d0,eq 1 1 kc1 n5d1,eq 2 2 kc2 n5d2,eq 3 3 kc3 n5d3,eq 4 4 kc4 n5d4,eq 5 5 kc5 n5d5,eq 6 6 kc6 n5d6,eq 7 7 kc7 n5d7,hF (J0 t) h] def sM(Q Y:ἀ)(vo nu i0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(ht0:(J0 t)<=(J0 nu))(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ):A8:= if h:t+1Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+0]!) (J0 nu) (J0 t) a0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+1]!) (J0 nu) (J0 t) a1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+2]!) (J0 nu) (J0 t) a2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+3]!) (J0 nu) (J0 t) a3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+4]!) (J0 nu) (J0 t) a4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+5]!) (J0 nu) (J0 t) a5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+6]!) (J0 nu) (J0 t) a6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+7]!) (J0 nu) (J0 t) a7⟩:=by intro m; induction m using Z5 with | _ m ih => intro t ht0 a0 a1 a2 a3 a4 a5 a6 a7 hm have T:=sMbT Q Y vo nu i0 hY hQ t ht0 by_cases h3:(J0 t) < (J0 nu) · by_cases h2:(J0 t)+1 < (J0 nu) · have B:=sMb Q Y vo nu i0 hY hQ t h3 h2 have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=ao f (J0 nu) ((J0 t)+2) ((a+f (J0 t))+f ((J0 t)+1)):=fun f a=>by rw [aos f _ _ a h3,aos f _ _ _ h2] rw [sM,AT (ε.mpr (by rw [T]; exact h2))]; simp only [sM1_spec false Q Y vo nu i0 hY hQ (FMok_f _ _ _ _ _)] rw [ih ((J0 nu)-(J0 (t+2))) (by rw [B.1, ← hm]; exact U5 h3 (X6 (by decide))) (t+2) _ _ _ _ _ _ _ _ _ rfl] simp only [B.1,T,st] · have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a+f (J0 t):=fun f a=>by rw [aos f _ _ a h3,aoe f _ _ _ (V4 h2)] rw [sM,dite_eq_right (fun h=>h2 (by rw [← T]; exact ε.mp h)),AT (ε.mpr h3),sM1_spec false Q Y vo nu i0 hY hQ (FMok_f _ _ _ _ _)] simp only [st] · have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=fun f a=>aoe f _ _ a (V4 h3) rw [sM,dite_eq_right (fun h=>h3 (E7 (show (J0 t)+1 < (J0 nu) by rw [← T]; exact ε.mp h))),dite_eq_right (fun h=>h3 (ε.mp h))] simp only [st] @[inline] def w8(S:ἀ)(o:Ἄ)(y:A8)(h:(J0 o)+7<(kS S))(h2:(J0 o)+7<2^(31:Ἀ)):ἀ:= let S1:=S.uset (o+0) y.a0 (kIx7 o 0 0 kc0 (by decide) S h h2) have g1:(J0 o)+7<(kS S1):=h.trans_eq (uZ _ _ _ _).symm let S2:=S1.uset (o+1) y.a1 (kIx7 o 1 1 kc1 (by decide) S1 g1 h2) have g2:(J0 o)+7<(kS S2):=g1.trans_eq (uZ _ _ _ _).symm let S3:=S2.uset (o+2) y.a2 (kIx7 o 2 2 kc2 (by decide) S2 g2 h2) have g3:(J0 o)+7<(kS S3):=g2.trans_eq (uZ _ _ _ _).symm let S4:=S3.uset (o+3) y.a3 (kIx7 o 3 3 kc3 (by decide) S3 g3 h2) have g4:(J0 o)+7<(kS S4):=g3.trans_eq (uZ _ _ _ _).symm let S5:=S4.uset (o+4) y.a4 (kIx7 o 4 4 kc4 (by decide) S4 g4 h2) have g5:(J0 o)+7<(kS S5):=g4.trans_eq (uZ _ _ _ _).symm let S6:=S5.uset (o+5) y.a5 (kIx7 o 5 5 kc5 (by decide) S5 g5 h2) have g6:(J0 o)+7<(kS S6):=g5.trans_eq (uZ _ _ _ _).symm let S7:=S6.uset (o+6) y.a6 (kIx7 o 6 6 kc6 (by decide) S6 g6 h2) have g7:(J0 o)+7<(kS S7):=g6.trans_eq (uZ _ _ _ _).symm S7.uset (o+7) y.a7 (kIx7 o 7 7 kc7 (by decide) S7 g7 h2) theorem w8_size(S:ἀ)(o:Ἄ)(y:A8)(h:(J0 o)+7<(kS S))(h2:(J0 o)+7<2^(31:Ἀ)):(kS (w8 S o y h h2))=(kS S):=by unfold w8;dsimp only;simp only[uZ] theorem w8_st (S S0:ἀ)(o k:Ἄ)(c:ℕ)(hk:(J0 k)=c)(hc:c≤7)(v:Ἅ)(lz:ℕ→Ἅ)(hv:v=lz c)(h:(J0 o)+7<(kS S))(h2:(J0 o)+7<2^(31:Ἀ)) (H:∀ q,S.data[q]! = if (J0 o) ≤ q∧q < (J0 o)+c then lz (q-(J0 o)) else S0.data[q]!) : ∀ q,(S.uset (o+k) v (kIx7 o k c hk hc S h h2)).data[q]! = if (J0 o) ≤ q∧q < (J0 o)+(c+1) then lz (q-(J0 o)) else S0.data[q]! := by intro q; rw [kFS,kSm o k (by omega),hk,H] by_cases e:(J0 o)+c=q · subst e; rw [AD rfl,AD (by omega),hv,ϱ] · rw [AC e]; by_cases g:(J0 o) ≤ q∧q < (J0 o)+c · rw [AD g,AD (by omega)] · rw [AC g,AC (by omega)] theorem w8_spec(S:ἀ)(o:Ἄ)(y:A8)(h:(J0 o)+7<(kS S))(h2:(J0 o)+7<2^(31:Ἀ))(q:ℕ): (w8 S o y h h2).data[q]! = if (J0 o) ≤ q∧q < (J0 o)+8 then lsel y.a0 y.a1 y.a2 y.a3 y.a4 y.a5 y.a6 y.a7 (q-(J0 o)) else S.data[q]! := by have H0 : ∀ q,S.data[q]! = if (J0 o) ≤ q∧q < (J0 o)+0 then lsel y.a0 y.a1 y.a2 y.a3 y.a4 y.a5 y.a6 y.a7 (q-(J0 o)) else S.data[q]! := fun q=>by rw [AC (by omega)] have H1:=w8_st S S o 0 0 kc0 (by decide) y.a0 _ (by simp [lsel]) h h2 H0 have H2:=w8_st _ S o 1 1 kc1 (by decide) y.a1 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H1 have H3:=w8_st _ S o 2 2 kc2 (by decide) y.a2 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H2 have H4:=w8_st _ S o 3 3 kc3 (by decide) y.a3 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H3 have H5:=w8_st _ S o 4 4 kc4 (by decide) y.a4 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H4 have H6:=w8_st _ S o 5 5 kc5 (by decide) y.a5 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H5 have H7:=w8_st _ S o 6 6 kc6 (by decide) y.a6 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H6 have H8:=w8_st _ S o 7 7 kc7 (by decide) y.a7 _ (by simp [lsel]) (by simp only [uZ]; exact h) h2 H7 exact H8 q theorem sPb(n G g vo Ys Qs Bs Ss:ℕ)(hg:g rfl theorem n5g(g G k:ℕ)(hk:k<3)(h:g+3<=G):g+kby rw [kFU,C.1] have eqi : ∀ (k:Ἄ)(c:ℕ)(hk:(J0 k)=c)(hc:c≤7) h,Q.uget ((i0+8*t)+k) h=Q.data[(J0 i0)+8*(J0 t)+c]! := fun k c hk hc h=>by rw [kFU,kSm (i0+8*t) k (C0 (J1 (hk ▸ hc) _) C.2.2.2.2.1),hk,C.2.1] have eqj : ∀ (k:Ἄ)(c:ℕ)(hk:(J0 k)=c)(hc:c≤7) h,Q.uget ((j0+8*t)+k) h=Q.data[(J0 j0)+8*(J0 t)+c]! := fun k c hk hc h=>by rw [kFU,kSm (j0+8*t) k (C0 (J1 (hk ▸ hc) _) D.2.2.2.2.1),hk,D.2.1] have eqk : ∀ (k:Ἄ)(c:ℕ)(hk:(J0 k)=c)(hc:c≤7) h,Q.uget ((k0+8*t)+k) h=Q.data[(J0 k0)+8*(J0 t)+c]! := fun k c hk hc h=>by rw [kFU,kSm (k0+8*t) k (C0 (J1 (hk ▸ hc) _) E.2.2.2.2.1),hk,E.2.1] unfold st24; simp (disch:=decide) only [hFi (J0 t) h,hFj (J0 t) h,hFk (J0 t) h,ex,eqi 0 0 kc0 n5d0,eqi 1 1 kc1 n5d1,eqi 2 2 kc2 n5d2,eqi 3 3 kc3 n5d3,eqi 4 4 kc4 n5d4,eqi 5 5 kc5 n5d5,eqi 6 6 kc6 n5d6,eqi 7 7 kc7 n5d7,eqj 0 0 kc0 n5d0,eqj 1 1 kc1 n5d1,eqj 2 2 kc2 n5d2,eqj 3 3 kc3 n5d3,eqj 4 4 kc4 n5d4,eqj 5 5 kc5 n5d5,eqj 6 6 kc6 n5d6,eqj 7 7 kc7 n5d7,eqk 0 0 kc0 n5d0,eqk 1 1 kc1 n5d1,eqk 2 2 kc2 n5d2,eqk 3 3 kc3 n5d3,eqk 4 4 kc4 n5d4,eqk 5 5 kc5 n5d5,eqk 6 6 kc6 n5d6,eqk 7 7 kc7 n5d7] def sM24(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ))):(f:ℕ)→(t:Ἄ)→((J0 t)+2*f=(J0 nu))→(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ)→A24 | 0,_,_,a0,a1,a2,a3,a4,a5,a6,a7,c0,c1,c2,c3,c4,c5,c6,c7,d0,d1,d2,d3,d4,d5,d6,d7=>⟨⟨a0,a1,a2,a3,a4,a5,a6,a7⟩,⟨c0,c1,c2,c3,c4,c5,c6,c7⟩,⟨d0,d1,d2,d3,d4,d5,d6,d7⟩⟩ | f+1,t,ht,a0,a1,a2,a3,a4,a5,a6,a7,c0,c1,c2,c3,c4,c5,c6,c7,d0,d1,d2,d3,d4,d5,d6,d7 => have h2:=n5p t nu f ht have h:=E7 h2 have C:=sMb1 Q Y vo nu i0 hY hI t h have C2:=sMb Q Y vo nu i0 hY hI t h h2 let r:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK t h a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 let r2:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (t+1) (by rw[C.2.2.2.2.2];exact h2) r.a.a0 r.a.a1 r.a.a2 r.a.a3 r.a.a4 r.a.a5 r.a.a6 r.a.a7 r.c.a0 r.c.a1 r.c.a2 r.c.a3 r.c.a4 r.c.a5 r.c.a6 r.c.a7 r.d.a0 r.d.a1 r.d.a2 r.d.a3 r.d.a4 r.d.a5 r.d.a6 r.d.a7 sM24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK f (t+2) (n5q t nu f C2.1 ht) r2.a.a0 r2.a.a1 r2.a.a2 r2.a.a3 r2.a.a4 r2.a.a5 r2.a.a6 r2.a.a7 r2.c.a0 r2.c.a1 r2.c.a2 r2.c.a3 r2.c.a4 r2.c.a5 r2.c.a6 r2.c.a7 r2.d.a0 r2.d.a1 r2.d.a2 r2.d.a3 r2.d.a4 r2.d.a5 r2.d.a6 r2.d.a7 theorem sM24_spec(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hFi:FMok arm Q Y vo i0 nu)(hFj:FMok arm Q Y vo j0 nu)(hFk:FMok arm Q Y vo k0 nu) : ∀ f (t:Ἄ)(ht:(J0 t)+2*f=(J0 nu))(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ), sM24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK f t ht a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 = ⟨⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+0]!) (J0 nu) (J0 t) a0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+1]!) (J0 nu) (J0 t) a1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+2]!) (J0 nu) (J0 t) a2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+3]!) (J0 nu) (J0 t) a3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+4]!) (J0 nu) (J0 t) a4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+5]!) (J0 nu) (J0 t) a5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+6]!) (J0 nu) (J0 t) a6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+7]!) (J0 nu) (J0 t) a7⟩,⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+0]!) (J0 nu) (J0 t) c0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+1]!) (J0 nu) (J0 t) c1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+2]!) (J0 nu) (J0 t) c2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+3]!) (J0 nu) (J0 t) c3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+4]!) (J0 nu) (J0 t) c4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+5]!) (J0 nu) (J0 t) c5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+6]!) (J0 nu) (J0 t) c6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+7]!) (J0 nu) (J0 t) c7⟩,⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+0]!) (J0 nu) (J0 t) d0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+1]!) (J0 nu) (J0 t) d1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+2]!) (J0 nu) (J0 t) d2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+3]!) (J0 nu) (J0 t) d3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+4]!) (J0 nu) (J0 t) d4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+5]!) (J0 nu) (J0 t) d5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+6]!) (J0 nu) (J0 t) d6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+7]!) (J0 nu) (J0 t) d7⟩⟩:=by intro f; induction f with | zero => intro t ht a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=fun f a=>aoe f _ _ a (Y3 (by omega)) show (⟨⟨a0,a1,a2,a3,a4,a5,a6,a7⟩,⟨c0,c1,c2,c3,c4,c5,c6,c7⟩,⟨d0,d1,d2,d3,d4,d5,d6,d7⟩⟩:A24)=_; simp only [st] | succ f ih => intro t ht a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 have h2:=n5p t nu f ht have h3:=E7 h2 have C:=sMb1 Q Y vo nu i0 hY hI t h3 have C2:=sMb Q Y vo nu i0 hY hI t h3 h2 have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=ao f (J0 nu) ((J0 t)+2) ((a+f (J0 t))+f ((J0 t)+1)):=fun f a=>by rw [aos f _ _ a h3,aos f _ _ _ h2] show (let r:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK t h3 a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7; let r2:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (t+1) (by rw[C.2.2.2.2.2];exact h2) r.a.a0 r.a.a1 r.a.a2 r.a.a3 r.a.a4 r.a.a5 r.a.a6 r.a.a7 r.c.a0 r.c.a1 r.c.a2 r.c.a3 r.c.a4 r.c.a5 r.c.a6 r.c.a7 r.d.a0 r.d.a1 r.d.a2 r.d.a3 r.d.a4 r.d.a5 r.d.a6 r.d.a7; sM24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK f (t+2) (n5q t nu f C2.1 ht) r2.a.a0 r2.a.a1 r2.a.a2 r2.a.a3 r2.a.a4 r2.a.a5 r2.a.a6 r2.a.a7 r2.c.a0 r2.c.a1 r2.c.a2 r2.c.a3 r2.c.a4 r2.c.a5 r2.c.a6 r2.c.a7 r2.d.a0 r2.d.a1 r2.d.a2 r2.d.a3 r2.d.a4 r2.d.a5 r2.d.a6 r2.d.a7)=_ simp only [st24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk] rw [ih] simp only [C2.1,C.2.2.2.2.2,st] theorem n5o(nu:Ἄ)(n:ℕ)(en:(J0 nu)=n)(h:n%2=1):(J0 0)<(J0 nu)∧(J0 1)+2*(n/2)=(J0 nu):=by rw[kc0,kc1,en];omega theorem n5e(nu:Ἄ)(n:ℕ)(en:(J0 nu)=n)(h:¬n%2=1):(J0 0)+2*(n/2)=(J0 nu):=by rw[kc0,en];omega @[inline] def sM24P(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(n:ℕ)(en:(J0 nu)=n)(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ):A24:= if h:n%2=1 then have H:=n5o nu n en h let r:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK 0 H.1 a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 sM24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (n/2) 1 H.2 r.a.a0 r.a.a1 r.a.a2 r.a.a3 r.a.a4 r.a.a5 r.a.a6 r.a.a7 r.c.a0 r.c.a1 r.c.a2 r.c.a3 r.c.a4 r.c.a5 r.c.a6 r.c.a7 r.d.a0 r.d.a1 r.d.a2 r.d.a3 r.d.a4 r.d.a5 r.d.a6 r.d.a7 else sM24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (n/2) 0 (n5e nu n en h) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 theorem sM24P_spec(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hFi:FMok arm Q Y vo i0 nu)(hFj:FMok arm Q Y vo j0 nu)(hFk:FMok arm Q Y vo k0 nu)(n:ℕ)(en:(J0 nu)=n)(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ) : sM24P arm Q Y vo nu i0 j0 k0 hY hI hJ hK n en a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 = ⟨⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+0]!) (J0 nu) 0 a0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+1]!) (J0 nu) 0 a1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+2]!) (J0 nu) 0 a2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+3]!) (J0 nu) 0 a3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+4]!) (J0 nu) 0 a4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+5]!) (J0 nu) 0 a5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+6]!) (J0 nu) 0 a6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+7]!) (J0 nu) 0 a7⟩,⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+0]!) (J0 nu) 0 c0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+1]!) (J0 nu) 0 c1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+2]!) (J0 nu) 0 c2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+3]!) (J0 nu) 0 c3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+4]!) (J0 nu) 0 c4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+5]!) (J0 nu) 0 c5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+6]!) (J0 nu) 0 c6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+7]!) (J0 nu) 0 c7⟩,⟨ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+0]!) (J0 nu) 0 d0,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+1]!) (J0 nu) 0 d1,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+2]!) (J0 nu) 0 d2,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+3]!) (J0 nu) 0 d3,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+4]!) (J0 nu) 0 d4,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+5]!) (J0 nu) 0 d5,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+6]!) (J0 nu) 0 d6,ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+7]!) (J0 nu) 0 d7⟩⟩:=by unfold sM24P by_cases h:n%2=1 · rw [AT h]; dsimp only have H:=n5o nu n en h rw [sM24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk,st24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk]; dsimp only have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) 0 a=ao f (J0 nu) 1 (a+f 0):=fun f a=>aos f _ _ a (by rw [kc0] at H; exact H.1) simp only [kc0,kc1,st] · rw [dite_eq_right h,sM24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk,kc0] @[inline] def zR(v:Ἅ)(relu:Ἆ)(H:ἆ):ἇ:= let c:=ak v H if c<(4294967296:ἆ) then (let w:=N3 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) @[inline] def zQ(v:Ἅ)(relu:Ἆ)(H:ἆ):ἇ:= let b:=v.toBits;let E:=eF b;let d:=H+1075-E;let g:=(1:ἆ)<<>>29)&&&8388607!=0 then let w:=N3 (((b>>>63)<<<31)+(t>>>29)-0x255000000) if relu then (if w<0x80000000 then w else 0) else w else 0xFFFFFFFF theorem zQu(b:ἆ):(b+268435456)&&&536870911=((b&&&0xfffffffffffff)+268435456)&&&536870911:=by apply ξ.1;simp only[Ε,η];rw[show (536870911:ἆ).toNat=2^29-1 from rfl,show (0xfffffffffffff:ἆ).toNat=2^52-1 from rfl,show (268435456:ἆ).toNat=2^28 from rfl,ζ,ζ,ζ];have:=b.toNat_lt;omega theorem zQr(b:ἆ):((b+268435456)>>>(29:ἆ))&&&(8388607:ἆ)=(((b&&&(0x7FFFFFFFFFFFFFFF:ἆ))+268435456)>>>(29:ἆ))&&&(8388607:ἆ):=by apply ξ.1;simp only[Ε,η,ν];rw[show (8388607:ἆ).toNat=2^23-1 from rfl,show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,show (268435456:ἆ).toNat=2^28 from rfl,show (29:ἆ).toNat%64=29 from rfl];simp only[ζ,β];have:=b.toNat_lt;omega theorem zQm(relu:Ἆ)(w:ἇ):w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))=(if relu then (if w<0x80000000 then w else 0) else w):=by have fa:w&&&(4294967295:ἇ)=w:=by apply Β.1;rw[Ξ,show (4294967295:ἇ).toNat=2^32-1 from rfl,ζ];exact γ w.toNat_lt have l:=w.toNat_lt by_cases h:w<0x80000000 · have z:w>>>31=0:=by apply Β.1;rw[Υ,β];rw[Ι]at h;simp at h⊢;omega cases relu<;>simp only[z,h,ἁ,υ,ἂ]<;>exact fa · have z:w>>>31=1:=by apply Β.1;rw[Υ,β];rw[Ι]at h;simp at h⊢;omega cases relu<;>simp only[z,h,ἁ,υ,ἂ] · exact fa · apply Β.1;rw[Ξ];simp theorem zQeq(v:Ἅ)(relu:Ἆ)(H:ἆ):zQ v relu H=zR v relu H:=by unfold zQ zR ak eF;dsimp only;generalize v.toBits=b;rw[zQu b,zQr b];split · rename_i hc;simp only[Η,AJ]at hc;obtain⟨⟨⟨-,h2⟩,-⟩,-⟩:=hc;have l:=b.toNat_lt rw[μ,Ζ,Ε,ν]at h2;simp only[show (2047:ἆ).toNat=2^11-1 from rfl,ζ,β]at h2;simp only[kA,kH,nr,Nat.reduceSub]at h2 have hm:b.toNat%2^63=b.toNat%2^52+2^52*(b.toNat/2^52%2^11):=by rw[show (2:Ἀ)^63=2^52*2^11 from rfl];exact Xf have hm2:b.toNat%2^52<2^52:=ϊ _ (϶ 52) have hE:1195<=b.toNat/2^52%2^11∧b.toNat/2^52%2^11<=1447:=by omega have r2:b.toNat%9223372036854775808<1448*2^52∧1195*2^52<=b.toNat%9223372036854775808:=by rw[show (9223372036854775808:Ἀ)=2^63 from rfl,hm];omega have nw:(b.toNat%9223372036854775808+268435456)%18446744073709551616=b.toNat%9223372036854775808+268435456:=γ (by omega) have gb:10024386560<=(b.toNat%9223372036854775808+268435456)/536870912∧(b.toNat%9223372036854775808+268435456)/536870912<=12146704384:=by omega have f1:b.toNat/9223372036854775808<=1:=by omega have hlt:((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000<(4294967296:ἆ):=by rw[μ,Ζ,η,ψ,ν,ν,η,Ε];simp only[show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,ζ,β,ο];simp;rw[nw] have key:∀ X:Ἀ,10015997952<=X→X<10015997952+4294967296→(18446744063693553664+X)%18446744073709551616<4294967296:=by intro X h1 h2;rw[K8 (by omega),γ (by omega)];omega exact key _ (by omega) (by omega) rw[AD hlt] have hw:N3 (((b>>>63)<<<31)+((b+268435456)>>>29)-0x255000000)=N3 (((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000):=by apply Β.1;simp only[Ϫ,Ζ,η,ψ,ν,Ε];simp only[show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,ζ,β,ο];simp;omega rw[hw,zQm] · simp theorem kAkBig (S:Ἅ):ak S 4000=4294967296:=by unfold ak; unfold F.eF; dsimp only generalize S.toBits=b rw [AC] intro h simp only [Η,AJ] at h obtain ⟨⟨⟨h1, -⟩, -⟩, -⟩:=h have hE:((b>>>52)&&&2047).toNat ≤ 2047:=by rw [Ε]; exact ϝ have hl:(b>>>52)&&&2047 ≤ (4000:ἆ)+1075:=by rw [θ]; exact hE.trans (by decide) rw [θ,χ _ _ hl] at h1 have:((4000:ἆ)+1075).toNat=5075:=by decide rw [this] at h1; have:(26:ἆ).toNat=26:=by decide omega theorem kZRBig (v:Ἅ)(relu:Ἆ):zR v relu 4000=(0xFFFFFFFF:ἇ):=by unfold zR; rw [kAkBig]; rfl theorem kZR (v:Ἅ)(H:ἆ)(relu:Ἆ)(n:ℕ)(D Wf:ℕ→Ἃ)(Fb:Ἃ)(hfb:Fb=p8 relu (ms (n+1) D Wf)) (g:aG (n+1) D Wf)(fv1:fv v)(b1:|rv v-(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^((H.toNat:ℕ):ℤ))(b2:|(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^(425:ℤ))(b6:H.toNat ≤ 600) : (if zR v relu H==(0xFFFFFFFF:Ἃ) then Fb else zR v relu H)=p8 relu (ms (n+1) D Wf):=by unfold zR; dsimp only by_cases hc:ak v H < (4294967296:ἆ) · have R:=cw (n+1) D Wf g v fv1 H (by omega) b1 b2 hc rw [AD hc,kReluW relu _ (kAkF v H hc),R] by_cases hf:p8 relu (ms (n+1) D Wf)=0xFFFFFFFF · rw [hf]; simp only [Az,ἁ]; rw [hfb,hf] · have hn:(p8 relu (ms (n+1) D Wf)==0xFFFFFFFF)=false:=by simpa using hf simp only [hn,υ,ἂ] · simp only [AC hc,Az,ἁ]; exact hfb noncomputable def oR(relu:Ἆ)(n:Nat)(X W b E:Ἂ ἇ)(ix ib L:Nat)(Y Q:ἀ)(vo rn:Nat)(em cq hb:ἆ)(j:Nat)(v:Ἅ):ἇ:= if zR v relu (if ((if em<(56:ἆ) then (56:ἆ) else em)+cq)<=(372:ἆ) then (if hb>((if em<(56:ἆ) then (56:ἆ) else em)+cq) then hb else ((if em<(56:ἆ) then (56:ἆ) else em)+cq)) else (4000:ἆ))==(0xFFFFFFFF:ἇ) then oV relu n X W b E ix ib L Y Q vo rn cq hb j v else zR v relu (if ((if em<(56:ἆ) then (56:ἆ) else em)+cq)<=(372:ἆ) then (if hb>((if em<(56:ἆ) then (56:ἆ) else em)+cq) then hb else ((if em<(56:ἆ) then (56:ἆ) else em)+cq)) else (4000:ἆ)) theorem kOutR (relu:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix ib L H:ℕ)(Y Q:ἀ)(vo rn j:ℕ)(em cq hb:ἆ)(v Lf:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(hbF:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ ib)(Hn:n+2 ≤ 2^L)(x:L≤27)(z:ib+L≤425)(hn:0Y.data[vo+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (hLf:Lf=ao (fun k=>dw (X[rn+k]! &&& 0x7FFFFFFF)) n 0 0) (hcq:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat Lf) (hhb:hb=(ib+L-50).toUInt64) (hEm:(E[j]!).toNat ≤ em.toNat)(hem:em.toNat < 255) : oR relu n X W b E ix ib L Y Q vo rn em cq hb j v=p8 relu (ms (n+1) (fun s=>if s < n then X[rn+s]! else ld) (fun s=>if s < n then W[j*n+s]! else b[j]!)):=by have KV:=kOutV relu n X W b E ix ib L H Y Q vo rn j cq hb v Lf F hbF M Hn x z hn hEv hYv hQv hv hLf hcq hhb unfold oR by_cases hP:((if em<(56:ἆ) then (56:ἆ) else em)+cq)<=(372:ἆ) · rw [AD hP] have c:=kCEb (I0 (9*(n+1))).toInt64.toFloat Lf have ej:(E[j]!).toUInt64.toNat=(E[j]!).toNat:=ϩ _ have hEl:(E[j]!).toNat < 255:=C0 hEm hem have tpj:((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq).toNat=max (E[j]!).toUInt64.toNat 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat:=by rw [hcq]; exact kOutW_h1 _ _ (by rw [ej]; exact hEl) c have tP:((if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat=max em.toNat 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat:=by rw [hcq]; exact kOutW_h1 _ _ hem c have hP':((if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat ≤ 372:=hP have mE:max (E[j]!).toUInt64.toNat 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat ≤ max em.toNat 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat Lf).toNat := L1 (L1 (max_le_max_right 56 (by rw [ej]; exact hEm)) 23) _ have pj:((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) ≤ (372:ἆ):=(show ((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq).toNat ≤ 372 by rw [tpj]; exact mE.trans (by rw [← tP]; exact hP')) obtain ⟨g,fv1,b1,b2,_,b6⟩:=kOutW n X W b E ix ib L H Y Q vo rn j cq hb _ v Lf F hbF M Hn x z hn hEv hYv hQv hv hLf hcq hhb rfl hEl pj have mono:(if hb>((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) then hb else ((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq)).toNat ≤ (if hb>((if em<(56:ἆ) then (56:ἆ) else em)+cq) then hb else ((if em<(56:ἆ) then (56:ἆ) else em)+cq)).toNat:=by rw [kOutW_h2,kOutW_h2,tpj,tP]; exact max_le_max_left _ mE have h6:(if hb>((if em<(56:ἆ) then (56:ἆ) else em)+cq) then hb else ((if em<(56:ἆ) then (56:ἆ) else em)+cq)).toNat ≤ 600:=by rw [kOutW_h2] at b6 ⊢; exact max_le ((le_max_left _ _).trans b6) (hP'.trans (by decide)) exact kZR v _ relu n _ _ _ KV g fv1 (AZ b1 (AG (by norm_num) (by exact_mod_cast mono))) b2 h6 · rw [AC hP,kZRBig]; simp only [Az,ἁ]; exact KV structure DC where relu:Ἆ n:Nat X:Ἂ ἇ K:DK ix:Nat ib:Nat L:Nat Y:ἀ hb:ἆ em:ἆ f9:Ἅ arm:Ἆ @[reducible,inline] def DC.W(c:DC):Ἂ ἇ:=c.K.W @[reducible,inline] def DC.b(c:DC):Ἂ ἇ:=c.K.b @[reducible,inline] def DC.E(c:DC):Ἂ ἇ:=c.K.E @[reducible,inline] def DC.Q(c:DC):ἀ:=c.K.Q @[reducible,inline] def DC.Bd(c:DC):ἀ:=c.K.Bd abbrev FMc(c:DC)(vo n G:Nat):Prop:=∀ sfzD c.arm _ (hX _) _ (pZ ⟨_,hW _ h s hs,rfl⟩) a,(fO _).1 (cI _ (hW _ h s hs)).1⟩ ·exact ⟨fun a=>fzD c.arm _ (hX _) _ (BA rfl) a,(fO _).1 kZ0.1⟩ @[noinline] def dnS(c:@& DC)(vo rn:Nat)(cq:ἆ)(j:Nat)(v:Ἅ):ἇ:= if zq2 v (c.E[j]!).toUInt64 c.relu cq c.hb==(0xFFFFFFFF:ἇ) then sQ2 c.relu c.n c.X c.W c.b c.E c.ix c.ib c.L c.Y c.Q vo rn j (if c.hb > (if (c.E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (c.E[j]!).toUInt64)+cq then c.hb else (if (c.E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (c.E[j]!).toUInt64)+cq) v else zq2 v (c.E[j]!).toUInt64 c.relu cq c.hb theorem dnS_eq(c:DC)(vo rn:Nat)(cq:ἆ)(j:Nat)(v:Ἅ):dnS c vo rn cq j v=oV c.relu c.n c.X c.W c.b c.E c.ix c.ib c.L c.Y c.Q vo rn cq c.hb j v:=rfl @[inline] def dn1(c:@& DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(l cnt q s:Ἄ)(v:Ἅ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,ke h.2)] · rename_i hl; rw [AC (show ¬(lhl h.1)] @[noinline] def dn8(c:@& DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,kby rw [r0.2]; exact hin k hk) let r2:=dn1 c vo rn cq H j 2 cnt q s a2 r1.1 (fun k hk=>by rw [r1.2,r0.2]; exact hin k hk) let r3:=dn1 c vo rn cq H j 3 cnt q s a3 r2.1 (fun k hk=>by rw [r2.2,r1.2,r0.2]; exact hin k hk) let r4:=dn1 c vo rn cq H j 4 cnt q s a4 r3.1 (fun k hk=>by rw [r3.2,r2.2,r1.2,r0.2]; exact hin k hk) let r5:=dn1 c vo rn cq H j 5 cnt q s a5 r4.1 (fun k hk=>by rw [r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk) let r6:=dn1 c vo rn cq H j 6 cnt q s a6 r5.1 (fun k hk=>by rw [r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk) (dn1 c vo rn cq H j 7 cnt q s a7 r6.1 (fun k hk=>by rw [r6.2,r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk)).1 theorem dn8_size(c:DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ): (dn8 c vo rn cq H j cnt q s out hin a0 a1 a2 a3 a4 a5 a6 a7).size=out.size:=by unfold dn8; dsimp only; simp only [dn1_sz] noncomputable def dnV(c:DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(v:Ἅ):ἇ:= if zR v c.relu H==(0xFFFFFFFF:ἇ) then oV c.relu c.n c.X c.W c.b c.E c.ix c.ib c.L c.Y c.Q vo rn cq c.hb j v else zR v c.relu H theorem dn1_ne(c:DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(l cnt q s:Ἄ)(v:Ἅ)(out:Ἂ ἇ)(hin)(i:Nat) (h:¬(l h k.toNat (ε.mp g.1) (by rw [← dnIx q s k (Jf hk) hq]; exact g.2) unfold dn8; dsimp only rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 4 (by rw [kc4]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 3 (by rw [kc3]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 2 (by rw [kc2]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 1 (by rw [kc1]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 0 (by rw [kc0]; try decide))] theorem dn8_hit(c:DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(l:Nat) (hl:l e (N7 hs1 (F7 ((dnIx q s k (Jf hk) hq).symm.trans g.2))) have Hk:∀ k:Ἄ,k.toNat=l → k ⟨ε.mpr (e ▸ hl),by rw [dnIx q s k (by omega) hq,e]⟩ unfold dn8; dsimp only have hl':l ≤ 7:=U2 hl8 interval_cases l · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide) (by rw [kc5]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 4 (by rw [kc4]; try decide) (by rw [kc4]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 3 (by rw [kc3]; try decide) (by rw [kc3]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 2 (by rw [kc2]; try decide) (by rw [kc2]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 1 (by rw [kc1]; try decide) (by rw [kc1]; try decide)), ← (Hk 0 kc0).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 0 kc0).1,kc0]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide) (by rw [kc5]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 4 (by rw [kc4]; try decide) (by rw [kc4]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 3 (by rw [kc3]; try decide) (by rw [kc3]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 2 (by rw [kc2]; try decide) (by rw [kc2]; try decide)), ← (Hk 1 kc1).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 1 kc1).1,kc1]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide) (by rw [kc5]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 4 (by rw [kc4]; try decide) (by rw [kc4]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 3 (by rw [kc3]; try decide) (by rw [kc3]; try decide)), ← (Hk 2 kc2).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 2 kc2).1,kc2]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide) (by rw [kc5]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 4 (by rw [kc4]; try decide) (by rw [kc4]; try decide)), ← (Hk 3 kc3).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 3 kc3).1,kc3]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 5 (by rw [kc5]; try decide) (by rw [kc5]; try decide)), ← (Hk 4 kc4).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 4 kc4).1,kc4]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)),dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 6 (by rw [kc6]; try decide) (by rw [kc6]; try decide)), ← (Hk 5 kc5).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 5 kc5).1,kc5]; rfl · rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7]; try decide) (by rw [kc7]; try decide)), ← (Hk 6 kc6).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 6 kc6).1,kc6]; rfl · rw [← (Hk 7 kc7).2] rw [dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (Hk 7 kc7).1,kc7]; rfl noncomputable def dnT(c:DC)(n vo rn:Nat)(cq H:ἆ)(o:Nat):ἇ:= dnV c vo rn cq H o (ao (fun s=>c.Y.data[vo+s]! * c.Q.data[o/8*n*8+8*s+o%8]!) n 0 (c.Bd.data[o]!)) theorem dnQ(q0 qs:Ἄ)(G g:Nat)(hgG:g+1<=G)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(eo:(G0 (8*g)).toNat=8*g): (q0+(G0 (8*g))*qs).toNat=q0.toNat+8*g*qs.toNat∧(q0+(G0 (8*g))*qs).toNat+8*qs.toNat<2^(31:Nat):=by have m:8*g*qs.toNat+8*qs.toNat<=8*G*qs.toNat:=by rw [← Ϡ]; exact ι _ (by omega) have e1:=kMm (G0 (8*g)) qs (by rw [eo]; exact C0 ((V1 (8*g*qs.toNat) (8*qs.toNat)).trans (m.trans (N2 _ _))) hq) rw [eo] at e1 have e2:(q0+(G0 (8*g))*qs).toNat=q0.toNat+8*g*qs.toNat:=by rw [kSm _ _ (by rw [e1]; exact C0 (J1 ((V1 _ _).trans m) _) hq),e1] exact ⟨e2,by rw [e2,pA]; exact C0 (J1 m _) hq⟩ theorem dnHin(q0 qs:Ἄ)(ow G g:Nat)(out:Ἂ ἇ)(hgG:g+1<=G)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(eo:(G0 (8*g)).toNat=8*g) (hin:∀ oby rw [r0.2]; exact hin k hk) let r2:=dn1r c rl hrl vo rn cq H j 2 8 q 1 a2 r1.1 (fun k hk=>by rw [r1.2,r0.2]; exact hin k hk) let r3:=dn1r c rl hrl vo rn cq H j 3 8 q 1 a3 r2.1 (fun k hk=>by rw [r2.2,r1.2,r0.2]; exact hin k hk) let r4:=dn1r c rl hrl vo rn cq H j 4 8 q 1 a4 r3.1 (fun k hk=>by rw [r3.2,r2.2,r1.2,r0.2]; exact hin k hk) let r5:=dn1r c rl hrl vo rn cq H j 5 8 q 1 a5 r4.1 (fun k hk=>by rw [r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk) let r6:=dn1r c rl hrl vo rn cq H j 6 8 q 1 a6 r5.1 (fun k hk=>by rw [r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk) (dn1r c rl hrl vo rn cq H j 7 8 q 1 a7 r6.1 (fun k hk=>by rw [r6.2,r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk)).1 theorem dn8G_eq(c:DC)(rl:Ἆ)(hrl:rl=c.relu)(vo rn:Nat)(cq H:ἆ)(j:Nat)(q:Ἄ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,k<8 → (q+k*1).toNatby have h2:=hin k (by rw [hc.1]; exact hk); rwa [hc.2] at h2) a0 a1 a2 a3 a4 a5 a6 a7 else dn8FN c (M9.mpr hr).symm vo rn cq H j q out (fun k hk=>by have h2:=hin k (by rw [hc.1]; exact hk); rwa [hc.2] at h2) a0 a1 a2 a3 a4 a5 a6 a7) else dn8 c vo rn cq H j cnt q s out hin a0 a1 a2 a3 a4 a5 a6 a7 theorem dn8D_eq(c:DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,kY.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+0]!) (J0 nu) (J0 t) a0) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+1]!) (J0 nu) (J0 t) a1) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+2]!) (J0 nu) (J0 t) a2) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+3]!) (J0 nu) (J0 t) a3) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+4]!) (J0 nu) (J0 t) a4) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+5]!) (J0 nu) (J0 t) a5) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+6]!) (J0 nu) (J0 t) a6) (ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+7]!) (J0 nu) (J0 t) a7):=by intro m; induction m using Z5 with | _ m ih => intro t ht0 a0 a1 a2 a3 a4 a5 a6 a7 hm rw [mc8] by_cases h:taos f _ _ a h1 simp only [sM1_spec c.arm Q Y vo nu i0 hY hQ hF,e1,st] · simp only [dite_eq_right h] have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=fun f a=>aoe f _ _ a (V4 (fun h3=>h (ε.mpr h3))) simp only [st] theorem mc8_eq(c:DC)(vN rN:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,k intro t ht0 a0 a1 a2 a3 a4 a5 a6 a7 hm rw[mc8];split ·rename_i h;have e1:=sMbT Q Y vo nu i0 hY hQ t ht0;exact ih _ (by rw[← hm,e1];have:=ε.mp h;omega) _ _ _ _ _ _ _ _ _ _ rfl ·exact dn8D_size .. @[inline] def dnW8(c:@& DC)(n G ow vo rn:Nat)(cq H:ἆ)(q0 qs voU nU:Ἄ)(hY:vo+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hB1:vo+n<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hvo:voU=G0 vo)(hnU:nU=G0 n)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(g:Nat)(hg:gby rw [ec] at hl; omega have ix:∀ l,(q0+(G0 (8*g))*qs).toNat+l*qs.toNat=q0.toNat+(8*g+l)*qs.toNat:=fun l=>by rw [QQ.1,Ϡ,pA] refine ⟨dn8_size .., fun i hi=>dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i QQ.2 (fun l hl e=>hi (8*g+l) (hl8 l hl).2 (V1 _ _) (by have:=(hl8 l hl).1; omega) (by rw [← ix]; exact e)),fun o ho h1 h2 => ?_⟩ have hl:o-8*g<(G0 (min 8 (ow-8*g))).toNat:=by rw [ec]; omega have eo:q0.toNat+o*qs.toNat=(q0+(G0 (8*g))*qs).toNat+(o-8*g)*qs.toNat:=by rw [ix,R5 h1] rw [eo,dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*g) hl (by omega) QQ.2 hs1] rw [sM_spec _ _ _ _ _ _ _ _ 0 _ _ _ _ _ _ _ _ _ rfl] have eb:∀ (k:Ἄ)(cc:Nat)(hk:k.toNat=cc)(hc:cc≤7) h,c.Bd.uget (G0 (8*g)+k) h=c.Bd.data[8*g+cc]!:=fun k cc hk hc h=>by rw [kFU,kSm _ k (C0 (J1 (hk ▸ hc) _) B.2.2.2.2.1),hk,B.2.2.2.2.2.2.2.2] simp only [B.2.2.2.2.2.1,B.2.2.2.2.2.2.1,B.2.2.2.2.2.2.2.1,kc0,eb 0 0 kc0 n5d0,eb 1 1 kc1 n5d1,eb 2 2 kc2 n5d2,eb 3 3 kc3 n5d3,eb 4 4 kc4 n5d4,eb 5 5 kc5 n5d5,eb 6 6 kc6 n5d6,eb 7 7 kc7 n5d7] rw [lselAo (fun l s=>c.Y.data[vo+s]! * c.Q.data[g*n*8+8*s+l]!) (fun l=>c.Bd.data[8*g+l]!) n 0 (o-8*g) (by omega)] have hd:o/8=g:=by omega have hm:o%8=o-8*g:=by omega unfold dnT; rw [hd,hm,R5 h1] theorem dnTA(a b:Nat):G0 (a+b)=G0 a+G0 b:=by simp only [lX,mC] @[inline] def fin24(c:@& DC)(vN rN:Nat)(cq H:ἆ)(p0 p1 p2:Nat)(k2 qa qb qc s:Ἄ)(out:Ἂ ἇ)(e0:∀ k:Ἄ,k<8 → (qa+k*s).toNatby rw [s0]; exact e1 k hk) c0 c1 c2 c3 c4 c5 c6 c7 have s1:r1.size=out.size:=(dn8D_size ..).trans s0 dn8D c vN rN cq H p2 k2 qc s r1 (fun k hk=>by rw [s1]; exact e2 k hk) d0 d1 d2 d3 d4 d5 d6 d7 def zqZ(a:Ἅ):Prop:=∃ s,a.toModel.unpack = .zero s def zqR(a b:Ἅ):Prop:=a=b∨(zqZ a∧zqZ b) theorem zqFl(a:Ἅ):(⟨J5 a.toModel.unpack⟩:Ἅ)=a:=by cases a;simp only[fzPU] theorem zqRa(a b p:Ἅ)(h:zqR a b):zqR (a+p) (b+p):=by rcases h with rfl|⟨⟨s1,h1⟩,⟨s2,h2⟩⟩ ·exact pZ rfl have ea:a+p=⟨J5 (Jc .binary64 a.toModel.unpack p.toModel.unpack)⟩:=rfl have eb:b+p=⟨J5 (Jc .binary64 b.toModel.unpack p.toModel.unpack)⟩:=rfl rw[ea,eb,h1,h2] cases hp:p.toModel.unpack with | zero s3=> refine BA ⟨?_,?_⟩ ·cases s1<;>cases s3<;>exact ⟨_,fzZ _⟩ ·cases s2<;>cases s3<;>exact ⟨_,fzZ _⟩ | notANumber=>exact pZ rfl | infinity s3=>exact pZ rfl | finite s3 m3 e3 h3=>exact pZ rfl theorem zqMz(y q:Ἅ)(hy:zqZ y)(hq:q.toModel.unpack.isFinite=true):zqZ (y*q):=by obtain ⟨s,hs⟩:=hy have e:y*q=⟨J5 (lc .binary64 y.toModel.unpack q.toModel.unpack)⟩:=rfl rw[e,hs];revert hq cases q.toModel.unpack with | zero s2=>intro _;exact ⟨_,fzZ _⟩ | finite s2 m e h=>intro _;exact ⟨_,fzZ _⟩ | notANumber=>intro hq;simp[pE] at hq | infinity s2=>intro hq;simp[pE] at hq theorem zqAz(a z:Ἅ)(hz:zqZ z):zqR (a+z) a:=by obtain ⟨s,hs⟩:=hz have e:a+z=⟨J5 (Jc .binary64 a.toModel.unpack z.toModel.unpack)⟩:=rfl rw[e,hs] cases ha:a.toModel.unpack with | zero s1=>exact BA ⟨by cases s1<;>cases s<;>exact ⟨_,fzZ _⟩,⟨_,ha⟩⟩ | notANumber=>exact pZ (by show (⟨J5 .notANumber⟩:Ἅ)=a;rw[← ha];exact zqFl a) | infinity s1=>exact pZ (by show (⟨J5 (.infinity s1)⟩:Ἅ)=a;rw[← ha];exact zqFl a) | finite s1 m e h=>exact pZ (by show (⟨J5 (.finite s1 m e h)⟩:Ἅ)=a;rw[← ha];exact zqFl a) theorem zqRs(a b y q:Ἅ)(h:zqR a b)(hy:zqZ y)(hq:q.toModel.unpack.isFinite=true):zqR (a+y*q) b:=by have Z:=zqAz a (y*q) (zqMz y q hy hq) rcases h with rfl|⟨ha,hb⟩ ·exact Z ·rcases Z with e|⟨h1,_⟩ ·rw[e];exact BA ⟨ha,hb⟩ ·exact BA ⟨h1,hb⟩ theorem zqNe(a:Ἅ)(h:zqZ a):(a == -a)=true:=by obtain ⟨s,hs⟩:=h have e:(-a).toModel.unpack=.zero (-s):=by show (J5 (a.toModel.unpack.neg)).unpack=_ rw[hs];exact fzZ _ show a.toModel.unpack.beq (-a).toModel.unpack=true rw[hs,e];cases s<;>decide theorem zqRe(a b:Ἅ)(h:zqR a b)(hb:(b == -b)=false):a=b:=by rcases h with e|⟨_,hz⟩ ·exact e ·rw[zqNe b hz] at hb;exact absurd hb (by decide) noncomputable def zqF(nz:Nat→Ἆ):Nat→Nat | 0=>0 | t+1=>zqF nz t+(if nz t then 1 else 0) theorem zqFm(nz:Nat→Ἆ):∀ d t,zqF nz t ≤ zqF nz (t+d) | 0,_=>le_refl _ | d+1,t=>by have:=zqFm nz d t;show _ ≤ zqF nz (t+d)+_;omega noncomputable def aoZ(f:Nat→Ἅ)(Z:Nat→Nat)(n cnt p:Nat)(a:Ἅ):Ἅ:= if py s*q s) n t a) (aoZ (fun s=>y s*q s) Z n (zqF nz n) (zqF nz t) b):=by intro k;induction k with | zero=> intro t hk ht a b h have e:t=n:=by omega subst e;rw[aoe _ _ _ _ (le_refl _),aoZ,AC (N4 _)];exact h | succ k ih=> intro t hk ht a b h have htn:t have e1:zqF nz (t+1)=zqF nz t+1:=by show zqF nz t+_=_;rw[hz];rfl rw[aoZ,AD (by omega),hZ t htn hz,AD htn,← e1] exact ih (t+1) (by omega) (by omega) _ _ (zqRa _ _ _ h) | false=> have e1:zqF nz (t+1)=zqF nz t:=by show zqF nz t+_=_;rw[hz];rfl rw[← e1] exact ih (t+1) (by omega) (by omega) _ _ (zqRs _ _ _ _ h (hy t htn hz) (hq t htn)) theorem zqB0(y:Ἅ)(h:(y==0)=true):zqZ y:=by have e0:(0:Ἅ).toModel.unpack=.zero .positive:=by rfl have e:(y==0)=y.toModel.unpack.beq (0:Ἅ).toModel.unpack:=rfl rw[e,e0] at h cases hy:y.toModel.unpack with | zero s=>exact ⟨s,hy⟩ | notANumber=>rw[hy] at h;exact absurd h (by decide) | infinity s=>rw[hy] at h;cases s<;>exact absurd h (by decide) | finite s m ex hm=>rw[hy] at h;cases s<;>exact absurd h (by simp [Pc,pI]) theorem zbU(B:ByteArray)(i:Ἄ)(v:UInt8)(h:i.toNat < B.size):(B.uset i v h).size=B.size:=by cases B;simp only[Gx,Wx,Vw];apply Qd theorem zbGa(B:ByteArray)(j:Ἄ)(v:UInt8)(h:j.toNat < B.size)(m:Nat)(hm:m≠j.toNat):(B.uset j v h).data[m]! = B.data[m]!:=by cases B with | mk d=>simp only [Gx,Vw];simp [getElem!_def,Ww hm] theorem zbGb(B:ByteArray)(j:Ἄ)(v:UInt8)(h:j.toNat < B.size):(B.uset j v h).data[j.toNat]! = v:=by cases B with | mk d=>simp only [Gx,Vw];simp [Wx] at h;simp [h] theorem zbu8(B:ByteArray)(i:Ἄ)(h:i.toNat < B.size):(B.uget i h).toUSize.toNat=(B.data[i.toNat]!).toNat:=by cases B with | mk d=>simp [Wx] at h;simp [Ph,h] noncomputable def Zf(B:ByteArray)(p:Nat):Nat:=(B.data[2*p]!).toNat+(B.data[2*p+1]!).toNat*256 @[inline] def zcI(B:@& ByteArray)(nu p:Ἄ)(h:2*p.toNat+1 < B.size∧B.size < 2^(20:Nat)):Ἄ:= have h1:=h.1;have h2:=h.2 have e:(2*p).toNat=2*p.toNat:=by rw [kMm 2 p (by rw [kc2];omega),kc2] have e1:(2*p+1).toNat=2*p.toNat+1:=by rw [kSm (2*p) 1 (by rw [e,kc1];omega),e,kc1] let zv:=(B.uget (2*p) (by rw [e];omega)).toUSize+(B.uget (2*p+1) (by rw [e1];omega)).toUSize*256 if zv < nu then zv else 0 theorem zcI_eq(B:ByteArray)(nu p:Ἄ)(h:2*p.toNat+1 < B.size∧B.size < 2^(20:Nat)):(zcI B nu p h).toNat=if Zf B p.toNat < nu.toNat then Zf B p.toNat else 0:=by have h1:=h.1;have h2:=h.2 have e:(2*p).toNat=2*p.toNat:=by rw [kMm 2 p (by rw [kc2];omega),kc2] have e1:(2*p+1).toNat=2*p.toNat+1:=by rw [kSm (2*p) 1 (by rw [e,kc1];omega),e,kc1] have A:∀ z:Ἄ,z.toNat=Zf B p.toNat → (if z < nu then z else 0).toNat=if Zf B p.toNat < nu.toNat then Zf B p.toNat else 0:=by intro z hz;rw [← hz];by_cases c:z < nu · rw [AD c,AD (ε.mp c)] · rw [AC c,AC (fun q=>c (ε.mpr q))];rfl have l0:=UInt8.toNat_lt (B.data[2*p.toNat]!);have l1:=UInt8.toNat_lt (B.data[2*p.toNat+1]!) have ez:∀ h' h'',((B.uget (2*p) h').toUSize+(B.uget (2*p+1) h'').toUSize*256).toNat=Zf B p.toNat:=by intro h' h'' have a0:=zbu8 B (2*p) h';have a1:=zbu8 B (2*p+1) h'';rw [e] at a0;rw [e1] at a1 have m:((B.uget (2*p+1) h'').toUSize*256).toNat=(B.uget (2*p+1) h'').toUSize.toNat*256:=by rw [kMm (B.uget (2*p+1) h'').toUSize 256 (by rw [a1];simp only [kD];omega)];simp only [kD] rw [kSm _ _ (by rw [m,a0,a1];omega),m,a0,a1];rfl exact A _ (ez _ _) def zcP(Y:@& ἀ)(z:Ἅ)(vo n:Ἄ)(hY:vo.toNat+n.toNat <= Y.size∧vo.toNat+n.toNat < 2^(31:Nat))(i k:Ἄ)(hik:k.toNat <= i.toNat∧i.toNat <= n.toNat)(B:ByteArray)(hB:2*n.toNat <= B.size∧B.size < 2^(20:Nat)):ByteArray×Ἄ:= if h:i < n then have hi:i.toNat < n.toNat:=ε.mp h have b1:=hB.1;have b2:=hB.2;have k1:=hik.1;have k2:=hik.2;have y1:=hY.1;have y2:=hY.2 have e2:(2*k).toNat=2*k.toNat:=by rw [kMm 2 k (by rw [kc2];omega),kc2] have e3:(2*k+1).toNat=2*k.toNat+1:=by rw [kSm (2*k) 1 (by rw [e2,kc1];omega),e2,kc1] have e1:(i+1).toNat=i.toNat+1:=by rw [kSm i 1 (by rw [kc1];omega),kc1] let y:=Y.uget (vo+i) (by rw [kSm vo i (by omega)];omega) let z0:=y==z let B1:=B.uset (2*k) i.toUInt8 (by rw [e2];omega) let B2:=B1.uset (2*k+1) (i/256).toUInt8 (by rw [zbU,e3];omega) zcP Y z vo n hY (i+1) (if z0 then k else k+1) (by split · rw [e1];omega · rw [e1,kSm k 1 (by rw [kc1];omega),kc1];omega) B2 (by rw [zbU,zbU];exact hB) else (B,k) termination_by n.toNat-i.toNat decreasing_by have hi:i.toNat < n.toNat:=ε.mp h have:=hY.2 rw [kSm i 1 (by rw [kc1];omega),kc1];omega noncomputable def nzY(Y:ἀ)(vo:Nat):Nat→Ἆ:=fun s=>!(Y.data[vo+s]! == 0) theorem zqFs(nz:Nat→Ἆ)(s t:Nat)(h:s < t)(hs:nz s=true):zqF nz s+1 <= zqF nz t:=by have e:zqF nz (s+1)=zqF nz s+1:=by show zqF nz s+_=_;rw[hs];rfl have:=zqFm nz (t-(s+1)) (s+1);rw [show s+1+(t-(s+1))=t by omega] at this;omega theorem zcP_spec(Y:ἀ)(vo n:Ἄ)(hY:vo.toNat+n.toNat <= Y.size∧vo.toNat+n.toNat < 2^(31:Nat))(hn:n.toNat < 2^(16:Nat)): ∀ m (i k:Ἄ)(hik:k.toNat <= i.toNat∧i.toNat <= n.toNat)(B:ByteArray)(hB:2*n.toNat <= B.size∧B.size < 2^(20:Nat)),n.toNat-i.toNat=m → k.toNat=zqF (nzY Y vo.toNat) i.toNat → (∀ s < i.toNat,nzY Y vo.toNat s=true → Zf B (zqF (nzY Y vo.toNat) s)=s) → (zcP Y 0 vo n hY i k hik B hB).2.toNat=zqF (nzY Y vo.toNat) n.toNat∧(∀ s < n.toNat,nzY Y vo.toNat s=true → Zf (zcP Y 0 vo n hY i k hik B hB).1 (zqF (nzY Y vo.toNat) s)=s) ∧ 2*(zcP Y 0 vo n hY i k hik B hB).2.toNat <= (zcP Y 0 vo n hY i k hik B hB).1.size∧(zcP Y 0 vo n hY i k hik B hB).1.size < 2^(20:Nat):=by intro m;induction m with | zero=> intro i k hik B hB hm hk hI;have:=hik.1;have:=hik.2;have:=hB.1 have e:i.toNat=n.toNat:=by omega rw [zcP,dite_eq_right (fun h=>by have:=ε.mp h;omega)];rw [e] at hk hI refine ⟨hk,hI,?_,hB.2⟩;dsimp only;omega | succ m ih=> intro i k hik B hB hm hk hI have k1:=hik.1;have k2:=hik.2;have b1:=hB.1;have b2:=hB.2;have y1:=hY.1;have y2:=hY.2 have hi:i.toNat < n.toNat:=by omega have h:i < n:=ε.mpr hi rw [zcP,AT h] have e2:(2*k).toNat=2*k.toNat:=by rw [kMm 2 k (by rw [kc2];omega),kc2] have e3:(2*k+1).toNat=2*k.toNat+1:=by rw [kSm (2*k) 1 (by rw [e2,kc1];omega),e2,kc1] have e1:(i+1).toNat=i.toNat+1:=by rw [kSm i 1 (by rw [kc1];omega),kc1] have ey:∀ hh,Y.uget (vo+i) hh=Y.data[vo.toNat+i.toNat]!:=fun hh=>by rw [kFU,kSm vo i (by omega)] have eF:zqF (nzY Y vo.toNat) (i.toNat+1)=zqF (nzY Y vo.toNat) i.toNat+(if nzY Y vo.toNat i.toNat then 1 else 0):=rfl refine ih (i+1) _ _ _ _ (by rw [e1];omega) ?_ ?_ · rw [e1,eF,ey];by_cases c:(Y.data[vo.toNat+i.toNat]! == 0)=true · rw [AD c];have q:nzY Y vo.toNat i.toNat=false:=by simp [nzY,c] simp only [q,υ,ἂ,ϑ];exact hk · rw [AC c];have q:nzY Y vo.toNat i.toNat=true:=by simp [nzY,c] simp only [q,ἁ];rw [kSm k 1 (by rw [kc1];omega),kc1,hk] · intro s hs hz rw [e1] at hs have lo:=UInt8.toNat_lt by_cases es:s=i.toNat · subst es have q:zqF (nzY Y vo.toNat) i.toNat=k.toNat:=hk.symm rw [q];unfold Zf rw [show 2*k.toNat+1=(2*k+1).toNat from e3.symm,zbGb] rw [zbGa _ _ _ _ _ (by rw [e3];omega),show 2*k.toNat=(2*k).toNat from e2.symm,zbGb] simp only [USize.toNat_toUInt8,USize.toNat_div];simp only [kD];omega · have sl:s < i.toNat:=by omega have F:=zqFs _ s i.toNat sl hz have r:=hI s sl hz unfold Zf at r ⊢ rw [zbGa _ _ _ _ _ (by rw [e3];omega),zbGa _ _ _ _ _ (by rw [e2];omega),zbGa _ _ _ _ _ (by rw [e3];omega),zbGa _ _ _ _ _ (by rw [e2];omega)] exact r theorem zcI_lt(B:ByteArray)(nu p:Ἄ)(h:2*p.toNat+1 < B.size∧B.size < 2^(20:Nat))(hn:0 < nu.toNat):(zcI B nu p h).toNat < nu.toNat:=by rw [zcI_eq];split <;> omega noncomputable def Z8(F:ℕ→ℕ→Ἅ)(Z:ℕ→ℕ)(n c p:ℕ)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ):A8:=⟨aoZ (F 0) Z n c p a0,aoZ (F 1) Z n c p a1,aoZ (F 2) Z n c p a2,aoZ (F 3) Z n c p a3,aoZ (F 4) Z n c p a4,aoZ (F 5) Z n c p a5,aoZ (F 6) Z n c p a6,aoZ (F 7) Z n c p a7⟩ def sM24Z(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hn:0<(J0 nu))(B:@& ByteArray)(k:Ἄ)(hk:2*(J0 k)<=B.size/\B.size<2^(20:Ἀ)):(f:ℕ)→(p:Ἄ)→((J0 p)+f=(J0 k))→(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ)→A24 | 0,_,_,a0,a1,a2,a3,a4,a5,a6,a7,c0,c1,c2,c3,c4,c5,c6,c7,d0,d1,d2,d3,d4,d5,d6,d7=>⟨⟨a0,a1,a2,a3,a4,a5,a6,a7⟩,⟨c0,c1,c2,c3,c4,c5,c6,c7⟩,⟨d0,d1,d2,d3,d4,d5,d6,d7⟩⟩ | 1,p,hp,a0,a1,a2,a3,a4,a5,a6,a7,c0,c1,c2,c3,c4,c5,c6,c7,d0,d1,d2,d3,d4,d5,d6,d7=> have hk1:=hk.1 st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (zcI B nu p ⟨by omega,hk.2⟩) (zcI_lt _ _ _ _ hn) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 | f+2,p,hp,a0,a1,a2,a3,a4,a5,a6,a7,c0,c1,c2,c3,c4,c5,c6,c7,d0,d1,d2,d3,d4,d5,d6,d7=> have hk1:=hk.1;have hk2:=hk.2 have h1:(p+1).toNat=(J0 p)+1:=by rw [kSm p 1 (by rw [kc1];omega),kc1] have h2:(p+2).toNat=(J0 p)+2:=by rw [kSm p 2 (by rw [kc2];omega),kc2] let r:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (zcI B nu p ⟨by omega,hk2⟩) (zcI_lt _ _ _ _ hn) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 let r2:=st24 arm Q Y vo nu i0 j0 k0 hY hI hJ hK (zcI B nu (p+1) ⟨by rw [h1];omega,hk2⟩) (zcI_lt _ _ _ _ hn) r.a.a0 r.a.a1 r.a.a2 r.a.a3 r.a.a4 r.a.a5 r.a.a6 r.a.a7 r.c.a0 r.c.a1 r.c.a2 r.c.a3 r.c.a4 r.c.a5 r.c.a6 r.c.a7 r.d.a0 r.d.a1 r.d.a2 r.d.a3 r.d.a4 r.d.a5 r.d.a6 r.d.a7 sM24Z arm Q Y vo nu i0 j0 k0 hY hI hJ hK hn B k hk f (p+2) (by rw [h2];omega) r2.a.a0 r2.a.a1 r2.a.a2 r2.a.a3 r2.a.a4 r2.a.a5 r2.a.a6 r2.a.a7 r2.c.a0 r2.c.a1 r2.c.a2 r2.c.a3 r2.c.a4 r2.c.a5 r2.c.a6 r2.c.a7 r2.d.a0 r2.d.a1 r2.d.a2 r2.d.a3 r2.d.a4 r2.d.a5 r2.d.a6 r2.d.a7 theorem sM24Z_spec(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hFi:FMok arm Q Y vo i0 nu)(hFj:FMok arm Q Y vo j0 nu)(hFk:FMok arm Q Y vo k0 nu)(hn:0<(J0 nu))(B:ByteArray)(k:Ἄ)(hk:2*(J0 k)<=B.size/\B.size<2^(20:Ἀ)) : ∀ f (p:Ἄ)(hp:(J0 p)+f=(J0 k))(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ), sM24Z arm Q Y vo nu i0 j0 k0 hY hI hJ hK hn B k hk f p hp a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7=⟨Z8 (fun l s=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+l]!) (Zf B) (J0 nu) (J0 k) (J0 p) a0 a1 a2 a3 a4 a5 a6 a7,Z8 (fun l s=>Y.data[(J0 vo)+s]! * Q.data[(J0 j0)+8*s+l]!) (Zf B) (J0 nu) (J0 k) (J0 p) c0 c1 c2 c3 c4 c5 c6 c7,Z8 (fun l s=>Y.data[(J0 vo)+s]! * Q.data[(J0 k0)+8*s+l]!) (Zf B) (J0 nu) (J0 k) (J0 p) d0 d1 d2 d3 d4 d5 d6 d7⟩:=by have hk1:=hk.1;have hk2:=hk.2 intro f;induction f using Z5 with | _ f ih=> intro p hp a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 rcases f with _|_|f · have st:∀ (F:ℕ→Ἅ)(a:Ἅ),aoZ F (Zf B) (J0 nu) (J0 k) (J0 p) a=a:=fun F a=>by rw [aoZ,AC (by omega)] rw [sM24Z];simp only [Z8,st] · have st:∀ (F:ℕ→Ἅ)(a:Ἅ),aoZ F (Zf B) (J0 nu) (J0 k) (J0 p) a=a+F (if Zf B (J0 p) < (J0 nu) then Zf B (J0 p) else 0):=fun F a=>by rw [aoZ,AD (by omega),aoZ,AC (by omega)] rw [sM24Z];simp only [st24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk,Z8,zcI_eq,st] · have h1:(p+1).toNat=(J0 p)+1:=by rw [kSm p 1 (by rw [kc1];omega),kc1] have h2:(p+2).toNat=(J0 p)+2:=by rw [kSm p 2 (by rw [kc2];omega),kc2] have st:∀ (F:ℕ→Ἅ)(a:Ἅ),aoZ F (Zf B) (J0 nu) (J0 k) (J0 p) a=aoZ F (Zf B) (J0 nu) (J0 k) ((J0 p)+2) ((a+F (if Zf B (J0 p) < (J0 nu) then Zf B (J0 p) else 0))+F (if Zf B ((J0 p)+1) < (J0 nu) then Zf B ((J0 p)+1) else 0)):=fun F a=>by rw [aoZ,AD (by omega),aoZ,AD (by omega)] rw [sM24Z];simp only [st24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk] rw [ih f (by omega),h2];simp only [Z8,zcI_eq,h1,st] @[inline] def zc24(y:A24):Ἆ:= (y.a.a0 == -y.a.a0)||(y.a.a1 == -y.a.a1)||(y.a.a2 == -y.a.a2)||(y.a.a3 == -y.a.a3)||(y.a.a4 == -y.a.a4)||(y.a.a5 == -y.a.a5)||(y.a.a6 == -y.a.a6)||(y.a.a7 == -y.a.a7)||(y.c.a0 == -y.c.a0)||(y.c.a1 == -y.c.a1)||(y.c.a2 == -y.c.a2)||(y.c.a3 == -y.c.a3)||(y.c.a4 == -y.c.a4)||(y.c.a5 == -y.c.a5)||(y.c.a6 == -y.c.a6)||(y.c.a7 == -y.c.a7)||(y.d.a0 == -y.d.a0)||(y.d.a1 == -y.d.a1)||(y.d.a2 == -y.d.a2)||(y.d.a3 == -y.d.a3)||(y.d.a4 == -y.d.a4)||(y.d.a5 == -y.d.a5)||(y.d.a6 == -y.d.a6)||(y.d.a7 == -y.d.a7) abbrev QFok(Q:ἀ)(i0 nu:Ἄ):Prop:=∀ s<(J0 nu),∀ l<8,(Q.data[(J0 i0)+8*s+l]!).toModel.unpack.isFinite=true abbrev ZVz(Y:ἀ)(vo n:Nat)(B:ByteArray)(k:Ἄ):Prop:=(J0 k)=zqF (nzY Y vo) n∧∀ sY.data[(J0 vo)+s]! * Q.data[(J0 P)+8*s+l]!) (Zf B) (J0 nu) (J0 k) 0 a == -aoZ (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 P)+8*s+l]!) (Zf B) (J0 nu) (J0 k) 0 a)=false): aoZ (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 P)+8*s+l]!) (Zf B) (J0 nu) (J0 k) 0 a=ao (fun s=>Y.data[(J0 vo)+s]! * Q.data[(J0 P)+8*s+l]!) (J0 nu) 0 a:=by rw [hz.1] at hb ⊢ exact (zqRe _ _ (aoZ_ok (fun s=>Y.data[(J0 vo)+s]!) (fun s=>Q.data[(J0 P)+8*s+l]!) (nzY Y (J0 vo)) (Zf B) (J0 nu) (fun s _ h=>zqB0 _ (by simpa [nzY] using h)) (fun s hs=>hQ s hs l hl) hz.2 _ 0 rfl (ϟ _) a a (pZ rfl)) hb).symm theorem sM24Z_eq(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hFi:FMok arm Q Y vo i0 nu)(hFj:FMok arm Q Y vo j0 nu)(hFk:FMok arm Q Y vo k0 nu)(hn:0<(J0 nu))(B:ByteArray)(k:Ἄ)(hk:2*(J0 k)<=B.size/\B.size<2^(20:Ἀ))(hQi:QFok Q i0 nu)(hQj:QFok Q j0 nu)(hQk:QFok Q k0 nu)(hz:ZVz Y (J0 vo) (J0 nu) B k)(n:ℕ)(en:(J0 nu)=n)(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ)(h:zc24 (sM24Z arm Q Y vo nu i0 j0 k0 hY hI hJ hK hn B k hk (J0 k) 0 (by rw [kc0];omega) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7)=false): sM24Z arm Q Y vo nu i0 j0 k0 hY hI hJ hK hn B k hk (J0 k) 0 (by rw [kc0];omega) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7=sM24P arm Q Y vo nu i0 j0 k0 hY hI hJ hK n en a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:=by rw [sM24Z_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk hn B k hk,kc0] at h ⊢ rw [sM24P_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk n en] simp only [Z8,zc24,Bool.or_eq_false_iff] at h obtain ⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨h0,h1⟩,h2⟩,h3⟩,h4⟩,h5⟩,h6⟩,h7⟩,h8⟩,h9⟩,h10⟩,h11⟩,h12⟩,h13⟩,h14⟩,h15⟩,h16⟩,h17⟩,h18⟩,h19⟩,h20⟩,h21⟩,h22⟩,h23⟩:=h simp (disch:=first|decide|assumption) only [Z8,zLL Q Y vo nu i0 k B hQi hz,zLL Q Y vo nu j0 k B hQj hz,zLL Q Y vo nu k0 k B hQk hz] @[inline] def dYz(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(n:ℕ)(en:(J0 nu)=n)(z:Ἆ)(B:@& ByteArray)(k:Ἄ)(hk:2*(J0 k)<=B.size/\B.size<2^(20:Ἀ))(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ):A24:= let yz:=if hz:z=true∧0<(J0 k)∧0<(J0 nu) then sM24Z arm Q Y vo nu i0 j0 k0 hY hI hJ hK hz.2.2 B k hk (J0 k) 0 (by rw [kc0];omega) a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 else ⟨⟨0,0,0,0,0,0,0,0⟩,⟨0,0,0,0,0,0,0,0⟩,⟨0,0,0,0,0,0,0,0⟩⟩ if zc24 yz then sM24P arm Q Y vo nu i0 j0 k0 hY hI hJ hK n en a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 else yz theorem dYz_eq(arm:Ἆ)(Q Y:ἀ)(vo nu i0 j0 k0:Ἄ)(hY:(J0 vo)+(J0 nu)<=(kS Y)/\(J0 vo)+(J0 nu)<2^(31:Ἀ))(hI:((J0 i0)+8*(J0 nu)<=(kS Q)/\(J0 i0)+8*(J0 nu)<2^(31:Ἀ)))(hJ:((J0 j0)+8*(J0 nu)<=(kS Q)/\(J0 j0)+8*(J0 nu)<2^(31:Ἀ)))(hK:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(hFi:FMok arm Q Y vo i0 nu)(hFj:FMok arm Q Y vo j0 nu)(hFk:FMok arm Q Y vo k0 nu)(hQi:QFok Q i0 nu)(hQj:QFok Q j0 nu)(hQk:QFok Q k0 nu)(n:ℕ)(en:(J0 nu)=n)(z:Ἆ)(B:ByteArray)(k:Ἄ)(hk:2*(J0 k)<=B.size/\B.size<2^(20:Ἀ))(hz:0<(J0 k)→ZVz Y (J0 vo) (J0 nu) B k)(a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:Ἅ): dYz arm Q Y vo nu i0 j0 k0 hY hI hJ hK n en z B k hk a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7=sM24P arm Q Y vo nu i0 j0 k0 hY hI hJ hK n en a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7:=by unfold dYz;dsimp only by_cases hc:z=true∧0<(J0 k)∧0<(J0 nu) · rw [AT hc];split · rfl · rename_i h2;exact sM24Z_eq arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk hc.2.2 B k hk hQi hQj hQk (hz hc.2.1) n en a0 a1 a2 a3 a4 a5 a6 a7 c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 (by simpa using h2) · have e:zc24 ⟨⟨0,0,0,0,0,0,0,0⟩,⟨0,0,0,0,0,0,0,0⟩,⟨0,0,0,0,0,0,0,0⟩⟩=true:=by simp [zc24,zqNe 0 ⟨_,rfl⟩] rw [dite_eq_right hc,AD e] def ZPb:Ἂ ByteArray:=kK (n:=6) fun k=>⟨mB (2^(k.val+9)) 0⟩ def zPb(m:Nat):ByteArray:=let k:=Aq m+1-9;if k < 6 then ZPb[k]! else ⟨mB m 0⟩ def zcS(Y:@& ἀ)(vo sd:Ἄ)(hY:(J0 vo)+31*(J0 sd) < (kS Y)∧(J0 vo)+32*(J0 sd) < 2^(31:Nat))(j:Nat)(c:Ἄ):Ἄ:= if h:j < 32 then have y1:=hY.1;have y2:=hY.2 have hj:(G0 j).toNat=j:=s5tu j (by omega) have hm:sd.toNat*j ≤ sd.toNat*31:=X3 _ (by omega) have em:(sd*G0 j).toNat=sd.toNat*j:=by rw [kMm sd (G0 j) (by rw [hj];omega),hj] let y:=Y.uget (vo+sd*G0 j) (by rw [kSm vo (sd*G0 j) (by rw [em];omega),em];omega) zcS Y vo sd hY (j+1) (if y == -y then c+1 else c) else c termination_by 32-j def zB(on:Ἆ)(Y:@& ἀ)(vo nU:Ἄ)(G:Nat)(hY:vo.toNat+nU.toNat<=Y.size∧vo.toNat+nU.toNat<2^(31:Nat)):{p:ByteArray×Ἄ//2*p.2.toNat<=p.1.size∧p.1.size<2^(20:Nat)}:= if h:on=true∧128<=nU.toNat∧nU.toNat<2^(16:Nat)∧3<=G then have y1:=hY.1;have y2:=hY.2 have hs:(G0 (nU.toNat/32)).toNat=nU.toNat/32:=s5tu _ (by omega) if 40<=(zcS Y vo (G0 (nU.toNat/32)) (by rw [hs];omega) 0 0).toNat*G then let B0:=zPb (2*nU.toNat) if hB:2*nU.toNat<=B0.size∧B0.size<2^(20:Nat) then ⟨zcP Y 0 vo nU hY 0 0 (by rw [kc0];omega) B0 hB,(zcP_spec Y vo nU hY h.2.2.1 _ 0 0 (by rw [kc0];omega) B0 hB rfl (by rw [kc0];rfl) (fun s hs=>absurd hs (by rw [kc0];omega))).2.2⟩ else ⟨(Yy,0),by rw [kc0];decide⟩ else ⟨(Yy,0),by rw [kc0];decide⟩ else ⟨(Yy,0),by rw [kc0];decide⟩ theorem zB_ok(on:Ἆ)(Y:ἀ)(vo nU:Ἄ)(G:Nat)(hY:vo.toNat+nU.toNat<=Y.size∧vo.toNat+nU.toNat<2^(31:Nat)):0<(J0 (zB on Y vo nU G hY).1.2)→ZVz Y (J0 vo) (J0 nU) (zB on Y vo nU G hY).1.1 (zB on Y vo nU G hY).1.2:=by unfold zB;split · rename_i h;dsimp only;split · split · rename_i hB;intro _;have Z:=zcP_spec Y vo nU hY h.2.2.1 _ 0 0 (by rw [kc0];omega) _ hB rfl (by rw [kc0];rfl) (fun s hs=>absurd hs (by rw [kc0];omega)) exact ⟨Z.1,Z.2.1⟩ · intro h;rw [kc0] at h;omega · intro h;rw [kc0] at h;omega · intro h;rw [kc0] at h;omega theorem QFc_ok(c:DC)(vo n G g:Nat)(nU iU:Ἄ)(hn:nU.toNat=n)(hi:iU.toNat=g*n*8)(hg:gby rw [Q0.1,Ϡ,pA] have Q1:=dnQ q0 qs G (g+1) (by omega) hq B1.2.2.2.2.2.2.2.2 rw [← ho1] at Q1 have ix1:∀ l,(q0+(oU+8)*qs).toNat+l*qs.toNat=q0.toNat+(8*(g+1)+l)*qs.toNat:=fun l=>by rw [Q1.1,Ϡ,pA] have Q2:=dnQ q0 qs G (g+2) (by omega) hq B2.2.2.2.2.2.2.2.2 rw [← ho2] at Q2 have ix2:∀ l,(q0+(oU+16)*qs).toNat+l*qs.toNat=q0.toNat+(8*(g+2)+l)*qs.toNat:=fun l=>by rw [Q2.1,Ϡ,pA] have e8:(8:Ἄ).toNat=8:=kc8 have ec:(G0 (min 8 (ow-8*(g+2)))).toNat=min 8 (ow-8*(g+2)):=s5tu _ (C0 (O7 _ _) (by decide)) refine ⟨by unfold dnW24 fin24; simp only [dn8D_eq,dn8_size],fun i hi => ?_,fun o ho h1 h2 => ?_⟩ · unfold dnW24 fin24; simp only [dn8D_eq] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q2.2 (fun l hl e=>hi (8*(g+2)+l) (by rw [ec] at hl; omega) (by omega) (by rw [ec] at hl; omega) (by rw [← ix2]; exact e))] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q1.2 (fun l hl e=>hi (8*(g+1)+l) (by rw [e8] at hl; omega) (by omega) (by rw [e8] at hl; omega) (by rw [← ix1]; exact e))] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q0.2 (fun l hl e=>hi (8*g+l) (by rw [e8] at hl; omega) (by omega) (by rw [e8] at hl; omega) (by rw [← ix0]; exact e))] have hd:∀ k,8*k<=o → o<8*k+8 → o/8=k∧o%8=o-8*k:=fun k a b=>⟨by omega,by omega⟩ have eb0:∀(kk:Ἄ) h,kk.toNat≤7→c.Bd.uget (oU+kk) h=c.Bd.data[8*g+kk.toNat]!:=fun kk h hc=>by rw [kFU,hoU,kSm _ kk (C0 (J1 hc _) B0.2.2.2.2.1),B0.2.2.2.2.2.2.2.2] have eb1:∀(kk:Ἄ) h,kk.toNat≤7→c.Bd.uget ((oU+8)+kk) h=c.Bd.data[8*(g+1)+kk.toNat]!:=fun kk h hc=>by rw [kFU,ho1,kSm _ kk (C0 (J1 hc _) B1.2.2.2.2.1),B1.2.2.2.2.2.2.2.2] have eb2:∀(kk:Ἄ) h,kk.toNat≤7→c.Bd.uget ((oU+16)+kk) h=c.Bd.data[8*(g+2)+kk.toNat]!:=fun kk h hc=>by rw [kFU,ho2,kSm _ kk (C0 (J1 hc _) B2.2.2.2.2.1),B2.2.2.2.2.2.2.2.2] have tv:voU.toNat=vo:=by rw [hvo]; exact B0.2.2.2.2.2.1 have tn:nU.toNat=n:=by rw [hnU]; exact B0.2.2.2.2.2.2.1 have ti0:iU.toNat=g*n*8:=by rw [hiU]; exact B0.2.2.2.2.2.2.2.1 have ti1:(iU+n8U).toNat=(g+1)*n*8:=by rw [hi1]; exact B1.2.2.2.2.2.2.2.1 have ti2:(iU+n8U+n8U).toNat=(g+2)*n*8:=by rw [hi2]; exact B2.2.2.2.2.2.2.2.1 have F0:=FMc_ok c vo n G g voU nU iU tv tn ti0 (by omega) hF have F1:=FMc_ok c vo n G (g+1) voU nU (iU+n8U) tv tn ti1 (by omega) hF have F2:=FMc_ok c vo n G (g+2) voU nU (iU+n8U+n8U) tv tn ti2 (by omega) hF have E0:=QFc_ok c vo n G g nU iU tn ti0 (by omega) hF have E1:=QFc_ok c vo n G (g+1) nU (iU+n8U) tn ti1 (by omega) hF have E2:=QFc_ok c vo n G (g+2) nU (iU+n8U+n8U) tn ti2 (by omega) hF by_cases p2:8*(g+2)<=o · have hl:o-8*(g+2)<(G0 (min 8 (ow-8*(g+2)))).toNat:=by rw [ec]; omega have eo:q0.toNat+o*qs.toNat=(q0+(oU+16)*qs).toNat+(o-8*(g+2))*qs.toNat:=by rw [ix2,R5 (by omega)] rw [eo]; unfold dnW24 fin24; simp only [dn8D_eq] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+2)) hl (by omega) Q2.2 hs1] rw [dYz_eq c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2 E0 E1 E2 _ _ _ _ _ _ hz,sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only [tv,tn,ti2,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,eb2] rw [lselAo (fun l s=>c.Y.data[vo+s]! * c.Q.data[(g+2)*n*8+8*s+l]!) (fun l=>c.Bd.data[8*(g+2)+l]!) n 0 (o-8*(g+2)) (by omega)] unfold dnT; rw [(hd (g+2) (by omega) (by omega)).1,(hd (g+2) (by omega) (by omega)).2,R5 (by omega)] by_cases p1:8*(g+1)<=o · have hl:o-8*(g+1)<(8:Ἄ).toNat:=by rw [e8]; omega have eo:q0.toNat+o*qs.toNat=(q0+(oU+8)*qs).toNat+(o-8*(g+1))*qs.toNat:=by rw [ix1,R5 (by omega)] rw [eo]; unfold dnW24 fin24; simp only [dn8D_eq] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix1] at e; rw [ec] at hl'; have:=N7 hs1 (F7 e); omega)] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+1)) hl (by omega) Q1.2 hs1] rw [dYz_eq c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2 E0 E1 E2 _ _ _ _ _ _ hz,sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only [tv,tn,ti1,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,eb1] rw [lselAo (fun l s=>c.Y.data[vo+s]! * c.Q.data[(g+1)*n*8+8*s+l]!) (fun l=>c.Bd.data[8*(g+1)+l]!) n 0 (o-8*(g+1)) (by omega)] unfold dnT; rw [(hd (g+1) (by omega) (by omega)).1,(hd (g+1) (by omega) (by omega)).2,R5 (by omega)] · have hl:o-8*g<(8:Ἄ).toNat:=by rw [e8]; omega have eo:q0.toNat+o*qs.toNat=(q0+oU*qs).toNat+(o-8*g)*qs.toNat:=by rw [ix0,R5 (by omega)] rw [eo]; unfold dnW24 fin24; simp only [dn8D_eq] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix0] at e; rw [ec] at hl'; have:=N7 hs1 (F7 e); omega)] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q1.2 (fun l hl' e=>by rw [ix1,ix0] at e; rw [e8] at hl'; have:=N7 hs1 (F7 e); omega)] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*g) hl (by omega) Q0.2 hs1] rw [dYz_eq c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2 E0 E1 E2 _ _ _ _ _ _ hz,sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only [tv,tn,ti0,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,eb0,eb2] rw [lselAo (fun l s=>c.Y.data[vo+s]! * c.Q.data[g*n*8+8*s+l]!) (fun l=>c.Bd.data[8*g+l]!) n 0 (o-8*g) (by omega)] unfold dnT; rw [(hd g (by omega) (by omega)).1,(hd g (by omega) (by omega)).2,R5 (by omega)] theorem dnW8_size(c:DC)(n G ow vo rn:Nat)(cq H:ἆ)(q0 qs voU nU:Ἄ)(hY:vo+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hB1:vo+n<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hvo:voU=G0 vo)(hnU:nU=G0 n)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(g:Nat)(hg:gby rw [dnW24_size]; exact hin o ho) else dnP c n G ow vo rn cq H q0 qs voU nU hY hQ hBd hB1 hB2 hB3 hvo hnU hq hG2 n8U hn8 Bz kz hkz (g+1) (oU+G0 (8*1)) (iU+n8U*G0 1) (dnO g oU 1 hoU) (dnI g n 1 iU n8U hiU hn8) (dnW8 c n G ow vo rn cq H q0 qs voU nU hY hQ hBd hB1 hB2 hB3 hvo hnU hq g hg oU iU hoU hiU out hin) (fun o ho=>by rw [dnW8_size]; exact hin o ho) else out termination_by G-g decreasing_by · exact dnLt3 G g h3.2 · exact dnLt1 G g hg theorem dnP_spec(c:DC)(n G ow vo rn:Nat)(cq H:ἆ)(q0 qs voU nU:Ἄ)(hY:vo+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hB1:vo+n<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hvo:voU=G0 vo)(hnU:nU=G0 n)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(hG2:8*G<=ow+7)(n8U:Ἄ)(hn8:n8U=G0 (n*8))(Bz:ByteArray)(kz:Ἄ)(hkz:2*(J0 kz)<=Bz.size/\Bz.size<2^(20:Ἀ))(hG:ow<=8*G)(hF:FMc c vo n G)(hs1:0 intro g oU iU hoU hiU out hin hk rw [dnP] split · rename_i hg split · rename_i h3 have W:=dnW24_spec c n G ow vo rn cq H q0 qs voU nU hY hQ hBd hB1 hB2 hB3 hvo hnU hq hG2 n8U hn8 Bz kz hkz g h3.2 oU iU hoU hiU out hin hF hs1 hz have I:=ih (G-(g+3)) (by rw [← hk]; exact dnLt3 G g h3.2) (g+3) _ _ (dnO g oU 3 hoU) (dnI g n 3 iU n8U hiU hn8) _ (fun o ho=>by rw [W.1]; exact hin o ho) rfl refine ⟨by rw [I.1,W.1],fun i hi => ?_,fun o ho h1 => ?_⟩ · rw [I.2.1 i (fun o ho h e=>hi o ho (by omega) e),W.2.1 i (fun o ho h1 _ e=>hi o ho h1 e)] · by_cases p:o<8*g+24 · rw [I.2.1 _ (fun o' ho' h' e=>by have:=N7 hs1 (F7 e); omega),W.2.2 o ho h1 p] · exact I.2.2 o ho (by omega) · rename_i h3 have W:=dnW8_spec c n G ow vo rn cq H q0 qs voU nU hY hQ hBd hB1 hB2 hB3 hvo hnU hq g hg oU iU hoU hiU out hin hF hs1 have I:=ih (G-(g+1)) (by rw [← hk]; exact dnLt1 G g hg) (g+1) _ _ (dnO g oU 1 hoU) (dnI g n 1 iU n8U hiU hn8) _ (fun o ho=>by rw [W.1]; exact hin o ho) rfl refine ⟨by rw [I.1,W.1],fun i hi => ?_,fun o ho h1 => ?_⟩ · rw [I.2.1 i (fun o ho h e=>hi o ho (by omega) e),W.2.1 i (fun o ho h1 _ e=>hi o ho h1 e)] · by_cases p:o<8*g+8 · rw [I.2.1 _ (fun o' ho' h' e=>by have:=N7 hs1 (F7 e); omega),W.2.2 o ho h1 p] · exact I.2.2 o ho (by omega) · rename_i hg exact ⟨rfl,fun i _=>rfl,fun o ho h1=>absurd ho (by omega)⟩ theorem dnP_sizeK(c:DC)(n G ow vo rn:Nat)(cq H:ἆ)(q0 qs voU nU:Ἄ)(hY:vo+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hB1:vo+n<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hvo:voU=G0 vo)(hnU:nU=G0 n)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(hG2:8*G<=ow+7)(n8U:Ἄ)(hn8:n8U=G0 (n*8))(Bz:ByteArray)(kz:Ἄ)(hkz:2*(J0 kz)<=Bz.size/\Bz.size<2^(20:Ἀ)) : ∀ k g (oU iU:Ἄ)(hoU:oU=G0 (8*g))(hiU:iU=G0 (g*n*8))(out:Ἂ ἇ)(hin:∀ o intro g oU iU hoU hiU out hin hk rw [dnP] split · rename_i hg split · rename_i h3; rw [ih _ (by rw [← hk]; exact dnLt3 G g h3.2) _ _ _ _ _ _ _ rfl,dnW24_size] · rw [ih _ (by rw [← hk]; exact dnLt1 G g hg) _ _ _ _ _ _ _ rfl,dnW8_size] · rfl theorem dnP_size(c:DC)(n G ow vo rn:Nat)(cq H:ἆ)(q0 qs voU nU:Ἄ)(hY:vo+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hB1:vo+n<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hvo:voU=G0 vo)(hnU:nU=G0 n)(hq:q0.toNat+8*G*qs.toNat<2^(31:Nat))(hG2:8*G<=ow+7)(n8U:Ἄ)(hn8:n8U=G0 (n*8))(Bz:ByteArray)(kz:Ἄ)(hkz:2*(J0 kz)<=Bz.size/\Bz.size<2^(20:Ἀ))(g:Nat)(oU iU:Ἄ)(hoU:oU=G0 (8*g))(hiU:iU=G0 (g*n*8))(out:Ἂ ἇ)(hin:∀ oP then c.hb else P) else (4000:ἆ) @[inline] def dnCqE(c:@& DC)(i:Ἄ)(h:i.toNatby rw [eq0]; exact hin r hr o ho)) (fun r' h1 o ho=>by rw [dnP_size]; exact hin r' h1 o ho) else out termination_by R-r decreasing_by exact dnLt1 R r hr noncomputable def dnCq(c:DC)(n r:Nat):ἆ:=(23:ἆ)+cEq c.f9 (c.Y.data[r*(n+1)+n]!) noncomputable def dnH(c:DC)(n r:Nat):ἆ:=dnWin c (dnCq c n r) theorem dnR_spec(c:DC)(n ow G R:Nat)(nU n1U n8U qr qs:Ἄ)(hnU:nU=G0 n)(hn1:n1U=G0 (n+1))(hn8:n8U=G0 (n*8)) (hY:R*(n+1)<=c.Y.size)(hQ:c.Q.size=n*(8*G))(hBd:8*G<=c.Bd.size)(hRm:R*(n+1)<2^(31:Nat))(hB2:n*(8*G)<2^(31:Nat))(hB3:8*G<2^(31:Nat))(hG2:8*G<=ow+7) (hq:∀ r intro r voU q0U hvo hq0 out hin hk rw [dnR] split · rename_i hr have V:=dnRb R n r hr _ hY hRm have hR1:R<=R*(n+1):=U3 R (I9 n) have eq0:q0U.toNat=r*qr.toNat:=by rw [hq0]; exact dnQR r qr qs G (hq r hr) (by omega) have hvn:voU+nU=G0 (r*(n+1)+n):=by rw [hvo,hnU,dnTA] have ecq:∀ h,dnCqE c (voU+nU) h=dnCq c n r:=fun h=>by unfold dnCqE dnCq; rw [kFU,hvn,V.2.2.2] have lt:R-(r+1) ?_,fun r' h1 h2 o ho => ?_⟩ · rw [(ih _ lt (r+1) _ _ _ _ _ _ rfl).1,dnP_size] · rw [(ih _ lt (r+1) _ _ _ _ _ _ rfl).2.1 i (fun r' h1 h2 o ho e=>hi r' h1 (by omega) o ho e)] rw [(dnP_spec c n G ow (r*(n+1)) (r*n) _ _ q0U qs voU nU _ hQ hBd _ hB2 hB3 hvo hnU _ hG2 n8U hn8 _ _ _ hG (hF _ (by omega)) hs1 Z _ 0 0 0 _ _ out _ rfl).2.1 i (fun o ho _ e=>hi r hr (le_refl _) o ho (by rw [← eq0]; exact e))] · by_cases e:r'=r · subst e rw [(ih _ lt (r'+1) _ _ _ _ _ _ rfl).2.1 _ (fun r'' h1' h2' o' ho' e'=>by have:=hD _ _ _ _ h1' h1 ho' ho e'; omega)] rw [← eq0,(dnP_spec c n G ow (r'*(n+1)) (r'*n) _ _ q0U qs voU nU _ hQ hBd _ hB2 hB3 hvo hnU _ hG2 n8U hn8 _ _ _ hG (hF _ (by omega)) hs1 Z _ 0 0 0 _ _ out _ rfl).2.2 o ho (ϟ _)] unfold dnH; rw [ecq] · exact (ih _ lt (r+1) _ _ _ _ _ _ rfl).2.2 r' h1 (by omega) o ho · rename_i hr exact ⟨rfl,fun i _=>rfl,fun r' h1 h2=>absurd h1 (by omega)⟩ theorem dnT_ok(c:DC)(R ow G H:Nat)(r o:Nat)(hr:rdw (c.X[r'*c.n+s]! &&& 0x7FFFFFFF)) c.n 0 0 else dw c.X[r'*c.n+t]!) (hQv:∀ tif sif sc.Y.data[r*(c.n+1)+s]! * c.Q.data[o/8*c.n*8+8*s+o%8]!) c.n 0 (c.Bd.data[o]!)):=rfl rw [e] have hQ':∀ sby have h1:=hQv s hs (o/8) (o%8) (ϊ _ (by decide)) (by have:=ϛ o 8; omega) rw [show 8*(o/8)+o%8=o from ϛ o 8,AD ho] at h1 rw [show o/8*c.n*8+o%8+8*s=(o/8*c.n+s)*8+o%8 by ring]; exact h1 refine kOutR c.relu c.n c.X c.W c.b c.E c.ix c.ib c.L H c.Y c.Q (r*(c.n+1)) (r*c.n) o c.em (dnCq c c.n r) c.hb _ (c.Y.data[r*(c.n+1)+c.n]!) F hbF M Hn x z hn (hEv o ho) (fun s hs=>(hYv r hr s (I3 hs)).trans (AC (W8 hs))) hQ' ?_ ((hYv r hr c.n (le_refl _)).trans (AD rfl)) (by unfold dnCq; rw [hf9]) hhb (hEm o ho) hem rw [hBdv o ho]; congr 1; funext s; rw [show o/8*c.n*8+8*s+o%8=o/8*c.n*8+o%8+8*s by ring] theorem dnB2(n ow:Nat)(hn:0by have:=ι ow (l7 hr); rw [Ο] at this; exact this dnR ⟨relu,n,X,K,ix,ib,L,Y,(ib+L-50).toUInt64,em,(I0 (9*(n+1))).toInt64.toFloat,Yarm⟩ n ow ((ow+7)/8) R (G0 n) (G0 (n+1)) (G0 (n*8)) (G0 ow) 1 rfl rfl rfl hYs hQ hBs hRm (dnB2 n ow hn hon) (dnB3 n ow hn hon) (by omega) (fun r hr=>by rw [eow,kc1]; have:=hRo2 r hr; omega) 0 0 0 (by rw [ϳ]; rfl) (by rw [show G0 0=0 from rfl,Pj]) (mB (R*ow) (0:ἇ)) (fun r hr o ho=>by rw [X4,eow,kc1,ϻ]; have:=hRo2 r hr; omega) else mj R n ow relu X W b theorem bQSg_spec (R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(K:DK)(Q:ἀ)(E:Ἂ Ἃ)(em32:ἇ)(Bd:ἀ)(eb:ἇ)(L2:Nat)(okk:Ἆ)(em:ἆ)(Y:ἀ) (hK:K=⟨W,b,Q,E,em32,Bd,eb,L2,okk⟩) (hn:0dw (X[r'*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[r'*n+t]!) (hBdv:∀ oby rw [eow,e1u]; have:=ι ow (l7 hr); rw [Ο] at this; omega) (by omega) (by rw [e1u]; decide) (fun r hr=>FMd _ n _ ow (r*(n+1)) (r*n) (fun t ht=>(hYv r hr t ht.le).trans (AC (W8 ht))) hQv (fun q=>(F q).1) (fun o ho s hs h=>by have:=hEv o ho s hs;have:=hEm o ho;rw[h]at *;simp at *;omega)) (fun r r' o o' hr hr' ho ho' e=>by rw [eow,e1u,ϻ,ϻ] at e; exact (kDM _ _ _ _ _ e ho ho').1) _ 0 0 0 (by rw [ϳ]; rfl) (by rw [show G0 0=0 from rfl,Pj]) (mB (R*ow) (0:ἇ)) (fun r hr o ho=>by rw [X4,eow,e1u,ϻ]; have:=ι ow (l7 hr); rw [Ο] at this; omega) rfl unfold bQSg; dsimp only rw [AT h7] unfold mj linearWith apply mi (by rw [T.1]; simp only [Ϝ,X4]) intro q hq hq' rw [Ϝ] at hq' simp only [Λ] rw [← AB _ q hq] have hpos:0by rw [h,A7] at hq'; exact C5 _ hq') have hrq:q/owἍ->Ἃ)(S:ἀ)(st s0 q0 mu:Ἄ)(hS:(J0 s0)<(J0 st)∧(J0 st)*(J0 mu)<=(kS S)∧(J0 st)*(J0 mu)<2^(31:Ἀ))(hB:(J0 q0)+(J0 mu)<2^(31:Ἀ)) (j:Ἄ)(a:Ἂ Ἃ)(ha:(J0 q0)+(J0 mu)<=(O0 a)):Ἂ Ἃ:= if h:j < mu then have B:=sFGb S st s0 mu j hS (ε.mp h) let v:=S.uget (st*j+s0) B.2 let z:=zR v relu H sFG relu H fb S st s0 q0 mu hS hB (j+1) (a.uset (q0+j) (if z==(0xFFFFFFFF:ἇ) then fb j v else z) (by rw[kSm q0 j (Lql _ _ _ _ (ε.mp h) (I3 hB))];exact Lql _ _ _ _ (ε.mp h) ha)) (by rw[BT];exact ha) else a termination_by (J0 mu)-(J0 j) decreasing_by all_goals (rw[ac h];exact Lqd _ _ (ε.mp h)) theorem sFG_size(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἅ->Ἃ)(S:ἀ)(st s0 q0 mu:Ἄ)(hS:(J0 s0)<(J0 st)∧(J0 st)*(J0 mu)<=(kS S)∧(J0 st)*(J0 mu)<2^(31:Ἀ))(hB:(J0 q0)+(J0 mu)<2^(31:Ἀ)) : ∀ m (j:Ἄ)(a:Ἂ Ἃ)(ha:(J0 q0)+(J0 mu)<=(O0 a)),(J0 mu)-(J0 j)=m → (O0 (sFG relu H fb S st s0 q0 mu hS hB j a ha))=(O0 a):=by intro m; induction m with | zero=>intro j a ha hm; rw [sFG,dite_eq_right (fun h=>Lq0 _ _ hm (ε.mp h))] | succ m ih => intro j a ha hm; have HQ:=Lqs _ _ _ hm; have h1:=HQ.1 rw [sFG,AT (ε.mpr h1)]; dsimp only; rw [ih _ _ _ (by rw [ac (ε.mpr h1)]; exact HQ.2),BT] theorem sFG_sz(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἅ->Ἃ)(S:ἀ)(st s0 q0 mu:Ἄ)(hS:(J0 s0)<(J0 st)∧(J0 st)*(J0 mu)<=(kS S)∧(J0 st)*(J0 mu)<2^(31:Ἀ))(hB:(J0 q0)+(J0 mu)<2^(31:Ἀ)) (j:Ἄ)(a:Ἂ Ἃ)(ha:(J0 q0)+(J0 mu)<=(O0 a)) : (O0 (sFG relu H fb S st s0 q0 mu hS hB j a ha))=(O0 a):=sFG_size relu H fb S st s0 q0 mu hS hB _ j a ha rfl theorem sFG_spec(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἅ->Ἃ)(S:ἀ)(st s0 q0 mu:Ἄ)(hS:(J0 s0)<(J0 st)∧(J0 st)*(J0 mu)<=(kS S)∧(J0 st)*(J0 mu)<2^(31:Ἀ))(hB:(J0 q0)+(J0 mu)<2^(31:Ἀ)) : ∀ m (j:Ἄ)(a:Ἂ Ἃ)(ha:(J0 q0)+(J0 mu)<=(O0 a)),(J0 mu)-(J0 j)=m → (J0 j) ≤ (J0 mu) → ∀ q, (sFG relu H fb S st s0 q0 mu hS hB j a ha)[q]! = if (J0 q0)+(J0 j) ≤ q∧q < (J0 q0)+(J0 mu) then (if zR (S.data[(J0 st)*(q-(J0 q0))+(J0 s0)]!) relu H==(0xFFFFFFFF:ἇ) then fb (G0 (q-(J0 q0))) (S.data[(J0 st)*(q-(J0 q0))+(J0 s0)]!) else zR (S.data[(J0 st)*(q-(J0 q0))+(J0 s0)]!) relu H) else a[q]! := by intro m; induction m with | zero=>intro j a ha hm hj q; rw [sFG,dite_eq_right (fun h=>Lq0 _ _ hm (ε.mp h)),AC (Lqn _ _ _ _ (V3.mp hm))] | succ m ih => intro j a ha hm hj q have HQ:=Lqs _ _ _ hm; have h1:=HQ.1 have e1:=ac (ε.mpr h1) have B:=sFGb S st s0 mu j hS h1 rw [sFG,AT (ε.mpr h1)]; dsimp only rw [ih _ _ _ (by rw [e1]; exact HQ.2) (by rw [e1]; exact h1),kAS,kSm q0 j (Lql _ _ _ _ h1 (I3 hB)),kFU,B.1,e1] by_cases e:(J0 q0)+(J0 j)=q · subst e rw [AC (Lqa _ _ _),AD rfl,AD (Lqb _ _ _ h1),ϱ,kTU] · by_cases g:(J0 q0)+((J0 j)+1) ≤ q∧q < (J0 q0)+(J0 mu) · rw [AD g,AD (Lqc _ _ _ _ g)] · rw [AC g,AC e,AC (Lqe _ _ _ _ g e)] theorem sPXb(Wd S:ἀ)(n ow o:Ἄ)(hW:(J0 ow)*(J0 n)<=(kS Wd))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ))(hS:8*(J0 ow)<=(kS S))(h:(J0 o)<(J0 ow)) : (J0 (o*n))=(J0 o)*(J0 n)∧(J0 (o*n))+(J0 n)<=(kS Wd)∧(J0 (o*n))+(J0 n)<2^(31:Ἀ) ∧ (J0 (8*o))=8*(J0 o)∧(J0 (8*o))+7<(kS S)∧(J0 (8*o))+7<2^(31:Ἀ)∧(J0 (o+1))=(J0 o)+1:=by have m1:((J0 o)+1)*(J0 n) ≤ (J0 ow)*(J0 n):=ι _ h rw [Ο] at m1 have m2:8*((J0 o)+1) ≤ 8*(J0 ow):=X3 _ h rw [Kk] at m2 have e1:(J0 (o*n))=(J0 o)*(J0 n):=kMm _ _ (C0 ((V1 _ _).trans m1) h31.1) have e8:(J0 (8*o))=8*(J0 o):=by rw [kMm _ _ (by rw [kc8]; exact C0 ((V1 _ _).trans m2) h31.2.2),kc8] have o1:(J0 (o+1))=(J0 o)+1:=by rw [kSm _ _ (by rw [kc1]; exact C0 (J2 h (lZ _ (by decide))) h31.2.2),kc1] rw [e1,e8] exact ⟨rfl,m1.trans hW,C0 m1 h31.1,rfl,U1 (O1 (by decide) _) (m2.trans hS), U1 (O1 (by decide) _) (m2.trans (I3 h31.2.2)),o1⟩ def sPX(Wd XT:ἀ)(b:Ἂ Ἃ)(n ow:Ἄ)(hW:(J0 ow)*(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ)) (o:Ἄ)(S:ἀ)(hS:8*(J0 ow)<=(kS S)):ἀ:= if h:o < ow then have A:=sPXb Wd S n ow o hW h31 hS (ε.mp h) let bo:=dw oneW*dw b[(J0 o)]! if h2:o+1 < ow then have A2:=sPXb Wd S n ow (o+1) hW h31 hS (ε.mp h2) let bp:=dw oneW*dw b[(J0 (o+1))]! let y:=kX16 Wd XT (o*n) ((o+1)*n) n A.2.1 A2.2.1 hX ⟨A.2.2.1,A2.2.2.1,h31.2.1⟩ 0 bo bo bo bo bo bo bo bo bp bp bp bp bp bp bp bp let S1:=w8 S (8*o) ⟨y.a0,y.a1,y.a2,y.a3,y.a4,y.a5,y.a6,y.a7⟩ A.2.2.2.2.1 A.2.2.2.2.2.1 sPX Wd XT b n ow hW hX h31 (o+1+1) (w8 S1 (8*(o+1)) ⟨y.b0,y.b1,y.b2,y.b3,y.b4,y.b5,y.b6,y.b7⟩ (by rw[w8_size];exact A2.2.2.2.2.1) A2.2.2.2.2.2.1) (by rw[w8_size,w8_size];exact hS) else w8 S (8*o) (kX8 Wd XT (o*n) n A.2.1 hX ⟨A.2.2.1,h31.2.1⟩ 0 bo bo bo bo bo bo bo bo) A.2.2.2.2.1 A.2.2.2.2.2.1 else S termination_by (J0 ow)-(J0 o) decreasing_by (have A2:=sPXb Wd S n ow (o+1) hW h31 hS (ε.mp h2);rw[A2.2.2.2.2.2.2,(sPXb Wd S n ow o hW h31 hS (ε.mp h)).2.2.2.2.2.2];have:=ε.mp h2;rw[(sPXb Wd S n ow o hW h31 hS (ε.mp h)).2.2.2.2.2.2] at this;exact Lq2 _ _ this) theorem sPX_size(Wd XT:ἀ)(b:Ἂ Ἃ)(n ow:Ἄ)(hW:(J0 ow)*(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ)) : ∀ m (o:Ἄ)(S:ἀ)(hS:8*(J0 ow)<=(kS S)),(J0 ow)-(J0 o)=m → (kS (sPX Wd XT b n ow hW hX h31 o S hS))=(kS S):=by intro m; induction m using Z5 with | _ m ih => intro o S hS hm by_cases h:(J0 o) < (J0 ow) · have A:=sPXb Wd S n ow o hW h31 hS h by_cases h2:(J0 o)+1 < (J0 ow) · have A2:=sPXb Wd S n ow (o+1) hW h31 hS (by rw [A.2.2.2.2.2.2]; exact h2) rw [sPX,AT (ε.mpr h),AT (ε.mpr (by rw [A.2.2.2.2.2.2]; exact h2))]; dsimp only rw [ih _ (by rw [A2.2.2.2.2.2.2,A.2.2.2.2.2.2, ← hm]; exact Lq2 _ _ h2) _ _ _ rfl,w8_size,w8_size] · rw [sPX,AT (ε.mpr h),dite_eq_right (fun h'=>h2 (by rw [← A.2.2.2.2.2.2]; exact ε.mp h'))]; rw [w8_size] · rw [sPX,dite_eq_right (fun h'=>h (ε.mp h'))] theorem kLs (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(r:ℕ)(hr:r<8):lsel a0 a1 a2 a3 a4 a5 a6 a7 r=A8.f ⟨a0,a1,a2,a3,a4,a5,a6,a7⟩ r:=by interval_cases r <;> rfl theorem sPX_v(Wd XT:ἀ)(b:Ἂ Ἃ)(wo n:Ἄ)(hW:(J0 wo)+(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 wo)+(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)) (o':ℕ)(hwo:(J0 wo)=o'*(J0 n))(c:Ἅ)(hc:c=dw oneW*dw b[o']!)(y:A8)(hy:y=kX8 Wd XT wo n hW hX h31 0 c c c c c c c c) : ∀ r<8,lsel y.a0 y.a1 y.a2 y.a3 y.a4 y.a5 y.a6 y.a7 r=ao (fun s=>XT.data[8*s+r]!*Wd.data[o'*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[o']!):=by intro r hr rw [kLs _ _ _ _ _ _ _ _ r hr,show (⟨y.a0,y.a1,y.a2,y.a3,y.a4,y.a5,y.a6,y.a7⟩:A8)=y from rfl,hy,kX8_spec _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl r hr,f8,hwo,hc] rfl theorem sPX_spec(Wd XT:ἀ)(b:Ἂ Ἃ)(n ow:Ἄ)(hW:(J0 ow)*(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ)) : ∀ m (o:Ἄ)(S:ἀ)(hS:8*(J0 ow)<=(kS S)),(J0 ow)-(J0 o)=m → (∀ o'<(J0 o),o'<(J0 ow) → ∀ r<8,S.data[8*o'+r]! = ao (fun s=>XT.data[8*s+r]!*Wd.data[o'*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[o']!)) → ∀ o'<(J0 ow), ∀ r<8,(sPX Wd XT b n ow hW hX h31 o S hS).data[8*o'+r]! = ao (fun s=>XT.data[8*s+r]!*Wd.data[o'*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[o']!):=by intro m; induction m using Z5 with | _ m ih => intro o S hS hm I by_cases h:(J0 o) < (J0 ow) · have A:=sPXb Wd S n ow o hW h31 hS h by_cases h2:(J0 o)+1 < (J0 ow) · have A2:=sPXb Wd S n ow (o+1) hW h31 hS (by rw [A.2.2.2.2.2.2]; exact h2) rw [sPX,AT (ε.mpr h),AT (ε.mpr (by rw [A.2.2.2.2.2.2]; exact h2))]; dsimp only refine ih _ (by rw [A2.2.2.2.2.2.2,A.2.2.2.2.2.2, ← hm]; exact Lq2 _ _ h2) _ _ _ rfl ?_ intro o' ho' ho'w r hr rw [A2.2.2.2.2.2.2,A.2.2.2.2.2.2] at ho' have f0:(J0 (8*o))=8*(J0 o):=A.2.2.2.1 have f1:(J0 (8*(o+1)))=8*(J0 o)+8:=by rw [A2.2.2.2.1,A.2.2.2.2.2.2,Kk] have K:=kX16_eq Wd XT (o*n) ((o+1)*n) n A.2.1 A2.2.1 hX ⟨A.2.2.1,A2.2.2.1,h31.2.1⟩ _ 0 (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 o)]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) (dw oneW*dw b[(J0 (o+1))]!) rfl rw [w8_spec,w8_spec] by_cases e1:o'=(J0 o)+1 · subst e1 rw [AD (show (J0 (8*(o+1))) ≤ 8*((J0 o)+1)+r∧8*((J0 o)+1)+r < (J0 (8*(o+1)))+8 by rw [f1]; exact Lw1 _ _ hr),Lw8 _ _ _ f1] exact sPX_v Wd XT b ((o+1)*n) n A2.2.1 hX ⟨A2.2.2.1,h31.2.1⟩ ((J0 o)+1) (by rw [A2.1,A.2.2.2.2.2.2]) _ (by rw [A.2.2.2.2.2.2]) _ K.2 r hr · rw [AC (by rw [f1]; exact Lw3 _ _ _ hr e1)] by_cases e0:o'=(J0 o) · subst e0 rw [AD (by rw [f0]; exact Lw4 _ _ hr)]; simp only [f0,ϱ] exact sPX_v Wd XT b (o*n) n A.2.1 hX ⟨A.2.2.1,h31.2.1⟩ (J0 o) A.1 _ rfl _ K.1 r hr · rw [AC (by rw [f0]; exact Lw5 _ _ _ hr e0)] exact I o' (Lw6 _ _ ho' e1 e0) ho'w r hr · rw [sPX,AT (ε.mpr h),dite_eq_right (fun h'=>h2 (by rw [← A.2.2.2.2.2.2]; exact ε.mp h'))] intro o' ho' r hr have f0:(J0 (8*o))=8*(J0 o):=A.2.2.2.1 rw [w8_spec] by_cases e0:o'=(J0 o) · subst e0 rw [AD (by rw [f0]; exact Lw4 _ _ hr)]; simp only [f0,ϱ] exact sPX_v Wd XT b (o*n) n A.2.1 hX ⟨A.2.2.1,h31.2.1⟩ (J0 o) A.1 _ rfl _ rfl r hr · rw [AC (by rw [f0]; exact Lw5 _ _ _ hr e0)] exact I o' (Lw7 _ _ _ ho' h2 e0) ho' r hr · rw [sPX,dite_eq_right (fun h'=>h (ε.mp h'))] intro o' ho' r hr; exact I o' (U1 ho' (V4 h)) ho' r hr theorem sFBb(r0 ow lim r:Ἄ)(hl:(J0 lim)<=8)(hR:(J0 r0)+(J0 lim)<2^(31:Ἀ))(hB:((J0 r0)+(J0 lim))*(J0 ow)<2^(31:Ἀ))(h:(J0 r)<(J0 lim)) : (J0 ((r0+r)*ow))=((J0 r0)+(J0 r))*(J0 ow)∧(J0 (r0+r))=(J0 r0)+(J0 r) ∧ ((J0 r0)+(J0 r))*(J0 ow)+(J0 ow)<=((J0 r0)+(J0 lim))*(J0 ow)∧(J0 r)<(J0 (8:Ἄ))∧(J0 (r+1))=(J0 r)+1:=by have m1:((J0 r0)+(J0 r)+1)*(J0 ow) ≤ ((J0 r0)+(J0 lim))*(J0 ow):=ι _ (O1 h _) rw [Ο] at m1 have e1:(J0 (r0+r))=(J0 r0)+(J0 r):=kSm _ _ (Lql _ _ _ _ h (I3 hR)) have e2:(J0 ((r0+r)*ow))=((J0 r0)+(J0 r))*(J0 ow):=by rw [kMm _ _ (by rw [e1]; exact C0 ((V1 _ _).trans m1) hB),e1] exact ⟨e2,e1,m1,by rw [kc8]; exact U1 h hl,ac (ε.mpr h)⟩ def sFB(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἄ->Ἅ->Ἃ)(S:ἀ)(r0 ow lim:Ἄ)(hS:8*(J0 ow)<=(kS S)∧8*(J0 ow)<2^(31:Ἀ))(hl:(J0 lim)<=8)(hR:(J0 r0)+(J0 lim)<2^(31:Ἀ))(hB:((J0 r0)+(J0 lim))*(J0 ow)<2^(31:Ἀ)) (r:Ἄ)(a:Ἂ Ἃ)(ha:((J0 r0)+(J0 lim))*(J0 ow)<=(O0 a)):Ἂ Ἃ:= if h:r < lim then have F:=sFBb r0 ow lim r hl hR hB (ε.mp h) sFB relu H fb S r0 ow lim hS hl hR hB (r+1) (sFG relu H (fb (r0+r)) S 8 r ((r0+r)*ow) ow ⟨F.2.2.2.1,by rw[kc8];exact hS.1,by rw[kc8];exact hS.2⟩ (by rw[F.1];exact C0 F.2.2.1 hB) 0 a (by rw[F.1];exact F.2.2.1.trans ha)) (by rw[sFG_sz];exact ha) else a termination_by (J0 lim)-(J0 r) decreasing_by (rw[ac h];exact Lqd _ _ (ε.mp h)) theorem sFB_spec(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἄ->Ἅ->Ἃ)(S:ἀ)(r0 ow lim:Ἄ)(hS:8*(J0 ow)<=(kS S)∧8*(J0 ow)<2^(31:Ἀ))(hl:(J0 lim)<=8)(hR:(J0 r0)+(J0 lim)<2^(31:Ἀ))(hB:((J0 r0)+(J0 lim))*(J0 ow)<2^(31:Ἀ)) : ∀ m (r:Ἄ)(a:Ἂ Ἃ)(ha:((J0 r0)+(J0 lim))*(J0 ow)<=(O0 a)),(J0 lim)-(J0 r)=m → (O0 (sFB relu H fb S r0 ow lim hS hl hR hB r a ha))=(O0 a) ∧ (∀ q,(∀ r' o',(J0 r) ≤ r' → r'<(J0 lim) → o'<(J0 ow) → ((J0 r0)+r')*(J0 ow)+o'≠q) → (sFB relu H fb S r0 ow lim hS hl hR hB r a ha)[q]! = a[q]!) ∧ (∀ r' o',(J0 r) ≤ r' → r'<(J0 lim) → o'<(J0 ow) → (sFB relu H fb S r0 ow lim hS hl hR hB r a ha)[((J0 r0)+r')*(J0 ow)+o']! = (if zR (S.data[8*o'+r']!) relu H==(0xFFFFFFFF:ἇ) then fb (r0+O2 r') (O2 o') (S.data[8*o'+r']!) else zR (S.data[8*o'+r']!) relu H)):=by intro m; induction m with | zero => intro r a ha hm rw [sFB,dite_eq_right (fun h=>Lq0 _ _ hm (ε.mp h))] exact ⟨rfl,fun q _=>rfl,fun r' o' h1 h2 _=>absurd (C0 h1 h2) (Lq0 _ _ hm)⟩ | succ m ih => intro r a ha hm have HQ:=Lqs _ _ _ hm; have h:=HQ.1 have F:=sFBb r0 ow lim r hl hR hB h rw [sFB,AT (ε.mpr h)]; dsimp only obtain ⟨T1,T2,T3⟩:=ih (r+1) _ _ (by rw [F.2.2.2.2]; exact HQ.2) have G:=sFG_spec relu H (fb (r0+r)) S 8 r ((r0+r)*ow) ow ⟨F.2.2.2.1,by rw[kc8];exact hS.1,by rw[kc8];exact hS.2⟩ (by rw[F.1];exact C0 F.2.2.1 hB) _ 0 a (by rw[F.1];exact F.2.2.1.trans ha) rfl (ϟ _) rw [F.2.2.2.2] at T2 T3 refine ⟨by rw [T1,sFG_sz],fun q hq => ?_,fun r' o' h1 h2 h3 => ?_⟩ · rw [T2 q (fun r' o' h1 h2 h3=>hq r' o' (X5 h1) h2 h3),G q,AC] rw [F.1,kc0,ϑ]; intro ⟨g1,g2⟩ exact hq (J0 r) (q-((J0 r0)+(J0 r))*(J0 ow)) (le_refl _) h (D4 g1 g2) (BQ g1) · by_cases e:r'=J0 r · subst e rw [T2 _ (fun r'' o'' g1 g2 g3=>Lqf _ _ _ _ _ _ g1 h3), G,F.1,kc0,ϑ,AD ⟨V1 _ _,O1 h3 _⟩,ϱ,kc8] have er:r0+O2 (J0 r)=r0+r:=by rw [show O2 (J0 r)=r from Kv] rw [er] · exact T3 r' o' (W5 h1 (fun x=>e x.symm)) h2 h3 theorem kPm (e c:ἆ) (h:e.toNat < 255) (hc:c.toNat ≤ 992) : ((if e < (56:ἆ) then (56:ἆ) else e)+c).toNat=max e.toNat 56+c.toNat:=by have m:(if e < (56:ἆ) then (56:ἆ) else e).toNat=max e.toNat 56:=by by_cases g:e < (56:ἆ) · rw [AD g]; exact (Qm (I3 (show e.toNat < 56 from g))).symm · rw [AC g]; exact (Qv (V4 (show ¬ e.toNat < 56 from g))).symm rw [η,m] exact γ (C0 (M3 (Zg.2 ⟨I3 h,by decide⟩) hc) (by decide)) theorem kOutRb (v:Ἅ)(relu:Ἆ)(n:ℕ)(D Wf:ℕ→Ἃ)(Fb:Ἃ)(hfb:Fb=p8 relu (ms (n+1) D Wf))(e cq hb em:ἆ) (hw:∀ p:ἆ,p=(if e<(56:ἆ) then (56:ἆ) else e)+cq → e<(255:ἆ) → p ≤ (372:ἆ) → aG (n+1) D Wf∧fv v ∧ |rv v-(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^(((if hb>p then hb else p).toNat:ℕ):ℤ) ∧ |(af (n+1) D Wf:ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if hb>p then hb else p).toNat)+52:ℕ):ℤ)∧(if hb>p then hb else p).toNat ≤ 600) (hEm:e.toNat ≤ em.toNat)(hem:em.toNat < 255)(hc2:cq.toNat ≤ 992) : (if zR v relu (if (if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) then (if hb>(if em<(56:ἆ) then (56:ἆ) else em)+cq then hb else (if em<(56:ἆ) then (56:ἆ) else em)+cq) else (4000:ἆ))==(0xFFFFFFFF:Ἃ) then Fb else zR v relu (if (if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) then (if hb>(if em<(56:ἆ) then (56:ἆ) else em)+cq then hb else (if em<(56:ἆ) then (56:ἆ) else em)+cq) else (4000:ἆ)))=p8 relu (ms (n+1) D Wf):=by by_cases hP:(if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) · rw [AD hP] have he:e.toNat < 255:=C0 hEm hem have tpe:=kPm e cq he hc2 have tP:=kPm em cq hem hc2 have hP':((if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat ≤ 372:=hP have mE:max e.toNat 56+cq.toNat ≤ max em.toNat 56+cq.toNat:=L1 (max_le_max_right 56 hEm) _ have pe:(if e<(56:ἆ) then (56:ἆ) else e)+cq ≤ (372:ἆ):=(show ((if e<(56:ἆ) then (56:ἆ) else e)+cq).toNat ≤ 372 by rw [tpe]; exact mE.trans (by rw [← tP]; exact hP')) obtain ⟨g,fv1,b1,b2,_,b6⟩:=hw _ rfl he pe have mono:(if hb>(if e<(56:ἆ) then (56:ἆ) else e)+cq then hb else (if e<(56:ἆ) then (56:ἆ) else e)+cq).toNat ≤ (if hb>(if em<(56:ἆ) then (56:ἆ) else em)+cq then hb else (if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat:=by rw [kOutW_h2,kOutW_h2,tpe,tP]; exact max_le_max_left _ mE have h6:(if hb>(if em<(56:ἆ) then (56:ἆ) else em)+cq then hb else (if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat ≤ 600:=by rw [kOutW_h2] at b6 ⊢; exact max_le ((le_max_left _ _).trans b6) (hP'.trans (by decide)) exact kZR v _ relu n _ _ _ hfb g fv1 (AZ b1 (AG (by norm_num) (by exact_mod_cast mono))) b2 h6 · rw [AC hP,kZRBig]; simp only [Az,ἁ]; exact hfb def gY(Wd XT:ἀ)(b:Ἂ Ἃ)(relu:Ἆ)(cq hbq em:ἆ)(fb:Ἄ->Ἄ->Ἅ->Ἃ)(n ow r0 lim:Ἄ) (hW:(J0 ow)*(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ)) (hl:(J0 lim)<=8)(hR:(J0 r0)+(J0 lim)<2^(31:Ἀ))(hB:((J0 r0)+(J0 lim))*(J0 ow)<2^(31:Ἀ))(acc:Ἂ Ἃ):Ἂ Ἃ:= if ha:((J0 r0)+(J0 lim))*(J0 ow)<=(O0 acc) then let S:=sPX Wd XT b n ow hW hX h31 0 (zPq (8*(J0 ow))) (zPs _).1 let P:=(if em<(56:ἆ) then (56:ἆ) else em)+cq sFB relu (if P<=(372:ἆ) then (if hbq>P then hbq else P) else (4000:ἆ)) fb S r0 ow lim ⟨by rw[sPX_size _ _ _ _ _ _ _ _ _ _ _ _ rfl];exact (zPs _).1,h31.2.2⟩ hl hR hB 0 acc ha else acc theorem gY_spec(Wd XT:ἀ)(E:Ἂ Ἃ)(X W b:Ἂ Ἃ)(relu:Ἆ)(ix ib L H N:Ἀ)(n ow r0 lim:Ἄ) (hW:(J0 ow)*(J0 n)<=(kS Wd))(hX:8*(J0 n)<=(kS XT))(h31:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ))(hn:(J0 n)=N) (hl:(J0 lim)<=8)(hR:(J0 r0)+(J0 lim)<2^(31:Ἀ))(hB:((J0 r0)+(J0 lim))*(J0 ow)<2^(31:Ἀ)) (hWv:∀k,k<(J0 ow)*(J0 n)->Wd.data[k]! =dw W[k]!) (hXv:∀s,s<(J0 n)->∀r,r<8->XT.data[8*s+r]! =if r<(J0 lim) then dw X[((J0 r0)+r)*N+s]! else dw 0) (hEv:∀o,o<(J0 ow)->∀s,s(expOf W[o*N+s]!).toNat<=(E[o]!).toNat) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(hb:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=ib)(Y:N+2<=2^L)(x:L<=27)(z:ib+L<=425)(hix:ix<=425)(cq hbq em:ἆ)(hcq:∀ r,r<(J0 lim) → 23+(cEq (I0 (9*(N+1))).toInt64.toFloat (ao (fun k=>dw (X[((J0 r0)+r)*N+k]! &&& 0x7FFFFFFF)) N 0 0)).toNat ≤ cq.toNat)(hcq2:cq.toNat ≤ 992)(hhb:hbq=(ib+L-50).toUInt64)(hN:0(E[o]!).toNat<=em.toNat)(hem:em.toNat<255) (acc:Ἂ Ἃ)(ha:((J0 r0)+(J0 lim))*(J0 ow)<=(O0 acc)) : (O0 (gY Wd XT b relu cq hbq em (bXfb relu X W b E Wd ix ib L N) n ow r0 lim hW hX h31 hl hR hB acc))=(O0 acc) ∧ (∀q,(∀r o',r<(J0 lim)->o'<(J0 ow)->((J0 r0)+r)*(J0 ow)+o'≠q)->(gY Wd XT b relu cq hbq em (bXfb relu X W b E Wd ix ib L N) n ow r0 lim hW hX h31 hl hR hB acc)[q]! =acc[q]!) ∧ (∀r o',r<(J0 lim)->o'<(J0 ow)->(gY Wd XT b relu cq hbq em (bXfb relu X W b E Wd ix ib L N) n ow r0 lim hW hX h31 hl hR hB acc)[((J0 r0)+r)*(J0 ow)+o']! =act relu (dotOf (N+1) (fun t=>if tif t(if em<(56:ἆ) then (56:ἆ) else em)+cq then hbq else (if em<(56:ἆ) then (56:ἆ) else em)+cq) else (4000:ἆ)) (bXfb relu X W b E Wd ix ib L N) (sPX Wd XT b n ow hW hX h31 0 (zPq (8*(J0 ow))) (zPs _).1) r0 ow lim ⟨by rw[sPX_size _ _ _ _ _ _ _ _ _ _ _ _ rfl];exact (zPs _).1,h31.2.2⟩ hl hR hB _ 0 acc ha rfl have SP:=sPX_spec Wd XT b n ow hW hX h31 _ 0 (zPq (8*(J0 ow))) (zPs _).1 rfl (fun o' h _=>absurd h (by rw [kc0]; exact C5 _)) refine ⟨T1,fun q hq=>T2 q (fun r' o' _ h2 h3=>hq r' o' h2 h3),fun r o' hr ho => ?_⟩ rw [T3 r o' (by rw [kc0]; exact ϟ _) hr ho,SP o' ho r (U1 hr hl)] have hS : ∀k,k<2^(31:Ἀ)->kAN (AN hk (by decide)) ς have ho':(J0 (O2 o'))=o':=W3 (hS _ (U1 ho (I3 (C0 (lZ _ (by decide)) h31.2.2)))) have hr8:r < kX:=hS _ (U1 (U1 hr hl) (by decide)) have hrow:(J0 (r0+O2 r))=(J0 r0)+r:=by rw [kSm _ _ (by rw [W3 hr8]; exact Lql _ _ _ _ hr (I3 hR)),W3 hr8] have m1:o'*(J0 n)+(J0 n) ≤ (J0 ow)*(J0 n):=by have:=ι (J0 n) (show o'+1 ≤ (J0 ow) from ho); rwa [Ο] at this simp only [bXfb,hrow,ho',hn] simp only [sTB_eq,hrow,ho'] have hpx : ∀ k < N,expOf W[o'*N+k]! ≠ 255 → fv ((fun k=>XT.data[8*k+r]! * Wd.data[o'*N+k]!) k)∧rv ((fun k=>XT.data[8*k+r]! * Wd.data[o'*N+k]!) k)=tm X[((J0 r0)+r)*N+k]! W[o'*N+k]! := fun k hk hw=>by beta_reduce at hw ⊢ rw [hXv k (by rw [hn]; exact hk) r (U1 hr hl),AD hr,hWv _ (by rw [← hn]; rw [← hn] at hk; exact AN (O1 hk _) m1)] exact dJ _ _ (F _).1 hw have G:=kGB1T relu N N o' (fun s=>X[((J0 r0)+r)*N+s]!) W b (fun k=>k) (fun k=>XT.data[8*k+r]! * Wd.data[o'*N+k]!) (fun s=>dw X[((J0 r0)+r)*N+s]! * Wd.get! (o'*N+s)) E[o']! ix ib L H (fun _=>aD N relu X W b (((J0 r0)+r)*N) 1 o') (fun s _=>F _) (fun s hs=>hEv o' ho s hs) (hb _) M Y x z (le_refl _) (fun k hk=>hk) (fun a c h _=>h) (fun s hs hh=>absurd rfl (hh s hs)) hpx (fun s hs hw=>by beta_reduce at hw ⊢; rw [gg,hWv _ (by rw [← hn]; rw [← hn] at hs; exact AN (O1 hs _) m1)]; exact dJ _ _ (F _).1 hw) (kAD N relu X W b ((J0 r0)+r) o') exact kOutRb _ relu N _ _ _ G (E[o']!).toUInt64 cq hbq em (fun p hp he h372=>kOutWm N (fun s=>X[((J0 r0)+r)*N+s]!) W b E ib L H o' cq hbq p (fun k=>XT.data[8*k+r]! * Wd.data[o'*N+k]!) _ _ (fun s _=>(F _).1) (hb _) M Y x z hN (fun s hs=>hEv o' ho s hs) (fun the s hs=>hpx s hs (fun h'=>by have:=hEv o' ho s hs; rw [h'] at this; simp at this; omega)) rfl rfl (hcq r hr) hcq2 hhb hp he h372) (by rw [ϩ]; exact hEm o' ho) hem hcq2 def gXb(X:Ἂ Ἃ)(Wd:ἀ)(E:Ἂ Ἃ)(b:Ἂ Ἃ)(relu:Ἆ)(bs Lq ib em:ἆ)(fb:Ἄ->Ἄ->Ἅ->Ἃ)(R n ow:Ἀ) (hXs:R*n<=(O0 X))(hW:ow*n<=(kS Wd))(hRn:R*n<2^31)(h8n:8*n<2^31)(hon:ow*n<2^31)(how:ow<2^31)(hR31:R<2^31)(hRo:R*ow<2^31)(h8o:8*ow<2^31)(rb:Ἀ)(acc:Ἂ Ἃ):Ἂ Ἃ:= if h:rb*8kAN (AN hk (by decide)) ς have hR1:rb*8*n+lim*n<=R*n:=by rw[← Ϡ];exact ι n hlR have e1:(J0 ((G0 (rb*8*n))))=rb*8*n:=W3 (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=W3 (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 lim)))=lim:=W3 (hS _ (AO hl8 (by decide))) have hB:∀r t:ℕ,r<(J0 ((G0 lim)))->t<(J0 ((G0 n)))->(J0 ((G0 (rb*8*n))))+r*(J0 ((G0 n)))+t<(O0 X)∧(J0 ((G0 (rb*8*n))))+r*(J0 ((G0 n)))+t<2^31:=by intro r t hr ht;rw[e3] at hr;rw[e2] at ht;rw[e1,e2] have:=ι n (show r+1<=lim from hr);rw[Ϡ,n4] at this have k:rb*8*n+r*n+tif rἈ->Ἃ)(Ez:z=y) (IH:(O0 A)=R*ow->(∀row j,row<(rb+1)*8->rowjA[row*ow+j]! =Fv row j)->(O0 y)=R*ow ∧ ∀row j,rowjy[row*ow+j]! =Fv row j) (G:(O0 A)=R*ow∧(∀q,(∀r o',rd0<=o'->o'(b+r)*a+o'≠q)->A[q]! =acc[q]!)∧(∀r o',rd0<=o'->o'A[(b+r)*a+o']! =Fv (b+r) o')) (ha:a=ow)(hb:b=rb*8)(hc:c=min 8 (R-rb*8))(hd:d0=0) (hI:∀row j,rowrowjacc[row*ow+j]! =Fv row j): (O0 z)=R*ow ∧ ∀row j,rowjz[row*ow+j]! =Fv row j:=by subst Ez a b c d0; obtain ⟨G1,G2,G3⟩:=G refine IH G1 (fun row j h1 h2 h3=>?_) by_cases hr:row < rb*8 · rw[G2 _ (fun r o' hr' _ ho' he=>O3.2 (Va.intro (kDM _ _ _ _ _ he ho' h3).1) hr)];exact hI row j hr h2 h3 · have:=G3 (row-rb*8) j (lt_min (D4 (O3.1 hr) (by rwa[Ϡ,n4] at h1)) (Hf (O3.1 hr) h2)) (ϟ _) h3 rw[BQ (O3.1 hr)] at this;exact this def bX8(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L:Ἀ)(Wd:ἀ)(E:Ἂ Ἃ)(em:ἆ) (hXs:R*n<=(O0 X))(hW:ow*n<=(kS Wd))(hRn:R*n<2^(31:Ἀ))(h8n:8*n<2^(31:Ἀ))(hon:ow*n<2^(31:Ἀ))(how:ow<2^(31:Ἀ))(hR31:R<2^(31:Ἀ))(hRo:R*ow<2^(31:Ἀ))(h8o:8*ow<2^(31:Ἀ)):Ἂ Ἃ:= let fb:=fun (row j:Ἄ)(v:Ἅ)=>tG relu v E[(J0 j)]! ix ib L (λ_=>tR relu L (sTB X Wd n row j (dw oneW*dw b[(J0 j)]!)) λ_=>aD n relu X W b ((J0 row)*n) 1 (J0 j)) (λ_=>aD n relu X W b ((J0 row)*n) 1 (J0 j)) gXb X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em fb R n ow hXs hW hRn h8n hon how hR31 hRo h8o 0 (Ah (R*ow) 0) theorem gXb_spec(X:Ἂ Ἃ)(Wd:ἀ)(E:Ἂ Ἃ)(W b:Ἂ Ἃ)(relu:Ἆ)(ix ib L H R n ow:Ἀ)(em:ἆ) (hXs:R*n<=(O0 X))(hW:ow*n<=(kS Wd))(hRn:R*n<2^31)(h8n:8*n<2^31)(hon:ow*n<2^31)(how:ow<2^31)(hR31:R<2^31)(hRo:R*ow<2^31)(h8o:8*ow<2^31) (hWv:∀k,kWd.data[k]! =dw W[k]!) (hEv:∀o,o∀s,s(expOf W[o*n+s]!).toNat<=(E[o]!).toNat) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(hb:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=ib)(Y:n+2<=2^L)(x:L<=27)(z:ib+L<=425)(hix:ix<=425)(hN:0(E[o]!).toNat<=em.toNat)(hem:em.toNat<255) : ∀ m rb (acc:Ἂ Ἃ),R-rb*8<=m -> (O0 acc)=R*ow -> (∀row j,rowrowjacc[row*ow+j]! =act relu (dotOf (n+1) (fun t=>if tif t (O0 (gXb X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em (bXfb relu X W b E Wd ix ib L n) R n ow hXs hW hRn h8n hon how hR31 hRo h8o rb acc))=R*ow ∧ ∀row j,rowj(gXb X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em (bXfb relu X W b E Wd ix ib L n) R n ow hXs hW hRn h8n hon how hR31 hRo h8o rb acc)[row*ow+j]! =act relu (dotOf (n+1) (fun t=>if tif t intro rb acc HH hA hI;have hz:=V3.1 (Nat.le_zero.1 HH);rw[(gXb.eq_1 X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em (bXfb relu X W b E Wd ix ib L n) R n ow hXs hW hRn h8n hon how hR31 hRo h8o rb acc).trans (dite_eq_right (O3.2 hz))] exact ⟨hA,fun row j h1 h2=>hI row j (AN h1 hz) h1 h2⟩ | succ m IH => intro rb acc HH hA hI by_cases h:rb*8 < R swap · exact IH rb acc (by rw[Gy (O3.1 h)];exact ϟ _) hA hI have hl8:min 8 (R-rb*8)<=8:=O7 _ _ have hlR:rb*8+min 8 (R-rb*8)<=R:=(J1 (Jp 8 (R-rb*8)) _).trans (Y3 (BQ (I3 h))) have hS:∀k,k<2^31->kAN (AN hk (by decide)) ς have hR1:rb*8*n+min 8 (R-rb*8)*n<=R*n:=by rw[← Ϡ];exact ι n hlR have e1:(J0 ((G0 (rb*8*n))))=rb*8*n:=W3 (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=W3 (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 (min 8 (R-rb*8)))))=min 8 (R-rb*8):=W3 (hS _ (AO hl8 (by decide))) have e4:(J0 ((G0 ow)))=ow:=W3 (hS _ how) have e5:(J0 ((G0 (rb*8))))=rb*8:=W3 (hS _ (I4 h hR31)) have hXd:(J0 ((G0 (rb*8*n))))+(J0 ((G0 (min 8 (R-rb*8)))))*(J0 ((G0 n)))<=(O0 X):=by rw[e1,e3,e2];exact hR1.trans hXs have hYd:8*(J0 ((G0 n)))+8<=(kS (zPq (8*n+8))):=by rw[e2];exact (zPs _).1 have hBd:(J0 ((G0 (rb*8*n))))+(J0 ((G0 (min 8 (R-rb*8)))))*(J0 ((G0 n)))<2^31/\8*(J0 ((G0 n)))+7<2^31:=⟨by rw[e1,e3,e2];exact AO hR1 hRn,by rw[e2];exact U1 (U4 _) ((Nat.mul_add_one 8 n).symm.trans_le (X3 8 (Nat.lt_of_mul_lt_mul_left (a:=8) (c:=268435456) h8n)))⟩ have hld:(J0 ((G0 (min 8 (R-rb*8)))))<=8:=by rw[e3];exact hl8 have e0:(J0 (0:Ἄ))=0:=rfl have D:=dX8_spec X (G0 (rb*8*n)) (G0 n) (G0 (min 8 (R-rb*8))) hXd hBd hld ((J0 ((G0 (min 8 (R-rb*8)))))-(J0 (0:Ἄ))) 0 (zPq (8*n+8)) hYd rfl (ϟ _) have DS:=dX8_size X (G0 (rb*8*n)) (G0 n) (G0 (min 8 (R-rb*8))) hXd hBd hld ((J0 ((G0 (min 8 (R-rb*8)))))-(J0 (0:Ἄ))) 0 (zPq (8*n+8)) hYd rfl have ZP:=zPs (8*n+8) have P:=gXb_spec_h2 _ (zPq (8*n+8)) X _ _ _ _ (J0 ((G0 (rb*8)))) n e0 e2 (by rw[e1,e5]) hld (fun q hq=>ZP.2.2 _ (hq.trans_le ZP.1)) D let F9:=(I0 (9*(n+1))).toInt64.toFloat let cr:=fun (r:Nat)=>if r< min 8 (R-rb*8) then (23:ἆ)+cEq F9 ((dX8 X (G0 (rb*8*n)) (G0 n) (G0 (min 8 (R-rb*8))) 0 (zPq (8*n+8)) hXd hYd hBd hld).get! (8*n+r)) else (0:ἆ) have K:=kMx8 cr 992 (fun r _=>if hr:r< min 8 (R-rb*8) then (congrArg lq (AD hr)).trans_le (kCR _ _).2 else (congrArg lq (AC hr)).trans_le (ϟ _)) have hcq:∀r,r<(J0 ((G0 (min 8 (R-rb*8)))))->23+(cEq F9 (ao (fun k=>dw (X[((J0 ((G0 (rb*8))))+r)*n+k]! &&& 0x7FFFFFFF)) n 0 0)).toNat<=(mx2 (mx2 (mx2 (cr 0) (cr 1)) (mx2 (cr 2) (cr 3))) (mx2 (mx2 (cr 4) (cr 5)) (mx2 (cr 6) (cr 7)))).toNat:=fun r hr=>((congrArg (fun x=>23+(cEq F9 x).toNat) ((gg _ _).trans (P.2 r hr)).symm).trans ((kCR _ _).1.symm.trans (congrArg lq (AD (hr.trans_eq e3)).symm))).trans_le (K.1 r ((hr.trans_eq e3).trans_le hl8)) have hOW:(J0 ((G0 ow)))*(J0 ((G0 n)))=ow*n:=by rw[e4,e2] exact gXb_spec_h1 _ _ _ _ _ _ _ _ _ _ _ _ ((gXb.eq_1 X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em (bXfb relu X W b E Wd ix ib L n) R n ow hXs hW hRn h8n hon how hR31 hRo h8o rb acc).trans (AT h)) (IH (rb+1) _ (by rw[Ϡ,n4,W4];exact (N9 (by decide) _).trans (O9 HH))) (by obtain ⟨T1,T2,T3⟩:=gY_spec Wd (dX8 X (G0 (rb*8*n)) (G0 n) (G0 (min 8 (R-rb*8))) 0 (zPq (8*n+8)) hXd hYd hBd hld) E X W b relu ix ib L H n (G0 n) (G0 ow) (G0 (rb*8)) (G0 (min 8 (R-rb*8))) (by rw[e4,e2];exact hW) (by rw[DS,e2];exact AZ (V1 _ 8) ZP.1) ⟨by rw[e4,e2];exact hon,by rw[e2];exact h8n,by rw[e4];exact h8o⟩ e2 (by rw[e3];exact hl8) (by rw[e5,e3];exact C0 hlR hR31) (by rw[e5,e3,e4];exact C0 (ι ow hlR) hRo) (fun k hk=>hWv k (by rw[e4,e2] at hk;exact hk)) P.1 (fun o ho s hs=>hEv o (by rw[e4] at ho;exact ho) s hs) F hb M Y x z hix _ _ em hcq K.2 (kHB ib L (J2 (J2 (by decide:50 ≤ 174) (V1 174 H)) M) z) hN (fun o ho=>hEm o (by rw[e4] at ho;exact ho)) hem acc (by rw[e5,e3,e4,hA];exact ι ow hlR) exact ⟨T1.trans hA,fun q hq=>T2 q (fun r o' h1 h3=>hq r o' h1 (ϟ _) h3),fun r o' h1 _ h3=>T3 r o' h1 h3⟩) e4 e5 e3 rfl hI theorem bX8_spec(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(Wd:ἀ)(E:Ἂ Ἃ)(em:ἆ) (hXs:R*n<=(O0 X))(hW:ow*n<=(kS Wd))(hRn:R*n<2^(31:Ἀ))(h8n:8*n<2^(31:Ἀ))(hon:ow*n<2^(31:Ἀ))(how:ow<2^(31:Ἀ))(hR31:R<2^(31:Ἀ))(hRo:R*ow<2^(31:Ἀ))(h8o:8*ow<2^(31:Ἀ)) (hWv:∀k,kWd.data[k]! =dw W[k]!) (hEv:∀o,o∀s,s(expOf W[o*n+s]!).toNat<=(E[o]!).toNat) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(hb:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=ib)(Y:n+2<=2^L)(x:L<=27)(z:ib+L<=425)(hix:ix<=425)(hN:0(E[o]!).toNat<=em.toNat)(hem:em.toNat<255) : bX8 R n ow relu X W b ix ib L Wd E em hXs hW hRn h8n hon how hR31 hRo h8o=mj R n ow relu X W b:=by change gXb X Wd E b relu (48+ix).toUInt64 L.toUInt64 ib.toUInt64 em (bXfb relu X W b E Wd ix ib L n) R n ow hXs hW hRn h8n hon how hR31 hRo h8o 0 (Ah (R*ow) 0)=mj R n ow relu X W b obtain ⟨T1,T2⟩:=gXb_spec X Wd E W b relu ix ib L H R n ow em hXs hW hRn h8n hon how hR31 hRo h8o hWv hEv F hb M Y x z hix hN hEm hem (R-0*8) 0 (Ah (R*ow) 0) (le_refl _) (by simp only [X4]) (fun row j h=>absurd h (by clear*-;omega)) unfold mj linearWith apply mi (by rw[T1];simp only [Ϝ]) intro q hq hq' rw[Ϝ]at hq' simp only[Λ] rw[← AB _ q hq] have hpos:0by rw[h,A7]at hq';exact C5 _ hq') have hrq:q/owwcK3eq_ok a b) wcT8S 32 (W,ow,n) (fun k=>k.1) (fun v=>tchP v.1) 3).1 if hc:c.2.2<255/\48+ix+max ((mJ c.2.2)-1) 55+L<=425/\(ow+16)*n<2^(31:Ἀ)/\R*n<2^(31:Ἀ)/\0wcK3eq_ok a b) wcDS 32 (W,ow,n) (fun k=>k.1) (fun v=>tchP v) 3).1 c.2.1 c.2.2.toUInt64 hd.2.1 (by rw[s5wcGet3_val];exact (wcDF_spec W ow n).1.ge) hc.2.2.2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.2.2 hd.2.2.1 hd.2.2.2 else mj R n ow relu X W b) else mj R n ow relu X W b theorem bTc16_spec(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^32)(dn:Ἆ) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(hb:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=ib)(Y:n+2<=2^L)(x:L<=27)(z:ib+L<=425) (hXs:(O0 X)<2^32):bTc16 R n ow relu X W b ix ib L hW hWs dn=mj R n ow relu X W b:=by unfold bTc16; dsimp only; split · rename_i hc have hv:(wcGet3T wcK3eq (fun a b=>wcK3eq_ok a b) wcT8S 32 (W,ow,n) (fun k=>k.1) (fun v=>tchP v.1) 3).1=wcT8F (W,ow,n):=s5wcGet3_val _ have P:=wcT8F_panel W ow n hc.2.2.1 hW hWs have Q:=wcT8F_exp W ow n hc.2.2.1 hW hWs split · rename_i hd have hd2:(wcGet3T wcK3eq (fun a b=>wcK3eq_ok a b) wcDS 32 (W,ow,n) (fun k=>k.1) (fun v=>tchP v) 3).1=wcDF (W,ow,n):=s5wcGet3_val _ exact bX8_spec R n ow relu X W b ix ib L H _ _ _ _ _ _ _ _ _ _ _ _ (by rw[hd2];exact (wcDF_spec W ow n).2) (by rw[hv];exact Q.2.1) F hb M Y x z (by have:=hc.2.1;clear*-this;omega) hc.2.2.2.2 (by rw[hv];exact fun o ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact hc.1) · rfl · rfl end F lemma bc{a:Ἀ}(h:a<=4294967295):a<2^(32:Ἀ):=(by exact Z4 h) def c7o(rows inW outW:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= let ex:=F.aO X 0 0 let eb:=F.aO b 0 0 let ix:=(mJ ex)-1 let ib:=174+((mJ eb)-1) let L:=Aq (inW+1)+1 if h:ex<255/\eb<255/\ib+L<=425/\L<=27/\outW*inW<=(O0 W)/\(O0 W)<=4294967295/\ 8*inW<=4294967295/\(O0 X)<=4294967295/\(O0 b)<=4294967295 then if 0 assumption lemma eDo:c7o=mj:=by funext e d g j X W b;unfold c7o;dsimp only;split · rename_i h;have:=ς;have⟨l,m,o,p,y,z,A,B,u⟩:=h;have q:d+2<=2^(Aq (d+1)+1):=by have:=@ϙ (d+1);exact l7 this refine kITE ?_ rfl exact F.bTc16_spec _ _ _ _ _ _ _ _ _ _ _ _ _ _ (F.bd X (by exact C0 B this) l) (F.bd b (by exact C0 u this) m) AP q p o (by exact bc B) · rfl open F in @[inline] def c7k(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(k:DK)(hk:k=dkF (W,b,ow,n)):Ἂ Ἃ:= if h:k.ok=true/\0by rw[hBv.2 o (by omega),AD ho] have hq:n+2<=2^(Aq (n+1)+1):=by have:=@ϙ (n+1);exact l7 this have hς:=ς split · rename_i h1 split · rename_i h2 have DM:=dOwM_m X (G0 n) (G0 (n+1)) (G0 R) p1 p3 p4 _ 0 (zPq (R*(n+1))) 0 p2 rfl rw [e1,e3,kc0,ϳ] at DM have hYv:∀ r'dw (X[r'*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[r'*n+t]!:= fun r' h1 t ht=>by rw[dOwM_Y X (G0 n) (G0 (n+1)) (G0 R) p1 p3 p4 _ 0 _ 0 p2 rfl];exact DY.2 r' t h1 (ϟ _) ht have hXe:R*n=(O0 X):=by rw[h1.1,n4];exact h1.2 have hFX:=bdM X _ (fun q hq=>DM.2 q (ϟ _) (by rw[hXe];exact hq)) h2 exact bQSg_spec R n ow relu X W b _ _ _ ((mJ (aO b 0 0))-1) (dkF (W,b,ow,n)) (wcT8F (W,ow,n)).1 (wcT8F (W,ow,n)).2.1 (wcT8F (W,ow,n)).2.2 (wcBF (b,ow,8*((ow+7)/8))) (aO b 0 0) (Aq (n+1)+1) _ _ _ rfl _ _ _ _ _ _ _ hYv hBdv P.2 Q.2.1 (fun o ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact hem) hFX (bd b (by exact C0 hbs hς) heb) (le_refl _) hq hx hz · rw [eDo] · split · rename_i h3 have hYv:∀ r'dw (X[r'*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[r'*n+t]!:= fun r' h1 t ht=>DY.2 r' t h1 (ϟ _) ht exact bQSg_spec R n ow relu X W b _ _ _ ((mJ (aO b 0 0))-1) (dkF (W,b,ow,n)) (wcT8F (W,ow,n)).1 (wcT8F (W,ow,n)).2.1 (wcT8F (W,ow,n)).2.2 (wcBF (b,ow,8*((ow+7)/8))) (aO b 0 0) (Aq (n+1)+1) _ _ _ rfl _ _ _ _ _ _ _ hYv hBdv P.2 Q.2.1 (fun o ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact hem) (bd X (by exact C0 hXs hς) h3) (bd b (by exact C0 hbs hς) heb) (le_refl _) hq hx hz · rw [eDo] · rw [eDo] def c7s(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= let kk:=F.dkGs W b ow n (ST.Prim.Ref.get F.dkS (Void.mk ())).val 0 c7k R n ow relu X W b kk.1 kk.2 def c7(rows inW outW:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= if 1j d.1)] use e;change (kL li (lx a).toBits.toBitVec).isFinite=ἃ;rw[e];simp only[kL,j,ἂ];split<;>(try split)<;>rfl @[noinline]def e9(relu:Ἆ)(a b:Ἃ):Ἃ:= act relu (toWord (Model.add (ofW a) (ofW b))) @[inline]def mR(L w:Ἃ):Ἃ:=if w-0x80000000try rfl all_goals simp only[Ι,Η,AM,Ak,Gw,decide_eq_false_iff_not,←Β,a,b,c,e,kN,nj,Bool.not_eq_eq_eq_not,Bool.not_true,bne_eq_false_iff_eq]at h g;by_cases q:w.toNat/2^31%2=1<;>simp only[q,decide_true,decide_false,Bool.toNat_true,Bool.toNat_false]at g<;>omega @[inline]def add(relu:Ἆ)(a b:Ἃ):Ἃ:= if expOf a !=255&&expOf b !=255 then mR (if relu then 0x7F800001 else 0) (BL a+BL b).toBits else e9 relu a b lemma gW(d:Ἆ)(a b:kF): add d a b=p8 d (kW (pb (lI a) (lI b))):=by rw[add];split;rename_i h;rw[mR_eq];simp only[Η,AM]at h;have g:=bK a h.1;have j:=bK b h.2;have e:=ExecFloat.Binary.toModel_ofFloat32_add_of_isFinite (lx a) (lx b) g.2 j.2;simp only[ExecFloat.Binary.toModel_ofFloat32,en,g.1,j.1]at e;have E:=congrArg kW e;rw[<-en,ja]at E;exact congrArg (act d) E;rfl end NativeAdd @[noinline]def jq(relu:Ἆ)(w s t:Ἃ):Ἃ:=act relu (toWord (Model.fma (ofW w) (ofW s) (ofW t))) lemma eC(x s t:kF)(p:kB x≠255)(m:kB s≠255)(o:kB t≠255) (V:Ἁ) (l:V=sv x*sv s*2^(kG x+kG s)+sv t*2^(kG t+149)) (j:V≠0): kW (pd (lI x) (lI s) (lI t))=md V (-298) ἄ:=by have g:=kV x p;have d:=kV s m;have e:=kV t o;rw[Model.Proof.fma_eq_spec,Model.Spec.fma] simp only[lI,(Model.chooseNaN3_eq_none_iff _ _ _).2 ⟨Χ g,Χ d,Χ e⟩,ϡ g,ϡ d,ϡ e,Bool.or_false,υ,Am,g,d,e];refine(mf _ V _ _ j ?_).symm;rw[Model.addDyadic,pF];erw[pG];rw[lG,lG,lG,l,show (-298:ℤ)=-149-149 from rfl] simp only[Qj,Jh,Uf,Ac (AL (α:=ℚ)),AA,zpow_neg,zpow_ofNat];ring lemma i4_h1(E:Ἀ)(p:1195<=E)(q:E<=1447):-1074<=(E:Ἁ)-1022/\(E:Ἁ)-1022<=971/\-1021<=(E:Ἁ)-1022:=by omega lemma aqk(S:Ἅ)(b:ἆ)(e:S.toBits=b)(c:(3<(b+268435457)&&&536870911&&(((b+268435457)>>>29>>>23)&&&2047)-1195<253&&(b+268435457)>>>29&&&8388607!=0)=true):Dense.F.ak S (Dense.F.eF b-1075)=((b+268435457)>>>29>>>34<<<31)+(((b+268435457)>>>29&&&0x3FFFFFFFF)-0x255000000)/\Dense.F.ak S (Dense.F.eF b-1075)<4294967296/\1195<=(lq (Dense.F.eF b))/\(lq (Dense.F.eF b))<=1447:=by have B:=b.toNat_lt;have:=Z7 b.toNat 9223372036854775808;have m1(x:Ἀ):x&&&536870911=x%2^(29:Ἀ):=ζ x 29;have m2(x:Ἀ):x&&&2047=x%2^(11:Ἀ):=ζ x 11;have m3(x:Ἀ):x&&&8388607=x%2^(23:Ἀ):=ζ x 23;have m4(x:Ἀ):x&&&17179869183=x%2^(34:Ἀ):=ζ x 34;have m5(x:Ἀ):x&&&9223372036854775807=x%2^(63:Ἀ):=ζ x 63;have m6(x:Ἀ):x&&&4503599627370495=x%2^(52:Ἀ):=ζ x 52 unfold Dense.F.ak Dense.F.eF;dsimp only;rw[e];simp only[Vp,UInt64.sub_self,((by decide):((1:ἆ)<<<(0:ἆ))=1),((by decide):decide ((0:ἆ)<=26)=true),Bool.true_and];rw[AD]<;>simp only[Η,AJ,AM,Ak,μ,←ξ,Ζ,η,ν,ψ,Ε,kA,β,ο,kH,nr,m1,m2,m3,m4,m5,m6]at c⊢<;>omega lemma jR(d:Ἆ)(r:Ἃ)(e:kB r≠255):(if r&&&(if d then 0x80000000 else 0)!=0 then 0 else r)=p8 d r:=by cases d<;>simp[p8,reluW,e] @[inline]def eX(L:ἇ)(Y Z:Ἅ)(w:Ἃ)(slow:Unit->Ἃ):Ἃ:= let u:=(Dense.F.xbW w*Y+Z).toBits+268435457 let x:=u>>>29 if 3>>23)&&&2047)-1195<253&&x&&&8388607!=0 then(let r:=N3 ((x>>>34<<<31)+((x&&&0x3FFFFFFFF)-0x255000000));if r&&&L !=0 then 0 else r)else slow () lemma iX(d:Ἆ)(s t w:kF):(if kB w<(if kB s !=255&&kB t !=255 then 255 else 0) then eX (if d then 0x80000000 else 0) (Dense.F.dw s) (Dense.F.dw t*Dense.F.p149) w (λ_=>jq d w s t) else jq d w s t)=p8 d (kW (pd (lI w) (lI s) (lI t))):=by open Dense Dense.F in split<;>split ·rename_i H G;simp only[Η,AM]at H;unfold eX;rw[F.p149,F.xbE];dsimp only;split ·rename_i c;obtain⟨Q1,E,p,q⟩:=aqk _ _ rfl c;rw[←Q1,jR _ _ (Dense.F.kAkF _ _ E)];replace G:=UInt32.ne_of_lt G;have it:=aT t;have W:=bm t;obtain⟨A,M⟩:=dJ w s G H.1;obtain⟨R,N⟩:=cI t H.2;obtain⟨I,O⟩:=iJ 149 (by decide);obtain⟨B,Q⟩:=aE _ _ R I (sv t) ((kG t+149:Ἀ):Ἁ) (by rw[N,O,AA,AF,Ap]) (Ao (bg t) (by decide)) (((by decide):(-1074:Ἁ)<=0).trans (Oj _)) (bL 24 _ 971 (by rw[it];exact (J1 (L1 ((Y4 _ _).trans W.le) 149) 24).trans (by decide)) AP _ (bg t));have o:=jp (dw w*dw s+dw t*F.pw 149) (q.trans_lt (by decide));obtain⟨i1,i2,i3⟩:=i4_h1 _ p q;have j:=jz _ _ A B o _ i1 i2 (fK _ o);obtain⟨-,e⟩:=e8 _ _ A B _ i3 i2 j;have J:rv (dw w*dw s)+rv (dw t*F.pw 149)=((tm w s+sv t*2^(kG t+149):Ἁ):ℝ):=by rw[M,Q,AA,Qj,Jh (sv t),Uf,Int.cast_ofNat] rw[J]at j e;generalize u:(tm w s+sv t*2^(kG t+149):Ἁ)=V at j e;generalize dw w*dw s+dw t*F.pw 149=S at E p q o j e⊢;have K0:=χ (F.eF S.toBits) 1075 (θ.2 (((by decide):1075<=1195).trans p));have K:((lq (F.eF S.toBits-1075)):Ἁ)=((lq (F.eF S.toBits)):Ἁ)-1075:=by rw[K0];exact pO (((by decide):1075<=1195).trans p) obtain⟨r,z⟩:=ce S o (F.eF S.toBits-1075) (K0.trans_lt ((Y4 _ _).trans_lt (q.trans_lt (by decide)))) V (by have h1:=half_le_self (zpow_nonneg (zero_le_two (α:=ℝ)) (((lq (F.eF S.toBits)):Ἁ)-1022-53));have h2:=AG (one_le_two (α:=ℝ)) (by rw[K,sub_sub];rfl:((lq (F.eF S.toBits)):Ἁ)-1022-53=((lq (F.eF S.toBits-1075)):Ἁ)).le;exact e.trans (h1.trans h2)) (j.le.trans (AG one_le_two (U9 (O4.2 q) 1022))) E rw[eC w s t G H.1 H.2 V u.symm r,<-z] ·rfl ·rfl ·exact absurd ‹_<0› (by simp) ·rfl @[specialize]def cE(stop:Ἄ)(f:(i:Ἄ)->(J0 i)<(J0 stop)->Ἃ->Ἃ)(i:Ἄ) (x:Ἂ Ἃ) (h:(J0 stop)<=(O0 x)):Ἂ Ἃ:= if hi:i(J0 i)<(J0 d)->kF->kF)(F:Ἀ->kF->kF) (p:∀i e w,f i e w=F (J0 i) w)(i:Ἄ)(x:Ἂ kF)(h:(J0 d)<=(O0 x)): (O0 (cE d f i x h))=(O0 x)/\ ∀j,(cE d f i x h)[j]?=if (J0 i)<=j/\j<(J0 d)then x[j]?.map (F j)else x[j]?:=by fun_induction cE next i x h e r q=>have o:(J0 i)<(O0 x):=(ε.1 e).trans_le h;obtain⟨g,l⟩:=q;refine⟨by rw[g,BT],λj=>?_⟩;rw[l,Dense.ac e,pP,Array.getElem?_set o];by_cases m:(J0 i)=j;subst m;rw[AC (by (clear * - h e r;omega)),AD rfl,AD (by (clear * - h e r;omega)),lC o,Option.map_some,p];rfl;rw[AC m];clear o g;split_ifs<;>first|rfl|omega next i x h e=>exact⟨ἅ,λj=>by rw[AC (by rw[ε]at e;(clear * - e;omega))]⟩ def bH(relu:Ἆ)(hw c:Ἀ)(s t:Ἂ Ἃ)(ch:Ἀ)(x:Ἂ Ἃ):Ἂ Ἃ:= if chif kB wjq relu w sc tc) else jq relu w sc tc) i0 x h.1 else x) else x termination_by c-ch decreasing_by all_goals omega lemma dn_h1{α:Type}(a b j:Ἀ)(o:Option α)(f h:α->α)(q:a<=j->jf=h)(r:a<=b):(if b<=j then (if a<=j/\jO3.2 u v.2)).trans (AD (r.trans u)).symm) else if v:a<=j then(AC u).trans ((AD ⟨v,J8 u⟩).trans ((congrArg (Option.map · o) (q v (J8 u))).trans (AD v).symm)) else(AC u).trans ((AC λw=>v w.1).trans (AC v).symm) lemma dn(g:Ἆ)(e c:Ἀ)(s t:Ἂ kF)(d:Ἀ)(x:Ἂ kF) (p:(O0 x)=c*e)(r:c*ep8 g (kW (pd (lI w) (lI s[j/e]!) (lI t[j/e]!)))) else x[j]?:=by induction hk:c-d generalizing d x unfold bH;rw[AC (not_lt.2 (P4 hk))];split .rw[l5 (p.trans_le ((ι _ (P4 hk)).trans ‹_›))];rfl rfl;rename_i v;have q:dp8 g (kW (pd (lI w) (lI s[d]!) (lI t[d]!)))) (λ_ _ _=>rfl) (G0 (d*e)) x z;rw[v (d+1) _ (m.trans p) ((Kj c d).trans (congrArg Ki hk)),o,l,h,nO d e];exact dn_h1 _ _ _ _ _ _ (λb c=>by rw[mG b (by rw[Ο];exact c)]) (V1 _ _) def br(relu:Ἆ)(c hw:Ἀ)(x s t:Ἂ Ἃ):Ἂ Ἃ:= if (O0 x)=c*hw/\c*hwNativeAdd.add r w (b.uget i (U1 e hb))) i x h:=by fun_induction qAd r b n hb i x h next i x h hi hs ih=>rw[ih];conv_rhs=>rw[cE,AT hi] next i x h hi=>rw[cE,dite_eq_right hi] def cq(relu:Ἆ)(a b:Ἂ Ἃ):Ἂ Ἃ:= if h:(O0 a)<=(O0 b)/\(O0 a)p8 d (kW (pb (lI x) (lI b[j]!)))) (λi l x=>?_) 0 a _).2 j,addReluSpec,mE];by_cases e:j<(O0 a);rw[AD ⟨(by simp only [Ϧ,zero_le]),by rwa[g]⟩,AT e,lC e];rfl;rw[AC (by rw[g];exact not_and.mpr fun a=>e),dite_eq_right e,l5 (by exact V4 e)];rw[NativeAdd.gW,AB b (J0 i) (by omega)];rfl;rfl end Bn namespace Conv open Dense.F (A8 WcE aO ak ao bW bd cI dJ dL dM da dh dw fzD fzPU g0 gg iC iL jE kAkN kFU kMm kSm pg tf tw ug uk wcAeq wcAeq_ok wcGet3 wcK3eq wcK3eq_ok wcSub xbE xbW zrNC) open Core (bI) open Core Finset open Dense.F (jV uL kr ZPq zPq uU fuS uZ zPs wdU wdUz wdUs) variable(C E V S:ἆ) (y z:kF) (t:Ἆ) (P W:Ἂ ἇ) (c h w k n:Ἀ) (Q:kF->Ἆ) (fa:Ἀ->kF) (bx:ἆ) (s:lR) (J:Ἆ) (I K b:Ἂ kF) (D:Ἆ) (nc Y:Ἀ) (r d:kF) (x:ἆ) (v:Ἁ) (B a:ἆ) (m:Ἀ) (e j:Ἄ) (bw:ἆ) (u:ἇ) {α:Type} lemma mo{a b:Ἀ}(h:arw[h]<;>norm_num lemma j9{n:Ἀ}(h:n<2^(32:Ἀ)):n%2^nx=n:=mo (AN h dj) @[inline]def ok(w:ἇ):Ἆ:= expOf w !=255&&(mW w==0||iW w-E<=C) @[noinline]def eG(a:Ἂ ἇ):ἆ:= a.foldl (λm w=>if mW w !=0&&iW w< m then iW w else m) 255 @[inline]def ct(h l:ἆ):ἆ:=(h<<<25)+l @[inline]def d4(h l:ἆ):ἆ:= ((h+0x8000000000000000)>>>(39:ἆ))-(16777216:ἆ)-(l>>>(63:ἆ))+ (if ct h l>>31!=0 then 0-m else m @[specialize]def lp(H:Ἀ)(f:Ἀ->Ἀ->Ἂ ἇ->Ἂ ἇ): Ἀ->Ἀ->Ἀ->Ἂ ἇ->Ἂ ἇ | 0,_,_,a=>a | n+1,o,y,a=> let a:=f o y a if y+1Ἄ->ἇ)(s:Ἄ)(x:Ἀ):Ἀ->Ἄ->Ἂ ἇ->Ἂ ἇ | 0,_,a=>a | m+1,e,a=>dc f s (x+1) m (e+s) (a.push (f x e)) @[noinline]def eT(O H W:Ἀ)(f:Ἀ->Ἀ->Ἀ->ἇ):Ἂ ἇ:= if 0dc (λx _=>f o y x) 0 0 W 0) (O*H) 0 0 (AS (O*(H*W))) else#[] @[inline]def wv1(yb xb c dy dx:Nat):Word:= if yb+dya | n+1,c,dy,dx,a => if dx+1intro c dy dx a _ _ _ hp;exact⟨rfl,hp⟩ |succ n ih=> intro c dy dx a hy hx hi hp have hv:wv1 s I (y*s.stride) (x*s.stride) c dy dx=windowAt s I y x (cb*(s.kh*s.kw)+a.size):=by rw[←hi];exact wndA s I y x c dy dx hy hx have P1:(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size=a.size+1:=by simp have P2:∀j<(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size, (a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx))[j]! =windowAt s I y x (cb*(s.kh*s.kw)+j):=by intro j hj;rw[P1]at hj;rw[wP _ _ j hj];split ·exact hp j ‹_› ·rw[show j=a.size by omega];exact hv simp only[wnd] split ·rename_i h1 have:=ih c dy (dx+1) _ hy h1 (by rw[P1];omega) P2 rw[P1]at this;exact⟨by rw[this.1];omega,fun j hj=>this.2 j (by omega)⟩ ·split ·rename_i h1 h2 have e:(dy+1)*s.kw=dy*s.kw+s.kw:=by rw[Ϡ,n4] have:=ih c (dy+1) 0 _ h2 (by omega) (by rw[P1,e];omega) P2 rw[P1]at this;exact⟨by rw[this.1];omega,fun j hj=>this.2 j (by omega)⟩ ·rename_i h1 h2 have e:s.kh*s.kw=dy*s.kw+s.kw:=by rw[show s.kh=dy+1 by omega,Ϡ,n4] have e2:(c+1)*(s.kh*s.kw)=c*(s.kh*s.kw)+s.kh*s.kw:=by rw[Ϡ,n4] have:=ih (c+1) 0 0 _ (by omega) (by omega) (by rw[P1,e2];omega) P2 rw[P1]at this;exact⟨by rw[this.1];omega,fun j hj=>this.2 j (by omega)⟩ @[noinline]def aB(kk k cb o y x:Nat):Word:= if 0if iif iif iif iif iif iabsurd hj (by simp)) rw[g3];exact W.2 i (by simpa using h) ·rfl ·rfl theorem zrDot2(n:ℕ)(D Wf:ℕ→Ἃ)(hz:∀ssimp only[tm,h,show sv (0:Ἃ)=0 by decide,show sv (0x80000000:Ἃ)=0 by decide,mul_zero,zero_mul] ·rw[show k=n by omega,hWn];simp only[tm,show sv (0:Ἃ)=0 by decide,mul_zero,zero_mul] rw[bI (n+1) D Wf g,hS,zrNC _ _ n 0 (by rw[Κ,ab (n+1) D n (by omega),ab (n+1) Wf n (by omega),hDn,hWn];decide),Gm];decide @[inline]def wA1(I:Ἂ Ἃ)(h w y x t:Ἀ):Ἃ:=if y ≥ h∨x ≥ w then 0 else I[(t*h+y)*w+x]! theorem wA1_eq(hk:s.kh=1)(hw:s.kw=1)(hs:s.stride=1)(hp:s.pad=0)(y x t:Ἀ):windowAt s I y x t=wA1 I s.h s.w y x t:=by unfold windowAt wA1;simp only[hk,hw,hs,hp,ϻ,W6,Jw,ϑ,pQ,C5,false_or] def zpW1(h w k cb o y x:Ἀ):Ἀ→Ἆ |0=>true |i+1=>(K[o*k+i]! == 0||K[o*k+i]! == 0x80000000||wA1 I h w y x (cb+i)==0||wA1 I h w y x (cb+i)==0x80000000)&&zpW1 h w k cb o y x i theorem zpW1_ok(h w k cb o y x:Ἀ):∀n,zpW1 I K h w k cb o y x n=true→∀tabsurd ht (C5 _) |n+1,hz,t,ht=>by simp only[zpW1,Η,nM,AQ]at hz by_cases e:t=n ·subst e;have h1:=hz.1;tauto ·exact zpW1_ok h w k cb o y x n hz.2 t (by omega) theorem aBz2(kk k cb o y x:Ἀ)(hb:b[o]! =0)(hz:∀tby simp only[AD ht];exact hz t ht) (λt ht=>by simp only[AD ht];unfold windowAt;dsimp only;split;exact (by decide);exact hi _) (λt ht=>by simp only[AD ht];exact hw _) (by simp) (by simp[hb]) def dS:Ἂ Ἃ:= if D then depthwiseSpec s J I K b else conv2dSpec s J I K b @[noinline]def sk:ἇ:= if u<0x80000000 then u+0x80000000 else if u==0x80000000 then 0x80000000 else 0xFFFFFFFF-u @[noinline]def mx:Ἃ:= if expOf y≠255/\expOf z≠255/\(sk yἋ->α)(I:Ἂ Ἃ)(w k:Ἀ):Ἀ->Ἀ->Ἀ->α->α | 0,_,_,acc=>acc | n+1,i,dx,acc=> let acc:=g acc I[i]! if dx+1ἆ):=wl λ(a:ἆ) x=>a+f x @[reducible]def wa:=wl λ(b:Ἆ) x=>b&&Q x @[noinline]def cU(ch y x:Ἀ):Ἃ:= dotOf (k*k) (poolAt h w k I ch y x) λ_=>oneW @[inline]def wo(A H:ἆ)(g:Unit->Ἆ)(fb:Unit->Ἃ)(d:Ἃ):Ἃ:= if A=0/\H=0 then(if g ()then 0x80000000 else 0) else let r:=Dense.b9 (d4 H A) (ct H A) (B+149) eX (if r<4294967296 then (N3 r)else fb ()) d @[inline]def aq(w:Ἃ):ἆ:=if mW w !=0 then iW w else 255 @[inline]def cV(x0 x1 x2 x3:Ἃ):Ἆ:=Q x0&&Q x1&&Q x2&&Q x3 @[inline]def eF(u:Ἃ):ἆ:=(H9 ((u>>>23)&&&255)) def df(I:Ἂ Ἃ)(B:ἆ)(stop:Ἄ)(hs:(J0 stop)<=(O0 I))(e:Ἄ)(acc:ἆ):ἆ:= if h:eomega lemma jC(h:((lq x):Ἁ)≡v [ZMOD2^(64:Ἀ)])(d:-2^(63:Ἀ)<=v) (e:v<2^(63:Ἀ)):ae x=v:=by rw[eQ];have:=x.toNat_lt;rw[pe]at h;omega noncomputable def Z:ZMod (2^(64:Ἀ)):=(lq x) lemma iB:((lq x):Ἁ)≡v [ZMOD2^(64:Ἀ)]↔Z x=v:=by rw[Z] rw[show(((lq x):ℕ):ZMod (2^(64:Ἀ)))=((((lq x):ℤ)):ZMod (2^(64:Ἀ))) by push_cast;rfl, ZMod.intCast_eq_intCast_iff] rfl lemma sZ(h:Z x=v)(d:-2^(63:Ἀ)<=v)(e:v<2^(63:Ἀ)): ae x=v:=jC x v ((iB x v).mpr h) d e lemma fI(b:ἆ):Z (a+b)=Z a+Z b:=by unfold Z;rw[η,BN];push_cast;ring lemma iX(b:ἆ):Z (a-b)=Z a-Z b:=by have d:=b.toNat_lt;unfold Z;rw[Ζ,BN,K5,pO (by exact X5 d)];rw[show((2^(64:Ἀ):Ἀ):ZMod (2^(64:Ἀ)))=0 from ZMod.natCast_self _];ring lemma bF:Z 0=0:=by simp[Z] lemma cB{B:ἆ}(h:B<=255):(lq B)<=255:=by simpa using θ.mp h noncomputable def bU(e:Ἀ)(w:ἇ):Ἁ:=sv w*2^(idxOf w-e) lemma cz(h:kM u=0):sv u=0:=by rw[sv];simp[h] lemma kd(h:kM u=0):mW u=0:= ξ.mp (by rw[an,h];rfl) lemma dI_h1(w:ἇ)(m:(lq E)<=255)(l:(lq C)<=62)(e:iW w-E<=C):(lq E)<=kG w/\kG w<=(lq E)+(lq C)/\(lq (iW w-E))=kG w-(lq E):=by have g:=θ.1 e;have q:=η (iW w-E) E;rw[Vp,am,γ ((M3 (g.trans l) m).trans_lt (by decide))]at q rw[q];exact⟨N2 _ _,(Τ _ _).trans_le (J1 g _),(BK _ _).symm⟩ lemma dI(w:ἇ)(m:(lq E)<=255)(l:(lq C)<=62)(h:ok C E w=ἃ): kB w≠255/\(kM w=0\/((lq E)<=kG w/\kG w<=(lq E)+(lq C)/\ (lq (iW w-E))=kG w-(lq E))):= ((Η _ _).mp h).imp AM.1 λb=>((nM _ _).mp b).imp (λd=>(an w).symm.trans (congrArg _ (AQ.1 d))) (λe=>dI_h1 C E w m l (As.1 e)) lemma pw(v s c:Ἀ)(e:v<2^(24:Ἀ))(d:s<=c):v*2^s<2^(24+c):=by rw[AF];exact ly e (Θ (by norm_num) d) (by positivity) lemma fw(e:ἆ)(w:ἇ)(c:Ἀ)(p:c<=39) (h:kM w=0\/((lq e)<=kG w/\kG w<=(lq e)+c/\ (lq (iW w-e))=kG w-(lq e))): (lq (mW w<<<(iW w-e)))=kM w*2^(kG w-(lq e))/\ kM w*2^(kG w-(lq e))<2^(24+c):=by have j:=lB w;rcases h with d|⟨m,o,l⟩;rw[kd w d,d];simp only [UInt64.zero_shiftLeft,ϋ,zero_mul,Order.lt_two_iff,zero_le,pow_pos,and_self];have g:=pw _ _ c j ((by exact Gi.mpr o):kG w-(lq e)<=c);refine⟨?_,g⟩;rw[ψ,an,l,ο,γ (a:=kG w-(lq e)) (by (clear * - p m o;omega))];exact γ (AN g (Θ (by norm_num) (by (clear * - p;omega)))) lemma jK(b:ἆ):((lq (a+b)):Ἁ)≡((lq a):Ἁ)+(lq b) [ZMOD2^(64:Ἀ)]:=by rw[pe];rw[η];omega lemma g5(b:ἆ):((lq (a-b)):Ἁ)≡((lq a):Ἁ)-(lq b) [ZMOD2^(64:Ἀ)]:=by have:=b.toNat_lt;rw[pe];rw[Ζ];omega lemma ji: ((lq ((a+(0x8000000000000000:ἆ))>>>(39:ἆ))):Ἁ)= ((lq a)/2^(39:Ἀ):Ἀ)+(if (lq a)<2^(63:Ἀ) then 2^(24:Ἀ) else-2^(24:Ἀ)):=by have d:=a.toNat_lt;rw[ν,η];simp only[β,mY,nr,kH];split<;>omega theorem eU_h2(D E:ℕ)(l:E<2^(64:ℕ)):(if (D%2^(39:ℕ)*2^(25:ℕ)+E)%2^(64:ℕ)decide have hA:((D/2^(39:ℕ):ℕ):ℤ)<2^(25:ℕ):=(Zp.2 (Ϟ (j.trans_eq (m7 2 39 25)))).trans_eq (Ou 2 25) have hH:((E/2^(63:ℕ):ℕ):ℤ)<=1:=O4.2 (Ov.1 (Ϟ (l.trans_eq (Hy 2 63)))) have hI:-2^(25:ℕ)<=(if D<2^(63:ℕ) then (0:ℤ) else-2^(25:ℕ))∧(if D<2^(63:ℕ) then (0:ℤ) else-2^(25:ℕ))<=0:=by split<;>decide exact⟨Int.le_trans (by decide) (Wy (Int.sub_le_sub (Wy (G6 _) hI.1) hH) p.1),Uj (Xp (Int.sub_lt_sub_of_lt_of_le (Xp hA hI.2) (G6 _)) p.2) (by decide)⟩ lemma eU(d e:ἆ): aw (d4 d e) (ct d e)=ae d*2^(25:Ἀ)+ae e:=by have j:=d.toNat_lt;have l:=e.toNat_lt;have o:(lq (ct d e))=(((lq d)%2^(39:Ἀ))*2^(25:Ἀ)+(lq e))%2^(64:Ἀ):=by rw[ct,η,ψ];simp only[ο,mY,nr,kH];exact congrArg (·%18446744073709551616) (congrArg (·+(lq e)) (Ha _ _ 549755813888)) have k:=eU_h3 _ _ (ct d erfl) k.1 k.2) rfl (by simp only[μ,o];exact eU_h2 _ _ l) (eQ d) (eQ e) (congrArg Hg o) lemma fB(a b:ἇ)(d e:Ἀ)(g:kM a=0\/d<=kG a)(j:kM b=0\/e<=kG b):tm a b=bU d a*bU e b*2^(d+e):=by unfold tm bU;rcases g with g | g .simp[cz a g] rcases j with j | j .simp[cz b j] rw[((by omega):kG a+kG b=(kG a-d)+(kG b-e)+(d+e)),AF,AF];ring lemma cJ(f:Ἀ->Ἁ)(M:Ἁ)(h:∀th t (mr d)).trans ((by simp only [sum_const,card_range,Int.nsmul_eq_mul,Std.le_refl]))) abbrev ag(g:Ἀ->ἇ):Ἂ ἇ:=Aj (n:=m) λq=>g (C7 q) lemma ec(g:Ἀ->ἇ):(ag m g).push (g m)=ag (m+1) g:=by simp[ag];rw[Array.ofFn_succ (f:=λq:Fin (m+1)=>g (C7 q))];rfl lemma cf(o y x H W:Ἀ)(g:yἈ->Ἂ ἇ->Ἂ ἇ)(S:Ἀ->Ἂ ἇ->Prop) (j:∀o y a,yS (o*H+y) a->S (o*H+y+1) (f o y a)): ∀n o y a,yS (o*H+y) a->S (o*H+y+n) (lp H f n o y a):=by intro n;induction n<;>intro o y a l h;exact h;rename_i n e;have d:=j o y a l h;simp[lp];split_ifs with g;exact((by ring):o*H+y+(n+1)=o*H+(y+1)+n)▸e _ _ _ g d;obtain rfl:H=y+1:=(by (clear * - l g;omega));exact((by ring):o*(y+1)+y+(n+1)=(o+1)*(y+1)+0+n)▸e _ _ _ (by exact Qk y) (((by ring):(o+1)*(y+1)+0=o*(y+1)+y+1)▸d) lemma kb(H W n c:Ἀ)(d:Ἀ->Ἀ->Ἂ ἇ->Ἂ ἇ)(F:Ἀ->Ἀ->Ἀ->ἇ)(r:0o*H+y(∀jd o y (ag M g)=ag (M+W) g): lp H d n 0 0 (lQ c)=ag (n*W) λq=>F (q/(H*W)) (q/W%H) (q%W):=by simpa[A7,ϳ,Κ,Ϗ W n]using iu H d (λk a=>k<=n->a=ag (W*k) λq=>F (q/(H*W)) (q/W%H) (q%W)) (λo y a e v A=>v (by exact X5 A)▸u _ _ _ _ e (by exact D7 A) λj x=>by obtain⟨l,m,p⟩:=cf o y j H W e x;simp[((by ring):W*(o*H+y)+j=(o*H+y)*W+j),l,m,p]) n 0 0 _ r λ_=>ἅ lemma iK(f:Ἀ->Ἄ->ἇ)(g:Ἀ->ἇ)(s:Ἄ):∀m x e M, (∀j< m,g (M+j)=f (x+j) (e+s*(G0 j)))->dc f s x m e (ag M g)=ag (M+m) g:=by intro m;induction m<;>intro x e M l;rfl;rename_i o;have d:=l 0 (by (clear * -;omega));rw[ϑ,ϑ,show(G0 (0:Ἀ))=0 from ἅ,USize.mul_zero,Av]at d;rw[dc,<-d,ec,o _ _ _ λj p=>by rw[((by exact Kg M j):M+1+j=M+(j+1)),l _ (by exact B3 p 1),((by exact Eq.symm (Kg x j)):x+(j+1)=x+1+j),show(G0 (j+1))=(G0 j)+1 from mC j 1,USize.mul_add,USize.mul_one,Kd,Pk (s*_)]];congr 1;(clear * -;omega) lemma d8(H W n c:Ἀ)(s:Ἄ)(E:Ἀ->Ἀ->Ἄ)(F:Ἀ->Ἀ->Ἀ->Ἄ->ἇ)(d:0dc (F o y) s 0 W (E o y)) n 0 0 (lQ c)= ag (n*W) λq=>F (q/(H*W)) (q/W%H) (q%W) (E (q/(H*W)) (q/W%H)+s*(G0 (q%W))):=kb H W n c _ (λo y x=>F o y x (E o y+s*(G0 x))) d λ_ _ _ _ _ _ e=>iK _ _ _ _ _ _ _ λj g=>by rw[e j g,Κ] lemma iO(O H W:Ἀ)(f:Ἀ->Ἀ->Ἀ->ἇ): eT O H W f=ag (O*(H*W)) λq=>f (q/(H*W)) (q/W%H) (q%W):=by rw[eT];split_ifs with h .rw[d8 _ _ _ _ 0 (λ_ _=>0) (λo y x _=>f o y x) h,Ϛ] .simp[ag,((by exact Nat.eq_zero_of_not_pos h):H=0)] lemma jl(g:α->kF->α)(I:Ἂ kF)(w k U:Ἀ): ∀n j e d,ewl g I w k n (U+j*w+e) e d= (pV (j*k+e) n).foldl (λd t=>g d I[U+t/k*w+t%k]!) d:=by intro n;induction n<;>intro j e d l;rfl;rename_i m;rw[BS,Ϸ,wl,(by rw[Τ,Ρ _ _ (by exact F6 l),ώ l,Κ]:(j*k+e)/k=j),(by rw[Τ,Μ,Conv.mo l]:(j*k+e)%k=e)];split_ifs with h;exact m j (e+1) _ h;obtain rfl:k=e+1:=(by (clear * - l h;omega));rw[(by rw[nO];(clear * -;omega):U+j*w+e+w+1-(e+1)=U+(j+1)*w+0),m (j+1) 0 _ (by exact Qk e)];congr 2;ring lemma gc(g:α->kF->α)(I:Ἂ kF)(w k U n:Ἀ)(d:α)(e:0g d I[U+t/k*w+t%k]!) d:=by have:=jl g I w k U n 0 0 d e;simp[<-List.range_eq_range']at this;exact this lemma aa(h:n<2^(32:Ἀ)):(J0 (G0 n))=n:=j9 h lemma fJ:Z x=(((lq x):Ἁ):ZMod (2^(64:Ἀ))):=by rw[Z];norm_cast lemma gS:Z x=((ae x:Ἁ):ZMod (2^(64:Ἀ))):= (iB x _).mp (by rw[eQ];rw[pe];omega) lemma jj(m:ἆ)(h:(lq m)<2^(62:Ἀ)): ae (sg u m)=if k9 u then-((lq m):Ἁ)else (lq m):=by unfold sg;rw[fy];cases k9 u<;>simp only[fT,ἁ,ἂ] .exact sZ _ _ (fJ m) (by exact Qi (2^63) m.toNat) (by omega) .exact sZ _ _ (by rw[iX,bF,fJ];push_cast;ring) (by omega) (by omega) lemma gC:ok C E 0=ἃ:=ἅ lemma gi(a:Ἂ ἇ)(p:ἇ->Ἆ)(h:a.all p=ἃ)(e:p 0=ἃ)(q:Ἀ): p a[q]! =ἃ:=by by_cases d:q<(O0 a) .rw[AB a q d];exact np.mp h q d .rw[An a q d];exact e noncomputable def aI(s:ConvShape)(I:Ἂ Ἃ)(c y x:Ἀ):Ἃ:= if cα)(V Y:α)(hB:Bc1 ⟨W5 h.1 c2,h.2⟩).symm) lemma fcUs(I:Ἂ kF)(p d n:Ἄ)(hs:(O0 I)<2^(32:Ἀ))(hp:(J0 p)+(J0 n)<=(O0 I)):∀m (j:Ἄ)(Y:ἀ)(hd:(J0 d)+(J0 n)<=(kS Y)/\(kS Y)<2^(32:Ἀ)),(J0 n)-(J0 j)=m-> (kS (fcU I p d n hs hp j Y hd))=(kS Y)/\∀q<(kS Y),(fcU I p d n hs hp j Y hd).data[q]! = if (J0 d)+(J0 j)<=q/\q<(J0 d)+(J0 n) then dw I[(J0 p)+(q-(J0 d))]! else Y.data[q]!:=by intro m;induction m with | zero=> intro j Y hd e;have k:=P4 e;rw[fcU,dite_eq_right λh=>O3.2 k (ε.1 h)];exact⟨ἅ,λq _=>by rw[AC λh=>AX _ (h.2.trans_le ((J1 k _).trans h.1))]⟩ | succ m ih=> intro j Y hd e;have h:j?_⟩;rw[v q (hq.trans_eq sz.symm),Dense.ac h,Dense.F.fuS _ _ _ _ _ hq,dj];exact fcUs_h2 _ _ _ _ (λq=>dw I[(J0 p)+(q-(J0 d))]!) _ _ hj (by rw[xbE,kr,Dense.aj (((O1 hj _).trans_le hp).trans (hs.trans_le ς)),ϱ]) lemma xbG{I:Ἂ kF}{Y:ἀ}{p d w:Ἄ}(hs:I.size<2^32):(Y.size<=4294967295∧w<=I.usize∧p<=I.usize-w∧w<=Y.usize∧d<=Y.usize-w)↔p.toNat+w.toNat<=I.size∧d.toNat+w.toNat<=Y.size∧Y.size<2^32:=by have u:=ς;have hI:I.usize.toNat=I.size:=Dense.aa (by omega);constructor ·rintro⟨a,b,c,e,f⟩;have hY:Y.usize.toNat=Y.size:=Dense.aa (by omega);simp only[V6,L7 _ _ b,L7 _ _ e]at *;omega ·rintro⟨a,b,c⟩;have hY:Y.usize.toNat=Y.size:=Dense.aa (by omega);have e:w<=I.usize:=V6.2 (by omega);have f:w<=Y.usize:=V6.2 (by omega);simp only[V6,L7 _ _ e,L7 _ _ f];omega def fRU(I:Ἂ Ἃ)(hs:(O0 I)<2^(32:Ἀ))(w V U h n:Ἄ)(r p d y:Ἄ)(Y:ἀ):ἀ:= if hr:r(J0 r)<=(J0 n)->(J0 y)=(J0 r)%s.h->(J0 p)=(J0 r)*s.w->(J0 d)=((J0 r)/s.h*(s.h+2)+(J0 r)%s.h+1)*(s.w+2)+1-> (s.cin*(s.h+2)+3)*(s.w+2)<=(kS Y)->(kS Y)<2^(32:Ἀ)-> (∀q<(kS Y),Y.data[q]! =dw (if q/((s.h+2)*(s.w+2))*s.h+(q/(s.w+2)%(s.h+2)-1)<(J0 r) then aI s I (q/((s.h+2)*(s.w+2))) (q/(s.w+2)%(s.h+2)) (q%(s.w+2)) else 0))-> (kS (fRU I hs w V U h n r p d y Y))=(kS Y)/\∀q<(kS Y),(fRU I hs w V U h n r p d y Y).data[q]! =dw (aI s I (q/((s.h+2)*(s.w+2))) (q/(s.w+2)%(s.h+2)) (q%(s.w+2))):=by intro m;induction m with | zero=> intro r p d y Y e a b c f N O J;have E:=V3.1 e;have hr:¬rAX _ (U1 (ε.1 h) E);rw[fRU,dite_eq_right hr];refine⟨ἅ,λq hq=>?_⟩;rw[J q hq];refine congrArg dw ?_;split;rfl;rename_i k;rw[aI,AC];rintro⟨u,v,x,-⟩;have:(q/((s.h+2)*(s.w+2))+1)*s.h<=s.cin*s.h:=ι _ u;rw[Ϡ,n4]at this;exact k (U1 (O1 (U1 (Vu v (by decide)) x) _) (J2 this (hn▸E))) | succ m ih=> intro r p d y Y e a b c f N O J;have hr:rk (D6.1 (y1.trans (j.trans hh.symm))) obtain⟨q1,q2⟩:=(Xh h0).2 (⟨by rw[lO,Τ ((J0 r)%s.h),rq],W5 ym (b▸this)⟩:(J0 r)%s.h+1+s.h*((J0 r)/s.h)=(J0 r)+1/\(J0 r)%s.h+1v2 q (hq.trans_eq u.symm)⟩ lemma iQ(A:Ἂ Ἀ)(u:Ἄ)(h:(J0 u)<(O0 A)):A.uget u h=A[(J0 u)]!:=by simp[Hd,AB A (J0 u) h] lemma cj{i:Ἄ}{e M S:Ἀ}(d:S<2^(32:Ἀ))(j:(J0 i)+M+8<=S)(g:e<=M): (J0 (i+(G0 e)))=(J0 i)+e:=by have:=ς;rw[Dense.aj (by rw[Dense.aa (by omega)];omega),Dense.aa (by omega)] lemma j2(A B:A8)(h:∀r<8,A.f r=B.f r):A=B:=by cases A;cases B;rw[A8.mk.injEq];exact⟨h 0 (by exact Qk 7),h 1 (by exact Nat.one_lt_succ_succ 6),h 2 (by exact N1 rfl),h 3 (by exact N1 rfl),h 4 (by exact N1 rfl),h 5 (by exact N1 rfl),h 6 (by exact N1 rfl),h 7 (by exact Xa 7)⟩ lemma kq(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ)(h:tἍ)(n t:Ἀ)(a:Ἅ)(h:¬tomega lemma jc(d t:Ἀ):px d t<=2:=by rw[px];split<;>omega lemma jb(d t e:Ἀ)(g:d=9\/d=1)(j:tsimp<;>omega abbrev fP(s:ConvShape)(kk:Ἀ):Prop:= s.kh=3/\s.kw=3/\s.stride=1/\s.pad=1/\kk=9\/s.kh=1/\s.kw=1/\s.stride=1/\s.pad=0/\kk=1 structure CD where s:ConvShape I:Ἂ Ἃ K:Ἂ Ἃ b:Ἂ Ἃ X:ἀ T:Ἂ Ἀ D:Ἆ J:Ἆ k:Ἀ M:Ἀ L:Ἀ hh:ἆ Y:Ἀ kk:Ἀ hX:(kS X)<2^32 lo:ἆ sp:ἆ hz:∀E:ἆ,E-lohh+1075-E<=21/\E-1195<253 z9:Ἆ hz9:z9=(s.kh==3&&s.kw==3&&s.stride==1&&s.pad==1&&kk==9) P9:Ἀ hP9:P9=(s.h+2)*(s.w+2) V9:Ἄ hV9:V9=O2 (s.w+2) k9:Ἀ hk9:k9=k/9 lemma cZ(n:Ἀ):(kS (kJ n))=0:=by simp[kJ,kS] def fQ:Bool:=System.Platform.target.startsWith "aarch64" structure CC(M:Ἀ)where Tz:Ἂ Ἀ Wz:ἀ wo:Ἀ n:Ἀ ni:Ἆ h1:n<=(O0 Tz) h2:wo+n<=(kS Wz) h3:wo+n<2^32 h4:∀td.X.get! (q+d.T[t]!)*dw d.K[ko+t]!) (λ_=>dw oneW*dw d.b[o]!) λ_=>act d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x) @[inline]def czZ(a:Ἅ):Ἆ:=a == -a theorem czK(n:Nat)(h:n<2^32):(O2 n).toNat=n:=W3 (U1 h ς) theorem czK1:(1:Ἄ).toNat=1:=czK 1 (by decide) theorem czK2:(2:Ἄ).toNat=2:=czK 2 (by decide) theorem czU(a b:Ἄ)(h:a.toNat+b.toNat<2^32):(a+b).toNat=a.toNat+b.toNat:=by rw[lJ,γ (U1 h ς)] @[inline]def cz3(X:ἀ)(p:Ἄ)(h:p.toNat+2simpa using e.1.1 | 1,_=>exact e.1.2 | 2,_=>exact e.2 @[inline]def cz9(X:ἀ)(b V:Ἄ)(h:b.toNat+V.toNat+V.toNat+2rw[q] ·simpa using cz3_ok X b _ s e.1.1 (j%3) (by omega) ·have k:=cz3_ok X (b+V) _ s e.1.2 (j%3) (by omega);rw[u]at k;simpa using k ·have k:=cz3_ok X (b+V+V) _ s e.2 (j%3) (by omega);rw[w]at k;rw[show b.toNat+2*V.toNat+j%3=b.toNat+V.toNat+V.toNat+j%3 by omega];exact k def czX9(X:ἀ)(P:Nat)(V:Ἄ)(s:X.size<2^32):Nat→Nat→Ἆ | _,0=>true | b,c+1=>(if h:b+V.toNat+V.toNat+2absurd hi (C5 _) | c+1,b,e,i,hi=>by simp only[czX9,Η]at e rcases i with _|i ·split at e ·rename_i h;have k:=cz9_ok X _ V _ s e.1;rw[czK b (by omega)]at k;intro j hj;simpa using k j hj ·exact absurd e.1 (by decide) ·intro j hj;rw[show b+(i+1)*P+j/3*V.toNat+j%3=b+P+i*P+j/3*V.toNat+j%3 by rw[Ο];omega];exact czX9_ok X P V s c (b+P) e.2 i (by omega) j hj theorem cz3_of(X:ἀ)(p:Ἄ)(h:p.toNat+2by have k:=e j (by omega);rw[show j/3=0 by omega,show j%3=j by omega]at k;simpa using k),cz3_of X (b+V) _ s (fun j hj=>by have k:=e (3+j) (by omega);rw[show (3+j)/3=1 by omega,show (3+j)%3=j by omega]at k;rw[u];simpa using k)⟩,cz3_of X (b+V+V) _ s (fun j hj=>by have k:=e (6+j) (by omega);rw[show (6+j)/3=2 by omega,show (6+j)%3=j by omega]at k;rw[w];rw[show b.toNat+V.toNat+V.toNat+j=b.toNat+2*V.toNat+j by omega];exact k)⟩ theorem czK3:(3:Ἄ).toNat=3:=czK 3 (by decide) theorem czK6:(6:Ἄ).toNat=6:=czK 6 (by decide) theorem czK7:(7:Ἄ).toNat=7:=czK 7 (by decide) @[inline]def c10(X:ἀ)(p:Ἄ)(h:p.toNat+9subst q ·simpa using c10_ok X b _ s e.1.1 j hj ·have k:=c10_ok X (b+V) _ s e.1.2 j hj;rw[u]at k;simpa using k ·have k:=c10_ok X (b+V+V) _ s e.2 j hj;rw[w]at k;rw[show b.toNat+2*V.toNat+j=b.toNat+V.toNat+V.toNat+j by omega];exact k def czRX(X:ἀ)(P:Nat)(V:Ἄ)(s:X.size<2^32):Nat→Nat→Ἆ | _,0=>true | b,c+1=>(if h:b+V.toNat+V.toNat+9by simp[czX9] | c+1,b,e,r,hr=>by simp only[czRX,Η]at e obtain⟨e1,e2⟩:=e split at e1 ·rename_i h have k:=cr30_ok X _ V _ s e1;rw[czK b (by omega)]at k simp only[czX9,Η] refine⟨?_,by rw[show b+r+P=b+P+r by omega];exact czRX_X9 X P V s c (b+P) e2 r hr⟩ rw[AT (by omega)] apply cz9_of;rw[czK (b+r) (by omega)] intro j hj;have:=k (j/3) (by omega) (r+j%3) (by omega);rw[show b+j/3*V.toNat+(r+j%3)=b+r+j/3*V.toNat+j%3 by omega]at this;exact this ·exact absurd e1 (by decide) open Float.Model.UnpackedFloat in theorem czSg(u:Float.Model.UnpackedFloat)(hn:u≠.notANumber)(hz:∀s,u≠.zero s):unpackSign (pack .binary64 u)≠unpackSign (pack .binary64 u.neg):=by cases u with | notANumber=>exact absurd rfl hn | zero s=>exact absurd rfl (hz s) | infinity s=>simp only[neg,pack,packedInfinity,unpackSign_packComponents];cases s<;>decide | finite s m e hm=>simp only[neg,pack];split_ifs<;>simp only[packedInfinity,unpackSign_packComponents]<;>cases s<;>decide theorem czNZ(a:Ἅ)(h:czZ a=true):∃s,a.toModel.unpack=.zero s:=by have hb:a.toModel.unpack.beq (-a).toModel.unpack=true:=h rw[Xi]at hb by_contra hz;simp only[not_exists]at hz obtain⟨h1,-,e|⟨e,_⟩|⟨e,_⟩⟩:=hb ·have E:J5 a.toModel.unpack=J5 a.toModel.unpack.neg:=by (conv_lhs=>rw[e,fzPU]);rfl have E4:=congrArg (fun m:Float.Model=>Uk (spec:=.binary64) m.toBits.toBitVec) E simp only[J5,UInt64.toBitVec_ofBitVec]at E4;exact czSg _ h1 hz E4 ·exact hz _ e ·exact hz _ e theorem czW(w:ἇ)(h:sv w=0):w=0∨w=0x80000000:=by have m0:kM w=0:=by unfold sv at h;split at h<;>omega unfold kM at m0;split at m0 ·rename_i he;have q:=congrArg mJ he simp only[kB,lK,Ξ,Υ,kN,kH,β]at q m0 rw[show (255:Nat)=2^8-1 by norm_num,ζ]at q;rw[show (8388607:Nat)=2^23-1 by norm_num,ζ]at m0 have l:=w.toNat_lt;have:w.toNat=0∨w.toNat=2^31:=by omega rcases this with h0|h0;exact .inl (Β.mp (by simpa using h0));exact .inr (Β.mp (by simpa using h0)) ·omega theorem czDZ(w:ἇ)(hw:kB w≠255)(h:czZ (dw w)=true):w=0∨w=0x80000000:=by obtain⟨s,hs⟩:=czNZ _ h;have r:=(cI w hw).2;rw[iL,hs,Kb s]at r exact czW w (by rcases mul_eq_zero.mp r.symm with h1|h1;exact_mod_cast h1;exact absurd h1 (by positivity)) theorem czWF(s:ConvShape)(I:Ἂ ἇ)(hx:∀q:Nat,kB I[q]!≠255)(y x t:Nat):kB (windowAt s I y x t)≠255:=by unfold windowAt;dsimp only;split;exact (by decide);exact hx _ @[inline]def zpC(d:@&CD)(o y x:Ἀ):Ἆ:= if d.z9 then czX9 d.X d.P9 d.V9 d.hX ((if d.D then o else 0)*d.P9+y*(d.s.w+2)+x) d.k9 else if d.s.kh==1&&d.s.kw==1&&d.s.stride==1&&d.s.pad==0&&d.kk==1 then zpW1 d.I d.K d.s.h d.s.w d.k (if d.D then o else 0) o y x d.k else false theorem zpC_ok(d:CD)(v:Nat)(a2:d.k=v*d.kk)(aH:(d.s.cin*(d.s.h+2)+3)*(d.s.w+2)<=(kS d.X))(hx:∀q:Nat,kB d.I[q]!≠255)(o y x:Nat) (xw:∀tomega have hwP:d.s.w+2≤d.P9:=by rw[d.hP9];exact lZ _ (by omega) have hV:d.V9.toNat=d.s.w+2:=by rw[d.hV9];exact czK _ (by omega) have e1:(O.toUSize*d.P9.toUSize).toNat=O*d.P9:=by rw[kMm _ _ (by rw[czK _ (by omega),czK _ (by omega)];exact AO (ϧ (by omega:O≤16383) (by omega:d.P9≤16383)) (by norm_num)),czK _ (by omega),czK _ (by omega)] have e2:(y.toUSize*d.V9).toNat=y*(d.s.w+2):=by rw[kMm _ _ (by rw[czK _ (by omega),hV];exact AO (ϧ (by omega:y≤16383) (by omega:d.s.w+2≤16383)) (by norm_num)),czK _ (by omega),hV] have e3:(O.toUSize*d.P9.toUSize+y.toUSize*d.V9).toNat=O*d.P9+y*(d.s.w+2):=by rw[kSm _ _ (by rw[e1,e2];have:=ϧ (by omega:O≤16383) (by omega:d.P9≤16383);have:=ϧ (by omega:y≤16383) (by omega:d.s.w+2≤16383);omega),e1,e2] have e4:(O.toUSize*d.P9.toUSize+y.toUSize*d.V9+x.toUSize).toNat=O*d.P9+y*(d.s.w+2)+x:=by rw[kSm _ _ (by rw[e3,czK _ (by omega)];have:=ϧ (by omega:O≤16383) (by omega:d.P9≤16383);have:=ϧ (by omega:y≤16383) (by omega:d.s.w+2≤16383);omega),e3,czK _ (by omega)] by_cases hb:(O.toUSize*d.P9.toUSize+y.toUSize*d.V9+x.toUSize).toNat+d.V9.toNat+d.V9.toNat+2simp[e] lemma ep(S:Ἅ)(h:ἆ)(e:ak S h<4294967296): kB (N3 (ak S h))≠255:=by unfold ak at e⊢;dsimp only at e⊢;split at e;swap;exact absurd e (by decide);rename_i d;rw[AD d];simp only[Η,AJ]at d;obtain⟨⟨⟨-,l⟩,-⟩,-⟩:=d;have m:(lq (Dense.F.eF S.toBits))<2048:=by rw[Dense.F.eF,Ε];exact AO ϝ (by decide) have o:(lq (S.toBits&&&0xfffffffffffff))<2^(52:Ἀ):=Ε _ _▸AO ϝ (by decide) rw[μ,Ζ]at l;simp only[kA]at l;have q:(lq S.toBits)/2^(63:Ἀ)<2:=by have:=S.toBits.toNat_lt;clear*-this;exact Ϟ this rw[μ]at e;simp only[kA]at e;intro g;have j:=congrArg mJ g;rw[kB,Ξ,Υ,Ϫ]at j;simp only[kN,kH,β]at j;rw[ζ _ 8,γ e,g0 S.toBits ((by (clear * - l m;omega)):1195<=(lq (Dense.F.eF S.toBits)))]at j;(clear * - l m o j;omega) @[inline]def fz(S:Ἅ)(lo sp h:ἆ):ἆ:= let b:=S.toBits let u:=((b&&&0xfffffffffffff)+268435456)&&&536870911 let r:=((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29 if Dense.F.eF b-lo>>63)<<<31)+r-0x255000000 else ak S h lemma fz_g(u D:ἆ)(c:u-2097153<532676607)(d:D<=21):u-(((1:ἆ)<<h+1075-E<=21/\E-1195<253):fz S lo sp h=ak S h:=by unfold fz;dsimp only;split · rename_i c;simp only[Η,AJ]at c;obtain⟨⟨c1,c2⟩,c3⟩:=c;obtain⟨d1,d2⟩:=hz _ c1 unfold ak;dsimp only;rw[AD];simp only[Η,AJ] exact⟨⟨⟨ϗ d1 (by decide),d2⟩,fz_g _ _ c2 d1⟩,c3⟩ · rfl def wlo(h:Ἀ):ἆ:=I0 (max (h+1054) 1195) def wsp(h:Ἀ):ἆ:=I0 ((min 1448 (h+1076))-(max (h+1054) 1195)) theorem wok_h1(a b:Ἀ)(hab:a<=b)(hb:b<18446744073709551616):(18446744073709551616-a+b)%18446744073709551616=b-a:=by rw[←Qf (hab.trans hb.le),Xz hab,Zl,γ ((Y4 b a).trans_lt hb)] theorem wok_h2(h e:Ἀ)(hh:h<1024)(hE:e<18446744073709551616)(c:(18446744073709551616-max (h+1054) 1195%18446744073709551616+e)%18446744073709551616 < (min 1448 (h+1076)-max (h+1054) 1195)%18446744073709551616):(18446744073709551616-e+(h%18446744073709551616+1075)%18446744073709551616)%18446744073709551616 ≤ 21∧(18446744073709551616-1195+e)%18446744073709551616 < 253:=by have l1:=le_max_left (h+1054) 1195 have l2:=le_max_right (h+1054) 1195 have l3:max (h+1054) 1195<=2078:=max_le (I3 (B3 hh 1054)) (by decide) have m1:=min_le_left 1448 (h+1076) have m2:=min_le_right 1448 (h+1076) rw[γ (l3.trans_lt (by decide)),γ (((Y4 _ _).trans m1).trans_lt (by decide))]at c generalize max (h+1054) 1195=lo at l1 l2 l3 c generalize min 1448 (h+1076)=m at m1 m2 c have le:lo<=e:=O3.1 λlt=>absurd (((N9 l3 _).trans (V1 _ e)).trans_lt ((γ ((O1 lt _).trans_le (Y3 (J4 (l3.trans (by decide)))))).symm.trans_lt c)) (O3.2 (((Y4 _ _).trans m1).trans (by decide))) rw[wok_h1 lo e le hE]at c have he:=(Nat.sub_lt_sub_iff_right le).1 c have h2:h+1075<18446744073709551616:=(B3 hh 1075).trans (by decide) rw[γ (hh.trans (by decide)),γ h2,wok_h1 e (h+1075) (U2 (he.trans_le m2)) h2,wok_h1 1195 e (l2.trans le) hE] exact⟨O9 ((Xv h 21 1054).trans_le (J1 (l1.trans le) 21):h+1075<=21+e),D4 (l2.trans le) (he.trans_le m1)⟩ lemma wok(h:Ἀ)(hh:h<1024):∀E:ἆ,E-wlo h(I0 h)+1075-E<=21/\E-1195<253:=by intro E c unfold wlo wsp at c simp only[μ,θ,Ζ,η,Ϣ,P6,mY,kH,nr] at c ⊢ exact wok_h2 h _ hh E.toNat_lt c lemma wlt(P L:Ἀ)(a:P+L<=425)(b:L<=27):P+2*L-54<1024:=by omega noncomputable def bVo(d:CD)(o y x:Ἀ)(S:Ἅ):Ἃ:= let c:=ak S d.hh if h:c<4294967296 then dR d.J (N3 c)else ow d o y x S noncomputable def bV(d:CD)(o y x:Ἀ)(S:Ἅ):Ἃ:= let c:=ak S d.hh if h:c<4294967296 then dR d.J (N3 c)else ow2 d o y x S lemma iE(d:CD)(o y x:Ἀ)(S:Ἅ):bVo d o y x S=ow d o y x S:=by unfold bVo;dsimp only;split .rename_i e;rw[jI _ _ (ep _ _ e)];rw[ow,tw,tf];dsimp only;rw[AD e];split;swap;rfl;rename_i c;simp only[Η,AJ]at c;obtain⟨⟨r,c1⟩,-⟩:=c;rw[r];exact kAkN S d.hh e c1 .rfl @[inline]def ju(d:CD)(o y:Ἀ)(xb:Ἄ)(r:Ἀ)(S:Ἅ):Ἃ:= let c:=fz S d.lo d.sp d.hh if c<4294967296 then dR d.J (N3 c)else ow2 d o y ((J0 xb)+r) S lemma iF(d:CD)(o y:Ἀ)(e:Ἄ)(r:Ἀ)(S:Ἅ):ju d o y e r S=bV d o y ((J0 e)+r) S:=by unfold ju;rw[fz_ak _ _ _ _ d.hz];rfl @[inline]def su(a:Ἂ Ἃ)(u:Ἄ)(v:Ἃ):Ἂ Ἃ:= if h:uἋ)(n r q:Ἀ)(a:Ἂ Ἃ):Ἂ Ἃ:= if rkF)(n q:Ἀ):∀m r (a:Ἂ kF),n-r=m->r<=n->(O0 (pl g n r q a))=(O0 a)/\ ∀i<(O0 a),(pl g n r q a)[i]! =if q+r<=i/\iintro r a l o;rw[pl,AC (by (clear * - l;omega))];exact⟨ἅ,λi e=>by rw[AC (by (clear * - l o;omega))]⟩ |succ m p=> intro r a l o;have h:=N1 l;obtain⟨u,j⟩:=p (r+1) (a.set! (q+r) (g r)) (by rw[<-D8,l,BK]) h;rw[pl,AD h,u,BU];refine⟨ἅ,λi e=>?_⟩;rw[j i (by rwa[BU])];by_cases d:i=q+r;subst d;rw[Array.getElem!_set!_self _ _ _ e];clear*-h;split_ifs<;>first|rfl|omega|(congr 1;exact Nat.eq_sub_of_add_eq' rfl) rw[Array.getElem!_set!_ne _ _ _ _ (Ww d)];clear*-d;split_ifs<;>first|rfl|omega @[inline]def lnF(f:Nat→Ἅ→Word)(nq q r:Ἄ)(S:Ἅ)(a:Ἂ Word):Ἂ Word:= if rkF)(n q:Ἀ):∀m r (a:Ἂ kF),n-r=m->r<=n-> pl g (n+1) r q a=(pl g n r q a).set! (q+n) (g n):=by intro m;induction m<;>intro r a d e;have:r=n:=(by omega);subst this;conv_lhs=>rw[pl,AD (by exact lt_add_one r),pl,AC (by exact N4 (r+1))] conv_rhs=>rw[pl,AC (by exact N4 r)] rename_i j;conv_lhs=>rw[pl,AD (by exact Order.lt_add_one_iff.mpr e)] rw[j (r+1) _ (by (clear * - d e;omega)) (by (clear * - d e;omega))];conv_rhs=>rw[pl,AD (by exact N1 d)] lemma ka_h1{a b c k:Ἀ}(p:a+cbV d o y ((J0 g)+r) (A.f r)) (po k (J0 e)) 0 (J0 q) a)= pl (λr=>bV d o y ((J0 g)+r) (A.f r)) (po (k+1) (J0 e)) 0 (J0 q) a:=by subst l;rw[ln];by_cases h:rbV d o y ((J0 g)+r) (A.f r)) (po 8 (J0 e)) 0 (J0 q) a:=by unfold a9 fC8;split · rename_i h;rw[jzS d o y g,ite_self];unfold fC8g;obtain⟨m,v,x⟩:=h have p:=V6.mp m;simp only[kD] at p have E:∀k:Ἄ,(J0 k)<8->(J0 (q+k))=(J0 q)+(J0 k):=λk B=>Dense.aj (by (clear * - l p B;omega)) rw[(by exact R9 p:po 8 (J0 e)=8)] have s5ux:∀(a:Ἂ kF)(u:Ἄ)(v:kF)(h:(J0 u)<(O0 a)),a.uset u v h=a.set! (J0 u) v:=λa u v h=>by rw[pP,Xj,Hr,AT h] iterate 8 rw[s5ux] rw[E 1 (by simp only [kD,Nat.one_lt_ofNat]),E 2 (by simp only [kD,Kl]),E 3 (by simp only [kD,Kl]),E 4 (by simp only [kD,Kl]),E 5 (by simp only [kD,Kl]),E 6 (by simp only [kD,Kl]),E 7 (by simp only [kD,Xa])] iterate 8 rw[pl,AD (by decide)] rw[pl,AC (by decide)];simp only[iF,kD,ϑ];rfl unfold fCp;rw[jzS d o y g] have lF:∀(nq q r:Ἄ)(S:Ἅ)(a:Ἂ Word),lnF (ju d o y g) nq q r S a=ln d o y g nq q r S a:=fun _ _ _ _ _=>rfl simp only[lF,ite_self] have L:=ka d o y g e q A a l;have j:=L 0 0 (by simp only [Ϧ]) A.a0 rfl;rw[Nat.zero_min,pl,AC (by exact C5 0)]at j simp only[j,L 1 1 (by simp only [kD]) A.a1 rfl,L 2 2 (by simp only [kD]) A.a2 rfl,L 3 3 (by simp only [kD]) A.a3 rfl,L 4 4 (by simp only [kD]) A.a4 rfl,L 5 5 (by simp only [kD]) A.a5 rfl,L 6 6 (by simp only [kD]) A.a6 rfl,L 7 7 (by simp only [kD]) A.a7 rfl,Xo] lemma l0(d:Ἄ)(h:0Ἅ->Ἅ->Ἅ)(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(Wz X:@&ἀ)(Tz:@&Ἂ Ἀ)(wo n:Ἄ)(M:Ἀ) (H:((kS X)<2^(32:Ἀ)/\(kS Wz)<2^(32:Ἀ))/\(J0 n)<=(O0 Tz)/\(∀t<(J0 n),Tz[t]!<=M)/\(J0 wo)+(J0 n)<=(kS Wz)) (o y:Ἀ) (bp:Ἅ) (xb nq q i i2:Ἄ) (h0:0d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+y*(d.s.w+2)+xb+ c.Tz[t]!+r]!*c.Wz.data[c.wo+t]!) c.n 0 (dw oneW*dw d.b[o]!) abbrev FX(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M):Prop:=∀skF)(P:Ἀ->Prop)[DecidablePred P](a b:Ἂ kF):Prop:=(O0 b)=(O0 a)/\∀j<(O0 a),b[j]! =if P j then Ψ j else a[j]! abbrev HGp(d:CD)(c:CC d.M)(o:Ἀ)(Ψ:Ἀ->kF)(R:Ἀ):Prop:=∀y' g r,y'r<8->g+rbV d o y' (g+r) (dK d c o y' g r)=Ψ (R+y'*d.s.w+(g+r)) def rZ(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(o y:Ἀ)(B0:A8)(xb nq q:Ἄ)(a:Ἂ Ἃ):Ἂ Ἃ:= let a':=a92 dy dx dq d o y xb nq q B0 B0 a if h:8Ἅ->Ἅ->Ἅ)(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(c:@&CC d.M)(o y:Ἀ)(xb nq q i i2:Ἄ)(bp:Ἅ)(a:Ἂ Ἃ) (hI:(J0 i)+(J0 nq)+d.M+7<=(kS d.X))(hI2:(J0 i2)+(J0 nq)+d.M+7<=(kS d.X)):Ἂ Ἃ:= if h0:0kF)(R:Ἀ) (HG:HGp d c o Ψ R) (hy:y+dy(J0 q)<=j/\j<(J0 q)+po 8 (J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+po 8 (J0 e)) a (a92 dy dx dq d o y g e q A B a):=by obtain⟨o1,o2,o3,o4⟩:=q9b g e q dx dq R y dy d.s.w (O0 a) hd hq hs hA;have E1:=Dense.aj o1;have E2:=Dense.aj o2 unfold a92;rw[iT d o y g e q A a o3,iT d o (y+dy) (g+dx) e (q+dq) B _ (by rw[E1];exact o4)] obtain⟨p,K⟩:=jS (λr=>bV d o y ((J0 g)+r) (A.f r)) (po 8 (J0 e)) (J0 q) _ 0 a rfl (ϟ _) obtain⟨p2,K2⟩:=jS (λr=>bV d o (y+dy) ((J0 (g+dx))+r) (B.f r)) (po 8 (J0 e)) (J0 (q+dq)) _ 0 _ rfl (ϟ _) refine⟨p2.trans p,λj J=>?_⟩;rw[K2 j (by rwa[p]),K j J,E1,E2];simp only[ϑ] by_cases b1:(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+po 8 (J0 e) ·obtain⟨r1,r2,r3,r4⟩:=q9r (q9q hq hd) ((lO _ _ _).trans_le hx) b1;rw[AD b1,AD (BA b1),lB _ r1,HG _ _ _ hy r2 r3,r4] rw[AC b1];by_cases b2:(J0 q)<=j/\j<(J0 q)+po 8 (J0 e) ·obtain⟨r1,r2,r3,r4⟩:=q9r hq ((V1 _ _).trans hx) b2;rw[AD b2,AD (pZ b2),lA _ r1,HG _ _ _ (C0 (V1 _ _) hy) r2 r3,r4] rw[AC b2,AC (not_or.2 ⟨b2,b1⟩)] lemma chC{P Q R:Ἀ->Prop}[DecidablePred P][DecidablePred Q][DecidablePred R](Ψ:Ἀ->kF)(x0 x1 x2:Ἂ kF) (h1:Ch Ψ P x0 x1)(h2:Ch Ψ Q x1 x2)(h:∀j,R j↔Q j\/P j):Ch Ψ R x0 x2:= ⟨h2.1.trans h1.1,λj J=>by rw[h2.2 j (by rw[h1.1];exact J),h1.2 j J];by_cases q:Q j<;>by_cases p:P j<;>simp[q,p,h]⟩ lemma q8v{i e:Ἄ}{M S:Ἀ}(v:(J0 i)+(J0 e)+M+7<=S)(e4:0<(J0 e)):(J0 i)+M+8<=S:=by omega lemma q8p{i:Ἄ}{T M S r:Ἀ}(h:T<=M)(v:(J0 i)+M+8<=S)(I:r<8):(J0 i)+T+rq8c _ _ _ j l8'⟩ lemma kS1{n t k:Ἀ}(hk:n-t=k+1)(h:t+1Ἅ->Ἅ->Ἅ)(dy:Ἀ)(dx dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(Ψ:Ἀ->kF)(R:Ἀ) (hF:FX mc d c)(HG:HGp d c o Ψ R) (hy:y+dy (J0 g)+(J0 e)+(J0 dx)<=d.s.w-> (J0 i)=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+y*(d.s.w+2)+(J0 g)-> (J0 i2)=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+(y+dy)*(d.s.w+2)+((J0 g)+(J0 dx))-> (J0 q)=R+y*d.s.w+(J0 g)->(J0 q)+(J0 dq)+(J0 e)<=(O0 a)->(O0 a)<2^(32:Ἀ)-> ∀k (t:Ἄ) (ht:t (∀r<8,dK d c o y (J0 g) r=ao (λs=>d.X.data[(J0 i)+c.Tz[s]!+r]!*c.Wz.data[c.wo+s]!) c.n (J0 t) (A8.f ⟨p0,p1,p2,p3,p4,p5,p6,p7⟩ r))-> (∀r<8,dK d c o (y+dy) ((J0 g)+(J0 dx)) r=ao (λs=>d.X.data[(J0 i2)+c.Tz[s]!+r]!*c.Wz.data[c.wo+s]!) c.n (J0 t) (A8.f ⟨r0,r1,r2,r3,r4,r5,r6,r7⟩ r))-> Ch Ψ (λj=>(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rBt mc dy dx dq d c.Wz d.X c.Tz (G0 c.wo) (G0 c.n) d.M ⟨⟨d.hX,c.h5⟩,gYa d c⟩ o y (dw ld*dw d.b[o]!) g e q i i2 h0 v v2 a t ht p0 p1 p2 p3 p4 p5 p6 p7 r0 r1 r2 r3 r4 r5 r6 r7):=by intro m;induction m with |zero=>intro g e q i i2 a h0 _ _ hm;exact absurd (l0 e h0) (Ok hm) |succ m ih=> intro g e q i i2 a h0 v v2 hm hx L L2 hq hs J k have:=ς;have:=c.h3;have e4:=l0 e h0;have u:=q8v v e4;have u2:=q8v v2 e4;have w1:(J0 (G0 c.n))=c.n:=Dense.aa (by omega);have w2:(J0 (G0 c.wo))=c.wo:=Dense.aa (by omega) induction k using Z5 with |_ k ihk=> intro t ht p0 p1 p2 p3 p4 p5 p6 p7 r0 r1 r2 r3 r4 r5 r6 r7 hk K K2 have Y:=ε.mp ht;rw[w1]at Y;have hM:=c.h4 _ Y have rx:=eyX d.X c.Tz i t d.M d.hX u (U1 Y c.h1) hM;have rx2:=eyX d.X c.Tz i2 t d.M d.hX u2 (U1 Y c.h1) hM have J':∀j,c.Wz.uget (G0 c.wo+t) j=c.Wz.data[c.wo+(J0 t)]!:=λj=>by rw[ug,Dense.aj (by omega),w2] have G1:=λr (I:r<8) p z w=>(hF _ Y _ (q8p hM u I) z).symm.trans (congrArg₂ (mc z) (rx r I p).symm (J' w).symm);have G2:=λr (I:r<8) p z w=>(hF _ Y _ (q8p hM u2 I) z).symm.trans (congrArg₂ (mc z) (rx2 r I p).symm (J' w).symm) have T:=Dense.ac ht;rw[rBt];dsimp only;by_cases h1:t+1?_) (λr I=>?_) ·rw[K r I,kq _ _ _ _ Y,T];congr 1;interval_cases r<;>exact G1 _ I _ _ _ ·rw[K2 r I,kq _ _ _ _ Y,T];congr 1;interval_cases r<;>exact G2 _ I _ _ _ have hN:¬(J0 t)+1by have:=U1 I (O7 _ _);rw[←hA,K r this,kq _ _ _ _ Y,kp _ _ _ _ hN];interval_cases r<;>exact (G1 _ this _ _ _).symm) (λr I=>by have:=U1 I (O7 _ _);rw[←hB,K2 r this,kq _ _ _ _ Y,kp _ _ _ _ hN];interval_cases r<;>exact (G2 _ this _ _ _).symm) by_cases l:8by unfold dK;rw[L3,Ϧ,Dense.F.f8]) (λr I=>by unfold dK;rw[L4,Ϧ,Dense.F.f8])) P ·rw[dite_eq_right l];have:=mt ε.2 l;simp only[kD]at this;rw[Vl (V4 this)]at B;exact B lemma rZc(dy:Ἀ)(dx dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(Ψ:Ἀ->kF)(R:Ἀ)(HG:HGp d c o Ψ R) (hy:y+dy(J0 g)+(J0 e)+(J0 dx)<=d.s.w->(J0 q)=R+y*d.s.w+(J0 g)->(J0 q)+(J0 dq)+(J0 e)<=(O0 a)->(O0 a)<2^(32:Ἀ)-> Ch Ψ (λj=>(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rZ dy dx dq d o y B0 g e q a):=by have Z:∀y' g' r,B0.f r=dK d c o y' g' r:=λ_ _ _=>by unfold dK;rw[hB,n0,ao,AC (N4 0)] intro m;induction m using Z5 with |_ m ih=> intro g e q a hm hx hq hs J;have B:=a92c d c o y dy dx dq g e q B0 B0 a Ψ R HG hy hd hx hq hs J (λr _=>Z _ _ r) (λr _=>Z _ _ r);rw[rZ];by_cases l:8Ἅ->Ἅ->Ἅ)(dy:Ἀ)(dx dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(g e q i i2:Ἄ)(a:Ἂ kF)(Ψ:Ἀ->kF)(R:Ἀ) (hF:FX mc d c)(HG:HGp d c o Ψ R) (hy:y+dy(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rBc mc dy dx dq d c o y g e q i i2 (dw ld*dw d.b[o]!) a v v2):=by have:=ς;have:=c.h3;have:=d.hX;have w1:(J0 (G0 c.n))=c.n:=Dense.aa (by omega) unfold rBc;split ·rename_i h0;split ·rename_i hn;have:=ε.mp hn;rw[Ϧ,w1]at this;exact je2 mc dy dx dq d c o y Ψ R hF HG hy hd (J0 e) g e q i i2 a h0 v v2 AP hx L L2 hq hs J (c.n-1) 0 hn _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by rw[Ϧ];omega) (λr I=>by unfold dK;simp only[L,Ϧ,Dense.F.f8]) (λr I=>by unfold dK;simp only[L2,Ϧ,Dense.F.f8]) ·rename_i hn;exact rZc dy dx dq d c o y Ψ R HG hy hd (by have:=mt ε.2 hn;rw[Ϧ,w1]at this;omega) _ (λr=>Dense.F.f8 _ r) _ g e q a AP hx hq hs J ·rename_i h0;have:(J0 e)=0:=by have:=mt ε.2 h0;simp only[kD]at this;omega exact⟨ἅ,λj _=>by rw[AC (by omega)]⟩ @[specialize]def c8(h len:Ἀ)(V:Ἄ)(i0:Ἀ)(hN:i0+h*(J0 V)y(q:Ἀ)->(i:Ἄ)->(J0 i)=i0+y*(J0 V)->Ἂ Ἃ->Ἂ Ἃ) (y q:Ἀ) (i:Ἄ) (hi:(J0 i)=i0+y*(J0 V)) (a:Ἂ Ἃ):Ἂ Ἃ:= if hy:yy(q:Ἀ)->(i:Ἄ)->(J0 i)=o+y*(J0 V)->Ἂ kF->Ἂ kF) (r N:Ἀ) (G:Ἀ->kF) (F:∀y (g:y(O0 a)=N-> (O0 (f y g q i e a))=(O0 a)/\∀j<(O0 a),(f y g q i e a)[j]! =if q<=j/\jy<=h->q=r+y*d->(O0 a)=N-> (O0 (c8 h d V o x f y q i e a))=(O0 a)/\ ∀j<(O0 a),(c8 h d V o x f y q i e a)[j]! =if q<=j/\jintro y q i e a H g p l .cases g.antisymm (P4 H);rw[c8,dite_eq_right (AX _)];exact⟨ἅ,λj _=>by rw[AC (by (clear * - p;omega))]⟩ rename_i K;have g:y?_⟩;rw[D j (v▸A),B j A];have:=J▸J1 (ι d g) r;clear*-this;split_ifs<;>first|rfl|omega lemma dbN(i0 H Wd M S:Ἀ)(hb:i0+(H-1)*(Wd+2)+Wd+M+7<=S):i0+H/2*(2*(Wd+2))<=S:=by have:H/2*(2*(Wd+2))<=(H-1)*(Wd+2)+(Wd+2):=by rw[<-Ϛ,<-Ο];exact ι _ (by omega) omega lemma dbB(i0 H Wd M S y:Ἀ)(hb:i0+(H-1)*(Wd+2)+Wd+M+7<=S)(hy:yἍ->Ἅ->Ἅ)(d:@&CD)(c:@&CC d.M)(o q i0:Ἀ)(bp:Ἅ)(a:Ἂ Ἃ)(hb:i0+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)):Ἂ Ἃ:= c8 (d.s.h/2) (2*d.s.w) (G0 (2*(d.s.w+2))) i0 (by have:=d.hX;have:=ς;have:=dbN _ _ _ _ _ hb;have:=X3 (d.s.h/2) (show (J0 (G0 (2*(d.s.w+2))))<=2*(d.s.w+2) by rw[lX,X9];exact Ay _ _);omega) (λy hy q i hi a=>rBc mc 1 0 (G0 d.s.w) d c o (2*y) 0 (G0 d.s.w) (G0 q) i (i+d.V9) bp a (dbP d i0 y i hb hy hi).1 (dbP d i0 y i hb hy hi).2) 0 q (G0 i0) (by rw[ϳ,ϑ];exact Dense.aa (by have:=d.hX;have:=ς;omega)) a @[specialize]def db(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:@&CD)(c:@&CC d.M)(o q:Ἀ)(bp:Ἅ)(a:Ἂ Ἃ):Ἂ Ἃ:= let i0:=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2)) if hb:i0+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)then let a':=dbq mc d c o q i0 bp a hb if d.s.h%2=1 then rBc mc 0 (G0 (d.s.w/2)) (G0 (d.s.w/2)) d c o (d.s.h-1) 0 (G0 (d.s.w-d.s.w/2)) (G0 (q+(d.s.h-1)*d.s.w)) (G0 (i0+(d.s.h-1)*(d.s.w+2))) (G0 (i0+(d.s.h-1)*(d.s.w+2)+d.s.w/2)) bp a' (by have:=d.hX;have:=ς;rw[Dense.aa (by omega),Dense.aa (by omega)];omega) (by have:=d.hX;have:=ς;rw[Dense.aa (by omega),Dense.aa (by omega)];omega) else a' else a lemma dbqC(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M)(o q i0:Ἀ)(a:Ἂ kF)(Ψ:Ἀ->kF)(hF:FX mc d c) (HG:HGp d c o Ψ q) (hi:i0=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2)))(hq:q+d.s.h*d.s.w<=(O0 a))(hA:(O0 a)<2^(32:Ἀ))(hb:i0+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)): Ch Ψ (λj=>q<=j/\jby have:=d.hX;have:=ς;have E:=dbB i0 d.s.h d.s.w d.M _ y hb hy;have:d.s.w+2<=(d.s.h-1)*(d.s.w+2):=lZ _ (by omega) have w1:(J0 (G0 d.s.w))=d.s.w:=Dense.aa (by omega) have w2:(J0 (G0 (2*(d.s.w+2))))=2*(d.s.w+2):=Dense.aa (by omega) have v:(J0 d.V9)=d.s.w+2:=by rw[d.hV9];exact czK _ (by omega) have t1:=ι d.s.w (show y*2+2<=d.s.h by omega);rw[Ϡ,Ϛ]at t1 rw[w2]at e;have w3:(J0 (G0 q'))=q':=Dense.aa (by omega) obtain⟨s,E2⟩:=rBcC mc 1 0 (G0 d.s.w) d c o (2*y) 0 (G0 d.s.w) (G0 q') i (i+d.V9) a' Ψ q hF HG (by omega) (by simp only[w1,Ϧ];omega) _ _ (by simp only[w1,Ϧ];omega) (by rw[e,hi,Ϧ];ring) (by rw[Dense.aj (by omega),v,e,hi,Ϧ];ring) (by rw[w3,hq',Ϧ];ring) (by rw[w3,w1,hN];omega) (by rw[hN];exact hA) exact⟨s,λj J=>by rw[E2 j J];exact if_congr (by omega) rfl rfl⟩) _ 0 q _ _ a rfl (ϟ _) (by simp) rfl lemma iG2(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M)(o q:Ἀ)(a:Ἂ kF)(Ψ:Ἀ->kF)(hF:FX mc d c) (HG:HGp d c o Ψ q) (hq:q+d.s.h*d.s.w<=(O0 a))(hA:(O0 a)<2^(32:Ἀ)) (B:0(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)): Ch Ψ (λj=>q<=j/\jby omega) ·rw[AC o1];have t1:d.s.h/2*(2*d.s.w)=d.s.h*d.s.w:=by rw[<-Ϛ];congr 1;omega rw[t1]at E1;exact E1 ·rw[dite_eq_right g];have h0:d.s.h=0:=by by_contra z;exact g (B (by omega)) exact⟨ἅ,λj _=>by rw[h0,ϳ,AC (by omega)]⟩ def bA(K:Ἂ Ἃ)(T:Ἂ Ἀ)(M ok k:Ἀ)(hT:∀t(Nat.lt_or_eq_of_le (U2 (B5 hj (ϣ ..)))).elim (λhjs=>J2 (Y3 (((AB (Tz.push T[t]!) j hj).trans (nU hjs)).trans (AB Tz j hjs).symm)) (hz j hjs)) (λhe=>J2 (Y3 ((congrArg (fun (i:Ἀ)=>(Tz.push T[t]!)[i]!) he).trans ((AB (Tz.push T[t]!) (O0 Tz) (B5 (U4 _) (ϣ ..).symm)).trans nV))) (hT t h))) else⟨Tz,Wz,0,(O0 Tz),fQ,AP,Y3 ((Κ _).trans hs),C0 (J2 (Y3 (Κ _)) (J2 hn ht)) hk,hz,C0 (J2 (Y3 hs.symm) (J2 hn ht)) hk⟩ termination_by k-t decreasing_by all_goals exact U5 h (U4 t) def NZ(K:Ἂ Ἃ)(T:Ἂ Ἀ)(ok t:Ἀ)(Tz:Ἂ Ἀ)(Wz:ἀ):Prop:= (O0 Tz)=(kS Wz)/\(O0 Tz)<=t/\∃ix:Ἀ->Ἀ, (∀j<(O0 Tz),ix jℝ,(∀sz s=0)->∑j∈range (O0 Tz),z (ix j)=∑s∈range t,z s lemma ft(K:Ἂ kF)(T:Ἂ Ἀ)(M A k:Ἀ)(H:∀tNZ K T A t Tz Wz-> NZ K T A k (bA K T M A k H I t Tz Wz p u v g).Tz (bA K T M A k H I t Tz Wz p u v g).Wz:=by intro m;induction m with |zero=>intro t _ _ _ _ v _ L h;cases v.antisymm (P4 L);rwa[bA,dite_eq_right (AX _)] |succ m J=>intro t Tz Wz _ _ _ _ L h;obtain⟨p,u,x,o,l⟩:=h;rw[bA,AT (N1 L)];dsimp only;split<;>rename_i G;refine J (t+1) _ _ _ _ _ _ (congrArg Ki L) ⟨p,Va.step u,x,λj r=>(o j r).imp_left Qw.step,λz g=>?_⟩;rw[l z (λs D q=>g s (Qw.step D) q),Ν,g t (Qw.base t) G,Av];refine J (t+1) _ _ _ _ _ _ (congrArg Ki L) ⟨by rw[ϣ,bW,p],by rw[ϣ];exact C9 u,λj=>if j<(O0 Tz)then x j else t,λj r=>?_,λz g=>?_⟩;by_cases d:j<(O0 Tz);obtain⟨U,N,O⟩:=o j d;refine⟨?_,?_,?_⟩<;>simp only[AD d];exact Qw.step U;rwa[AB _ _ (by exact r),nU d,<-AB Tz j d];rwa[pg _ _ _ (Qw.step (d.trans_eq p)),AD (d.trans_eq p)];rw[ϣ]at r;cases (U2 r).antisymm (not_lt.1 d);refine⟨?_,?_,?_⟩<;>simp only[AC (AX _)];exact Qw.base t;rw[AB _ _ ((by simp only [ϣ,lt_add_iff_pos_right,Order.lt_one_iff])),nV];rw[pg _ _ _ (Z4 p.le),AC (p▸AX _)];rw[ϣ,Ν,(ϔ ἅ λj r=>by rw[AD (ϥ.1 r)]:∑j∈kP (O0 Tz),z (if j<(O0 Tz)then x j else t)=∑j∈kP (O0 Tz),z (x j))];dsimp only;rw[AC (AX _),l z (λs D q=>g s (Qw.step D) q),Ν] def dF(d:CD)(Z:Ἆ)(Wd:@&ἀ)(hT:∀tby simp at hj) else have hok:o*d.k+d.k<=d.Y*d.k:=by rw[<-Ο];exact ι _ ho ⟨d.T,Wd,o*d.k,d.k,fQ,hkT,hok.trans (hW.resolve_left hZ).1,(by exact C0 hok hY),hT,(hW.resolve_left hZ).2⟩ lemma eM_h1{k t:Ἀ}(a:k-t=0):¬t (bA K T M q k o p t Tz d g e j l).n=(O0 (bA K T M q k o p t Tz d g e j l).Tz)/\ (bA K T M q k o p t Tz d g e j l).wo=0:=by intro m;induction m with |zero=>intros;rename_i a;rw[bA,dite_eq_right (eM_h1 a)];exact⟨ἅ,ἅ⟩ |succ m r=>intros;rename_i a;have b:=eM_h2 a;rw[bA,AT b.1];dsimp only;split<;>exact r _ _ _ _ _ _ _ b.2 lemma fm(d:CD)(Z:Ἆ)(p:ἀ)(u:∀t∀qἈ,c.n<=d.k/\ (∀jℝ,(∀sz s=0)-> ∑j∈kP c.n,z (m j)=∑s∈kP d.k,z s:=by by_cases D:Z=ἃ .have⟨⟨l,L⟩,J,I,m,g,r⟩:(c.n=(O0 c.Tz)/\c.wo=0)/\NZ d.K d.T (o*d.k) d.k c.Tz c.Wz:=by subst O;rw[dF,AT D];exact⟨eM _ _ _ _ _ u v _ 0 _ _ _ _ _ _ rfl,ft _ _ _ _ _ u v _ 0 _ _ _ _ _ _ rfl ⟨by rw[cZ];simp,(by simp),id,λj e=>by simp at e,λz _=>(by simp)⟩⟩ refine⟨by rw[<-J];exact C0 I v,m,l▸I,λj e=>by rw[L,Κ];exact g j (l▸e),l▸r⟩ have ah:o*d.k+d.k<=d.Y*d.k:=Ο _ _▸ι _ U;subst O;rw[dF,dite_eq_right D];use(by dsimp only;exact(X.resolve_left D).2),id,AP,(λj e=>by dsimp only at e⊢;exact⟨e,ἅ,x (by simpa using D) (o*d.k+j) (by exact Formats.DecimalInterchange.Bits.mul_add_lt_mul U e)⟩),λz _=>ἅ lemma gG(s:lR)(I:Ἂ kF)(d:s.kh=3/\s.kw=3/\s.stride=1/\s.pad=1) (y x t:Ἀ)(e:t/9first|rfl|omega lemma gF(s:lR)(I:Ἂ kF)(d:s.kh=1/\s.kw=1/\s.stride=1/\s.pad=0) (y x t:Ἀ)(j:yfirst|rfl|omega theorem iI_h1(d t:Ἀ):(d*9+t)/9=d+t/9∧(d*9+t)/3%3=t/3%3∧(d*9+t)%3=t%3:= ⟨by rw[Τ (d*9) t,Ρ t d ((by decide):0<9),Τ (t/9) d],by rw[Τ (d*9) t,((Ϛ d 3 3).symm:d*9=d*3*3),Ρ t _ ((by decide):0<3),Μ],by rw[Τ (d*9) t,((Ϛ d 3 3).symm:d*9=d*3*3),Μ]⟩ lemma iI(s:lR)(I:Ἂ kF)(e:Ἀ)(q:fP s e)(y x t d:Ἀ)(u:y?_⟩;rw[z3 q hq,aI,AC (by simp[c])] have W:3*(s.w+2)<2^(32:Ἀ):=AO (ι _ (N2 3 _)) hN;have V:s.cin*(s.h+2)+3<2^(32:Ἀ):=AO (U3 _ (I9 _)) hN;obtain⟨u,v⟩:=fRUs I s d (G0 s.w) (G0 (s.w+2)) (G0 (3*(s.w+2))) (G0 s.h) (G0 (s.cin*s.h)) (aa _ e) (aa _ (AO (lZ _ (by decide)) W)) (aa _ W) (aa _ (AO (AZ (AZ (V1 _ 2) (lZ _ c)) (V1 _ 3)) V)) (aa _ (AO (AZ (X3 _ (V1 _ 2)) (V1 _ 3)) V)) g hN h0 _ 0 0 (G0 (s.w+3)) 0 _ ἅ (by simp) (by simp) (by simp) (by rw[aa _ (by clear*-W;omega),Ϧ,Hx,Uh];ring) z1 Z (λq hq=>by rw[z3 q hq,AC (by simp)]);rw[xF,u];exact⟨z1,Z,v⟩ lemma gX(h w d j l y m e V:Ἀ)(x:V=w+2)(g:e=(h+2)*V)(p:yἈ) (hs:fP d.s d.kk) (a3:0ℝ,(∀sz s=0)-> ∑j∈kP c.n,z (l j)=∑s∈kP d.k,z s) (S:Ἅ) (hS:S=ao (λj=>d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+ y*(d.s.w+2)+x+c.Tz[j]!]!*c.Wz.data[c.wo+j]!) c.n 0 (dw ld*dw d.b[o]!)): bVo d o y x S=p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x):=by have p:∀t(dh _ _ A O (iS d.s d.I A hx _ _ _).2 (hw _).2).trans (AU one_le_two U) have rB:|(tm ld d.b[o]!:ℝ)|<=2^P:=(dh _ _ 126 N (by decide) (hb _).2).trans (AU one_le_two bb) have u:Dense.F.fv (dw ld*dw d.b[o]!)/\ Dense.F.rv (dw ld*dw d.b[o]!)=tm ld d.b[o]!:=dJ ld d.b[o]! l0 (hb _).1 have bp:(c.n:ℝ)<=2^d.L:=by exact_mod_cast(J2 bh (J2 (V1 _ 2) hL):c.n<=2^d.L) obtain⟨fS,eS⟩:=dM _ _ _ _ _ rfl▸dL (λ_=>false) (λj=>d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+ y*(d.s.w+2)+x+c.Tz[j]!]!*c.Wz.data[c.wo+j]!) (λj=>tm (ll d.s d.I y x ((if d.D then o else 0)*d.kk+l j)) d.K[o*d.k+l j]!) (tm ld d.b[o]!) P d.L c.n (λj g=>by obtain⟨i1,i2,i3⟩:=e j g;rw[i2,i3];exact p _ i1) (λ_ _ h=>absurd h lN) (λ_ _=>rA _ _) rB (J2 (L1 bh 2) hL) m (J2 ah (by decide)) c.n 0 _ rfl (ϟ _) u.1 (by simp only[u.2,I7,Av,sub_self,A5,A9,zero_mul,le_refl]) have ba:((tm ld d.b[o]!:Ἁ):ℝ)+∑j∈kP c.n, ((tm (ll d.s d.I y x ((if d.D then o else 0)*d.kk+l j)) d.K[o*d.k+l j]!:Ἁ):ℝ)= (af (d.k+1) (λt=>if tif tby simp only[AD (e j (ϥ.mp g)).1]).trans (H _ λs a5 h0=>by simp only[AD a5,tm,cz d.K[o*d.k+s]! (by rw[<-an,h0];rfl),mul_zero,zero_mul,lH])) (by simp only[AX,Am])) rw[iE,hS];unfold ow;simp only[gg] refine(jE d.J d.k (λt=>if tif tdw ld*dw d.b[o]!) d.hh P d.L (λ_=>p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x)) (λt B=>by simp only[AD B];exact p t B) (by simpa only[AX,Am]using u) (λt _=>?_) (λs _=>if h:sἈ) (hs:fP d.s d.kk) (a3:0ℝ,(∀sz s=0)-> ∑j∈kP c.n,z (l j)=∑s∈kP d.k,z s) (S:Ἅ) (hS:S=ao (λj=>d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+ y*(d.s.w+2)+x+c.Tz[j]!]!*c.Wz.data[c.wo+j]!) c.n 0 (dw ld*dw d.b[o]!)): bV d o y x S=p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x):=by have xw:∀t[exact pZ h.2.2.2.2;exact BA h.2.2.2.2] have a7:(if d.D then o else 0)+pc d.kk t(We _ _ _ _).trans (congrArg (·+(w+k)) ((We _ _ _ _).trans ((congrArg₂ (·+·) ((Ϡ X e (a*b)).symm.trans (Ϛ (X+e) a b).symm) (Ϡ u f b).symm).trans (Ϡ ((X+e)*a) (u+f) b).symm))) have hq:(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+y*(d.s.w+2)+x+d.T[t]! = (((if d.D then o else 0)+pc d.kk t)*(d.s.h+2)+(y+py d.kk t))*(d.s.w+2)+(x+px d.kk t):=by rw[al];exact h1 _ _ _ _ _ _ _ _ obtain⟨q1,q2,q3⟩:=cf ((if d.D then o else 0)+pc d.kk t) (y+py d.kk t) (x+px d.kk t) (d.s.h+2) (d.s.w+2) (R6 hy (jd d.kk t)) (R6 g (jc d.kk t)) have a4:(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+y*(d.s.w+2)+x+d.T[t]!<(kS d.X):= U1 (C0 (J1 ((hT t B).trans_eq hM) _) (U1 (X6 (by decide)) hB)) aH rw[aL _ a4,hq,q1,q2,q3,iI d.s d.I d.kk hs y x t _ hy g a7] have J:=jQ d c v A O N P l hs a3 a2 hc hM as hT aH aL hx hw hb U bb hL m ah G o y x ho hy g xw bh e H S hS unfold bV;unfold bVo at J;dsimp only at J ⊢;split ·rename_i h;rw[AT h]at J;exact J ·rename_i h;rw[dite_eq_right h]at J;unfold ow2 by_cases hz:(d.b[o]! == 0&&(zpF d o y x||zpC d o y x))=true ·rw[AD hz] simp only[Η,AQ,nM]at hz have hz2:zpC d o y x=true:=hz.2.elim (zpF_C d o y x) id rw[Conv.aBz2 d.s d.I d.K d.b d.kk d.k _ o y x hz.1 (zpC_ok d v a2 aH (fun q=>(hx q).1) o y x (fun t ht=>by have:=xw t ht;rwa[as t ht]at this) hz2) (fun q=>(hx q).1) (fun q=>(hw q).1)] ·rw[AC hz];exact J def czF(a:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ):Ἂ (Ἂ Ἀ×ἀ):= if h:(∀tlet c:=bA a.1 a.2.1 a.2.2.1 (o*a.2.2.2.1) a.2.2.2.1 h.1 h.2 0 (AS a.2.2.2.1) (AR a.2.2.2.1) (by rw[cZ];simp) (ϟ _) (ϟ _) (λj hj=>by simp at hj);(c.Tz,c.Wz)) a.2.2.2.2 (AS a.2.2.2.2) else #[] @[inline]def czEq(a b:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ):Ἆ:=a.2.2.1==b.2.2.1&&a.2.2.2.1==b.2.2.2.1&&a.2.2.2.2==b.2.2.2.2&&a.2.1==b.2.1&&wcAeq a.1 b.1 theorem czEq_ok(a b:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ)(h:czEq a b=true):a=b:=by obtain⟨a1,a2,a3,a4,a5⟩:=a;obtain⟨b1,b2,b3,b4,b5⟩:=b simp only[czEq,Η,AQ]at h obtain⟨⟨⟨⟨rfl,rfl⟩,rfl⟩,rfl⟩,h1⟩:=h;rw[wcAeq_ok h1] @[noinline]def czS:ST.Ref Unit (Ἂ (WcE czF)):=(ST.Prim.mkRef #[] (Void.mk ())).val noncomputable def zcB(d:CD)(hT:∀tby simp at hj) lemma zcN(K:Ἂ kF)(T:Ἂ Ἀ)(M q k:Ἀ)(o:∀t(bA K T M q k o p t Tz d g e j l).ni=fQ:=by intro m;induction m with |zero=>intros;rw[bA,dite_eq_right (by omega)] |succ m r=>intros;rw[bA,AT (by omega)];dsimp only;split<;>exact r _ _ _ _ _ _ _ (by omega) lemma zcE(d:CD)(hT:∀tby simp at hj) rfl).1, (eM d.K d.T d.M (o*d.k) d.k hT hk _ 0 (AS d.k) (AR d.k) (by rw[cZ];simp) (ϟ _) (ϟ _) (λj hj=>by simp at hj) rfl).2, zcN d.K d.T d.M (o*d.k) d.k hT hk _ 0 (AS d.k) (AR d.k) (by rw[cZ];simp) (ϟ _) (ϟ _) (λj hj=>by simp at hj) rfl⟩ lemma zcH{M:Ἀ}(c:CC M)(e1:c.n=(O0 c.Tz))(e2:c.wo=0):0+(O0 c.Tz)<=(kS c.Wz)/\0+(O0 c.Tz)<2^(32:Ἀ)/\(∀t<(O0 c.Tz),c.Tz[t]!<=M)/\(kS c.Wz)<2^(32:Ἀ):=by have a:=c.h2;have b:=c.h3;have f:=c.h4;rw[e1,e2]at a b;rw[e1]at f;exact⟨a,b,f,c.h5⟩ lemma zcV(d:CD)(hT:∀tif hZ:Z=ἃ then zcD d hT hk v.1 v.2 o ho else dF d Z Wd hT hk hkT hW hY o ho |none=>dF d Z Wd hT hk hkT hW hY o ho lemma zcCq(d:CD)(Z:Ἆ)(Wd:ἀ)(cs:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(hT:∀t let c:=zcC d Z Wd cs hT hk hkT hW hY o ho let u:=dw oneW*dw d.b[o]! if fQ then db Fm d c o q u a else db Fa d c o q u a) 0 0 0 (by simp) (Ah (d.Y*(d.s.h*d.s.w)) 0) @[inline]def ccw{M:Ἀ}(c:CC M)(w:Ἀ)(h2:w+c.n<=(kS c.Wz))(h3:w+c.n<2^32):CC M:=⟨c.Tz,c.Wz,w,c.n,c.ni,c.h1,h2,h3,c.h4,c.h5⟩ def g7w(d:@&CD)(Wd:@&ἀ)(hW:d.Y*d.k<=(kS Wd))(hY:d.Y*d.k<2^(32:Ἀ))(y q:Ἀ)(a:Ἂ Ἃ)(c:CC d.M)(hc:c.Tz=d.T∧c.Wz=Wd∧c.n=d.k∧c.ni=fQ):Ἂ Ἃ:= if hy:y g7w d Wd hW hY y q a c hc=c8 d.Y (d.s.h*d.s.w) 0 0 hN (λo ho q _ _ a=> let c:=zcC d Z Wd cs hT hk hkT hW' hY o ho let u:=dw oneW*dw d.b[o]! if fQ then db Fm d c o q u a else db Fa d c o q u a) y q i hi a:=by intro m;induction m with |zero=>intro y q i hi a c hc H;rw[g7w,c8,dite_eq_right (by omega),dite_eq_right (by omega)] |succ m ih=> intro y q i hi a c hc H;have hy:ycongr 1<;>(rw[zcCq];apply zcX<;>simp only[ccw,dF,dite_eq_right hZ,hc.1,hc.2.1,hc.2.2.1,hc.2.2.2]) def g7(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY else g7w d Wd (hW.resolve_left (fun e=>hz (.inl e))).1 hY 0 0 (Ah (d.Y*(d.s.h*d.s.w)) 0) ⟨d.T,Wd,0,d.k,fQ,hkT,by rw[Κ];exact (lZ _ (ϵ (fun e=>hz (.inr e)))).trans (hW.resolve_left (fun e=>hz (.inl e))).1, by rw[Κ];exact C0 (lZ _ (ϵ (fun e=>hz (.inr e)))) hY,hT,(hW.resolve_left (fun e=>hz (.inl e))).2⟩ ⟨rfl,rfl,rfl,rfl⟩ theorem g7_eq(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY:=by rw[g7];split · rfl · rename_i hz;rw[g7c];exact g7w_eq d Z Wd _ hT hk hkT hW (fun e=>hz (.inl e)) _ hY _ _ 0 0 0 (by simp) _ _ _ rfl lemma g8c(d:CD)(Z:Ἆ)(p:ἀ)(cs:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(hW:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G IX IW IB P:Ἀ) (hs:fP d.s d.kk) (al:0∀qp8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then q/(d.s.h*d.s.w)else 0) (q/(d.s.h*d.s.w)) (q/d.s.w%d.s.h) (q%d.s.w)):=by rw[g7c] obtain⟨aL,ba⟩:=eE d.Y (d.s.h*d.s.w) 0 0 (AO (Y3 (congrArg (0+d.Y*·) Ϧ)) (AN (϶ 32) ς)) (λo A q _ _ a=> let c:=zcC d Z p cs hT l m hW j o A let u:=dw ld*dw d.b[o]! if fQ then db Fm d c o q u a else db Fa d c o q u a) 0 (d.Y*(d.s.h*d.s.w)) (λq=>p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then q/(d.s.h*d.s.w)else 0) (q/(d.s.h*d.s.w)) (q/d.s.w%d.s.h) (q%d.s.w))) (λo A q _ _ a hq hN=>by try dsimp only generalize bv:zcC d Z p cs hT l m hW j o A=c;rw[zcCq]at bv;obtain⟨bG,ix,a7,bp,aH⟩:=fm d Z p hT l m hW j a4 o A c bv;have:=ς;have hV:d.s.w+2<=(kS d.X):=AZ (lZ _ (I9 _)) r;have hK:d.s.w+2by rw[a5 p' hp,(bp s hs).2.2];exact fzD true _ (by unfold aI;split;exact (hx _).1;decide) _ (pZ ⟨_,(hw _).1,rfl⟩) z by_cases hf:fQ=true<;>[rw[AD hf];rw[AC hf]]<;>refine iG2 _ d c o q a _ ?_ (λy' g' r' hy hr hx'=>by rw[jQ2 d c G IX IW IB P ix hs al bq hc hM a3 hT r a5 hx hw hb a0 a1 hL N a2 bh o y' (g'+r') A hy hx' a7 bp aH _ (by unfold dK;exact congrArg (λf=>ao f c.n 0 _) (funext λt=>by rw[lO _ c.Tz[t]! r',pA _ g' r']))] obtain⟨q1,q2,q3⟩:=cf o y' (g'+r') d.s.h d.s.w hy hx';rw[show q+y'*d.s.w+(g'+r')=(o*d.s.h+y')*d.s.w+(g'+r') by rw[hq];ring,q1,q2,q3]) (by omega) (by rw[hN];exact U) (λbb=>by have a6:=gX _ d.s.w _ G _ (d.s.h-1) (d.s.w-1) _ _ rfl rfl (Vu bb Oc) (Vu bB Oc) (hc o A) al rw[<-hM]at a6;exact AZ (Y3 ((congrArg (_+·+_+7) (J4 bB).symm).trans (congrArg (·+7) (lO _ 1 _)))) (AZ a6 r)) exacts[hFm,λ_ _ _ _ _=>rfl]) d.Y 0 0 0 (Ϧ.trans ((Κ _).trans (ϳ _)).symm) (mB (d.Y*(d.s.h*d.s.w)) 0) rfl (ϟ _) ((Κ _).trans (ϳ _)).symm X4 exact mi (aL.trans (X4.trans Ϝ.symm)) λi v bS=>(AB _ i v).symm.trans ((ba i (B5 v aL)).trans ((AD ⟨ϟ _,B5 (B5 v (aL.trans X4)) (Κ _).symm⟩).trans (Λ bS).symm)) lemma g8(d:CD)(Z:Ἆ)(p:ἀ)(hW:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G IX IW IB P:Ἀ) (hs:fP d.s d.kk) (al:0∀qp8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then q/(d.s.h*d.s.w)else 0) (q/(d.s.h*d.s.w)) (q/d.s.w%d.s.h) (q%d.s.w)):=by rw[g7_eq];exact g8c d Z p _ hW G IX IW IB P hs al bq hc hM a3 hT m l j r bR a5 a4 hx hw hb a0 a1 hL N a2 bh bB U def wd(Z:Ἆ)(K:Ἂ Ἃ)(n:Ἀ)(hn:n<2^(32:Ἀ)):{W:ἀ//Z=ἃ\/n<=(kS W)/\(kS W)<2^(32:Ἀ)}:= if hZ:Z=ἃ then⟨AR 0,pZ hZ⟩ else⟨wdU K 0 (G0 n) (zPq n),BA ⟨by rw[wdUz _ _ _ _ _ rfl];exact(zPs n).1,by rw[wdUz _ _ _ _ _ rfl];rcases(zPs n).2.1 with z|z;omega;rw[z];exact hn⟩⟩ lemma tB(kk nc A B:Ἀ)(g:kk=9\/kk=1):∀tpc kk t*A+py kk t*B+px kk t) (nc*kk) (AS (nc*kk)))[t]!<=(nc-1)*A+2*B+2:=by intro t h;rw[iC,AB _ _ (by simpa using h),Λ];dsimp only;have:=jb kk t nc g h;have:=jd kk t;have:=jc kk t;have:pc kk t*A<=(nc-1)*A:=ι _ (by omega);have:py kk t*B<=2*B:=ι _ (by exact jd kk t);omega def lwf(q:Ἂ Ἃ×Ἀ×Ἀ):ἇ×Ἆ×ἀ×Ἂ Ἀ:= let Z:=q.1.any λu=>Core.mW u==0 let a:=Hh q.2.2 let c:=Hh a.2 (aO q.1 0 0,Z,(if h:q.2.1<2^(32:Ἀ) then (wd Z q.1 q.2.1 h).1 else AR 0), da (λt=>pc c.1 t*(Hh a.1).1+py c.1 t*(Hh a.1).2+px c.1 t) (c.2*c.1) (AS (c.2*c.1))) @[noinline]def lwS:ST.Ref Unit (Ἂ (WcE lwf)):=(ST.Prim.mkRef #[] (Void.mk ())).val lemma lwf_T(K:Ἂ Ἃ)(n A B kk nc:Ἀ):(lwf (K,n,U6 (U6 A B) (U6 kk nc))).2.2.2=da (λt=>pc kk t*A+py kk t*B+px kk t) (nc*kk) (AS (nc*kk)):=by simp only[lwf,Nat.unpair_pair] lemma lwf_W(K:Ἂ Ἃ)(n q:Ἀ)(h:n<2^(32:Ἀ)):(lwf (K,n,q)).2.1=ἃ\/n<=(kS (lwf (K,n,q)).2.2.1)/\(kS (lwf (K,n,q)).2.2.1)<2^(32:Ἀ):=by simp only[lwf,AT h];exact (wd _ K n h).2 lemma lwf_D(K:Ἂ Ἃ)(n q:Ἀ)(h:n<2^(32:Ἀ)):(lwf (K,n,q)).2.2.1=(wd (lwf (K,n,q)).2.1 K n h).1:=by simp only[lwf,AT h] lemma lwB(s:ConvShape)(nc Y:Ἀ)(K:Ἂ Ἃ)(lw:{v:ἇ×Ἆ×ἀ×Ἂ Ἀ//v=lwf (K,Y*(nc*(s.kh*s.kw)),U6 (U6 ((s.h+2)*(s.w+2)) (s.w+2)) (U6 (s.kh*s.kw) nc))})(g:s.kh*s.kw=9\/s.kh*s.kw=1): ∀t[exact pZ h.2.2.2.2;exact BA h.2.2.2.2]) g7 ⟨s,I,K,b,xF s I hIs hw32,T,D,J,k,M,L,(I0 (P+2*L-54)),Y,kk, (dP s I hIs hw32 hI hX32 h0).2.1,wlo (P+2*L-54),wsp (P+2*L-54),wok (P+2*L-54) (wlt P L hPL hL),(s.kh==3&&s.kw==3&&s.stride==1&&s.pad==1&&kk==9),rfl,((s.h+2)*(s.w+2)),rfl,(O2 (s.w+2)),rfl,(k/9),rfl⟩ lw.1.2.1 lw.1.2.2.1 hT hk32 hkT (lwW s nc Y K lw hY32) hY32 else dS s J I K b D @[noinline]def fLo(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= fLc s J I K b D nc Y (wcGet3 wcK3eq wcK3eq_ok lwS 32 (K,Y*(nc*(s.kh*s.kw)),U6 (U6 ((s.h+2)*(s.w+2)) (s.w+2)) (U6 (s.kh*s.kw) nc)) (fun k=>k.1)) def fLs(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y n q:Ἀ)(hn:n=Y*(nc*(s.kh*s.kw)))(hq:q=U6 (U6 ((s.h+2)*(s.w+2)) (s.w+2)) (U6 (s.kh*s.kw) nc)) (st:Ἂ (WcE lwf))(i:Nat):{r:Ἂ Ἃ//r=fLo s J I K b D nc Y}:= if h:iwithPtrAddr K (fun p2=> if p1=p2 then (if hk:wcK3eq st[i].k (K,n,q)=true then ⟨fLc s J I K b D nc Y ⟨st[i].v,by rw[st[i].h,wcK3eq_ok _ _ hk,hn,hq]⟩,by unfold fLo;exact congrArg (fLc s J I K b D nc Y) (wcSub _ _)⟩ else ⟨fLo s J I K b D nc Y,rfl⟩) else fLs s J I K b D nc Y n q hn hq st (i+1)) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else ⟨fLo s J I K b D nc Y,rfl⟩ termination_by st.size-i def fL(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= (fLs s J I K b D nc Y (Y*(nc*(s.kh*s.kw))) (U6 (U6 ((s.h+2)*(s.w+2)) (s.w+2)) (U6 (s.kh*s.kw) nc)) rfl rfl (ST.Prim.Ref.get lwS (Void.mk ())).val 0).1 theorem fL_eq(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):fL s J I K b D nc Y=fLo s J I K b D nc Y:=(fLs s J I K b D nc Y _ _ rfl rfl _ 0).2 lemma ev_h1(s:lR)(kk:Ἀ)(a2:0simp only[ConvShape.ho,ConvShape.wo,e,j,l,m,W6]<;>exact⟨J4 a2,J4 aH⟩ lemma ev_h2(P L:Ἀ)(H:P+L<=425)(p:L<=27):P+2*L-54pc (s.kh*s.kw) t*((s.h+2)*(s.w+2))+py (s.kh*s.kw) t*(s.w+2)+px (s.kh*s.kw) t) (d*(s.kh*s.kw)) (AS (d*(s.kh*s.kw))):=by rw[lw.2];exact lwf_T _ _ _ _ _ _ have E4:lw.1.2.2.1=(wd lw.1.2.1 K (Y*(d*(s.kh*s.kw))) v).1:=by rw[lw.2];exact lwf_D _ _ _ v refine (AT ⟨hs,a2,aH,as,ah,X,U,H,p,(by exact U2 G),(by exact U2 aL),(by exact U2 a1),(by exact U2 u),(by exact U2 A),(by exact U2 v),(by exact U2 x),al,hI,(by exact U2 r)⟩).trans ?_ dsimp only obtain⟨hA,hB⟩:=ev_h1 s _ a2 aH hs have hc:∀oby rcases hd with⟨rfl,rfl,rfl⟩ | ⟨rfl,rfl,rfl⟩;exact Y3 (Κ _);exact ho refine (g8 _ _ _ _ d _ _ _ _ (by exact hs) as (by rfl) (by exact hc) (by rfl) (λt ht=>by dsimp only;rw[E3,iC,AB _ _ (by rw[Ϝ];exact ht),Λ]) (lwB s d Y K lw (by rcases hs with h|h<;>[exact pZ h.2.2.2.2;exact BA h.2.2.2.2])) (by exact al) (by exact x) (by exact v) (by exact (dP s I G A hI u a2).1) (by exact (dP s I G A hI u a2).2.1) (by exact (dP s I G A hI u a2).2.2) (λhZ=>by dsimp only;rw[E4,hZ];unfold wd;rw[dite_eq_right lN];dsimp only obtain⟨z1,z2,z3⟩:=zPs (Y*(d*(s.kh*s.kw)));have:=aa _ v intro q hq;exact wdUs K _ aL _ 0 _ rfl (by rw[this];exact z1) (by exact z2.elim (λz=>C0 z (by decide)) (λz=>z.trans_lt v)) (λq hq=>by rw[z3 q hq,AC (by rw[Ϧ];exact C5 _)]) q (by rw[this];exact hq)) (by exact bd I (U1 G ς) ah) (by have g:=bd K (U1 aL ς) (E1▸X);rw[<-E1] at g;exact g) (by exact bd b (U1 a1 ς) U) (le_max_left _ _) (le_max_right _ _) ϙ (by exact p) (by exact H) (by dsimp only;rw[Ϣ,Α (by exact ev_h2 _ _ H p)]) (by exact aH) (by exact r)).trans ?_ rcases hd with⟨rfl,rfl,rfl⟩ | ⟨rfl,rfl,rfl⟩<;>simp only[dS,fT,ἁ,ἂ] all_goals simp only[conv2dSpec,conv2dWith,depthwiseSpec,depthwiseWith,hA,hB] refine mi (by rw[Ϝ,Ϝ,hA,hB]) λq e _=>?_ simp only[ag,Λ] refine congrArg (p8 _) ?_ rw[aB_eq];simp only[Dense.bO,Ϛ,n4,ϳ,Κ] lemma ev(s:lR)(J:Ἆ)(I K b:Ἂ kF)(D:Ἆ)(d Y:Ἀ) (hd:D=false/\d=s.cin/\Y=s.cout\/D=true/\d=1/\Y=s.cin): fL s J I K b D d Y=dS s J I K b D:=by rw[fL_eq];unfold fLo refine (Classical.em _).elim (λhg=>?_) (λhn=>by exact dite_eq_right hn) exact (ev_h3 s J I K b D d Y hd (wcGet3 wcK3eq wcK3eq_ok lwS 32 (K,Y*(d*(s.kh*s.kw)),U6 (U6 ((s.h+2)*(s.w+2)) (s.w+2)) (U6 (s.kh*s.kw) d)) (fun k=>k.1)) hg.1 hg.2.1 hg.2.2.1 hg.2.2.2.1 hg.2.2.2.2.1 hg.2.2.2.2.2.1 hg.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.2.1 (by exact Z4 hg.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1) hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1 (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2)) theorem s5c1(s:ConvShape)(J:Ἆ)(I K b:Ἂ Word)(e:s.kh=1)(g:s.kw=1)(j:s.stride=1)(l:s.pad=0)(p:0act J (dotOf (s.cin+1) (fun t=>if tif tby rw[z] at w8;exact w8 rfl) have hw:0push_cast<;>ring lemma bf: (mJ (sk u))=if (mJ u)<2^(31:Ἀ) then (mJ u)+2^(31:Ἀ) else if (mJ u)=2^(31:Ἀ) then 2^(31:Ἀ) else 2^(32:Ἀ)-1-(mJ u):=by have:=u.toNat_lt;rw[sk];simp only[Ι,AQ,<-Β,kN,nr];split_ifs<;>simp only[mh,pU,kN,nr];exact γ (by omega);omega lemma ga_h1(x y N:Ἀ)(d:xzz%N=z-N:=λz i j=>(K8 i).trans (γ (D4 i j)) have P:∀z,00C0 (ϟ _) (dv 0 z i) (Z7 x N).elim (λhx=>(Z7 y N).elim (λhy=>lt_of_eq_of_lt (AC (I8.2 hx)) (lt_of_lt_of_eq (Zp.2 (dv _ _ (lt_of_eq_of_lt (γ hx) (lt_of_lt_of_eq (Nat.lt_of_add_lt_add_right (lt_of_eq_of_lt (AD hx).symm (lt_of_lt_of_eq h (AD hy)))) (γ hy).symm)))) (AC (I8.2 hy)).symm)) λhy=>have h:=lt_of_eq_of_lt (AD hx).symm (lt_of_lt_of_eq h (AC (O3.2 hy)));absurd (if e:y=N then lt_of_lt_of_eq h (AD e) else I4 (U1 (lt_of_lt_of_eq h (AC e)) (N9 hy _)) q) (O3.2 (N2 _ _))) λhx=>(Z7 y N).elim (λhy=>have h:=lt_of_eq_of_lt (AC (O3.2 hx)).symm (lt_of_lt_of_eq h (AD hy));lt_of_eq_of_lt (AD hx) (lt_of_lt_of_eq (if e:x=N then Int.lt_of_le_of_lt (Km (G6 _)) (Ow.2 (P _ (lt_of_lt_of_eq (Nat.lt_add_left_iff_pos.1 (lt_of_eq_of_lt (AD e).symm h)) (γ hy).symm))) else Uj (Int.neg_neg_of_pos (Ow.2 (P _ (lt_of_lt_of_eq (Ku (W5 hx (Ww e))) (M x hx d).symm)))) (G6 _)) (AC (I8.2 hy)).symm)) λhy=>have h:=lt_of_eq_of_lt (AC (O3.2 hx)).symm (lt_of_lt_of_eq h (AC (O3.2 hy)));lt_of_eq_of_lt (AD hx) (lt_of_lt_of_eq (Int.neg_lt_neg (Zp.2 (dv _ _ (lt_of_eq_of_lt (M y hy g) (lt_of_lt_of_eq (if e:y=N then lt_of_eq_of_lt ((congrArg (·-N) e).trans (Nat.sub_self N)) (Ku (W5 hx λf=>N4 _ (lt_of_eq_of_lt (AD f.symm).symm (lt_of_lt_of_eq h (AD e))))) else have h:=lt_of_lt_of_eq h (AC e);if f:x=N then absurd (I4 (U1 (lt_of_eq_of_lt (AD f).symm h) (N9 hy _)) q) (N4 _) else Hf hy (J8 λl=>O3.2 (N9 l _) (lt_of_eq_of_lt (AC f).symm h))) (M x hx d).symm))))) (AD hy).symm) lemma ga(a b:ἇ)(h:sk aby rw[<-ϖ,lG,kv];push_cast;rw[Ac AL,AA];ring have e:(0:ℝ)<2^(-149:Ἁ):=(by positivity);cases h:compare (kv y) (kv z);rw[Model.cmpDyadic_lt_iff,d,d];exact AI (mod_cast compare_lt_iff_lt.1 h) e;rw[Model.cmpDyadic_eq_iff,d,d,compare_eq_iff_eq.1 h];rw[Model.cmpDyadic_gt_iff,d,d];exact AI (mod_cast compare_gt_iff_gt.1 h) e lemma co(e:kM u=0):u=0\/u=0x80000000:=by have j:=u.toNat_lt;rw[kM]at e;split_ifs at e with g .have d:=aZ u;have l:=aP u;rw[g]at d;rw[<-Β,<-Β];simp at d⊢;omega .omega lemma be:lI (mx y z)=nt (lI y) (lI z):=by rw[Conv.mx];split .rename_i h;have e:=kV y h.1;have g:=kV z h.2.1;have j:Model.compare (lI y) (lI z)=pj _:=Model.compare_eq_some_cmpDyadic_of_toDyadic? _ _ e g;rw[g6]at j;rw[nt,Model.Internal.Value.maximum,Model.withNaNSelection_of_none _ _ ((Model.chooseNaN2_eq_none_iff _ _).2 ⟨Χ e,Χ g⟩:Model.chooseNaN2 (lI y) (lI z)=none),Model.compareNonNaN_eq_of_compare_eq_some _ _ _ _ j];rcases h.2.2 with d|d|rfl;rw[AD d,compare_lt_iff_lt.2 (ga y z d)];rw[AC (nP d),compare_gt_iff_gt.2 (ga z y d)];rw[AC (UInt32.lt_irrefl _),compare_eq_iff_eq.2 rfl];by_cases l:kM y=0;rcases co y l with rfl|rfl<;>decide;simp[(by rw[lI,Model.isZero_eq_beq_zero_of_toDyadic?_some e,decodeD_sig_zero];simpa using l:Zq (lI y)=ἄ)] exact aR _ lemma fn(w k U n:Ἀ)(e:0nt m (lI I[U+t/k*w+t%k]!)) (lI d):=by rw[gc _ _ _ _ _ _ _ e,List.foldl_hom lI];exact λ_ _=>(be _ _).symm lemma iP: ps (kT u:Model lU)=u:=by show BG (kT u:Model lU).bits=u;rw[pu] lemma aS(d:kB u≠0): nh u=⟨k9 u,2^(23:Ἀ)+(mJ (lK u)),((mJ (kB u)):Ἁ)-150⟩:=by rw[nh];rw[AC d] lemma cM(f:Ἀ)(e:f<2^(23:Ἀ)): lf (2^(23:Ἀ)+f) (2^(23:Ἀ))=0:=by have d:(Aq (2^(23:Ἀ)+f))=23:=by rw[mz (by exact Ww (NeZero.ne' (2^23+f)))];constructor<;>omega rw[lf];rw[d,Nat.log2_two_pow];simp[mM,mZ,ο]<;>exact Nat.add_lt_of_lt_sub' e lemma eO:la (m*2^(23:Ἀ)) (2^(23:Ἀ))=m:=by rw[la];simp only [nr,Ol,mul_zero,Nat.ofNat_pos, ↓reduceIte,Ak,Wm,not_false_eq_true,mul_div_cancel_right₀] lemma hO_h1(er ed q:Ἀ)(M:ed=q+127)(x:q127)∧¬((er:Ἁ)-150-((ed:Ἁ)-150)< -150)∧¬((er:Ἁ)-150-((ed:Ἁ)-150)< -126)∧(J7 ((er:Ἁ)-150-((ed:Ἁ)-150)+127))=er-q:=by subst M;refine⟨?_,?_,?_,?_⟩<;>omega lemma hO_h2(r q e:ἇ)(N:(mJ (kB r))=(mJ r)/2^(23:Ἀ)%256)(O:(mJ (lK r))=(mJ r)%2^(23:Ἀ))(x:(mJ q)<(mJ (kB r)))(hle:(mJ q)*2^(23:Ἀ)<=(mJ r))(g:(mJ e)=(mJ r)-(mJ q)*2^(23:Ἀ)):k9 e=k9 r∧(mJ (kB e))=(mJ (kB r))-(mJ q)∧(mJ (lK e))=(mJ (lK r)):=by refine⟨?_,?_,by rw[aP e,g,Ϗ (mJ q),Nat.sub_mul_mod ((Ϗ (2^(23:Ἀ)) (mJ q)).trans_le hle),O]⟩ ·rw[ϓ,ap,ap,g,((by decide):2^(31:Ἀ)=256*2^(23:Ἀ)),<-mc (϶ 23),<-mc (϶ 23),Ϗ (mJ q),Ox];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=u at x⊢ exact⟨λh=>h.trans (Y4 _ _),λh=>by rw[<-Wa u 256,Qf x.le];exact (U3 256 (Gf h ((by decide):0<256))).trans (N2 _ _)⟩ ·rw[aZ e,g,Ϗ (mJ q),Ox,N];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=a at x⊢ have h:=Wa a 256;have t:=ϊ a ((by decide):256>0) generalize a%256=s at x h t ⊢;generalize a/256=k at h;subst h rw[Qf x.le,Kc,γ ((Y4 _ _).trans_lt t)] lemma hO(q:ἇ)(p:lK d=0)(u:k9 d=ἄ) (M:(mJ (kB d))=(mJ q)+127)(v:kB d≠255) (x:(mJ q)<(mJ (kB r)))(j:kB r≠255): kW (pf (lI r) (lI d))=r-(q<<<23):=by have N:=aZ r have O:=aP r have U:(mJ (kB r))≠255:=λh=>j (Β.1 (by simpa using h)) have E8:(mJ (kB r))<256:=N.trans_lt (ϊ _ ((by decide):256>0)) have hh:=hO_h1 _ _ _ M x (W5 (U2 E8) U) rw[ny] rw[p0,lI,lI,kV r j,kV d v,aS r (λh=>by simp[h]at x),aS d (λh=>by simp[h]at M),p,u] have l:((2:Ἀ)^(23:Ἀ)==0)=ἄ:=(by decide) have m:(2^(23:Ἀ)+(mJ (lK r))==0)=ἄ:=(by simp) simp only[nj,ϑ,Bool.xor_false,l,m,fT,ἂ] change kW (n6 FloatFormat.binary32 (k9 r) (2^(23:Ἀ)+(mJ (lK r))) (2^(23:Ἀ)) _)=_ rw[<-nA,bD] rw[pC,cM _ (fracOf_toNat_lt r)] simp only[l,m,fT,ἂ,Ai,sub_zero] rw[AC hh.1,AC hh.2.1,AC hh.2.2.1] have D:(2^(23:Ἀ)+(mJ (lK r))).shiftLeft 23=(2^(23:Ἀ)+(mJ (lK r)))*2^(23:Ἀ):=ο _ _ rw[show(23:Ἁ)=Uc 23 from ἅ,mw,D,eO] simp only[(beq_eq_false_iff_ne.2 (W8 ((O1 (fracOf_toNat_lt r) _).trans_eq ((by decide):2^(23:Ἀ)+2^(23:Ἀ)=p7 24))):((2^(23:Ἀ)+(mJ (lK r)):Ἀ)==p7 24)=ἄ),fT,ἂ] rw[AC hh.1] set e:=r-(q<<<23)with F have o:(mJ (q<<<23))=(mJ q)*2^(23:Ἀ):=by rw[ϴ];simp only[kN,kH,ο];exact γ ((ϐ (x.trans E8) (϶ 23)).trans_le (by decide)) have hle:(mJ q)*2^(23:Ἀ)<=(mJ r):=(ι _ (x.le.trans (N.trans_le (Ay _ _)))).trans (pr _ _) have g:(mJ e)=(mJ r)-(mJ q)*2^(23:Ἀ):=by rw[F,nG _ _ (by rw[C6,o];exact hle),o] rw[<-n7] conv_rhs=>rw[<-iP e,ofUInt32_eq_ofFields] obtain⟨z1,z2,z3⟩:=hO_h2 r q e N O x hle g rw[z1,z2,z3,hh.2.2.2,((by decide):p7 23=2^(23:Ἀ)),ϱ] lemma i9(s:kF)(h:s&&&0x7FFFFFFF=0):s=0\/s=0x80000000:=by have e:=s.toNat_lt;have d:(mJ (s&&&0x7FFFFFFF))=(mJ s)%2^(31:Ἀ):=by rw[Ξ,show(mJ (0x7FFFFFFF:ἇ))=2^(31:Ἀ)-1 from ἅ,ζ] rw[h]at d;rw[<-Β,<-Β];simp at d⊢;(clear * - e d;omega) lemma cg(e:r=0\/r=0x80000000)(g:kB d≠0)(j:kB d≠255)(l:k9 d=ἄ): kW (pf (lI r) (lI d))=r:=by rw[ny,p0,lI,lI,kV r (by rcases e with rfl|rfl<;>decide),kV d j,aS d g,l,(by rcases e with rfl|rfl<;>rfl:nh r=⟨k9 r,0,0⟩)];simp[(by simp:(2^(23:Ἀ)+(mJ (lK d))==0)=ἄ)];rcases e with rfl|rfl<;>rfl lemma aX{a b:ἇ}(h:aby have:=Ι.mp h;rw[e]at this;exact (lt_self_iff_false b.toNat).mp this abbrev av:Ἃ:=toWord (Ar (ofW (dotOf n fa λ_=>oneW)) (ofW d)) lemma gl(v:DQ d):eX r d=kW (pf (lI r) (lI d)):=by obtain⟨e,l,m⟩:=v;have g:=aX m;dsimp only[eX];split;obtain⟨q,j,o,p⟩:=‹_/\_›;exact(hO r d _ q e (by rw[nG _ _ j];have:=C6.1 j;simp at this⊢;(clear * - this;omega)) g (Ι.1 o) (aX p)).symm;split;exact(cg r d (i9 r ‹_›) l g e).symm;exact dvN_eq r d lemma gp(g:Ἀ->ἆ)(m:Ἀ):∀d:ἆ, Z ((lj m).foldl (λd t=>d+g t) d)=Z d+∑t∈kP m,Z (g t):=by induction m with |zero=>intro d;simp only [nr,Wg,mT,range_zero,sum_empty,Av] |succ m e=> intro d;rw[mD,l6,Ϸ,mT,fI,e,Ν];ring lemma jB:ae 0=0:=by rw[eQ];rfl lemma gK: (decide (kM u*kM ld=0)&&Bool.xor (k9 u) (k9 ld))=(u==0x80000000):=by by_cases d:kM u=0 .rcases co u d with rfl|rfl<;>decide have:(u==0x80000000)=ἄ:=by simp;rintro rfl;exact d (by decide) rw[this,((by decide):kM ld=2^(23:Ἀ)),((by decide):k9 ld=ἄ)];simp[d] lemma dW(c:Ἀ):∀i,i+c<=n-> (nC (kK (n:=n) λj=>fa (C7 j)) (kK (n:=n) λ_=>ld) i c=ἃ↔ ∀t,i<=t->t< i+c->fa t=0x80000000):=by induction c with |zero=>intro i _;simp[nC];intro t d e;(clear * - d e;omega) |succ c l=> intro i m rw[nC,ab n fa i (by exact Gk m),ab n (λ_=>ld) i (by exact Gk m), gK,Η,l (i+1) (by (clear * - m;omega)),AQ] constructor .rintro⟨d,e⟩ t g o rcases BJ g with h|h .subst h;exact d .exact e t (by exact Order.add_one_le_iff.mpr h) (by (clear * - o;omega)) .intro h;exact⟨h i (le_refl _) (by (clear * -;omega)),λt d e=>h t (by exact X5 d) (by (clear * - e;omega))⟩ lemma eW(O:0ld)=0)(g:Ἆ)(L:g=ἃ↔∀tld)=if g then 0x80000000 else 0:=by have G:=cH n fa (λ_=>ld);have H:=dW n fa n 0 (by (clear * -;omega));have D:=ab n fa;have F:=ab n λ_=>ld;have d:=Ϝ (f:=λi:Fin n=>fa (C7 i));have p:=Ϝ (f:=λ_:Fin n=>ld);rw[ms];unfold dotSpec;rw[←Model.Reduction.map_value_dot];generalize (kK (n:=n) λi=>fa (C7 i))=A,(kK (n:=n) λ_:Fin n=>ld)=B at* have l:∀k,0<=k->k<0+(O0 (A.map (kT (fmt:=lU))))->kB A[k]!≠255/\kB B[k]!≠255:=λk _ e=>by rw[m0,d]at e;rw[D k (by (clear * - d p e;omega)),F k (by (clear * - d p e;omega))];exact⟨v k (by (clear * - d p e;omega)),(by decide)⟩ have q(X:Ἂ ἇ):(O0 X)=n->(∀k∀k (e:k<(O0 (X.map (kT (fmt:=lU))))),mN (X.map (kT (fmt:=lU)))[k]=ἃ:=by intro N K k e;rw[m0]at e;have j:=K k (by exact B5 e N);rw[AB X k e]at j;simp[m6,j] have m:(O0 (A.map (kT (fmt:=lU))))=(O0 (B.map (kT (fmt:=lU)))):=by simp[d,p] have r:=q A d λk e=>(l k (by exact ϟ k) (by simp[d];exact D7 e)).1;have u:=q B p λk e=>(l k (by exact ϟ k) (by simp[d];exact D7 e)).2;have o:=ϯ (destination:=lU) _ _ m;rw[finiteDotSlice_eq A B 0 _ (by simp) (by rw[<-m];simp) l,m0,d,G,I,lH,nv]at o;rw[Ϭ lU _ _ .nearest m r u ((ϲ _).1 o)];simp only[Except.map] obtain⟨j,x⟩:=dotStateLoop_flags A B ({}:me lU) 0 _ (by simp) (by rw[<-m];simp) l;rw[lT,j,x];simp only[m0,d,(by rw[ϓ,H,L];exact⟨λh t M=>h t (by exact ϟ t) (by exact Ga 0 M),λh t _ M=>h t (by (clear * - d p M;omega))⟩:nC A B 0 n=g)];cases g<;>simp[show n≠0 by omega]<;>rfl lemma dk(w k U m:Ἀ)(l:0(S9.1 d).elim (g t) λe=>e▸j,λh=>⟨λt d=>h t (by exact Oh 1 d),h m (by exact lt_add_one m)⟩ lemma cu(d y x t:Ἀ): I[(d*h+y*k)*w+x*k+t/k*w+t%k]! =nI h w k I d y x t:=by congr 1;ring lemma eg(B c A H:ἆ)(D:(lq B)<=255)(G:(lq c)<=62)(J:0ἆ)(L M:Ἁ) (T:∀tἎ)(I:g ()=true↔∀tkF) (v:q ()=ms n fa λ_=>ld)(d:kF)(m:DQ d): wo B A H g q d=av n fa d:=by have p:=λt e=>dI c B _ D G (u t e);have K:=A3.1 (cJ n _ _ λt e=>(T t e).2.1);have N:=A3.1 (cJ n _ _ λt e=>(T t e).2.2);have o:af n fa (λ_=>ld)=(∑t∈kP n,bU (lq B) (fa t))*2^((lq B)+149):=by rw[n8];refine ϔ ἅ λt e=>?_;rw[fB _ ld _ 126 ((p t (mr e)).2.imp_right (·.1)) (BA (by decide)),((by decide):bU 126 ld=2^(23:Ἀ))];ring rw[<-ϔ ἅ λt e=>(T t (mr e)).1,nJ,<-n8,<-sZ A (∑t∈kP n,ae (l (fa t))) (by simp only[x,gS,Jg]) ((neg_le_neg O.le).trans K.1) (K.2.trans_lt O),<-sZ H (∑t∈kP n,ae (j (fa t))) (by simp only[F,gS,Jg]) ((neg_le_neg U.le).trans N.1) (N.2.trans_lt U)]at o;rw[wo,av];split;next r=>rw[r.1,r.2,jB]at o;rw[eW n fa J (λt e=>(p t e).1) (by rw[o];ring) _ I,cg _ d (by split<;>simp) m.2.1 (aX m.2.2) m.1] .rw[gl _ d m];refine congrArg (λs=>kW (pf (lI s) (lI d))) ?_;rw[Dense.dp,dY];split .refine(aY n fa _ _ _ _ (λt e=>⟨(p t e).1,(by decide)⟩) ?_ ‹_›).symm;rw[o,eU,(by simp[η];(clear * - D;omega):(lq (B+149))=(lq B)+149)] .exact v lemma ee(c:ἆ)(x:kF)(g:(lq B)<=255)(m:(lq c)<=37)(h:ok c B x=true): ae 0*2^(25:Ἀ)+ae (t1 B x)=bU (lq B) x/\|ae (t1 B x)|<=2^(24+(lq c))-1/\ |ae 0|<=0:=by obtain⟨-,j⟩:=dI c B x g (by (clear * - m;omega)) h;obtain⟨l,d⟩:=fw B x c.toNat (by (clear * - m;omega)) j;have k:=Int.le_sub_one_of_lt (Zp.mpr d);rw[<-nE (kM x*_),G4,B4,B4,nZ]at k;rw[jB,(by rw[t1,bU,sv,jj _ _ (by rw[l];exact d.trans_le (Θ (by decide) (by (clear * - m;omega)))),l];cases k9 x<;>simp only[fT,ἁ,Am,neg_mul,G4,B4,nZ]:ae (t1 B x)=bU B.toNat x)];refine⟨by rw[nv,Ai],?_,A5.le⟩;rw[bU,sv];cases k9 x<;>simp only[fT,ἁ,Am,neg_mul,BE,k] lemma em(f:kF->ἆ)(h w k:Ἀ)(I:Ἂ kF)(d y x:Ἀ)(e:0by interval_cases t<;>assumption, λH=>⟨⟨⟨H 0 (by decide),H 1 (by decide)⟩,H 2 (by decide)⟩,H 3 (by decide)⟩⟩ lemma ia:(lq (eF u))=(mJ (kB u)):=by rw[eF,kB];simp only [UInt32.toUInt64_and,UInt32.toUInt64_shiftRight,Kl,UInt32.toUInt64_ofNat,UInt64.reduceMod,Ε,ν,ϩ,kA,kH,Ξ,Υ,kN] lemma ik(x:kF):aq x<=255:=by rw[aq];split .rw[θ,am];rw[kG];have:=mO x;split<;>simp<;>exact X5 this .exact Pf _ lemma mn(a b:ἆ):(lq (po a b))=po (lq a) (lq b):=by show(lq (if a<=b then a else b))=_;split<;>rename_i h .have:=θ.mp h;exact Eq.symm (R9 h) .have:=mt θ.mpr h;exact Eq.symm (Std.LawfulOrderLeftLeaningMin.min_eq_right a.toNat b.toNat h) lemma dH(a b:ἆ):po a b<=a:=θ.mpr (by rw[mn];exact O7 a.toNat b.toNat) lemma fX(a b:ἆ):po a b<=b:=θ.mpr (by rw[mn];exact Jp a.toNat b.toNat) lemma fZ(a b:ἆ):a<=max a b:=by show a<=if a<=b then b else a;split<;>simp_all lemma f0(a b:ἆ):b<=max a b:=by show b<=if a<=b then b else a;split<;>rename_i h<;>simp_all[θ];exact X5 h lemma cQ(x:kF)(B M:ἆ)(d:B<=aq x)(r:eF x<=M)(p:M<=po (B+37) 254) (o:B<=255):ok 37 B x=ἃ:=by have q:=(ia x).ge.trans (θ.1 r);rw[θ,mn,η,Oy]at p;simp only[ok,Η,AM,nM,AQ] refine⟨λe=>absurd ((congrArg mJ e).ge.trans (q.trans p.2)) (by decide),?_⟩ by_cases m:mW x=0;exact pZ m;right;rw[aq,AD (AM.2 m)]at d;apply A6 rw[θ,χ _ _ d,am];exact tsub_le_iff_left.2 ((Dense.aT x).trans_le ((Y4 _ _).trans (q.trans (p.1.trans (Ay _ _))))) lemma ki(d e g j:kF) (h:max (max (eF d) (eF e)) (max (eF g) (eF j))<=po (po (po (aq d) (aq e)) (po (aq g) (aq j))+37) 254): po (po (aq d) (aq e)) (po (aq g) (aq j))<=255/\ cV (ok 37 (po (po (aq d) (aq e)) (po (aq g) (aq j)))) d e g j=ἃ:=by have l:po (po (aq d) (aq e)) (po (aq g) (aq j))<=255:= ϗ (ϗ (dH _ _) (dH _ _)) (ik d);simp only[cV,Η];use l,⟨⟨cQ _ _ _ (ϗ (dH _ _) (dH _ _)) (ϗ (fZ _ _) (fZ _ _)) h l,cQ _ _ _ (ϗ (dH _ _) (fX _ _)) (ϗ (f0 _ _) (fZ _ _)) h l⟩,cQ _ _ _ (ϗ (fX _ _) (dH _ _)) (ϗ (fZ _ _) (f0 _ _)) h l⟩,cQ _ _ _ (ϗ (fX _ _) (fX _ _)) (ϗ (f0 _ _) (f0 _ _)) h l @[inline]def pTt(B:ἆ)(u:Ἃ):ἆ:=mW u<<<(iW u-B) lemma pML(a b c e:kF)(h:max (max a b) (max c e)<0x7F800000):a.toNat<2139095040∧b.toNat<2139095040∧c.toNat<2139095040∧e.toNat<2139095040:=by have h:=Ι.1 h;simp only[nw]at h;simp at h;omega lemma pKq(x y:kF)(hy:y.toNat<2139095040)(hxy:x.toNat<=y.toNat):eF x<=eF y∧(0aq x<=aq y):=by have Q:∀u:kF,u.toNat<2139095040->0(aq u).toNat=u.toNat/8388608-(if u.toNat/8388608=0 then 0 else 1):=fun u h1 h2=>by unfold aq;rw[AD];rw[am];unfold idxOf;split<;>rename_i g ·have:=congrArg mJ g;rw[wEx]at this;simp at this;omega ·have g:(expOf u).toNat≠0:=fun q=>g (Β.1 (by rw[q];rfl));rw[wEx]at g⊢;split<;>omega ·simp only[AM,Ak];intro q;have:=congrArg lq q;rw[an]at this;unfold mantOf at this;split at this<;>rename_i g ·have g:=congrArg mJ g;rw[wEx]at g;rw[wFr]at this;simp at g this;omega ·simp at this refine⟨θ.2 (by rw[ia,ia,wEx,wEx];omega),fun h=>θ.2 (by rw[Q x (by omega) h,Q y hy (by omega)];split<;>split<;>omega)⟩ lemma pKz(a b c e x:kF)(hx:x=a∨x=b∨x=c∨x=e)(h0:0by rw[pU];simp;omega rw[mh];simp only[UInt32.toNat_min,Og] have m:min (min (a-1).toNat (b-1).toNat) (min (c-1).toNat (e-1).toNat)<=(x-1).toNat:=by rcases hx with rfl|rfl|rfl|rfl<;>simp only[min_le_iff,le_refl,true_or,or_true] generalize min (min (a-1).toNat (b-1).toNat) (min (c-1).toNat (e-1).toNat)=M at m⊢;rw[S]at m;have:=x.toNat_lt;omega lemma pKj(a b c e:kF)(hM:max (max a b) (max c e)<0x7F800000)(hc:eF (max (max a b) (max c e))<=aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)+37): aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)<=255/\cV (ok 37 (aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1))) a b c e=ἃ:=by have l:=ik (min (min (a-1) (b-1)) (min (c-1) (e-1))+1) have hm:(max (max a b) (max c e)).toNat<2139095040:=Ι.1 hM have p:eF (max (max a b) (max c e))<=po (aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)+37) 254:=by rw[θ,mn,Oy];refine⟨θ.1 hc,?_⟩;rw[ia,wEx];simp only[kA];omega have G:∀x,(x=a∨x=b∨x=c∨x=e)->ok 37 (aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)) x=ἃ:=fun x hx=>by have hxM:x.toNat<=(max (max a b) (max c e)).toNat:=by simp only[nw];rcases hx with rfl|rfl|rfl|rfl<;>omega refine cQ x _ _ ?_ (pKq x _ hm hxM).1 p l by_cases z:x.toNat=0 ·rw[show x=0 from Β.1 (by rw[z];rfl)];exact l ·have k:=pKz a b c e x hx (by omega);exact (pKq _ x (by omega) k.2).2 k.1 refine⟨l,?_⟩;simp only[cV,Η];exact⟨⟨⟨G a (by simp),G b (by simp)⟩,G c (by simp)⟩,G e (by simp)⟩ lemma pTtE(B:ἆ)(u:kF)(h:u.toNat<2139095040):pTt B u=t1 B u:=by unfold pTt t1 sg;rw[fy,AC (by rw[ap];omega)] lemma gU_h1{P w:Ἀ}(G:P+w+1<2^(31:Ἀ)):(P+1)%2^nx=P+1/\(P+w)%2^nx=P+w/\(P+w+1)%2^nx=P+w+1/\w<2^(32:Ἀ):= have c:2^(31:Ἀ)<=2^(32:Ἀ):=by decide have K:=G.trans_le (c.trans dj) ⟨γ ((L1 (V1 P w) 1).trans_lt K),γ ((Xa _).trans K),γ K,(N2 w P).trans_lt ((Xa _).trans (G.trans_le c))⟩ lemma dO(f:Ἀ->Ἀ->Ἀ->kF) (e:∀d y x,f d y x=av (k*k) (nI h w k I d y x) (natW (k*k))): eT c (h/k) (w/k) f=n9 c h w k I:=by rw[iO];rw[n9];refine mi (by simp[pa]) λq _ _=>?_ simp only[ag,Λ,pa];exact e _ _ _ theorem gI_h1(a b n:Ἀ)(q:a-b=n+1):bdf I B d r e l=(lj m).foldl (λa j=>a+t1 B I[(J0 e)+j]!) l:=by have g:∀i o,I.uget i o=I[(J0 i)]!:=λi o=>(AB I _ o).symm;intro m;induction m<;>intro e l q;rw[df,dite_eq_right (mt ε.1 (gI_h2 _ _ q))];rfl;rename_i u;obtain⟨h0,h1⟩:=gI_h1 _ _ _ q;have h:efunext λt=>by rw[e,pA,Au]) .rfl lemma jL(m:Ἀ)(h:m<16384):(lq (cK m))<=37/\(m:Ἁ)*(2^(24+(lq (cK m)))-1)<2^(63:Ἀ):=by rw[cK];split_ifs<;>simp only [kA,Nat.reduceLeDiff,Xo,Xl,Int.reduceSub,true_and]<;>omega @[noinline]def cUe(w:Ἀ)(I:Ἂ Ἃ)(e:Ἀ):Ἃ:=dotOf (2*2) (λt=>I[e+t/2*w+t%2]!) λ_=>oneW lemma cUq(h w:Ἀ)(I:Ἂ Ἃ)(ch y x:Ἀ):cU h w 2 I ch y x=cUe w I ((ch*h+y*2)*w+x*2):=by unfold cU cUe;congr 1;funext t;exact (cu h w 2 I ch y x t).symm @[inline]def gTm(w:Ἀ)(ww:Ἄ)(I:@&Ἂ Ἃ)(d:Ἃ)(e:Ἄ):Ἃ:= if hb:eἄ) (λ_=>cUe w I (J0 e)) d else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) else let B:=min (min (aq x0) (aq x1)) (min (aq x2) (aq x3)) if max (max (eF x0) (eF x1)) (max (eF x2) (eF x3))<=min (B+37) 254 then wo B (t1 B x0+t1 B x1+t1 B x2+t1 B x3) 0 (λ_=>cV (.==0x80000000) x0 x1 x2 x3) (λ_=>cUe w I (J0 e)) d else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) lemma gU(B:DQ d)(j y x:Ἀ)(e:Ἄ) (D:(J0 e)=(j*h+y*2)*w+x*2)(G:(j*h+y*2)*w+x*2+w+1<2^(31:Ἀ)): gTm w (G0 w) I d e=av (2*2) (nI h w 2 I j y x) d:=by have q:=cu h w 2 I j y x;have p:=q 0;have r:=q 1;have u:=q 2;have v:=q 3;simp only[Nat.reduceDiv,kH,nv,n4,Av]at p r u v;have m:kW (pf (lI (cUe w I ((j*h+y*2)*w+x*2))) (lI d))=av (2*2) (nI h w 2 I j y x) d:=(by rw[←cUq];rfl);have H:=gU_h1 G;have g:∀i o,I.uget i o=I[(J0 i)]!:=λi o=>(AB I _ o).symm;dsimp only[gTm];simp only[D];split;swap;exact m;simp only[g,lJ,mA,aa _ H.2.2.2,H,D,p,r,u,v];split;rename_i hM;split;swap;exact m;rename_i hc;have l:=pKj _ _ _ _ hM hc;have A:=(cW _ (nI h w 2 I j y x)).1 l.2;have L:=pML _ _ _ _ hM;rw[pTtE _ _ L.1,pTtE _ _ L.2.1,pTtE _ _ L.2.2.1,pTtE _ _ L.2.2.2];exact eg _ _ _ 37 _ _ (cB l.1) (by decide) (by decide) A _ (λ_=>0) _ 0 (λt F=>ee _ _ _ (cB l.1) (by decide) (A t F)) (by decide) (by decide) (by simp only[fI,show 2*2=4 from ἅ,Ν,I7,Ai]) (by simp[bF]) _ ⟨fun h=>absurd h (by decide),fun h=>absurd (h 0 (by decide)) (fun q=>by have:=L.1;rw[q]at this;simp at this)⟩ _ (by rw[←cUq];rfl) d B;split;swap;exact m;rename_i l;have l:=ki _ _ _ _ l;have A:=(cW _ (nI h w 2 I j y x)).1 l.2;exact eg _ _ _ 37 _ _ (cB l.1) (by decide) (by decide) A _ (λ_=>0) _ 0 (λt F=>ee _ _ _ (cB l.1) (by decide) (A t F)) (by decide) (by decide) (by simp only[fI,show 2*2=4 from ἅ,Ν,I7,Ai]) (by simp[bF]) _ (by rw[cW];simp only[AQ]) _ (by rw[←cUq];rfl) d B lemma qVm(r x W:Ἀ)(hx:xἋ)(W2 H2 st sk:Ἄ)(q e ox oy:Ἄ)(a:Ἂ Ἃ):Ἂ Ἃ:= if hq:qἋ)(F:Ἀ->Ἃ)(E:Ἀ->Ἀ->Ἀ->Ἀ)(C H W R S:Ἀ)(Wu Hu st sk:Ἄ) (hW:(J0 Wu)=W)(hH:(J0 Hu)=H)(hst:(J0 st)=R)(hsk:(J0 sk)=S)(W0:0bxE a b x<2^(32:Ἀ)) (hf:∀a b x (e:Ἄ),abx(J0 e)=E a b x->f e=F ((a*H+b)*W+x)): ∀m(a b x:Ἀ)(q e ox oy:Ἄ)(A:Ἂ Ἃ),C*H*W-(J0 q)=m->(O0 A)=C*H*W->(J0 q)=(a*H+b)*W+x->a<=C->bx (J0 ox)=x->(J0 oy)=b->(J0 e)=E a b x->(∀j<(J0 q),A[j]! =F j)->pQ f Wu Hu st sk q e ox oy A=ag (C*H*W) F:=by have hU:(A:Ἂ Ἃ)->(O0 A)<2^(32:Ἀ)->(J0 A.usize)=(O0 A):=λA g=>by change (J0 (G0 ((O0 A))))=(O0 A);exact aa _ g intro m;induction m with |zero=> intro a b x q e ox oy A hm hA hq ha hb hx ho hy he ht have hz:=V3.1 hm rw[pQ,dite_eq_right (by rw[ε,hU A (hA.trans_lt hN)];exact O3.2 (hA.trans_le hz))] apply mi;·simp[hA,ag] intro j h1 h2;simp only[ag,Λ];rw[<-AB A j h1];exact ht j (U1 (h1.trans_eq hA) hz) |succ m ih=> intro a b x q e ox oy A hm hA hq ha hb hx ho hy he ht have hqc:(J0 q)Qh hqc ((ι _ (ι _ h)).trans ((pqG a b x H W).trans_eq hq.symm)) have qa:qby rw[pA,(aQe_h2 w W).1,ϳ,ϑ,nO b 2,<-pA,Ϡ (a*h+b*2) 2 w] lemma aQe_h5(h w:Ἀ)(H:0by rw[pA,<-pA ((w/2-1)*2),(aQe_h2 w W).1,<-Ϡ,<-Ϡ,pA (a*h),(aQe_h3 h H).1,ϳ,ϑ,ϑ,nO a h] lemma aQe_h6(c h w:Ἀ)(H:0(a*h+b*2)*w+x*2) c (h/2) (w/2) (w+(w-2*(w/2))+2) (w+(w-2*(w/2))+2+(h-2*(h/2))*w) _ _ _ _ y1 y2 y3 y4 W y5 (λa b x=>by rw[nO x 2,pA]) (aQe_h4 h w W) (aQe_h5 h w H W) (λa b x ha hb hx=>aQe_h0 _ _ B (pqE a b x c h w ha hb hx c0).le) ?_ _ 0 0 0 0 0 0 0 _ rfl (by rw[X4]) (by simp only[Ϧ,ϳ,ϑ]) (ϟ _) H W Ϧ Ϧ (by simp only[Ϧ,ϳ,ϑ]) (λj g=>absurd g (by rw[Ϧ];exact C5 j)) intro a b x e ha hb hx he obtain⟨d1,m1⟩:=qVm (a*(h/2)+b) x (w/2) hx obtain⟨d2,m2⟩:=qVm a b (h/2) hb have hE:((G0 ((a*h+b*2)*w))+2*(G0 x))=(G0 ((a*h+b*2)*w+x*2)):=by rw[show(2:Ἄ)=O2 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX] have u:(J0 (G0 ((a*h+b*2)*w+x*2)))=(a*h+b*2)*w+x*2:=aa _ (aQe_h0 _ _ B (pqE a b x c h w ha.le hb hx c0).le) unfold aT;rw[Ϗ (h/2),<-lY,d1,m1,d2,m2,hE] congr 1;apply D6.mp;rw[u,he] def dU:Ἂ Ἃ:= let d:=natW (k*k) if 0 let U:=(ch*h+y*k)*w+x*k wo bx (fj I bx w k U) 0 (λ_=>wa (.==0x80000000) I w k (k*k) U 0 ἃ) (λ_=>cU h w k I ch y x) d else avgpoolSpec c h w k I else avgpoolSpec c h w k I lemma eV_h1{α:Type}{C:Prop}[Decidable C]{X Y R:α}(h1:C->X=R)(h2:¬C->Y=R):ite C X Y=R:=if c:C then (AD c).trans (h1 c) else (AC c).trans (h2 c) lemma eV_h2(X w m H:Ἀ)(A:X*w+w<=H)(G:H<1073741824)(t:m?_) (λ_=>(by rfl)) .obtain⟨e,o,u,B,m⟩:=d;refine eV_h1 (λD=>?_) (λD=>?_) .obtain⟨rfl,G⟩:=D;rw[aQe c h w I _ o u G,Ϛ];unfold n9;refine mi (by simp only[ag,pa,Ϝ]) λq r _=>?_;simp only[ag,Λ,pa,Ϝ,aT]at r⊢;have F:=(ϸ (Ϯ o u)).mpr r;have a:=ϊ (q/(w/2)) o;have:=ϊ q u;have v:q/(h/2*(w/2))*h+q/(w/2)%(h/2)*2+1<=c*h:=by have:=ι h (l7 F);rw[Ο]at this;have b:=(mc (by decide)).1 a;rw[nO]at b;exact AZ (J1 (X5 b) _) this have A:=ι w v;rw[nO]at A;have Q:=eV_h2 _ _ _ _ A G this refine gU h w I _ m _ _ _ _ ?_ Q;rw[show(2:Ἄ)=O2 2 from rfl,<-BP,<-mC,Ϗ 2,<-lX,aa _ (by clear*-Q;omega)] .have l:=jL _ B;refine eV_h1 (λd=>?_) (λ_=>(by rfl)) .refine dO _ _ _ _ _ _ λj y x=>?_;have g:∀tgi I _ d.2 (gC _ _) _;exact eg _ _ _ (cK (k*k)) _ _ (cB d.1) (by (clear * - l;omega)) (Ϯ e e) g _ (λ_=>0) _ 0 (λt p=>ee _ _ _ (cB d.1) l.1 (g t p)) l.2 (by simp) (by rw[gx];exact em _ h w k I j y x e) (by simp[bF]) _ (by simp only[dk _ _ _ _ _ _ e,cu,AQ]) _ rfl _ m lemma pMy(y z:kF)(a:(mJ y)<2139095040)(b:(mJ z)<2139095040):mx y z=max y z:=by have e:∀u:kF,(mJ u)<2139095040->(mJ (sk u))=(mJ u)+2147483648∧expOf u≠255:=fun u h=>⟨by rw[bf,AD (by omega)];rfl,fun q=>by have:=wEx u;rw[q]at this;simp at this;omega⟩ obtain⟨c,f⟩:=e y a;obtain⟨g,i⟩:=e z b rw[mx,AD ⟨f,i,by rw[Ι,Ι,c,g];rcases Jd (mJ y) (mJ z) with h|h|h;exact pZ (by omega);exact BA (BA (Β.1 h));exact BA (pZ (by omega))⟩,UInt32.max_def];by_cases h:(mJ y)<(mJ z) ·rw[AD (Ι.2 (by rw[c,g];omega)),AD (C6.2 (by omega))] ·rw[AC (fun q=>h (by have:=Ι.1 q;rw[c,g]at this;omega))];split;exact Β.1 (by have:=C6.1 ‹_›;omega);rfl @[inline]def pMx(g j l m:kF):kF:= let M:=max (max g j) (max l m) if M<0x7F800000 then M else mx (mx (mx (mx g g) j) l) m lemma pMxE(g j l m:kF):pMx g j l m=mx (mx (mx (mx g g) j) l) m:=by unfold pMx;dsimp only;split;rename_i h;obtain⟨a,b,c,e⟩:=pML g j l m h;rw[pMy g g a a,pMy (max g g) j (by rw[nw];omega) b,pMy (max (max g g) j) l (by rw[nw,nw];omega) c,pMy (max (max (max g g) j) l) m (by rw[nw,nw,nw];omega) e];apply Β.1;simp only[nw];omega;rfl @[inline]def iYm(w:Ἀ)(ww:Ἄ)(I:@&Ἂ Ἃ)(e:Ἄ):Ἃ:= if hb:ent j (lI I[A*w+x*2+t/2*w+t%2]!)) (lI I[A*w+x*2]!))=kW ((lj (2*2)).foldl (λj t=>nt j (lI I[(A+t/2)*w+x*2+t%2]!)) (lI I[(A+0/2)*w+x*2+0%2]!)):=by rw[Hx,Uh,ϑ,ϑ];exact congrArg kW (congrArg (List.foldl · _ _) (funext λj=>funext λt=>by rw[Ϡ A (t/2) w,lO (A*w) (t/2*w) (x*2)])) lemma iz_h2(A w N P Q:Ἀ)(c:Pnt j (lI (nI h w 2 I d y x t))) (lI (nI h w 2 I d y x 0))):=by have q:=cu h w 2 I d y x;have m:=q 0;have o:=q 1;have p:=q 2;have r:=q 3;simp only[Nat.reduceDiv,kH,nv,n4,Av]at m o p r;have:=dj;have g:∀i l,I.uget i l=I[(J0 i)]!:=λi l=>(AB I _ l).symm;dsimp only[iYm];split;rw[pMxE];obtain⟨k0,k1,k2,k3⟩:=iz_h2 _ _ _ _ _ (by decide) this v;simp only[g,lJ,mA,aa w k0,u,γ k1,γ k2,γ k3];rw[<-cn (Conv.mx _ _),be,be,be,be,m,o,p,r];simp only[mD,Wg,l6,Ϸ,mT];rw[u,<-cn (wl _ _ _ _ _ _ _ _),fn I w 2 _ (2*2) (by decide)];simp only[nI];exact iz_h1 I _ w x noncomputable def mT(h w:Ἀ)(I:Ἂ Ἃ)(q:Ἀ):Ἃ:=iYm w (G0 w) I ((G0 ((q/(h/2*(w/2))*h+q/(w/2)%(h/2)*2)*w))+2*(G0 (q%(w/2)))) lemma mQe_h1(A B w q r:Ἀ)(hw:w=2*(q+1)+r):(A+B*2)*w+q*2+(w+r+2)=(A+(B+1)*2)*w+0*2:=by subst hw;ring lemma mQe_h2(a h w p q s r:Ἀ)(hw:w=2*(q+1)+r)(hh:h=2*(p+1)+s):(a*h+p*2)*w+q*2+(w+r+2+s*w)=((a+1)*h+0*2)*w+0*2:=by subst hw hh;ring lemma mQe_h3(w r s:Ἀ)(hw:w<2^(30:Ἀ))(hr:r<=1)(hs:s<=w):w+r+2<2^(32:Ἀ)∧w+r+2+s<2^(32:Ἀ):=by omega lemma mQe_h4(w:Ἀ)(W:0(a*h+b*2)*w+x*2) c (h/2) (w/2) (w+(w-2*(w/2))+2) (w+(w-2*(w/2))+2+(h-2*(h/2))*w) _ _ _ _ (aa _ ((J6 _ _).trans_lt (qL.trans (by decide)))) (aa _ ((J6 _ _).trans_lt ((hl.trans_lt B).trans (by decide)))) (aa _ x3) (aa _ x4) W (nl.trans_lt (B.trans (by decide))) (λa b x=>(pA _ _ _).trans (congrArg _ (nO x 2).symm)) (λa b=>mQe_h1 (a*h) b w _ _ hw) (λa=>mQe_h2 a h w _ _ _ _ hw hh) (λa b x ha hb hx=>(pqE a b x c h w ha hb hx c0).trans k2) ?_ _ 0 0 0 0 0 0 0 _ rfl (by simp) (by simp) (ϟ _) H W Ϧ Ϧ (by simp) (λj q=>(C5 j (q.trans_eq Ϧ)).elim) intro a b x e ha hb hx he obtain⟨d1,m1⟩:=qVm (a*(h/2)+b) x (w/2) hx obtain⟨d2,m2⟩:=qVm a b (h/2) hb have hE:((G0 ((a*h+b*2)*w))+2*(G0 x))=(G0 ((a*h+b*2)*w+x*2)):=by rw[show(2:Ἄ)=O2 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX] have u:(J0 (G0 ((a*h+b*2)*w+x*2)))=(a*h+b*2)*w+x*2:=aa _ ((pqE a b x c h w ha.le hb hx c0).trans k2) unfold mT;rw[Ϗ (h/2),<-lY,d1,m1,d2,m2,hE] congr 1;apply D6.mp;rw[u,he] def d9:Ἂ Ἃ:= if k=2/\0?_;simp only[ag,Λ,Ϝ,mT]at e⊢;have o:=(ϸ (Ϯ d g)).mpr e;have:=ϊ (q/(w/2)) d;have:=ϊ q g;have j:q/(h/2*(w/2))*h+q/(w/2)%(h/2)*2+1<=c*h:=by have:=ι h (l7 o);rw[Ο]at this;omega have l:=ι w j;rw[nO]at l;refine iz h w I _ _ _ _ ?_ (by omega);rw[show(2:Ἄ)=O2 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX,aa _ (by omega)];rfl end Conv section open Float.Model.UnpackedFloat open ExactRuntime renaming rationalWord->ZA,sqrtLower->ZK,mantOf_lt_24->ZO,roundRational->ZT,mantOf->ZW,signOf->ZX,idxOf->ZZ,rowVariance->XH open Submission.Core renaming mW->ZC,iW->ZD,an->ZI,ai->ZR,am->ZS open _root_ renaming zpow_natCast->ZF,decide_eq_true_eq->ZH,zpow_add₀->ZL,two_ne_zero->ZQ,beq_iff_eq->ZY,ite_false->XA,zpow_sub₀->XB,two_ne_zero'->XC,mul_assoc->XD open UInt64 renaming toNat_ofNat'->ZG,ofNat->XF open Nat renaming div_eq_zero_iff_lt->ZJ,div_add_mod'->ZU,div_le_self->ZV open Finset renaming range->ZM open Float.Model.UnpackedFloat.ExtendedMantissa renaming ofMantissaAndAccuracy->XE open Bool renaming xor->XG namespace Elem lemma VV(w:kF):(lq (ZC w))<2^(24:Ἀ):=by rw[ZI];exact ZO w lemma YB(a b:kF):(lq (ZC a*ZC b))=ZW a*ZW b:=by rw[ύ,ZI,ZI];exact γ (mul_mant_lt a b) end Elem open Elem namespace Norm def Ya:Accuracy->Ἀ | .exact=>0 | .inexact _=>1 lemma Yc{α:Type}(f:α->α)(n:Ἀ)(a:α): Nat.repeat f (n+1) a=Nat.repeat f n (f a):=by induction n generalizing a with |zero=>rfl |succ n d=>exact congrArg f (d a) theorem QA_h1(R y:Ἀ)(h:y<2):(2*R+y)/2=R∧(2*R+y)%2=y:=⟨by rw[R8 ((by decide):2>0),ώ h,ϑ],by rw[S8,γ h]⟩ theorem QA_h2(R:Ἀ)(d:Accuracy):lm (lm (XE (2*R+Ya d) .exact))=lm (XE R d):=by obtain⟨a,b⟩:=QA_h1 R (Ya d) (by rcases d with _|⟨_|_|_⟩<;>decide) show (⟨(2*R+Ya d)/2/2,(2*R+Ya d)/2%2 != 0,(2*R+Ya d)%2 != 0||(false||false)⟩:ExtendedMantissa)=lm (XE R d) rw[a,b];rcases d with _|⟨_|_|_⟩<;>rfl lemma QA(R k:Ἀ)(d:Accuracy): XE (2*R+Ya d) .exact>>>(k+2)= XE R d>>>(k+1):=by show Nat.repeat lm (k+2) _= Nat.repeat lm (k+1) _;rw[Yc,Yc,Yc,QA_h2] open FloatLib.Numerics in lemma VY(q r D t:Ἀ)(e:0rfl:(if r=0 then 0 else 1)=Ya (lP r D)),<-h,(by rw[Τ,Ρ _ _ e,ώ d,Ai]:(q*D+r)/D=q),(by rw[Τ,Μ,γ d]:(q*D+r)%D=r)] lemma Y5(e:Ἁ):Model.bpow e=(2:ℝ)^e:=(by rfl) lemma Vi(q b:Ἀ)(d:q≠0)(h:b<=1):(Aq (2*q+b))=(Aq q)+1:=by rw[Ua,AD (by omega:2<=2*q+b),R8 (by decide),ώ (AO h one_lt_two)];rfl open FloatLib.Numerics in lemma V0(s:Ἆ)(P d:Ἀ)(o:P≠0)(l:d≠0)(q r D:Ἀ) (x:0decide:(if r=0 then 0 else 1)<=1);have G:(r:ℝ)/D<1:=(div_lt_one ((by positivity))).2 (mod_cast t);have E:(0:ℝ)<=r/D:=((by positivity));have w:lf P d=((Aq q):Ἁ)+e:=by apply Model.floorLog2_eq_of_bounds P d _ .rw[h,Y5,ZL ZQ,ZF];exact AE (le_add_of_le_of_nonneg u E) (by positivity) .rw[h,Y5,(by rw[X7];exact add_right_comm _ _ _:((Aq q):Ἁ)+e+1=(((Aq q)+1:Ἀ):Ἁ)+e),ZL ZQ,ZF];exact AI ((add_lt_add_of_le_of_lt AP G).trans_le v) (by positivity) have p:la (l9 P d (23-(((Aq q):Ἁ)+e))).1 (l9 P d (23-(((Aq q):Ἁ)+e))).2=roundShiftRightEven (2*q+if r=0 then 0 else 1) ((Aq (2*q+if r=0 then 0 else 1))-23):=by rw[roundShiftRightEven_eq_roundQuotientEven,g,(Qf (J2 (by decide) m):(Aq q)+1-23=((Aq q)-23)+1),<-VY q r D _ x t (by exact M5 (AZ (by decide) m))] apply Model.roundQuotientEven_eq_of_rat_eq _ _ _ _ (RationalBinary.scaleByPowerOfTwo_snd_ne_zero _ _ _ l) ((by positivity));rw[Model.scaleByPowerOfTwo_real,Model.scaledRatToReal,h,Y5,XD,<-ZL ZQ,(by rw[pO (J2 (by decide) m),nZ];ring:e+(23-(((Aq q):Ἁ)+e))=-(((Aq q)-23:Ἀ):Ἁ)),zpow_neg,ZF];push_cast;rw[←div_eq_mul_inv,←div_div];congr 1;rw[add_div,mul_div_cancel_right₀ _ (T9.2 x).ne'] generalize F:2*q+(if r=0 then 0 else 1)=J at g p⊢;rw[kE,AD (by decide),Model.ieeeRoundDyadic_eq_internal];simp only[Model.roundRat,n6,((by decide):Fmt.isIEEE=ἃ),↓reduceDIte,Model.ieeeRoundRatScaled,Model.Internal.ieeeRoundDyadic,ZY,o,l,XA,w,Av,nY,g,((by decide):(FloatFormat.ieeeMaxNormalExponent lU:Ἁ)=127),((by decide):FloatFormat.ieeeMinNormalExponent lU=-126),((by decide):(FloatFormat.normalMantissaExpOffset lU:Ἁ)=150),((by decide):Fmt.fracWidth=23),show J≠0 by rw[←F];exact C8 (U1 (Ϯ (by decide) (ϵ j)) (V1 _ _)),(by rw[X7,add_add_sub_cancel]:(((Aq q)+1:Ἀ):Ἁ)+(e-1)=((Aq q):Ἁ)+e),show¬(((Aq q):Ἁ)+e>127) from not_lt.2 (AZ B (by decide)),show¬(((Aq q):Ἁ)+e< -150) from not_lt.2 (AZ (by decide) A),show¬(((Aq q):Ἁ)+e< -126) from not_lt.2 A,(Jf (J2 (by decide) m):23<=(Aq q)+1),ἁ,nZ,p] lemma Y8(v:ℚ)(w:v≠0)(s:Ἆ)(u:decide (v<0)=s) (q:Ἀ)(ρ:ℚ)(o:0<=ρ)(g:ρ<1)(e:Ἁ) (j:|v|=((q:ℚ)+ρ)*(2:ℚ)^e) (p:2^(25:Ἀ)<=q)(l:-126<=((Aq q):Ἁ)+e)(m:((Aq q):Ἁ)+e<=126): ZT v= kW (kE lU ⟨s,2*q+(if ρ=0 then 0 else 1),e-1⟩):=by have h:ρ=((J7 ρ.num):ℚ)/ρ.den:=by(conv_lhs=>rw[<-Rat.num_div_den ρ]);congr 1;exact_mod_cast(B9 (Rat.num_nonneg.2 o)).symm have d:=ρ.den_pos;generalize ρ.den=D,(J7 ρ.num)=r at h d;subst h;rw[roundRational,u,V0 s _ _ ((by positivity)) v.den_nz q r D d (by rwa[div_lt_one (mod_cast d),Ju]at g) e ?_ p l m];simp[d.ne'];have:=congrArg (λz:ℚ=>(z:ℝ)) j;rw[Rat.abs_def,Rat.divInt_eq_div]at this;push_cast at this;rwa[Yv,mI] lemma Q7_h1(R:Ἀ)(s c:Ἁ)(h:2^(25:Ἀ)<=R):-s+1<=max ((Aq R:Ἁ)+1+-s-((FloatFormat.toModel Fmt).mantissaBits:Ἁ)) c:=le_max_of_le_left (by linarith only[(O4.2 ((by decide:(FloatFormat.toModel Fmt).mantissaBits<=25).trans ((mu (U1 (϶ 25) h).ne').2 h)):((FloatFormat.toModel Fmt).mantissaBits:Ἁ)<=Aq R)]) lemma Q7(R:Ἀ)(s:Ἁ)(h:2^(25:Ἀ)<=R): -s+1<=((FloatFormat.toModel Fmt)).targetExponent (kY R (-s)):=by rw[BV,kY];exact Q7_h1 R s _ h lemma Vd(v:ℚ)(q:0simp lemma YN(w:kF):(sv w:ℚ)=0↔ZW w=0:=by rw[sv];split_ifs<;>simp lemma Vr(w:kF):(sv w:ℚ)=(if ZX w then-1 else 1)*ZW w:=by rw[sv];simp only [Int.cast_ite,Ue,P5,ite_mul,neg_mul,one_mul] lemma Y7(x:ἆ):(lq (ZR x))=(Aq (lq x)):=by rw[aA];rfl @[specialize]def Yh(x:(Ἂ Word))(i stop u:Ἀ):Ἀ:= if ih (by rw[<-ZI,d];rfl) grind theorem Yi_h1(d i:ℕ)(h:d-i=0):¬iYh x i d u<=u/\ ∀j,i<=j->jZW x[j]! =0\/Yh x i d u<=ZZ x[j]!:=by intro k;induction k<;>intro i u h<;>rw[Yh] .rw[AC (Yi_h1 _ _ h)];exact⟨Jv _,λj a b=>absurd (C0 a b) (Yi_h1 _ _ h)⟩ .rename_i e;rw[AD (N1 h)];dsimp only;rw[YK,ZS];split<;>rename_i hz .have E:=e (i+1) u (by rw[W4,h,BK]);exact⟨E.1,λj a b=>(BJ a).elim (λq=>by subst q;exact .inl (of_decide_eq_true hz)) (λa=>E.2 j a b)⟩ .have E:=e (i+1) (min u (ZZ x[i]!)) (by rw[W4,h,BK]);exact⟨E.1.trans (min_le_left _ _),λj a b=>(BJ a).elim (λq=>by subst q;exact .inr (E.1.trans (min_le_right _ _))) (λa=>E.2 j a b)⟩ lemma Yi(x:(Ἂ Word))(d:Ἀ): ∀k i u,d-i=k->Yh x i d u<=u/\ ∀j,i<=j->jZW x[j]! =0\/Yh x i d u<=ZZ x[j]!:=Yi_h2 x d def VJ(x:(Ἂ Word))(u j:Ἀ):Ἀ:= (ZW x[j]!*ZW x[j]!)<<<(2*(ZZ x[j]!-u)) @[specialize]def Yl(x:(Ἂ Word))(u i stop:Ἀ)(l h:ἆ)(c big:Ἀ):Ἀ:= if i>>1)>>>(63-k)else mm<<<(k-64) let l':=l+vl let h':=h+vh+(if l'>>1)>>>(63-(I0 k)) else d<<<((I0 k)-64)))*2^(64:Ἀ)=(lq d)*2^k/\ (UInt64.toNat (if (I0 k)<64 then(d>>>1)>>>(63-(I0 k)) else d<<<((I0 k)-64)))<2^(62:Ἀ):=by have g:(lq (I0 k))=k:=by rw[Ϣ,ZG,γ (C0 p (by decide))] by_cases h:k<64 simp only[(by rw[μ,g];simpa:(I0 k)<64),ἁ,ψ,ν,χ _ _ (show (I0 k)<=63 by rw[θ,g];simp only [kA];exact Nat.lt_succ.1 h),g,kA,ο,β,γ h,γ (AO (Y4 _ _) (by decide):63-k<64),kH,lY] rw[(by rw[<-AF];congr 1;rw[Τ];exact (Qf (Nat.lt_succ.1 h)).symm:2^(1:Ἀ)*2^(63-k)=2^(64-k)),(by rw[<-AF,J4 h.le]:2^(64:Ἀ)=2^(64-k)*2^k),Ha,<-Ϛ,<-Ϡ,Zj];exact⟨ἅ,AO (ZV _ _) ((by omega))⟩ have m:(lq d)*2^(k-64)<2^(62:Ἀ):=calc _<2^(48:Ἀ)*2^(14:Ἀ):=ly o (Θ ((by positivity)) (G5 p 64)) ((by positivity)) _=_:=ἅ simp only[(by rw[μ,g];simpa using h:¬(I0 k)<64),XA,ϋ,Κ,ψ,χ _ _ (show(64:ἆ)<=(I0 k) by rw[θ,g];simp only [kA];exact not_lt.1 h),g,kA,γ (C0 (G5 p 64) (by decide):k-64<64),ο,γ (m.trans (by decide):(lq d)*2^(k-64)<2^(64:Ἀ))] refine⟨?_,m⟩;rw[Ϛ,<-AF];rw[J4 (V4 h)] lemma Vb_h2(x y:ἆ):(lq (x+y))+(if x+ydecide lemma Vb_h1(l v h w:ἆ)(hw:(lq w)<2^(62:Ἀ)):(lq (l+v))+(lq (h+w+(if l+vdecide) have X1:(lq (if l+vdecide linear_combination E1+2^(64:Ἀ)*E2+X1+2^(64:Ἀ)*Vb_h4 (h+w+(if l+v Yl x u i d l h c big=big+(lq l)+(lq h)*2^(64:Ἀ)+c*2^(128:Ἀ)+ ∑j∈ZM k,VJ x u (i+j):=by intro k;induction k<;>intro i l h c big q<;>rw[Yl] .rw[AC (O3.2 (V3.1 q))];simp only[ο,Za,Qn];rw[Av,Ϡ,Ϛ,<-m7];exact (pA _ _ _).symm rename_i p;rw[AD (N1 q),lV];simp only[(λj=>by rw[lO];rfl:∀j,VJ x u (i+(j+1))=VJ x u (i+1+j)),ϑ];have o:VJ x u i=(lq (ZC x[i]!*ZC x[i]!))*2^(2*((lq (ZD x[i]!))-u)):=by rw[VJ,ο,YB,ZS] have r:(lq (ZC x[i]!*ZC x[i]!))<2^(48:Ἀ):=by rw[YB];have:=ZO x[i]!;exact(ϕ this this).trans_eq ἅ rw[o];generalize (lq (ZD x[i]!))-u=g at*;generalize ZC x[i]!*ZC x[i]! =m at*;by_cases t:g<=39 .have:=VL m (2*g) r (X3 2 t);generalize (if(I0 (2*g))<64 then m<<<(I0 (2*g))else 0)=v at*;generalize (if(I0 (2*g))<64 then(m>>>1)>>>(63-(I0 (2*g))) else m<<<((I0 (2*g))-64))=w at*;rw[p (i+1) _ _ _ _ (by rw[W4,q,BK])];rw[AD t];exact Vb_h5 _ _ _ _ _ _ _ _ _ _ _ _ _ (Vb_h1 l v h w this.2) this.1 rw[AC t,p (i+1) _ _ _ _ (by rw[W4,q,BK]),ο];exact Vb_h6 _ _ _ _ _ _ lemma Yk(n:Ἀ)(f:Ἀ->ℚ)(a:ℚ): (lj n).foldl (λt j=>t+f j) a=a+∑j∈ZM n,f j:=by induction n generalizing a with |zero=>simp only [Wg,mT,Za,Qn,Av] |succ n d=> rw[mD,l6,d,Ν];simp only [Ϸ,mT];ring lemma VG_h1(d u:Ἀ)(h:u<=d):((d:Ἁ)-149)*((2:Ἀ):Ἁ)=((2*(d-u):Ἀ):Ἁ)+(2*(u:Ἁ)-298):=by rw[G4,pO h,nZ,mul_sub,sub_add_sub_cancel,sub_mul,mul_comm];rfl lemma VG(d u:Ἀ)(h:u<=d): ((2:ℚ)^((d:Ἁ)-149))^(2:Ἀ)=(2:ℚ)^(2*(d-u))*(2:ℚ)^(2*(u:Ἁ)-298):=by rw[<-ZF ((2:ℚ)^((d:Ἁ)-149)) 2,<-zpow_mul,<-ZF (2:ℚ) (2*(d-u)),<-ZL ZQ];exact congrArg _ (VG_h1 d u h) lemma Ye_h1(a k:Ἀ)(y:ℚ):(a:ℚ)*a*((2:ℚ)^k*y)=((a*a*2^k:Ἀ):ℚ)*y:=by rw[G4,G4,B4,nZ,<-Ap] lemma Ye(w:kF)(u:Ἀ)(h:ZW w=0\/u<=ZZ w): ZA w^(2:Ἀ)= (((ZW w*ZW w)<<<(2*(ZZ w-u)):Ἀ):ℚ)*2^(2*(u:Ἁ)-298):=by rw[Y1,ο];rcases h with h|h;rw[(YN w).2 h,h];simp only [zero_mul,Ak,Wm,not_false_eq_true,zero_pow,mul_zero,CharP.cast_eq_zero];rw[mul_pow,(by rw[<-sq_abs,VT,sq]:(sv w:ℚ)^(2:Ἀ)=(ZW w:ℚ)*ZW w),VG _ _ h];exact Ye_h1 _ _ _ def Yf(num den:Ἀ)(s:Ἁ):Ἃ:= toWord (Model.ofModel Fmt (roundWithAccuracy ((FloatFormat.toModel Fmt)) .positive (ZK num den) (-s) (sqrtAccuracy num den))) open Float.Model in lemma Q4_h1(e T:Ἁ)(p:e+1<=T):(J7 (e-1-T))=0:=Wp (Int.sub_nonpos_of_le ((Wi _ (by decide)).trans ((Int.le_add_one (le_refl _)).trans p))) lemma Q4_h2(e T:Ἁ)(p:e+1<=T):∃k,(J7 (T-e))=k+1:=⟨(J7 (T-e))-1,(J4 ((Int.lt_toNat (m:=0)).2 (Int.sub_pos.2 (Hi p)))).symm⟩ lemma Q4_h3(e T:Ἁ)(k:Ἀ)(p:e+1<=T)(j:(J7 (T-e))=k+1):(J7 (T-(e-1)))=k+2:=by rw[sub_sub_eq_add_sub,add_sub_right_comm,Int.toNat_add (Int.sub_nonneg.2 (le_of_lt (Hi p))) (by decide),j]<;>rfl open Float.Model in lemma Q4(spec:Format)(g:pK)(R:Ἀ)(e:Ἁ)(d:Accuracy)(l:R≠0) (p:e+1<=spec.targetExponent (kY R e)): nk spec g R e d=pp spec g (2*R+Ya d) (e-1):=by have h:kY (2*R+Ya d) (e-1)=kY R e:=by rw[kY,kY,Vi R _ l (by cases d<;>simp[Ya])];grind simp only[pp,decreaseExponent,h];rw[Q4_h1 _ _ p];simp only [BH,CharP.cast_eq_zero,sub_zero];unfold nk shiftToTargetExponent shiftToExponent;rw[h];generalize spec.targetExponent (kY R e)=T at*;obtain⟨k,j⟩:=Q4_h2 _ _ p;dsimp only;rw[j,Q4_h3 _ _ _ p j,QA,(by push_cast;ring:e-1+((k+2:Ἀ):Ἁ)=e+((k+1:Ἀ):Ἁ))] lemma Vh(e d:Ἀ): Ya (sqrtAccuracy e d)=if e=ZK e d^(2:Ἀ)*d then 0 else 1:=by unfold sqrtAccuracy;dsimp only;split_ifs<;>rfl lemma V9_h1(s:Ἁ)(m:-209<=s):(J7 (297-s))<2^(64:Ἀ):=by have h:(J7 (297-s))<=506:=Um.2 ((Hs m 297).trans_eq (by decide)) exact C0 h (by decide) lemma V9_h2(s:Ἁ)(o:s<=297):(((J7 (297-s)):Ἀ):Ἁ)-298=-s-1:=by rw[B9 (Int.sub_nonneg.2 o)];ring lemma V9_h3(R c:Ἀ)(l:R>>>31=0)(q:c<=1):2*R+c<2^(64:Ἀ):=by have hR:R<2^(31:Ἀ):=(Wk.1 ((β R 31).symm.trans l)).resolve_left (BD.1 (϶ 31)) exact(J1 q _).trans_lt ((B3 (M7 hR (by decide)) 1).trans (by decide)) lemma V9(e d:Ἀ)(s:Ἁ)(p:33554432<=ZK e d) (l:ZK e d>>>31=0)(m:-209<=s)(o:s<=297): Yf e d s=az false (XF (2*ZK e d+ (if e=ZK e d*ZK e d*d then 0 else 1))) (XF (J7 (297-s))):=by set R:=ZK e d with g;have h:(lq (XF (J7 (297-s))))=(J7 (297-s)):=by rw[ZG,γ (V9_h1 s m)] have q:(if e=R*R*d then 0 else 1)<=1:=by split_ifs<;>decide have j:(lq (XF (2*R+(if e=R*R*d then 0 else 1))))=2*R+(if e=R*R*d then 0 else 1):=by rw[ZG,γ (V9_h3 _ _ l q)] rw[aJ _ _ _ (by rw[h];exact Um.2 (Hs m 297)),h,j,Yf,<-g,Q4 _ _ R (-s) _ (C8 (AN (by decide) p)) (Q7 R s p),Vh,<-g,sq,V9_h2 s o];rfl @[inline]def YG(num den R:Ἀ)(s:Ἁ):Ἃ:= if R>>>31==0&&-209<=s&&s<=297 then Core.az ἄ (XF (2*R+(if num==R*R*den then 0 else 1))) (XF (J7 (297-s))) else Yf num den s lemma Vc(e d:Ἀ)(s:Ἁ)(g:33554432<=ZK e d): YG e d (ZK e d) s=Yf e d s:=by rw[YG];split next h=> simp at h;rw[V9 e d s g h.1.1 h.1.2 h.2];simp simp def V8(B:Ἀ)(c:Ἁ):Ἀ:=if 0<=c then B<<<(J7 c)else B def YF(Dn:Ἀ)(c:Ἁ):Ἀ:=if 0<=c then Dn else Dn<<<(J7 (-c)) lemma VE(B d:Ἀ)(e:0rw[ο,G4,B4,nZ,<-AA];exact⟨e,by rw[B9 h];exact mul_div_right_comm _ _ _⟩ rw[B9 (Zv (Int.le_of_not_le h)),zpow_neg,div_mul_eq_div_div,div_inv_eq_mul];exact⟨Ϯ e (϶ _),rfl⟩ def V5(A Dn u:Ἀ)(eps:Ἃ):Ἃ:= let E:=ZW eps let ie:=ZZ eps let w0:=min (2*u) (ie+149) let B:=(A<<<(2*u-w0))+((Dn*E)<<<(ie+149-w0)) let s:Ἁ:=(350-(w0:Ἁ)-(((Aq B):Ἁ)-((Aq Dn):Ἁ)))/2 let c:Ἁ:=(w0:Ἁ)-298+2*s let num:=V8 B c let den:=YF Dn c let R:=ZK num den if 33554432<=R then YG num den R s else sqrtRational ((A:ℚ)*2^(2*(u:Ἁ)-298)/Dn+ZA eps) lemma YW(A e u:Ἀ)(d:kF)(t:0>>(63-k)==0 then(lq ((I0 x)<<<(I0 k)))else x<<>>(63-k)==0)=true .obtain⟨l,d⟩:=(Η ..).mp h;have l:=of_decide_eq_true l have e:x<2^(63-k):=(ZJ (϶ _)).1 ((β ..).symm.trans (AQ.mp d)) have g:x*2^k<2^(63:Ἀ):=by rw[(J4 l.le).symm,m7];exact ϐ e (϶ _) rw[AD h,ψ,Ϣ,Ϣ,ZG,ZG,ο,ο,γ (AN e (Θ (by decide) ((Y4 63 k).trans (by decide))):x<2^(64:Ἀ)),γ (AN l (by decide):k<2^(64:Ἀ)),γ (N6 l:k<64)] exact γ (I4 g (by decide)) .exact AC h @[inline]def Q2(x:Ἀ):Ἀ:=if x>>>63==0 then(lq (ZR (I0 x)))else (Aq x) @[inline]def V2(r:Ἀ)(st:Ἆ):Ἀ:=if r !=0||st then 1 else 0 lemma VI(N M:Ἀ)(e:0h (g.2 ⟨a,b⟩))) lN;subst a;rfl · rw[V2,AD (by rw[nM,AM];exact pZ a)] theorem Qx_h2(X:ℚ)(d:Ἀ)(e:Ἁ)(x:0decide (v<0)=s) (p:0<=δ) (q:δ<1) (w:l=ἃ↔δ≠0) (x:0 ((Ym x u i d P N).1:Ἁ)-(Ym x u i d P N).2= (P:Ἁ)-N+∑j∈ZM k,YS x u (i+j):=by intro k;induction k<;>intro i P N h<;>rw[Ym] .rw[AC (VN_h1 _ _ h)];simp only [Za,Qn,Av] rename_i n ih;rw[AD (N1 h)];simp only[Yz,ZI,ZS,lV];have e:∀j,YS x u (i+(j+1))=YS x u (i+1+j):=λj=>by rw[lO];rfl simp only[e,ϑ];rw[YS];split<;>rename_i hz ·rw[ih (i+1) _ _ (by rw[W4,h,BK]),K5];ring ·rw[ih (i+1) _ _ (by rw[W4,h,BK]),K5];ring lemma VN(x:(Ἂ Word))(u d:Ἀ): ∀k i P N,d-i=k-> ((Ym x u i d P N).1:Ἁ)-(Ym x u i d P N).2= (P:Ἁ)-N+∑j∈ZM k,YS x u (i+j):=VN_h2 x u d lemma Yx(x:(Ἂ Word))(u j:Ἀ) (h:ZW x[j]! =0\/u<=ZZ x[j]!): ZA x[j]! =(YS x u j:ℚ)*2^((u:Ἁ)-149):=by rw[Y1,YS];rcases h with h|h;simp[(YN _).2 h,h];rw[(by rw[<-ZF,<-ZL ZQ,pO h,sub_add_sub_cancel]:(2:ℚ)^((ZZ x[j]!:Ἁ)-149)=2^(ZZ x[j]!-u)*2^((u:Ἁ)-149)),Vr,ο];split_ifs<;>push_cast<;>ring lemma VW(n:Ἀ)(x:(Ἂ Word))(r u:Ἀ) (d:∀j,r*n<=j->jZW x[j]! =0\/u<=ZZ x[j]!): (∑j∈ZM n,ZA x[r*n+j]! = ((((Ym x u (r*n) (r*n+n) 0 0).1:Ἁ)-(Ym x u (r*n) (r*n+n) 0 0).2:Ἁ):ℚ)* 2^((u:Ἁ)-149))/\ (∑j∈ZM n,ZA x[r*n+j]!^(2:Ἀ)= ((Yl x u (r*n) (r*n+n) 0 0 0 0:Ἀ):ℚ)*2^(2*(u:Ἁ)-298)):=by rw[VN x u _ n _ 0 0 ((by exact Jj (r*n) n)),Vb x u _ n _ 0 0 0 0 ((by exact Jj (r*n) n))];push_cast[sub_zero,Ai,ϋ,ϳ,ϑ,Κ,n8];constructor<;>refine ϔ rfl λj e=>?_<;>rw[ϥ]at e;exacts[Yx x u _ (d _ ((by exact V1 (r*n) j)) ((by exact O1 e (r*n)))),Ye _ u (d _ ((by exact V1 (r*n) j)) ((by exact O1 e (r*n))))] @[inline]def Y0(a b:Ἀ):Ἀ:=if b<=a then a-b else b-a lemma YO_h1(a b:Ἀ)(h:b<=a):(((a-b)*(a-b):Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[G4,pO h,sq] lemma YO_h2(a b:Ἀ)(h:a<=b):(((b-a)*(b-a):Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[G4,pO h,<-neg_sub (a:ℚ),neg_mul_neg,sq] lemma YO(a b:Ἀ):((Y0 a b*Y0 a b:Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[Y0];split_ifs with h .exact YO_h1 a b h .exact YO_h2 a b (Zw h) lemma VF_h1(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(m Y c:ℚ)(w:0sq_nonneg _) (C3 _) rw[h,le_div_iff₀ (mul_pos ((T9 (α:=ℚ)).2 w) ((T9 (α:=ℚ)).2 w)),nv]at e;exact(mul_nonneg_iff_of_pos_right (pow_pos hc 2)).1 e lemma VF_h2(u:ℤ):(2:ℚ)^(2*u-298)=(2^(u-149))^(2:Ἀ):=by rw[<-ZF,<-zpow_mul,Int.sub_mul,Int.mul_comm];rfl theorem VF_h3(Q S c n:ℚ)(h:n≠0):(Q*c^(2:Ἀ)-2*(S*c)*(S*c/n)+n*(S*c/n)^(2:Ἀ))/n=(n*Q-S^(2:Ἀ))*c^(2:Ἀ)/(n*n):=by have ht:n*(S*c/n)=S*c:=mul_div_cancel₀ _ h;rw[sub_mul,<-mul_pow];generalize S*c/n=t at ht⊢;rw[<-ht,<-mul_div_mul_left _ n h];generalize c^(2:Ἀ)=C;exact congrArg (·/(n*n)) (by ring) lemma VF(n:Ἀ)(x:(Ἂ Word))(r u:Ἀ)(w:0jZW x[j]! =0\/u<=ZZ x[j]!): let pn:=Ym x u (r*n) (r*n+n) 0 0 let Q:=Yl x u (r*n) (r*n+n) 0 0 0 0 no n x r=((pn.1:ℚ)-pn.2)*2^((u:Ἁ)-149)/n/\ XH n x r (no n x r)= ((n*Q-Y0 pn.1 pn.2*Y0 pn.1 pn.2:Ἀ):ℚ)* 2^(2*(u:Ἁ)-298)/((n*n:Ἀ):ℚ):=by intro pn Q;obtain⟨d,m⟩:=VW n x r u t;simp only[Int.cast_sub,P5]at d;have g:no n x r=(pn.1-pn.2)*2^((u:Ἁ)-149)/n:=by rw[no,Yk,Ai,d] have l:=VF_h2 u;generalize q:(2:ℚ)^((u:Ἁ)-149)=c at d g l⊢ generalize o:(pn.1:ℚ)-pn.2=S at d g⊢;have h:XH n x r (no n x r)=(n*Q-S^(2:Ἀ))*c^(2:Ἀ)/(n*n):=by rw[rowVariance,Yk,Ai,g,ϔ ἅ λj _=>sub_sq _ _,nJ,nF,<-n8,<-Gv,d,m,l,Vj,Xy,nsmul_eq_mul];exact VF_h3 _ _ _ _ ((Qo (R:=ℚ)).2 w.ne') have v:0<=n*Q-S^(2:Ἀ):=VF_h1 n x r _ _ c w (q▸zpow_pos two_pos _) h refine⟨g,?_⟩;rw[h,pO ((N5 (α:=ℚ)).1 (by rw[YO,G4,o];exact sub_nonneg.1 v)),YO,o,l,G4,G4] def sg(s:Ἆ)(M:ℚ):ℚ:=if s then-M else M lemma Q6(w:kF):(ZC w !=0)=!decide (ZW w=0):=by rw[show(ZC w !=0)=!(ZC w==0)from ἅ,YK] lemma Y2(w:kF):ZA w=sg (ZX w) (ZW w)*2^((ZZ w:Ἁ)-149):=by rw[Y1,Vr];rw[sg];simp only [ite_mul,neg_mul,one_mul] lemma Yn_h1(a b:Ἀ)(h:arfl exact this.trans (e.trans_le (by linarith only[Aa z])) lemma fA(x y:Ἅ)(h:fv x)(j:fv y)(g:|rv x+rv y|<=(2:ℝ)^(971:Ἁ)): fv (x+y)/\|rv (x+y)-(rv x+rv y)|<=|rv x+rv y|/2^(53:Ἀ)+1/2^(1075:Ἀ):=by have⟨d,e⟩:=ii x y h j (g.trans (pm 971 AP));exact⟨d,by rw[e];exact jy _⟩ lemma fM(x y:Ἅ)(h:fv x)(j:fv y)(g:|rv x*rv y|<=(2:ℝ)^(971:Ἁ)): fv (x*y)/\|rv (x*y)-rv x*rv y|<=|rv x*rv y|/2^(53:Ἀ)+1/2^(1075:Ἀ):=by have⟨d,e⟩:=jo x y h j g;exact⟨d,by rw[e];exact jy _⟩ lemma kc(b:ἆ):(lq (mF b))=(lq (b&&&0xfffffffffffff))+2^(52:Ἀ):=by have d:(lq (b&&&0xfffffffffffff))<2^(52:Ἀ):=by rw[Ε];exact AO ϝ (by decide) rw[mF];rw[my,show(lq (0x10000000000000:ἆ))=2^(52:Ἀ)*1 from ἅ,Nat.or_comm,<-Ϥ d,ϻ,Τ] lemma jh(v Y U:ℝ)(d:Ἆ)(M L c:ℕ)(o:0simp only[ἁ,υ,Am]at j⊢<;>constructor;linear_combination t+AI l o-j;linear_combination r+AI m o+j;linear_combination r+AI l o+j;linear_combination t+AI m o-j end NF namespace NE open Core (iW) open NF Dense.F open Dense (ay) @[inline]def mx(a b:ἆ):ἆ:=if arename_i h<;>rw[μ]at h<;>omega @[inline]def pk(s:Ἆ)(q σ:ἆ):Ἃ:= (N3 ((if s then(0x80000000:ἆ)else 0)+((σ-146)<<<23+Core.ar (((2:ἆ)*q+1)<<<36)))) @[inline]def el(x g b:Ἃ)(nd nS R pz:Ἅ)(A1 A2 C1:ἆ)(slow:Unit->Ἃ):Ἃ:= let v:=(dw x*nd+nS)*dw g*R+dw b*pz let B:=v.toBits let E:=eF B let σ:=E-C1 let M:=mF B let L:=M&&&0x7FFFFFF let c:=mx (mx (E+10) (iW b+A1)) (iW g+A2)-E if 146<=σ&&σ<=398&&c<=25&&(1<<>>63!=0) (M>>>27) σ else slow () theorem kj_h1(c x y:ℕ)(hc:c<=2^(31:Ἀ))(hx:x<=252)(hy:y<=2^(24:Ἀ)):(c+(x*2^(23:Ἀ)%2^(64:Ἀ)+y)%2^(64:Ἀ))%2^(64:Ἀ)%2^(32:Ἀ)=c+(x*2^(23:Ἀ)+y):=by have a:x*2^(23:Ἀ)<=252*2^(23:Ἀ):=ι _ hx have b:x*2^(23:Ἀ)+y<=252*2^(23:Ἀ)+2^(24:Ἀ):=M3 a hy have d:c+(x*2^(23:Ἀ)+y)<=2^(31:Ἀ)+(252*2^(23:Ἀ)+2^(24:Ἀ)):=M3 hc b rw[γ (C0 a (by decide):x*2^(23:Ἀ)<2^(64:Ἀ)),γ (C0 b (by decide):x*2^(23:Ἀ)+y<2^(64:Ἀ)),γ (C0 d (by decide):c+(x*2^(23:Ἀ)+y)<2^(64:Ἀ)),γ (C0 d (by decide))] theorem kj_h2(x:ℕ)(l:x<2^(26:Ἀ)):(2*x%2^(64:Ἀ)+1)%2^(64:Ἀ)=2*x+1:=by have a:2*x<2*2^(26:Ἀ):=M7 l (by decide) rw[γ (I4 a (by decide):2*x<2^(64:Ἀ)),γ (C0 (l7 a) (by decide):2*x+1<2^(64:Ἀ))] theorem kj_h3(N S x y:ℕ)(j:2^(25:Ἀ)<=x)(l:x<2^(26:Ἀ))(m:146<=y)(o:y<=398)(g:N=(2*x+1)*2^(36:Ἀ))(h:S=y-36):2^(62:Ἀ)<=N/\N<2^(63:Ἀ)/\110<=S/\S<363:=by subst g h;omega theorem kj_h4(c:Ἆ)(A B P:ℤ):(if c then -A else A)*(B*P)=(if c then -(A*B) else A*B)*P:=by cases c;exact (Ap A B P).symm;exact (neg_mul A (B*P)).trans ((congrArg Neg.neg (Ap A B P).symm).trans (neg_mul (A*B) P).symm) lemma kj(s:Ἆ)(q σ:ἆ)(j:2^(25:Ἀ)<=(lq q))(l:(lq q)<2^(26:Ἀ))(m:146<=(lq σ)) (o:(lq σ)<=398):pk s q σ=az s ((2:ἆ)*q+1) σ:=by have d:(lq ((2:ἆ)*q+1))=2*(lq q)+1:=by rw[η,ύ];simp only[kA];exact kj_h2 _ l have g:(lq (((2:ἆ)*q+1)<<<36))=(2*(lq q)+1)*2^(36:Ἀ):=by rw[ψ,d];simp only[kA,kH,ο];exact γ ((ι (2^(36:Ἀ)) (l7 (M7 l (by decide)))).trans_lt (by decide)) have h:(lq (σ-36))=(lq σ)-36:=by rw[χ σ 36 (AZ (by decide) m:36<=(lq σ))];rfl have H:=kj_h3 _ _ _ _ j l m o g h;obtain⟨r,-,t⟩:=bM s (((2:ἆ)*q+1)<<<36) (σ-36) H.1 H.2.1 H.2.2.1 H.2.2.2;have p:(mJ (pk s q σ))=(if s then 2^(31:Ἀ) else 0)+(((lq σ)-146)*2^(23:Ἀ)+(lq (ar (((2:ἆ)*q+1)<<<36)))):=by rw[pk,Ϫ,η,η,ψ,χ σ 146 m];cases s<;>simp only[ἁ,ἂ,υ,kA,kH,ο]<;>exact kj_h1 _ _ _ (by decide) (G5 o 146) t rw[(by clear p r t;rw[cl s _ _ (by rw[d];exact W9 _) (o.trans (by decide)),cl s _ _ (by rw[g];exact Yu (W9 _) (by decide)) (by rw[h];exact(Y4 _ _).trans (o.trans (by decide))),d,g,h,(by rw[<-AF,BQ (AZ (by decide) m:36<=(lq σ))]:(2:Ἁ)^(lq σ)=2^(36:Ἀ)*2^((lq σ)-36)),G4,B4,nZ,kj_h4]:az s ((2:ἆ)*q+1) σ=az s (((2:ἆ)*q+1)<<<36) (σ-36))];apply Β.1;rw[p,r,h,D8] lemma pB(a b:ℝ)(p q:ℕ)(d:|a|<=2^p)(e:|b|<=2^q):|a*b|<=2^(p+q):=by rw[Ae,AF];exact mul_le_mul d e (Aa _) (by positivity) theorem sB_h1(a b c:ℝ)(d:|a|<=c)(e:|b|<=c):|a+b|<=c*2:=(Ag a b).trans ((add_le_add d e).trans_eq (mul_two c).symm) lemma sB(a b:ℝ)(p:ℕ)(d:|a|<=2^p)(e:|b|<=2^p):|a+b|<=2^(p+1):=(sB_h1 a b _ d e).trans_eq (A4 _ _).symm lemma eB(x y:ℝ)(p:ℕ)(h:|x-y|<=|y|/2^(53:Ἀ)+1/2^(1075:Ἀ))(g:|y|<=2^p):|x|<=2^(p+1):=by have e:(1:ℝ)<=2^p:=one_le_pow₀ (by norm_num);have d:(1:ℝ)/2^(1075:Ἀ)<=1/2^(1:Ἀ):=AV (by norm_num) (by norm_num);rw[pow_one]at d;have:=AY x y;rw[A4];grind lemma mo(a:ℝ)(p q:ℕ)(h:|a|<=2^p)(d:p<=q):|a|<=2^q:= h.trans (AU (by norm_num) d) lemma z9(a:ℝ)(p:ℕ)(h:|a|<=2^p)(d:p<=971):|a|<=(2:ℝ)^(971:ℤ):=by rw[show(971:ℤ)=((971:ℕ):ℤ)from ἅ,AA];exact mo a p 971 h d lemma wB(w:kF):|(sv w:ℝ)*2^kG w|<=2^(24+kG w):=by rw[Ae,AW (by positivity:(0:ℝ)<2^idxOf w),AF];have:|(sv w:ℝ)|<=2^(24:Ἀ):=by rw[<-mI,Ϲ];exact_mod_cast(bg w).le exact AE this (by positivity) theorem jM_h1(x y e τ:ℝ)(h:x-y<=e)(k:e<=x/2^(53:Ἀ)+τ)(hv:0<=y)(m:0<=τ):x<=2*y+2*τ:=by linarith theorem jM_h2(n c o:ℕ)(h:n+1056<=c+o):(2:ℝ)^n<=2^c*2^((o:ℤ)-1075)*2^(19:Ἀ):=by rw[<-AA (2:ℝ) n,<-AA (2:ℝ) c,<-AA (2:ℝ) 19,<-AK AL,<-AK AL,<-add_sub_assoc,sub_add];exact AG one_le_two (le_sub_iff_add_le.2 (O4.2 h)) lemma jM(A H w p G R κ l a t j v q:ℝ)(o c E u y x:ℕ) (hA:A=H+w) (he:|w+p|<=q) (z:|a-A|<=|A|/2^(53:Ἀ)+1/2^(1075:Ἀ)) (B:|t-a*G|<=|a*G|/2^(53:Ἀ)+1/2^(1075:Ἀ)) (D:|j-t*R|<=|t*R|/2^(53:Ἀ)+1/2^(1075:Ἀ)) (V:|v-(j+l)|<=|j+l|/2^(53:Ἀ)+1/2^(1075:Ἀ)) (g:0<=R) (hR:|R-κ|<=R/2^(50:Ἀ)) (hκ:0<=κ) (Y:|v|<=2^(53:Ἀ)*(2:ℝ)^((o:ℤ)-1075)) (ah:|l|<=2^(24+E+x)) (hG:|G|<=2^(24+u)) (a0:u<=254) (a6:κ<=2^(53:Ἀ)) (al:R<=2^(52:Ἀ)) (as:10<=c) (aH:E+x+1056<=c+o) (N:q=0\/(q=2^y/\y+u+1154<=c+o)): |v-((H-p)*G*κ+l)|<=2^c*(2:ℝ)^((o:ℤ)-1075):=by refine(?_:_<=(|v|+|l|)/2^(45:Ἀ)+q*|G| *κ+(4*(1/2^(1075:Ἀ))+4*(1/2^(1075:Ἀ)*R)+4*(1/2^(1075:Ἀ)*(|G| *R)))).trans ?_;obtain⟨τ,hτ⟩:∃τ:ℝ,τ=1/2^(1075:Ἀ):=⟨_,rfl⟩;rw[<-hτ]at z B D V⊢;have m:0<=τ:=hτ▸(by positivity);have r:=Aa G;rw[Ae a G]at B;rw[Ae t R,Ad g]at D;have X:|j+l|<=2*|v|+2*τ:=jM_h1 _ _ _ _ ((AY (j+l) v).trans_eq (Aw _ _)) V (Aa v) m have K:|a| *|G|<=2*|t|+2*τ:=by have:=AY (a*G) t;rw[Aw,Ae]at this;exact jM_h1 _ _ _ _ this B (Aa t) m have J:|A|<=2*|a|+2*τ:=jM_h1 _ _ _ _ ((AY A a).trans_eq (Aw _ _)) z (Aa a) m rw[show v-((H-p)*G*κ+l)=(v-(j+l))+(j-t*R)+(t-a*G)*R+(a-A)*(G*R)+A*G*(R-κ)+(w+p)*G*κ by rw[hA];ring];have T:∀a b c d e f:ℝ,|a+b+c+d+e+f|<=|a|+|b|+|c|+|d|+|e|+|f|:=λa b c d e f=>(Ag _ f).trans (add_le_add ((Ag _ e).trans (add_le_add ((Ag _ d).trans (add_le_add ((Ag _ c).trans (add_le_add (Ag a b) AP)) AP)) AP)) AP) refine(T _ _ _ _ _ _).trans ?_;simp only[Ae,Ad g,Ad hκ];linear_combination V+X/2^(53:Ἀ)+D+AE B g+19*AE K g/2^(53:Ἀ)+AE z (Af r g)+9*AE J (Af r g)/2^(53:Ἀ)+mul_le_mul_of_nonneg_left hR (Af (Aa A) r)+AE (AE he r) hκ+78*(by have:=Ag (j+l) (-l);rw[add_neg_cancel_right,BE]at this;exact this.trans (add_le_add X AP):|j|<=2*|v|+2*τ+|l|)/2^(53:Ἀ)+39*(by have:=AY (t*R) j;rw[Aw,Ae,Ad g]at this;exact jM_h1 _ _ _ _ this D (Aa j) m:|t| *R<=2*|j|+2*τ)/2^(53:Ἀ)+98*Aa v/2^(53:Ἀ)+178*Aa l/2^(53:Ἀ)+18014398509481748*m/2^(53:Ἀ)+27021597764222938*Af m g/2^(53:Ἀ)+27021597764222958*Af m (Af r g)/2^(53:Ἀ) have Pp:(0:ℝ)<=2^((o:ℤ)-1075):=by positivity have F1:=jM_h2 _ c o aH;have F3:=jM_h2 0 c o ((N2 1056 (E+x)).trans aH);rw[AF (2:ℝ) E x]at F1;rw[AF (2:ℝ) (24+E) x,AF (2:ℝ) 24 E]at ah have t3:q*|G| *κ<=2^c*2^((o:ℤ)-1075)/4:=by rcases N with I|⟨I,aL⟩;rw[I,nv,nv];positivity;rw[I];have h:=jM_h2 (y+u+98) c o aL;rw[AF (2:ℝ) (y+u) 98,AF (2:ℝ) y u]at h;generalize(2:ℝ)^((o:ℤ)-1075)=P at h⊢;linear_combination mul_le_mul (mul_le_mul_of_nonneg_left (hG.trans_eq (AF (2:ℝ) 24 u)) (pow_nonneg zero_le_two y)) a6 hκ (by positivity)+h/2^(21:Ἀ) have g1:|G|<=2^(278:Ἀ):=hG.trans (AU one_le_two (J1 a0 24));have a3:(1:ℝ)/2^(1075:Ἀ)*(|G| *R)<=1/2^(25:Ἀ):=calc _<=(1:ℝ)/2^(1075:Ἀ)*(2^(278:Ἀ)*2^(52:Ἀ)):=mul_le_mul_of_nonneg_left (mul_le_mul g1 al g (by positivity)) (by positivity) _=1/2^(745:Ἀ):=by rw[div_mul_eq_mul_div,one_mul,<-AF,div_eq_div_iff (by positivity) (by positivity),one_mul,<-AF]<;>rfl _<=_:=AV (by norm_num) (by norm_num) have a2:(1:ℝ)/2^(1075:Ἀ)*R<=1/2^(25:Ἀ):=calc _<=(1:ℝ)/2^(1075:Ἀ)*2^(52:Ἀ):=mul_le_mul_of_nonneg_left al (by positivity) _=1/2^(1023:Ἀ):=by rw[div_mul_eq_mul_div,one_mul,div_eq_div_iff (by positivity) (by positivity),one_mul,<-AF]<;>rfl _<=_:=AV (by norm_num) (by norm_num) generalize(2:ℝ)^((o:ℤ)-1075)=P at Y Pp F1 F3 t3⊢;linear_combination Y/2^(45:Ἀ)+AE (AU (one_le_two:(1:ℝ)<=2) as) Pp/4+ah/2^(45:Ἀ)+F1/2^(21:Ἀ)+t3+4*a2+4*a3+4*(AV (by norm_num) (by norm_num):(1:ℝ)/2^(1075:Ἀ)<=1/2^(25:Ἀ))+F3/2^(21:Ἀ) end NE namespace NR open NF Dense.F open Dense (ay) @[inline]def pt(j:Ἀ):Ἅ:=P.get! (j+1) @[inline]def p2(e:Ἀ):Ἅ:=pt (min e 254)*pt (e-min e 254) lemma jw(j:Ἀ)(g:j<=254):fv (pt j)/\rv (pt j)=(2:ℝ)^j:=by have d:P.get! (j+1)=P.data[j+1]!:=by cases P;rfl have k:j+1<256:=C9 (C9 g) rw[pt,d,AB P.data (j+1) (by simp only[P,Ϝ];exact k.trans (by decide))];simp only[P,Λ,AD k];exact iJ j (g.trans (by decide)) theorem jv_h1(e:Ἀ)(l:e<=508):po e 254<=254/\(-1074:ℤ)<=e/\1+e<=971/\po e 254+(e-po e 254)=e:=⟨Jp _ _,AZ (by decide) (Kx _),(J1 l 1).trans (by decide),R5 (O7 _ _)⟩ theorem jv_h2(e:Ἀ)(l:e<=508):e-po e 254<=254:=Vo.2 ((Oy.2 ⟨N2 e 254,l⟩).trans_eq (Nat.add_min_add_left 254 e 254)) lemma jv(e:Ἀ)(l:e<=508):fv (p2 e)/\rv (p2 e)=(2:ℝ)^e:=by have H:=jv_h1 e l;obtain⟨d,h⟩:=jw (po e 254) H.1;obtain⟨g,j⟩:=jw _ (jv_h2 e l);have:=aE _ _ d g 1 (e:ℤ) (by rw[h,j,<-AF,AA];push_cast;rw[one_mul];congr 1;exact H.2.2.2) (by decide) H.2.1 (bL 1 e 971 H.2.2.1 (by norm_num) 1 (by decide));rw[p2];refine⟨this.1,?_⟩;rw[this.2,AA];simp only [Ud,one_mul] structure fH where td:Ἃ ok:Ἆ nS:Ἅ R:Ἅ pz:Ἅ A1:ἆ A2:ἆ C1:ἆ @[noinline]def eI(n:Ἀ)(t:Ἀ×Ἀ×Ἆ×Ἀ×Ἀ×Ἃ):fH:= let k2:=t.2.1-21 let Sm:=VO t.2.2.2.1 (t.2.1-k2)+(t.2.2.2.2.1>>>k2) let es:=k2+t.1 let d:=t.2.2.2.2.2 let D:=(I0 n)*Core.mW d let lD:=Core.ai D let s:=lD-11 let R0:=((0x8000000000000000/D)<<>>53==0&& decide (es<=500), (if t.2.2.1 then z.toInt64 else(0-z).toInt64).toFloat*p2 es, R0.toInt64.toFloat,p2 (lq Zr),Zr+1056,if k2==0 then 0 else (I0 es)+1154,Zr+900⟩ lemma kn(D s:ἆ)(d L:Ἀ)(m:(lq D)=d)(h:2^L<=d)(j:d<2^(L+1)) (y:(lq s)=L-11)(t:11<=L)(u:L<=36): (lq (((0x8000000000000000/D)<<>>(k-21))=((o<<>>(k-21):=by simp only[ο,β];rw[show o*2^k=o*2^(k-(k-21))*2^(k-21) by rw[Ap,<-AF,J4 (Y4 k 21)],Τ _ v,Ρ _ _ (϶ _),Τ] rw[Yz,e3]at h⊢ clear e3 simp only[Η,AJ,BM,AM,Ak,θ,kA,AQ]at h obtain⟨⟨⟨⟨⟨⟨hn,a4⟩,aH⟩,t⟩,A⟩,a7⟩,Q⟩:=h have q:((o<<>>(k-21)<2^(53:Ἀ):=(ZJ (϶ 53)).1 ((β _ 53).symm.trans a7) generalize hS:(o<<>>j=e at q⊢ have ba:2^(23:Ἀ)<=kM d:=by rw[kM,AC aH];exact V1 _ _ have p:(lq ((I0 n)*mW d))=n*kM d:=by rw[ύ,Α (hn.trans (by decide)),an,γ];exact(ϕ hn (lB d)).trans (by decide) generalize (I0 n)*mW d=D at t A p⊢ have hL:=Y7 D generalize ai D=x at t A hL⊢ have w:n*kM d≠0:=Yu a0.ne' (AN (϶ 23) ba).ne' obtain⟨I,al⟩:2^(lq x)<=n*kM d/\n*kM d<2^((lq x)+1):=by rw[hL,p];exact⟨ϰ w,ϙ⟩ have J:=kn _ (x-11) _ _ p I al (by rw[χ _ _ (t:11<=x)];rfl) t A generalize((0x8000000000000000/D)<<<(x-11))+(((0x8000000000000000%D)<<<(x-11))/D)=g at J⊢ have l:0<(n*kM d:Ἀ):=ϵ w have K:(lq g)<=2^(52:Ἀ):=by rw[J,AF];exact(pq I (϶ (lq x))).trans (Xk _ (϶ (lq x))).le have M:2^(51:Ἀ)<=(lq g):=by rw[J,mc l,show 52+(lq x)=51+((lq x)+1) from Nat.succ_add 51 (lq x),AF];exact X3 _ al.le have bs:=cP d have bA:kG d+(lq x)+52<=342:=L1 (M3 bs A) 52 have r:(lq (iW d+x+52))=kG d+(lq x)+52:=by rw[η,η,am d];simp only[kA];rw[γ (AO ((V1 _ 52).trans bA) (by decide)),γ (AO bA (by decide))] generalize iW d+x+52=Zu at r⊢ have V:sv d=kM d:=by rw[sv,AC (by simp[a4])] refine⟨e,j+u,kG d+(lq x)+52,(lq g),(2:ℝ)^(52+(lq x))/(n*kM d:Ἀ),(AN hn (by decide)),?_,q,Q,?_,?_,K,div_nonneg (pow_nonneg (zero_le_two:(0:ℝ)<=2) _) (C3 (α:=ℝ) _),?_,?_,(bA.trans (by decide)),?_,?_,?_,?_,?_⟩ have hz:(lq (I0 e))=e:=Α (q.trans (by decide)) have W:(B6 (if X then (I0 e).toInt64 else(0-(I0 e)).toInt64))=if X then(e:ℤ)else-(e:ℤ):=by split;show ae (I0 e)=_;rw[ay,hz,AC (I8.2 (q.trans (by decide))),Int.sub_zero];exact ke_h1 e q have z5:(K7 (if X then(e:ℤ)else-(e:ℤ)))<2^(53:Ἀ):=by rw[Ax K7,Gn,ite_self];exact q have B:=dB _ (by rw[W];exact z5) rw[W]at B obtain⟨f2,v2⟩:=jv (j+u) (Q.trans (by decide)) have:=aE _ _ B.1 f2 _ _ (by rw[B.2,v2,AA]) z5 (AZ (by decide) (Kx _)) (bL 53 (j+u) 971 ((J1 Q 53).trans (by decide)) AP _ z5) refine⟨this.1,?_⟩ rw[this.2,AA,Ax (Zn:ℤ->ℝ),Ue,P5] rw[<-as] by_cases z:j=0 exact⟨0,by rw[<-m,z,Nat.shiftRight_zero,Κ,sub_self,A5],pZ ἅ⟩ refine⟨2^(j+u),?_,BA ⟨ἅ,by simp only[z,AQ,Am];rw[η,Α (AO Q (by decide):j+u<2^(64:Ἀ))];simp only[kA];exact γ (AO (L1 Q 1154) (by decide))⟩⟩ have a1:(e:ℝ)*2^j<=S:=(by rw[<-m,β,<-ke_h2,<-G4,N5];exact pr _ _) have a2:(S:ℝ)by have e:(lq (a-b))=2^(64:Ἀ)-((lq b)-(lq a)):=Kz (x:=a.toBitVec) (y:=b.toBitVec) (μ.2 g);rw[e]at h;exact absurd h (I8.2 (AN (by decide) (N9 ((Y4 _ _).trans hb) _))) theorem jn_h2(X G P Bs Bk κ n D c:ℝ)(hn:n≠0)(hD:D≠0)(hc:c≠0):(X*n-P)*G*κ+Bs*(Bk*(κ*n*D*c))=((X/c-P/n/c)*(G/c)/D+Bs*Bk/c)*(c*(κ*n*D*c)):=by have h1:(X/c-P/n/c)*(G/c)/D*(c*(κ*n*D*c))=(X*n-P)*G*κ:=by rw[←sub_div,div_mul_div_comm,div_div,mul_comm (c*c) D,div_mul_eq_mul_div,mul_comm c (κ*n*D*c),Ap (κ*n*D) c c,Ap (κ*n) D (c*c),mul_div_assoc,mul_div_cancel_right₀ _ (mul_ne_zero hD (mul_ne_zero hc hc)),mul_comm κ n,←Ap ((X-P/n)*G) n κ,mul_right_comm (X-P/n) G n,sub_mul,div_mul_cancel₀ _ hn] have h2:Bs*Bk/c*(c*(κ*n*D*c))=Bs*(Bk*(κ*n*D*c)):=(div_mul_eq_mul_div _ _ _).trans ((congrArg (·/c) (mul_left_comm _ _ _)).trans ((mul_div_cancel_left₀ _ hc).trans (Ap _ _ _))) exact ((add_mul _ _ _).trans (congrArg₂ (·+·) h1 h2)).symm theorem jn_h4(A J:ℤ):A-(900+J)=A-1075+27-149-J+297:=by rw[sub_add (A-1075+27-149) J 297,sub_sub (A-1075+27) 149 (J-297),sub_add A 1075 27,sub_sub A (1075-27) _,←add_assoc,add_sub (1075-27+149) J 297,add_sub_right_comm];rfl lemma jn(x g b d:kF)(y:Unit->kF)(n u k J K:ℕ)(sS:Ἆ)(ρ:NR.fH)(l:ℚ) (hρ:ρ=NR.eI n (u,k,sS,J,K,d))(hx:kB x≠255)(hg:kB g≠255)(hb:kB b≠255)(b6:0absurd M (by rw[h0];exact I8.2 (U1 (by decide) (V1 _ _))) have aL:=eK (eF V.toBits+10) (iW b+ρ.A1);have D:=eK (mx (eF V.toBits+10) (iW b+ρ.A1)) (iW g+ρ.A2);obtain⟨b4,A,b5⟩:(lq (eF V.toBits+10))=(lq (eF V.toBits))+10/\(lq (iW b+ρ.A1))=kG b+j+1056/\(lq (iW g+ρ.A2))=kG g+(lq ρ.A2):=by rw[η,η,η,am,am,bh];simp only[kA];exact⟨γ (AN (B3 eb 10) (by decide)),(γ (AO (M3 ib (L1 Jb 1056)) (by decide))).trans (pA _ _ _).symm,γ (AO (M3 ig Ab) (by decide))⟩ rw[b4,A]at aL;rw[aL,b5]at D;have ah:eF V.toBits<=mx (mx (eF V.toBits+10) (iW b+ρ.A1)) (iW g+ρ.A2):=by rw[θ,D];exact le_max_of_le_left (le_max_of_le_left (V1 _ _)) have z:=χ _ _ ah;rw[D]at z;generalize mx (mx (eF V.toBits+10) (iW b+ρ.A1)) (iW g+ρ.A2)-eF V.toBits=cc at z X B as;have L:(lq ((1:ἆ)<<⟨h0,by rw[z,J4 (le_max_of_le_left (le_max_of_le_left (V1 _ _))),hA];exact le_max_of_le_right (Y3 ((congrArg (·+1154) (Τ es (kG g))).trans (pA _ _ _)))⟩ have m:=jM _ (rv (dw x*p)) _ ((if sS then-(S:ℝ)else S)*2^u) _ _ κ (rv (dw b*ρ.pz)) _ _ _ _ eS (lq (eF V.toBits)) (lq cc) _ _ es j ἅ (by rw[E.2];split;rw[neg_mul,<-sub_eq_add_neg];exact Q;rw[neg_mul,neg_add_eq_sub,Aw];exact Q) ha.2 ht.2 G.2 hv.2 (hR.2▸C3 _) (hR.2▸hK) dd bv bB (vg▸wg) ig ((sub_le_iff_le_add'.1 ((le_abs_self _).trans ((Aw _ _).trans_le hK))).trans ((add_le_add (hR.2▸(le_abs_self _).trans bR) (div_le_div_of_nonneg_right (hR.2▸(le_abs_self _).trans bR) (by positivity))).trans ((add_le_add AP (div_le_self (pow_nonneg (zero_le_two:(0:ℝ)<=2) 52) (one_le_pow₀ (one_le_two:(1:ℝ)<=2)))).trans_eq ((two_mul _).symm.trans (pow_succ' (2:ℝ) 52).symm)))) ((le_abs_self _).trans bR) (z▸M5 (le_max_of_le_left (le_max_of_le_left (Τ _ _).le))) (by rw[z,J4 (le_max_of_le_left (le_max_of_le_left (V1 _ _)))];exact le_max_of_le_left (le_max_right _ _)) al have t2:(2:ℝ)≠0:=AL have hY:((sv x:ℝ)*2^kG x*n-(if sS then-(S:ℝ)else S)*2^u)*((sv g:ℝ)*2^kG g)*κ+(sv b:ℝ)*2^(kG b+j)=(((ZA x-l)*ZA g/ZA d+ZA b:ℚ):ℝ)*(2^(149:Ἀ)*2^j):=by have e:∀w:kF,((ZA w:ℚ):ℝ)=(sv w:ℝ)*2^kG w/2^(149:Ἀ):=λw=>by rw[Y1,V7,X8,D9,U7,Ac t2,AA,zpow_ofNat,mul_div_assoc] rw[Ji,Jk,V7,Uo,e x,e g,e b,o,AF,hZ] exact jn_h2 _ _ _ _ _ _ _ _ _ (Qo.2 b6.ne') hD (pow_ne_zero _ t2) rw[hXn,r.2,vg,hY]at m generalize(ZA x-l)*ZA g/ZA d+ZA b=Y at m a2⊢ obtain⟨lo,hi⟩:=jh (rv V) ((Y:ℝ)*(2^(149:Ἀ)*2^j)) ((2:ℝ)^(((lq (eF V.toBits)):ℤ)-1075)) _ (lq (mF V.toBits)) ((lq (mF V.toBits))%2^(27:Ἀ)) (lq cc) W a3 ἅ B ((γ ((L6 (ϊ _ (϶ 27)) (B.trans (ϊ _ (϶ 27)))).trans (by decide):(lq (mF V.toBits))%2^(27:Ἀ)+2^(lq cc)<2^(64:Ἀ))).symm.trans_lt as) m obtain⟨q,hq⟩:∃q,q=(lq (mF V.toBits))/2^(27:Ἀ):=⟨_,rfl⟩ rw[<-hq]at lo hi have b7:2^(25:Ἀ)<=q:=hq▸(mc (϶ 27)).2 (AZ (by decide) d1) have cb:q<2^(26:Ἀ):=hq▸Ϟ (N.trans_eq (by decide)) have q0:q≠0:=(AN (by decide) b7).ne' obtain⟨e,he⟩:∃e:ℤ,e=((lq (eF V.toBits)):ℤ)-1075+27-149-j:=⟨_,rfl⟩ have e4:(2:ℝ)^(27:Ἀ)*((2:ℝ)^(((lq (eF V.toBits)):ℤ)-1075))=(2:ℝ)^e*(2^(149:Ἀ)*2^j):=by rw[he,<-AA (2:ℝ) 149,<-AA (2:ℝ) j,<-AA (2:ℝ) 27,<-AK t2,<-AK t2,<-AK t2];exact congrArg (fun t:ℤ=>(2:ℝ)^t) (by rw[nZ,nZ,sub_sub,sub_add_cancel,add_comm]) have hP:(0:ℝ)<2^(149:Ἀ)*2^j:=((by positivity)) rw[Ap,e4,<-Ap]at lo rw[Ap,e4,<-Ap ((q:ℝ)+1)]at hi obtain⟨s,hs⟩:∃s,s=(V.toBits>>>63!=0):=⟨_,rfl⟩ rw[<-hs]at lo hi a3⊢ generalize(2:ℝ)^(149:Ἀ)*2^j=K at lo hi hP have kq:(if s then-((Y:ℝ)*K)else(Y:ℝ)*K)=(((if s then-Y else Y:ℚ)):ℝ)*K:=by by_cases h:s=true;rw[AD h,AD h,Up,neg_mul];rw[AC h,AC h] rw[kq]at lo hi have a6:(q:ℚ)*2^e<(if s then-Y else Y):=Gl.1 (show (((q:ℚ)*2^e:ℚ):ℝ)<((if s then-Y else Y:ℚ):ℝ) by rw[V7,X8,R7,U7];exact BF lo hP.le) have A:(if s then-Y else Y)<((q:ℚ)+1)*2^e:=Gl.1 (show ((if s then-Y else Y:ℚ):ℝ)<((((q:ℚ)+1)*2^e:ℚ):ℝ) by rw[V7,X8,Ji,R7,Rat.cast_one,U7];exact BF hi hP.le) have a0:(0:ℚ)<2^e:=((by positivity)) have v:0<(if s then-Y else Y):=AO (Af (C3 _) a0.le) a6 have tA:|Y|=(if s then-Y else Y)∧(Y≠0->decide (Y<0)=s):=by by_cases h:s=true;rw[AD h]at v⊢;exact⟨abs_of_neg (neg_pos.1 v),λ_=>h▸A6 (neg_pos.1 v)⟩;rw[AC h]at v⊢;exact⟨AW v,λ_=>(M9.2 h)▸decide_eq_false (not_lt.2 v.le)⟩ obtain⟨δ,hδ⟩:∃δ,δ=(if s then-Y else Y)/2^e-q:=⟨_,rfl⟩;have c3:0<δ:=hδ▸sub_pos.2 ((lt_div_iff₀ a0).2 a6) have d2:(Aq q)=25:=(mz q0).2 ⟨b7,cb⟩;have e3:(lq (mF V.toBits>>>27))=q:=(ν _ _).trans ((β _ _).trans hq.symm) have E5:((lq (eF V.toBits-ρ.C1)):ℤ)=e+297:=by rw[ds,he,pO (AZ (N2 _ _) M),K5,nZ];exact jn_h4 _ _ have k1:-126<=((25:ℕ):ℤ)+e:=AZ (show (-126:ℤ)<=((25:ℕ):ℤ)+(((146:ℕ):ℤ)-297) by decide) (add_le_add AP (sub_le_iff_le_add.2 ((O4.2 ch).trans_eq E5))) have k2:((25:ℕ):ℤ)+e<=126:=AZ (add_le_add AP (le_sub_iff_add_le.2 (E5.symm.trans_le (O4.2 c1)))) (show ((25:ℕ):ℤ)+(((398:ℕ):ℤ)-297)<=126 by decide) rw[kj _ _ _ (e3▸b7) (e3▸cb) ch c1,<-Qx s q ἃ 1 e Y δ ((2:ἆ)*(mF V.toBits>>>27)+1) (eF V.toBits-ρ.C1) tA.2 c3.le (hδ▸sub_lt_iff_lt_add'.2 ((div_lt_iff₀ a0).2 A)) ⟨λ_=>c3.ne',λ_=>ἅ⟩ one_pos (by rw[tA.1,hδ,add_sub_cancel,pJ,div_one,div_mul_cancel₀ _ a0.ne']) (by rw[W6];exact b7) (by rw[W6,d2];exact k1) (by rw[W6,d2];exact k2) (by rw[η,ύ,e3];simp only[kA,V2,Bool.or_true,ἁ,W6];exact kj_h2 _ cb) E5] end NE lemma uS{i:Ἄ}(h:(J0 i)+1Ἄ->Ἄ->Ἃ)(s:σ)(lo i e:Ἄ)(out:(Ἂ Word)):(Ἂ Word):= if h:iἌ->Ἄ->kF)(s:σ)(g e:Ἄ)(i:Ἄ)(d:(Ἂ Word))(he:(J0 e)<=(O0 d))(hd:(O0 d)<2^(32:Ἀ)): (O0 (Yq f s g i e d))=(O0 d)/\∀q<(O0 d),(Yq f s g i e d)[q]! =if (J0 i)<=q/\q<(J0 e) then f s (G0 q) ((G0 q)-g) else d[q]!:=by have:=e.toNat_lt_size induction h:(J0 e)-(J0 i) generalizing i d with |zero=> have z:=O3.mpr (V3.mp h) rw[Yq,dite_eq_right (fun x=>z (ε.mp x))];exact ⟨rfl,fun q _=>(AC (fun x=>z (C0 x.1 x.2))).symm⟩ |succ k ih=> have hi:(J0 i)<(J0 e):=N1 h have hX:(J0 i)+1?_⟩ rw[b q (by rw[hs];exact hq),uS hX,pP,AB _ _ (by rwa[Qd])] by_cases hq1:(J0 i)=q · subst hq1;rw[AC (fun c=>Vz _ c.1),AD ⟨Jv _,hi⟩,Array.getElem_set_self,lX,Kv] · rw[Je,AC hq1,<-AB d q hq] by_cases c:(J0 i)+1<=q/\q<(J0 e) · rw[AD c,AD ⟨X5 c.1,c.2⟩] · rw[AC c,AC (fun x=>c ⟨W5 x.1 hq1,x.2⟩)] @[specialize]def Yr{σ:Type}(g:Ἀ->σ)(f:σ->Ἄ->Ἄ->Ἃ)(n rows r:Ἀ)(out:(Ἂ Word)):(Ἂ Word):= if rσ)(f:σ->Ἄ->Ἄ->kF)(n d r:Ἀ)(e:(Ἂ Word))(m:d*n<2^(32:Ἀ))(he:(O0 e)=d*n): (O0 (Yr g f n d r e))=(O0 e)/\∀q<(O0 e),(Yr g f n d r e)[q]! =if r*n<=q then f (g (q/n)) (G0 q) ((G0 q)-(G0 (q/n*n))) else e[q]!:=by induction h:d-r generalizing r e with |zero=>have k0:=P4 h;rw[Yr,AC (O3.2 k0)];exact ⟨rfl,fun q hq=>by rw[AC (I8.2 ((hq.trans_eq he).trans_le (ι n k0)))]⟩ |succ k ih=> have hr:=N1 h have e1:(r+1)*n=r*n+n:=add_one_mul r n have h1:r*n+n<=d*n:=e1▸ι n hr rw[Yr,AD hr] have ha:=Conv.aa _ (((V1 _ n).trans h1).trans_lt m);have hb:=Conv.aa _ (h1.trans_lt m) obtain⟨a0,b0⟩:=ju0 f (g r) (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) e (by rw[hb,he];exact h1) (he.trans_lt m) obtain⟨a1,b1⟩:=ih (r+1) _ (by rw[a0,he]) (by rw[W4,h,BK]) refine ⟨a1.trans a0,fun q hq=>?_⟩ rw[b1 q (by rw[a0];exact hq),b0 q hq,ha,hb,e1] by_cases c1:r*n+n<=q · rw[AD c1,AD ((V1 _ _).trans c1)] · rw[AC c1];by_cases c2:r*n<=q · rw[AD ⟨c2,I8.1 c1⟩,AD c2,mG c2 ((I8.1 c1).trans_eq e1.symm)] · rw[AC (c2∘And.left),AC c2] lemma Ys{σ:Type}(g:Ἀ->σ)(f:σ->Ἄ->Ἄ->kF)(n d:Ἀ)(j:d*n<2^(32:Ἀ))(F:Fin (d*n)->kF) (h:∀q (h:qrw[cS,Yh];rw[dite_eq_right (by rw[ε];exact VN_h1 _ _ h),AC (VN_h1 _ _ h)];rename_i g;obtain⟨k,m⟩:=gO_h2 i e _ h;rw[AT (ε.2 k),AD k,g _ _ (by rw[m,W4,h,BK]),m,f6];congr 1;exact gO_h1 _ _ structure jY where l:ἆ h:ἆ c:Ἀ big:Ἀ P:Ἀ N:Ἀ @[inline]def cA(P:Ἀ)(q p:ἆ):Ἀ:=if q

>>1)>>>(63-k)else mm<<<(k-64) let l':=l+vl let h':=h+vh+(if l'dsimp only<;>unfold cF Yl Ym<;>have:=e.toNat_lt_size .rw[dite_eq_right (by rw[ε];exact O3.2 (V3.1 hk))];simp only[show¬(J0 i)<(J0 e) from O3.2 (V3.1 hk),XA,and_self] rename_i j;have m:=uS (i:=i) (C0 (N1 hk) this);rw[AT (ε.2 (N1 hk))];simp only[(N1 hk),ἁ,f6,<-m] generalize x[(J0 i)]! =w;have:=(ZD w).toNat_lt;have o:(if u<=ZD w then ZD w-u else 0)=(I0 ((lq (ZD w))-(lq u))):=ξ.1 (by split<;>rename_i g;rw[χ _ _ g,Ϣ,ZG,γ ((Y4 _ _).trans_lt this)];rw[θ]at g;rw[ϋ,Gy (Zw g)];rfl);rw[o];generalize q:(lq (ZD w))-(lq u)=d;have t:(lq (I0 d))=d:=by rw[Ϣ,ZG];exact γ (q▸(Y4 _ _).trans_lt this) have p:(2:ἆ)*(I0 d)=(I0 (2*d)):=(by rw[Ϣ,Ϣ,Om];rfl);simp only[t,p,show (I0 d)<=39↔d<=39 by rw[θ,t];rfl];clear q o t p;by_cases hd:d<=39<;>simp only[hd,ἁ,ἂ]<;>refine⟨(j _ _ _ _ _ _ _ _ _ (by rw[m,W4,hk,BK])).1,(j _ _ _ _ _ _ _ _ _ (by rw[m,W4,hk,BK])).2.trans ?_⟩<;>split<;>simp(disch:=assumption) only[j5,cy,jZ,lO _ (VO _ _)] def nS201:Ἅ:=Dense.F.pw 201 def nQs(x:(Ἂ Word))(i e:Ἄ)(v:Ἅ):Ἅ:= if h:i>>63!=0) (mF B>>>27) (eF B-900) @[inline]def nWs(sh B:ἆ):Ἃ:=pk (B>>>63!=0) (mF B>>>27) (eF B-(900+sh)) @[inline]def nOK(B c:ἆ):Ἆ:=let E:=(B>>>52)&&&2047;let L:=B&&&0x7FFFFFF;let t:=(1:ἆ)<<>>27))∧(lq (mF v.toBits>>>27))<2^(26:Ἀ)∧ ((lq (mF v.toBits>>>27)):ℝ)*2^(27:Ἀ)*2^(((lq (eF v.toBits)):ℤ)-1075)<(if v.toBits>>>63!=0 then-y else y)∧ (if v.toBits>>>63!=0 then-y else y)<(((lq (mF v.toBits>>>27)):ℝ)+1)*2^(27:Ἀ)*2^(((lq (eF v.toBits)):ℤ)-1075):=by have bw:=kc v.toBits have hm:(lq (v.toBits&&&4503599627370495))=(lq (v.toBits))%2^(52:Ἀ):=by simp only[Ε,kA];exact ζ _ 52 have hq:(lq (mF v.toBits>>>27))=(lq (mF v.toBits))/2^(27:Ἀ):=by simp only[ν,kA,β] rw[hm]at bw have bs:¬eF v.toBits=0:=λh0=>hE0 (by rw[h0];rfl) have a6:=dV v hv bs rw[bJ,show(lq (v.toBits&&&0xfffffffffffff))+2^(52:Ἀ)=(lq (mF v.toBits)) by rw[bw,hm]]at a6 have W:0<((2:ℝ)^(((lq (eF v.toBits)):ℤ)-1075)):=zpow_pos (by norm_num) _ have a7:rv v=(if v.toBits>>>63!=0 then-((lq (mF v.toBits)):ℝ)else (lq (mF v.toBits)))*((2:ℝ)^(((lq (eF v.toBits)):ℤ)-1075)):=by rw[a6] have a8:|rv v-y|<=2^c*2^(((lq (eF v.toBits)):ℤ)-1075):=by rw[Aw];refine he.le.trans (AE ?_ W.le) rw[<-AA];exact AG one_le_two (sub_le_self _ zero_le_one) obtain⟨lo,hi⟩:=jh (rv v) y _ _ _ _ c W a7 (by rw[bw];exact (Xg _ (pow_dvd_pow 2 (by decide))).symm.trans (Μ _ (2^(25:Ἀ)) _).symm) a4 a5 a8 rw[<-hq]at lo hi exact⟨by rw[hq,mc (by decide),bw];exact N2 _ _,by rw[hq,bw];exact Ϟ (B3 (ϊ _ (by decide)) _),lo,hi⟩ theorem nOK_spec_h1(s:Ἆ)(y:ℚ)(P:ℝ):(if s then-((y:ℝ)*P)else(y:ℝ)*P)=(((if s then-y else y:ℚ)):ℝ)*P:=by cases s<;>[rfl;rw[AD rfl,AD rfl,Up,neg_mul]] theorem nOK_spec(y:ℚ)(v:Ἅ)(c:ἆ)(hv:fv v)(hok:nOK v.toBits c=ἃ) (he:|(y:ℝ)*2^(149:Ἀ)-rv v|<2^(((lq c):ℤ)-1)*2^(((lq (eF v.toBits)):ℤ)-1075)):nW v.toBits=ZT y:=by obtain⟨a1,a2,a3,a4,a5⟩:=nOK_dec _ c hok obtain⟨b7,cb,lo,hi⟩:=nOK_win _ v (lq c) hv (λh0=>by rw[h0]at a1;exact absurd a1 (by decide)) a4 a5 he unfold nW have h9:(lq (eF v.toBits-900))=(lq (eF v.toBits))-900:=χ _ _ (by rw[θ];simp only[kA];exact (by decide:900<=1047).trans a1) have ch:146<=(lq (eF v.toBits-900)):=by rw[h9];exact M5 ((by decide:146+900<=1047).trans a1) have c1:(lq (eF v.toBits-900))<=398:=by rw[h9];exact O9 (a2.trans (by decide)) generalize hq:(lq (mF v.toBits>>>27))=q at b7 cb lo hi obtain⟨e,hE⟩:∃e:ℤ,e=((lq (eF v.toBits)):ℤ)-1197:=⟨_,rfl⟩ have e4:(2:ℝ)^(27:Ἀ)*((2:ℝ)^(((lq (eF v.toBits)):ℤ)-1075))=(2:ℝ)^e*2^(149:Ἀ):=by rw[<-AA,<-AA,<-AK AL,<-AK AL,hE];exact congrArg _ (by ring) rw[Ap,e4,<-Ap]at lo rw[Ap ((q:ℝ)+1),e4,<-Ap]at hi have hP:(0:ℝ)<2^(149:Ἀ):=by positivity obtain⟨s,hs⟩:∃s,s=(v.toBits>>>63!=0):=⟨_,rfl⟩ rw[<-hs]at lo hi⊢ rw[nOK_spec_h1 s y]at lo hi have z2:(((2:ℚ)^e:ℚ):ℝ)=(2:ℝ)^e:=by rw[X8,U7] have a6:(q:ℚ)*2^e<(if s then-y else y):=Gl.1 (((V7 _ _).trans (congrArg₂ (·*·) (R7 q) z2)).trans_lt (BF lo hP.le)) have A:(if s then-y else y)<((q:ℚ)+1)*2^e:=Gl.1 ((BF hi hP.le).trans_eq ((V7 _ _).trans (congrArg₂ (·*·) ((Ji _ _).trans (congrArg₂ (·+·) (R7 q) Rat.cast_one)) z2)).symm) have a0:(0:ℚ)<2^e:=by positivity have q0:q≠0:=BD.mp (U1 (by decide) b7) have w:0<(if s then-y else y):=AO (Af (C3 _) a0.le) a6 have t:|y|=(if s then-y else y):=by cases s<;>[exact AW w;exact abs_of_neg (neg_pos.1 w)] obtain⟨δ,hδ⟩:∃δ,δ=(if s then-y else y)/2^e-q:=⟨_,rfl⟩ have c3:0<δ:=hδ▸sub_pos.mpr ((lt_div_iff₀ a0).mpr a6) have d2:(Aq q)=25:=(mz q0).2 ⟨b7,cb⟩ have E5:((lq (eF v.toBits-900)):ℤ)=e+297:=by rw[h9,hE];rw[pO ((by decide:900<=1047).trans a1)];ring have n1:((1047:ℕ):ℤ)<=(lq (eF v.toBits)):=O4.2 a1 have n2:((lq (eF v.toBits)):ℤ)<=((1298:ℕ):ℤ):=O4.2 a2 have k1:-126<=((25:ℕ):ℤ)+e:=hE▸(by decide:(-126:ℤ)<=((25:ℕ):ℤ)+(((1047:ℕ):ℤ)-1197)).trans (Hw (U9 n1 1197) _) have k2:((25:ℕ):ℤ)+e<=126:=hE▸(Hw (U9 n2 1197) _).trans (by decide:((25:ℕ):ℤ)+(((1298:ℕ):ℤ)-1197)<=126) rw[kj _ _ _ (hq▸b7) (hq▸cb) ch c1,<-Qx s q ἃ 1 e y δ ((2:ἆ)*(mF v.toBits>>>27)+1) (eF v.toBits-900) (λ_=>by cases s<;>[exact decide_eq_false (not_lt.2 w.le);exact A6 (neg_pos.1 w)]) c3.le (by rw[hδ,sub_lt_iff_lt_add',div_lt_iff₀ a0];exact A) ⟨λ_=>c3.ne',λ_=>rfl⟩ one_pos (by rw[t,hδ,add_sub_cancel,pJ,div_one,div_mul_cancel₀ _ a0.ne']) (by rw[W6];exact b7) (by rw[W6,d2];exact k1) (by rw[W6,d2];exact k2) (by rw[η,ύ,hq];simp only[kA,V2,Bool.or_true,ἁ,W6,Jw];exact kj_h2 _ cb) E5] theorem nEl_e1_h1(a b c d e f:ℝ):|a+b+c+d+e+f|<=|a|+|b|+|c|+|d|+|e|+|f|:= (Ag _ _).trans (add_le_add ((Ag _ _).trans (add_le_add ((Ag _ _).trans (add_le_add ((Ag _ _).trans (add_le_add (Ag _ _) AP)) AP)) AP)) AP) theorem nEl_e1_h2(t p Bb a b X m M g ρ γ:ℝ)(h:g*ρ=γ):t-((X-M)*g+Bb)=(t-(p+Bb))+(p-a*b)+(X-m)*g*(ρ-1)+(M-m)*g+(X-m)*(b-γ)+(a-(X-m))*b:=by linear_combination (m-X)*h theorem nEl_e1(X m M G r Bb D a b p t Q Γ w:ℝ)(hD:0simp rw[hs] by_cases z:kB w=0 · have hk:kG w=0:=by simp[idxOf,z] have hm:kM w<2^(23:Ἀ):=by simp only[mantOf,z,ἁ];exact fracOf_toNat_lt w rw[hk,z];simp;exact_mod_cast hm · have hk:kG w=(mJ (kB w))-1:=by simp[idxOf,z] have e1:1<=(mJ (kB w)):=ϵ fun q=>z (Β.1 q) have hm:=lB w calc (kM w:ℝ)*2^kG w<2^(24:Ἀ)*2^kG w:=AI (by exact_mod_cast hm) (by positivity) _=2^((mJ (kB w))+23):=by rw[hk,<-AF];exact congrArg _ ((Τ 24 _).trans ((pA _ 1 23).symm.trans (congrArg (·+23) (J4 e1)))) theorem nDb(d:kF)(hd:0<(mJ (kB d))∧kB d≠255∧ZX d=false):(2:ℝ)^((mJ (kB d))+22)<=rv (dw d):=by obtain⟨-,e⟩:=cI d hd.2.1 rw[e] have z:kB d≠0:=λq=>C8 hd.1 (congrArg mJ q) have hs:(sv d:ℝ)=(kM d:ℝ):=by rw[sv,hd.2.2,AC lN,P5] have hm:2^(23:Ἀ)<=kM d:=by rw[mantOf,AC z];exact V1 _ _ have hk:kG d=(mJ (kB d))-1:=by rw[idxOf,AC z] rw[hs,hk] calc (2:ℝ)^((mJ (kB d))+22)=2^(23:Ἀ)*2^((mJ (kB d))-1):=by rw[<-AF,<-Xz hd.1,Τ 23];rfl _<=(kM d:ℝ)*2^((mJ (kB d))-1):=AE (by exact_mod_cast hm) (pow_nonneg zero_le_two _) theorem nEl_fin(E s c:ℤ)(R V S' Γ:ℝ)(hE:1047<=E)(hc:c=if s<=E+2 then 3 else s-E) (hV:V<2^(E-1022))(hS':S'<=2^(548:Ἀ))(hΓ:Γ<=2^(256:Ἀ))(hΓ0:0<=Γ)(hS0:0<=S') (hR:R<=12*2^(s-1081)+V/2^(52:Ἀ)+6*(S'+Γ+1)*(1/2^(1075:Ἀ))): R<2^(c-1)*2^(E-1075):=by have two:(0:ℝ)<2:=two_pos have hU:(0:ℝ)<2^(E-1075):=zpow_pos two _ have e0:(2:ℝ)^(E-1022)=2^(53:Ἀ)*2^(E-1075):=by rw[← AA,← AK two.ne'];congr 1;ring have hsm:6*(S'+Γ+1)*(1/2^(1075:Ἀ))<=2^(E-1075)/4:=by have a:(2:ℝ)^(256:Ἀ)<=2^(548:Ἀ):=AU one_le_two (by norm_num) have b:(1:ℝ)<=2^(548:Ἀ):=one_le_pow₀ one_le_two have e:(2:ℝ)^(548:Ἀ)*(1/2^(1075:Ἀ))=2^(-527:ℤ):=by rw[← AA,← AA,one_div,← zpow_neg,← AK two.ne'];congr 1 have h7:(2:ℝ)^(-527:ℤ)<=2^(E-1082):=AG one_le_two (by linarith only[hE]) have e5:(2:ℝ)^(E-1075)=2^(7:Ἀ)*2^(E-1082):=by rw[← AA,← AK two.ne'];congr 1;ring linear_combination (6/2^(1075:Ἀ):ℝ)*hS'+(6/2^(1075:Ἀ):ℝ)*hΓ+(6/2^(1075:Ἀ):ℝ)*a+(6/2^(1075:Ἀ):ℝ)*b+18*e+18*h7-(1/4:ℝ)*e5+14*(zpow_pos two (E-1082)).le have hV2:V/2^(52:Ἀ)<2*2^(E-1075):=by linear_combination (1/2^(52:Ἀ):ℝ)*hV+(1/2^(52:Ἀ):ℝ)*e0 split at hc · rename_i h subst hc have h4:(2:ℝ)^(s-1081)<=2^(E-1079):=AG one_le_two (by linarith only[h]) have e3:(2:ℝ)^(E-1075)=2^(4:Ἀ)*2^(E-1079):=by rw[← AA,← AK two.ne'];congr 1;ring have e4:(2:ℝ)^((3:ℤ)-1)=4:=by norm_num linear_combination hR+hV2+hsm+12*h4-(3/4:ℝ)*e3-(2:ℝ)^(E-1075)*e4+hU · rename_i h subst hc have e1:(2:ℝ)^(s-1081)=2^(s-E-6)*2^(E-1075):=by rw[<-AK two.ne'];congr 1;ring have e2:(2:ℝ)^(s-E-1)=32*2^(s-E-6):=by rw[show (32:ℝ)=2^(5:ℤ) by norm_num,<-AK two.ne'];congr 1;ring have hZ:(1:ℝ)/8<=2^(s-E-6):=by rw[show (1:ℝ)/8=2^(-3:ℤ) by norm_num];exact AG one_le_two (by linarith only[not_le.1 h]) linear_combination hR+hV2+hsm+20*AE hZ hU.le+(1/4:ℝ)*hU+12*e1-(2:ℝ)^(E-1075)*e2 lemma nfS(x y:Ἅ)(h:fv x)(j:fv y)(g:|rv x-rv y|<=(2:ℝ)^(971:Ἁ)): fv (x-y)/\|rv (x-y)-(rv x-rv y)|<=|rv x-rv y|/2^(53:Ἀ)+1/2^(1075:Ἀ):=by have⟨d,e⟩:=s5iS x y h j (g.trans (pm 971 AP));exact⟨d,by rw[e];exact jy _⟩ @[inline]def nfe(w:Ἃ):ἆ:=((w>>>23)&&&255).toUInt64 @[inline]def nC(s E:ἆ):ἆ:=if s<=E+2 then 3 else s-E @[inline]def nElB(xw gw bw:Ἃ)(m ri:Ἅ):ἆ:=((Dense.F.dw xw-m)*(Dense.F.dw gw*ri)+Dense.F.dw bw).toBits @[inline]def nElK(m:Ἅ)(L Dl ed:Ἀ):ἆ:=((max ((L:ℤ)+Dl-30) ((((m.toBits>>>52)&&&2047).toNat:ℤ)-1073))+1082-ed).toNat.toUInt64 @[inline]def nElOK(xw gw:Ἃ)(Kp Ke B:ἆ):Ἆ:=nOK B (nC (nfe gw+(if Kp>>52)&&&2047)) lemma nC_toNat_h1(E:ἆ)(hE:(lq E)<2048):(lq E)+(lq 2)<2^(64:Ἀ):=(B3 hE 2).trans (by decide) lemma nC_toNat_h2(a b:Ἀ)(h:¬a<=b+2):b<=a:=(V1 _ 2).trans (Zw h) theorem nC_toNat(s E:ἆ)(hs:(lq s)<2^(60:Ἀ))(hE:(lq E)<2048):(lq (nC s E))=if (lq s)<=(lq E)+2 then 3 else (lq s)-(lq E):=by unfold nC;split<;>rename_i h<;>rw[θ,η,γ (nC_toNat_h1 E hE)]at h<;>simp only[kA]at h · simp only[kA,AD h] · rw[AC h,χ _ _ (θ.2 (nC_toNat_h2 _ _ h))] theorem nS_toNat_h1{p q:Ἀ}(hp:p<256)(hq:q<256+2^(40:Ἀ)):p+q<2^64:=U1 (L6 hp hq) (K3 rfl) theorem nS_toNat_h2{x y:ἆ}(h:(lq x)+(lq y)<2^64):(lq (x+y))=(lq x)+(lq y):=(η x y).trans (γ h) theorem nS_toNat(a b K Ke:ἆ)(ha:(lq a)<256)(hb:(lq b)<256)(hK:(lq K)<2^(40:Ἀ))(hKe:(lq Ke)<2^(40:Ἀ)): (lq (a+(if Kh (O4.mp h')),hc,pO ((V1 T 2).trans (I3 (J8 h)))]⟩ obtain⟨w,q⟩:=wq have k1':(G:ℤ)+K<=Sn:=O4.mpr k1 have k2':(G:ℤ)+(X+Q)<=Sn:=O4.mpr k2 have k4':(Dd:ℤ)+Q=1054:=congrArg Uc k4 have w':(Sn:ℤ)<=T+25:=O4.mpr w have a2':(T:ℤ)<=1298:=O4.mpr a2 have hG':(G:ℤ)<=255:=O4.mpr (U2 hG) have hD':(Dd:ℤ)<=255:=O4.mpr (U2 hD) have Aμ:A<=μ:=(Int.le_sub_right_of_add_le ((Xt k3).trans (G8 (Zd k1') Dd))).trans_eq hμ.symm have μ4:μ<=496:=hμ▸U9 (Wy ((Wi _ (G6 G)).trans (w'.trans (G8 a2' 25))) hD') 1082 have g3:(X:ℤ)+23<=μ+51:=by linear_combination k2'-k4'-hμ have g4:(E:ℤ)-1022<=μ+51:=Int.sub_right_le_of_le_add ((Xt (v.trans Aμ)).trans_eq (Int.add_assoc μ 51 1022).symm) have g2:(E:ℤ)-1022<=496+51:=g4.trans (G8 μ4 51) have g5:(G:ℤ)+23=G-Dd+1+((Dd:ℤ)+22):=by ring have g6:μ+((G:ℤ)-Dd+1)=Sn-1081:=by linear_combination hμ have g7:(G:ℤ)-Dd+1<=255+1:=G8 ((Wi _ (G6 _)).trans hG') 1 exact⟨(L1 (I3 hX) 23).trans (by decide),(by decide:1<=22).trans (N2 22 Dd),(L1 (U2 hG) 23).trans (by decide),(L1 (I3 hB) 23).trans (by decide),q,O4.mpr a1,u.trans Aμ,g2,g3,g4,g5,g6,g7⟩ theorem nEl_spec_h3(a b:Ἁ)(h:a<=b):(2:ℝ)^a<=2^b:=AG one_le_two h theorem nEl_spec_h4(a b:Ἀ)(h:a<=b):(2:ℝ)^a<=2^b:=AU one_le_two h theorem nEl_spec(xw gw bw d:Ἃ)(m ri:Ἅ)(M:ℚ)(L Dl:Ἀ) (hx:kB xw≠255)(hg:kB gw≠255)(hb:kB bw≠255) (hd:0<(mJ (kB d))∧kB d≠255∧ZX d=false) (hri:fv ri∧|rv ri*rv (dw d)-1|<=1/2^(50:Ἀ)) (hm:fv m∧|rv m-(M:ℝ)*2^(149:Ἀ)|<=2^((L:ℤ)+Dl-30)) (hxD:(mJ (kB xw))<=Dl)(hL:3<=L∧L<=14)(hDl:Dl<=254) (hok:nElOK xw gw (nElK m L Dl (mJ (kB d))) (1054-(mJ (kB d))).toUInt64 (nElB xw gw bw m ri)=ἃ): nW (nElB xw gw bw m ri)=ZT ((ZA xw-M)*ZA gw/ZA d+ZA bw):=by obtain⟨fX,vX⟩:=cI xw hx obtain⟨fG,vG⟩:=cI gw hg obtain⟨fB,vB⟩:=cI bw hb obtain⟨fD,vD⟩:=cI d hd.2.1 have bX:=nXb xw hx;have bG:=nXb gw hg;have bB:=nXb bw hb;have bD:=nDb d hd have bm:=fK m hm.1 have ex:=mO xw;have eg:=mO gw;have ed:=mO d;have eb2:=mO bw unfold nElOK nElB at hok generalize ht:(dw xw-m)*(dw gw*ri)+dw bw=t at hok have hEt:(t.toBits>>>52)&&&2047=eF t.toBits:=rfl rw[hEt]at hok have e1:(lq (nfe xw))=(mJ (kB xw)):=ϩ _ have e2:(lq (nfe gw))=(mJ (kB gw)):=ϩ _ obtain⟨A,hA⟩:∃A:ℤ,A=max ((L:ℤ)+Dl-30) (((lq (eF m.toBits)):ℤ)-1073):=⟨_,rfl⟩ have hEm:(lq (eF m.toBits))<2048:=by simp only[eF,Ε,kA];exact C0 ϝ (by decide) obtain⟨p1,p2,p3,p4,p5⟩:=nEl_spec_h1 _ _ _ _ _ _ _ ex eg ed hEm hL hDl hA have e3:(lq ((1054-(mJ (kB d))).toUInt64))=1054-(mJ (kB d)):=by show (lh _).toNat=_;rw[P6];exact γ p4 have e4:(lq (nElK m L Dl (mJ (kB d))))=(A+1082-(mJ (kB d))).toNat:=by show (lh (max ((L:ℤ)+Dl-30) (((lq (eF m.toBits)):ℤ)-1073)+1082-(mJ (kB d))).toNat).toNat=_ rw[P6,<-hA];exact γ p1 have hs:=nS_toNat (nfe gw) (nfe xw) (nElK m L Dl (mJ (kB d))) ((1054-(mJ (kB d))).toUInt64) (by rw[e2];exact eg) (by rw[e1];exact ex) (by rw[e4];exact p2) (by rw[e3];exact p3) rw[e1,e2,e3,e4]at hs generalize hS:nfe gw+(if nElK m L Dl (mJ (kB d))((ZA w:ℚ):ℝ)=rv (dw w)/2^(149:Ἀ):=λw h=>by rw[(cI w h).2,Y1,V7,X8,D9,U7,<-AA,mul_div_assoc,(AA (2:ℝ) 149).symm,<-Ac two.ne'];rfl have hT:((((ZA xw-M)*ZA gw/ZA d+ZA bw:ℚ)):ℝ)*2^(149:Ἀ)=(rv (dw xw)-(M:ℝ)*2^(149:Ἀ))*(rv (dw gw)/rv (dw d))+rv (dw bw):=by rw[Ji,Jk,V7,Uo,eZ xw hx,eZ gw hg,eZ d hd.2.1,eZ bw hb,mul_div_assoc,div_div_div_cancel_right₀ (pow_pos two 149).ne',add_mul,div_mul_cancel₀ (rv (dw bw)) (pow_pos two 149).ne',mul_right_comm,sub_mul,div_mul_cancel₀ (rv (dw xw)) (pow_pos two 149).ne'] unfold nElB;rw[ht] refine nOK_spec _ t c ft hok ?_ rw[hT,Aw] have hQΓ:(2:ℝ)^μ*2^(((mJ (kB gw)):ℤ)-(mJ (kB d))+1)=2^(((lq S):ℤ)-1081):=by rw[<-AK two.ne',q10] rw[hQΓ]at E1 refine nEl_fin _ _ _ _ |rv t| _ _ q13 q11 (fK t ft) aS ((nEl_spec_h3 _ _ q12).trans_eq (AA _ _)) (zpow_pos two _).le (add_nonneg (Aa _) (Aa _)) E1 end lemma nSg(x:Model kC)(h:Wq x=ἃ)(p:0<=Zi x):Zq x=ἃ\/Vf x=ἄ:=by by_cases z:Zq x=ἃ · exact pZ z right;obtain⟨d,hd⟩:=Model.exists_toDyadic?_of_isFinite h have hm:=Model.significand_ne_zero_of_toDyadic?_some_of_isZero_eq_false hd (M9.2 z) rw[<-Model.sign_eq_signBit_of_toDyadic?_some hd] refine M9.2 fun hs=>?_ have hx:Zi x=d.toReal:=by rw[BR,hd] have q:=Int.cast_nonneg_iff.1 (nonneg_of_mul_nonneg_left (hx▸p:0<=d.toReal) (zpow_pos two_pos _)) rw[lr,hs,AD rfl]at q;exact hm (Uc.inj (le_antisymm (Int.neg_nonneg.1 q) (Oj _))) lemma fS(v:Ἅ)(h:Dense.F.fv v)(p:0<=Dense.F.rv v):Dense.F.fv (W7 v)/\Dense.F.rv (W7 v)=ns kC (J3 (Dense.F.rv v)):=by have e:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat_sqrt v simp only[m5]at e have hd:=nSg _ h p have q:=Model.toReal_sqrt_eq_roundAt (kI v.toModel) (by decide) h hd have f:=Model.isFinite_sqrt_of_isFinite (kI v.toModel) (by decide) h hd have c:Yj (Pa (kI v.toModel))=Pa (kI v.toModel):=by by_cases z:Zq (kI v.toModel)=ἃ · have hs:Pa (kI v.toModel)=kI v.toModel:=by rw[Model.Proof.sqrt_eq_spec];simp[Model.Spec.sqrt,Model.chooseNaN1_none_of_isFinite _ h,Model.isInf_eq_false_of_isFinite_eq_true _ h,z] rw[hs];exact Vt _ (Model.isModelCanonical_ofFloatModel _) · have s:=hd.resolve_left z rw[Model.Proof.sqrt_eq_spec,Model.Spec.sqrt_eq_model (by decide) _ h s,Model.canonicalizeModel_ofModel] refine⟨?_,?_⟩ · unfold Dense.F.fv;rw[e];exact (congrArg Wq c).trans f · unfold Dense.F.rv;rw[e];exact (congrArg Zi c).trans q lemma nQs_t(w:kF)(hw:kB w≠255):Dense.F.fv (Dense.F.dw w*Dense.F.dw w)/\Dense.F.rv (Dense.F.dw w*Dense.F.dw w)=((sv w:ℝ)*2^kG w)^(2:Ἀ):=by obtain⟨f,h⟩:=Dense.F.cI w hw have m:(sv w*sv w).natAbs<2^(48:Ἀ):=by rw[Ϩ];exact (ϕ (Dense.F.bg w) (Dense.F.bg w)).trans_eq (m7 2 24 24).symm have r:=Dense.F.aE _ _ f f (sv w*sv w) ((2*kG w:ℕ):ℤ) (by rw[h,AA,Xe,AF,Jh];exact mul_mul_mul_comm _ _ _ _) (m.trans (by decide)) (Int.le_trans (by decide) (G6 _)) (Dense.F.bL 48 (2*kG w) 556 (J1 (X3 2 (cP w)) 48) (by decide) _ m) exact⟨r.1,by rw[r.2,AA,Xe,AF,Jh,sq];exact (mul_mul_mul_comm _ _ _ _).symm⟩ lemma nQs_e0(a r A t u w k:ℝ)(hA:0<=A)(ht:0<=t)(hu:0<=u)(hw:0<=w)(k0:0<=k)(hk:2*k*u<=1) (H1:|a-A|<=2*k*u*A+2*k*w)(H2:|r-(a+t)|<=u*|a+t|+w): |r-(A+t)|<=2*(k+1)*u*(A+t)+2*(k+1)*w:=by obtain⟨h1,h2⟩:=A3.1 H1 have g:|a+t|<=(A+t)+2*k*u*A+2*k*w:=A3.2 ⟨by linear_combination h1+2*hA+2*ht,by linear_combination h2⟩ have T:=abs_sub_le r (a+t) (A+t) rw[add_sub_add_right_eq_sub]at T refine T.trans ?_ linear_combination H2+H1+mul_le_mul_of_nonneg_left g hu+AE hk (Af hu hA)+AE hk hw+Af hu ht+2*Af (Af k0 hu) ht lemma nQs_e(a r A t:ℝ)(k:ℕ)(hA:0<=A)(ht:0<=t)(hk:(k:ℝ)<=2^(20:Ἀ)) (H1:|a-A|<=2*k*(1/2^(53:Ἀ))*A+2*k*(1/2^(1075:Ἀ)))(H2:|r-(a+t)|<=|a+t|/2^(53:Ἀ)+1/2^(1075:Ἀ)): |r-(A+t)|<=2*((k:ℝ)+1)*(1/2^(53:Ἀ))*(A+t)+2*((k:ℝ)+1)*(1/2^(1075:Ἀ)):= nQs_e0 a r A t (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k hA ht (by positivity) (by positivity) (C3 k) ((AE (mul_le_mul_of_nonneg_left hk zero_le_two) (by positivity)).trans (by norm_num)) H1 (H2.trans_eq (congrArg (·+_) (one_div_mul_eq_div _ _).symm)) lemma nP(a b:ℕ)(h:a<=b):(2:ℝ)^a*(1/2^b)<=1:=by rw[mul_one_div,div_le_one (pow_pos two_pos b)];exact AU one_le_two h lemma nN(b:ℕ):(0:ℝ)<=1/2^b:=one_div_nonneg.2 (pow_pos two_pos b).le lemma nP2(a b c:ℕ)(h:a+c<=b):(2:ℝ)^a*(1/2^b)<=1/2^c:=by rw[mul_one_div,div_le_div_iff₀ (pow_pos two_pos b) (pow_pos two_pos c),one_mul,<-AF];exact AU one_le_two h theorem nSm_h1(a A X:ℝ)(s:X<=1*A+1)(h1:-X<=a-A)(h2:a-A<=X):a<=2*A+1/\-1<=a:=⟨((sub_le_iff_le_add'.1 h2).trans (add_le_add AP s)).trans_eq (by ring),(by ring:(-1:ℝ)=-(1*A+1)+A).trans_le ((add_le_add (neg_le_neg s) AP).trans (le_sub_iff_add_le.1 h1))⟩ lemma nSm(a A k u w K:ℝ)(hA:0<=A)(k0:0<=k)(kk:k<=K)(u0:0<=u)(w0:0<=w)(cu:2*K*u<=1)(cw:2*K*w<=1)(h1:-(2*k*u*A+2*k*w)<=a-A)(h2:a-A<=2*k*u*A+2*k*w):a<=2*A+1/\-1<=a:=by have q:=mul_le_mul_of_nonneg_left kk zero_le_two;exact nSm_h1 _ _ _ (add_le_add (AE ((AE q u0).trans cu) hA) ((AE q w0).trans cw)) h1 h2 lemma nFw0(v Ts n q P Ep W u w D:ℝ)(Ts0:0<=Ts)(n0:0<=n)(nb:n<=2^(12:Ἀ))(u0:0<=u)(w0:0<=w)(q0:0<=q)(qb:q<=2^(52:Ἀ))(cu:2*2^(12:Ἀ)*u<=1)(cw:2^(68:Ἀ)*w<=1)(D2:2<=D) (h1:-(2*n*u*Ts+2*n*w)<=v-Ts)(pe:|P-v*q|<=|v*q|/D+w)(hEp:1<=Ep)(we:|W-(P+Ep)|<=|P+Ep|/D+w):0<=W:=by have D1:1<=D:=one_le_two.trans D2 have m1:=AE (AE nb u0) Ts0 have c1:=AE cu Ts0 have m2:=AE nb w0 have vl:-(2*2^(12:Ἀ)*w)<=v:=by linear_combination h1+2*m1+c1+2*m2 have a1:=AE vl q0 have a2:=mul_le_mul_of_nonneg_left qb w0 have s8:-(v*q+1/4)<=v*q:=by linear_combination 2*a1+16384*a2+cw/4 have w8:w<=1/8:=by linear_combination cw/8+36893488147419103231*w0 obtain⟨p1,_⟩:=A3.1 pe have ab:|v*q|<=v*q+1/4:=A3.2 ⟨s8,by linear_combination⟩ have Pl:-(1/2)<=P:=by linear_combination p1+div_le_self (Aa (v*q)) D1+ab+w8 obtain⟨r1,_⟩:=A3.1 we have Y0:0kB x[j]!≠255):∀m (i:Ἄ)(v:Ἅ)(A:ℝ)(k:ℕ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)->Dense.F.fv v->0<=A-> |Dense.F.rv v-A|<=2*k*(1/2^(53:Ἀ))*A+2*k*(1/2^(1075:Ἀ))->k+m<=2^(20:Ἀ)-> A+∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)<=2^(960:Ἀ)-> Dense.F.fv (nQs x i e v)/\|Dense.F.rv (nQs x i e v)-(A+∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))|<= 2*((k+m:ℕ):ℝ)*(1/2^(53:Ἀ))*(A+∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))+2*((k+m:ℕ):ℝ)*(1/2^(1075:Ἀ)):=by intro m;induction m with |zero=> intro i v A k hm hie hf hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (V3.1 hm) rw[nQs,dite_eq_right (by rw[ε,q];exact N4 _),q,Gc,Qn,Av];exact⟨hf,he⟩ |succ m ih=> intro i v A k hm hie hf hA he hk hb have hl:(J0 i)<(J0 e):=N1 hm rw[nQs,AT (ε.2 hl)];dsimp only rw[f6 x i] obtain⟨tf,tr⟩:=nQs_t x[(J0 i)]! (hX _ hl) have hs:∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)+∑j∈L5 ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=Qz hl _ have i1:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 hl) have tn:0<=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ):=sq_nonneg _ have rest:0<=∑j∈L5 ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=O8 (fun _ _=>sq_nonneg _) obtain⟨h1,h2⟩:=A3.1 he have kk:(k:ℝ)<=2^(20:Ἀ):=by exact_mod_cast (show k<=2^(20:Ἀ) from (V1 _ _).trans hk) have bd:|Dense.F.rv v+Dense.F.rv (Dense.F.dw x[(J0 i)]!*Dense.F.dw x[(J0 i)]!)|<=(2:ℝ)^(971:ℤ):=by rw[tr];rw[hs]at hb;exact nBd _ A _ _ k hA tn rest kk h1 h2 hb obtain⟨af,ae⟩:=NF.fA _ _ hf tf bd rw[tr]at ae have step:=nQs_e _ _ A _ k hA tn kk he ae have:=ih (i+1) _ (A+((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)) (k+1) (by rw[i1,<-D8,hm,BK]) (by rw[i1];exact hl) af (add_nonneg hA tn) (by rw[X7];exact step) ((lO k 1 m).trans_le hk) (by rw[i1,add_assoc,<-hs];exact hb) rw[i1,show k+1+m=k+(m+1) from lO k 1 m,add_assoc,<-hs]at this;exact this lemma nD_w(Wr Z e:ℝ)(hZ:0kB x[j]!≠255)(he:kB eps≠255)(hs:0sq_nonneg _) have nb:(n:ℝ)<=2^(12:Ἀ):=(N5.2 hn2).trans_eq (by rw[B4,nZ]) have Tsb:Ts<=2^(568:Ἀ):=by have h0:=Ql (L5 (r*n) (r*n+n)) (fun j=>((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)) (2^(556:Ἀ)) (fun j _=>nD_tb _) rw[Ur,ϱ,nsmul_eq_mul]at h0 have h2:(n:ℝ)*2^(556:Ἀ)<=2^(12:Ἀ)*2^(556:Ἀ):=AE nb (pow_pos two_pos _).le have h3:(2:ℝ)^(12:Ἀ)*2^(556:Ἀ)=2^(568:Ἀ):=by rw[<-AF] exact h0.trans (h2.trans_eq h3) obtain⟨vf,ve⟩:=nQs_spec x ((G0 (r*n+n))) (fun j hj=>hX j (by rwa[hi]at hj)) n ((G0 (r*n))) _ 0 0 (by rw[hi,lo];exact Jj _ _) (by rw[hi,lo];exact V1 _ _) z0f AP (by rw[z0r];simp only [CharP.cast_eq_zero,sub_self,A5,mul_zero,one_div,zero_mul,Av,Std.le_refl]) ((Κ n).trans_le (hn2.trans (by decide))) (by rw[lo,hi,Ai];exact Tsb.trans (AU one_le_two (by decide))) rw[lo,hi]at ve;simp only[Ai]at ve obtain⟨qf,qr⟩:=kg2 (4503599627370496/n) ((J6 _ _).trans_lt (by decide)) set q:ℝ:=((4503599627370496/n:ℕ):ℝ) with hq have q0:0<=q:=C3 _ have h52:((4503599627370496:ℕ):ℝ)=2^(52:Ἀ):=by rw[show (4503599627370496:ℕ)=2^(52:Ἀ) from rfl,B4,nZ] have hq1:(n:ℝ)*q<=2^(52:Ἀ):=by have h:=N5 (α:=ℝ)|>.2 (pr 4503599627370496 n) rw[G4]at h;rw[mul_comm];exact h.trans_eq h52 have hq2:2^(52:Ἀ)-(n:ℝ)>>52)&&&2047;let L:=B&&&0x7FFFFFF;let t:=(1:ἆ)<<>>27 with hq have qpos:(0:ℝ)<(qU.toNat:ℝ)*2^(27:Ἀ)*Uu:=mul_pos (mul_pos (T9.2 (AN (by norm_num) q1)) (by norm_num)) U0 have sg:(D.toBits>>>63!=0)=false:=by by_contra h;rw[Bool.not_eq_false]at h;rw[AD h]at w1;exact absurd (qpos.trans w1) (not_lt.2 (neg_nonpos.2 Y0)) rw[AC (by rw[sg];decide)]at w1 w2 set s:ℤ:=1223-(E:ℤ) with hs have key:(2:ℝ)^(27:Ἀ)*Uu*2^s=2^(175:Ἀ):=by rw[hU,hs,<-AA (2:ℝ) 27,<-AK (by norm_num),<-AK (by norm_num),<-AA (2:ℝ) 175];exact congrArg _ (by simp only [nZ];ring) have m:(J3 (X:ℝ)*2^s)*(2^(27:Ἀ)*Uu)=Y:=by rw[Ap,mul_comm ((2:ℝ)^s),key,hY];exact mul_comm _ _ have pU:(0:ℝ)<2^(27:Ἀ)*Uu:=mul_pos (by norm_num) U0 have w1':(qU.toNat:ℝ)kB x[j]!≠255)(he:kB eps≠255)(hs:0sq_nonneg _)) (by norm_num)) (C3 n) have L0:=add_pos_of_nonneg_of_pos T0 Ep0 rw[hxh]at L0 have XR:(0:ℝ)<(X:ℝ):=pos_of_mul_pos_right L0 (by norm_num) have X0:0α)(h:k< m): (kK f)[k]! =f ⟨k,h⟩:=by rw[AB _ k (by simpa using h),Λ] @[inline]def SN(rows n:Ἀ)(eps:Ἃ)(x g:(Ἂ Word)):Ἆ:= rows>0&&n>0&&(O0 x)==rows*n&&(O0 g)==n&&x.all finiteWord&&g.all finiteWord&&finiteWord eps&&(!ZX eps&&ZC eps !=0) lemma fG(e n:Ἀ)(d:kF)(x g:(Ἂ Word)):SN e n d x g=mq e n d x g:=by rw[SN,mq];congr 1;rw[Q6,Y2];have:(0:ℚ)<2^((ZZ d:Ἁ)-149):=((by positivity));rw[sg];cases ZX d<;>simp[this,BD] lemma jm{d n:Ἀ}{e:kF}{x g:(Ἂ Word)}(h:mq d n e x g=ἃ): 0kB x[i]!≠255)/\∀j,jkB g[j]!≠255:=by simp only[mq,Η,ZH,BC]at h;exact⟨h.1.1.1.1.1.1.2,h.2,λi m=>NR.ic x (np.mp h.1.1.1.2) i ((ZY.mp h.1.1.1.1.1.2)▸m),λj o=>NR.ic g (np.mp h.1.1.2) j ((ZY.mp h.1.1.1.1.2)▸o)⟩ def YU(n:Ἀ)(eps:Ἃ)(x:(Ἂ Word))(r:Ἀ):Ἀ×Ἀ×Ἆ×Ἀ×Ἀ×Ἃ:= let lo:=r*n let u:=Yh x lo (lo+n) 255 let Q:=Yl x u lo (lo+n) 0 0 0 0 let pn:=Ym x u lo (lo+n) 0 0 let S:=Y0 pn.1 pn.2 let k:=Q2 (max pn.1 pn.2)-30 (u,k,decide (pn.1>>k,S&&&(VO 1 k-1),V5 (n*Q-S*S) (n*n) u eps) lemma Vn(n:Ἀ)(d:kF)(x:(Ἂ Word))(r:Ἀ)(e:0jZW x[j]! =0\/t.1<=ZZ x[j]!):=by have g:=(Yi x (r*n+n) n (r*n) 255 (ϱ ..)).2;have⟨l,m⟩:=VF n x r _ e g;use(by rw[l,<-Yn];simp only[YU,Yz,ο,n4,ζ,β,ZU]),(by simp only[YU];rw[YW _ _ _ _ (Ϯ e e) h,m]),g @[noinline]def gM(n:Ἀ)(eps:Ἃ)(x:(Ἂ Word))(r:Ἀ):Ἀ×Ἀ×Ἆ×Ἀ×Ἀ×Ἃ:= let lo:=r*n let u:=cS x (G0 lo) (G0 (lo+n)) 255 let st:=cF x u (G0 lo) (G0 (lo+n)) 0 0 0 0 0 0 0 0 let S:=Y0 st.P st.N let k:=Q2 (max st.P st.N)-30 ((lq u),k,decide (st.P>>k,S&&&(VO 1 k-1), V5 (n*(st.big+(lq st.l)+((lq st.h)+st.c<<<64)<<<64)-S*S) (n*n) (lq u) eps) lemma gN(n:Ἀ)(eps:kF)(x:(Ἂ Word))(r:Ἀ)(hn:0gP n eps x g b (J0 i) (J0 j)) else gP n eps x g b (J0 i) (J0 j) noncomputable def nS1(x:(Ἂ Word))(i e:Ἄ)(s:Ἅ)(Dl:ἆ):Ἅ×ἆ:= if h:inEI n eps x r) let lo:=G0 (r*n);let hi:=G0 (r*n+n) if 4<=n&&n<=2048&&kB eps != 0&&kB eps != 255 then let z0:=(I0 (0:Ἀ)).toInt64.toFloat let p:=nS1 x lo hi z0 0 let n6:=I0 n let lb:=(Aq n).toUInt64 let m:=p.1*((((1:ἆ)<<<(52+lb))/n6).toInt64.toFloat*I5 ((971-lb)<<<52)) let v:=nS2 x m lo hi z0 let D:=W7 (v*(((1:ἆ)<<<52)/n6).toInt64.toFloat+Dense.F.dw eps*nS201) let Dl:=p.2.toNat let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW ⟨m,nRi dW ed.toUInt64,nElK m (Aq (n+4)+1) Dl ed.toNat,(1054-ed.toNat).toUInt64, nOKs B (nLc n Dl (kB eps).toNat).toUInt64&&0gP n eps x g b (J0 i) (J0 j) else gP n eps x g b (J0 i) (J0 j) lemma nM_e(a r A t B u w k:ℝ)(u0:0<=u)(w0:0<=w)(k0:0<=k)(B0:0<=B)(ht:|t|<=B)(hA:|A|<=k*B) (sm:(k^(2:Ἀ)/2+k)*u<=1/4)(sw:k*w<=B/4) (H1:|a-A|<=(k^(2:Ἀ)/2+k)*B*u+k*w)(H2:|r-(a+t)|<=u*|a+t|+w): |r-(A+t)|<=((k+1)^(2:Ἀ)/2+(k+1))*B*u+(k+1)*w:=by have h:=AY (a+t) (A+t);rw[add_sub_add_right_eq_sub]at h have E2:=mul_le_mul_of_nonneg_left sm B0 have ua:=mul_le_mul_of_nonneg_left (show |a+t|<=(k+1)*B+B/2 by linear_combination h+Ag A t+hA+ht+H1+E2+sw) u0 have e3:=abs_sub_le r (a+t) (A+t);rw[add_sub_add_right_eq_sub]at e3 linear_combination e3+H2+H1+ua lemma nM_b_h1(P Q B:ℝ)(hP:P<=1/4*B)(hQ:Q<=B/4)(B0:0<=B):P+Q+B<=2*B:=by linear_combination hP+hQ+(1/2:ℝ)*B0 lemma nM_b(a A t B u w k:ℝ)(u0:0<=u)(B0:0<=B)(ht:|t|<=B)(hA:|A|<=k*B) (sm:(k^(2:Ἀ)/2+k)*u<=1/4)(sw:k*w<=B/4)(H1:|a-A|<=(k^(2:Ἀ)/2+k)*B*u+k*w):|a+t|<=(k+2)*B:= (Ag a t).trans ((add_le_add ((sub_le_iff_le_add'.1 (AY a A)).trans (add_le_add hA H1)) ht).trans (((add_assoc _ _ _).trans_le (add_le_add AP (nM_b_h1 _ _ _ ((mul_right_comm _ B u).trans_le (AE sm B0)) sw B0))).trans_eq (add_mul _ _ _).symm)) lemma nKb(w:kF)(h:kB w≠255):(mJ (kB w))<=254:=by have a:(mJ (kB w))<=255:=by show (mJ ((w>>>23)&&&0xFF))<=255;rw[Ξ];exact ϝ.trans (by decide) have b:(mJ (kB w))≠255:=fun q=>h (Β.1 (by rw[q];rfl)) omega lemma nS1_dl(x:(Ἂ Word))(e:Ἄ)(hX:∀j,j<(J0 e)->kB x[j]!≠255):∀m (i:Ἄ)(s:Ἅ)(Dl:ἆ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)->(lq Dl)<=254-> (lq Dl)<=(lq (nS1 x i e s Dl).2)/\(lq (nS1 x i e s Dl).2)<=254/\∀j,(J0 i)<=j->j<(J0 e)->(mJ (kB x[j]!))<=(lq (nS1 x i e s Dl).2):=by intro m;induction m with |zero=> intro i s Dl hm hie hD have q:=not_lt.2 (V3.1 hm) rw[nS1,dite_eq_right (fun h=>q (ε.1 h))];exact⟨AP,hD,fun j a b=>(q (AO a b)).elim⟩ |succ m ih=> intro i s Dl hm hie hD have hl:(J0 i)<(J0 e):=Zb (hm▸m.succ_pos) rw[nS1,AT (ε.2 hl)];dsimp only;rw[f6 x i] have i1:=Dense.ac (ε.2 hl) have e1:(lq (nfe x[(J0 i)]!))=(mJ (kB x[(J0 i)]!)):=ϩ _ have mx:(lq (if Dlrw[μ,e1]at c · rw[e1];exact (max_eq_right c.le).symm · exact (max_eq_left (not_lt.1 c)).symm obtain⟨a1,a2,a3⟩:=ih (i+1) (s+Dense.F.dw x[(J0 i)]!) _ (by rw[i1,W4,hm,BK]) (i1▸hl) (mx▸max_le hD (nKb _ (hX _ hl))) rw[mx]at a1 refine⟨AZ (le_max_left ..) a1,a2,fun j b c=>?_⟩ rcases BJ b with q|q · rw[<-q];exact AZ (le_max_right ..) a1 · exact a3 j (i1▸q) c lemma nS1_ge(x:(Ἂ Word))(e:Ἄ):∀m (i:Ἄ)(s:Ἅ)(Dl:ἆ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)-> (lq Dl)<=(lq (nS1 x i e s Dl).2)/\∀j,(J0 i)<=j->j<(J0 e)->(mJ (kB x[j]!))<=(lq (nS1 x i e s Dl).2):=by intro m;induction m with |zero=> intro i s Dl hm hie have q:=not_lt.2 (V3.1 hm) rw[nS1,dite_eq_right (fun h=>q (ε.1 h))];exact⟨AP,fun j a b=>(q (AO a b)).elim⟩ |succ m ih=> intro i s Dl hm hie have hl:(J0 i)<(J0 e):=Zb (hm▸m.succ_pos) rw[nS1,AT (ε.2 hl)];dsimp only;rw[f6 x i] have i1:=Dense.ac (ε.2 hl) have e1:(lq (nfe x[(J0 i)]!))=(mJ (kB x[(J0 i)]!)):=ϩ _ have mx:(lq (if Dlrw[μ,e1]at c · rw[e1];exact (max_eq_right c.le).symm · exact (max_eq_left (not_lt.1 c)).symm obtain⟨a1,a3⟩:=ih (i+1) (s+Dense.F.dw x[(J0 i)]!) _ (by rw[i1,W4,hm,BK]) (i1▸hl) rw[mx]at a1 refine⟨AZ (le_max_left ..) a1,fun j b c=>?_⟩ rcases BJ b with q|q · rw[<-q];exact AZ (le_max_right ..) a1 · exact a3 j (i1▸q) c lemma nS1_s(x:(Ἂ Word))(e:Ἄ)(hX:∀j,j<(J0 e)->kB x[j]!≠255)(B:ℝ)(B0:2^(23:Ἀ)<=B)(B1:B<=2^(300:Ἀ)):∀m (i:Ἄ)(s:Ἅ)(Dl:ἆ)(A:ℝ)(k:ℕ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)->Dense.F.fv s->|A|<=k*B-> |Dense.F.rv s-A|<=((k:ℝ)^(2:Ἀ)/2+k)*B*(1/2^(53:Ἀ))+k*(1/2^(1075:Ἀ))->k+m<=2^(12:Ἀ)->(∀j,(J0 i)<=j->j<(J0 e)->|(sv x[j]!:ℝ)*2^kG x[j]!|<=B)-> Dense.F.fv (nS1 x i e s Dl).1/\|Dense.F.rv (nS1 x i e s Dl).1-(A+∑j∈L5 (J0 i) (J0 e),(sv x[j]!:ℝ)*2^kG x[j]!)|<=(((k+m:ℕ):ℝ)^(2:Ἀ)/2+((k+m:ℕ):ℝ))*B*(1/2^(53:Ἀ))+((k+m:ℕ):ℝ)*(1/2^(1075:Ἀ)):=by have Bp:(0:ℝ)<=B:=AZ (by norm_num) B0 intro m;induction m with |zero=> intro i s Dl A k hm hie hf hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (V3.1 hm) rw[nS1,dite_eq_right (by rw[ε,q];exact N4 _),q,Gc,Qn,Av,ϑ];exact⟨hf,he⟩ |succ m ih=> intro i s Dl A k hm hie hf hA he hk hb have hl:(J0 i)<(J0 e):=N1 hm rw[nS1,AT (ε.2 hl)];dsimp only;rw[f6 x i] obtain⟨tf,tr⟩:=Dense.F.cI x[(J0 i)]! (hX _ hl) have hs:=Qz hl (fun j=>(sv x[j]!:ℝ)*2^kG x[j]!) have i1:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 hl) have ht:=hb _ AP hl have kk:(k:ℝ)<=2^(12:Ἀ):=by exact_mod_cast (show k<=2^(12:Ἀ) from (V1 _ _).trans hk) have k0:(0:ℝ)<=k:=C3 k have sm:((k:ℝ)^(2:Ἀ)/2+k)*(1/2^(53:Ἀ))<=1/4:=by have h1:(k:ℝ)^(2:Ἀ)<=2^(12:Ἀ)*2^(12:Ἀ):=by rw[sq];exact mul_le_mul kk kk k0 (by norm_num) have h2:((k:ℝ)^(2:Ἀ)/2+k)<=2^(23:Ἀ)+2^(12:Ἀ):=by linear_combination h1/2+kk exact (AE h2 (nN 53)).trans (by norm_num) have sw:(k:ℝ)*(1/2^(1075:Ἀ))<=B/4:=by have h1:(k:ℝ)*(1/2^(1075:Ἀ))<=2^(12:Ἀ)*(1/2^(1075:Ἀ)):=AE kk (nN _) have h2:(2:ℝ)^(12:Ἀ)*(1/2^(1075:Ἀ))<=1:=nP 12 1075 (by decide) exact h1.trans (h2.trans (by linear_combination B0/4)) have ab:=nM_b (Dense.F.rv s) A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) Bp ht hA sm sw he have bd:|Dense.F.rv s+Dense.F.rv (Dense.F.dw x[(J0 i)]!)|<=(2:ℝ)^(971:ℤ):=by rw[tr,zpow_ofNat];refine ab.trans ((mul_le_mul_of_nonneg_left B1 (by linear_combination k0)).trans ?_) have h1:((k:ℝ)+2)*2^(300:Ἀ)<=2^(13:Ἀ)*2^(300:Ἀ):=AE (by linear_combination kk) (by positivity) exact h1.trans (by rw[<-AF];exact AU one_le_two (by decide)) obtain⟨af,ae⟩:=NF.fA _ _ hf tf bd rw[tr]at ae have step:=nM_e _ _ A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) (nN _) k0 Bp ht hA sm sw he (ae.trans_eq (by rw[one_div_mul_eq_div])) have hA2:|A+(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!|<=((k+1:ℕ):ℝ)*B:=by rw[X7,add_one_mul];exact (Ag _ _).trans (add_le_add hA ht) have:=ih (i+1) _ (if Dlhb j (X5 (i1.symm.le.trans h1)) h2) rw[i1,pA k 1 m,Τ 1 m,add_assoc,<-hs]at this;exact this lemma nMn(s Q Ri m n B u w L2:ℝ)(n4:4<=n)(B0:0<=B)(u0:0<=u)(w0:0<=w)(hQ:|Q|<=B) (hs:|s-n*Q|<=(n^(2:Ἀ)/2+n)*B*u+n*w)(R0:0<=Ri)(hR1:n*Ri<=1)(hR2:1-4*u<=n*Ri) (hm:|m-s*Ri|<=u*|s*Ri|+w)(sm:(n/2+5)*u<=1/8)(sw:w<=B*u/8)(hL:n+5<=L2): |m-Q|<=L2*B*u:=by have id:Q-s*Ri=Q*(1-n*Ri)+(n*Q-s)*Ri:=by ring have n0:(0:ℝ)<=n:=zero_le_four.trans n4 have r0:(0:ℝ)<=1-n*Ri:=sub_nonneg.2 hR1 have t1:|Q*(1-n*Ri)|<=B*(4*u):=by rw[Ae,Ad r0];exact mul_le_mul hQ (sub_le_comm.1 hR2) r0 B0 have t2:|(n*Q-s)*Ri|<=(n/2+1)*B*u+w:=by rw[Ae,Aw,Ad R0] have e:(n^(2:Ἀ)/2+n)*B*u+n*w=n*((n/2+1)*B*u+w):=by ring have p0:0<=(n/2+1)*B*u+w:=add_nonneg (Af (Af (add_nonneg (div_nonneg n0 zero_le_two) zero_le_one) B0) u0) w0 exact (AE (hs.trans_eq e) R0).trans ((mul_right_comm _ _ _).trans_le (mul_le_of_le_one_left p0 hR1)) have d1:|s*Ri-Q|<=B*(4*u)+((n/2+1)*B*u+w):=by rw[Aw,id];exact (Ag _ _).trans (add_le_add t1 t2) have e1:=AE sm B0 have u1:u<=1:=(le_mul_of_one_le_left u0 (le_add_of_nonneg_of_le (div_nonneg n0 zero_le_two) (by norm_num:(1:ℝ)<=5))).trans (sm.trans (by norm_num)) have e0:B*u<=B:=mul_le_of_le_one_right B0 u1 have d2:B*(4*u)+((n/2+1)*B*u+w)<=B/4:=by linear_combination e1+sw+(1/8)*e0 have sr:|s*Ri|<=B+B/4:=(sub_le_iff_le_add'.1 (AY (s*Ri) Q)).trans (add_le_add hQ (d1.trans d2)) have F:=(abs_sub_le m (s*Ri) Q).trans (add_le_add (hm.trans (add_le_add (mul_le_mul_of_nonneg_left sr u0) AP)) d1) have e2:(n+5)*B*u<=L2*B*u:=AE (AE hL B0) u0 have e7:=Af B0 u0 have e4:=AE n4 e7 exact F.trans (by linear_combination e2+2*sw+(1/2)*e4+(1/2)*e7) lemma nR1(n:Ἀ)(h1:1<=n)(h2:n<=2048): (lq (((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n))=2^(52+Aq n)/n/\2^(Aq n)<=n/\n<2^(Aq n+1)/\Aq n<=11:=by have hn:=C8 h1 have l3:Aq n<=11:=U2 ((m9 hn).2 (AO h2 (by decide))) refine⟨?_,ϰ hn,ϙ,l3⟩ have a:(lq (I0 n))=n:=Α (AO h2 (by decide)) have c:=J1 l3 52 have b:(lq (52+(Aq n).toUInt64))=52+Aq n:=by rw[η];simp only[Ϣ,mY,P6] rw[γ (AO l3 (by decide)),γ (show 52<2^(64:Ἀ) by decide),γ (AO c (by decide))] rw[ml,a];simp only[ψ,b,pS] rw[γ (Z4 c),na,γ (lu Kq (Z4 c))] lemma nMeq(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(hn:0z/n) (ϔ rfl fun j _=>h2 _) section open NF Dense.F NE lemma nPwF(f:ἆ)(h1:1<=(lq f))(h2:(lq f)<=2046): (lq (((f<<<52)>>>52)&&&2047))=(lq f)/\((f<<<52)>>>63!=0)=false/\(lq ((f<<<52)&&&0xfffffffffffff))=0:=by have m:(lq f)*2^(52:Ἀ)<=2046*2^(52:Ἀ):=ι _ h2 have q:(lq (f<<<52))=(lq f)*2^(52:Ἀ):=by rw[ψ];simp only[kA,ο,kH];exact γ (m.trans_lt (by decide)) have d:(lq ((f<<<52)>>>52))=(lq f):=by rw[ν,q];simp only[β,kA,kH];exact Xk _ (϶ _) refine⟨?_,?_,?_⟩ · rw[Ε,d];simp only[kA] rw[show (2047:Nat)=2^(11:Ἀ)-1 from rfl,ζ];exact γ (h2.trans_lt (by decide)) · have:(lq ((f<<<52)>>>63))=0:=by rw[ν,q];simp only[β,kA,kH] exact ώ (m.trans_lt (by decide)) have g:(f<<<52)>>>63=0:=ξ.mp (by rw[this];rfl) rw[g];rfl · rw[Ε,q];simp only[kA] rw[show (4503599627370495:Nat)=2^(52:Ἀ)-1 from rfl,ζ];simp only [nr,Ol] lemma nPw(f:ἆ)(h1:1<=(lq f))(h2:(lq f)<=2046):fv (I5 (f<<<52))/\rv (I5 (f<<<52))=(2:ℝ)^(((lq f):ℤ)-1023):=by obtain⟨f1,f2,f3⟩:=nPwF f h1 h2 have ne:=W8 (Z4 h2) have K:kI (I5 (f<<<52)).toModel=Wt kC false (lq f) 0:=by rw[s5ofb _ fun g=>ne (f1.symm.trans (congrArg lq g)),s5fld,f1,f2,f3] have b1:(lq f)<2^kC.expWidth:=N6 (Z4 h2) have b2:0<2^kC.fracWidth:=϶ _ have fin:Wq (Wt kC false (lq f) 0)=true:=by rw[Yg kC _ _ _ b1 b2];exact AM.2 ne refine⟨by unfold fv;rw[K];exact fin,?_⟩ unfold rv;rw[K,BR,Kh _ _ _ _ b1 b2 fin,AC (C8 h1)] simp only[show kC.fracWidth=52 from rfl,show kC.exponentBias=1023 from rfl,Gr] rw[bJ];simp only[υ,ἂ,ϑ] exact s5pw 52 _ end lemma nZb(z k:ℕ)(h:(z:ℝ)<=2^(52:Ἀ)):|((z:ℤ):ℝ)*(2:ℝ)^(-(k:ℤ))|<=(2:ℝ)^(971:ℤ):=by rw[P5,zpow_neg,AA,zpow_ofNat] have p:(0:ℝ)<2^k:=pow_pos two_pos k rw[Ad (Af (C3 z) (inv_nonneg.2 p.le))] exact (mul_le_of_le_one_right (C3 z) (inv_le_one_of_one_le₀ (one_le_pow₀ one_le_two))).trans (h.trans (AU one_le_two (by norm_num))) lemma nRiF(n:Ἀ)(h1:1<=n)(h2:n<=2048): Dense.F.fv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52))/\ Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52))=((2^(52+Aq n)/n:ℕ):ℝ)/2^(52+Aq n):=by obtain⟨a,l1,l2,l3⟩:=nR1 n h1 h2 have R2:2^(52+Aq n)/n<=2^(52:Ἀ):=by have:2^(52+Aq n)/n<=2^(52+Aq n)/2^(Aq n):=pq l1 (϶ _) rw[AF,Xk _ (϶ _)]at this;rwa[AF] have R3:2^(52+Aq n)/n<2^(53:Ἀ):=R2.trans_lt (by decide) have ue:((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n=I0 (2^(52+Aq n)/n):=by apply ξ.1;rw[a];simp only[Ϣ,P6];exact (γ (R3.trans (by decide))).symm obtain⟨rf,rr⟩:=kg2 (2^(52+Aq n)/n) R3 have pt:(lq (971-(Aq n).toUInt64))=971-Aq n:=by have b:(lq (Aq n).toUInt64)=Aq n:=by simp only[Ϣ,P6];exact γ (l3.trans_lt (by decide)) rw[χ _ _ (by rw[θ,b];simp only[kA];exact l3.trans (by decide)),b];simp only[kA] obtain⟨pf,pr⟩:=nPw (971-(Aq n).toUInt64) (by rw[pt];exact M5 ((J1 l3 1).trans (by decide))) (by rw[pt];exact (Y4 _ _).trans (by decide)) rw[pt]at pr rw[ue] have ez:((((971-Aq n):ℕ):ℤ)-1023)=-(((52+Aq n):ℕ):ℤ):=by rw[pO (l3.trans (by decide)),K5];ring have r1:((2^(52+Aq n)/n:ℕ):ℝ)<=2^(52:Ἀ):=by have:=(N5 (α:=ℝ)).2 R2;rwa[B4,nZ]at this have q:=Dense.F.aE _ _ rf pf ((2^(52+Aq n)/n:ℕ):ℤ) (-(((52+Aq n):ℕ):ℤ)) (by rw[rr,pr,ez];push_cast;rfl) R3 (Int.neg_le_neg (O4.2 ((J1 l3 52).trans (by decide)))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,zpow_neg,AA,P5,div_eq_mul_inv] lemma nRb_h1(nR R1 P T:ℝ)(h:PkB x[j]!≠255): Dense.F.fv ((nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).1*((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52)))/\ |Dense.F.rv ((nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).1*((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52)))-((no n x r:ℚ):ℝ)*2^(149:Ἀ)| <=2^(((Aq (n+4)+1:ℕ):ℤ)+(lq (nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).2)-30)/\ (∀j,r*n<=j->j(mJ (kB x[j]!))<=(lq (nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).2))/\ (lq (nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).2)<=254/\ |((no n x r:ℚ):ℝ)*2^(149:Ἀ)|<=2^((lq (nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).2)+23)/\ (∀j,r*n<=j->j|(sv x[j]!:ℝ)*2^kG x[j]!|<=2^((lq (nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0).2)+23)):=by have h1n:1<=n:=J2 (N2 1 3) hn4 have lo:(J0 (G0 (r*n)))=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have hi:(J0 (G0 (r*n+n)))=r*n+n:=Conv.aa _ hb have hX':∀j,j<(J0 (G0 (r*n+n)))->kB x[j]!≠255:=fun j h=>hX j (by rwa[hi]at h) obtain⟨z0f,z0r⟩:=kg2 0 (by norm_num) obtain⟨-,d2,d3⟩:=nS1_dl x _ hX' n (G0 (r*n)) (I0 (0:Ἀ)).toInt64.toFloat 0 ((congrArg₂ (·-·) hi lo).trans (ϱ _ _)) (lo.trans_le ((V1 _ _).trans_eq hi.symm)) (by simp only [ϋ,zero_le]) rw[lo,hi]at d3 obtain⟨rif,rir⟩:=nRiF n h1n hn obtain⟨-,-,l2,-⟩:=nR1 n h1n hn have SS:=fun (B:ℝ) (B0:2^(23:Ἀ)<=B) (B1:B<=2^(300:Ἀ)) (hB:∀j,(J0 (G0 (r*n)))<=j->j<(J0 (G0 (r*n+n)))->|(sv x[j]!:ℝ)*2^kG x[j]!|<=B)=>nS1_s x _ hX' B B0 B1 n (G0 (r*n)) (I0 (0:Ἀ)).toInt64.toFloat 0 0 0 ((congrArg₂ (·-·) hi lo).trans (ϱ _ _)) (lo.trans_le ((V1 _ _).trans_eq hi.symm)) z0f (by rw[A5,A9,zero_mul]) (by rw[z0r,A9,sub_self,A5,zero_pow AL,zero_div,Av,zero_mul,zero_mul,zero_mul,Av]) (J2 (Y3 (Κ n)) (J2 hn (K3 rfl))) hB generalize nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat 0=P at d2 d3 SS ⊢ generalize lq P.2=Dl at d2 d3 ⊢ have hB:∀j,r*n<=j->j|(sv x[j]!:ℝ)*2^kG x[j]!|<=2^(Dl+23):=by intro j h1 h2;obtain⟨-,cr⟩:=Dense.F.cI x[j]! (hX j h2);rw[<-cr] exact (nXb _ (hX j h2)).le.trans (AU one_le_two (L1 (d3 j h1 h2) 23)) have B0:(2:ℝ)^(23:Ἀ)<=2^(Dl+23):=AU one_le_two (N2 23 Dl) have B1:(2:ℝ)^(Dl+23)<=2^(300:Ἀ):=AU one_le_two (J2 (L1 d2 23) (K3 rfl)) have Bp:(0:ℝ)<=2^(Dl+23):=pow_nonneg zero_le_two _ obtain⟨sf,se⟩:=SS _ B0 B1 (fun j h1 h2=>hB j (by rwa[lo]at h1) (by rwa[hi]at h2)) rw[lo,hi,Ai,Κ]at se obtain⟨S,hS⟩:∃S,∑j∈L5 (r*n) (r*n+n),(sv x[j]!:ℝ)*2^kG x[j]! = S:=⟨_,rfl⟩ rw[hS]at se have nR:(0:ℝ)|(sv x[j]!:ℝ)*2^kG x[j]!|) (2^(Dl+23)) (fun j hj=>by rw[Pm]at hj;exact hB j hj.1 hj.2) rw[Ur,ϱ,nsmul_eq_mul]at h exact hS▸(Z9 _ _).trans h have Qe:=nMeq n x r h1n rw[hS]at Qe have hQ:|((no n x r:ℚ):ℝ)*2^(149:Ἀ)|<=2^(Dl+23):=by rw[Qe,abs_div,AW nR,div_le_iff₀ nR];exact Sb.trans_eq (mul_comm _ _) have nQ:(n:ℝ)*(((no n x r:ℚ):ℝ)*2^(149:Ἀ))=S:=by rw[Qe,mul_div_cancel₀ _ nR.ne'] have sm:((n:ℝ)^(2:Ἀ)/2+n)*(1/2^(53:Ἀ))<=1/4:=by have h1:(n:ℝ)^(2:Ἀ)<=2048*2048:=by rw[sq];exact mul_le_mul nR2 nR2 nR.le (by norm_num) have h2:((n:ℝ)^(2:Ἀ)/2+n)<=2048*2048/2+2048:=add_le_add (div_le_div_of_nonneg_right h1 zero_le_two) nR2 exact (AE h2 (nN 53)).trans (by norm_num) have sw:(n:ℝ)*(1/2^(1075:Ἀ))<=2^(Dl+23)/4:=by have h1:(n:ℝ)*(1/2^(1075:Ἀ))<=2^(12:Ἀ)*(1/2^(1075:Ἀ)):=AE (by linarith only[nR2]) (nN _) have h2:(2:ℝ)^(12:Ἀ)*(1/2^(1075:Ἀ))<=1:=nP 12 1075 (by norm_num) have h3:(1:ℝ)<=2^(23:Ἀ)/4:=by norm_num exact h1.trans (h2.trans (h3.trans (div_le_div_of_nonneg_right B0 (by norm_num)))) have sb:=nM_b (Dense.F.rv P.1) S 0 (2^(Dl+23)) (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) n (nN _) Bp (by rw[A5];exact Bp) Sb sm sw se rw[Av]at sb obtain⟨R1,hR1d⟩:∃R1,2^(52+Aq n)/n=R1:=⟨_,rfl⟩ rw[hR1d]at rir have P0:(0:ℝ)<2^(52+Aq n):=pow_pos two_pos _ have R0:(0:ℝ)<=Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52)):=by rw[rir];exact div_nonneg (C3 _) P0.le have nR1:=(N5 (α:=ℝ)).2 (hR1d▸pr (2^(52+Aq n)) n) rw[G4,B4,nZ]at nR1 have hR1:(n:ℝ)*Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52))<=1:=by rw[rir,mul_div_assoc',mul_comm (n:ℝ),div_le_one P0];exact nR1 have lt1:=(Ju (α:=ℝ)).2 (hR1d▸Hv (2^(52+Aq n)) h1n) rw[G4,B4,nZ,K5,pJ]at lt1 have lt2:(n:ℝ)<2^(Aq n+1):=by exact_mod_cast l2 have hR2:=nRb n R1 _ _ P0 lt1 lt2 (by rw[<-AF,pA,Τ]) rw[<-rir]at hR2 have Ri1:Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52))<=1:=by exact (le_mul_of_one_le_left R0 ((show (1:ℝ)<=4 by norm_num).trans nR4)).trans hR1 have fb:|Dense.F.rv P.1*Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*I5 ((971-(Aq n).toUInt64)<<<52))|<=(2:ℝ)^(971:ℤ):=by rw[Ae,Ad R0,zpow_ofNat] refine (mul_le_of_le_one_right (Aa _) Ri1).trans (sb.trans ((mul_le_mul_of_nonneg_left B1 (by linarith only[nR])).trans ?_)) have h1:((n:ℝ)+2)*2^(300:Ἀ)<=2^(12:Ἀ)*2^(300:Ἀ):=AE ((add_le_add nR2 (le_refl 2)).trans (show (2048:ℝ)+2<=2^(12:Ἀ) by norm_num)) (pow_nonneg zero_le_two _) exact h1.trans (by rw[<-AF];exact AU one_le_two (by norm_num)) obtain⟨mf,me⟩:=NF.fM _ _ sf rif fb have sm2:((n:ℝ)/2+5)*(1/2^(53:Ἀ))<=1/8:=(AE ((add_le_add (div_le_div_of_nonneg_right nR2 zero_le_two) (le_refl 5)).trans (show (2048:ℝ)/2+5<=1029 by norm_num)) (nN 53)).trans (show (1029:ℝ)*(1/2^(53:Ἀ))<=1/8 by norm_num) have sw2:(1:ℝ)/2^(1075:Ἀ)<=2^(Dl+23)*(1/2^(53:Ἀ))/8:=by have h1:(2:ℝ)^(23:Ἀ)*(1/2^(53:Ἀ))/8<=2^(Dl+23)*(1/2^(53:Ἀ))/8:=div_le_div_of_nonneg_right (AE B0 (nN 53)) (by norm_num) exact ((nI 33 1075 (by norm_num)).trans (by norm_num)).trans h1 have hL:(n:ℝ)+5<=2^(Aq (n+4)+1):=by have h:n+5<=2^(Aq (n+4)+1):=ϙ simpa only [K5,B4,nZ] using (N5 (α:=ℝ)).2 h have fin:=nMn _ _ _ _ n (2^(Dl+23)) (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) _ nR4 Bp (nN _) (nN _) hQ (by rw[nQ];exact se) R0 hR1 hR2 (me.trans_eq (by rw[one_div_mul_eq_div])) sm2 sw2 hL refine⟨mf,fin.trans_eq ?_,d3,d2,hQ,hB⟩ rw[Ac AL,←K5,AA,zpow_ofNat,mul_one_div,←AF,←pA,AF _ _ 23,(AF (2:ℝ) 30 23:(2:ℝ)^(53:Ἀ)=_)] exact mul_div_mul_right _ _ (pow_ne_zero _ AL) lemma nV_t(y d dd u w Y:ℝ)(u0:0<=u)(u1:u<=1)(w0:0<=w)(w1:w<=1)(hY:|y|<=Y) (hd:|d-y|<=u*|y|+w)(hdd:|dd-d*d|<=u*|d*d|+w):|dd-y*y|<=7*u*(y*y)+(8*Y+3)*w:=by have h0:=Ag (d-y) (y+y);rw[sub_add_add_cancel]at h0 have s1:|d+y|<=2*|y|+(u*|y|+w):=by linear_combination h0+Ag y y+hd have q:=mul_le_mul s1 hd (Aa (d-y)) ((Aa (d+y)).trans s1);rw[<-Ae,<-mul_self_sub_mul_self]at q have uy:=mul_le_of_le_one_left (Aa y) u1 linear_combination abs_sub_le dd (d*d) (y*y)+hdd+mul_le_mul_of_nonneg_left (AY (d*d) (y*y)) u0+mul_le_of_le_one_left (Aa (d*d-y*y)) u1+2*(q+AE uy (Af u0 (Aa y))+2*AE uy w0+4*mul_le_mul_of_nonneg_left hY w0+mul_le_of_le_one_left w0 w1)+6*u*abs_mul_abs_self y+u*abs_mul_self y lemma nV_e(a r A t t' u W k:ℝ)(u0:0<=u)(W0:0<=W)(A0:0<=A)(t0:0<=t)(k0:0<=k)(hk:10*(k+1)*u<=1) (H1:|a-A|<=10*k*u*A+10*k*W)(Ht:|t'-t|<=7*u*t+W)(H2:|r-(a+t')|<=u*|a+t'|+W): |r-(A+t)|<=10*(k+1)*u*(A+t)+10*(k+1)*W:=by have d:|a+t'-(A+t)|<=|a-A|+|t'-t|:=by rw[add_sub_add_comm];exact Ag _ _ have hat:|a+t'|<=(A+t)+(|a-A|+|t'-t|):=by have:=AY (a+t') (A+t);rw[Ad (add_nonneg A0 t0)]at this;linear_combination this+d have ku:10*k*u<=1:=by linear_combination hk+10*u0 have u7:7*u<=1:=by linear_combination hk+3*u0+10*Af k0 u0 have uA:=Af u0 A0;have ut:=Af u0 t0 have m1:(10*k*u)*(u*A)<=1*(u*A):=AE ku uA have m2:(10*k*u)*W<=1*W:=AE ku W0 have m3:(7*u)*(u*t)<=1*(u*t):=AE u7 ut have m4:u*W<=1*W:=AE (by linear_combination u7+6*u0) W0 have E:|a-A|+|t'-t|<=10*k*u*A+10*k*W+(7*u*t+W):=add_le_add H1 Ht have uE:u*(|a-A|+|t'-t|)<=u*(10*k*u*A+10*k*W+(7*u*t+W)):=mul_le_mul_of_nonneg_left E u0 have ua:u*|a+t'|<=u*((A+t)+(|a-A|+|t'-t|)):=mul_le_mul_of_nonneg_left hat u0 have tr:=(abs_sub_le r (a+t') (A+t)).trans (add_le_add AP d) linear_combination tr+H2+ua+uE+m1+m2+m3+m4+E+8*uA+ut+10*Af k0 ut+6*W0 section open Dense.F NF lemma fSb(x y:Ἅ)(h:fv x)(j:fv y)(g:|rv x-rv y|<=(2:ℝ)^(971:Ἁ)): fv (x-y)/\|rv (x-y)-(rv x-rv y)|<=|rv x-rv y|/2^(53:Ἀ)+1/2^(1075:Ἀ):=by have⟨d,e⟩:=s5iS x y h j (g.trans (pm 971 AP));exact⟨d,by rw[e];exact NF.jy _⟩ end lemma nS2_s_h1(B:ℝ)(h:0<=B):B+(B+B)<=(B+B)+(B+B):=add_le_add (le_add_of_nonneg_left h) AP lemma nS2_s(x:(Ἂ Word))(m:Ἅ)(e:Ἄ)(hX:∀j,j<(J0 e)->kB x[j]!≠255)(hm:Dense.F.fv m)(Y:ℝ)(Y0:0<=Y)(Y1:Y<=2^(302:Ἀ)): ∀M (i:Ἄ)(v:Ἅ)(A:ℝ)(k:ℕ),(J0 e)-(J0 i)=M->(J0 i)<=(J0 e)->Dense.F.fv v->0<=A->A<=k*(Y*Y)-> |Dense.F.rv v-A|<=10*k*(1/2^(53:Ἀ))*A+10*k*((8*Y+3)*(1/2^(1075:Ἀ)))->k+M<=2^(12:Ἀ)-> (∀j,(J0 i)<=j->j<(J0 e)->|(sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m|<=Y)-> Dense.F.fv (nS2 x m i e v)/\|Dense.F.rv (nS2 x m i e v)-(A+∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m))| <=10*((k+M:ℕ):ℝ)*(1/2^(53:Ἀ))*(A+∑j∈L5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m))+10*((k+M:ℕ):ℝ)*((8*Y+3)*(1/2^(1075:Ἀ))):=by have W0:(0:ℝ)<=(8*Y+3)*(1/2^(1075:Ἀ)):=Af (add_nonneg (Af (T6 8) Y0) zero_le_three) (nN _) have q1:(1:ℝ)<=2^(302:Ἀ):=one_le_pow₀ one_le_two have e8:(8:ℝ)<=2^(3:Ἀ):=by norm_num have Y5:8*Y<=(2:ℝ)^(305:Ἀ):=(mul_le_mul e8 Y1 Y0 (pow_pos two_pos _).le).trans_eq (by rw[<-AF]) have T5:(3:ℝ)<=2^(305:Ἀ):=(by norm_num:(3:ℝ)<=8).trans (e8.trans (AU one_le_two (by decide))) have W1:(8*Y+3)*(1/2^(1075:Ἀ))<=(2:ℝ)^(306:Ἀ)*(1/2^(1075:Ἀ)):=AE ((add_le_add Y5 T5).trans_eq (by rw[<-mul_two,<-A4])) (nN _) have w1:(1:ℝ)/2^(1075:Ἀ)<=(8*Y+3)*(1/2^(1075:Ἀ)):=le_mul_of_one_le_left (nN _) ((by norm_num:(1:ℝ)<=3).trans (le_add_of_nonneg_left (Af (T6 8) Y0))) have YY:Y*Y<=2^(604:Ἀ):=(mul_le_mul Y1 Y1 Y0 (pow_pos two_pos _).le).trans_eq (by rw[<-AF]) have YY0:0<=Y*Y:=Af Y0 Y0 have u0:=nN 53 have u1:(1:ℝ)/2^(53:Ἀ)<=1:=div_le_one_of_le₀ (one_le_pow₀ one_le_two) (pow_pos two_pos _).le have w0:=nN 1075 have w2:(1:ℝ)/2^(1075:Ἀ)<=1:=div_le_one_of_le₀ (one_le_pow₀ one_le_two) (pow_pos two_pos _).le intro M;induction M with |zero=> intro i v A k hM hie hf A0 hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (V3.1 hM) rw[nS2,dite_eq_right (by rw[ε,q];exact N4 _),q,Gc,Qn,Av,ϑ];exact⟨hf,he⟩ |succ M ih=> intro i v A k hM hie hf A0 hA he hk hb have hl:(J0 i)<(J0 e):=N1 hM rw[nS2,AT (ε.2 hl)];dsimp only;rw[f6 x i] obtain⟨tf,tr⟩:=Dense.F.cI x[(J0 i)]! (hX _ hl) have hs:=Qz hl (fun j=>((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)) have i1:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 hl) have hy:=hb _ AP hl have kk:(k:ℝ)<=2^(12:Ἀ):=by exact_mod_cast (show k<=2^(12:Ἀ) from (V1 _ _).trans hk) have k0:(0:ℝ)<=k:=C3 k obtain⟨df,de⟩:=fSb _ m tf hm (by rw[tr,zpow_ofNat];exact hy.trans (Y1.trans (AU one_le_two (by decide)))) rw[tr]at de generalize hyd:(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!-Dense.F.rv m=y at de hy generalize Dense.F.dw x[(J0 i)]!-m=dF at df de ⊢ have hd:|Dense.F.rv dF-y|<=(1/2^(53:Ἀ))*|y|+1/2^(1075:Ἀ):=by rw[one_div_mul_eq_div];exact de have uy:(1/2^(53:Ἀ))*|y|<=|y|:=mul_le_of_le_one_left (Aa _) u1 have aD:|Dense.F.rv dF|<=2^(304:Ἀ):=by have yP:|y|<=2^(302:Ἀ):=hy.trans Y1 rw[A4,A4,mul_two,mul_two] exact (sub_le_iff_le_add.1 (AY _ y)).trans (add_le_add (hd.trans (add_le_add (uy.trans yP) (w2.trans q1))) (yP.trans (le_add_of_nonneg_left (pow_pos two_pos _).le))) have aDD:|Dense.F.rv dF*Dense.F.rv dF|<=(2:ℝ)^(971:Ἁ):=by rw[Ae,zpow_ofNat];exact (mul_le_mul aD aD (Aa _) (pow_pos two_pos _).le).trans (by rw[<-AF];exact AU one_le_two (by decide)) obtain⟨ddf,dde⟩:=NF.fM dF dF df df aDD have yy:y*y<=Y*Y:=by rw[<-abs_mul_abs_self y];exact mul_le_mul hy hy (Aa _) Y0 have y0:=mul_self_nonneg y have Ht:=nV_t y (Dense.F.rv dF) (Dense.F.rv (dF*dF)) (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) Y u0 u1 w0 w2 hy hd (by rw[one_div_mul_eq_div];exact dde) have k16:10*(k:ℝ)<=2^(16:Ἀ):=(AE (by norm_num:(10:ℝ)<=2^(4:Ἀ)) k0).trans ((mul_le_mul_of_nonneg_left kk (pow_pos two_pos _).le).trans_eq (by rw[<-AF])) have kW:10*(k:ℝ)*((8*Y+3)*(1/2^(1075:Ἀ)))<=1:=by have:=mul_le_mul k16 W1 W0 (pow_pos two_pos _).le exact this.trans (by rw[<-Ap,<-AF];exact nP _ _ (by decide)) have ku:10*(k:ℝ)*(1/2^(53:Ἀ))<=1:=(AE k16 u0).trans (nP 16 53 (by decide)) have kuA:10*(k:ℝ)*(1/2^(53:Ἀ))*A<=A:=mul_le_of_le_one_left A0 ku have Ab:A<=2^(616:Ἀ):=hA.trans ((mul_le_mul kk YY YY0 (pow_pos two_pos _).le).trans_eq (by rw[<-AF])) have Y6:(2:ℝ)^(604:Ἀ)<=2^(616:Ἀ):=AU one_le_two (by decide) have q6:(1:ℝ)<=2^(616:Ἀ):=one_le_pow₀ one_le_two have av:|Dense.F.rv v|<=A+(10*k*(1/2^(53:Ἀ))*A+10*k*((8*Y+3)*(1/2^(1075:Ἀ)))):=by have:=AY (Dense.F.rv v) A;rw[Ad A0]at this;exact sub_le_iff_le_add'.mp (this.trans he) have u7:7*(1/2^(53:Ἀ):ℝ)*(y*y)<=y*y:=mul_le_of_le_one_left y0 ((AE (by norm_num:(7:ℝ)<=2^(3:Ἀ)) u0).trans (nP 3 53 (by decide))) have W2:(8*Y+3)*(1/2^(1075:Ἀ):ℝ)<=1:=W1.trans (nP _ _ (by decide)) have ad:|Dense.F.rv (dF*dF)|<=y*y+(7*(1/2^(53:Ἀ))*(y*y)+(8*Y+3)*(1/2^(1075:Ἀ))):=by have:=AY (Dense.F.rv (dF*dF)) (y*y);rw[Ad y0]at this;exact sub_le_iff_le_add'.mp (this.trans Ht) have aS:|Dense.F.rv v+Dense.F.rv (dF*dF)|<=(2:ℝ)^(971:Ἁ):=by rw[zpow_ofNat] have BB:=nS2_s_h1 _ (pow_pos two_pos 616).le have yB:y*y<=2^(616:Ἀ):=yy.trans (YY.trans Y6) refine (Ag _ _).trans ((add_le_add ((av.trans (add_le_add Ab (add_le_add (kuA.trans Ab) (kW.trans q6)))).trans BB) ((ad.trans (add_le_add yB (add_le_add (u7.trans yB) (W2.trans q6)))).trans BB)).trans ?_) rw[<-mul_two,<-mul_two,<-mul_two,<-A4,<-A4,<-A4];exact AU one_le_two (by decide) obtain⟨rf,re⟩:=NF.fA v (dF*dF) hf ddf aS have H2:|Dense.F.rv (v+dF*dF)-(Dense.F.rv v+Dense.F.rv (dF*dF))|<=(1/2^(53:Ἀ))*|Dense.F.rv v+Dense.F.rv (dF*dF)|+(8*Y+3)*(1/2^(1075:Ἀ)):=by rw[one_div_mul_eq_div];exact re.trans (add_le_add AP w1) have step:=nV_e _ _ A (y*y) _ (1/2^(53:Ἀ)) ((8*Y+3)*(1/2^(1075:Ἀ))) k u0 W0 A0 y0 k0 ((AE ((mul_add 10 (k:ℝ) 1).trans_le ((add_le_add k16 (by norm_num:(10:ℝ)*1<=2^(16:Ἀ))).trans_eq (by rw[<-mul_two,<-A4]))) u0).trans (nP 17 53 (by decide))) he Ht H2 have hA2:A+y*y<=((k+1:ℕ):ℝ)*(Y*Y):=by rw[X7,add_one_mul];exact add_le_add hA yy have:=ih (i+1) (v+dF*dF) (A+y*y) (k+1) (by rw[i1,W4,hM,BK]) (i1.le.trans (l7 hl)) rf (add_nonneg A0 y0) hA2 (by rw[X7];exact step) (by rw[pA,Τ 1 M];exact hk) (fun j h1 h2=>hb j (X5 (i1.symm.le.trans h1)) h2) rw[<-hyd,i1,pA k 1 M,Τ 1 M,add_assoc,<-hs]at this;exact this section open NF Dense.F NE end lemma nXHm(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(eps:kF)(hn:0ℝ)(M mr:ℝ)(h:∑j∈s,f j=s.card*M): ∑j∈s,(f j-mr)*(f j-mr)=∑j∈s,(f j-M)^(2:Ἀ)+s.card*((mr-M)*(mr-M)):=by simp only[nTm_h1 _ mr M] rw[nF,nJ,Vj,nsmul_eq_mul,←n8,←Gv,nF,h,Vj,nsmul_eq_mul,sub_self,mul_zero,zero_mul,sub_zero,pow_two (mr-M)] lemma nL_rel(Dr Zm Zt cu η:ℝ)(Zt0:0h0 (Β.1 q))))))).symm)).trans ((AF _ _ _).trans (congrArg (·*(2:ℝ)^(201:Ἀ)) (AF _ _ _)))).trans_le (AE (AE m3 (pow_nonneg zero_le_two _)) (pow_nonneg zero_le_two _)) lemma nQ52(n:Ἀ)(h1:1<=n)(h2:n<=2048):((1:ἆ)<<<52)/I0 n=I0 (2^(52:Ἀ)/n):=by apply ξ.1 have a:(lq (I0 n))=n:=by simp only[Ϣ];exact γ (by omega) have b:2^(52:Ἀ)/n<2^(64:Ἀ):=AO (J6 _ _) (by norm_num) rw[ml,a];simp only[Ϣ,P6,γ b] rfl section open NF Dense.F NE lemma nL_float_h5(k:ℕ):(0:ℝ)<2^k/\(1:ℝ)<=2^k:=⟨pow_pos two_pos k,one_le_pow₀ one_le_two⟩ lemma nL_float_h6(a b:ℕ)(h:a<=b):(2:ℝ)^a<=2^b:=AU one_le_two h lemma nL_float_h7(Y:ℝ)(k:ℕ)(h:Y<=2^k):8*Y+3<=2^(k+4):=by have P0:=(nL_float_h5 k).1.le have a:8*Y<=2^(k+3):=(mul_le_mul_of_nonneg_left h (T6 8)).trans ((mul_comm _ _).trans_le ((mul_le_mul_of_nonneg_left (by norm_num:(8:ℝ)<=2^3) P0).trans_eq (AF (2:ℝ) k 3).symm)) have b:(3:ℝ)<=2^(k+3):=(by norm_num:(3:ℝ)<=2^3).trans (AU one_le_two (N2 3 k)) rw[A4,mul_two];exact add_le_add a b lemma nL_float_h8(s M m:ℝ)(k:ℕ)(a:|s|<=2^k)(hQ:|M|<=2^k)(t4:|m-M|<=2^k):|s-m|<=2^(k+2):=by rw[A4,A4,mul_two,mul_two] exact (abs_sub s m).trans (add_le_add (a.trans (le_add_of_nonneg_right (nL_float_h5 k).1.le)) ((sub_le_iff_le_add.1 (AY m M)).trans (add_le_add t4 hQ))) lemma nL_float_h1(Tm Tt N d E Z K:ℝ)(hN:N≠0)(h1:Tm=Tt+N*(d*d))(h2:Tt*K/N+E=Z):Tm*K/N+E=Z+d*d*K:=by rw[<-h2,h1,add_mul,add_div,Ap N,mul_div_cancel_left₀ _ hN];exact add_right_comm _ _ _ lemma nL_float_h2(x T R e:ℝ)(k:ℕ)(h:|x-T|<=R)(hR:R<=T+e)(he:e<=1/16)(hT:T<=2^k):-e<=x/\|x|<=2^(k+2):=by obtain⟨h1,h2⟩:=abs_sub_le_iff.1 h have P0:=(nL_float_h5 k).1.le have eP:e<=2^k:=he.trans ((by norm_num:(1:ℝ)/16<=1).trans (nL_float_h5 k).2) have hP2:(2:ℝ)^k<=2^k+2^k:=le_add_of_nonneg_right P0 have lo:-e<=x:=(sub_le_sub_iff_left T).1 ((h2.trans hR).trans_eq (sub_neg_eq_add T e).symm) rw[A4,A4,mul_two,mul_two] exact⟨lo,A3.2 ⟨(neg_le_neg (eP.trans (hP2.trans (le_add_of_nonneg_right (add_nonneg P0 P0))))).trans lo,(sub_le_iff_le_add.1 h1).trans (add_le_add (hR.trans (add_le_add hT eP)) (hT.trans hP2))⟩⟩ lemma nL_float_h3(P x q e c Q:ℝ)(h:|P-x*q|<=|x*q|/2^(53:Ἀ)+c)(hx:-e<=x)(hq0:0<=q)(hq:q<=Q)(he0:0<=e)(heQ:e*Q<=1/16)(hc:c<=1/16):-(1/4)<=P:=by have y1:-e*q<=x*q:=AE hx hq0 have zlo:-(1/16)<=x*q:=(neg_le_neg ((mul_le_mul_of_nonneg_left hq he0).trans heQ)).trans ((neg_mul e q).symm.le.trans y1) have u:|x*q|/2^(53:Ἀ)<=|x*q|:=div_le_self (Aa _) (nL_float_h5 _).2 have a:|x*q|<=x*q+1/8:=A3.2 ⟨by linear_combination 2*zlo,le_add_of_nonneg_right (by norm_num)⟩ have k:-(1/4:ℝ)<=x*q-(x*q+1/8+1/16):=by rw[add_assoc,sub_add_cancel_left];norm_num exact k.trans ((sub_le_sub_left (add_le_add (u.trans a) hc) _).trans (sub_le_comm.1 (abs_sub_le_iff.1 h).2)) lemma nL_float_h4(W S c:ℝ)(h:|W-S|<=|S|/2^(53:Ἀ)+c)(hS:1/2<=S)(hc:c<=1/16):0<=W:=by have S0:|S|=S:=Ad (one_half_pos.le.trans hS) have u:|S|/2^(53:Ἀ)<=|S|/2:=div_le_div_of_nonneg_left (Aa S) two_pos (le_self_pow₀ one_le_two (by norm_num)) rw[S0]at h u have hc':c<=S/2:=hc.trans ((by norm_num:(1:ℝ)/16<=1/2/2).trans (div_le_div_of_nonneg_right hS zero_le_two)) exact (sub_nonneg.2 ((add_le_add u hc').trans_eq (add_halves S))).trans (sub_le_comm.1 (abs_sub_le_iff.1 h).2) lemma nL_float(n:Ἀ)(eps:kF)(x:(Ἂ Word))(r:Ἀ)(hn4:4<=n)(hn:n<=2048)(hb:r*n+n<2^(32:Ἀ))(hX:∀j,jkB x[j]!≠255)(he:kB eps≠255)(hs:0kB x[j]!≠255:=fun j h=>hX j (by rwa[hi]at h) clear hX obtain⟨z0f,z0r⟩:=kg2 0 (϶ _) have lL:Aq (n+4)<=11:=U2 ((m9 (W9 _)).2 (C0 (L1 hn 4) (by decide))) have dB:(2:ℝ)^(((Aq (n+4)+1:ℕ):ℤ)+(Dl:ℤ)-30)<=2^(Dl+23):=by rw[<-AA];exact AG one_le_two (sub_le_iff_le_add.2 (O4.2 ((Τ _ Dl).trans_le (J1 ((C9 lL).trans (by decide:12<=53)) Dl)):((Aq (n+4)+1+Dl:ℕ):ℤ)<=((Dl+23+30:ℕ):ℤ))) set Y:=(2:ℝ)^(Dl+25) with hY have Y0:0<=Y:=(nL_float_h5 _).1.le have Y1:Y<=2^(279:Ἀ):=nL_float_h6 _ _ (L1 d2 25) have t4:=mE.trans dB have hYj:∀j,(J0 (G0 (r*n)))<=j->j<(J0 (G0 (r*n+n)))->|(sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m|<=Y:= fun j h1 h2=>nL_float_h8 _ _ _ _ (hB j (by rwa[lo]at h1) (by rwa[hi]at h2)) hQ t4 obtain⟨vf,ve⟩:=nS2_s x m _ hX' mf Y Y0 (Y1.trans (nL_float_h6 _ _ (by decide))) n (G0 (r*n)) _ 0 0 (by rw[hi,lo];exact ϱ _ _) (by rw[hi,lo];exact V1 _ _) z0f AP (Af (C3 _) (mul_self_nonneg _)) (by rw[z0r];simp only [CharP.cast_eq_zero,sub_self,A5,mul_zero,one_div,zero_mul,Av,Std.le_refl]) ((Κ n).trans_le (hn.trans (by decide))) hYj rw[lo,hi]at ve;simp only[Ai]at ve generalize hv:nS2 x m (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat=v at vf ve hD set Tm:=∑j∈L5 (r*n) (r*n+n),((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m) with hTm set Tt:=∑j∈L5 (r*n) (r*n+n),((sv x[j]!:ℝ)*2^kG x[j]!-M)^(2:Ἀ) with hTt set δ:=Dense.F.rv m-M with hδ have nR:(0:ℝ)sq_nonneg _) have Tm0:0<=Tm:=O8 (fun _ _=>mul_self_nonneg _) have Tmb:Tm<=n*(Y*Y):=by have h:=Ql (L5 (r*n) (r*n+n)) (fun j=>((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-Dense.F.rv m)) (Y*Y) (fun j hj=>by rw[Pm]at hj;have:=hYj j (by rw[lo];exact hj.1) (by rw[hi];exact hj.2) rw[<-abs_mul_abs_self];exact mul_le_mul this this (Aa _) Y0) rwa[cI,nsmul_eq_mul]at h have YY:Y*Y<=2^(558:Ἀ):=(mul_le_mul Y1 Y1 Y0 (nL_float_h5 _).1.le).trans_eq (by rw[<-AF]) have Tmb2:Tm<=2^(570:Ἀ):=Tmb.trans ((mul_le_mul (n11.trans (nL_float_h6 11 12 (by decide))) YY (mul_self_nonneg Y) (nL_float_h5 _).1.le).trans_eq (by rw[<-AF])) have Wb:(8*Y+3)*(1/2^(1075:Ἀ):ℝ)<=1/2^(700:Ἀ):=by have q3:(8*Y+3:ℝ)<=2^(375:Ἀ):=(nL_float_h7 _ _ Y1).trans (nL_float_h6 _ _ (by decide)) exact (AE q3 (nN _)).trans (nP2 375 1075 700 (by decide)) have nW:10*((n:ℕ):ℝ)*((8*Y+3)*(1/2^(1075:Ἀ)))<=10*n*(1/2^(700:Ἀ)):=mul_le_mul_of_nonneg_left Wb (Af (T6 _) nR.le) have nu1:10*((n:ℕ):ℝ)*(1/2^(53:Ἀ))<=1:=(AE n15 (nN 53)).trans (nP 15 53 (by decide)) have e15:10*(n:ℝ)*(1/2^(700:Ἀ))<=1/2^(600:Ἀ):=(AE n15 (nN 700)).trans (nP2 15 700 600 (by decide)) have i16:(1:ℝ)/2^(4:Ἀ)<=1/16:=by norm_num have w6:(1:ℝ)/2^(600:Ἀ)<=1/16:=(nI 4 600 (by decide)).trans i16 obtain⟨vlo,vb⟩:=nL_float_h2 _ _ _ _ _ ve (add_le_add (mul_le_of_le_one_left Tm0 nu1) (nW.trans e15)) w6 Tmb2 rw[nQ52 n n0 hn]at hD obtain⟨qf,qr⟩:=kg2 (2^(52:Ἀ)/n) ((J6 _ _).trans_lt (Wo (by decide))) have q0:0<=((2^(52:Ἀ)/n:ℕ):ℝ):=C3 _ have h0:((n*(2^(52:Ἀ)/n)+2^(52:Ἀ)%n:ℕ):ℝ)=((2^(52:Ἀ):ℕ):ℝ):=congrArg Hg (ϛ (2^(52:Ἀ)) n) have h3:((2^(52:Ἀ)%n:ℕ):ℝ)pow_pos two_pos m have Zt0:0<2^(350:Ἀ)*X:=(p2 _).trans_le ZtE have X0:0kB x[j]!≠255)(he:kB eps≠255)(he0:kB eps≠0)(hs:0sq_nonneg _) (pow_nonneg zero_le_two _)) (C3 _)) (nEp eps he0 hs)) rfl dd exact nQ_tail D df _ (Rat.cast_pos.1 X0) _ c64 hok _ _ k0 k1 AP k2 k3 dd end lemma nRiN_h1(M:ℕ)(M1:2^(23:Ἀ)<=M):2^(63:Ἀ)/M*2^(12:Ἀ)+2^(63:Ἀ)%M*2^(12:Ἀ)/M=2^(75:Ἀ)/M:=by have dm:=Au (2^(63:Ἀ)) M generalize 2^(63:Ἀ)/M=Q at dm ⊢ generalize 2^(63:Ἀ)%M=R at dm ⊢ have k:2^(75:Ἀ)=R*2^(12:Ἀ)+Q*2^(12:Ἀ)*M:=by rw[show 2^(75:Ἀ)=2^(63:Ἀ)*2^(12:Ἀ) from m7 2 63 12,<-dm,Ϡ,Hz Q M,Τ] rw[k,Ρ _ _ (U1 (϶ 23) M1),Τ] lemma nRiN(f:Ἃ)(f1:(mJ f)<2^(23:Ἀ)): (lq (((((1:ἆ)<<<63)/(f.toUInt64+0x800000))<<<12)+((((1:ἆ)<<<63)-((1:ἆ)<<<63)/(f.toUInt64+0x800000)*(f.toUInt64+0x800000))<<<12)/(f.toUInt64+0x800000)))=2^(75:Ἀ)/((mJ f)+2^(23:Ἀ)):=by generalize hmm:f.toUInt64+0x800000=m have mE:(lq m)=(mJ f)+2^(23:Ἀ):=by rw[<-hmm,η,ϩ];exact γ ((B3 f1 _).trans (by decide)) generalize hM:(mJ f)+2^(23:Ἀ)=M at mE have M1:2^(23:Ἀ)<=M:=hM▸N2 _ _ have M2:M<2^(24:Ἀ):=hM▸(B3 f1 (2^(23:Ἀ))).trans_le (by decide) have t63:(lq ((1:ἆ)<<<63))=2^(63:Ἀ):=by rfl generalize (1:ἆ)<<<63=A at t63 ⊢ have q1:(A/m).toNat=2^(63:Ἀ)/M:=by rw[ml,t63,mE] generalize A/m=a at q1 ⊢ have q1b:2^(63:Ἀ)/M<=2^(40:Ἀ):=Hm (J2 (by decide) (ι (2^(40:Ἀ)) M1)) have dm:=Au (2^(63:Ἀ)) M have pm:(a*m).toNat=2^(63:Ἀ)/M*M:=by rw[ύ,q1,mE];exact γ ((pr _ _).trans_lt (by decide)) have r1:(A-a*m).toNat=2^(63:Ἀ)%M:=by rw[χ _ _ (by rw[θ,pm,t63];exact pr _ _),pm,t63];exact Nat.sub_eq_of_eq_add ((Τ _ _).trans dm).symm generalize A-a*m=b at r1 ⊢ have r1b:2^(63:Ἀ)%M.2 R2;rwa[B4,nZ]at this have q:=Dense.F.aE _ _ rf pf (R:ℤ) (-(((74+(lq ed)):ℕ):ℤ)) (by rw[rr,pr,ez,P5]) (by rw[Yp];exact R2.trans_lt (by decide)) (Int.neg_le_neg (O4.2 ((J1 he 74).trans (by decide)):((74+(lq ed):ℕ):ℤ)<=((1074:ℕ):ℤ))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,P5] lemma nRiOK_h1(M:ℕ)(M0:0 < M)(M2:M<=2^(24:Ἀ)):|((2^(75:Ἀ)/M:ℕ):ℝ)*(M:ℝ)*((2:ℝ)^(75:Ἀ))⁻¹-1|<=1/2^(50:Ἀ):=by have a1n:=pr (2^(75:Ἀ)) M have a2n:=Qy (a:=2^(75:Ἀ)) M0 generalize 2^(75:Ἀ)/M=Q at a1n a2n ⊢ have a1:(Q:ℝ)*M<=2^(75:Ἀ):=by have:=N5 (α:=ℝ)|>.2 a1n;rwa[G4,B4,nZ]at this have a2:(2:ℝ)^(75:Ἀ)<=Q*M+M:=by have:=N5 (α:=ℝ)|>.2 a2n.le;rwa[K5,G4,B4,nZ]at this have a3:(M:ℝ)<=2^(24:Ἀ):=by have:=N5 (α:=ℝ)|>.2 M2;rwa[B4,nZ]at this exact A3.2 ⟨by linear_combination (1/2^(75:Ἀ):ℝ)*a2+(1/2^(75:Ἀ):ℝ)*a3,by linear_combination (1/2^(75:Ἀ):ℝ)*a1⟩ lemma nRiOK(dW:Ἃ)(hd:0<(mJ (kB dW))∧kB dW≠255∧ZX dW=false): fv (nRi dW (kB dW).toUInt64)/\|rv (nRi dW (kB dW).toUInt64)*rv (dw dW)-1|<=1/2^(50:Ἀ):=by have ee:(lq (kB dW).toUInt64)=(mJ (kB dW)):=ϩ _ have e254:(mJ (kB dW))<=254:=nKb _ hd.2.1 obtain⟨rf,rr⟩:=nRiV dW (kB dW).toUInt64 (by rw[ee];exact e254) refine⟨rf,?_⟩ obtain⟨-,e⟩:=cI dW hd.2.1 rw[rr,e,ee] have z:kB dW≠0:=λq=>by rw[q]at hd;exact absurd hd.1 (by decide) have hs:(sv dW:ℝ)=(kM dW:ℝ):=by rw[sv,hd.2.2];simp have hm:kM dW=(mJ (dW&&&0x7FFFFF))+2^(23:Ἀ):=by simp only[mantOf,z,ἂ,fracOf];omega have hk:kG dW=(mJ (kB dW))-1:=by simp[idxOf,z] rw[hs,hk,hm] have f1:(mJ (dW&&&0x7FFFFF))<2^(23:Ἀ):=by rw[Ξ];exact AO ϝ (by decide) have h1:=hd.1 generalize mJ (kB dW)=E at h1 ⊢ rw[mul_mul_mul_comm,<-AA (2:ℝ) (E-1),<-AK AL,show -((74+E:ℕ):ℤ)+((E-1:ℕ):ℤ)=-((75:ℕ):ℤ) by omega,zpow_neg,AA] exact nRiOK_h1 _ (U1 (϶ 23) (N2 _ _)) ((L1 f1.le _).trans (by decide)) end lemma nLR_th(n:Ἀ)(eps:Ἃ)(x:(Ἂ Word))(r:Ἀ):(nLR n eps x r).th.get=NR.eI n (gM n eps x r):=by unfold nLR;split<;>rfl lemma nSv(w:kF)(h:0kB x[j]!≠255)(hs:0G7 (ε.mp h) hk lemma nOq{a t n:ℕ}(hb:a+n<2^(32:Ἀ))(h:tἌ->Ἄ->Ἃ)(s:σ)(f':τ->Ἄ->Ἄ->Ἃ)(s':τ)(lo e:Ἄ)(h:∀i j,f s i j=f' s' i j):∀k (i:Ἄ)(out:(Ἂ Word)),(J0 e)-(J0 i)=k->Yq f s lo i e out=Yq f' s' lo i e out:=by intro k;induction k with |zero=>intro i out hk;rw[Yq.eq_def f s,Yq.eq_def f' s',dite_eq_right (nO1 hk),dite_eq_right (nO1 hk)] |succ k ih=>intro i out hk;obtain⟨h1,hk',-⟩:=nOs hk;rw[Yq.eq_def f s,Yq.eq_def f' s',AT (ε.mpr h1),AT (ε.mpr h1),h];exact ih _ _ hk' lemma nH1{i0 t n:Ἄ}{s:ℕ}(ht:(J0 t)<(J0 n))(hb:(J0 i0)+(J0 n)<2^(32:Ἀ))(hx:(J0 i0)+(J0 n)<=s):(J0 (i0+t))Ἅ)(th:Thunk NR.fH):nLS:= let n6:=I0 n let lb:=(Aq n).toUInt64 let m:=s*((((1:ἆ)<<<(52+lb))/n6).toInt64.toFloat*I5 ((971-lb)<<<52)) let v:=vf m let D:=W7 (v*(((1:ἆ)<<<52)/n6).toInt64.toFloat+Dense.F.dw eps*nS201) let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW ⟨m,nRi dW ed.toUInt64,nElK m (Aq (n+4)+1) Dl.toNat ed.toNat,(1054-ed.toNat).toUInt64, nOKs B (nLc n Dl.toNat (kB eps).toNat).toUInt64&&0nS2 x m (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat) (Thunk.mk (λ_=>NR.eI n (gM n eps x r))):=by unfold nLR;rw[AD h];rfl @[noinline]def gM0(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(w:Ἃ):Ἀ×Ἀ×Ἆ×Ἀ×Ἀ×Ἃ:= let lo:=r*n let u:=cS x (G0 lo) (G0 (lo+n)) 255 let st:=cF x u (G0 lo) (G0 (lo+n)) 0 0 0 0 0 0 0 0 let S:=Y0 st.P st.N let k:=Q2 (max st.P st.N)-30 ((lq u),k,decide (st.P>>k,S&&&(VO 1 k-1),w) theorem gM0_e(n:Ἀ)(eps:Ἃ)(x:(Ἂ Word))(r:Ἀ):gM0 n x r (gM n eps x r).2.2.2.2.2=gM n eps x r:=rfl theorem nLR_dW(n:Ἀ)(eps:kF)(x:(Ἂ Word))(r:Ἀ)(hb:r*n+n<2^(32:Ἀ))(hX:∀j,jkB x[j]!≠255)(q:0z | none=>NR.eI n (gM0 n x r dW)) (nFBz n eps x g b nd z i j,z) def nDR(x:(Ἂ Word))(Xr:ἀ)(i0 t n:Ἄ)(hx:(J0 i0)+(J0 n)<=(O0 x))(hb:(J0 i0)+(J0 n)<2^(32:Ἀ))(hr:(J0 n)+2<=(kS Xr))(s:Ἅ)(Dl:ἆ):nDP:= if h:t(kS (nDR x Xr i0 t n hx hb hr s Dl).a)=(kS Xr):=by intro k;induction k with |zero=> intro t Xr hr s Dl hk;rw[nDR.eq_def,dite_eq_right (nO1 hk)];exact Dense.F.uZ .. |succ k ih=> intro t Xr hr s Dl hk;obtain⟨ht,hk',-⟩:=nOs hk rw[nDR.eq_def,AT (ε.mpr ht)];dsimp only;rw[ih _ _ _ _ _ hk',Dense.F.uZ] def nVR(Xr:ἀ)(m:Ἅ)(t n:Ἄ)(hr:(J0 n)<=(kS Xr))(v:Ἅ):Ἅ:= if h:t 0) generalize q%4=r at h4 hr subst h4 interval_cases r <;> simp only [nr] <;> omega theorem pkF2 (X:Nat):(X/2^27+2)/4=(X+2^28)/2^29:=by rw [show (2:Nat)^29=2^27*4 by norm_num, ← lY, show X+2^28=X+2*2^27 by norm_num,Ρ _ _ (by positivity)] theorem pkF3 (b:Nat):(b%2^63+2^28)/2^29=(b/2^52%2^11)*2^23+(b%2^52+2^28)/2^29:=by rw [show (2:Nat)^63=2^52*2^11 by norm_num,Xf,show b%2^52+2^52*(b/2^52%2^11)+2^28 = (b%2^52+2^28)+(b/2^52%2^11)*2^23*2^29 by ring,Ρ _ _ (by positivity)] ring @[inline] def pk2 (B:ἆ):Word := (((((B<<<1)>>>1)+0x10000000)>>>29)-((1045:ἆ)<<<23)).toUInt32|||((B>>>63).toUInt32<<<31) theorem pk2_nW (B:ἆ) (h1:1047 ≤ ((B>>>52)&&&2047).toNat) (h2:((B>>>52)&&&2047).toNat ≤ 1298) : pk2 B=Norm.nW B:=by unfold pk2 Norm.nW Norm.NE.pk Core.ar Dense.F.eF apply Β.1 have hm:=Norm.NF.kc B have hb:=B.toNat_lt generalize Dense.F.mF B=M at * generalize hbB:B.toNat=b at * have e2047:(2047:Nat)=2^11-1:=rfl have e52:(4503599627370495:Nat)=2^52-1:=rfl have hE:((B>>>52)&&&2047).toNat=b/2^52%2^11:=by simp only [Ε,ν,kA,hbB,β, kH,e2047,ζ] rw [hE] at h1 h2 have hM:M.toNat=b%2^52+2^52:=by rw [hm]; simp only [Ε,kA,hbB,e52,ζ] have hq:(M>>>27).toNat=(b%2^52+2^52)/2^27:=by simp only [ν,kA,kH,β,hM] have hq1:(b%2^52+2^52)/2^27 < 2^26:=by omega have hN:(((2:ἆ)*(M>>>27)+1)<<<36).toNat=(2*((b%2^52+2^52)/2^27)+1)*2^36:=by simp only [ψ,η,ύ,kA,kH,hq, ο] omega generalize ((2:ἆ)*(M>>>27)+1)<<<36=N at * generalize hQ:(b%2^52+2^52)/2^27=q at * have hA:((N+(274877906943:ἆ)+((N>>>39)&&&1))>>>39).toNat=(N.toNat+274877906943+N.toNat/2^39%2)/2^39:=by simp only [ν,η,Ε,kA,kH, β,mP] rw [hN]; omega have k1:(900:ἆ) ≤ (B>>>52&&&2047):=by rw [θ,hE]; simp only [kA]; omega have k2:(146:ἆ) ≤ (B>>>52&&&2047)-900:=by rw [θ,χ _ _ k1,hE]; simp only [kA]; omega have hS2:((B>>>52&&&2047)-900-146).toNat=b/2^52%2^11-1046:=by rw [χ _ _ k2,χ _ _ k1,hE]; simp only [kA]; omega generalize (B>>>52&&&2047)-900-146=sg at * have hL1:(((B<<<1)>>>1)+268435456).toNat=b%2^63+2^28:=by simp only [η,ν,ψ,kA,kH, ο,β,hbB] omega have k3:((1045:ἆ)<<<23) ≤ (((B<<<1)>>>1)+268435456)>>>29:=by rw [θ,ν,hL1] simp only [ψ,kA,kH,ο,β] omega have hL:((((B<<<1)>>>1)+268435456)>>>29-(1045:ἆ)<<<23).toNat=(b%2^63+2^28)/2^29-1045*2^23:=by rw [χ _ _ k3,ν,hL1] simp only [ψ,kA,kH,ο,β] omega have hS:((B>>>63).toUInt32<<<(31:ἇ)).toNat=b/2^63*2^31:=by simp only [ϴ,Ϫ,ν,kN,kA, kH,ο,β,hbB] omega have hif:(if (B>>>63 != 0)=true then (2147483648:ἆ) else 0).toNat=b/2^63*2^31:=by by_cases hs:b < 2^63 · have e:B>>>63=0:=by apply ξ.1 simp only [ν,kA,kH,β,hbB] omega rw [e]; simp only [bne_self_eq_false,υ, ↓reduceIte,kA]; omega · have e:B>>>63≠0:=by intro h; have h':=congrArg lq h simp only [ν,kA,kH,β,hbB] at h' omega simp only [AM,Ak,e,not_false_eq_true, ↓reduceIte,kA]; omega have hor : ∀ a c:Nat,c < 2^31 → c|||a*2^31=c+a*2^31:=by intro a c hc; rw [Nat.lor_comm,Ϗ, ← Ϥ hc]; omega rw [_root_.UInt32.toNat_or,Ϫ,hL,hS,Ϫ,η,η,hif, ψ,hS2,hA] simp only [kA,kH,ο] rw [hN,pkF1 q hq1, ← hQ,pkF2,pkF3 b] clear hm hM hq hN hA hL hS hif hE hS2 k1 k2 k3 hL1 hQ hq1 e2047 e52 hbB have hY:(b%2^52+2^52+2^28)/2^29=2^23+(b%2^52+2^28)/2^29:=by rw [show b%2^52+2^52+2^28=(b%2^52+2^28)+2^23*2^29 by ring,Ρ _ _ (by positivity)]; ring rw [hY] have hYb:(b%2^52+2^28)/2^29 ≤ 2^23:=U2 (Ϟ (by have:=ϊ b (by positivity:2^52 > 0); norm_num at this ⊢; omega)) generalize (b%2^52+2^28)/2^29=Y at * have hsb:b/2^63 ≤ 1:=U2 (Ϟ (by norm_num at hb ⊢; omega)) generalize b/2^63=sb at * generalize b/2^52%2^11=E at * clear hb simp only [nr] at * rw [hor] · omega · omega @[inline] def okF (B T:ἆ):Ἆ := ((B<<<1)>>>53)-T ≤ 1298-T&&(B&&&0x7FFFFFF)-33 < 0x8000000-65 theorem okF_nOK (B T:ἆ) (h1:1047 ≤ T.toNat) (h2:T.toNat ≤ 1298) (h:okF B T=true) : Norm.nOK B 5=true∧T.toNat ≤ (Dense.F.eF B).toNat:=by unfold okF at h unfold Norm.nOK Dense.F.eF simp only [Η,AJ] at h ⊢ obtain ⟨hE,hL⟩:=h have hb:=B.toNat_lt have eE:((B<<<1)>>>53).toNat=B.toNat/2^52%2048:=by simp only [ν,ψ,kA,kH,ο, β] omega have eE2:((B>>>52)&&&2047).toNat=B.toNat/2^52%2048:=by simp only [Ε,ν,kA,kH,β, show (2047:Nat)=2^11-1 from rfl,ζ] have eL:(B&&&0x7FFFFFF).toNat=B.toNat%2^27:=by simp only [Ε,kA,show (134217727:Nat)=2^27-1 from rfl,ζ] rw [θ] at hE rw [μ] at hL simp only [Ζ,kA,eE,eL] at hE hL simp only [θ,μ,η,ψ,kA, kH,ο,eE2,eL] simp only [nr] at * omega def nZT:Ἂ ἀ:=#[⟨mB 34 0⟩,⟨mB 66 0⟩,⟨mB 130 0⟩,⟨mB 258 0⟩] @[inline]def nZw(n:Ἀ):ἀ:=let z:=nZT[if n<=32 then 0 else if n<=64 then 1 else if n<=128 then 2 else 3]!;if n+2<=(kS z) then z else Dense.F.zPq (n+2) lemma nZw_sz(n:Ἀ):n+2<=(kS (nZw n)):=(fun z=>(by split;assumption;exact (Dense.F.zPs (n+2)).1:n+2<=(kS (if n+2<=(kS z) then z else Dense.F.zPq (n+2))))) _ lemma nOKp(B c:ἆ)(h:nOK B c=ἃ):pk2 B=nW B:=by unfold nOK at h;simp only[Η,AJ]at h;have h1:=h.1.1.1.1;have h2:=h.1.1.1.2;rw[θ]at h1 h2;simp only[kA]at h1 h2;exact pk2_nW B h1 h2 def nFE(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(ex:Option NR.fH)(lo t nn:Ἄ) (hr:(J0 nn)<=(kS Xr))(hg:(J0 nn)<=(kS gd))(hd:(J0 nn)<=(kS bd))(he:(J0 nn)<=ge.size) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)):(Ἂ Word):= if h:t>>52)&&&2047)) then nFE n eps x g b Xr gd bd ge nd m ri Kp r dW ex lo (t+1) nn hr hg hd he hb (out.uset (lo+t) (pk2 B) hu) (nH3 _ _ _ _ ho) else let p:=nFB n eps x g b nd r dW ex (lo+t) t nFE n eps x g b Xr gd bd ge nd m ri Kp r dW (some p.2) lo (t+1) nn hr hg hd he hb (out.uset (lo+t) p.1 hu) (nH3 _ _ _ _ ho) else out termination_by (J0 nn)-(J0 t) decreasing_by all_goals exact nHd h lemma nFE_sz(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(lo nn:Ἄ) (hr:(J0 nn)<=(kS Xr))(hg:(J0 nn)<=(kS gd))(hd:(J0 nn)<=(kS bd))(he:(J0 nn)<=ge.size) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ)):∀k (ex:Option NR.fH)(t:Ἄ)(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)),(J0 nn)-(J0 t)=k-> (O0 (nFE n eps x g b Xr gd bd ge nd m ri Kp r dW ex lo t nn hr hg hd he hb out ho))=(O0 out):=by intro k;induction k with |zero=> intro ex t out ho hk;rw[nFE.eq_def,dite_eq_right (nO1 hk)] |succ k ih=> intro ex t out ho hk;obtain⟨ht,hk',-⟩:=nOs hk rw[nFE.eq_def,AT (ε.mpr ht)];dsimp only;split<;>rw[ih _ _ _ _ hk',BT] lemma nYq_sz{σ:Type}(f:σ->Ἄ->Ἄ->Ἃ)(s:σ)(lo e:Ἄ):∀k (i:Ἄ)(out:(Ἂ Word)),(J0 e)-(J0 i)=k->(O0 (Yq f s lo i e out))=(O0 out):=by intro k;induction k with |zero=> intro i out hk;rw[Yq,dite_eq_right (nO1 hk)] |succ k ih=> intro i out hk;obtain⟨h1,hk',-⟩:=nOs hk rw[Yq,AT (ε.mpr h1),ih _ _ hk'];split;exact BT ..;rfl @[inline]def nLc2(L Dl ef:Ἀ):Ἀ:=max (L+4) (2*L+2*Dl-(ef+178))+2 lemma nLc_e(n Dl ef:Ἀ):nLc2 (Aq (n+4)+1) Dl ef=nLc n Dl ef:=by unfold nLc2 nLc;omega lemma kQ52(n:Ἀ)(h:n<2^(64:Ἀ)):((1:ἆ)<<<52)/I0 n=I0 (4503599627370496/n):=by apply ξ.1 rw[ml,show ((1:ἆ)<<<52)=4503599627370496 from rfl] simp only[I0,P6] rw[γ h,γ (C0 (J6 _ _) (by decide))] rfl lemma kO0(e:ἇ):e.toUInt64>>>32=I0 0:=by apply ξ.1;rw[ν,ϩ,show (lq 32)%64=32 from rfl,β,ώ (e.toNat_lt)];rfl lemma kO1(e:ἇ):e.toUInt64>>>32+1=I0 1:=by rw[kO0];rfl lemma nElK_n(m:Ἅ)(L Dl ed:Ἀ):nElK m L Dl ed=(max (L+Dl+1052) (((m.toBits>>>52)&&&2047).toNat+9)-ed).toUInt64:=by unfold nElK;congr 1;generalize ((m.toBits>>>52)&&&2047).toNat=E;omega @[inline]def nElK3(m:Ἅ)(L Dl ed:Ἀ):ἆ:=(max (L+Dl+1052) (((m.toBits>>>52)&&&2047).toNat+9)-ed).toUInt64 lemma nElK3_e(m:Ἅ)(L Dl ed:Ἀ):nElK3 m L Dl ed=nElK m L Dl ed:=(nElK_n m L Dl ed).symm lemma kZ0(n:Ἀ)(h:n<2^(40:Ἀ)):ZR (I0 n)=(Aq n).toUInt64:=by apply ξ.1;have l:=Vm n rw[Y7,Dense.F.kOfS n (by omega),Dense.F.kOfS _ (by omega)] lemma kZ1(n:Ἀ)(h:n<2^(40:Ἀ)):ZR (I0 n)+1=(Aq n+1).toUInt64:=by apply ξ.1;have l:=Vm n rw[η,Y7,Dense.F.kOfS n (by omega),Dense.F.kOfS _ (by omega),show (1:ἆ).toNat=1 from rfl];omega lemma kZ4(n:Ἀ)(h:n<2^(40:Ἀ)):ZR (I0 n)+4=(Aq n+4).toUInt64:=by apply ξ.1;have l:=Vm n rw[η,Y7,Dense.F.kOfS n (by omega),Dense.F.kOfS _ (by omega),show (4:ἆ).toNat=4 from rfl];omega def nCK(n:Ἀ)(eps:Ἃ)(rm nf ep z0:Ἅ)(L:ἆ):Prop:=rm=(((1:ἆ)<<<(52+ZR (I0 n)))/I0 n).toInt64.toFloat*I5 ((971-ZR (I0 n))<<<52)∧nf=(((1:ἆ)<<<52)/I0 n).toInt64.toFloat∧ep=Dense.F.dw eps*nS201∧z0=(I0 (0:Ἀ)).toInt64.toFloat∧L=ZR (I0 (n+4))+1 @[inline]def nLQk{β:Type}(eps:Ἃ)(s:Ἅ)(Dl:ἆ)(vf:Ἅ->Ἅ)(rm nf ep:Ἅ)(L:ἆ)(k:Ἅ->Ἅ->ἆ->Ἃ->Ἆ->β):β:= let m:=s*rm let v:=vf m let D:=W7 (v*nf+ep) let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW k m (nRi dW ed.toUInt64) (nElK3 m L.toNat Dl.toNat ed.toNat) dW (nOKs B (nLc2 L.toNat Dl.toNat (kB eps).toNat).toUInt64&&0Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(hn:n<2^(32:Ἀ))(th:Thunk NR.fH)(k:Ἅ->Ἅ->ἆ->Ἃ->Ἆ->β):nLQk eps s Dl vf rm nf ep L k=k (nLQ n eps s Dl vf th).m (nLQ n eps s Dl vf th).ri (nLQ n eps s Dl vf th).Kp (nLQ n eps s Dl vf th).dW (nLQ n eps s Dl vf th).fast:=by obtain⟨h1,h2,h3,-,h4⟩:=hC;subst h1 h2 h3 h4 rw[kZ0 n (by omega),kZ1 (n+4) (by omega)] have h63:Aq (n+4)+1<2^(63:Ἀ):=C0 (C9 (Vm _)) (by omega) simp only[nLQk,nLQ,nLc_e,nElK3_e,Dense.F.kOfS _ h63] lemma nLo_z(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(e:nLS)(i j:Ἄ):nLo n eps x g b nd e i j=nFBz n eps x g b nd e.th.get i j:=rfl @[noinline]def nRowS(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(r:Ἀ)(lo hi:Ἄ)(out:(Ἂ Word)):(Ἂ Word):=Yq (nFBz n eps x g b nd) (nEI n eps x r) lo lo hi out lemma nRowS_e(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(r:Ἀ)(lo hi:Ἄ)(out:(Ἂ Word))(hf:(nLR n eps x r).fast=false):nRowS n eps x g b nd r lo hi out=Yq (nEO n eps x g b nd) (nLR n eps x r) lo lo hi out:= nYqC _ _ _ _ lo hi (fun i j=>by simp only[nEO,hf,υ,↓reduceIte,nLoN,nLo_z,nLR_th,nEI]) _ lo out rfl noncomputable def nFE2(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(ex:Option NR.fH)(lo t nn:Ἄ) (hg:(J0 nn)<=(O0 g))(hd:(J0 nn)<=(O0 b)) (hx:(J0 lo)+(J0 nn)<=(O0 x))(hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)):(Ἂ Word):= if h:t>>52)&&&2047)) then nFE2 n eps x g b nd m ri Kp r dW ex lo (t+1) nn hg hd hx hb (out.uset (lo+t) (nW B) hu) (nH3 _ _ _ _ ho) else let p:=nFB n eps x g b nd r dW ex (lo+t) t nFE2 n eps x g b nd m ri Kp r dW (some p.2) lo (t+1) nn hg hd hx hb (out.uset (lo+t) p.1 hu) (nH3 _ _ _ _ ho) else out termination_by (J0 nn)-(J0 t) decreasing_by all_goals exact nHd h @[inline]def nRow(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hr:n+2<=(kS Xr))(hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ)):ἀ×(Ἂ Word):= let lo:=G0 (r*n);let hi:=G0 (r*n+n);let nn:=G0 n have q1:(J0 lo)=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q2:(J0 nn)=n:=Conv.aa _ (C0 (N2 _ _) hb) have hx':(J0 lo)+(J0 nn)<=(O0 x):=by rw[q1,q2];exact hx have hb':(J0 lo)+(J0 nn)<2^(32:Ἀ):=by rw[q1,q2];exact hb have hr':(J0 nn)+2<=(kS Xr):=by rw[q2];exact hr let pD:=nDR x Xr lo 0 nn hx' hb' hr' z0 0 have hs:(kS pD.a)=(kS Xr):=nDR_sz x lo nn hx' hb' _ 0 Xr hr' z0 0 rfl have hr2:(J0 nn)+2<=(kS pD.a):=by rw[hs];exact hr' if pD.d<255 then let s:=pD.a.uget nn (U1 (U4 _) ((N8 _).trans hr2)) nLQk eps s pD.d (λm=>nVR pD.a m 0 nn ((V1 _ 2).trans hr2) z0) rm nf ep L (λm ri Kp dW fast=> if fast then (pD.a,nFE n eps x g b pD.a gd bd ge nd m ri Kp r dW none lo 0 nn ((V1 _ 2).trans hr2) (by rw[q2];exact hg) (by rw[q2];exact hd) (by rw[q2];exact he) hb' out (by rw[q1,q2];exact ho)) else (pD.a,nRowS n eps x g b nd r lo hi out)) else (pD.a,#[]) lemma nRow_sz(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hr:n+2<=(kS Xr))(hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ)): (kS (nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb).1)=(kS Xr)∧((nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb).2=#[]∨(O0 (nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb).2)=(O0 out)):=by unfold nRow nLQk nRowS;dsimp only;split · split · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,BA (nFE_sz _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl)⟩ · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,BA (nYq_sz _ _ _ _ _ _ _ rfl)⟩ · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,pZ rfl⟩ @[noinline]noncomputable def nRow1(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hg:n<=(O0 g))(hd:n<=(O0 b)) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ)):(Ἂ Word):= let lo:=G0 (r*n);let hi:=G0 (r*n+n);let nn:=G0 n have q1:(J0 lo)=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q2:(J0 nn)=n:=Conv.aa _ (C0 (N2 _ _) hb) have hx':(J0 lo)+(J0 nn)<=(O0 x):=by rw[q1,q2];exact hx have hb':(J0 lo)+(J0 nn)<2^(32:Ἀ):=by rw[q1,q2];exact hb let S:=nS1 x lo hi z0 0 if S.2<255 then nLQk eps S.1 S.2 (λm=>nS2 x m lo hi z0) rm nf ep L (λm ri Kp dW fast=> if fast then nFE2 n eps x g b nd m ri Kp r dW none lo 0 nn (by rw[q2];exact hg) (by rw[q2];exact hd) hx' hb' out (by rw[q1,q2];exact ho) else nRowS n eps x g b nd r lo hi out) else #[] lemma nGEu(w:ἇ):(((w>>>23)&&&255).toUInt8).toUInt64=nfe w:=by rw[nfe];apply ξ.1;rw[UInt8.toNat_toUInt64,UInt32.toNat_toUInt8,ϩ];apply γ;rw[Ξ];exact Z4 (ϝ.trans (by decide)) @[inline]def nWF(a:(Ἂ Word)):ἀ×ByteArray:=(⟨a.map Dense.F.dw⟩,⟨a.map (fun (w:Word)=>((w>>>23)&&&255).toUInt8)⟩) lemma nWF_sp(a:(Ἂ Word)):(kS (nWF a).1)=a.size∧(∀t,t(nWF a).1.data[t]! =Dense.F.dw a[t]!)∧(nWF a).2.size=a.size∧∀t,t((nWF a).2.data[t]!).toUInt64=nfe a[t]!:=by refine⟨m0 ..,fun t ht=>?_,m0 ..,fun t ht=>?_⟩ · show (a.map Dense.F.dw)[t]! =_;rw[AB _ _ (by rw[m0];exact ht),AB a t ht,Kt] · show ((a.map (fun (w:Word)=>((w>>>23)&&&255).toUInt8))[t]!).toUInt64=_;rw[AB _ _ (by rw[m0];exact ht),AB a t ht,Kt];exact nGEu _ @[inline]def nWF2(k:(Ἂ Word)×(Ἂ Word)):(ἀ×ByteArray)×ἀ×Ἆ:=(nWF k.1,(nWF k.2).1,k.1.all finiteWord&&k.2.all finiteWord) @[inline]def nK2eq(a b:(Ἂ Word)×(Ἂ Word)):Ἆ:=Dense.F.wcAeq a.1 b.1&&Dense.F.wcAeq a.2 b.2 theorem nK2eq_ok(a b:(Ἂ Word)×(Ἂ Word))(h:nK2eq a b=true):a=b:=by obtain⟨a1,a2⟩:=a;obtain⟨b1,b2⟩:=b;simp only[nK2eq,Η]at h;rw[Dense.F.wcAeq_ok h.1,Dense.F.wcAeq_ok h.2] @[noinline]def nWS2:ST.Ref Unit (Ἂ (Dense.F.WcE nWF2)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline]def nWGo(g b:(Ἂ Word)):{v//v=nWF2 (g,b)}:=Dense.F.wcGet3 nK2eq (fun a b=>nK2eq_ok a b) nWS2 32 (g,b) (fun k=>k.1) def nWGs(g b:(Ἂ Word))(s:Ἂ (Dense.F.WcE nWF2))(i:Nat):{v//v=nWF2 (g,b)}:= if h:iwithPtrAddr g (fun p2=> if p1=p2 then (if hk:nK2eq s[i].k (g,b)=true then ⟨s[i].v,by rw[s[i].h,nK2eq_ok _ _ hk]⟩ else nWGo g b) else nWGs g b s (i+1)) (fun _ _=>Dense.F.wcSub _ _)) (fun _ _=>Dense.F.wcSub _ _) else nWGo g b termination_by s.size-i @[noinline]def nWG2(g b:(Ἂ Word)):(ἀ×ByteArray)×ἀ×Ἆ:=(nWGs g b (ST.Prim.Ref.get nWS2 (Void.mk ())).val 0).1 theorem nWG2_v(g b:(Ἂ Word)):nWG2 g b=nWF2 (g,b):=(nWGs g b _ 0).2 lemma nBu(a:ByteArray)(i:Ἄ)(h:(J0 i)subst h · exact⟨by rw[nFB,nFBz,nLo,nLR_th,E],E⟩ · exact⟨by rw[nFB,nFBz,nLo,nLR_th],rfl⟩ lemma nUc(lo t:Ἄ):lo+t-lo=t:=by rw[Pk,Hj] lemma nFE_eq(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(r:Ἀ)(lo nn:Ἄ) (hr:(J0 nn)<=(kS Xr))(hg:(J0 nn)<=(kS gd))(hd:(J0 nn)<=(kS bd))(he:(J0 nn)<=ge.size) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(hf:(nLR n eps x r).fast=true) (hK:∀t,t<(J0 nn)->¬((nLR n eps x r).KpXr.data[t]! =Dense.F.dw x[(J0 lo)+t]!) (hG:∀t,t<(J0 nn)->gd.data[t]! =Dense.F.dw g[t]!) (hB:∀t,t<(J0 nn)->bd.data[t]! =Dense.F.dw b[t]!) (hE:∀t,t<(J0 nn)->(ge.data[t]!).toUInt64=nfe g[t]!)(hq:r*n+n<2^(32:Ἀ))(hXf:∀j,jkB x[j]!≠255)(heps:0(J0 nn)-(J0 t)=k->(J0 t)<=(J0 nn)->(ex=none∨ex=some (NR.eI n (gM n eps x r)))-> nFE n eps x g b Xr gd bd ge nd (nLR n eps x r).m (nLR n eps x r).ri (nLR n eps x r).Kp r (nLR n eps x r).dW ex lo t nn hr hg hd he hb out ho=Yq (nEO n eps x g b nd) (nLR n eps x r) lo (lo+t) (lo+nn) out:=by have hdW:=nLR_dW n eps x r hq hXf heps hf have hn:=nCa hb intro k;induction k with |zero=> intro ex t out ho hos hk ht hx rw[nFE.eq_def,dite_eq_right (nO1 hk),Yq,dite_eq_right (nOz hb hk ht)] |succ k ih=> intro ex t out ho hos hk ht hx obtain⟨h1,hk',ht'⟩:=nOs hk have h2:(J0 (lo+t))=(J0 lo)+(J0 t):=nCa (nOq hb h1) have h3:lo+t>>52)&&&2047)) then nW (nElB x[(J0 lo)+(J0 t)]! g[(J0 t)]! b[(J0 t)]! (nLR n eps x r).m (nLR n eps x r).ri) else nLo n eps x g b nd (nLR n eps x r) (lo+t) t:=by rw[nEO,AD hf];simp only[f6,h2,nElOK,AC (hK _ h1),nLoN] rw[hV];simp only[nElB] split · rename_i hc;simp only[hc,nOKp _ _ hc,↓reduceIte];refine ih ex (t+1) _ _ ?_ hk' ht' hx;rw[BT];exact hos · rename_i hc;simp only[hc,υ,↓reduceIte];have q:=nFB_v n eps x g b nd r (nLR n eps x r).dW ex hdW hx (lo+t) t;rw[<-q.1];refine ih (some (nFB n eps x g b nd r (nLR n eps x r).dW ex (lo+t) t).2) (t+1) _ _ ?_ hk' ht' (BA (by rw[q.2]));rw[BT];exact hos lemma nFE2_eq(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(r:Ἀ)(lo nn:Ἄ) (hg:(J0 nn)<=(O0 g))(hd:(J0 nn)<=(O0 b))(hx:(J0 lo)+(J0 nn)<=(O0 x)) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(hf:(nLR n eps x r).fast=true) (hK:∀t,t<(J0 nn)->¬((nLR n eps x r).KpkB x[j]!≠255)(heps:0(J0 nn)-(J0 t)=k->(J0 t)<=(J0 nn)->(ex=none∨ex=some (NR.eI n (gM n eps x r)))-> nFE2 n eps x g b nd (nLR n eps x r).m (nLR n eps x r).ri (nLR n eps x r).Kp r (nLR n eps x r).dW ex lo t nn hg hd hx hb out ho=Yq (nEO n eps x g b nd) (nLR n eps x r) lo (lo+t) (lo+nn) out:=by have hdW:=nLR_dW n eps x r hq hXf heps hf have hn:=nCa hb intro k;induction k with |zero=> intro ex t out ho hos hk ht hx rw[nFE2.eq_def,dite_eq_right (nO1 hk),Yq,dite_eq_right (nOz hb hk ht)] |succ k ih=> intro ex t out ho hos hk ht hx obtain⟨h1,hk',ht'⟩:=nOs hk have h2:(J0 (lo+t))=(J0 lo)+(J0 t):=nCa (nOq hb h1) have h3:lo+t>>52)&&&2047)) then nW (nElB x[(J0 lo)+(J0 t)]! g[(J0 t)]! b[(J0 t)]! (nLR n eps x r).m (nLR n eps x r).ri) else nLo n eps x g b nd (nLR n eps x r) (lo+t) t:=by rw[nEO,AD hf];simp only[f6,h2,nElOK,AC (hK _ h1),nLoN] rw[hV];simp only[nElB] split · rename_i hc;simp only[hc,↓reduceIte];refine ih ex (t+1) _ _ ?_ hk' ht' hx;rw[BT];exact hos · rename_i hc;simp only[hc,υ,↓reduceIte];have q:=nFB_v n eps x g b nd r (nLR n eps x r).dW ex hdW hx (lo+t) t;rw[<-q.1];refine ih (some (nFB n eps x g b nd r (nLR n eps x r).dW ex (lo+t) t).2) (t+1) _ _ ?_ hk' ht' (BA (by rw[q.2]));rw[BT];exact hos lemma nDR_sp(x:(Ἂ Word))(i0 n:Ἄ)(hx:(J0 i0)+(J0 n)<=(O0 x))(hb:(J0 i0)+(J0 n)<2^(32:Ἀ)):∀k (t:Ἄ)(Xr:ἀ)(hr:(J0 n)+2<=(kS Xr))(s:Ἅ)(Dl:ἆ),(J0 n)-(J0 t)=k->(J0 t)<=(J0 n)->(∀j,j<(J0 t)->Xr.data[j]! =Dense.F.dw x[(J0 i0)+j]!)-> (∀j,j<(J0 n)->(nDR x Xr i0 t n hx hb hr s Dl).a.data[j]! =Dense.F.dw x[(J0 i0)+j]!)∧(nDR x Xr i0 t n hx hb hr s Dl).a.data[(J0 n)]! =(nS1 x (i0+t) (i0+n) s Dl).1∧(nDR x Xr i0 t n hx hb hr s Dl).d=(nS1 x (i0+t) (i0+n) s Dl).2:=by have hn:=nCa hb intro k;induction k with |zero=> intro t Xr hr s Dl hk ht hX have q:(J0 t)=(J0 n):=C4 ht (V3.mp hk) rw[nDR.eq_def,dite_eq_right (nO1 hk),nS1,dite_eq_right (nOz hb hk ht)] refine⟨fun j hj=>?_,?_,rfl⟩ · rw[Dense.F.fuS _ _ _ _ _ (U1 hj ((V1 _ 2).trans hr)),AC (C8 hj)];exact hX j (by rw[q];exact hj) · rw[Dense.F.fuS _ _ _ _ _ (U1 (N6 (U4 _)) hr),AD rfl] |succ k ih=> intro t Xr hr s Dl hk ht hX obtain⟨h1,hk',ht'⟩:=nOs hk have h2:(J0 (i0+t))=(J0 i0)+(J0 t):=nCa (nOq hb h1) rw[nDR.eq_def,AT (ε.mpr h1),nS1,AT (by rw[ε,h2,hn];exact O1 h1 _)] simp only[Dense.cC,f6,Kd] refine ih _ _ _ _ _ hk' ht' (fun j hj=>?_) rw[Dense.ac (ε.mpr h1)] at hj rw[Dense.F.fuS _ _ _ _ _ (U1 hj ((l7 h1).trans ((V1 _ 2).trans hr)))];split · rename_i e;rw[<-e,h2] · exact hX j (W5 (U2 hj) (fun h=>by rename_i e;exact e h.symm)) lemma nVR_eq(x:(Ἂ Word))(Xr:ἀ)(m:Ἅ)(i0 n:Ἄ)(hr:(J0 n)<=(kS Xr))(hb:(J0 i0)+(J0 n)<2^(32:Ἀ))(hX:∀j,j<(J0 n)->Xr.data[j]! =Dense.F.dw x[(J0 i0)+j]!): ∀k (t:Ἄ)(v:Ἅ),(J0 n)-(J0 t)=k->(J0 t)<=(J0 n)->nVR Xr m t n hr v=nS2 x m (i0+t) (i0+n) v:=by have hn:=nCa hb intro k;induction k with |zero=> intro t v hk ht rw[nVR.eq_def,dite_eq_right (nO1 hk),nS2,dite_eq_right (nOz hb hk ht)] |succ k ih=> intro t v hk ht obtain⟨h1,hk',ht'⟩:=nOs hk have h2:(J0 (i0+t))=(J0 i0)+(J0 t):=nCa (nOq hb h1) rw[nVR.eq_def,AT (ε.mpr h1),nS2,AT (by rw[ε,h2,hn];exact O1 h1 _)] dsimp only;rw[Dense.F.kFU,hX _ h1,f6,h2,Kd] exact ih _ _ hk' ht' lemma nKpA(y d l q e:ℤ)(h1:y≤d)(h2:2≤l)(h3:l+d-30≤q):y+(1054-e)≤q+1082-e:=by omega lemma nKpB(l d u:ℤ)(h1:l≤64)(h2:d≤254)(h3:u≤2047):max (l+d-30) (u-1073)≤2047:=max_le (by omega) (by omega) lemma nKpC(m e:ℤ)(h:m≤2047)(h2:0≤e):m+1082-e≤3129:=by omega lemma nKp_h(Y:ἇ)(D ed L Em:Ἀ)(hY:(mJ Y)<=D)(hD:D<=254)(he:ed<255)(hL:2<=L∧L<=64)(hEm:Em<=2047): ¬((max ((L:ℤ)+D-30) ((Em:ℤ)-1073)+1082-ed).toNat.toUInt64kB x[j]!≠255)(hf:(nLR n eps x r).fast=true): ∀t,t¬((nLR n eps x r).KpkB x[j]!≠255)(heps:0gd.data[t]! =Dense.F.dw g[t]!)(hB:∀t,tbd.data[t]! =Dense.F.dw b[t]!)(hE:∀t,t(ge.data[t]!).toUInt64=nfe g[t]!)(hN:(4<=n&&n<=2048&&kB eps != 0&&kB eps != 255)=ἃ): (nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb).2=Yq (nEO n eps x g b nd) (nLR n eps x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out:=by have hz:=hC.2.2.2.1;subst hz have q1:(J0 (G0 (r*n)))=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q2:(J0 (G0 n))=n:=Conv.aa _ (C0 (N2 _ _) hb) have q3:(J0 (G0 (r*n+n)))=r*n+n:=Conv.aa _ hb have hb':(J0 (G0 (r*n)))+(J0 (G0 n))<2^(32:Ἀ):=by rw[q1,q2];exact hb have hx':(J0 (G0 (r*n)))+(J0 (G0 n))<=(O0 x):=by rw[q1,q2];exact hx have hr':(J0 (G0 n))+2<=(kS Xr):=by rw[q2];exact hr have hlo:G0 (r*n)+G0 n=G0 (r*n+n):=D6.1 (by rw[nCa hb',q1,q2,q3]) have h0:(J0 (0:Ἄ))=0:=Ϧ obtain⟨A1,A2,A3⟩:=nDR_sp x (G0 (r*n)) (G0 n) hx' hb' _ 0 Xr hr' (I0 (0:Ἀ)).toInt64.toFloat 0 rfl (by rw[h0];exact ϟ _) (fun j hj=>by rw[h0]at hj;exact absurd hj (C5 _)) have hs:=nDR_sz x (G0 (r*n)) (G0 n) hx' hb' _ 0 Xr hr' (I0 (0:Ἀ)).toInt64.toFloat 0 rfl have A4:=fun m (hh:(J0 (G0 n))<=(kS (nDR x Xr (G0 (r*n)) 0 (G0 n) hx' hb' hr' (I0 (0:Ἀ)).toInt64.toFloat 0).a))=>nVR_eq x _ m (G0 (r*n)) (G0 n) hh hb' A1 _ 0 (I0 (0:Ἀ)).toInt64.toFloat rfl (by rw[h0];exact ϟ _) rw[Xc,hlo]at A2 A3 A4 have D:(nDR x Xr (G0 (r*n)) 0 (G0 n) hx' hb' hr' (I0 (0:Ἀ)).toInt64.toFloat 0).d<255:=by rw[A3,μ];exact C0 (nS1_dl x (G0 (r*n+n)) (fun j hj=>hX j (q3▸hj)) _ (G0 (r*n)) _ 0 rfl (by rw[q1,q3];omega) (by decide)).2.1 (by decide) unfold nRow;dsimp only;split · rename_i hc0 rw[nLQk_e n eps _ _ _ rm nf ep _ L hC (C0 (N2 _ _) hb) (Thunk.mk (λ_=>NR.eI n (gM n eps x r)))] simp only[Dense.F.kFU,A2,A3,A4] rw[<-nLQ_e n eps x r hN];split · rename_i hf have K:=nFE_eq n eps x g b (nDR x Xr (G0 (r*n)) 0 (G0 n) hx' hb' hr' (I0 (0:Ἀ)).toInt64.toFloat 0).a gd bd ge nd r (G0 (r*n)) (G0 n) (by rw[hs];exact (V1 _ 2).trans hr') (by rw[q2];exact hg) (by rw[q2];exact hd) (by rw[q2];exact he) hb' hf (fun t ht=>by rw[q1];rw[q2]at ht;exact nKp n eps x r hb hX hf t ht) (fun t ht=>by rw[A1 t ht]) (fun t ht=>by rw[q2]at ht;exact hG t ht) (fun t ht=>by rw[q2]at ht;exact hB t ht) (fun t ht=>by rw[q2]at ht;exact hE t ht) hb hX heps _ none 0 out (by rw[q1,q2];exact ho) hos rfl (by rw[h0];exact ϟ _) (pZ rfl) rw[Xc,hlo]at K;exact K · rename_i hf;exact nRowS_e n eps x g b nd r _ _ out (M9.mpr hf) · rename_i hc;exact (hc D).elim lemma nRow1_eq(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hg:n<=(O0 g))(hd:n<=(O0 b)) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ))(hos:(O0 out)<2^(32:Ἀ)) (hX:∀j,jkB x[j]!≠255)(heps:0hX j (q3▸hj)) _ (G0 (r*n)) _ 0 rfl (by rw[q1,q3];omega) (by decide)).2.1 (by decide) unfold nRow1;dsimp only;split · rename_i hc0 rw[nLQk_e n eps _ _ _ rm nf ep _ L hC (C0 (N2 _ _) hb) (Thunk.mk (λ_=>NR.eI n (gM n eps x r)))] rw[<-nLQ_e n eps x r hN];split · rename_i hf have K:=nFE2_eq n eps x g b nd r (G0 (r*n)) (G0 n) (by rw[q2];exact hg) (by rw[q2];exact hd) hx' hb' hf (fun t ht=>by rw[q1];rw[q2]at ht;exact nKp n eps x r hb hX hf t ht) hb hX heps _ none 0 out (by rw[q1,q2];exact ho) hos rfl (by rw[h0];exact ϟ _) (pZ rfl) rw[Xc,hlo]at K;exact K · rename_i hf;exact nRowS_e n eps x g b nd r _ _ out (M9.mpr hf) · rename_i hc;exact (hc D).elim lemma nRow_bad(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hr:n+2<=(kS Xr))(hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ))(j:Ἀ)(j1:r*n<=j)(j2:jby rw[h0]at hj;exact absurd hj (C5 _)) rw[Xc,hlo]at A3 have G:=(nS1_ge x (G0 (r*n+n)) _ (G0 (r*n)) z0 0 rfl (by rw[q1,q3];omega)).2 j (by rw[q1];exact j1) (by rw[q3];exact j2) rw[hj]at G have D:¬(nDR x Xr (G0 (r*n)) 0 (G0 n) hx' hb' hr' z0 0).d<255:=by rw[A3,μ];exact O3.2 (AZ (by decide) G) unfold nRow;dsimp only;rw[AC D] lemma nRow1_bad(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hg:n<=(O0 g))(hd:n<=(O0 b)) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ))(j:Ἀ)(j1:r*n<=j)(j2:jsimp only[Jk,V7,Up,Ut,R7,U7]<;>ring lemma nV2{c:Prop}[Decidable c]{α:Type}(p q r:α)(hp:c→p=r)(hq:¬c→q=r):(if c then p else q)=r:=if h:c then (AD h).trans (hp h) else (AC h).trans (hq h) lemma nV3{c0 c1:Prop}[Decidable c0][Decidable c1]{α:Type}(s a r:α)(hs:s=r)(ha:c0→c1→a=r):(if c0 then (if c1 then a else s) else s)=r:= if h0:c0 then (AD h0).trans (if h1:c1 then (AD h1).trans (ha h0 h1) else (AC h1).trans hs) else (AC h0).trans hs lemma V3Lo(e n:Ἀ)(h:kF)(x g b:(Ἂ Word))(m:0kB x[i]!≠255)(F:∀j,jkB g[j]!≠255) (D:∀j,jkB b[j]!≠255): Yr (λr=>nLR n h x r) (nEO n h x g b (I0 n).toInt64.toFloat) n e 0 (Ah (e*n) 0)=layernormStable e n h x g b:=by apply Ys _ _ _ _ B;intro i G;have w:=Ϟ (by rwa[Ϗ]);have r:=ϊ i m;have z:=ι n (l7 w);rw[Ο]at z;dsimp only[nEO,nLoN] have hs:=nSv h q have hb:i/n*n+n<2^(32:Ἀ):=AO z B have hX:∀j,j< i/n*n+n->kB x[j]!≠255:=fun j hj=>H j (U1 hj z) have hj1:i/n*n<=i:=pr i n have hj2:i< i/n*n+n:=Qy m simp only[nLo,nLR_th,f6,Conv.aa _ (G.trans B:i<2^(32:Ἀ)),Conv.aa _ ((r.trans_le ((N2 n _).trans z)).trans B:i%n<2^(32:Ἀ)),gP,Qg _ w,Fin.is_lt,Qg,gN _ _ _ _ m q hb] obtain⟨v,A,-⟩:=Vn n h x (i/n) m q refine nV3 _ _ _ (nV2 _ _ _ (fun E3=>?_) (fun E3=>?_)) (fun E1 E2=>?_) · rw[<-v,<-A];generalize YU n h x (i/n)=t at*;obtain⟨u,k,y,o,p,d⟩:=t;dsimp only at* exact NE.jn _ _ _ d _ n u k o p y _ _ rfl (H i G) (F _ r) (D _ r) m ‹_› (V3L_h1 _ _ _ _ _ v) rfl · rw[<-v,<-A] · rw[nLR_el n h x (i/n) hb hX hs i hj1 hj2 _ _ (F _ r) (D _ r) E1 E2] end Norm end namespace GK open Dense.F (WcE aO bW dw pg s5uget tchP tw wcDF wcDF_spec wcGet3T wcK3eq wcK3eq_ok) open Conv (aa ey_h4 fz wlo wsp) def cF (a:Ἂ Word × Nat × Nat):ἀ × ἇ:=(wcDF a,aO a.1 0 0) @[noinline] def cS:ST.Ref Unit (Ἂ (WcE cF)):=(ST.Prim.mkRef #[] (Void.mk ())).val def cv (B : @& Ἂ Word) (i:Ἄ) (e:ἇ) (Y:ἀ):ἀ × ἇ := if h:i < B.usize then let w:=B.uget i (Dense.cD h) let x:=(w>>>23)&&&255 cv B (i+1) (if e < x then x else e) (Y.push (dw w)) else (Y,e) termination_by B.size-i.toNat decreasing_by have:=Dense.cD h; rw [Dense.ac h]; omega @[noinline] def sO (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u:ἆ) (L : @& Nat) (S:Ἅ):Word := tw false S u L k (fun t=>dw B[t*n+jU.toNat]! * dw A[i*k+t]!) (fun _=>dw oneW*dw 0x80000000) (fun _=>dotOf k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!)) @[inline] def fO (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (S:Ἅ):Word := let c:=fz S lo sp u if c < 4294967296 then c.toUInt32 else sO A B k n i jU u L S @[noinline] def f8 (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := ((((((((out.push (fO A B k n i jU u lo sp L a0)).push (fO A B k n i (jU+1) u lo sp L a1)).push (fO A B k n i (jU+2) u lo sp L a2)).push (fO A B k n i (jU+3) u lo sp L a3)).push (fO A B k n i (jU+4) u lo sp L a4)).push (fO A B k n i (jU+5) u lo sp L a5)).push (fO A B k n i (jU+6) u lo sp L a6)).push (fO A B k n i (jU+7) u lo sp L a7)) theorem hX (Bd:ἀ) (bU t nU kU:Ἄ) (w:Nat) (ht:t < kU) (hb:bU.toNat+w ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size):(bU+t*nU).toNat+w ≤ Bd.size:=by have h1:(bU+t*nU).toNat ≤ bU.toNat+(t*nU).toNat:=by rw [lJ]; exact Ay _ _ have h2:(t*nU).toNat ≤ t.toNat*nU.toNat:=by rw [BO]; exact Ay _ _ have h3:=ε.mp ht have h4:t.toNat*nU.toNat+nU.toNat ≤ kU.toNat*nU.toNat:=by have:=ι nU.toNat (show t.toNat+1 ≤ kU.toNat by omega) rwa [Ϡ,n4] at this omega theorem hA (Ad:ἀ) (aU t kU:Ἄ) (ht:t < kU) (ha:aU.toNat+kU.toNat ≤ Ad.size) : (aU+t).toNat < Ad.size:=by have h1:(aU+t).toNat ≤ aU.toNat+t.toNat:=by rw [lJ]; exact Ay _ _ have:=ε.mp ht omega def m8 (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (k n i : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+8 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (t:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := if h:t < kU then let a:=Ad.uget (aU+t) (hA Ad aU t kU h ha) let xb:=bU+t*nU have hJ:xb.toNat+8 ≤ Bd.size:=hX Bd bU t nU kU 8 h hb hB m8 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB (t+1) (a0+Bd.uget (xb+0) (ey_h4 xb hJ)*a) (a1+Bd.uget (xb+1) (ey_h4 xb hJ)*a) (a2+Bd.uget (xb+2) (ey_h4 xb hJ)*a) (a3+Bd.uget (xb+3) (ey_h4 xb hJ)*a) (a4+Bd.uget (xb+4) (ey_h4 xb hJ)*a) (a5+Bd.uget (xb+5) (ey_h4 xb hJ)*a) (a6+Bd.uget (xb+6) (ey_h4 xb hJ)*a) (a7+Bd.uget (xb+7) (ey_h4 xb hJ)*a) out else f8 A B k n i bU u lo sp L a0 a1 a2 a3 a4 a5 a6 a7 out termination_by kU.toNat-t.toNat decreasing_by exact U5 (ε.mp h) (B5 (U4 _) (Dense.ac h).symm) def m1 (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (k n i : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+1 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (t:Ἄ) (a0:Ἅ) (out:Ἂ Word):Ἂ Word := if h:t < kU then let a:=Ad.uget (aU+t) (hA Ad aU t kU h ha) let xb:=bU+t*nU have hJ:xb.toNat+1 ≤ Bd.size:=hX Bd bU t nU kU 1 h hb hB m1 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB (t+1) (a0+Bd.uget xb (by omega)*a) out else out.push (fO A B k n i bU u lo sp L a0) termination_by kU.toNat-t.toNat decreasing_by exact U5 (ε.mp h) (B5 (U4 _) (Dense.ac h).symm) theorem rA (m k n i:Nat) (Ad:ἀ) (kU:Ἄ) (hk:kU.toNat=k) (hA:m*k ≤ Ad.size) (hs:m*k+n < 2^31) (hi:i < m):(i*k).toUSize.toNat+kU.toNat ≤ Ad.size:=by have h1:i*k+k ≤ m*k:=by have:=ι k (show i+1 ≤ m by omega); rwa [Ϡ,n4] at this rw [aa (i*k) (by omega),hk]; omega theorem rB (j n w:Nat) (nU:Ἄ) (hn:nU.toNat=n) (h:j+w ≤ n) (hs:n < 2^31) : j.toUSize.toNat+w ≤ nU.toNat:=by rw [aa j (by omega),hn]; exact h def rw (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (m k n : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (z:Ἅ) (i:Nat) (hi:i < m) (j:Nat) (out:Ἂ Word):Ἂ Word := if h8:j+8 ≤ n then rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi (j+8) (m8 A B Ad Bd k n i u lo sp L kU nU (i*k).toUSize j.toUSize (rA m k n i Ad kU hk hA hs hi) (rB j n 8 nU hn h8 (by omega)) (by rw [hk,hn]; exact hB) 0 z z z z z z z z out) else if h1:j < n then rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi (j+1) (m1 A B Ad Bd k n i u lo sp L kU nU (i*k).toUSize j.toUSize (rA m k n i Ad kU hk hA hs hi) (rB j n 1 nU hn h1 (by omega)) (by rw [hk,hn]; exact hB) 0 z out) else out termination_by n-j def rs (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (m k n : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (z:Ἅ) (i:Nat) (out:Ἂ Word):Ἂ Word := if hi:i < m then rs A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z (i+1) (rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi 0 out) else out termination_by m-i theorem uLt (B:Ἂ Word) (i:Ἄ) (hs:B.size < 2^31) (h:i.toNat < B.size):i < B.usize:=by rw [ε]; simp only [Qc]; rw [aa B.size (by omega)]; exact h theorem mx32 (e x:ἇ):(if e < x then x else e).toNat=max e.toNat x.toNat:=by split <;> rename_i h <;> rw [Ι] at h <;> omega theorem cv_spec (B:Ἂ Word) (hs:B.size < 2^31) : ∀ c (i:Ἄ) (e:ἇ) (Y:ἀ), B.size-i.toNat=c → i.toNat ≤ B.size → Y.size=i.toNat → (∀ q < Y.size,Y.data[q]! = dw B[q]!) → (∀ q < i.toNat,(expOf B[q]!).toNat ≤ e.toNat) → (cv B i e Y).1.size=B.size∧(∀ q < B.size,(cv B i e Y).1.data[q]! = dw B[q]!) ∧ (∀ q < B.size,(expOf B[q]!).toNat ≤ (cv B i e Y).2.toNat):=by intro c; induction c with | zero => intro i e Y hc hle hY hd he rw [cv,dite_eq_right (fun h=>by have:=Dense.cD h; omega)]; dsimp only exact ⟨by omega,fun q hq=>hd q (by omega),fun q hq=>he q (by omega)⟩ | succ c ih => intro i e Y hc hle hY hd he have hlt:i.toNat < B.size:=by omega have h:=uLt B i hs hlt rw [cv,AT h]; dsimp only have hi1:(i+1).toNat=i.toNat+1:=Dense.ac h have hw:B.uget i (Dense.cD h)=B[i.toNat]! := s5uget B i (Dense.cD h) rw [hw] refine ih (i+1) _ _ (by omega) (by omega) (by rw [bW,hY,hi1]) (fun q hq => ?_) (fun q hq => ?_) · rw [bW] at hq; rw [pg _ _ _ hq]; split · exact hd q ‹_› · rw [show q=i.toNat by omega] · rw [mx32]; rw [hi1] at hq by_cases hq':q < i.toNat · exact (he q hq').trans (le_max_left _ _) · rw [show q=i.toNat by omega]; exact le_max_right _ _ theorem cv0 (B:Ἂ Word) (hs:B.size < 2^31) : let r:=cv B 0 0 (kJ B.size) r.1.size=B.size∧(∀ q < B.size,r.1.data[q]! = dw B[q]!)∧(∀ q < B.size,(expOf B[q]!).toNat ≤ r.2.toNat) := cv_spec B hs _ 0 0 _ rfl (by simp) (by simp [kJ,kS]) (fun q hq=>by simp [kJ,kS] at hq) (fun q hq=>by simp at hq) def gK2 (m k n:Nat) (A B:Ἂ Word) (c : {v // v=cF (A,m,k)}) (r:ἀ × ἇ) (hr:r=cv B 0 0 (kJ B.size)):Ἂ Word := let L:=Aq (k+1)+1 let P:=48+c.1.2.toNat+r.2.toNat if hc:c.1.2 < 255∧r.2 < 255∧P+L ≤ 425∧L ≤ 27∧A.size=m*k∧B.size=k*n∧0 < k∧m*k+n < 2^31∧k*n < 2^31∧k < 2^31 then let hh:=P+2*L-54 rs A B c.1.1 r.1 m k n hh.toUInt64 (wlo hh) (wsp hh) L k.toUSize n.toUSize (aa k (by omega)) (aa n (by omega)) (by rw [c.2]; exact (wcDF_spec A m k).1.ge) (by rw [hr]; exact ((cv0 B (by omega)).1.trans hc.2.2.2.2.2.1).ge) (by omega) (dw oneW*dw 0x80000000) 0 (lQ (m*n)) else gemmSpec 1 m k n A B def gK (m k n:Nat) (A B:Ἂ Word):Ἂ Word := gK2 m k n A B (wcGet3T wcK3eq (fun a b=>wcK3eq_ok a b) cS 32 (A,m,k) (fun k=>k.1) (fun v=>tchP v.1) 3) (cv B 0 0 (kJ B.size)) rfl end GK namespace GK open Dense.F (kMm kSm ug) theorem ugB (Bd:ἀ) (b t nU c:Ἄ) (h:(b+t*nU+c).toNat < Bd.size) (hsz:b.toNat+t.toNat*nU.toNat+c.toNat < 2^31) : Bd.uget (b+t*nU+c) h=Bd.data[b.toNat+t.toNat*nU.toNat+c.toNat]! := by rw [ug]; congr 1 have e1:(t*nU).toNat=t.toNat*nU.toNat:=kMm _ _ (by omega) have e2:(b+t*nU).toNat=b.toNat+t.toNat*nU.toNat:=by rw [kSm _ _ (by rw [e1]; omega),e1] rw [kSm _ _ (by rw [e2]; omega),e2] theorem ugA (Ad:ἀ) (a t:Ἄ) (h:(a+t).toNat < Ad.size) (hsz:a.toNat+t.toNat < 2^31) : Ad.uget (a+t) h=Ad.data[a.toNat+t.toNat]! := by rw [ug]; congr 1; exact kSm _ _ hsz end GK namespace GK open Dense.F (ao aoe aos kMm kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7 ug) theorem bnd (t k n j w:Nat) (ht:t < k) (hb:j+w ≤ n):j+t*n+w ≤ k*n:=by have:=ι n (show t+1 ≤ k by omega) rw [Ϡ,n4] at this; omega theorem m8_eq (A B:Ἂ Word) (Ad Bd:ἀ) (k n i j:Nat) (u lo sp:ἆ) (L:Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+8 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (hk:kU.toNat=k) (hn:nU.toNat=n) (haU:aU.toNat=i*k) (hbU:bU.toNat=j) (hs:Ad.size < 2^31∧Bd.size < 2^31) : ∀ c (t:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word),k-t.toNat=c → t.toNat ≤ k → m8 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB t a0 a1 a2 a3 a4 a5 a6 a7 out = f8 A B k n i bU u lo sp L (ao (fun s=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k t.toNat a0) (ao (fun s=>Bd.data[j+s*n+1]! * Ad.data[i*k+s]!) k t.toNat a1) (ao (fun s=>Bd.data[j+s*n+2]! * Ad.data[i*k+s]!) k t.toNat a2) (ao (fun s=>Bd.data[j+s*n+3]! * Ad.data[i*k+s]!) k t.toNat a3) (ao (fun s=>Bd.data[j+s*n+4]! * Ad.data[i*k+s]!) k t.toNat a4) (ao (fun s=>Bd.data[j+s*n+5]! * Ad.data[i*k+s]!) k t.toNat a5) (ao (fun s=>Bd.data[j+s*n+6]! * Ad.data[i*k+s]!) k t.toNat a6) (ao (fun s=>Bd.data[j+s*n+7]! * Ad.data[i*k+s]!) k t.toNat a7) out:=by intro c; induction c with | zero => intro t a0 a1 a2 a3 a4 a5 a6 a7 out hc ht have hkt:k ≤ t.toNat:=by omega rw [m8,dite_eq_right (fun h=>by have:=ε.mp h; omega)] simp only [aoe _ _ _ _ hkt] | succ c ih => intro t a0 a1 a2 a3 a4 a5 a6 a7 out hc ht have htk:t.toNat < k:=by omega have h:t < kU:=ε.mpr (by omega) have ht1:(t+1).toNat=t.toNat+1:=Dense.ac h have hbd:=bnd t.toNat k n j 8 htk (by omega) have hB':k*n ≤ Bd.size:=by rw [← hk, ← hn]; exact hB rw [m8,AT h]; dsimp only rw [ugA Ad aU t _ (by omega),ugB Bd bU t nU 0 _ (by rw [kc0,hn]; omega),ugB Bd bU t nU 1 _ (by rw [kc1,hn]; omega), ugB Bd bU t nU 2 _ (by rw [kc2,hn]; omega),ugB Bd bU t nU 3 _ (by rw [kc3,hn]; omega), ugB Bd bU t nU 4 _ (by rw [kc4,hn]; omega),ugB Bd bU t nU 5 _ (by rw [kc5,hn]; omega), ugB Bd bU t nU 6 _ (by rw [kc6,hn]; omega),ugB Bd bU t nU 7 _ (by rw [kc7,hn]; omega)] rw [ih (t+1) _ _ _ _ _ _ _ _ out (by omega) (by omega)] simp only [ht1,aos _ _ _ _ htk,haU,hbU,hn,kc0,kc1,kc2,kc3,kc4, kc5,kc6,kc7] theorem m1_eq (A B:Ἂ Word) (Ad Bd:ἀ) (k n i j:Nat) (u lo sp:ἆ) (L:Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+1 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (hk:kU.toNat=k) (hn:nU.toNat=n) (haU:aU.toNat=i*k) (hbU:bU.toNat=j) (hs:Ad.size < 2^31∧Bd.size < 2^31) : ∀ c (t:Ἄ) (a0:Ἅ) (out:Ἂ Word),k-t.toNat=c → t.toNat ≤ k → m1 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB t a0 out = out.push (fO A B k n i bU u lo sp L (ao (fun s=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k t.toNat a0)):=by intro c; induction c with | zero => intro t a0 out hc ht have hkt:k ≤ t.toNat:=by omega rw [m1,dite_eq_right (fun h=>by have:=ε.mp h; omega)] simp only [aoe _ _ _ _ hkt] | succ c ih => intro t a0 out hc ht have htk:t.toNat < k:=by omega have h:t < kU:=ε.mpr (by omega) have ht1:(t+1).toNat=t.toNat+1:=Dense.ac h have hbd:=bnd t.toNat k n j 1 htk (by omega) have hB':k*n ≤ Bd.size:=by rw [← hk, ← hn]; exact hB rw [m1,AT h]; dsimp only have e0:(bU+t*nU)=(bU+t*nU+0):=by simp rw [ugA Ad aU t _ (by omega)] rw [show Bd.uget (bU+t*nU) _=Bd.data[bU.toNat+t.toNat*nU.toNat+(0:Ἄ).toNat]! from by rw [ug]; congr 1; rw [kc0,ϑ] have e1:(t*nU).toNat=t.toNat*nU.toNat:=kMm _ _ (by rw [hn]; omega) rw [kSm _ _ (by rw [e1,hn]; omega),e1]] rw [ih (t+1) _ out (by omega) (by omega)] simp only [ht1,aos _ _ _ _ htk,haU,hbU,hn,kc0] end GK namespace GK open Core (aG aK af tm) open Dense.F (ao bC dJ dL dM dw dz fv jE rv tf tw) open Conv (fz_ak wlo wok wsp) theorem bnd2 (k P L:Nat) (hN:k+2 ≤ 2^L) : (k:ℝ)*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=by have h1:(k:ℝ) ≤ (2:ℝ)^L:=by exact_mod_cast (show k ≤ 2^L by omega) have h2:(0:ℝ) ≤ (2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ):=by positivity calc (k:ℝ)*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) ≤ (2:ℝ)^L*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)):=AE h1 h2 _=(2:ℝ)^(((L+(P+L):ℕ):ℤ)+(-54)):=by rw [← Ap, ← AF, ← AA, ← AK (AL)] _ ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=AG one_le_two (by omega) theorem jW (g:Ἆ) (k:Nat) (d e:Nat → Word) (p:Nat → Ἅ) (h:Unit → Ἅ) (u:ἆ) (P L:Nat) (B:Unit → Word) (S:Ἅ) (K:∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ)) (q:fv (h ())∧rv (h ())=(tm (d k) (e k):ℝ)) (jg:aG (k+1) d e) (E:∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P) (hN:k+2 ≤ 2^L) (hD:L ≤ 27) (hJ:P+L ≤ 425) (hu:u=(P+2*L-54).toUInt64) (G:B ()=act g (dotOf (k+1) d e)) (hS:S=ao p k 0 (h ())) : tw g S u L k p h B=act g (dotOf (k+1) d e):=by have hx:u.toNat=P+2*L-54:=by rw [hu]; exact Α (by have:n0=2^64:=rfl; omega) have hd : ∀ m t a,k-t=m → ao p k t a=bC (fun _=>false) p k t a:=dM p k have L1:=dL (fun _=>false) p (fun s=>tm (d s) (e s)) (tm (d k) (e k)) P L k (fun t ht=>K t ht) (fun t _ hf=>by simp at hf) (fun t ht=>E t ht.le) (E k AP) hN hD (by omega) k 0 (h ()) (by omega) (ϟ _) q.1 (by rw [q.2]; simp) exact jE g k d e p h u P L B K q jg E hN hD hJ hx G S (by rw [hS,hd k 0 _ (by omega)]; exact L1.1) (by rw [hS,hd k 0 _ (by omega),aK,hx]; refine AZ (le_of_eq ?_) (L1.2.trans (bnd2 k P L hN)); congr 1; push_cast [af]; ring) theorem fO_eq (A B:Ἂ Word) (k n i:Nat) (jU:Ἄ) (u lo sp:ἆ) (L P:Nat) (S:Ἅ) (hk:0 < k) (hfin : ∀ t < k,expOf A[i*k+t]! ≠ 255∧expOf B[t*n+jU.toNat]! ≠ 255) (hE : ∀ t < k, |(tm B[t*n+jU.toNat]! A[i*k+t]! : ℝ)| ≤ 2^P) (hN:k+2 ≤ 2^L) (hD:L ≤ 27) (hJ:P+L ≤ 425) (hu:u=(P+2*L-54).toUInt64) (hlo:lo=wlo (P+2*L-54)) (hsp:sp=wsp (P+2*L-54)) (hS:S=ao (fun s=>dw B[s*n+jU.toNat]! * dw A[i*k+s]!) k 0 (dw oneW*dw 0x80000000)) : fO A B k n i jU u lo sp L S=dotOf k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!):=by let d:Nat → Word:=fun t=>if t < k then B[t*n+jU.toNat]! else oneW let e:Nat → Word:=fun t=>if t < k then A[i*k+t]! else 0x80000000 let p:Nat → Ἅ:=fun t=>dw B[t*n+jU.toNat]! * dw A[i*k+t]! let h:Unit → Ἅ:=fun _=>dw oneW*dw 0x80000000 let Bf:Unit → Word:=fun _=>dotOf k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!) have K : ∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ):=by intro s hs; simp only [p,d,e,AD hs]; exact dJ _ _ (hfin s hs).2 (hfin s hs).1 have q:fv (h ())∧rv (h ())=(tm (d k) (e k):ℝ):=by simp only [h,d,e,AX,ἂ]; exact dJ oneW 0x80000000 (by decide) (by decide) have jg:aG (k+1) d e:=by intro s hs; by_cases h':s < k · simp only [d,e,AD h']; exact ⟨(hfin s h').2,(hfin s h').1⟩ · simp only [d,e,AC h']; exact ⟨by decide,by decide⟩ have tz:tm oneW 0x80000000=0:=by have s0:M8 0x80000000=0:=by decide simp only [tm,s0,mul_zero,zero_mul] have E : ∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P:=by intro s hs; by_cases h':s < k · simp only [d,e,AD h']; exact hE s h' · simp only [d,e,AC h',tz]; simp only [lH,A5]; positivity have G:Bf ()=act false (dotOf (k+1) d e):=by have g0:aG k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!):=fun t ht=>hfin t ht have:=dz k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!) hk g0 simp only [act,υ,ἂ]; exact this.symm have T:=jW false k d e p h u P L Bf S K q jg E hN hD hJ hu G hS have T2:tw false S u L k p h Bf=dotOf k (fun t=>A[i*k+t]!) (fun t=>B[t*n+jU.toNat]!):=by rw [T]; simp only [act,υ,ἂ]; exact (G.trans (by simp only [act,υ,ἂ])).symm unfold fO rw [fz_ak S lo sp u (by rw [hu,hlo,hsp]; exact wok _ (by omega))] dsimp only; split · rename_i hc; rw [← T2]; unfold tw tf; simp only [Gu,υ,ἂ] rw [AD hc]; simp only [act,υ,ἂ] · exact T2 end GK namespace GK open Core (tm) open Dense.F (ao aoe aos dw) open Conv (wlo wsp) theorem ao_congr (p p':Nat → Ἅ) (n:Nat) : ∀ c t a,n-t=c → (∀ s,t ≤ s → s < n → p s=p' s) → ao p n t a=ao p' n t a:=by intro c; induction c with | zero=>intro t a hc _; rw [aoe _ _ _ _ (by omega),aoe _ _ _ _ (by omega)] | succ c ih => intro t a hc hp rw [aos p n t a (by omega),aos p' n t a (by omega),hp t AP (by omega)] exact ih (t+1) _ (by omega) (fun s h1 h2=>hp s (by omega) h2) theorem pushF (out:Ἂ Word) (F:Nat → Word) (s:Nat) (hs:out.size=s) (hp : ∀ q < s,out[q]! = F q) (v:Word) (hv:v=F s):(out.push v).size=s+1 ∧ ∀ q < s+1,(out.push v)[q]! = F q:=by refine ⟨by simp [hs],fun q hq => ?_⟩ by_cases h:q < s · rw [AB (out.push v) q (by simp; omega),nU (by omega), ← AB out q (by omega)] exact hp q h · have hq:q=out.size:=by omega rw [AB (out.push v) q (by simp; omega)]; simp only [hq,nV]; rw [hv,hs] abbrev R (A B:Ἂ Word) (k n i j:Nat):Word:=dotOf k (fun t=>A[i*k+t]!) (fun t=>B[t*n+j]!) structure Cx (A B:Ἂ Word) (Ad Bd:ἀ) (m k n:Nat) (u lo sp:ἆ) (L P:Nat) (z:Ἅ):Prop where hAd : ∀ q < m*k,Ad.data[q]! = dw A[q]! hBd : ∀ q < k*n,Bd.data[q]! = dw B[q]! hz:z=dw oneW*dw 0x80000000 hk0:0 < k hfin : ∀ i < m, ∀ j < n, ∀ t < k,expOf A[i*k+t]! ≠ 255∧expOf B[t*n+j]! ≠ 255 hE : ∀ i < m, ∀ j < n, ∀ t < k, |(tm B[t*n+j]! A[i*k+t]! : ℝ)| ≤ 2^P hN:k+2 ≤ 2^L hD:L ≤ 27 hJ:P+L ≤ 425 hu:u=(P+2*L-54).toUInt64 hlo:lo=wlo (P+2*L-54) hsp:sp=wsp (P+2*L-54) theorem lane {A B:Ἂ Word} {Ad Bd:ἀ} {m k n:Nat} {u lo sp:ἆ} {L P:Nat} {z:Ἅ} (C:Cx A B Ad Bd m k n u lo sp L P z) (i j l:Nat) (jU':Ἄ) (hi:i < m) (hjl:j+l < n) (hj':jU'.toNat=j+l) : fO A B k n i jU' u lo sp L (ao (fun s=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z)=R A B k n i (j+l):=by have e:=fO_eq A B k n i jU' u lo sp L P (ao (fun s=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z) C.hk0 (fun t ht=>by rw [hj']; exact C.hfin i hi (j+l) hjl t ht) (fun t ht=>by rw [hj']; exact C.hE i hi (j+l) hjl t ht) C.hN C.hD C.hJ C.hu C.hlo C.hsp (by rw [C.hz]; refine ao_congr _ _ k k 0 _ (by omega) (fun s _ hs => ?_) have h1:s*n+(j+l) < k*n:=by have:=ι n (show s+1 ≤ k by omega); rw [Ϡ,n4] at this; omega have h2:i*k+s < m*k:=by have:=ι k (show i+1 ≤ m by omega); rw [Ϡ,n4] at this; omega rw [show j+s*n+l=s*n+(j+l) by ring,C.hBd _ h1,C.hAd _ h2,hj']) rw [e,hj'] end GK namespace GK open Dense.F (ao kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7) open Conv (aa) theorem dm (i n r:Nat) (hr:r < n):(i*n+r)/n=i∧(i*n+r)%n=r:=by constructor · rw [Τ,Ρ _ _ (by omega),ώ hr,Κ] · rw [Τ,Μ,γ hr] theorem uj (j l:Nat) (lU:Ἄ) (hl:lU.toNat=l) (h:j+l < 2^31):(j.toUSize+lU).toNat=j+l:=by rw [kSm _ _ (by rw [aa j (by omega),hl]; omega),aa j (by omega),hl] theorem push4 (out:Ἂ Word) (F:Nat → Word) (s:Nat) (hs:out.size=s) (hp : ∀ q < s,out[q]! = F q) (v0 v1 v2 v3:Word) (h0:v0=F s) (h1:v1=F (s+1)) (h2:v2=F (s+2)) (h3:v3=F (s+3)) : ((((out.push v0).push v1).push v2).push v3).size=s+4 ∧ ∀ q < s+4,((((out.push v0).push v1).push v2).push v3)[q]! = F q:=by have p0:=pushF out F s hs hp v0 h0 have p1:=pushF _ F (s+1) p0.1 p0.2 v1 h1 have p2:=pushF _ F (s+1+1) p1.1 p1.2 v2 h2 have p3:=pushF _ F (s+1+1+1) p2.1 p2.2 v3 h3 exact ⟨p3.1,fun q hq=>p3.2 q (by omega)⟩ theorem push8 (out:Ἂ Word) (F:Nat → Word) (s:Nat) (hs:out.size=s) (hp : ∀ q < s,out[q]! = F q) (v0 v1 v2 v3 v4 v5 v6 v7:Word) (h0:v0=F s) (h1:v1=F (s+1)) (h2:v2=F (s+2)) (h3:v3=F (s+3)) (h4:v4=F (s+4)) (h5:v5=F (s+5)) (h6:v6=F (s+6)) (h7:v7=F (s+7)) : ((((((((out.push v0).push v1).push v2).push v3).push v4).push v5).push v6).push v7).size=s+8 ∧ ∀ q < s+8,((((((((out.push v0).push v1).push v2).push v3).push v4).push v5).push v6).push v7)[q]! = F q:=by have a:=push4 out F s hs hp v0 v1 v2 v3 h0 h1 h2 h3 have b:=push4 _ F (s+4) a.1 a.2 v4 v5 v6 v7 h4 (by rw [h5]) (by rw [h6]) (by rw [h7]) exact ⟨b.1,fun q hq=>b.2 q (by omega)⟩ theorem rw_spec {A B:Ἂ Word} {Ad Bd:ἀ} {m k n:Nat} {u lo sp:ἆ} {L P:Nat} {z:Ἅ} (C:Cx A B Ad Bd m k n u lo sp L P z) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (hAs:Ad.size < 2^31) (hBs:Bd.size < 2^31) (i:Nat) (hi:i < m) : ∀ c j (out:Ἂ Word),n-j=c → j ≤ n → out.size=i*n+j → (∀ q < out.size,out[q]! = R A B k n (q/n) (q%n)) → (rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi j out).size=(i+1)*n ∧ ∀ q < (i+1)*n,(rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi j out)[q]! = R A B k n (q/n) (q%n):=by intro c; induction c using Z5 with | _ c ih => intro j out hc hj hsz hp have haU:((i*k).toUSize).toNat=i*k:=aa (i*k) (by have:=ι k (show i+1 ≤ m by omega); rw [Ϡ,n4] at this; omega) have hF : ∀ l,j+l < n → R A B k n i (j+l)=R A B k n ((i*n+j+l)/n) ((i*n+j+l)%n):=by intro l hl; have e:=dm i n (j+l) hl; rw [show i*n+j+l=i*n+(j+l) by ring,e.1,e.2] have L8 : ∀ l (lU:Ἄ),lU.toNat=l → j+l < n → fO A B k n i (j.toUSize+lU) u lo sp L (ao (fun s=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z) = R A B k n ((i*n+j+l)/n) ((i*n+j+l)%n):=by intro l lU hl hjl; rw [← hF l hjl]; exact lane C i j l _ hi hjl (uj j l lU hl (by omega)) have L0:j < n → fO A B k n i j.toUSize u lo sp L (ao (fun s=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k 0 z) = R A B k n ((i*n+j+0)/n) ((i*n+j+0)%n):=by intro hjl; rw [← hF 0 (by omega)]; exact lane C i j 0 _ hi (by omega) (by rw [aa j (by omega)]; rfl) rw [rw]; split · rename_i h8 rw [m8_eq A B Ad Bd k n i j u lo sp L kU nU (i*k).toUSize j.toUSize _ _ _ hk hn haU (aa j (by omega)) ⟨hAs,hBs⟩ k 0 z z z z z z z z out (by simp) (by simp)] unfold f8 simp only [kc0] have P8:=push8 out (fun q=>R A B k n (q/n) (q%n)) (i*n+j) hsz (fun q hq=>hp q (by rw [hsz]; exact hq)) _ _ _ _ _ _ _ _ (L0 (by omega)) (L8 1 1 kc1 (by omega)) (L8 2 2 kc2 (by omega)) (L8 3 3 kc3 (by omega)) (L8 4 4 kc4 (by omega)) (L8 5 5 kc5 (by omega)) (L8 6 6 kc6 (by omega)) (L8 7 7 kc7 (by omega)) exact ih (c-8) (by omega) (j+8) _ (by omega) h8 (by rw [P8.1]; ring) (fun q hq=>P8.2 q (by rw [P8.1] at hq; omega)) · rename_i h8; split · rename_i h1 rw [m1_eq A B Ad Bd k n i j u lo sp L kU nU (i*k).toUSize j.toUSize _ _ _ hk hn haU (aa j (by omega)) ⟨hAs,hBs⟩ k 0 z out (by simp) (by simp)] simp only [kc0] have P1:=pushF out (fun q=>R A B k n (q/n) (q%n)) (i*n+j) hsz (fun q hq=>hp q (by rw [hsz]; exact hq)) _ (L0 h1) exact ih (c-1) (by omega) (j+1) _ (by omega) h1 (by rw [P1.1]; ring) (fun q hq=>P1.2 q (by rw [P1.1] at hq; omega)) · rename_i h1 have:j=n:=by omega subst this exact ⟨by rw [hsz]; ring,fun q hq=>hp q (by rw [hsz]; rw [Ϡ,n4] at hq; exact hq)⟩ end GK namespace GK open Dense.F (aO bd dh dw wcDF wcDF_spec) open Conv (aa wlo wsp) theorem rs_spec {A B:Ἂ Word} {Ad Bd:ἀ} {m k n:Nat} {u lo sp:ἆ} {L P:Nat} {z:Ἅ} (C:Cx A B Ad Bd m k n u lo sp L P z) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (hAs:Ad.size < 2^31) (hBs:Bd.size < 2^31) : ∀ c i (out:Ἂ Word),m-i=c → i ≤ m → out.size=i*n → (∀ q < out.size,out[q]! = R A B k n (q/n) (q%n)) → (rs A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i out).size=m*n ∧ ∀ q < m*n,(rs A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i out)[q]! = R A B k n (q/n) (q%n):=by intro c; induction c with | zero => intro i out hc hi hsz hp have:i=m:=by omega subst this rw [rs,dite_eq_right (N4 _)] exact ⟨hsz,fun q hq=>hp q (by omega)⟩ | succ c ih => intro i out hc hi hsz hp have hi':i < m:=by omega rw [rs,AT hi'] have W:=rw_spec C kU nU hk hn hA hB hs hAs hBs i hi' (n-0) 0 out rfl (ϟ _) (by rw [hsz]; ring) hp exact ih (i+1) _ (by omega) (by omega) W.1 (fun q hq=>W.2 q (by rw [W.1] at hq; exact hq)) theorem gK2_eq (m k n:Nat) (A B:Ἂ Word) (c : {v // v=cF (A,m,k)}) (r:ἀ × ἇ) (hr:r=cv B 0 0 (kJ B.size)):gK2 m k n A B c r hr=gemmSpec 1 m k n A B:=by unfold gK2; dsimp only; split · rename_i hc obtain ⟨heA,heB,hPL,hL27,hAs,hBs,hk0,hs1,hs2,hk31⟩:=hc have hcv:=cv0 B (by omega) rw [← hr] at hcv have hc1:c.1.1=wcDF (A,m,k):=by rw [c.2]; rfl have hc2:c.1.2=aO A 0 0:=by rw [c.2]; rfl have hAd:=wcDF_spec A m k rw [← hc1] at hAd have hAk:A.size < 2^32:=by omega have bA:=fun q=>bd A (by have:=ς; omega) (by rw [← hc2]; exact heA) q have hN:k+2 ≤ 2^(Aq (k+1)+1):=ϙ let P:=48+c.1.2.toNat+r.2.toNat let L:=Aq (k+1)+1 have C:Cx A B c.1.1 r.1 m k n (P+2*L-54).toUInt64 (wlo (P+2*L-54)) (wsp (P+2*L-54)) L P (dw oneW*dw 0x80000000) := { hAd:=fun q hq=>hAd.2 q hq hBd:=fun q hq=>hcv.2.1 q (by omega) hz:=rfl hk0:=hk0 hfin:=fun i hi j hj t ht=>by have h1:t*n+j < k*n:=by have:=ι n (show t+1 ≤ k by omega); rw [Ϡ,n4] at this; omega refine ⟨(bA _).1,fun e => ?_⟩ have:=hcv.2.2 (t*n+j) (by omega); rw [e] at this have:=Ι.mp heB; simp at *; omega hE:=fun i hi j hj t ht=>by have h1:t*n+j < k*n:=by have:=ι n (show t+1 ≤ k by omega); rw [Ϡ,n4] at this; omega have gB:idxOf B[t*n+j]! ≤ r.2.toNat:=by rw [Dense.aT]; have:=hcv.2.2 (t*n+j) (by omega); omega have gA:idxOf A[i*k+t]! ≤ c.1.2.toNat:=by have:=(bA (i*k+t)).2; rw [hc2]; omega have:=dh B[t*n+j]! A[i*k+t]! _ _ gB gA refine this.trans (le_of_eq ?_); congr 1; omega hN:=hN hD:=by omega hJ:=by omega hu:=rfl hlo:=rfl hsp:=rfl } have R0:=rs_spec C k.toUSize n.toUSize (aa k (by omega)) (aa n (by omega)) (by rw [hAd.1]) (by rw [hcv.1]; omega) (by omega) (by rw [hAd.1]; omega) (by rw [hcv.1]; omega) (m-0) 0 (lQ (m*n)) rfl (ϟ _) (by simp) (by simp) apply mi · rw [R0.1]; simp [gemmSpec,gemmWith] · intro q h1 h2 have h1':q < m*n:=by rw [R0.1] at h1; exact h1 rw [← AB _ q h1, ← AB _ q h2,R0.2 q h1'] have hi:q/n < m:=Ϟ (by rw [Ϗ]; exact h1') have e1:q/(m*n)=0:=ώ h1' have e2:q/n%m=q/n:=γ hi have gs:(gemmSpec 1 m k n A B).size=1*(m*n):=by simp [gemmSpec,gemmWith] rw [AB _ q (by rw [gs]; omega)] simp only [gemmSpec,gemmWith,Λ,R] simp only [e1,e2,ϳ,Κ] · rfl theorem gK_eq (m k n:Nat) (A B:Ἂ Word):gK m k n A B=gemmSpec 1 m k n A B:=gK2_eq _ _ _ _ _ _ _ _ end GK def gC(batch m k n:Nat)(A B:Ἂ Word):Ἂ Word:= if batch==1 then GK.gK m k n A B else gemmSpec batch m k n A B theorem gCv:gC=gemmSpec:=by funext batch m k n A B unfold gC split · rename_i h have hb:batch=1:=by simpa using h subst hb; exact GK.gK_eq m k n A B · rfl @[inline]def cvOk(s:D5):Ἆ:= s.strideH==s.strideW&&s.padT==s.padL&&s.padT==s.padB&&s.padT==s.padR&&s.dilH==1&&s.dilW==1&&s.groups==1&&0by simp[z] at h1) have e3:s.depthwise.taps=s.kh*s.kw:=by simp only[L9,B7,F5,Wj hc,n4] have e4:s.depthwise.opg=1:=by simp only[Qa,F5,Wj hc] have e5:s.depthwise.cpg=1:=by simp only[B7,F5,Wj hc] simp only[Λ,e3,e4,W6] rw[e1,e2] generalize q/((cvO s).ho*(cvO s).wo)=o congr 2 funext t simp only[cvO] by_cases ht:tby simp[z]at h1) have hy:q/(s.w/s.kh)%(s.h/s.kh)by simp[z]at h1) have hy:q/(s.w/s.kh)%(s.h/s.kh)true | n+1=>zt Xd b kh 0&&zw Xd hU kh (b+hU) n @[noinline] def sO (X W b : @& Ἂ Word) (relu:Ἆ) (kh k h bo o : @& Nat) (yU:Ἄ) (u:ἆ) (L : @& Nat) (S:Ἅ):Word := tw relu S u L k (fun t=>dw X[bo+t/kh*h+t%kh+yU.toNat]! * dw W[o*k+t]!) (fun _=>dw oneW*dw b[o]!) (fun _=>act relu (dotOf (k+1) (fun t=>if t < k then X[bo+t/kh*h+t%kh+yU.toNat]! else oneW) (fun t=>if t < k then W[o*k+t]! else b[o]!))) @[inline] def fZ (X W b : @& Ἂ Word) (Xd : @& ἀ) (relu:Ἆ) (kh k h bo o cp : @& Nat) (yU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (S:Ἅ):Word := let c:=fz S lo sp u if c < 4294967296 then act relu c.toUInt32 else if b[o]! == 0&&zw Xd h.toUSize kh.toUSize (bo.toUSize+yU) cp then act relu 0 else sO X W b relu kh k h bo o yU u L S @[noinline] def f8 (X W b : @& Ἂ Word) (Xd : @& ἀ) (relu:Ἆ) (kh k h bo o cp : @& Nat) (yU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := ((((((((out.push (fZ X W b Xd relu kh k h bo o cp yU u lo sp L a0)).push (fZ X W b Xd relu kh k h bo o cp (yU+1) u lo sp L a1)).push (fZ X W b Xd relu kh k h bo o cp (yU+2) u lo sp L a2)).push (fZ X W b Xd relu kh k h bo o cp (yU+3) u lo sp L a3)).push (fZ X W b Xd relu kh k h bo o cp (yU+4) u lo sp L a4)).push (fZ X W b Xd relu kh k h bo o cp (yU+5) u lo sp L a5)).push (fZ X W b Xd relu kh k h bo o cp (yU+6) u lo sp L a6)).push (fZ X W b Xd relu kh k h bo o cp (yU+7) u lo sp L a7)) theorem hR (Xd:ἀ) (bU c hU yU cpU:Ἄ) (w:Nat) (hc:c < cpU) (hb : ∀ c':Nat,c' < cpU.toNat → bU.toNat+c'*hU.toNat+yU.toNat+w ≤ Xd.size):(bU+c*hU+yU).toNat+w ≤ Xd.size:=by have h1:(bU+c*hU+yU).toNat ≤ bU.toNat+(c*hU).toNat+yU.toNat:=by rw [lJ,lJ] exact (Ay _ _).trans (L1 (Ay _ _) _) have h2:(c*hU).toNat ≤ c.toNat*hU.toNat:=by rw [BO]; exact Ay _ _ have h3:=hb c.toNat (ε.mp hc) omega theorem hQ (Wd:ἀ) (wU c cpU:Ἄ) (m:Nat) (hc:c < cpU) (hw:wU.toNat+m*cpU.toNat ≤ Wd.size) (mU:Ἄ) (hm:mU.toNat=m) : (wU+mU*c).toNat+m ≤ Wd.size:=by have h1:(wU+mU*c).toNat ≤ wU.toNat+(mU*c).toNat:=by rw [lJ]; exact Ay _ _ have h2:(mU*c).toNat ≤ m*c.toNat:=by rw [BO,hm]; exact Ay _ _ have h3:=ε.mp hc have h4:m*c.toNat+m ≤ m*cpU.toNat:=by have:=X3 m (show c.toNat+1 ≤ cpU.toNat by omega); rwa [Nat.mul_add,ϻ] at this omega theorem h3l {k:Nat} (j:Ἄ) {X:ἀ} (hJ:j.toNat+3 ≤ X.size) : (j + @Ve Ἄ k _).toNat < X.size+(k-2):=by have a:(j + @Ve Ἄ k _).toNat ≤ j.toNat+k := (lJ _ _).trans_le (J2 (Ay _ _) (J1 ((Kw).trans_le (Ay _ _)) _)) omega theorem h10 {k:Nat} (j:Ἄ) {X:ἀ} (hJ:j.toNat+10 ≤ X.size) : (j + @Ve Ἄ k _).toNat < X.size+(k-9):=by have a:(j + @Ve Ἄ k _).toNat ≤ j.toNat+k := (lJ _ _).trans_le (J2 (Ay _ _) (J1 ((Kw).trans_le (Ay _ _)) _)) omega def m8 (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu:Ἆ) (kh k h bo o : @& Nat) (u lo sp:ἆ) (L : @& Nat) (cpU hU boU wU yU:Ἄ) (hx : ∀ c':Nat,c' < cpU.toNat → boU.toNat+c'*hU.toNat+yU.toNat+10 ≤ Xd.size) (hw:wU.toNat+3*cpU.toNat ≤ Wd.size) (c:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := if hc:c < cpU then let r:=boU+c*hU+yU have hr:r.toNat+10 ≤ Xd.size:=hR Xd boU c hU yU cpU 10 hc hx let q:=wU+3*c have hq:q.toNat+3 ≤ Wd.size:=hQ Wd wU c cpU 3 hc hw 3 kc3 let w0:=Wd.uget (q+0) (h3l q hq) let w1:=Wd.uget (q+1) (h3l q hq) let w2:=Wd.uget (q+2) (h3l q hq) let x0:=Xd.uget (r+0) (h10 r hr) let x1:=Xd.uget (r+1) (h10 r hr) let x2:=Xd.uget (r+2) (h10 r hr) let x3:=Xd.uget (r+3) (h10 r hr) let x4:=Xd.uget (r+4) (h10 r hr) let x5:=Xd.uget (r+5) (h10 r hr) let x6:=Xd.uget (r+6) (h10 r hr) let x7:=Xd.uget (r+7) (h10 r hr) let x8:=Xd.uget (r+8) (h10 r hr) let x9:=Xd.uget (r+9) (h10 r hr) m8 X W b Xd Wd relu kh k h bo o u lo sp L cpU hU boU wU yU hx hw (c+1) (a0+x0*w0+x1*w1+x2*w2) (a1+x1*w0+x2*w1+x3*w2) (a2+x2*w0+x3*w1+x4*w2) (a3+x3*w0+x4*w1+x5*w2) (a4+x4*w0+x5*w1+x6*w2) (a5+x5*w0+x6*w1+x7*w2) (a6+x6*w0+x7*w1+x8*w2) (a7+x7*w0+x8*w1+x9*w2) out else f8 X W b Xd relu kh k h bo o cpU.toNat yU u lo sp L a0 a1 a2 a3 a4 a5 a6 a7 out termination_by cpU.toNat-c.toNat decreasing_by exact U5 (ε.mp hc) (B5 (U4 _) (Dense.ac hc).symm) theorem rX (Xd:ἀ) (bo h y cp w:Nat) (hb:bo+cp*h ≤ Xd.size) (hy:y+w ≤ h) (hw1:1 ≤ w) (hs:bo+cp*h < 2^31) : ∀ c:Nat,c < cp.toUSize.toNat → bo.toUSize.toNat+c*h.toUSize.toNat+y.toUSize.toNat+w ≤ Xd.size:=by intro c hc have hh:1 ≤ h:=by omega have hcp:cp ≤ cp*h:=U3 cp (by omega) rw [aa cp (by omega)] at hc have hhc:h ≤ cp*h:=lZ h (by omega) rw [aa bo (by omega),aa h (by omega),aa y (by omega)] have:c*h+h ≤ cp*h:=by have:=ι h (show c+1 ≤ cp by omega); rwa [Ϡ,n4] at this omega theorem rW (Wd:ἀ) (o k kh cp:Nat) (hk:k=kh*cp) (hkh:1 ≤ kh) (ho:o*k+k ≤ Wd.size) (hs:o*k+k < 2^31) : (o*k).toUSize.toNat+kh*cp.toUSize.toNat ≤ Wd.size:=by have hcp:cp ≤ k:=by rw [hk]; exact lZ cp (by omega) rw [aa (o*k) (by omega),aa cp (by omega), ← hk]; exact ho def rw (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu D:Ἆ) (cp kh k h ho : @& Nat) (u lo sp:ἆ) (L : @& Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (o:Nat) (hXo:(if D then o*h else 0)+cp*h ≤ Xd.size) (hWo:o*k+k ≤ Wd.size) (hs:(if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (z:Ἅ) (y:Nat) (out:Ἂ Word):Ἂ Word := let bo:=if D then o*h else 0 if h8:y+8 ≤ ho then rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o hXo hWo hs z (y+8) (m8 X W b Xd Wd relu kh k h bo o u lo sp L cp.toUSize h.toUSize bo.toUSize (o*k).toUSize y.toUSize (rX Xd bo h y cp 10 hXo (by omega) (by omega) (by omega)) (rW Wd o k 3 cp (by rw [hk,hkh]) (by omega) hWo (by omega)) 0 z z z z z z z z out) else if h1:y < ho then out ++ (m8 X W b Xd Wd relu kh k h bo o u lo sp L cp.toUSize h.toUSize bo.toUSize (o*k).toUSize (ho-8).toUSize (rX Xd bo h (ho-8) cp 10 hXo (by omega) (by omega) (by omega)) (rW Wd o k 3 cp (by rw [hk,hkh]) (by omega) hWo (by omega)) 0 z z z z z z z z (lQ 8)).extract (y+8-ho) 8 else out termination_by ho-y def rs (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu D:Ἆ) (cp kh k h ho co : @& Nat) (u lo sp:ἆ) (L : @& Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (hXs : ∀ o,o < co → (if D then o*h else 0)+cp*h ≤ Xd.size) (hWs:co*k ≤ Wd.size) (hS : ∀ o,o < co → (if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (o:Nat) (out:Ἂ Word):Ἂ Word := if ho':o < co then rs X W b Xd Wd relu D cp kh k h ho co u lo sp L hk hcp hho hkh h8o hXs hWs hS (o+1) (rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o (hXs o ho') (by have:=ι k (show o+1 ≤ co by omega); rw [Ϡ,n4] at this; omega) (hS o ho') (dw oneW*dw b[o]!) 0 out) else out termination_by co-o def run2 (D:Ἆ) (kh cin h cout:Nat) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (c : {v // v=GK.cF (W,(if D then cin else cout),kh*(if D then 1 else cin))}) (r:ἀ × ἇ) (hr:r=GK.cv X 0 0 (kJ X.size)):Ἂ Word := let cp:=if D then 1 else cin let co:=if D then cin else cout let k:=kh*cp let eB:=aO b 0 0 let L:=Aq (k+2)+1 let P:=max (48+c.1.2.toNat+r.2.toNat) (174+eB.toNat) if hc:kh=3∧c.1.2 < 255∧r.2 < 255∧eB < 255∧P+L ≤ 425∧L ≤ 27∧X.size=cin*h∧W.size=co*k ∧ b.size=co∧kh ≤ h∧0 < co∧0 < cin∧cin*h+cin*h+co*k < 2^31∧10 ≤ h then let hh:=P+2*L-54 have hXd:r.1.size=X.size:=by rw [hr]; exact (cv0 X (by omega)).1 have hWd:c.1.1.size=co*k:=by rw [c.2]; exact (wcDF_spec W co k).1 rs X W b r.1 c.1.1 relu D cp kh k h (h+1-kh) co hh.toUInt64 (wlo hh) (wsp hh) L rfl (by simp only [cp]; split <;> omega) (by omega) hc.1 (by omega) (fun o ho=>by simp only [cp,co] at ho ⊢; rw [hXd,hc.2.2.2.2.2.2.1]; split · rename_i hD; simp only [hD,ἁ] at ho; have:=ι h (show o+1 ≤ cin by omega) rw [Ϡ,n4] at this; omega · simp) (by rw [hWd]) (fun o ho=>by have h1:o*k+k ≤ co*k:=by have:=ι k (show o+1 ≤ co by omega); rwa [Ϡ,n4] at this have h2:(if D then o*h else 0)+cp*h ≤ cin*h:=by simp only [cp,co] at ho ⊢; split · rename_i hD; simp only [hD,ἁ] at ho; have:=ι h (show o+1 ≤ cin by omega) rw [Ϡ,n4] at this; omega · simp have h3:h ≤ cin*h:=lZ h hc.2.2.2.2.2.2.2.2.2.2.2.1 omega) 0 (lQ (co*(h+1-kh))) else spec () def run (D:Ἆ) (kh cin h cout:Nat) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word):Ἂ Word := run2 D kh cin h cout relu X W b spec (wcGet3T wcK3eq (fun a b=>wcK3eq_ok a b) GK.cS 32 (W,(if D then cin else cout),kh*(if D then 1 else cin)) (fun k=>k.1) (fun v=>tchP v.1) 3) (GK.cv X 0 0 (kJ X.size)) rfl end K1 namespace K1 open Dense.F (ao aoe aos kMm kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7 kc8 ug) theorem ugX (Xd:ἀ) (bU c hU yU jU:Ἄ) (h1:(bU+c*hU+yU+jU).toNat < Xd.size) (hs:bU.toNat+c.toNat*hU.toNat+yU.toNat+jU.toNat < 2^31) : Xd.uget (bU+c*hU+yU+jU) h1=Xd.data[bU.toNat+c.toNat*hU.toNat+yU.toNat+jU.toNat]! := by rw [ug]; congr 1 have e1:(c*hU).toNat=c.toNat*hU.toNat:=kMm _ _ (by omega) have e2:(bU+c*hU).toNat=bU.toNat+c.toNat*hU.toNat:=by rw [kSm _ _ (by rw [e1]; omega),e1] have e3:(bU+c*hU+yU).toNat=bU.toNat+c.toNat*hU.toNat+yU.toNat:=by rw [kSm _ _ (by rw [e2]; omega),e2] rw [kSm _ _ (by rw [e3]; omega),e3] theorem ugW (Wd:ἀ) (wU mU c jU:Ἄ) (h1:(wU+mU*c+jU).toNat < Wd.size) (hs:wU.toNat+mU.toNat*c.toNat+jU.toNat < 2^31) : Wd.uget (wU+mU*c+jU) h1=Wd.data[wU.toNat+mU.toNat*c.toNat+jU.toNat]! := by rw [ug]; congr 1 have e1:(mU*c).toNat=mU.toNat*c.toNat:=kMm _ _ (by omega) have e2:(wU+mU*c).toNat=wU.toNat+mU.toNat*c.toNat:=by rw [kSm _ _ (by rw [e1]; omega),e1] rw [kSm _ _ (by rw [e2]; omega),e2] theorem m8_eq (X W b:Ἂ Word) (Xd Wd:ἀ) (relu:Ἆ) (kh k h bo o:Nat) (u lo sp:ἆ) (L:Nat) (cpU hU boU wU yU:Ἄ) (hx) (hw) (cp y:Nat) (hcp:cpU.toNat=cp) (hh:hU.toNat=h) (hbo:boU.toNat=bo) (hwU:wU.toNat=o*k) (hyU:yU.toNat=y) (hs:Xd.size < 2^31∧Wd.size < 2^31) : ∀ n (c:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word),cp-c.toNat=n → c.toNat ≤ cp → m8 X W b Xd Wd relu kh k h bo o u lo sp L cpU hU boU wU yU hx hw c a0 a1 a2 a3 a4 a5 a6 a7 out = f8 X W b Xd relu kh k h bo o cpU.toNat yU u lo sp L (ao (fun s=>Xd.data[bo+s/3*h+y+(0+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a0) (ao (fun s=>Xd.data[bo+s/3*h+y+(1+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a1) (ao (fun s=>Xd.data[bo+s/3*h+y+(2+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a2) (ao (fun s=>Xd.data[bo+s/3*h+y+(3+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a3) (ao (fun s=>Xd.data[bo+s/3*h+y+(4+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a4) (ao (fun s=>Xd.data[bo+s/3*h+y+(5+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a5) (ao (fun s=>Xd.data[bo+s/3*h+y+(6+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a6) (ao (fun s=>Xd.data[bo+s/3*h+y+(7+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a7) out:=by intro n; induction n with | zero => intro c a0 a1 a2 a3 a4 a5 a6 a7 out hn hc have hce:c.toNat=cp:=by omega rw [m8,dite_eq_right (fun h=>by have:=ε.mp h; omega)] simp only [hce,aoe _ _ _ _ (le_refl _)] | succ n ih => intro c a0 a1 a2 a3 a4 a5 a6 a7 out hn hc have hlt:c.toNat < cp:=by omega have hcu:c < cpU:=ε.mpr (by omega) have hc1:(c+1).toNat=c.toNat+1:=Dense.ac hcu have hr:=hR Xd boU c hU yU cpU 10 hcu hx have hq:=hQ Wd wU c cpU 3 hcu hw 3 kc3 have bx:=hx c.toNat (by omega) rw [m8,AT hcu]; dsimp only rw [ih (c+1) _ _ _ _ _ _ _ _ out (by omega) (by omega)] simp only [hc1] have st : ∀ (l:Nat) (a:Ἅ),ao (fun s=>Xd.data[bo+s/3*h+y+(l+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*c.toNat) a = ao (fun s=>Xd.data[bo+s/3*h+y+(l+s%3)]! * Wd.data[o*k+s]!) (3*cp) (3*(c.toNat+1)) (a+Xd.data[bo+c.toNat*h+y+(l+0)]! * Wd.data[o*k+(3*c.toNat+0)]! + Xd.data[bo+c.toNat*h+y+(l+1)]! * Wd.data[o*k+(3*c.toNat+1)]! + Xd.data[bo+c.toNat*h+y+(l+2)]! * Wd.data[o*k+(3*c.toNat+2)]!):=by intro l a rw [aos _ (3*cp) (3*c.toNat) a (by omega),aos _ (3*cp) (3*c.toNat+1) _ (by omega), aos _ (3*cp) (3*c.toNat+1+1) _ (by omega),show 3*c.toNat+1+1+1=3*(c.toNat+1) by omega] simp only [show 3*c.toNat/3=c.toNat by omega,show 3*c.toNat%3=0 by omega,show (3*c.toNat+1)/3=c.toNat by omega, show (3*c.toNat+1)%3=1 by omega,show (3*c.toNat+1+1)/3=c.toNat by omega,show (3*c.toNat+1+1)%3=2 by omega, show 3*c.toNat+1+1=3*c.toNat+2 by omega,ϑ] rw [st 0 a0,st 1 a1,st 2 a2,st 3 a3,st 4 a4,st 5 a5,st 6 a6,st 7 a7] have xs : ∀ j:Ἄ,j.toNat ≤ 9 → ∀ hh',Xd.uget (boU+c*hU+yU+j) hh'=Xd.data[bo+c.toNat*h+y+j.toNat]! := by intro j hj hh'; rw [ugX Xd boU c hU yU j hh' (by rw [hbo,hh,hyU] at *; omega),hbo,hh,hyU] have ws : ∀ j:Ἄ,j.toNat ≤ 2 → ∀ hh',Wd.uget (wU+3*c+j) hh'=Wd.data[o*k+(3*c.toNat+j.toNat)]! := by intro j hj hh'; rw [ugW Wd wU 3 c j hh' (by rw [kc3] at *; omega),hwU,kc3,pA] simp only [xs 0 (by simp) _,xs 1 (by simp) _,xs 2 (by simp) _,xs 3 (by simp) _,xs 4 (by simp) _,xs 5 (by simp) _, xs 6 (by simp) _,xs 7 (by simp) _,xs 8 (by simp) _,xs 9 (by simp) _,ws 0 (by simp) _,ws 1 (by simp) _,ws 2 (by simp) _] simp only [kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7, kc8,show (9:Ἄ).toNat=9 by simp,Xo,ϑ] end K1 namespace K1 open Dense.F (kSm ug) theorem zt_spec (Xd:ἀ) (b khU:Ἄ) (kh:Nat) (hk:khU.toNat=kh) (hb:b.toNat+kh < 2^31) : ∀ n (t:Ἄ),kh-t.toNat=n → t.toNat ≤ kh → zt Xd b khU t=true → ∀ j,t.toNat ≤ j → j < kh → (fun v:Ἅ=>v == -v) (Xd.data[b.toNat+j]!)=true:=by intro n; induction n with | zero=>intro t hn ht _ j h1 h2; omega | succ n ih => intro t hn ht hz j h1 h2 have htk:t < khU:=ε.mpr (by omega) rw [zt,AT htk] at hz split at hz · rename_i hi simp only [Η] at hz have e:(b+t).toNat=b.toNat+t.toNat:=kSm _ _ (by omega) by_cases hj:j=t.toNat · subst hj; have:=hz.1; rw [ug,e] at this; exact this · exact ih (t+1) (by rw [Dense.ac htk]; omega) (by rw [Dense.ac htk]; omega) hz.2 j (by rw [Dense.ac htk]; omega) h2 · exact absurd hz (by decide) theorem zw_spec (Xd:ἀ) (hU khU:Ἄ) (h kh:Nat) (hh:hU.toNat=h) (hk:khU.toNat=kh) (hkh:kh ≤ h) : ∀ n (b:Ἄ),b.toNat+n*h < 2^31 → zw Xd hU khU b n=true → ∀ c,c < n → ∀ t,t < kh → (fun v:Ἅ=>v == -v) (Xd.data[b.toNat+c*h+t]!)=true:=by intro n; induction n with | zero=>intro b _ _ c hc; omega | succ n ih => intro b hb hz c hc t ht simp only [zw,Η] at hz have hn:b.toNat+kh < 2^31:=by have:=ι h (show 1 ≤ n+1 by omega); rw [n4] at this; omega by_cases hc0:c=0 · subst hc0; simp only [ϳ,ϑ] exact zt_spec Xd b khU kh hk hn kh 0 (by simp) (by simp) hz.1 t (by simp) ht · have e:(b+hU).toNat=b.toNat+h:=by rw [kSm _ _ (by rw [hh]; rw [Ο] at hb; omega),hh] have:=ih (b+hU) (by rw [e]; rw [Ο] at hb; omega) hz.2 (c-1) (by omega) t ht rw [e] at this rw [show b.toNat+c*h+t=b.toNat+h+(c-1)*h+t by have:c*h=(c-1)*h+h:=by have hc1:c=(c-1)+1:=by omega conv_lhs=>rw [hc1,Ϡ,n4] omega] exact this end K1 namespace K1 open Core (aG tm) open GK (ao_congr) open Dense.F (ao dJ dw fv kAkN kSm rv tf tw) open Conv (aa czDZ czZ fz_ak wlo wok wsp zrDot2) abbrev R (X W b:Ἂ Word) (relu:Ἆ) (kh k h bo o y:Nat):Word := act relu (dotOf (k+1) (fun t=>if t < k then X[bo+t/kh*h+t%kh+y]! else oneW) (fun t=>if t < k then W[o*k+t]! else b[o]!)) theorem Zr (X W b:Ἂ Word) (relu:Ἆ) (kh k h bo o y:Nat) (hb0:b[o]! = 0) (hfX : ∀ s < k,expOf X[bo+s/kh*h+s%kh+y]! ≠ 255) (hfW : ∀ s < k,expOf W[o*k+s]! ≠ 255) (hz : ∀ s < k,czZ (dw X[bo+s/kh*h+s%kh+y]!)=true) : R X W b relu kh k h bo o y=act relu 0:=by unfold R; congr 1 apply zrDot2 k · intro s hs; simp only [AD hs]; exact BA (czDZ _ (hfX s hs) (hz s hs)) · intro s hs; simp only [AD hs]; exact hfX s hs · intro s hs; simp only [AD hs]; exact hfW s hs · simp · simp [hb0] theorem ix (cp kh k h bo s y Xs:Nat) (hk:k=kh*cp) (hkh0:0 < kh) (hs:s < k) (hy:y+kh ≤ h) (hX:bo+cp*h ≤ Xs):bo+s/kh*h+s%kh+y < Xs:=by have h1:s/kh < cp:=Ϟ (hk ▸ hs) have h2:s%kh < kh:=ϊ _ hkh0 have h3:(s/kh+1)*h ≤ cp*h:=ι h h1 rw [Ϡ,n4] at h3 omega structure Cx (X W b:Ἂ Word) (Xd Wd:ἀ) (D:Ἆ) (cp kh k h co:Nat) (u lo sp:ἆ) (L P:Nat):Prop where hXs:Xd.size=X.size hX31:X.size < 2^31 hWs:Wd.size=co*k hW31:Wd.size < 2^31 hXd : ∀ q < X.size,Xd.data[q]! = dw X[q]! hWd : ∀ q < co*k,Wd.data[q]! = dw W[q]! hk:k=kh*cp hkh0:0 < kh hX : ∀ o < co,(if D then o*h else 0)+cp*h ≤ X.size hs : ∀ o < co,(if D then o*h else 0)+cp*h+h+o*k+k < 2^31 hfX : ∀ q < X.size,expOf X[q]! ≠ 255 hfW : ∀ q:Nat,expOf W[q]! ≠ 255 hfb : ∀ q:Nat,expOf b[q]! ≠ 255 hEX : ∀ i < X.size, ∀ j:Nat, |(tm X[i]! W[j]! : ℝ)| ≤ 2^P hEb : ∀ o:Nat, |(tm oneW b[o]! : ℝ)| ≤ 2^P hN:k+2 ≤ 2^L hD:L ≤ 27 hJ:P+L ≤ 425 hu:u=(P+2*L-54).toUInt64 hlo:lo=wlo (P+2*L-54) hsp:sp=wsp (P+2*L-54) theorem fZ_eq {X W b:Ἂ Word} {Xd Wd:ἀ} {D:Ἆ} {cp kh k h co:Nat} {u lo sp:ἆ} {L P:Nat} (C:Cx X W b Xd Wd D cp kh k h co u lo sp L P) (relu:Ἆ) (o y:Nat) (ho:o < co) (hy:y+kh ≤ h) (yU:Ἄ) (hyU:yU.toNat=y) (cp':Nat) (hcp':cp'=cp) (S:Ἅ) (hS:S=ao (fun s=>dw X[(if D then o*h else 0)+s/kh*h+s%kh+y]! * dw W[o*k+s]!) k 0 (dw oneW*dw b[o]!)) : fZ X W b Xd relu kh k h (if D then o*h else 0) o cp' yU u lo sp L S=R X W b relu kh k h (if D then o*h else 0) o y:=by subst hyU hcp' have hXo:=C.hX o ho have hso:=C.hs o ho generalize hbo:(if D then o*h else 0)=bo at hS hXo hso ⊢ have hIn : ∀ s < k,bo+s/kh*h+s%kh+yU.toNat < X.size:=fun s hs=>ix cp' kh k h bo s _ X.size C.hk C.hkh0 hs hy hXo let d:Nat → Word:=fun t=>if t < k then X[bo+t/kh*h+t%kh+yU.toNat]! else oneW let e:Nat → Word:=fun t=>if t < k then W[o*k+t]! else b[o]! let p:Nat → Ἅ:=fun t=>dw X[bo+t/kh*h+t%kh+yU.toNat]! * dw W[o*k+t]! let hf:Unit → Ἅ:=fun _=>dw oneW*dw b[o]! let Bf:Unit → Word:=fun _=>act relu (dotOf (k+1) d e) have K : ∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ):=by intro s hs; simp only [p,d,e,AD hs]; exact dJ _ _ (C.hfX _ (hIn s hs)) (C.hfW _) have q:fv (hf ())∧rv (hf ())=(tm (d k) (e k):ℝ):=by simp only [hf,d,e,AX,ἂ]; exact dJ oneW b[o]! (by decide) (C.hfb o) have jg:aG (k+1) d e:=by intro s hs; by_cases h':s < k · simp only [d,e,AD h']; exact ⟨C.hfX _ (hIn s h'),C.hfW _⟩ · simp only [d,e,AC h']; exact ⟨by decide,C.hfb o⟩ have E : ∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P:=by intro s hs; by_cases h':s < k · simp only [d,e,AD h']; exact C.hEX _ (hIn s h') _ · simp only [d,e,AC h']; exact C.hEb o have hJ:=C.hJ have hDL:=C.hD have T:tw relu S u L k p hf Bf=R X W b relu kh k h bo o yU.toNat := GK.jW relu k d e p hf u P L Bf S K q jg E C.hN C.hD C.hJ C.hu rfl hS unfold fZ rw [fz_ak S lo sp u (by rw [C.hu,C.hlo,C.hsp]; exact wok _ (by omega))] dsimp only split · rename_i hc rw [← T]; unfold tw tf split · rename_i hneg simp only [Η] at hneg obtain ⟨⟨hr,hn⟩, -⟩:=hneg subst hr exact kAkN S u hc hn · dsimp only; rw [AD hc] · split · rename_i hz simp only [Η,AQ] at hz obtain ⟨hb0,hzw⟩:=hz have hh31:h < 2^31:=by omega have hk31:kh < 2^31:=by omega have e1:(bo.toUSize+yU).toNat=bo+yU.toNat:=by rw [kSm _ _ (by rw [aa bo (by omega)]; omega),aa bo (by omega)] have Z:=zw_spec Xd h.toUSize kh.toUSize h kh (aa h (by omega)) (aa kh (by omega)) (by omega) cp' (bo.toUSize+yU) (by rw [e1]; omega) hzw rw [e1] at Z refine (Zr X W b relu kh k h bo o yU.toNat hb0 (fun s hs=>C.hfX _ (hIn s hs)) (fun s _=>C.hfW _) (fun s hs => ?_)).symm have h1:s/kh < cp':=Ϟ (C.hk ▸ hs) have h2:s%kh < kh:=ϊ _ C.hkh0 have:=Z (s/kh) h1 (s%kh) h2 rw [show bo+yU.toNat+s/kh*h+s%kh=bo+s/kh*h+s%kh+yU.toNat by omega,C.hXd _ (hIn s hs)] at this exact this · unfold sO; exact T theorem lane {X W b:Ἂ Word} {Xd Wd:ἀ} {D:Ἆ} {cp kh k h co:Nat} {u lo sp:ἆ} {L P:Nat} (C:Cx X W b Xd Wd D cp kh k h co u lo sp L P) (relu:Ἆ) (o y l:Nat) (ho:o < co) (hy:y+l+kh ≤ h) (yU:Ἄ) (hyU:yU.toNat=y+l) (cp':Nat) (hcp':cp'=cp) (t0:Nat) (ht0:t0=0) (z:Ἅ) (hz:z=dw oneW*dw b[o]!) : fZ X W b Xd relu kh k h (if D then o*h else 0) o cp' yU u lo sp L (ao (fun s=>Xd.data[(if D then o*h else 0)+s/kh*h+y+(l+s%kh)]! * Wd.data[o*k+s]!) k t0 z) = R X W b relu kh k h (if D then o*h else 0) o (y+l):=by apply fZ_eq C relu o (y+l) ho (by omega) yU hyU cp' hcp' subst ht0; rw [hz] refine ao_congr _ _ k k 0 _ (by omega) (fun s _ hs => ?_) have hIn:=ix cp kh k h (if D then o*h else 0) s (y+l) X.size C.hk C.hkh0 hs (by omega) (C.hX o ho) have hoW:o*k+s < co*k:=by have:=ι k (show o+1 ≤ co by omega); rw [Ϡ,n4] at this; omega rw [show (if D then o*h else 0)+s/kh*h+y+(l+s%kh)=(if D then o*h else 0)+s/kh*h+s%kh+(y+l) by omega, C.hXd _ hIn,C.hWd _ hoW] end K1 namespace K1 open GK (dm push8) open Dense.F (ao dw kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7) open Conv (aa) theorem rw_spec {X W b:Ἂ Word} {Xd Wd:ἀ} {D:Ἆ} {cp kh k h co:Nat} {u lo sp:ἆ} {L P:Nat} (C:Cx X W b Xd Wd D cp kh k h co u lo sp L P) (relu:Ἆ) (ho:Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (o:Nat) (hoc:o < co) (hXo:(if D then o*h else 0)+cp*h ≤ Xd.size) (hWo:o*k+k ≤ Wd.size) (hs:(if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (z:Ἅ) (hz:z=dw oneW*dw b[o]!) : ∀ c y (out:Ἂ Word),ho-y=c → y ≤ ho → out.size=o*ho+y → (∀ q < out.size,out[q]! = R X W b relu kh k h (if D then q/ho*h else 0) (q/ho) (q%ho)) → (rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o hXo hWo hs z y out).size=(o+1)*ho ∧ ∀ q < (o+1)*ho,(rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o hXo hWo hs z y out)[q]! = R X W b relu kh k h (if D then q/ho*h else 0) (q/ho) (q%ho):=by subst hk intro c; induction c using Z5 with | _ c ih => intro y out hc hy hsz hp have hF : ∀ l,y+l < ho → R X W b relu kh (kh*cp) h (if D then o*h else 0) o (y+l) = R X W b relu kh (kh*cp) h (if D then (o*ho+y+l)/ho*h else 0) ((o*ho+y+l)/ho) ((o*ho+y+l)%ho):=by intro l hl; have e:=dm o ho (y+l) hl; rw [show o*ho+y+l=o*ho+(y+l) by ring,e.1,e.2] have hX31:=C.hX31 have hXs:=C.hXs have hWs:=C.hWs have hW31:=C.hW31 have hkh0:=C.hkh0 have hcp31:cp < 2^31:=by have:=lZ cp hkh0; omega have Lg : ∀ y0 l (lU:Ἄ),lU.toNat=l → y0+l < ho → fZ X W b Xd relu kh (kh*cp) h (if D then o*h else 0) o cp.toUSize.toNat (y0.toUSize+lU) u lo sp L (ao (fun s=>Xd.data[(if D then o*h else 0)+s/kh*h+y0+(l+s%kh)]! * Wd.data[o*(kh*cp)+s]!) (kh*cp) 0 z) = R X W b relu kh (kh*cp) h (if D then o*h else 0) o (y0+l) := fun y0 l lU hl hyl=>lane C relu o y0 l hoc (by omega) _ (GK.uj y0 l lU hl (by omega)) _ (aa cp (by omega)) 0 rfl z hz have Lg0 : ∀ y0,y0 < ho → fZ X W b Xd relu kh (kh*cp) h (if D then o*h else 0) o cp.toUSize.toNat y0.toUSize u lo sp L (ao (fun s=>Xd.data[(if D then o*h else 0)+s/kh*h+y0+(0+s%kh)]! * Wd.data[o*(kh*cp)+s]!) (kh*cp) 0 z) = R X W b relu kh (kh*cp) h (if D then o*h else 0) o (y0+0) := fun y0 hy0=>lane C relu o y0 0 hoc (by omega) _ (by rw [aa y0 (by omega),ϑ]) _ (aa cp (by omega)) 0 rfl z hz have Ln : ∀ l (lU:Ἄ),lU.toNat=l → y+l < ho → _:=fun l lU hl hyl=>(Lg y l lU hl hyl).trans (hF l hyl) have L0:y < ho → _:=fun hyl=>(Lg0 y hyl).trans (hF 0 (by omega)) rw [rw]; try dsimp only by_cases h8:y+8 ≤ ho · rw [AT h8] subst hkh rw [m8_eq X W b Xd Wd relu 3 (3*cp) h (if D then o*h else 0) o u lo sp L cp.toUSize h.toUSize (if D then o*h else 0).toUSize (o*(3*cp)).toUSize y.toUSize _ _ cp y (aa cp (by omega)) (aa h (by omega)) (aa _ (by omega)) (aa _ (by omega)) (aa y (by omega)) ⟨by omega,by omega⟩ (cp-0) 0 z z z z z z z z out (by simp) (by simp)] unfold f8 simp only [kc0,A7] have P8:=push8 out (fun q=>R X W b relu 3 (3*cp) h (if D then q/ho*h else 0) (q/ho) (q%ho)) (o*ho+y) hsz (fun q hq=>hp q (by rw [hsz]; exact hq)) _ _ _ _ _ _ _ _ (L0 (by omega)) (Ln 1 1 kc1 (by omega)) (Ln 2 2 kc2 (by omega)) (Ln 3 3 kc3 (by omega)) (Ln 4 4 kc4 (by omega)) (Ln 5 5 kc5 (by omega)) (Ln 6 6 kc6 (by omega)) (Ln 7 7 kc7 (by omega)) exact ih (c-8) (by omega) (y+8) _ (by omega) h8 (by rw [P8.1]; ring) (fun q hq=>P8.2 q (by rw [P8.1] at hq; omega)) · rw [dite_eq_right h8] by_cases h1:y < ho · rw [AT h1] subst hkh rw [m8_eq X W b Xd Wd relu 3 (3*cp) h (if D then o*h else 0) o u lo sp L cp.toUSize h.toUSize (if D then o*h else 0).toUSize (o*(3*cp)).toUSize (ho-8).toUSize _ _ cp (ho-8) (aa cp (by omega)) (aa h (by omega)) (aa _ (by omega)) (aa _ (by omega)) (aa _ (by omega)) ⟨by omega,by omega⟩ (cp-0) 0 z z z z z z z z (lQ 8) (by simp) (by simp)] unfold f8 simp only [kc0,A7] have T8:=push8 (lQ 8) (fun l=>R X W b relu 3 (3*cp) h (if D then o*h else 0) o (ho-8+l)) 0 (by simp) (fun q hq=>absurd hq (by omega)) _ _ _ _ _ _ _ _ (Lg0 (ho-8) (by omega)) (Lg (ho-8) 1 1 kc1 (by omega)) (Lg (ho-8) 2 2 kc2 (by omega)) (Lg (ho-8) 3 3 kc3 (by omega)) (Lg (ho-8) 4 4 kc4 (by omega)) (Lg (ho-8) 5 5 kc5 (by omega)) (Lg (ho-8) 6 6 kc6 (by omega)) (Lg (ho-8) 7 7 kc7 (by omega)) have e1:(o+1)*ho=o*ho+ho:=by rw [Ϡ,n4] refine ⟨by rw [Ky,Uw,T8.1,hsz,e1]; omega,fun q hq => ?_⟩ by_cases hq1:q < out.size · rw [AB _ q (by rw [Ky]; omega),Array.getElem_append_left hq1, ← AB out q hq1] exact hp q hq1 · rw [hsz] at hq1 have q1:=dm o ho (q-o*ho) (by rw [e1] at hq; omega) rw [show o*ho+(q-o*ho)=q by omega] at q1 rw [AB _ q (by rw [Ky,Uw,T8.1,hsz,e1] at *; omega), Array.getElem_append_right (by rw [hsz]; omega),Array.getElem_extract, ← AB _ _ (by rw [T8.1]; omega), T8.2 _ (by omega),q1.1,q1.2,show ho-8+(y+8-ho+(q-out.size))=q-o*ho by rw [hsz]; omega] · rw [dite_eq_right h1] have:y=ho:=by omega subst this exact ⟨by rw [hsz]; ring,fun q hq=>hp q (by rw [hsz]; rw [Ϡ,n4] at hq; exact hq)⟩ theorem rs_spec {X W b:Ἂ Word} {Xd Wd:ἀ} {D:Ἆ} {cp kh k h co:Nat} {u lo sp:ἆ} {L P:Nat} (C:Cx X W b Xd Wd D cp kh k h co u lo sp L P) (relu:Ἆ) (ho:Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (hXs : ∀ o,o < co → (if D then o*h else 0)+cp*h ≤ Xd.size) (hWs:co*k ≤ Wd.size) (hS : ∀ o,o < co → (if D then o*h else 0)+cp*h+h+o*k+k < 2^31) : ∀ c o (out:Ἂ Word),co-o=c → o ≤ co → out.size=o*ho → (∀ q < out.size,out[q]! = R X W b relu kh k h (if D then q/ho*h else 0) (q/ho) (q%ho)) → (rs X W b Xd Wd relu D cp kh k h ho co u lo sp L hk hcp hho hkh h8o hXs hWs hS o out).size=co*ho ∧ ∀ q < co*ho,(rs X W b Xd Wd relu D cp kh k h ho co u lo sp L hk hcp hho hkh h8o hXs hWs hS o out)[q]! = R X W b relu kh k h (if D then q/ho*h else 0) (q/ho) (q%ho):=by intro c; induction c with | zero => intro o out hc ho' hsz hp have:o=co:=by omega subst this rw [rs,dite_eq_right (N4 _)] exact ⟨hsz,fun q hq=>hp q (by omega)⟩ | succ c ih => intro o out hc ho' hsz hp have hi:o < co:=by omega rw [rs,AT hi] have W:=rw_spec C relu ho hk hcp hho hkh h8o o hi (hXs o hi) (by have:=ι k (show o+1 ≤ co by omega); rw [Ϡ,n4] at this; omega) (hS o hi) _ rfl (ho-0) 0 out rfl (ϟ _) (by rw [hsz]; ring) hp exact ih (o+1) _ (by omega) (by omega) W.1 (fun q hq=>W.2 q (by rw [W.1] at hq; exact hq)) end K1 namespace K1 open GK (cv0) open Cv1 (c1F) open Dense.F (aO bd dh wcDF wcDF_spec) open Conv (wlo wsp) theorem mkC (D:Ἆ) (kh cin h cout:Nat) (X W b:Ἂ Word) (cp co k L P:Nat) (hcp:cp=if D then 1 else cin) (hco:co=if D then cin else cout) (hk:k=kh*cp) (hL:L=Aq (k+2)+1) (c : {v // v=GK.cF (W,co,k)}) (r:ἀ × ἇ) (hr:r=GK.cv X 0 0 (kJ X.size)) (hP:P=max (48+c.1.2.toNat+r.2.toNat) (174+(aO b 0 0).toNat)) (hkh:kh=3) (hc2:c.1.2 < 255) (hr2:r.2 < 255) (heB:aO b 0 0 < 255) (hPL:P+L ≤ 425) (hL27:L ≤ 27) (hXsz:X.size=cin*h) (hWsz:W.size=co*k) (hbsz:b.size=co) (hkhh:kh ≤ h) (hco0:0 < co) (hcin:0 < cin) (h31:cin*h+cin*h+co*k < 2^31) : Cx X W b r.1 c.1.1 D cp kh k h co (P+2*L-54).toUInt64 (wlo (P+2*L-54)) (wsp (P+2*L-54)) L P:=by have hX31:X.size < 2^31:=by omega have hcv:=cv0 X hX31 rw [← hr] at hcv have hc1:c.1.1=wcDF (W,co,k):=by rw [c.2]; rfl have hc2e:c.1.2=aO W 0 0:=by rw [c.2]; rfl have hWd:=wcDF_spec W co k rw [← hc1] at hWd have hkh0:0 < kh:=by omega have hcp0:0 < cp:=by rw [hcp]; split <;> omega have bW:=fun q=>bd W (by have:=ς; omega) (by rw [← hc2e]; exact hc2) q have bB:=fun q=>bd b (by have:=ς; have:co ≤ co*k:=U3 co (by rw [hk]; exact Ϯ hkh0 hcp0); omega) heB q have hhc:h ≤ cin*h:=lZ h hcin have hXo : ∀ o < co,(if D then o*h else 0)+cp*h ≤ X.size:=by intro o ho; rw [hXsz]; subst hcp hco; cases D · simp · simp only [ἁ] at ho ⊢; have:=ι h (show o+1 ≤ cin by omega) rw [Ϡ,n4] at this; omega exact { hXs:=hcv.1 hX31:=hX31 hWs:=hWd.1 hW31:=by rw [hWd.1]; omega hXd:=hcv.2.1 hWd:=hWd.2 hk:=hk hkh0:=hkh0 hX:=hXo hs:=fun o ho=>by have h1:o*k+k ≤ co*k:=by have:=ι k (show o+1 ≤ co by omega); rwa [Ϡ,n4] at this have h2:=hXo o ho omega hfX:=fun q hq e=>by have h1:=hcv.2.2 q hq; rw [e] at h1 have h2:=Ι.mp hr2 simp only [kN] at h1 h2; omega hfW:=fun q=>(bW q).1 hfb:=fun q=>(bB q).1 hEX:=fun i hi j=>by have gX:idxOf X[i]! ≤ r.2.toNat:=by rw [Dense.aT]; have:=hcv.2.2 i hi; omega have gW:idxOf W[j]! ≤ P-48-r.2.toNat:=by have:=(bW j).2; rw [← hc2e] at this; omega have:=dh X[i]! W[j]! _ _ gX gW rwa [show 48+r.2.toNat+(P-48-r.2.toNat)=P by omega] at this hEb:=fun o=>by have gO:idxOf oneW ≤ 126:=by rw [Dense.aT]; decide have gb:idxOf b[o]! ≤ P-174:=by have:=(bB o).2; omega have:=dh oneW b[o]! _ _ gO gb rwa [show 48+126+(P-174)=P by omega] at this hN:=by rw [hL]; exact I3 ϙ hD:=hL27 hJ:=hPL hu:=rfl hlo:=rfl hsp:=rfl } theorem rsF {X W b:Ἂ Word} {Xd Wd:ἀ} {D:Ἆ} {cp kh k h co:Nat} {u lo sp:ἆ} {L P:Nat} (C:Cx X W b Xd Wd D cp kh k h co u lo sp L P) (relu:Ἆ) (hk:k=kh*cp) (hcp:0 < cp) (hho:(h+1-kh)+kh=h+1) (hkh:kh=3) (h8o:8 ≤ h+1-kh) (hXs : ∀ o,o < co → (if D then o*h else 0)+cp*h ≤ Xd.size) (hWs:co*k ≤ Wd.size) (hS : ∀ o,o < co → (if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (F:Ἂ Word) (hFs:F.size=co*(h+1-kh)) (hFe : ∀ q < co*(h+1-kh),F[q]! = R X W b relu kh k h (if D then q/(h+1-kh)*h else 0) (q/(h+1-kh)) (q%(h+1-kh))) (N:Nat) : rs X W b Xd Wd relu D cp kh k h (h+1-kh) co u lo sp L hk hcp hho hkh h8o hXs hWs hS 0 (lQ N)=F:=by have R0:=rs_spec C relu (h+1-kh) hk hcp hho hkh h8o hXs hWs hS (co-0) 0 (lQ N) rfl (ϟ _) (by simp) (by simp) apply mi · rw [R0.1,hFs] · intro q h1 h2 have h1':q < co*(h+1-kh):=by rw [R0.1] at h1; exact h1 rw [← AB _ q h1, ← AB _ q h2,R0.2 q h1',hFe q h1'] theorem run2_eq (D:Ἆ) (kh cin h cout:Nat) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (c : {v // v=GK.cF (W,(if D then cin else cout),kh*(if D then 1 else cin))}) (r:ἀ × ἇ) (hr:r=GK.cv X 0 0 (kJ X.size)) (F:Ἂ Word) (hsp:spec ()=F) (hFs:0 < cin → 0 < kh → kh ≤ h → F.size=(if D then cin else cout)*(h+1-kh)) (hFe:0 < cin → 0 < kh → kh ≤ h → ∀ q < (if D then cin else cout)*(h+1-kh), F[q]! = R X W b relu kh (kh*(if D then 1 else cin)) h (if D then q/(h+1-kh)*h else 0) (q/(h+1-kh)) (q%(h+1-kh))) : run2 D kh cin h cout relu X W b spec c r hr=F:=by unfold run2 cases D <;> simp only [υ, ↓reduceIte] at hFs hFe ⊢ <;> split <;> first | exact hsp | rename_i hc obtain ⟨hkh,hc2,hr2,heB,hPL,hL27,hXsz,hWsz,hbsz,hkhh,hco0,hcin,h31,h10⟩:=hc exact rsF (mkC _ kh cin h cout X W b _ _ _ _ _ rfl rfl rfl rfl c r hr rfl hkh hc2 hr2 heB hPL hL27 hXsz hWsz hbsz hkhh hco0 hcin h31) relu rfl _ _ hkh (by omega) _ _ _ F (hFs hcin (by omega) hkhh) (hFe hcin (by omega) hkhh) _ theorem wC (s:D5) (X:Ἂ Word) (hc:Cv1.c1Ok s=true) (g y t:Nat) (hy:y+t%s.kh < s.h) : Jl s X g y 0 t=X[(g*s.cpg+t/s.kh)*s.h+(y+t%s.kh)]! := by obtain ⟨hw1,hkw,hsh,hsw,hpt,hpl,hpb,hpr,hdh,hdw,hk0,hkh⟩:=c1F s hc unfold Jl simp only [hw1,hkw,hsh,hsw,hpt,hpl,hdh,hdw,ϻ,W6,Jw, ϑ, pQ, ] rw [AC (by omega)] theorem cvE (t:D5) (relu:Ἆ) (X W b:Ἂ Word) (hc:Cv1.c1Ok t=true) (q:Nat) (hq:q < t.cout*(t.h+1-t.kh)):(P7 dotOf t relu X W b)[q]! = act relu (dotOf (t.taps+1) (fun i=>if i < t.taps then X[(q/(t.h+1-t.kh)/t.opg*t.cpg+i/t.kh)*t.h+(q%(t.h+1-t.kh)+i%t.kh)]! else oneW) (fun i=>if i < t.taps then W[q/(t.h+1-t.kh)*t.taps+i]! else b[q/(t.h+1-t.kh)]!)):=by obtain ⟨hw1,hkw,hsh,hsw,hpt,hpl,hpb,hpr,hdh,hdw,hk0,hkh⟩:=c1F t hc have eho:t.ho=t.h+1-t.kh:=by simp only [Y9,Q9,hpt,hpb,hdh,hsh]; omega have ewo:t.wo=1:=by simp only [G9,J9,hpl,hpr,hdw,hsw,hw1,hkw] rw [AB _ q (by simp only [P7,Ϝ,eho,ewo,ϻ]; exact hq)] unfold P7; rw [Λ]; simp only [eho,ewo,ϻ,W6,Jw] congr 2; funext i; split · exact wC t X hc _ _ i (by have:=ϊ q (show 0 < t.h+1-t.kh by omega); have:=ϊ i hk0; omega) · rfl theorem runC_eq (s:D5) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (hsp:spec ()=I6 s relu X W b) (hc:Cv1.c1Ok s=true) (hg:s.groups=1) : run false s.kh s.cin s.h s.cout relu X W b spec=I6 s relu X W b:=by obtain ⟨hw1,hkw,hsh,hsw,hpt,hpl,hpb,hpr,hdh,hdw,hk0,hkh⟩:=c1F s hc have hsz:(I6 s relu X W b).size=s.cout*(s.h+1-s.kh):=by simp only [I6,P7,Ϝ,Y9, G9,Q9,J9,hpt,hpb,hdh,hsh,hpl,hpr,hdw,hsw, hw1,hkw]; congr 1; omega unfold run apply run2_eq false _ _ _ _ _ _ _ _ _ _ _ _ _ hsp · intro _ _ _; exact hsz · intro hcin hkh0 hkhh q hq simp only [υ, ↓reduceIte] at hq ⊢ have g0:q/(s.h+1-s.kh)/s.cout=0:=ώ (Ϟ (by rw [Ϗ]; exact hq)) rw [I6,cvE s relu X W b hc q hq] have et:s.taps=s.kh*s.cin:=by simp only [L9,B7,hg,W6,hkw,ϻ]; ring simp only [et,Qa,hg,W6,g0,ϳ,Κ] unfold R; congr 2; funext i; split · congr 1; omega · rfl theorem runD_eq (s:D5) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (hsp:spec ()=M6 s relu X W b) (hc:Cv1.c1Ok s=true) : run true s.kh s.cin s.h s.cin relu X W b spec=M6 s relu X W b:=by obtain ⟨hw1,hkw,hsh,hsw,hpt,hpl,hpb,hpr,hdh,hdw,hk0,hkh⟩:=c1F s hc have hsz:(M6 s relu X W b).size=s.cin*(s.h+1-s.kh):=by simp only [M6,Jt,P7,Ϝ, F5,Y9,G9,Q9, J9,hpt,hpb,hdh,hsh,hpl,hpr,hdw,hsw,hw1,hkw]; congr 1; omega unfold run apply run2_eq true _ _ _ _ _ _ _ _ _ _ _ _ _ hsp · intro _ _ _; exact hsz · intro hcin hkh0 hkhh q hq simp only [↓reduceIte] at hq ⊢ rw [M6,Jt,cvE s.depthwise relu X W b hc q hq] have e1:s.cin/s.cin=1:=Wj hcin simp only [L9,B7,Qa, F5,e1,W6,n4,ϻ,hkw] unfold R; congr 2; funext i; split · congr 1; rw [Ϡ]; omega · rfl end K1 def cvK(s:D5)(relu:Ἆ)(inp wts b:Ἂ Word):Ἂ Word:= if Cv1.c1Ok s&&s.kh==3&&s.groups==1 then K1.run false s.kh s.cin s.h s.cout relu inp wts b (fun _=>Z6.conv.conv2d s relu inp wts b) else if cvOk s&&fpOk s then Conv.er (cvO s) relu inp wts b else Z6.conv.conv2d s relu inp wts b theorem cvK_eq:cvK=I6:=by funext s relu inp wts b;unfold cvK;split ·rename_i h;simp only[Η]at h exact K1.runC_eq s relu inp wts b _ (by simp only[Z6,Q8];rfl) h.1.1 (by simpa using h.2) ·split ·rename_i h;rw[Η]at h;rw[Conv.eu,cvB s h.1] ·simp only[Z6,Q8];rfl def dwK(s:D5)(relu:Ἆ)(inp wts b:Ἂ Word):Ἂ Word:= if dwOk s&&fpOk s then Conv.cG (cvO s) relu inp wts b else if Cv1.c1Ok s&&s.kh==3 then K1.run true s.kh s.cin s.h s.cin relu inp wts b (fun _=>Z6.conv.depthwise s relu inp wts b) else Z6.conv.depthwise s relu inp wts b def apK(s:PoolShape)(inp:Ἂ Word):Ἂ Word:= if apOk s then Conv.dU s.c s.h s.w s.kh inp else Z6.elem.avgpool s inp def mpK(s:PoolShape)(inp:Ἂ Word):Ἂ Word:= if apOk s then Conv.d9 s.c s.h s.w s.kh inp else Z6.elem.maxpool s inp namespace Rnn open Dense.F (WcE ak aoe aos bW cw dJ da dw iC kE1 kHG s5push_get s5wcGet3_val wcAeq wcAeq_ok wcGet3) open Core (aG au iW tm) open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats abbrev LinFn:=Nat → Nat → Nat → Ἆ → Ἂ Word → Ἂ Word → Ἂ Word → Ἂ Word @[inline] def fA (A:Ἂ Word) (ao n:Nat) (a1 a2:Word) (t:Nat):Word := if t < n then A[ao+t]! else if t=n then a1 else a2 @[inline] def aGt (A:Ἂ Word) (k:Ἄ):Word:=if h:k < A.usize then A.uget k (Dense.cD h) else A[k.toNat]! theorem aGt_eq (A:Ἂ Word) (k:Ἄ):aGt A k=A[k.toNat]!:=by unfold aGt; split · exact Dense.cC A k _ · rfl theorem aGn (A:Ἂ Word) (n:Nat) (h:n < 4294967296):aGt A (O2 n)=A[n]!:=by rw [aGt_eq,W3 (U1 h ς)] theorem uO {n:Nat} (h:n < 4294967296):(O2 n).toNat=n:=W3 (U1 h ς) theorem aUs {k:Ἄ} (h:k.toNat+1 < kX):(k+1).toNat=k.toNat+1:=by rw [lJ,mA]; exact γ h theorem aUd {ka ea:Ἄ} (h:ka < ea):ea.toNat-(ka+1).toNat < ea.toNat-ka.toNat:=by have h1:=ε.mp h rw [aUs (C0 h1 (Jx ea))] omega @[inline] def aJs (a b:Word) (Bm:ἆ):ἆ:= if Core.mW a*Core.mW b==0 then Bm else min Bm (iW a+iW b) def aJu (A B:Ἂ Word) (ka kb ea:Ἄ) (Bm:ἆ):ἆ:= if h:ka < ea then aJu A B (ka+1) (kb+1) ea (aJs (aGt A ka) (aGt B kb) Bm) else Bm termination_by ea.toNat-ka.toNat decreasing_by exact aUd h @[inline] def aDs (a b:Word) (Bm pH pL nH nL:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ):ἆ:= let m:=Core.mW a*Core.mW b let e:=iW a+iW b if expOf a==255||expOf b==255||m != 0&&(e < Bm||60 < e-Bm) then 4294967296 else if m==0 then k pH pL nH nL else let g:=signOf a==signOf b let q:=Dense.gd (if g then pH else nH) (if g then pL else nL) m (e-Bm) k (if g then q.1 else pH) (if g then q.2 else pL) (if g then nH else q.1) (if g then nL else q.2) theorem aGd0 (h l s:ἆ):Dense.gd h l 0 s=(h,l):=by simp [Dense.gd] @[inline] def aDs2 (a b:Word) (Bm pH pL nH nL:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ):ἆ:= let m:=Core.mW a*Core.mW b let e:=iW a+iW b if expOf a==255||expOf b==255||m != 0&&(e < Bm||60 < e-Bm) then 4294967296 else let g:=signOf a==signOf b let p:=Dense.gd pH pL (if g then m else 0) (e-Bm) let q:=Dense.gd nH nL (if g then 0 else m) (e-Bm) k p.1 p.2 q.1 q.2 theorem aDs2_eq (a b:Word) (Bm pH pL nH nL:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ): aDs2 a b Bm pH pL nH nL k=aDs a b Bm pH pL nH nL k:=by unfold aDs2 aDs dsimp only split · rfl · by_cases hm:(Core.mW a*Core.mW b==0)=true · have h0:Core.mW a*Core.mW b=0:=by simpa using hm rw [AD hm,h0] simp only [ite_self,aGd0] · rw [AC hm] cases signOf a==signOf b <;> simp only [aGd0,ἁ,ἂ,υ] def aDu (A B:Ἂ Word) (ka kb ea:Ἄ) (a1 b1 a2 b2:Word) (Bm pH pL nH nL:ἆ):ἆ:= if h:ka < ea then aDs2 (aGt A ka) (aGt B kb) Bm pH pL nH nL fun pH pL nH nL=>aDu A B (ka+1) (kb+1) ea a1 b1 a2 b2 Bm pH pL nH nL else aDs2 a1 b1 Bm pH pL nH nL fun pH pL nH nL=>aDs2 a2 b2 Bm pH pL nH nL fun pH pL nH nL=> au (pH-nH-(if pL < nL then 1 else 0)) (pL-nL) Bm termination_by ea.toNat-ka.toNat decreasing_by exact aUd h theorem aDls (fa fb:Nat → Word) (n:Nat) (Bm:ἆ) (t:Nat) (ht:t < n) (pH pL nH nL:ἆ): Dense.dl fa fb n Bm t pH pL nH nL=aDs (fa t) (fb t) Bm pH pL nH nL fun pH pL nH nL=>Dense.dl fa fb n Bm (t+1) pH pL nH nL:=by rw [Dense.dl,AD ht]; rfl theorem aDle (fa fb:Nat → Word) (n:Nat) (Bm:ἆ) (t:Nat) (ht:¬ t < n) (pH pL nH nL:ἆ): Dense.dl fa fb n Bm t pH pL nH nL=au (pH-nH-(if pL < nL then 1 else 0)) (pL-nL) Bm:=by rw [Dense.dl,AC ht] theorem aJgs (fa fb:Nat → Word) (n t:Nat) (ht:t < n) (Bm:ἆ): Dense.jG fa fb n t Bm=Dense.jG fa fb n (t+1) (aJs (fa t) (fb t) Bm):=by rw [Dense.jG,AD ht]; rfl theorem aJge (fa fb:Nat → Word) (n t:Nat) (ht:¬ t < n) (Bm:ἆ):Dense.jG fa fb n t Bm=Bm:=by rw [Dense.jG,AC ht] theorem aFn (A:Ἂ Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 n=a1:=by simp [fA] theorem aFm (A:Ἂ Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 (n+1)=a2:=by simp [fA] theorem aFl (A:Ἂ Word) (ao n:Nat) (a1 a2:Word) (t:Nat) (h:t < n):fA A ao n a1 a2 t=A[ao+t]!:=by simp [fA,h] theorem aJu_eq (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:Ἄ) (hA:A.size < kX) (hB:B.size < kX) (he:ea.toNat=ao+n) (hb:bo+n < kX): ∀ k t (ka kb:Ἄ) Bm,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aJs a2 b2 (aJs a1 b1 (aJu A B ka kb ea Bm))=Dense.jG (fA A ao n a1 a2) (fA B bo n b1 b2) (n+2) t Bm:=by have hs:=Jx ea intro k induction k with | zero => intro t ka kb Bm hk ht h1 h2 obtain rfl:t=n:=by omega have h0:¬ ka < ea:=by rw [ε,h1,he]; exact N4 _ rw [aJu,dite_eq_right h0,aJgs _ _ _ _ (by omega),aJgs _ _ _ _ (by omega),aJge _ _ _ _ (by omega), aFn,aFn,aFm,aFm] | succ k ih => intro t ka kb Bm hk ht h1 h2 have htn:t < n:=by omega have h0:ka < ea:=by rw [ε,h1,he]; omega rw [aJu,AT h0,aJgs _ _ _ _ (by omega),aGt_eq A ka,aGt_eq B kb,h1,h2, aFl _ _ _ _ _ _ htn,aFl _ _ _ _ _ _ htn] exact ih (t+1) (ka+1) (kb+1) _ (by omega) (by omega) (by rw [aUs (by omega),h1]; rfl) (by rw [aUs (by omega),h2]; rfl) theorem aDu_eq (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:Ἄ) (Bm:ἆ) (hA:A.size < kX) (hB:B.size < kX) (he:ea.toNat=ao+n) (hb:bo+n < kX): ∀ k t (ka kb:Ἄ) pH pL nH nL,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aDu A B ka kb ea a1 b1 a2 b2 Bm pH pL nH nL=Dense.dl (fA A ao n a1 a2) (fA B bo n b1 b2) (n+2) Bm t pH pL nH nL:=by have hs:=Jx ea intro k induction k with | zero => intro t ka kb pH pL nH nL hk ht h1 h2 obtain rfl:t=n:=by omega have h0:¬ ka < ea:=by rw [ε,h1,he]; exact N4 _ rw [aDu,dite_eq_right h0]; simp only [aDs2_eq]; rw [aDls _ _ _ _ _ (by omega),aFn,aFn] simp only [aDls _ _ (t+2) Bm (t+1) (by omega),aDle _ _ (t+2) Bm (t+2) (by omega),aFm] | succ k ih => intro t ka kb pH pL nH nL hk ht h1 h2 have htn:t < n:=by omega have h0:ka < ea:=by rw [ε,h1,he]; omega rw [aDu,AT h0]; simp only [aDs2_eq]; rw [aDls _ _ _ _ _ (by omega),aGt_eq A ka,aGt_eq B kb,h1,h2, aFl _ _ _ _ _ _ htn,aFl _ _ _ _ _ _ htn] have e:=fun pH pL nH nL=>ih (t+1) (ka+1) (kb+1) pH pL nH nL (by omega) (by omega) (by rw [aUs (by omega),h1]; rfl) (by rw [aUs (by omega),h2]; rfl) simp only [e] @[inline] def ad2x (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let r:=if n+2 < 262144∧A.size ≤ 4294967295∧B.size ≤ 4294967295∧ao+n ≤ 4294967295∧bo+n ≤ 4294967295 then aDu A B (O2 ao) (O2 bo) (O2 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 (aJu A B (O2 ao) (O2 bo) (O2 (ao+n)) 1023))) 0 0 0 0 else 4294967296 if r < 4294967296 then N3 r else dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2) theorem ad2x_eq (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word): ad2x A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2):=by unfold ad2x by_cases h:n+2 < 262144∧A.size ≤ 4294967295∧B.size ≤ 4294967295∧ao+n ≤ 4294967295∧bo+n ≤ 4294967295 · rw [AD h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=ς have hA':A.size < kX:=by omega have hB':B.size < kX:=by omega have he:(O2 (ao+n)).toNat=ao+n:=W3 (by omega) have h1:(O2 ao).toNat=ao+0:=W3 (by omega) have h2:(O2 bo).toNat=bo+0:=W3 (by omega) rw [aJu_eq A B ao bo n a1 b1 a2 b2 _ hA' hB' he (by omega) n 0 _ _ 1023 (by omega) (by omega) h1 h2, aDu_eq A B ao bo n a1 b1 a2 b2 _ _ hA' hB' he (by omega) n 0 _ _ 0 0 0 0 (by omega) (by omega) h1 h2] have g:=Dense.bO (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2) unfold Dense.gf at g rw [AD h0] at g exact g · rw [AC h]; rfl theorem aDok (fa fb:Nat → Word) (N:Nat) (Bm:ἆ) (g:N < 262144) (h:Dense.dl fa fb N Bm 0 0 0 0 0 < 4294967296):dotOf N fa fb=N3 (Dense.dl fa fb N Bm 0 0 0 0 0):= Dense.fE fa fb N Bm (by exact D7 g) _ 0 0 0 0 0 rfl (by exact ϟ N) (λ_ h=>absurd h (by (clear * - h;omega))) ((by simp)) ((by simp)) (by simp[af]) h @[inline] def ad4 (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let r:=if n+2 < 262144∧A.size ≤ 4294967295∧B.size ≤ 4294967295∧ao+n ≤ 4294967295∧bo+n ≤ 4294967295 then aDu A B (O2 ao) (O2 bo) (O2 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 g)) 0 0 0 0 else 4294967296 if r < 4294967296 then N3 r else ad2x A B ao bo n a1 b1 a2 b2 theorem ad4_eq (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word): ad4 g A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2):=by unfold ad4 by_cases h:n+2 < 262144∧A.size ≤ 4294967295∧B.size ≤ 4294967295∧ao+n ≤ 4294967295∧bo+n ≤ 4294967295 · rw [AD h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=ς have hA':A.size < kX:=by omega have hB':B.size < kX:=by omega have he:(O2 (ao+n)).toNat=ao+n:=W3 (by omega) have h1:(O2 ao).toNat=ao+0:=W3 (by omega) have h2:(O2 bo).toNat=bo+0:=W3 (by omega) rw [aDu_eq A B ao bo n a1 b1 a2 b2 _ _ hA' hB' he (by omega) n 0 _ _ 0 0 0 0 (by omega) (by omega) h1 h2] dsimp only split · rename_i hr; exact (aDok _ _ _ _ h0 hr).symm · exact ad2x_eq A B ao bo n a1 b1 a2 b2 · rw [AC h]; exact ad2x_eq A B ao bo n a1 b1 a2 b2 theorem gqT (a b:Word):|(tm a b:ℝ)| ≤ 2^(48+idxOf a+idxOf b):=by have A:∀ w:Word,|(sv w:ℝ)| ≤ 2^24:=fun w=>(show |(sv w:ℝ)|=mantOf w by unfold sv; split_ifs <;> simp).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) unfold tm; push_cast calc |(sv a:ℝ)*sv b*2^(idxOf a+idxOf b)|=|(sv a:ℝ)| * |(sv b:ℝ)| * 2^(idxOf a+idxOf b):=by rw [Ae,Ae,AW (show (0:ℝ) < 2^(idxOf a+idxOf b) by positivity)] _ ≤ 2^24*2^24*2^(idxOf a+idxOf b):=by gcongr <;> exact A _ _=2^(48+idxOf a+idxOf b):=by rw [← AF,← AF]; congr 1; omega theorem gqI {w:Word} (h:idxOf w ≤ 253):expOf w≠255:=by intro e; simp [idxOf,e] at h theorem gqE {w:Word} (h:(expOf w).toNat ≤ 254):expOf w≠255:=by intro e; simp [e] at h theorem gqL (p:ℕ → Ἅ) (n:ℕ):∀ k t a,n-t=k → t ≤ n → Dense.F.ao p (n+1) t a=Dense.F.ao p n t a+p n:=by intro k; induction k with | zero => intro t a hk ht; obtain rfl:t=n:=by omega rw [aos _ _ _ _ (U4 t),aoe _ _ _ _ AP,aoe _ _ _ _ AP] | succ k ih => intro t a hk ht; have h:t < n:=by omega rw [aos _ _ _ _ (by omega),aos _ _ _ _ h]; exact ih (t+1) _ (by omega) h @[noinline] def gqY (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad2x A B ao bo n a1 b1 a2 b2 @[noinline] def gqX (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad4 g A B ao bo n a1 b1 a2 b2 theorem gqH {A:ἀ} {i:Ἄ} (h:i < A.usize):i.toNat < A.size:=by have:=ε.mp h rw [FloatArray.usize,lX,X9] at this exact U1 this (Ay _ _) @[inline] def gqF (A:ἀ) (i:Ἄ):Ἅ:=if h:i < A.usize then A.uget i (gqH h) else 0 theorem gqV (A:ἀ) (i:Ἄ) (hA:A.size < kX) (h:i.toNat < A.size):gqF A i=A.data[i.toNat]!:=by have g:i < A.usize:=by rw [ε,FloatArray.usize,lX,X9,γ hA]; exact h unfold gqF; rw [AT g] rcases A with ⟨d⟩ simp only [nN] exact (AB d i.toNat h).symm def gqS (X W:ἀ) (i j e:Ἄ) (v:Ἅ):Ἅ:= if h:i < e then gqS X W (i+1) (j+1) e (v+gqF X i*gqF W j) else v termination_by e.toNat-i.toNat decreasing_by exact aUd h theorem gqS_eq (X W:ἀ) (p:ℕ → Ἅ) (xo wo n:ℕ) (e:Ἄ) (hX:X.size < kX) (hW:W.size < kX) (he:e.toNat=xo+n) (hx:xo+n ≤ X.size) (hw:wo+n ≤ W.size) (hp:∀ s < n,p s=X.data[xo+s]!*W.data[wo+s]!) : ∀ k t (i j:Ἄ) v,n-t=k → t ≤ n → i.toNat=xo+t → j.toNat=wo+t → gqS X W i j e v=Dense.F.ao p n t v:=by intro k; induction k with | zero => intro t i j v hk ht h1 h2; obtain rfl:t=n:=by omega have h0:¬ i < e:=by rw [ε,h1,he]; omega rw [gqS,dite_eq_right h0,aoe _ _ _ _ AP] | succ k ih => intro t i j v hk ht h1 h2 have htn:t < n:=by omega have h0:i < e:=by rw [ε,h1,he]; omega rw [gqS,AT h0,aos _ _ _ _ htn,gqV X i hX (by omega),gqV W j hW (by omega),h1,h2,← hp t htn] exact ih (t+1) (i+1) (j+1) _ (by omega) (by omega) (by rw [aUs (by omega),h1]; rfl) (by rw [aUs (by omega),h2]; rfl) def gqD (A:Ἂ Word):ἀ:=A.foldl (fun r w=>r.push (dw w)) (kJ A.size) theorem gqD_s (A:Ἂ Word):(gqD A).size=A.size∧∀ q < A.size,(gqD A).data[q]! =dw A[q]!:=by unfold gqD apply Vs (motive:=fun i (r:ἀ)=>r.size=i∧∀ q < i,r.data[q]! =dw A[q]!) · exact ⟨rfl,fun q h=>absurd h (C5 _)⟩ · intro i r ⟨h1,h2⟩ refine ⟨by rw [bW,h1],fun q hq=>?_⟩ rw [s5push_get] rcases S9.1 hq with hq|rfl · rw [AD (h1 ▸ hq)]; exact h2 _ hq · rw [AC (by omega),AD h1.symm,AB A _ i.2]; rfl def gqM (A:Ἂ Word):Nat:=A.foldl (fun m w=>max m (idxOf w)) 0 theorem gqM_le (A:Ἂ Word) (q:Nat):idxOf A[q]! ≤ gqM A:=by by_cases hq:q < A.size · exact Vs (as:=A) (motive:=fun i (m:Nat)=>∀ q < i,idxOf A[q]! ≤ m) (fun q h=>absurd h (C5 _)) (fun i m h q hq=>by rcases S9.1 hq with hq|rfl · exact (h q hq).trans (le_max_left _ _) · rw [AB A _ i.2]; exact le_max_right _ _) q hq · rw [An A q hq,show idxOf (default:Word)=0 by decide]; exact ϟ _ def gqN (A:Ἂ Word):Nat:=A.foldl (fun m w=>max m (expOf w).toNat) 0 theorem gqN_le (A:Ἂ Word) (q:Nat):(expOf A[q]!).toNat ≤ gqN A:=by by_cases hq:q < A.size · exact Vs (as:=A) (motive:=fun i (m:Nat)=>∀ q < i,(expOf A[q]!).toNat ≤ m) (fun q h=>absurd h (C5 _)) (fun i m h q hq=>by rcases S9.1 hq with hq|rfl · exact (h q hq).trans (le_max_left _ _) · rw [AB A _ i.2]; exact le_max_right _ _) q hq · rw [An A q hq,show (expOf (default:Word)).toNat=0 by decide]; exact ϟ _ def gMn (A:Ἂ Word) (k e:Ἄ) (m:ἆ):ἆ:= if h:k < e then gMn A (k+1) e (let a:=aGt A k; if a&&&0x7FFFFFFF==0 then m else min m (iW a)) else m termination_by e.toNat-k.toNat decreasing_by exact aUd h @[noinline] def gG (inW H:Nat) (x wih:Ἂ Word):ἆ:= gMn x 0 x.usize 511+gMn wih (O2 (2*H*inW)) (O2 (3*H*inW)) 511 @[inline] def aKd {n:Nat} (f:Fin n → Word):Ἂ Word:=da (fun i=>if h:i < n then f ⟨i,h⟩ else 0) n (lQ n) theorem aKd_eq {n:Nat} (f:Fin n → Word):aKd f=kK f:=by unfold aKd; rw [iC]; congr 1; funext q; exact AT q.isLt @[inline] def xh1 (inW H:Nat) (x h:Ἂ Word) (t:Nat):Ἂ Word := let ti:=O2 (t*inW) let iU:=O2 inW aKd (n:=inW+H+1) fun j => let jU:=O2 j.val if j.val < inW then aGt x (ti+jU) else if j.val < inW+H then aGt h (jU-iU) else oneW def wcat (G inW H:Nat) (wih whh bih:Ἂ Word):Ἂ Word := Array.ofFn (n:=G*H*(inW+H+1)) fun q => if q.val%(inW+H+1) < inW then wih[q.val/(inW+H+1)*inW+q.val%(inW+H+1)]! else if q.val%(inW+H+1) < inW+H then whh[q.val/(inW+H+1)*H+(q.val%(inW+H+1)-inW)]! else bih[q.val/(inW+H+1)]! def wsub (H:Nat) (whh:Ἂ Word):Ἂ Word := aKd (n:=H*H) fun q=>whh[2*H*H+q.val]! def bsub (H:Nat) (bhh:Ἂ Word):Ἂ Word := aKd (n:=H) fun q=>bhh[2*H+q.val]! def oneA:Ἂ Word := #[oneW] @[inline] def mulN (a b:Word):Word := if (expOf a != 255&&expOf b != 255)=true then (lx a*lx b).toBits else toWord (Model.mul (ofW a) (ofW b)) theorem mulN_eq (a b:Word):mulN a b=toWord (Model.mul (ofW a) (ofW b)):=by unfold mulN; split · rename_i h simp only [Η,AM,Ak] at h have g:=Bn.NativeAdd.bK a h.1 have j:=Bn.NativeAdd.bK b h.2 have e:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32_mul_of_isFinite (lx a) (lx b) g.2 j.2 simp only [FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32,Bn.NativeAdd.en,g.1,j.1] at e have E:=congrArg toWord e rw [← Bn.NativeAdd.en,Bn.NativeAdd.ja] at E exact E · rfl @[inline] def wcF (k:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἂ Word := wcat k.1.1 k.1.2.1 k.1.2.2 k.2.1 k.2.2.1 k.2.2.2 @[inline] def wcEq (a b:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἆ := a.1==b.1&&wcAeq a.2.1 b.2.1&&wcAeq a.2.2.1 b.2.2.1&&wcAeq a.2.2.2 b.2.2.2 theorem wcEq_ok (a b:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word) (h:wcEq a b=true):a=b:=by obtain ⟨a1,a2,a3,a4⟩:=a; obtain ⟨b1,b2,b3,b4⟩:=b simp only [wcEq,Η,AQ] at h obtain ⟨⟨⟨h1,h2⟩,h3⟩,h4⟩:=h rw [h1,wcAeq_ok h2,wcAeq_ok h3,wcAeq_ok h4] @[noinline] def wcS:ST.Ref Unit (Ἂ (WcE wcF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wcG (G inW H:Nat) (wih whh bih:Ἂ Word):Ἂ Word := (wcGet3 wcEq wcEq_ok wcS 32 ((G,inW,H),wih,whh,bih) (fun k=>k.2.1)).1 theorem wcG_v (G inW H:Nat) (wih whh bih:Ἂ Word):wcG G inW H wih whh bih=wcat G inW H wih whh bih:= s5wcGet3_val _ @[inline] def wbF (k:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word:=(wsub k.1.1 k.2.1,bsub k.1.1 k.2.2.1) @[noinline] def wbS:ST.Ref Unit (Ἂ (Dense.F.WcE wbF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wbG (H:Nat) (whh bhh:Ἂ Word):Ἂ Word × Ἂ Word:=(Dense.F.wcGet3 wcEq wcEq_ok wbS 32 ((H,0,0),whh,bhh,#[]) (fun k=>k.2.1)).1 theorem wbG_v (H:Nat) (whh bhh:Ἂ Word):wbG H whh bhh=(wsub H whh,bsub H bhh):=Dense.F.s5wcGet3_val _ @[inline] def wdF (k:Ἂ Word):ἀ:=gqD k @[noinline] def wdS:ST.Ref Unit (Ἂ (Dense.F.WcE wdF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wdG (A:Ἂ Word):ἀ:=(Dense.F.wcGet3 Dense.F.wcAeq (fun _ _ h=>Dense.F.wcAeq_ok h) wdS 32 A (fun k=>k)).1 theorem wdG_v (A:Ἂ Word):wdG A=gqD A:=Dense.F.s5wcGet3_val _ @[specialize] def rcL (T H:Nat) (step:Nat → Ἂ Word × Ἂ Word → Ἂ Word × Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word) (out:Ἂ Word):Ἂ Word:= if t < T then let s:=step t st rcL T H step (t+1) s (out++s.1) else out termination_by T-t theorem rcL_eq (T H:Nat) (step f:Nat → Ἂ Word × Ἂ Word → Ἂ Word × Ἂ Word) (st0:Ἂ Word × Ἂ Word) (hf:∀ t < T,∀ st,step t st=f t st) (hs:∀ t st,(f t st).1.size=H) : rcL T H step 0 st0 (lQ (T*H))=recurWith T H f st0:=by let g:=fun (acc:(Ἂ Word × Ἂ Word) × Ἂ (Ἂ Word)) t=> ((f t acc.1,acc.2.push (f t acc.1).1):(Ἂ Word × Ἂ Word) × Ἂ (Ἂ Word)) let F:=fun n=>(lj n).foldl g (st0,#[]) have Fs:∀ n,F (n+1)=g (F n) n:=fun n=>by simp only [F,mD,l6,Ϸ,mT] have Fz:∀ n,(F n).2.size=n:=by intro n; induction n with | zero=>rfl | succ n ih=>rw [Fs]; simp [g,ih] have Fp:∀ n i,i < n → (F n).2[i]?=some (f i (F i).1).1:=by intro n; induction n with | zero=>intro i h; omega | succ n ih => intro i h rw [Fs]; simp only [g]; rw [Array.getElem?_push,Fz] by_cases hi:i=n · subst hi; simp · rw [AC hi]; exact ih i (by omega) have key:∀ k t (out:Ἂ Word),T-t=k → t ≤ T → out.size=t*H → (∀ q < t*H,out[q]?=some (((F T).2[q/H]!)[q%H]!)) → rcL T H step t (F t).1 out=kK (n:=T*H) fun q=>((F T).2[q.val/H]!)[q.val%H]!:=by intro k; induction k with | zero => intro t out hk ht h1 hq obtain rfl:t=T:=by omega rw [rcL,AC (N4 _)] apply mi · simp [h1] · intro i i1 i2 have:=hq i (by omega) rw [lC i1] at this simp only [Λ] exact pj.inj this | succ k ih => intro t out hk ht h1 hq have htT:t < T:=by omega rw [rcL,AD htT]; dsimp only have e1:f t (F t).1=(F (t+1)).1:=by rw [Fs] have a1:=hs t (F t).1 rw [e1] at a1 rw [hf t htT,e1] refine ih (t+1) _ (by omega) (by omega) (by rw [Ky,a1,h1,Ο]) (fun q q1=>?_) rw [Array.getElem?_append] split · exact hq q (by omega) · rename_i q2 rw [h1] at q2 have hqt:q/H=t:=mG (by omega) q1 have hqm:q%H=q-out.size:=by have:=ϛ q H; rw [hqt,Ϗ] at this; rw [h1]; omega have hp:=Fp T t htT rw [lC (by rw [Fz]; exact htT)] at hp rw [Ο] at q1 rw [hqt,hqm,AB (F T).2 t (by rw [Fz]; exact htT),pj.inj hp,e1, lC (by rw [a1,h1]; omega),AB _ _ (by rw [a1,h1]; omega)] rw [recurWith] have h0:=key T 0 (lQ (T*H)) (by omega) (ϟ _) (by simp) (fun q h=>by omega) simpa [F] using h0 theorem gofn {n:Nat} (f:Fin n → Word) (i:Nat) (h:i < n) : (kK f)[i]! = f ⟨i,h⟩:=by rw [AB (kK f) i (by simpa using h)] simp theorem dotOf_congr {n m:Nat} (hnm:n=m) {fa fb ga gb:Nat → Word} (ha : ∀ j,j < n → fa j=ga j) (hb : ∀ j,j < n → fb j=gb j) : dotOf n fa fb=dotOf m ga gb:=by subst hnm unfold dotOf have e1:(kK (n:=n) fun i=>fa i.val)=kK (n:=n) fun i=>ga i.val := congrArg kK (funext fun i=>ha i.val i.isLt) have e2:(kK (n:=n) fun i=>fb i.val)=kK (n:=n) fun i=>gb i.val := congrArg kK (funext fun i=>hb i.val i.isLt) rw [e1,e2] @[inline] def exU (w:Word):ἆ:=(expOf w).toUInt64 @[inline] def ixU (w:Word):ἆ:=let e:=exU w; if e==0 then 0 else e-1 @[inline] def mxE (e:ἆ):ἆ:=if e < 56 then 55 else e-1 theorem xU (w:Word):(exU w).toNat=(expOf w).toNat∧(ixU w).toNat=idxOf w∧(expOf w).toNat < 256∧idxOf w < 256:=by have h:=expOf_toNat_lt w refine ⟨ϩ _,?_,h,by unfold idxOf; split <;> omega⟩ unfold ixU idxOf exU; dsimp only by_cases e:expOf w=0 · simp [e] · have:(expOf w).toNat≠0:=fun x=>e (Β.1 (by simpa using x)) have h2:(expOf w).toUInt64≠0:=fun x=>this (by have:=congrArg lq x; simpa using this) rw [AC e,AC (by simpa using h2),χ _ _ (by rw [θ]; simp; omega)]; simp theorem mxU (e:ἆ):(mxE e).toNat=max (e.toNat-1) 55:=by unfold mxE; split <;> rename_i h <;> rw [μ] at h · simp at h ⊢; omega · rw [χ _ _ (by rw [θ]; simp at h ⊢; omega)]; simp at h ⊢; omega @[inline] def wk (c:Ἆ) (P0 L:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word):Word:= let P:=max P0 (48+ixU a+ixU b) if c&&exU a != 255&&exU b != 255&&P+L ≤ 425 then let o:=Dense.F.ak (S+Dense.F.dw a*Dense.F.dw b) (P+2*L-54) if o < 4294967296 then o.toUInt32 else f () else f () theorem afR (n:ℕ) (d e:ℕ → Word):Core.af (n+1) (fun s=>d ((s+1)%(n+1))) (fun s=>e ((s+1)%(n+1)))=Core.af (n+1) d e:=by unfold Core.af rw [Ν,lV] simp only [Nat.mod_self] congr 1 exact ϔ rfl fun s hs=>by rw [γ (by simp at hs; omega)] def aoR (d e:ℕ → Word) (n:ℕ):Ἅ:=Dense.F.ao (fun s=>Dense.F.dw (d (s+1))*Dense.F.dw (e (s+1))) n 0 (Dense.F.dw (d 0)*Dense.F.dw (e 0)) theorem wk_eq (n i E:ℕ) (d e:ℕ → Word) (c:Ἆ) (P0 L:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word) (ha:d (n+1)=a) (hb:e (n+1)=b) (hS:c=true → S=aoR d e n) (hc:c=true → (∀ s ≤ n,idxOf (d s) ≤ i∧(expOf (e s)).toNat ≤ E)∧i ≤ 253∧E ≤ 254∧P0.toNat=48+i+max (E-1) 55∧n+3 ≤ 2^L.toNat∧L.toNat ≤ 27) (hf:f ()=dotOf (n+2) d e):wk c P0 L a b S f=dotOf (n+2) d e:=by subst ha hb unfold wk; dsimp only split · rename_i h simp only [Η,AM,Ak,AJ] at h obtain ⟨⟨⟨h1,h2⟩,h3⟩,h4⟩:=h obtain ⟨hd,hi,hE,hP,hN,hL⟩:=hc h1 obtain ⟨a1,a2,a3,a4⟩:=xU (d (n+1)); obtain ⟨b1,b2,b3,b4⟩:=xU (e (n+1)) have hQ:(max P0 (48+ixU (d (n+1))+ixU (e (n+1)))).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1))):=by simp only [Zz,η,a2,b2,hP]; simp; omega generalize max P0 (48+ixU (d (n+1))+ixU (e (n+1)))=P at hQ h4 ⊢ rw [θ,η,hQ] at h4; simp at h4 split · rename_i ho have q:=gqL (fun s=>Dense.F.dw (d (s+1))*Dense.F.dw (e (s+1))) n n 0 (Dense.F.dw (d 0)*Dense.F.dw (e 0)) (by omega) (ϟ _) rw [hS h1,aoR,← q] at ho ⊢ have hE':(lA E).toNat=E:=UInt32.toNat_ofNat_of_lt' (by unfold UInt32.size; omega) have K:=Dense.F.kHG (n+1) d e (lA E) i (48+idxOf (d (n+1))+idxOf (e (n+1))) (fun s hs=>(hd s (by omega)).1) (fun s hs=>by rw [hE']; exact (hd s (by omega)).2) (gqT _ _) rw [hE'] at K have g:Core.aG (n+2) d e:=fun k hk=>by rcases S9.1 hk with hk|rfl · exact ⟨gqI ((hd k (by omega)).1.trans hi),gqE ((hd k (by omega)).2.trans hE)⟩ · exact ⟨fun x=>h2 (ξ.1 (by rw [a1,x]; rfl)),fun x=>h3 (ξ.1 (by rw [b1,x]; rfl))⟩ obtain ⟨fS,rS⟩:=Dense.F.kE1 (n+1) (fun s=>d ((s+1)%(n+1+1))) (fun s=>e ((s+1)%(n+1+1))) _ _ _ L.toNat (fun s hs=>by rw [γ (by omega)]; exact Dense.F.dJ _ _ (g _ (by omega)).1 (g _ (by omega)).2) (by rw [Nat.mod_self]; exact Dense.F.dJ _ _ (g 0 (by omega)).1 (g 0 (by omega)).2) (fun s hs=>K _ (by have:=ϊ (s+1) (show n+1+1>0 by omega); omega)) (by omega) hL (by omega) rw [afR] at rS have hA:|(Core.af (n+1+1) d e:ℝ)| ≤ (2:ℝ)^(425:ℤ):=by rw [Core.aK,Qj,Core.af,Jg,add_comm] refine (Dense.F.cv (n+1) _ _ _ (fun s M=>K s M.le) (K (n+1) AP) (n+1) AP).trans ?_ have y:((n+1:ℕ):ℝ)+1 ≤ 2^L.toNat:=by exact_mod_cast (show n+1+1 ≤ 2^L.toNat by omega) refine (AE y (pow_nonneg zero_le_two _)).trans ?_ rw [← AF,← AA]; exact AG one_le_two (by omega) have hq:(P+2*L-54).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1)))+2*L.toNat-54:=by have:(P+2*L).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1)))+2*L.toNat:=by rw [η,ύ,hQ]; simp; omega rw [χ _ _ (by rw [θ,this]; simp; omega),this]; simp exact Dense.F.cw (n+2) d e g _ fS _ (by rw [hq]; omega) (by rw [hq]; exact rS) hA ho · exact hf · exact hf @[inline] def wk2 (i e:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word):Word:=wk (i ≤ 253&&e ≤ 254) (48+i+mxE e) 2 a b S f theorem wk2_eq (n:ℕ) (d e:ℕ → Word) (iU eU:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word) (ha:d (n+1)=a) (hb:e (n+1)=b) (hS:S=aoR d e n) (hd:∀ s ≤ n,idxOf (d s) ≤ iU.toNat∧(expOf (e s)).toNat ≤ eU.toNat) (he:eU.toNat < 256) (hn:n ≤ 1) (hf:f ()=dotOf (n+2) d e):wk2 iU eU a b S f=dotOf (n+2) d e:= wk_eq n iU.toNat eU.toNat d e _ _ _ a b S f ha hb (fun _=>hS) (fun h=>by simp only [Η,AJ,θ,kA] at h refine ⟨hd,h.1,h.2,?_,by simp only [kA]; omega,by simp only [kA]; omega⟩ rw [η,η,mxU]; simp; omega) hf @[inline] def cl2 (a1 b1 a2 b2:Word):Word:= wk2 (ixU a1) (exU b1) a2 b2 (Dense.F.dw a1*Dense.F.dw b1) fun _=>gqY #[] #[] 0 0 0 a1 b1 a2 b2 theorem cl2_eq (a1 b1 a2 b2:Word):cl2 a1 b1 a2 b2=dotOf 2 (fun j=>if j=0 then a1 else a2) (fun j=>if j=0 then b1 else b2):= wk2_eq 0 _ _ _ _ _ _ _ _ rfl rfl (by rw [aoR,Dense.F.aoe _ _ _ _ AP]; rfl) (fun s hs=>by obtain rfl:s=0:=by omega exact ⟨(xU a1).2.1.ge,(xU b1).1.ge⟩) (by rw [(xU b1).1]; exact expOf_toNat_lt b1) (by omega) (by unfold gqY; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j hj <;> simp [fA]) @[inline] def gqU2 (D1:Ἅ) (n z h:Word):Word:= let dn:=Dense.F.dw n wk2 (ixU n) (max 127 (exU (negW z))) h z (dn*D1+dn*Dense.F.dw (negW z)) fun _=>gqY #[n] oneA 0 0 1 n (negW z) h z theorem gqU2_eq (n z h:Word):gqU2 (Dense.F.dw oneW) n z h=dotOf 3 (fun j=>if j=2 then h else n) (fun j=>if j=0 then oneW else if j=1 then negW z else z):= wk2_eq 1 _ _ _ _ _ _ _ _ rfl rfl (by rw [aoR,Dense.F.aos _ _ _ _ (by omega),Dense.F.aoe _ _ _ _ AP]; rfl) (fun s hs=>by have:(expOf oneW).toNat=127:=by decide rcases (by omega:s=0∨s=1) with rfl|rfl <;> simp [(xU n).2.1,(xU (negW z)).1,Zz,this]) (by rw [Zz,(xU _).1]; have:=expOf_toNat_lt (negW z); simp; omega) (by omega) (by unfold gqY; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j hj <;> rcases (by omega:j=0∨j=1∨j=2) with rfl|rfl|rfl <;> simp [fA,oneA]) @[inline] def lstmTail (sig tanh:Word → Word) (H:Nat) (pre cs:Ἂ Word):Ἂ Word × Ἂ Word := let HU:=O2 H let H2:=O2 (2*H) let H3:=O2 (3*H) let cell:=aKd (n:=H) fun u => let uU:=O2 u.val cl2 (sig (aGt pre (HU+uU))) (aGt cs uU) (sig (aGt pre uU)) (tanh (aGt pre (H2+uU))) let hidden:=aKd (n:=H) fun u => let uU:=O2 u.val mulN (sig (aGt pre (H3+uU))) (tanh (aGt cell uU)) (hidden,cell) @[inline] def lstmStep (lin:LinFn) (sig tanh:Word → Word) (inW H:Nat) (x Wc bhh:Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word := lstmTail sig tanh H (lin 1 (inW+H+1) (4*H) false (xh1 inW H x st.1 t) Wc bhh) st.2 @[specialize] def lstmK (lin:LinFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := if T*inW+inW+4*H < 4294967296 then rcL T H (lstmStep lin sig tanh inW H x (wcG 4 inW H wih whh bih) bhh) 0 (mB H 0,mB H 0) (lQ (T*H)) else lstmWith dotOf sig tanh T inW H x wih whh bih bhh def gqB2 (D1:Ἅ) (bih:Ἂ Word) (H:Nat):ἀ:=⟨kK (n:=H) fun u=>D1*Dense.F.dw bih[2*H+u.val]!⟩ def sx4 (X W B:ἀ) (u i e j0 j1 j2 j3:Ἄ) (a0 a1 a2 a3:Ἅ) (out:ἀ):ἀ:= if h:i < e then let x:=gqF X i sx4 X W B u (i+1) e (j0+1) (j1+1) (j2+1) (j3+1) (a0+x*gqF W j0) (a1+x*gqF W j1) (a2+x*gqF W j2) (a3+x*gqF W j3) out else (((out.push (a0+gqF B u)).push (a1+gqF B (u+1))).push (a2+gqF B (u+2))).push (a3+gqF B (u+3)) termination_by e.toNat-i.toNat decreasing_by exact aUd h def gqP1 (X W B:ἀ) (iU wb xo:Ἄ) (H u:Nat) (out:ἀ):ἀ:= if u+4 ≤ H then let uU:=O2 u let w0:=wb+uU*iU let w1:=w0+iU let w2:=w1+iU let w3:=w2+iU let x0:=gqF X xo gqP1 X W B iU wb xo H (u+4) (sx4 X W B uU (xo+1) (xo+iU) (w0+1) (w1+1) (w2+1) (w3+1) (x0*gqF W w0) (x0*gqF W w1) (x0*gqF W w2) (x0*gqF W w3) out) else if u < H then let uU:=O2 u let w0:=wb+uU*iU gqP1 X W B iU wb xo H (u+1) (out.push (gqS X W (xo+1) (w0+1) (xo+iU) (gqF X xo*gqF W w0)+gqF B uU)) else out termination_by H-u def gqP (X W B:ἀ) (iU wb:Ἄ) (inW H T t:Nat) (out:ἀ):ἀ:= if t < T then gqP X W B iU wb inW H T (t+1) (gqP1 X W B iU wb (O2 (t*inW)) H 0 out) else out termination_by T-t @[inline] def gqK3 (Sx:ἀ) (P0 L:ἆ) (x wih bih:Ἂ Word) (inW H t:Nat) (ok:Ἆ) (tH:Ἄ) (u:Nat) (uU:Ἄ) (a b:Word):Word:= wk ok P0 L a b (gqF Sx (tH+uU)) fun _=>gqX (gG inW H x wih) x wih (t*inW) ((2*H+u)*inW) inW oneW bih[2*H+u]! a b @[inline] def gruStepF (lin:LinFn) (sig tanh:Word → Word) (inW H T:Nat) (x Wrz Whn bhn bhh:Ἂ Word) (D1:Ἅ) (cand:Nat → Ἆ → Ἄ → Nat → Ἄ → Word → Word → Word) (ok:Ἆ) (t:Nat) (st:Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word := let a:=lin 1 (inW+H+1) (2*H) false (xh1 inW H x st.1 t) Wrz bhh let hn:=lin 1 H H false st.1 Whn bhn let okt:=ok&&decide (t < T) let tH:=O2 (t*H) let HU:=O2 H (aKd (n:=H) fun u=> let uU:=O2 u.val gqU2 D1 (tanh (cand t okt tH u.val uU (aGt hn uU) (sig (aGt a uU)))) (sig (aGt a (HU+uU))) (aGt st.1 uU),st.2) @[specialize] def gruK (lin:LinFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := if T*inW+inW+4*H < 4294967296 then let ix:=max (gqM x) 126 let E:=max (gqN wih) (gqN bih) let L:=Aq (inW+3)+1 let Xd:=gqD x let Wd:=wdG wih let D1:=Dense.F.dw oneW let ok:=decide (ix ≤ 253∧E ≤ 254∧L ≤ 27∧0 < inW∧T*inW ≤ x.size∧3*H*inW ≤ wih.size∧x.size < 4294967296∧wih.size < 4294967296∧T*H < 4294967296) let Sx:=if ok then gqP Xd Wd (gqB2 D1 bih H) (O2 inW) (O2 (2*H*inW)) inW H T 0 (kJ (T*H)) else kJ 0 let wb:=wbG H whh bhh rcL T H (gruStepF lin sig tanh inW H T x (wcG 2 inW H wih whh bih) wb.1 wb.2 bhh D1 (gqK3 Sx (lh (48+ix+max (E-1) 55)) (lh L) x wih bih inW H) ok) 0 (mB H 0,#[]) (lQ (T*H)) else gruWith dotOf sig tanh T inW H x wih whh bih bhh theorem gqSs {X W:ἀ} {i e:Ἄ} (h:i < e) (j:Ἄ) (v:Ἅ):gqS X W i j e v=gqS X W (i+1) (j+1) e (v+gqF X i*gqF W j):=by rw [gqS,AT h] theorem gqSe {X W:ἀ} {i e:Ἄ} (h:¬ i < e) (j:Ἄ) (v:Ἅ):gqS X W i j e v=v:=by rw [gqS,dite_eq_right h] theorem sx4_eq (X W B:ἀ) (u e:Ἄ) (out:ἀ):∀ k (i j0 j1 j2 j3:Ἄ) (a0 a1 a2 a3:Ἅ),e.toNat-i.toNat=k → sx4 X W B u i e j0 j1 j2 j3 a0 a1 a2 a3 out=(((out.push (gqS X W i j0 e a0+gqF B u)).push (gqS X W i j1 e a1+gqF B (u+1))).push (gqS X W i j2 e a2+gqF B (u+2))).push (gqS X W i j3 e a3+gqF B (u+3)):=by intro k; induction k with | zero=> intro i j0 j1 j2 j3 a0 a1 a2 a3 hk have h:¬ i < e:=by rw [ε]; omega rw [sx4,dite_eq_right h]; simp only [gqSe h] | succ k ih=> intro i j0 j1 j2 j3 a0 a1 a2 a3 hk have h:i < e:=by rw [ε]; omega rw [sx4,AT h]; simp only [gqSs h] exact ih _ _ _ _ _ _ _ _ _ (by rw [aUs (by have:=Jx e; omega)]; omega) theorem pF {A:ἀ} {F:ℕ → Ἅ} {v:Ἅ} (h:∀ i < A.size,A.data[i]! = F i) (hv:v=F A.size) : ∀ i < (A.push v).size,(A.push v).data[i]! = F i:=fun i hi=>by rw [Dense.F.bW] at hi; rw [Dense.F.s5push_get]; split · exact h i ‹_› · rw [AD (by omega),hv]; congr 1; omega def gU (X W B:ἀ) (iU wb xo:Ἄ) (u:Nat):Ἅ:=gqS X W (xo+1) (wb+O2 u*iU+1) (xo+iU) (gqF X xo*gqF W (wb+O2 u*iU))+gqF B (O2 u) theorem gUs (X W B:ἀ) (iU wb xo w v:Ἄ) (u:Nat) (hw:w=wb+O2 u*iU) (hv:v=O2 u) : gU X W B iU wb xo u=gqS X W (xo+1) (w+1) (xo+iU) (gqF X xo*gqF W w)+gqF B v:=by rw [gU,hw,hv] theorem gqP1_s (X W B:ἀ) (iU wb xo:Ἄ) (H b0:Nat) (F:ℕ → Ἅ) (hF:∀ u < H,F (b0+u)=gU X W B iU wb xo u) : ∀ k u out,H-u=k → u ≤ H → out.size=b0+u → (∀ i < out.size,out.data[i]! = F i) → (gqP1 X W B iU wb xo H u out).size=b0+H∧∀ i < b0+H,(gqP1 X W B iU wb xo H u out).data[i]! = F i:=by intro k; induction k using Z5 with | _ k ih => intro u out hk hu hs ho rw [gqP1] split · dsimp only rw [sx4_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl] exact ih (k-4) (by omega) (u+4) _ (by omega) (by omega) (by simp only [Dense.F.bW,hs]; omega) (pF (pF (pF (pF ho (by rw [hs,hF u (by omega)]; rfl)) (by rw [Dense.F.bW,hs]; exact ((hF (u+1) (by omega)).trans (gUs _ _ _ _ _ _ _ _ _ (by simp only [mC]; grind) (by simp only [mC]; grind))).symm)) (by rw [Dense.F.bW,Dense.F.bW,hs]; exact ((hF (u+2) (by omega)).trans (gUs _ _ _ _ _ _ _ _ _ (by simp only [mC]; grind) (by simp only [mC]; grind))).symm)) (by rw [Dense.F.bW,Dense.F.bW,Dense.F.bW,hs]; exact ((hF (u+3) (by omega)).trans (gUs _ _ _ _ _ _ _ _ _ (by simp only [mC]; grind) (by simp only [mC]; grind))).symm)) · split · dsimp only exact ih (k-1) (by omega) (u+1) _ (by omega) (by omega) (by rw [Dense.F.bW,hs]; omega) (pF ho (by rw [hs,hF u (by omega)]; rfl)) · obtain rfl:u=H:=by omega exact ⟨hs,fun i h=>ho i (by omega)⟩ theorem gqP_s (X W B:ἀ) (iU wb:Ἄ) (inW H T:Nat) : ∀ k t out,T-t=k → t ≤ T → out.size=t*H → (∀ i < out.size,out.data[i]! = gU X W B iU wb (O2 (i/H*inW)) (i%H)) → (gqP X W B iU wb inW H T t out).size=T*H∧∀ i < T*H,(gqP X W B iU wb inW H T t out).data[i]! = gU X W B iU wb (O2 (i/H*inW)) (i%H):=by intro k; induction k with | zero=> intro t out hk ht hs ho; obtain rfl:t=T:=by omega rw [gqP,AC (by omega)]; exact ⟨hs,fun i h=>ho i (by omega)⟩ | succ k ih=> intro t out hk ht hs ho; rw [gqP,AD (by omega)] obtain ⟨a1,a2⟩:=gqP1_s X W B iU wb (O2 (t*inW)) H (t*H) _ (fun u hu=>by rw [Τ,Ρ _ _ (by omega),ώ hu,Κ,Μ,γ hu]) _ 0 out rfl (ϟ _) (by omega) ho exact ih (t+1) _ (by omega) (by omega) (by rw [a1,Ο]) (by rw [a1]; exact a2) theorem gqSx (x wih bih:Ἂ Word) (inW H T t u:Nat) (a b:Word) (ht:t < T) (hu:u < H) (h0:0 < inW) (hx:T*inW ≤ x.size) (hw:3*H*inW ≤ wih.size) (hx':x.size < 4294967296) (hw':wih.size < 4294967296) (hT:T*H < 4294967296) : gqF (gqP (gqD x) (gqD wih) (gqB2 (Dense.F.dw oneW) bih H) (O2 inW) (O2 (2*H*inW)) inW H T 0 (kJ (T*H))) (O2 (t*H)+O2 u)=aoR (fA x (t*inW) inW oneW a) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! b) inW:=by have s:=ς obtain ⟨s1,s2⟩:=gqP_s (gqD x) (gqD wih) (gqB2 (Dense.F.dw oneW) bih H) (O2 inW) (O2 (2*H*inW)) inW H T T 0 (kJ (T*H)) (by omega) (ϟ _) (by rw [ϳ]; rfl) (fun i h=>absurd h (C5 _)) have q:t*H+u < T*H:=by have:=ι H (show t+1 ≤ T by omega); rw [Ο] at this; omega have dm:(t*H+u)/H=t∧(t*H+u)%H=u:=⟨by rw [Τ,Ρ _ _ (by omega),ώ hu,Κ], by rw [Τ,Μ,γ hu]⟩ rw [← mC,gqV _ _ (by omega) (by rw [uO (by omega),s1]; exact q),uO (by omega),s2 _ q,dm.1,dm.2,gU,aoR] obtain ⟨sx,vx⟩:=gqD_s x; obtain ⟨sw,vw⟩:=gqD_s wih have m1:t*inW+inW ≤ T*inW:=by rw [← Ο]; exact ι _ ht have m2:(2*H+u)*inW+inW ≤ 3*H*inW:=by rw [← Ο]; exact ι _ (by omega) have m3:H ≤ 3*H*inW:=(show H ≤ 3*H by omega).trans (U3 _ h0) have c1:(O2 (t*inW)).toNat=t*inW:=uO (by omega) have c2:(O2 (2*H*inW)+O2 u*O2 inW).toNat=(2*H+u)*inW:=by rw [← BP,← mC,← Ϡ]; exact uO (by omega) obtain ⟨m,rfl⟩:∃ m,inW=m+1:=⟨inW-1,by omega⟩ rw [gqL _ m m 0 _ (by omega) (ϟ _)] congr 1 · rw [gqV _ _ (by omega) (by omega),gqV _ _ (by omega) (by omega),c1,c2,vx _ (by omega),vw _ (by omega)] exact gqS_eq (gqD x) (gqD wih) (fun s=>Dense.F.dw (fA x (t*(m+1)) (m+1) oneW a (s+1))*Dense.F.dw (fA wih ((2*H+u)*(m+1)) (m+1) bih[2*H+u]! b (s+1))) (t*(m+1)+1) ((2*H+u)*(m+1)+1) m _ (by omega) (by omega) (by rw [← mC,uO (by omega)]; omega) (by omega) (by omega) (fun s hs=>by simp only [fA,AD (show s+1 < m+1 by omega)]; rw [vx _ (by omega),vw _ (by omega)]; congr 3 <;> omega) m 0 _ _ _ (by omega) (ϟ _) (by rw [aUs (by omega),c1]) (by rw [aUs (by omega),c2]) · rw [gqV _ _ (by simp [gqB2,kS]; omega) (by rw [uO (by omega)]; simp [gqB2,kS]; exact hu),uO (by omega)] show (kK (n:=H) fun u=>Dense.F.dw oneW*Dense.F.dw bih[2*H+u.val]!)[u]! = _ rw [AB _ u (by simpa using hu),Λ]; simp [fA] theorem gqK3_eq (x wih bih:Ἂ Word) (inW H t u ix E L:Nat) (ok:Ἆ) (Sx:ἀ) (a b:Word) (hi:∀ q:ℕ,idxOf x[q]! ≤ ix) (h1:126 ≤ ix) (he:∀ q:ℕ,(expOf wih[q]!).toNat ≤ E) (hb:∀ q:ℕ,(expOf bih[q]!).toNat ≤ E) (hL:inW+3 ≤ 2^L) (hok:ok=true → ix ≤ 253∧E ≤ 254∧L ≤ 27∧gqF Sx (O2 (t*H)+O2 u)=aoR (fA x (t*inW) inW oneW a) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! b) inW) : gqK3 Sx (lh (48+ix+max (E-1) 55)) (lh L) x wih bih inW H t ok (O2 (t*H)) u (O2 u) a b= dotOf (inW+2) (fA x (t*inW) inW oneW a) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! b):= wk_eq inW ix E (fA x (t*inW) inW oneW a) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! b) ok (lh (48+ix+max (E-1) 55)) (lh L) a b (gqF Sx (O2 (t*H)+O2 u)) _ (by simp [fA]) (by simp [fA]) (fun h=>(hok h).2.2.2) (fun h=>by obtain ⟨k1,k2,k3,-⟩:=hok h have e1:(lh L).toNat=L:=Α (by unfold n0; omega) have e2:(lh (48+ix+max (E-1) 55)).toNat=48+ix+max (E-1) 55:=Α (by unfold n0; omega) have e3:idxOf oneW=126:=by decide refine ⟨fun s hs=>?_,k1,k2,e2,by rw [e1]; omega,by rw [e1]; exact k3⟩ rcases Z7 s inW with hs|hs · simp only [fA,AD hs]; exact ⟨hi _,he _⟩ · obtain rfl:s=inW:=by omega simp only [fA,AX,ἂ,ἁ]; exact ⟨e3 ▸ h1,hb _⟩) (by unfold gqX; exact ad4_eq _ _ _ _ _ _ _ _ _ _) theorem pre_eq (G inW H:Nat) (x wih whh bih bhh h:Ἂ Word) (t:Nat) (g:t*inW+inW+H < 4294967296) : linearSpec 1 (inW+H+1) (G*H) false (xh1 inW H x h t) (wcat G inW H wih whh bih) bhh = kK (n:=G*H) fun k=>gateWith dotOf inW H x wih whh bih bhh h t k.val:=by apply mi · simp [linearSpec,linearWith] · intro i h1 h2 have hi:i < G*H:=by simpa using h2 simp only [linearSpec,linearWith,Λ,ώ hi, γ hi,ϳ,Κ,act] simp only [υ,ἂ] unfold gateWith apply dotOf_congr (by omega) · intro j hj by_cases hj1:j < inW+H+1 · rw [AD hj1,xh1,aKd_eq,gofn _ _ hj1]; dsimp only split · rw [← mC,aGn _ _ (by omega)] · split · rw [aGt_eq,L7 _ _ (by rw [V6,uO (by omega),uO (by omega)]; omega),uO (by omega),uO (by omega)] · rfl · rw [AC hj1] have:¬ j < inW:=by omega have:¬ j < inW+H:=by omega simp only [*, ἂ] · intro j hj by_cases hj1:j < inW+H+1 · rw [AD hj1,wcat,gofn _ _ (by have:i*(inW+H+1)+j < G*H*(inW+H+1):=by calc i*(inW+H+1)+j < i*(inW+H+1)+(inW+H+1):=by omega _=(i+1)*(inW+H+1):=by ring _ ≤ G*H*(inW+H+1):=ι _ hi exact this)] have hp:0 < inW+H+1:=by omega have e1:(i*(inW+H+1)+j)/(inW+H+1)=i:=by rw [Ϗ,R8 hp,ώ hj1,ϑ] have e2:(i*(inW+H+1)+j)%(inW+H+1)=j:=by rw [Ϗ,S8,γ hj1] simp only [e1,e2] by_cases a1:j < inW · simp only [a1,ἁ] · by_cases a2:j < inW+H · simp only [a1,a2,ἁ,ἂ] · have:j=inW+H:=by omega simp only [this,ἁ] · rw [AC hj1] have:¬ j < inW:=by omega have:¬ j < inW+H:=by omega have:j≠inW+H:=by omega simp only [*, ἂ] theorem hn_eq (H:Nat) (whh bhh h:Ἂ Word) : linearSpec 1 H H false h (wsub H whh) (bsub H bhh) = Array.ofFn (n:=H) fun u=>dotOf (H+1) (fun j=>if j < H then h[j]! else oneW) (fun j=>if j < H then whh[(2*H+u.val)*H+j]! else bhh[2*H+u.val]!):=by apply mi · simp [linearSpec,linearWith] · intro i h1 h2 have hi:i < H:=by simpa using h2 simp only [linearSpec,linearWith,Λ,ώ hi, γ hi,ϳ,Κ,act] simp only [υ,ἂ] apply dotOf_congr rfl · intro j hj; rfl · intro j hj by_cases hj1:j < H · have hq:i*H+j < H*H:=by calc i*H+j < i*H+H:=by omega _=(i+1)*H:=by ring _ ≤ H*H:=ι _ hi rw [AD hj1,AD hj1,wsub,aKd_eq,gofn _ _ hq] congr 1; ring · rw [AC hj1,AC hj1,bsub,aKd_eq,gofn _ _ hi] theorem gruStepF_eq (sig tanh:Word → Word) (inW H T:Nat) (x wih whh bih bhh:Ἂ Word) (ok:Ἆ) (cand:Nat → Ἆ → Ἄ → Nat → Ἄ → Word → Word → Word) (t:Nat) (g:t*inW+inW+4*H < 4294967296) (hc:∀ u < H,∀ a b,cand t (ok&&decide (t < T)) (O2 (t*H)) u (O2 u) a b= dotOf (inW+2) (fA x (t*inW) inW oneW a) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! b)) (st:Ἂ Word × Ἂ Word) : gruStepF linearSpec sig tanh inW H T x (wcat 2 inW H wih whh bih) (wsub H whh) (bsub H bhh) bhh (Dense.F.dw oneW) cand ok t st= gruStepWith dotOf sig tanh inW H x wih whh bih bhh t st:=by unfold gruStepF rw [pre_eq _ _ _ _ _ _ _ _ _ _ (by omega),hn_eq] unfold gruStepWith dsimp only rw [aKd_eq] congr 1 congr 1; funext u have:=u.isLt simp (disch:=omega) only [← mC,aGn] rw [gqU2_eq,hc _ this,gofn _ _ u.isLt,gofn _ _ (by omega:u.val < 2*H),gofn _ _ (by omega:H+u.val < 2*H)] simp only [gofn _ _ u.isLt] rfl theorem lstmStep_eq (sig tanh:Word → Word) (inW H:Nat) (x wih whh bih bhh:Ἂ Word) (t:Nat) (g:t*inW+inW+4*H < 4294967296) (st:Ἂ Word × Ἂ Word) : lstmStep linearSpec sig tanh inW H x (wcat 4 inW H wih whh bih) bhh t st=lstmStepWith dotOf sig tanh inW H x wih whh bih bhh t st:=by unfold lstmStep rw [pre_eq _ _ _ _ _ _ _ _ _ _ (by omega)] unfold lstmTail lstmStepWith simp (disch:=omega) only [aKd_eq,← mC,aGn,cl2_eq,mulN_eq] theorem tB (T inW H t:Nat) (ht:t < T) (g:T*inW+inW+4*H < 4294967296):t*inW+inW+4*H < 4294967296:=by have:=ι inW (show t+1 ≤ T by omega); rw [Ο] at this; omega theorem lstmK_spec (sig tanh:Word → Word):lstmK linearSpec sig tanh=lstmWith dotOf sig tanh:=by funext T inW H x wih whh bih bhh unfold lstmK; split · rename_i g rw [wcG_v] exact rcL_eq _ _ _ _ _ (fun t ht st=>lstmStep_eq sig tanh inW H x wih whh bih bhh t (tB T inW H t ht g) st) (fun t st=>by simp [lstmStepWith]) · rfl theorem gruK_spec (sig tanh:Word → Word):gruK linearSpec sig tanh=gruWith dotOf sig tanh:=by funext T inW H x wih whh bih bhh unfold gruK; split · rename_i g dsimp only rw [wcG_v,wbG_v,wdG_v] refine rcL_eq _ _ _ _ _ (fun t ht st=>gruStepF_eq sig tanh inW H T x wih whh bih bhh _ _ t (tB T inW H t ht g) (fun u hu a b=> gqK3_eq x wih bih inW H t u _ _ _ _ _ a b (fun q=>(gqM_le x q).trans (le_max_left _ _)) (le_max_right _ _) (fun q=>(gqN_le wih q).trans (le_max_left _ _)) (fun q=>(gqN_le bih q).trans (le_max_right _ _)) (ϙ (n:=inW+3)).le (fun h=>?_)) st) (fun t st=>by simp [gruStepWith]) simp only [Η,AJ] at h obtain ⟨⟨k1,k2,k3,k4,k5,k6,k7,k8,k9⟩,k10⟩:=h refine ⟨k1,k2,k3,?_⟩ rw [AD (by simp only [AJ]; exact ⟨k1,k2,k3,k4,k5,k6,k7,k8,k9⟩)] exact gqSx x wih bih inW H T t u a b k10 hu k4 k5 k6 k7 k8 k9 · rfl end Rnn namespace NX open Dense.F (cI dw fK fuS mV uZ) open Norm (Y1 ck f6 kO0 kO1 kQ52 kZ4 nDb nHd nO1 nOK_dec nOK_spec nOKs nOs nQ_cert nQs nS201 nWs nXb nZw nZw_sz nfe okF okF_nOK pk2 pk2_nW) open Core (ai) open SAct (divF inv2le) open ExactRuntime theorem fastEl (y:ℚ) (v:Ἅ) (T:ἆ) (h1:1047 ≤ T.toNat) (h2:T.toNat ≤ 1298) (hv:Dense.F.fv v) (hok:okF v.toBits T=true) (he : |(y:ℝ)*2^(149:ℕ)-Dense.F.rv v| < 2^(4:ℤ)*2^(((Dense.F.eF v.toBits).toNat:ℤ)-1075)) : pk2 v.toBits=Qb y:=by obtain ⟨hk,hT⟩:=okF_nOK _ _ h1 h2 hok have hE:1047 ≤ ((v.toBits>>>52)&&&2047).toNat∧((v.toBits>>>52)&&&2047).toNat ≤ 1298:=by have:=nOK_dec _ _ hk; exact ⟨this.1,this.2.1⟩ rw [pk2_nW _ hE.1 hE.2] exact nOK_spec y v 5 hv hk (by simpa using he) theorem relMul (a b:Ἅ) (ha:Dense.F.fv a) (hb:Dense.F.fv b) (hup : |Dense.F.rv a*Dense.F.rv b| ≤ (2:ℝ)^(971:ℤ)) (hlo:(1:ℝ)/2^(300:ℕ) ≤ |Dense.F.rv a*Dense.F.rv b|) : Dense.F.fv (a*b)∧SAct.Rel (Dense.F.rv (a*b)) (Dense.F.rv a*Dense.F.rv b) (1/2^(52:ℕ)):=by obtain ⟨h1,h2⟩:=Norm.NF.fM a b ha hb hup refine ⟨h1,?_⟩ unfold SAct.Rel have k:(1:ℝ)/2^(1075:ℕ) ≤ |Dense.F.rv a*Dense.F.rv b| / 2^(53:ℕ):=by rw [le_div_iff₀ (by positivity)] calc (1:ℝ)/2^(1075:ℕ)*2^(53:ℕ)=1/2^(1022:ℕ):=by rw [div_mul_eq_mul_div,one_mul,show (2:ℝ)^(1075:ℕ)=2^(1022:ℕ)*2^(53:ℕ) by rw [← AF]]; field_simp _ ≤ 1/2^(300:ℕ):=inv2le (by norm_num) _ ≤ _:=hlo have : |Dense.F.rv a*Dense.F.rv b| / 2^(53:ℕ) + |Dense.F.rv a*Dense.F.rv b| / 2^(53:ℕ)=1/2^(52:ℕ) * |Dense.F.rv a*Dense.F.rv b| := by rw [show (2:ℝ)^(53:ℕ)=2*2^(52:ℕ) by rw [A4]; ring]; field_simp; ring linarith theorem rvEq (x:Ἅ):SAct.rv x=Dense.F.rv x:=rfl theorem fvEq (x:Ἅ):SAct.fv x=Dense.F.fv x:=rfl theorem relInv (D:Ἅ) (hD:Dense.F.fv D) (h0:0 < Dense.F.rv D) (hup:1/Dense.F.rv D ≤ 4) (hlo:(1:ℝ)/2^(300:ℕ) ≤ 1/Dense.F.rv D) : Dense.F.fv ((I0 1).toInt64.toFloat/D) ∧ SAct.Rel (Dense.F.rv ((I0 1).toInt64.toFloat/D)) (1/Dense.F.rv D) (1/2^(52:ℕ)):=by obtain ⟨o1,o2⟩:=mV (I0 1) 1 rfl (by norm_num) have hdiv:=divF ((I0 1).toInt64.toFloat) D o1 hD (ne_of_gt h0) (by rw [rvEq,rvEq,o2]; push_cast; rw [AW (by positivity)]; exact hup) rw [rvEq,rvEq,rvEq,o2,fvEq] at hdiv; push_cast at hdiv refine ⟨hdiv.1,?_⟩ unfold SAct.Rel rw [hdiv.2] have j:=Norm.NF.jy (1/Dense.F.rv D) have k:(1:ℝ)/2^(1075:ℕ) ≤ |1/Dense.F.rv D| / 2^(53:ℕ):=by rw [AW (by positivity),le_div_iff₀ (by positivity)] calc (1:ℝ)/2^(1075:ℕ)*2^(53:ℕ)=1/2^(1022:ℕ):=by rw [div_mul_eq_mul_div,one_mul,show (2:ℝ)^(1075:ℕ)=2^(1022:ℕ)*2^(53:ℕ) by rw [← AF]]; field_simp _ ≤ 1/2^(300:ℕ):=inv2le (by norm_num) _ ≤ _:=hlo have : |1/Dense.F.rv D| / 2^(53:ℕ) + |1/Dense.F.rv D| / 2^(53:ℕ)=1/2^(52:ℕ) * |1/Dense.F.rv D| := by rw [show (2:ℝ)^(53:ℕ)=2*2^(52:ℕ) by rw [A4]; ring]; field_simp; ring linarith theorem dwZA (w:Word) (h:kB w≠255) : Dense.F.fv (dw w)∧Dense.F.rv (dw w)=(K4 w:ℝ)*2^(149:ℕ):=by obtain ⟨f,v⟩:=cI w h refine ⟨f,?_⟩ rw [v,Y1 w] push_cast rw [Ap, ← AA (2:ℝ) 149, ← AK (by norm_num), ← AA] congr 2; ring theorem mant_ne (w:Word) (h0:w<<<1≠0):kM w≠0:=by intro hm apply h0 unfold kM at hm split_ifs at hm with he · apply Β.1 have h1:(kB w).toNat=0:=by rw [he]; rfl unfold kB at h1; unfold lK at hm simp only [Ξ,Υ,ϴ,kN,kH, β,ο,show (255:Nat)=2^8-1 from rfl,show (8388607:Nat)=2^23-1 from rfl, ζ] at h1 hm ⊢ have:=w.toNat_lt simp only [nr] at * omega · omega theorem dwOne (w:Word) (h:kB w≠255) (h0:w<<<1≠0):1 ≤ |Dense.F.rv (dw w)| := by obtain ⟨-, v⟩:=cI w h rw [v,Ae,AW (by positivity:(0:ℝ) < 2^(kG w))] have hm:=mant_ne w h0 have:(1:ℝ) ≤ |(M8 w:ℝ)| := by unfold M8; split_ifs <;> simp <;> exact_mod_cast Gd.mpr hm calc (1:ℝ)=1*1:=by ring _ ≤ |(M8 w:ℝ)| * 2^(kG w):=mul_le_mul this (one_le_pow₀ (by norm_num)) (by norm_num) (by positivity) theorem relSelf (a:ℝ):SAct.Rel a a 0:=by unfold SAct.Rel; simp theorem relWin (v:Ἅ) (Y:ℝ) (hv:Dense.F.fv v) (h:SAct.Rel (Dense.F.rv v) Y (1/2^(50:ℕ))) : |Y-Dense.F.rv v| < 2^(4:ℤ)*2^(((Dense.F.eF v.toBits).toNat:ℤ)-1075):=by have hk:=fK v hv unfold SAct.Rel at h have hY : |Y| ≤ |Dense.F.rv v| * (2^(50:ℕ)/(2^(50:ℕ)-1)):=by have t:=AY Y (Dense.F.rv v) rw [Aw] at t rw [mul_div_assoc',le_div_iff₀ (by norm_num)] have : |Y| ≤ |Dense.F.rv v| + 1/2^(50:ℕ) * |Y| := by linarith nlinarith [Aa Y] rw [Aw] calc |Dense.F.rv v-Y| ≤ 1/2^(50:ℕ) * |Y| := h _ ≤ 1/2^(50:ℕ)*(|Dense.F.rv v| * (2^(50:ℕ)/(2^(50:ℕ)-1))):=by gcongr _ = |Dense.F.rv v| * (1/(2^(50:ℕ)-1)):=by rw [mul_comm (1/2^(50:ℕ):ℝ),Ap]; congr 1; field_simp _ < 2^(((Dense.F.eF v.toBits).toNat:ℤ)-1022)*(1/(2^(50:ℕ)-1)):=AI hk (by norm_num) _ ≤ 2^(((Dense.F.eF v.toBits).toNat:ℤ)-1022)*(2^(-(49:ℤ))):=mul_le_mul_of_nonneg_left (by norm_num) (by positivity) _=2^(4:ℤ)*2^(((Dense.F.eF v.toBits).toNat:ℤ)-1075):=by rw [← AK (by norm_num), ← AK (by norm_num)]; congr 1; ring theorem rmsNum (xw gw td:Word) (hx:kB xw≠255) (hg:kB gw≠255) (hx0:xw<<<1≠0) (hg0:gw<<<1≠0) (hd:0 < (kB td).toNat∧kB td≠255∧k9 td=false) (hd2:(kB td).toNat ≤ 170) : Dense.F.fv (dw xw*(dw gw*((I0 1).toInt64.toFloat/dw td))) ∧ SAct.Rel (Dense.F.rv (dw xw*(dw gw*((I0 1).toInt64.toFloat/dw td)))) (((K4 xw*K4 gw/K4 td:ℚ):ℝ)*2^(149:ℕ)) (1/2^(50:ℕ)):=by obtain ⟨fX,vX⟩:=dwZA xw hx obtain ⟨fG,vG⟩:=dwZA gw hg obtain ⟨fD,vD⟩:=dwZA td hd.2.1 have X1:=dwOne xw hx hx0 have G1:=dwOne gw hg hg0 have Xb:=nXb xw hx have Gb:=nXb gw hg have Dlo:=nDb td hd have Dhi:=nXb td hd.2.1 have ex:=mO xw have eg:=mO gw set X:=Dense.F.rv (dw xw) with hXd set G:=Dense.F.rv (dw gw) with hGd set Dd:=Dense.F.rv (dw td) with hDd have X2 : |X| ≤ 2^(278:ℕ):=Xb.le.trans (AU (by norm_num) (by omega)) have G2 : |G| ≤ 2^(278:ℕ):=Gb.le.trans (AU (by norm_num) (by omega)) have D1:(2:ℝ)^(23:ℕ) ≤ Dd:=AZ (AU (by norm_num) (by omega)) Dlo have D2:Dd ≤ 2^(193:ℕ):=(abs_lt.1 Dhi).2.le.trans (AU (by norm_num) (by omega)) have D0:0 < Dd:=AN (by positivity) D1 have iD1:1/Dd ≤ 4:=by rw [div_le_iff₀ D0]; linarith have iD2:(1:ℝ)/2^(300:ℕ) ≤ 1/Dd:=one_div_le_one_div_of_le D0 (D2.trans (AU (by norm_num) (by norm_num))) have iD3:1/Dd ≤ 1/2^(23:ℕ):=one_div_le_one_div_of_le (by positivity) D1 have iD4:(1:ℝ)/2^(193:ℕ) ≤ 1/Dd:=one_div_le_one_div_of_le (by positivity) D2 obtain ⟨fr,rr⟩:=relInv (dw td) fD D0 iD1 iD2 set R:=Dense.F.rv ((I0 1).toInt64.toFloat/dw td) with hRd have R1:=rr.le have R2:=rr.ge rw [AW (by positivity:(0:ℝ) < 1/Dd)] at R1 R2 have e0:(0:ℝ) ≤ 1/2^(52:ℕ):=by positivity have e1:(1:ℝ)/2^(52:ℕ) ≤ 1/2^(10:ℕ):=inv2le (by norm_num) have hR1 : |R| ≤ 1/2^(22:ℕ):=by refine R1.trans ?_ calc (1+1/2^(52:ℕ))*(1/Dd) ≤ 2*(1/2^(23:ℕ)):=by gcongr; norm_num _=1/2^(22:ℕ):=by norm_num have hR2:(1:ℝ)/2^(194:ℕ) ≤ |R| := by refine AZ ?_ R2 calc (1:ℝ)/2^(194:ℕ)=(1/2)*(1/2^(193:ℕ)):=by norm_num _ ≤ (1-1/2^(52:ℕ))*(1/Dd):=by gcongr; norm_num have p971:(2:ℝ)^(535:ℕ) ≤ (2:ℝ)^(971:ℤ):=by rw [← AA]; exact AG (by norm_num) (by norm_num) have p300:(1:ℝ)/2^(300:ℕ) ≤ 1/2^(195:ℕ):=inv2le (by norm_num) have GRu : |G*R| ≤ (2:ℝ)^(971:ℤ):=by rw [Ae] calc |G| * |R| ≤ 2^(278:ℕ)*1:=by gcongr; exact hR1.trans (by norm_num) _ ≤ 2^(535:ℕ):=by rw [mul_one]; exact AU (by norm_num) (by norm_num) _ ≤ _:=p971 have GRl:(1:ℝ)/2^(300:ℕ) ≤ |G*R| := by rw [Ae] calc (1:ℝ)/2^(300:ℕ) ≤ 1/2^(194:ℕ):=inv2le (by norm_num) _=1*(1/2^(194:ℕ)):=by ring _ ≤ |G| * |R| := mul_le_mul G1 hR2 (by positivity) (Aa _) obtain ⟨fp,rp⟩:=relMul (dw gw) _ fG fr GRu GRl set Pp:=Dense.F.rv (dw gw*((I0 1).toInt64.toFloat/dw td)) with hPd have P1:=rp.le have P2:=rp.ge have hGR1 : |G*R| ≤ 2^(256:ℕ):=by rw [Ae] calc |G| * |R| ≤ 2^(278:ℕ)*(1/2^(22:ℕ)):=by gcongr _=2^(256:ℕ):=by rw [show (278:ℕ)=256+22 from rfl,AF]; field_simp have hP1 : |Pp| ≤ 2^(257:ℕ):=by refine P1.trans ?_ calc (1+1/2^(52:ℕ)) * |G*R| ≤ 2*2^(256:ℕ):=by gcongr; norm_num _=2^(257:ℕ):=(pow_succ' (2:ℝ) 256).symm have hP2:(1:ℝ)/2^(195:ℕ) ≤ |Pp| := by refine AZ ?_ P2 calc (1:ℝ)/2^(195:ℕ)=(1/2)*(1*(1/2^(194:ℕ))):=by rw [A4]; field_simp _ ≤ (1-1/2^(52:ℕ)) * |G*R| := by gcongr · norm_num · rw [Ae]; exact mul_le_mul G1 hR2 (by positivity) (Aa _) have XPu : |X*Pp| ≤ (2:ℝ)^(971:ℤ):=by rw [Ae] calc |X| * |Pp| ≤ 2^(278:ℕ)*2^(257:ℕ):=by gcongr _=2^(535:ℕ):=by rw [← AF] _ ≤ _:=p971 have XPl:(1:ℝ)/2^(300:ℕ) ≤ |X*Pp| := by rw [Ae] calc (1:ℝ)/2^(300:ℕ) ≤ 1/2^(195:ℕ):=p300 _=1*(1/2^(195:ℕ)):=by ring _ ≤ |X| * |Pp| := mul_le_mul X1 hP2 (by positivity) (Aa _) obtain ⟨fv,rv⟩:=relMul (dw xw) _ fX fp XPu XPl refine ⟨fv,?_⟩ have r1:=SAct.Rel.mul (relSelf G) rr AP have r2:=SAct.Rel.trans rp r1 e0 have r3:=SAct.Rel.mul (relSelf X) r2 AP have r4:=SAct.Rel.trans rv r3 e0 have hT:X*(G*(1/Dd))=(((K4 xw*K4 gw/K4 td:ℚ):ℝ)*2^(149:ℕ)):=by have hD0:(K4 td:ℝ)≠0:=by intro h0; rw [vD,h0,zero_mul] at D0; exact AX _ D0 rw [vX,vG,vD]; push_cast; field_simp rw [hT] at r4 refine r4.mono ?_ norm_num theorem zt0:Qb 0=0:=by decide theorem za0 (w:Word) (h0:w<<<1=0):K4 w=0:=by rw [Y1 w] have hm:kM w=0:=by have:=congrArg mJ h0 unfold kM have hw:=w.toNat_lt have e1:(kB w).toNat=w.toNat/2^23%256:=by unfold kB simp only [Ξ,Υ,kN,kH,β, show (255:Nat)=2^8-1 from rfl,ζ] have e2:(lK w).toNat=w.toNat%2^23:=by unfold lK simp only [Ξ,kN,show (8388607:Nat)=2^23-1 from rfl,ζ] simp only [ϴ,kN,kH,ο] at this have ee:kB w=0:=by apply Β.1; rw [e1]; simp only [nr] at *; simp only [kN]; omega rw [AD ee,e2]; simp only [nr] at *; omega unfold M8; rw [hm]; simp @[noinline] def rR (xw gw td:Word):Word:=Qb (K4 xw*K4 gw/K4 td) @[inline] def wR (x g:Ἂ Word) (nd:Ἅ) (td:Word) (xw gw:Word) (xv ri:Ἅ) (t:Ἄ):Word := if (xw<<<1==0||gw<<<1==0)=true then 0 else let B:=(xv*(dw gw*ri)).toBits if okF B 1047=true then pk2 B else rR xw gw td theorem elR (x g:Ἂ Word) (nd:Ἅ) (td:Word) (t:Ἄ) (xw gw:Word) (hxw:ck x t=xw) (hgw:ck g t=gw) (hx:kB xw≠255) (hg:kB gw≠255) (hnd:nd=(I0 1).toInt64.toFloat) (hd:0 < (kB td).toNat∧kB td≠255∧k9 td=false) (hd2:(kB td).toNat ≤ 170) : wR x g nd td xw gw (dw xw) ((I0 1).toInt64.toFloat/dw td) t = Qb (K4 xw*K4 gw/K4 td):=by unfold wR split · rename_i hz simp only [nM,AQ] at hz rcases hz with hz | hz · rw [za0 xw hz,zero_mul,zero_div,zt0] · rw [za0 gw hz,mul_zero,zero_div,zt0] · rename_i hz simp only [nM,AQ,not_or] at hz obtain ⟨fv,rl⟩:=rmsNum xw gw td hx hg hz.1 hz.2 hd hd2 dsimp only split · rename_i hok exact fastEl _ _ 1047 (by decide) (by decide) fv hok (relWin _ _ fv rl) · rfl theorem aset (o:Ἂ Word) (t:Ἄ) (v:Word) (h:t.toNat < o.size) (j:Nat) (hj:j < o.size) : (o.uset t v h)[j]! = if t.toNat=j then v else o[j]! := by have hs:(o.uset t v h).size=o.size:=BT .. rw [AB (o.uset t v h) j (by rw [hs]; exact hj),AB o j hj] simp only [Vw,Je] theorem ugetF (o:ἀ) (t:Ἄ) (h:t.toNat < o.size):o.uget t h=o.data[t.toNat]! := by rcases o with ⟨d⟩ simp only [kS] at h simp only [nN] rw [AB d t.toNat h] rfl structure RQ where a:ἀ q:Ἅ dl:ἆ def qR (x : @& Ἂ Word) (Xr:ἀ) (t n:Ἄ) (hx:n.toNat ≤ x.size) (hr:n.toNat ≤ Xr.size) (q:Ἅ) (Dl:ἆ):RQ := if h:t < n then have ht:t.toNat < n.toNat:=ε.mp h let w:=x.uget t (U1 ht hx) let v:=dw w let e:=nfe w qR x (Xr.uset t v (U1 ht hr)) (t+1) n hx (by rw [uZ]; exact hr) (q+v*v) (if Dl < e then e else Dl) else ⟨Xr,q,Dl⟩ termination_by n.toNat-t.toNat decreasing_by exact nHd h theorem qR_spec (x:Ἂ Word) (n:Ἄ) (hx:n.toNat ≤ x.size) : ∀ k (t:Ἄ) (Xr:ἀ) (hr:n.toNat ≤ Xr.size) (q:Ἅ) (Dl:ἆ), n.toNat-t.toNat=k → t.toNat ≤ n.toNat → (qR x Xr t n hx hr q Dl).a.size=Xr.size ∧ (∀ j,j < Xr.size → (qR x Xr t n hx hr q Dl).a.data[j]! = if t.toNat ≤ j∧j < n.toNat then dw x[j]! else Xr.data[j]!) ∧ (qR x Xr t n hx hr q Dl).q=nQs x t n q ∧ Dl.toNat ≤ (qR x Xr t n hx hr q Dl).dl.toNat ∧ (∀ j,t.toNat ≤ j → j < n.toNat → (nfe x[j]!).toNat ≤ (qR x Xr t n hx hr q Dl).dl.toNat):=by intro k; induction k with | zero => intro t Xr hr q Dl hk ht have hnt:¬ t < n:=nO1 hk rw [qR.eq_def,dite_eq_right hnt,nQs.eq_def,dite_eq_right hnt] refine ⟨rfl,fun j hj => ?_,rfl,AP,fun j h1 h2=>by omega⟩ rw [AC (by omega)] | succ k ih => intro t Xr hr q Dl hk ht obtain ⟨h1,hk',ht'⟩:=nOs hk have htn:t < n:=ε.mpr h1 have hxt:t.toNat < x.size:=U1 h1 hx have hrt:t.toNat < Xr.size:=U1 h1 hr have e1:(t+1).toNat=t.toNat+1:=Dense.ac htn rw [qR.eq_def,AT htn,nQs.eq_def,AT htn] simp only [Dense.cC,f6] obtain ⟨a1,a2,a3,a4,a5⟩:=ih (t+1) (Xr.uset t (dw x[t.toNat]!) hrt) (by rw [uZ]; exact hr) (q+dw x[t.toNat]! * dw x[t.toNat]!) (if Dl < nfe x[t.toNat]! then nfe x[t.toNat]! else Dl) hk' ht' refine ⟨by rw [a1,uZ],fun j hj => ?_,a3,?_,fun j hj1 hj2 => ?_⟩ · rw [a2 j (by rw [uZ]; exact hj),fuS _ _ _ _ _ hj,e1] by_cases hjt:t.toNat=j · subst hjt; rw [AC (by omega),AD rfl,AD ⟨AP,h1⟩] · simp only [hjt,ἂ] by_cases hc:t.toNat ≤ j∧j < n.toNat · rw [AD (by omega),AD hc] · rw [AC (by omega),AC hc] · refine AZ ?_ a4 split <;> rename_i hc · exact (μ.mp hc).le · exact AP · by_cases hjt:j=t.toNat · subst hjt; refine AZ ?_ a4 split <;> rename_i hc · exact AP · exact θ.mp (Xm.mp hc) · exact a5 j (by omega) hj2 def eR (x g : @& Ἂ Word) (nd:Ἅ) (td:Word) (xb : @& ἀ) (ri:Ἅ) (t nn:Ἄ) (hx:nn.toNat ≤ x.size) (hg:nn.toNat ≤ g.size) (hr:nn.toNat ≤ xb.size) (out:Ἂ Word) (ho:nn.toNat ≤ out.size):Ἂ Word := if h:t < nn then have ht:t.toNat < nn.toNat:=ε.mp h let gw:=g.uget t (U1 ht hg) if nfe gw < 255 then let w:=wR x g nd td (x.uget t (U1 ht hx)) gw (xb.uget t (U1 ht hr)) ri t eR x g nd td xb ri (t+1) nn hx hg hr (out.uset t w (U1 ht ho)) (by rw [BT]; exact ho) else #[] else out termination_by nn.toNat-t.toNat decreasing_by exact nHd h theorem eR_spec (x g:Ἂ Word) (nd:Ἅ) (td:Word) (xb:ἀ) (ri:Ἅ) (nn:Ἄ) (hx:nn.toNat ≤ x.size) (hg:nn.toNat ≤ g.size) (hr:nn.toNat ≤ xb.size) : ∀ k (t:Ἄ) (out:Ἂ Word) (ho:nn.toNat ≤ out.size),nn.toNat-t.toNat=k → t.toNat ≤ nn.toNat → eR x g nd td xb ri t nn hx hg hr out ho = #[] ∨ ((eR x g nd td xb ri t nn hx hg hr out ho).size=out.size ∧ (∀ j,t.toNat ≤ j → j < nn.toNat → nfe g[j]! < 255) ∧ ∀ j,j < out.size → (eR x g nd td xb ri t nn hx hg hr out ho)[j]! = if t.toNat ≤ j∧j < nn.toNat then wR x g nd td x[j]! g[j]! xb.data[j]! ri (O2 j) else out[j]!):=by intro k; induction k with | zero => intro t out ho hk ht have hnt:¬ t < nn:=nO1 hk rw [eR.eq_def,dite_eq_right hnt] exact BA ⟨rfl,fun j h1 h2=>by omega,fun j hj=>by rw [AC (by omega)]⟩ | succ k ih => intro t out ho hk ht obtain ⟨h1,hk',ht'⟩:=nOs hk have htn:t < nn:=ε.mpr h1 have e1:(t+1).toNat=t.toNat+1:=Dense.ac htn rw [eR.eq_def,AT htn] simp only [Dense.cC] split · rename_i hgf have hot:t.toNat < out.size:=U1 h1 ho rcases ih (t+1) (out.uset t (wR x g nd td x[t.toNat]! g[t.toNat]! (xb.uget t (U1 h1 hr)) ri t) hot) (by rw [BT]; exact ho) hk' ht' with hz | ⟨a1,a2,a3⟩ · exact pZ hz · refine BA ⟨by rw [a1,BT],fun j hj1 hj2 => ?_,fun j hj => ?_⟩ · by_cases hjt:j=t.toNat · subst hjt; exact hgf · exact a2 j (by omega) hj2 · rw [a3 j (by rw [BT]; exact hj),aset _ _ _ _ _ hj,e1] by_cases hjt:t.toNat=j · subst hjt rw [AC (by omega),AD rfl,AD ⟨AP,h1⟩,ugetF] congr 1; exact Kv.symm · simp only [hjt,ἂ] by_cases hc:t.toNat ≤ j∧j < nn.toNat · rw [AD (by omega),AD hc] · rw [AC (by omega),AC hc] · exact pZ rfl theorem usz (n:Nat) (h:n < 2^32):n < kX:=by rw [nT]; rcases Js with h' | h' <;> rw [h'] <;> omega theorem qR0 (x:Ἂ Word) (n:Nat) (hx:n ≤ x.size) (hn:n < 2^32) : (n.toUSize).toNat ≤ x.size∧(n.toUSize).toNat ≤ (nZw n).size:=by have q2:(n.toUSize).toNat=n:=Dense.aa (usz n (by omega)) rw [q2]; exact ⟨hx,(V1 n 2).trans (nZw_sz n)⟩ def rmsF (n:Nat) (eps:Word) (x g:Ἂ Word) (hx:n ≤ x.size) (hg:n ≤ g.size) (hn:n < 2^32):Ἂ Word := let nn:=n.toUSize let o:=eps.toUInt64>>>32 let one:=(o+1).toInt64.toFloat let Qr:=qR x (nZw n) 0 nn (qR0 x n hx hn).1 (qR0 x n hx hn).2 o.toInt64.toFloat 0 if Qr.dl < 255 then let BD:=(W7 (Qr.q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat+dw eps*nS201)).toBits if nOKs BD (ai (n+4).toUInt64+4) then let td:=nWs 26 BD if 0 < (kB td).toUInt64&&(kB td).toUInt64 ≤ 170 && !ExactRuntime.signOf td then eR x g one td Qr.a (one/dw td) 0 nn (qR0 x n hx hn).1 (by rw [Dense.aa (usz n (by omega))]; exact hg) (by rw [(qR_spec x nn (qR0 x n hx hn).1 _ 0 _ (qR0 x n hx hn).2 _ 0 rfl (ϟ _)).1]; exact (qR0 x n hx hn).2) (mB n 0) (by rw [X4,Dense.aa (usz n (by omega))]) else #[] else #[] else #[] def rms (rows n:Nat) (eps:Word) (x g:Ἂ Word):Ἂ Word := if h:rows=1∧1 ≤ n∧n ≤ 4096∧x.size=n∧g.size=n∧kB eps≠0 ∧ kB eps≠255∧k9 eps=false then let r:=rmsF n eps x g (by omega) (by omega) (by omega) if r.size=n then r else rmsnormSpec rows n eps x g else rmsnormSpec rows n eps x g theorem eR_full (n:Nat) (eps:Word) (x g:Ἂ Word) (td:Word) (xb:ἀ) (nn:Ἄ) (hnn:nn.toNat=n) (hx:nn.toNat ≤ x.size) (hg:nn.toNat ≤ g.size) (hr:nn.toNat ≤ xb.size) (ho:nn.toNat ≤ (mB n (0:Word)).size) (hn1:1 ≤ n) (hn:n < 2^32) (hxs:x.size=n) (hgs:g.size=n) (hX : ∀ j,j < n → kB x[j]! ≠ 255) (hxb : ∀ j,j < n → xb.data[j]! = dw x[j]!) (htd:td=mK (Yb n x 0 0+K4 eps)) (hd:0 < (kB td).toNat∧kB td≠255∧k9 td=false) (hd2:(kB td).toNat ≤ 170) (he1:Qq eps=true) (hepos:0 < K4 eps) (hsz:(eR x g (I0 1).toInt64.toFloat td xb ((I0 1).toInt64.toFloat/dw td) 0 nn hx hg hr (mB n 0) ho).size=n) : eR x g (I0 1).toInt64.toFloat td xb ((I0 1).toInt64.toFloat/dw td) 0 nn hx hg hr (mB n 0) ho=Qp 1 n eps x g:=by rcases eR_spec x g _ td xb _ nn hx hg hr nn.toNat 0 (mB n 0) ho (by simp) (ϟ _) with hz | ⟨E1,E2,E3⟩ · rw [hz] at hsz; simp at hsz; omega have nfeE : ∀ w:Word,(nfe w).toNat=(kB w).toNat:=fun w=>by unfold nfe kB; simp have hG : ∀ j,j < n → kB g[j]! ≠ 255:=fun j hj h=>by have:=E2 j (ϟ _) (by omega) rw [μ,nfeE,h] at this; simp at this have hdom:mq 1 n eps x g=true:=by unfold mq simp only [Η,AJ,AQ,np] refine ⟨⟨⟨⟨⟨⟨⟨by omega,by omega⟩,by omega⟩,hgs⟩,fun i hi => ?_⟩,fun i hi => ?_⟩,he1⟩,hepos⟩ · have:=hX i (by omega); rw [AB x i hi] at this unfold Qq; simpa using this · have:=hG i (by omega); rw [AB g i hi] at this unfold Qq; simpa using this rw [Qp,ExactRuntime.rmsnormWith,AD hdom] apply mi · rw [E1]; simp [Xu] · intro j h1 h2 have hj:j < n:=by rw [E1] at h1; simpa using h1 have e3:=E3 j (by simpa using hj) rw [AD ⟨ϟ _,by rw [hnn]; exact hj⟩,AB _ j h1] at e3 rw [e3] simp only [Xu,Λ] rw [hxb j hj] have hck : ∀ a:Ἂ Word,ck a (O2 j)=a[j]! := fun a=>by rw [f6,W3 (usz j (by omega))] rw [elR x g _ td (O2 j) x[j]! g[j]! (hck x) (hck g) (hX j hj) (hG j hj) rfl hd hd2] congr 2 · rw [γ hj] · rw [ώ hj,htd,AB _ 0 (by simp)]; simp theorem epsPos (eps:Word) (he0:kB eps≠0) (hes:k9 eps=false) : 0 < M8 eps∧0 < K4 eps:=by have hm:0 < kM eps:=by unfold kM; rw [AC he0]; positivity have hs:0 < M8 eps:=by unfold M8; rw [hes]; simp; exact_mod_cast hm refine ⟨hs,?_⟩ rw [Y1]; exact mul_pos (by exact_mod_cast hs) (by positivity) theorem rmsF_eq (n:Nat) (eps:Word) (x g:Ἂ Word) (hx:n ≤ x.size) (hg:n ≤ g.size) (hn:n < 2^32) (hn1:1 ≤ n) (hn2:n ≤ 4096) (hxs:x.size=n) (hgs:g.size=n) (he0:kB eps≠0) (he1:kB eps≠255) (hes:k9 eps=false) (hsz:(rmsF n eps x g hx hg hn).size=n) : rmsF n eps x g hx hg hn=Qp 1 n eps x g:=by have q2:(n.toUSize).toNat=n:=Dense.aa (usz n hn) obtain ⟨Q1,Q2,Q3, -, Q5⟩:=qR_spec x n.toUSize (qR0 x n hx hn).1 n 0 (nZw n) (qR0 x n hx hn).2 ((eps.toUInt64>>>32).toInt64.toFloat) 0 (by rw [q2]; rfl) (ϟ _) obtain ⟨hsv,hep⟩:=epsPos eps he0 hes unfold rmsF at hsz ⊢ dsimp only at hsz ⊢ split <;> rename_i hdl · rw [AD hdl] at hsz split <;> rename_i hok · rw [AD hok] at hsz split <;> rename_i htd · rw [AD htd] at hsz have hX : ∀ j,j < n → kB x[j]! ≠ 255:=fun j hj h=>by have h5:=Q5 j (ϟ _) (by rw [q2]; exact hj) have e:(nfe x[j]!).toNat=(kB x[j]!).toNat:=by unfold nfe kB; simp rw [e,h] at h5 have h6:=μ.mp hdl simp only [kN,kA] at h5 h6; omega have hxb : ∀ j,j < n → (qR x (nZw n) 0 n.toUSize (qR0 x n hx hn).1 (qR0 x n hx hn).2 (eps.toUInt64>>>32).toInt64.toFloat 0).a.data[j]! = dw x[j]! := fun j hj=>by rw [Q2 j (AN hj ((V1 n 2).trans (nZw_sz n))),AD ⟨ϟ _,by rw [q2]; exact hj⟩] have hok':=hok rw [Q3,kO0,kQ52 n (by omega),kZ4 (n+4) (by omega)] at hok' have hcert:=nQ_cert n eps x 0 (by omega) (by norm_num; omega) (by omega) (fun j hj=>hX j (by omega)) he1 hsv (by convert hok' using 4 <;> simp <;> rfl) have htd':nWs 26 (W7 ((qR x (nZw n) 0 n.toUSize (qR0 x n hx hn).1 (qR0 x n hx hn).2 (eps.toUInt64>>>32).toInt64.toFloat 0).q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat + dw eps*nS201)).toBits = mK (Yb n x 0 0+K4 eps):=by rw [Q3,kO0,kQ52 n (by omega)]; convert hcert using 4 <;> simp <;> rfl simp only [Η,AJ,BM] at htd obtain ⟨⟨hd1,hd2⟩,hd3⟩:=htd rw [μ] at hd1; rw [θ] at hd2 simp only [ϩ,kA] at hd1 hd2 have hne:kB (nWs 26 (W7 ((qR x (nZw n) 0 n.toUSize (qR0 x n hx hn).1 (qR0 x n hx hn).2 (eps.toUInt64>>>32).toInt64.toFloat 0).q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat + dw eps*nS201)).toBits)≠255:=fun h=>by rw [h] at hd2; simp at hd2 simp only [kO1] at hsz ⊢ exact eR_full n eps x g _ _ n.toUSize q2 _ _ _ _ hn1 hn hxs hgs hX hxb htd' ⟨hd1,hne,hd3⟩ hd2 (by unfold Qq; simpa using he1) hep hsz · rw [AC htd] at hsz; simp at hsz; omega · rw [AC hok] at hsz; simp at hsz; omega · rw [AC hdl] at hsz; simp at hsz; omega theorem rms_eq:rms=Qp:=by funext rows n eps x g unfold rms split · rename_i h obtain ⟨hr1,hn1,hn2,hxs,hgs,he0,he1,hes⟩:=h dsimp only split · rename_i hsz; subst hr1; exact rmsF_eq n eps x g _ _ _ hn1 hn2 hxs hgs he0 he1 hes hsz · rfl · rfl end NX namespace NXc open Dense.F (WcE dw kFU kOfS wcAeq wcAeq_ok wcGet3 wcSub) open Norm (SN V3L_h1 V3Lo Vn Y1 YU Yq Yr ck f6 fG gN gP jm ju0 kO0 kZ1 nBu nC nCK nCa nEO nElK3 nFB nFE2 nH1 nH3 nHk2 nHk3 nLQk nLR nLR_el nLR_th nLc2 nLo nLoN nOK nOKs nRi nRow nRow1 nRow1_bad nRow1_eq nRowS nRow_bad nRow_eq nRow_sz nS1 nS2 nS201 nSv nV2 nV3 nW nWF nWF2 nWF_sp nWG2 nWG2_v nWs nYq_sz nZw nZw_sz nfe uS) open Core (ai) open ExactRuntime theorem ez0 (w:Word) (h0:w<<<1=0):expOf w=0:=by have:=congrArg mJ h0 have hw:=w.toNat_lt have e1:(expOf w).toNat=w.toNat/2^23%256:=by unfold kB simp only [Ξ,Υ,kN,kH,β, show (255:Nat)=2^8-1 from rfl,ζ] simp only [ϴ,kN,kH,ο] at this apply Β.1; rw [e1]; simp only [nr] at *; simp only [kN]; omega theorem za0 (w:Word) (h0:w<<<1=0):rationalWord w=0:=by rw [Y1 w] have hm:mantOf w=0:=by have:=congrArg mJ h0 unfold kM have hw:=w.toNat_lt have e2:(fracOf w).toNat=w.toNat%2^23:=by unfold lK simp only [Ξ,kN,show (8388607:Nat)=2^23-1 from rfl,ζ] simp only [ϴ,kN,kH,ο] at this rw [AD (ez0 w h0),e2]; simp only [nr] at *; omega unfold M8; rw [hm]; simp theorem nfeL (w:Word) (h:nfe w < 255):expOf w≠255:=by intro c have e:nfe w=(expOf w).toUInt64:=rfl rw [e,c] at h; exact absurd h (by decide) def cQ (x : @& Ἂ Word) (w0:Word) (i e:Ἄ):Ἆ := if h:i < e then let w:=ck x i if (w==w0||(w<<<1==0&&w0<<<1==0)) then cQ x w0 (i+1) e else false else true termination_by e.toNat-i.toNat decreasing_by have:=ε.mp h; have:=e.toNat_lt_size; rw [uS (by omega)]; omega theorem cQ_spec (x:Ἂ Word) (w0:Word) (e:Ἄ) : ∀ k (i:Ἄ),e.toNat-i.toNat=k → cQ x w0 i e=true → ∀ j,i.toNat ≤ j → j < e.toNat → (x[j]! = w0∨(x[j]! <<< 1=0∧w0<<<1=0)):=by intro k; induction k with | zero=>intro i hk _ j h1 h2; omega | succ k ih => intro i hk hc j h1 h2 have hi:i < e:=ε.mpr (by omega) rw [cQ,AT hi] at hc dsimp only at hc split at hc · rename_i hw have hs:(i+1).toNat=i.toNat+1:=uS (by have:=e.toNat_lt_size; omega) by_cases hj:j=i.toNat · subst hj; rw [f6] at hw; simpa only [nM,AQ,Η] using hw · exact ih (i+1) (by omega) hc j (by omega) h2 · exact absurd hc lN theorem foldC (f:ℕ → ℚ) (c:ℚ) : ∀ (l:List ℕ) (a:ℚ),(∀ j ∈ l,f j=c) → l.foldl (fun t j=>t+f j) a=a+l.length*c:=by intro l; induction l with | nil=>intro a _; simp | cons h t ih => intro a hf rw [Ϸ,ih _ (fun j hj=>hf j (List.mem_cons_of_mem _ hj)),hf h List.mem_cons_self] simp only [List.length_cons,K5,pJ]; ring theorem meanC (n:ℕ) (x:Ἂ Word) (r:ℕ) (c:ℚ) (hn:0 < n) (h : ∀ j,j < n → rationalWord x[r*n+j]! = c):rowMean n x r=c:=by unfold rowMean have e:=foldC (fun j=>rationalWord x[r*n+j]!) c (lj n) 0 (fun j hj=>h j (List.mem_range.mp hj)) rw [e,List.length_range,Ai] have:(n:ℚ)≠0:=by exact_mod_cast (BD.mp hn) field_simp theorem eoV (n:ℕ) (h:Word) (x g b:Ἂ Word) (m:0 < n) (q:0 < rationalWord h) (i:ℕ) (hb:i/n*n+n < 2^(32:ℕ)) (hX : ∀ j,j < i/n*n+n → expOf x[j]! ≠ 255) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) : nEO n h x g b (I0 n).toInt64.toFloat (nLR n h x (i/n)) (G0 i) (G0 (i%n)) = roundRational ((rationalWord x[i]! - rowMean n x (i/n))*rationalWord g[i%n]! / rationalWord (sqrtRational (rowVariance n x (i/n) (rowMean n x (i/n))+rationalWord h))+rationalWord b[i%n]!):=by have r:=ϊ i m have hj1:i/n*n ≤ i:=pr i n have hj2:i < i/n*n+n:=Qy m dsimp only [nEO,nLoN] have hs:=nSv h q simp only [nLo,nLR_th,f6,Conv.aa _ (I4 hj2 hb:i < 2^(32:ℕ)), Conv.aa _ (U1 r (J2 (N2 n _) (I3 hb)):i%n < 2^(32:ℕ)), gP,gN _ _ _ _ m q hb] obtain ⟨v,A, -⟩:=Vn n h x (i/n) m q refine nV3 _ _ _ (nV2 _ _ _ (fun E3 => ?_) (fun E3 => ?_)) (fun E1 E2 => ?_) · rw [← v, ← A]; generalize YU n h x (i/n)=t at *; obtain ⟨u,k,y,o,p,d⟩:=t; dsimp only at * exact Norm.NE.jn _ _ _ d _ n u k o p y _ _ rfl (hX i hj2) (F _ r) (D _ r) m ‹_› (V3L_h1 _ _ _ _ _ v) rfl · rw [← v, ← A] · rw [nLR_el n h x (i/n) hb hX hs i hj1 hj2 _ _ (F _ r) (D _ r) E1 E2] theorem specC (n:ℕ) (x g b:Ἂ Word) (eps:Word) (k:ℕ) (hn:0 < n) (w0:Word) (hK : ∀ j,k/n*n ≤ j → j < k/n*n+n → (x[j]! = w0∨(x[j]! <<< 1=0∧w0<<<1=0))) : roundRational ((rationalWord x[k]! - rowMean n x (k/n))*rationalWord g[k%n]! / rationalWord (sqrtRational (rowVariance n x (k/n) (rowMean n x (k/n))+rationalWord eps))+rationalWord b[k%n]!) = roundRational (rationalWord b[k%n]!):=by have hZ : ∀ j,k/n*n ≤ j → j < k/n*n+n → rationalWord x[j]! = rationalWord w0:=by intro j h1 h2; rcases hK j h1 h2 with e | ⟨e1,e2⟩ · rw [e] · rw [za0 _ e1,za0 _ e2] have hM:rowMean n x (k/n)=rationalWord w0:=meanC n x (k/n) _ hn (fun j hj=>hZ _ (by omega) (by omega)) rw [hM,hZ k (pr k n) (Qy hn),sub_self,zero_mul,zero_div,Ai] @[inline] def cbF (b:Ἂ Word):Ἂ Word:=b.map (fun w=>roundRational (rationalWord w)) @[noinline] def cbS:ST.Ref Unit (Ἂ (WcE cbF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def cbGo (b:Ἂ Word):{v//v=cbF b}:=wcGet3 wcAeq (fun a c h=>wcAeq_ok h) cbS 32 b (fun k=>k) def cbGs (b:Ἂ Word) (s:Ἂ (WcE cbF)) (i:Nat):{v//v=cbF b}:= if h:iwithPtrAddr b (fun p2=> if p1=p2 then (if hk:wcAeq s[i].k b=true then ⟨s[i].v,by rw [s[i].h,wcAeq_ok hk]⟩ else cbGo b) else cbGs b s (i+1)) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else cbGo b termination_by s.size-i @[noinline] def cbG (b:Ἂ Word):Ἂ Word:=(cbGs b (ST.Prim.Ref.get cbS (Void.mk ())).val 0).1 theorem cbG_v (b:Ἂ Word):cbG b=cbF b:=(cbGs b _ 0).2 theorem cbG_sp (b:Ἂ Word) (n:ℕ) (sb:b.size=n) : ∀ j,j < n → (cbG b)[j]! = roundRational (rationalWord b[j]!):=by intro j hj rw [cbG_v,cbF,AB _ j (by rw [m0]; omega),Kt,AB b j (by omega)] theorem cB (n:ℕ) (eps:Word) (x g b:Ἂ Word) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hos:out.size < 2^(32:ℕ)) (hX : ∀ j,j < r*n+n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hN:(4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (hcb : ∀ j,j < n → cb[j]! = roundRational (rationalWord b[j]!)) (hc:(nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true) : Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out = Yq (nEO n eps x g b (I0 n).toInt64.toFloat) (nLR n eps x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out:=by have hm:0 < n:=by simp only [Η,AJ] at hN; omega simp only [Η,AJ] at hc obtain ⟨-, hq⟩:=hc have q1:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*n+n)).toNat=r*n+n:=Conv.aa _ hb have hK:=cQ_spec x _ _ _ _ rfl hq rw [q1,q3] at hK obtain ⟨a1,b1⟩:=ju0 (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) out (by rw [q3]; exact ho) hos obtain ⟨a2,b2⟩:=ju0 (nEO n eps x g b (I0 n).toInt64.toFloat) (nLR n eps x r) (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) out (by rw [q3]; exact ho) hos apply mi (by rw [a1,a2]) intro k k1 k2 rw [← AB _ k k1, ← AB _ k k2,b1 k (a1 ▸ k1),b2 k (a2 ▸ k2),q1,q3] split · rename_i hk have kr:k/n=r:=mG hk.1 (by first | exact hk.2 | (rw [Ο]; exact hk.2) | (rw [Ϡ,n4]; exact hk.2)) have km:k%n=k-r*n:=by rw [Nat.mod_eq_sub_mul_div,kr,Ϗ] have k32:k < 2^(32:ℕ):=I4 hk.2 hb have hsub:G0 k-G0 (r*n)=G0 (k%n):=by apply D6.1 rw [L7 _ _ (by rw [V6,q1,Conv.aa _ k32]; exact hk.1),q1,Conv.aa _ k32, Conv.aa _ (C0 (Ay k n) k32),km] rw [hsub,f6,Conv.aa _ (C0 (Ay k n) k32),hcb _ (ϊ _ hm), ← kr, eoV n eps x g b hm heps k (by rw [kr]; exact hb) (by rw [kr]; exact hX) F D] exact (specC n x g b eps k hm _ (by rw [kr]; exact hK)).symm · rfl theorem cBb (n:ℕ) (x:Ἂ Word) (r:ℕ) (hb:r*n+n < 2^(32:ℕ)) (j:ℕ) (j1:r*n ≤ j) (j2:j < r*n+n) (hj:expOf x[j]! = 255) (hc:(nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true):False:=by simp only [Η,AJ] at hc obtain ⟨hf0,hq⟩:=hc have q1:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*n+n)).toNat=r*n+n:=Conv.aa _ hb rcases cQ_spec x _ _ _ _ rfl hq j (by rw [q1]; exact j1) (by rw [q3]; exact j2) with e | ⟨e1, -⟩ · rw [e] at hj; exact nfeL _ hf0 hj · rw [ez0 _ e1] at hj; exact absurd hj (by decide) @[inline] def cRow (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):ἀ × Ἂ Word := let lo:=G0 (r*n); let hi:=G0 (r*n+n) let w0:=ck x lo if (nfe w0 < 255&&cQ x w0 lo hi)=true then (Xr,Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb lo lo hi out) else nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb theorem cRow_sz (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) : (cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he hx ho hb).1.size=Xr.size ∧ ((cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he hx ho hb).2 = #[] ∨ (cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he hx ho hb).2.size=out.size):=by unfold cRow; dsimp only; split · exact ⟨rfl,BA (nYq_sz _ _ _ _ _ _ _ rfl)⟩ · exact nRow_sz n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb def cRows (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) : (k r:ℕ) → (Xr:ἀ) → (out:Ἂ Word) → n+2 ≤ Xr.size → rows*n ≤ out.size → r+k=rows → Ἂ Word | 0,_,_,out,_,_,_=>out | k+1,r,Xr,out,hr,ho,hk => have kk:r*n+n ≤ rows*n:=nHk2 hk let p:=cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb) have q:p.1.size=Xr.size:=(cRow_sz n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb)).1 if hs:rows*n ≤ p.2.size then cRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC cb hg hd he hx hb k (r+1) p.1 p.2 (q ▸ hr) hs (nHk3 hk) else #[] theorem cRow_eq (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hos:out.size < 2^(32:ℕ)) (hX : ∀ j,j < r*n+n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (hN:(4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (hcb : ∀ j,j < n → cb[j]! = roundRational (rationalWord b[j]!)) : (cRow n eps x g b Xr gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L hC cb r out hr hg hd he hx ho hb).2 = Yq (nEO n eps x g b (I0 n).toInt64.toFloat) (nLR n eps x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out:=by have hm:0 < n:=by simp only [Η,AJ] at hN; omega unfold cRow; dsimp only; split · exact cB n eps x g b cb r out ho hb hos hX heps hN F D hcb (by assumption) · exact nRow_eq n eps x g b Xr gd bd ge _ rm nf ep z0 L hC r out hr hg hd he hx ho hb hos hX heps hG hB hE hN theorem cRow_bad (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (j:ℕ) (j1:r*n ≤ j) (j2:j < r*n+n) (hj:expOf x[j]! = 255) : (cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he hx ho hb).2 = #[]:=by unfold cRow; dsimp only; split · exact (cBb n x r hb j j1 j2 hj (by assumption)).elim · exact nRow_bad n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb j j1 j2 hj theorem cRows_eq (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (hX : ∀ j,j < rows*n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (hN:(4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (hcb : ∀ j,j < n → cb[j]! = roundRational (rationalWord b[j]!)) : ∀ k (r:ℕ) (Xr:ἀ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (ho:rows*n ≤ out.size) (hk:r+k=rows), out.size=rows*n → cRows rows n eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L hC cb hg hd he hx hb k r Xr out hr ho hk = Yr (fun r=>nLR n eps x r) (nEO n eps x g b (I0 n).toInt64.toFloat) n rows r out:=by intro k; induction k with | zero => intro r Xr out hr ho hk hos; rw [Yr,AC (by rw [← hk]; exact N4 r)]; rfl | succ k ih => intro r Xr out hr ho hk hos have kk:=nHk2 (n:=n) hk rw [Yr,AD (hk ▸ X6 (I9 k))] have E:=cRow_eq n eps x g b Xr gd bd ge rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb) (by rw [hos]; exact hb) (fun j hj=>hX j (U1 hj kk)) heps hG hB hE hN F D hcb have S2:(cRow n eps x g b Xr gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb)).2.size=rows*n:=by rw [E,nYq_sz _ _ _ _ _ _ _ rfl,hos] rw [cRows,AT S2.ge] refine (ih (r+1) _ _ _ _ (nHk3 hk) S2).trans ?_ rw [E] theorem cRows_bad (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (hn:0 < n) : ∀ k (r:ℕ) (Xr:ἀ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (ho:rows*n ≤ out.size) (hk:r+k=rows) (j:ℕ), r*n ≤ j → j < rows*n → expOf x[j]! = 255 → cRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC cb hg hd he hx hb k r Xr out hr ho hk = #[]:=by intro k; induction k with | zero=>intro r Xr out hr ho hk j j1 j2 hj; rw [ϑ] at hk; subst hk; omega | succ k ih => intro r Xr out hr ho hk j j1 j2 hj have kk:=nHk2 (n:=n) hk rw [cRows]; split · rename_i S by_cases c:j < r*n+n · rw [cRow_bad n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb) j j1 c hj] at S simp only [Yd] at S; omega · exact ih (r+1) _ _ _ _ (nHk3 hk) j (by rw [Ϡ,n4]; omega) j2 hj · rfl theorem s1S {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {Dl:ἆ} (h:i < e) : nS1 x i e s Dl=nS1 x (i+1) e (s+dw (ck x i)) (if Dl < nfe (ck x i) then nfe (ck x i) else Dl):=by rw [nS1.eq_def x i e s Dl]; simp only [AT h] theorem s1E {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {Dl:ἆ} (h:¬i < e):nS1 x i e s Dl=(s,Dl):=by rw [nS1.eq_def x i e s Dl]; simp only [dite_eq_right h] theorem s2S {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:i < e) : nS2 x m i e v=nS2 x m (i+1) e (v+(dw (ck x i)-m)*(dw (ck x i)-m)):=by rw [nS2.eq_def x m i e v]; simp only [AT h] theorem s2E {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:¬i < e):nS2 x m i e v=v:=by rw [nS2.eq_def x m i e v]; simp only [dite_eq_right h] @[inline] def oE {β:Type} (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd:Ἅ) (r:ℕ) (dW:Word) (m ri:Ἅ) (Kp:ἆ) (v gw bw:Ἅ) (gx:ἆ) (i j:Ἄ) (ex:Option Norm.NR.fH) (k:Word → Option Norm.NR.fH → β):β:= let B:=((v-m)*(gw*ri)+bw).toBits if nOK B (nC (gx+Kp) ((B>>>52)&&&2047)) then k (nW B) ex else let p:=nFB n eps x g b nd r dW ex i j; k p.1 (some p.2) theorem oE_c {β:Type} {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd:Ἅ} {r:ℕ} {dW:Word} {m ri:Ἅ} {Kp:ἆ} {v gw bw v' gw' bw':Ἅ} {gx gx':ἆ} {i j:Ἄ} {ex:Option Norm.NR.fH} {k k':Word → Option Norm.NR.fH → β} (h1:v=v') (h2:gw=gw') (h3:bw=bw') (h4:gx=gx') (h5:∀ o e,k o e=k' o e) : oE n eps x g b nd r dW m ri Kp v gw bw gx i j ex k=oE n eps x g b nd r dW m ri Kp v' gw' bw' gx' i j ex k':=by subst h1 h2 h3 h4; rw [show k=k' from funext fun o=>funext fun e=>h5 o e] theorem f2S {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd m ri:Ἅ} {Kp:ἆ} {r:ℕ} {dW:Word} {ex:Option Norm.NR.fH} {lo t nn:Ἄ} {hg:nn.toNat ≤ g.size} {hd:nn.toNat ≤ b.size} {hx:lo.toNat+nn.toNat ≤ x.size} {hb:lo.toNat+nn.toNat < 2^(32:ℕ)} {out:Ἂ Word} {ho:lo.toNat+nn.toNat ≤ out.size} (h:t < nn) : nFE2 n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho = oE n eps x g b nd r dW m ri Kp (dw (x.uget (lo+t) (nH1 (ε.mp h) hb hx))) (dw (g.uget t (U1 (ε.mp h) hg))) (dw (b.uget t (U1 (ε.mp h) hd))) (nfe (g.uget t (U1 (ε.mp h) hg))) (lo+t) t ex (fun o e=>nFE2 n eps x g b nd m ri Kp r dW e lo (t+1) nn hg hd hx hb (out.uset (lo+t) o (nH1 (ε.mp h) hb ho)) (nH3 _ _ _ _ ho)):=by rw [nFE2.eq_def n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho]; simp only [AT h,oE] theorem f2E {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd m ri:Ἅ} {Kp:ἆ} {r:ℕ} {dW:Word} {ex:Option Norm.NR.fH} {lo t nn:Ἄ} {hg:nn.toNat ≤ g.size} {hd:nn.toNat ≤ b.size} {hx:lo.toNat+nn.toNat ≤ x.size} {hb:lo.toNat+nn.toNat < 2^(32:ℕ)} {out:Ἂ Word} {ho:lo.toNat+nn.toNat ≤ out.size} (h:¬t < nn) : nFE2 n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho=out:=by rw [nFE2.eq_def n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho]; simp only [dite_eq_right h] theorem cku {x:Ἂ Word} {i j:Ἄ} (hij:i=j) (h:j.toNat < x.size):ck x i=x.uget j h:=by subst hij; rw [f6,Dense.cC] theorem k4c {g b:Ἂ Word} {gd bd:ἀ} {ge:ByteArray} (t:Ἄ) {n:ℕ} (ht:t.toNat < n) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (p1:n ≤ gd.size) (p2:n ≤ bd.size) (p3:n ≤ ge.size) (p4:n ≤ g.size) (p5:n ≤ b.size) : gd.uget t (U1 ht p1)=dw (g.uget t (U1 ht p4)) ∧ bd.uget t (U1 ht p2)=dw (b.uget t (U1 ht p5)) ∧ (ge.uget t (U1 ht p3)).toUInt64=nfe (g.uget t (U1 ht p4)):=by refine ⟨?_,?_,?_⟩ · rw [kFU,hG _ ht,Dense.cC] · rw [kFU,hB _ ht,Dense.cC] · rw [nBu,hE _ ht,Dense.cC] @[inline] def sLQ {β:Type} (eps:Word) (s:Ἅ) (Dl:ἆ) (vf:Ἅ->Ἅ) (rm nf ep:Ἅ) (L:ἆ) (k:Ἅ->Ἅ->ἆ->Word->Ἆ->β):β:= let m:=s*rm let v:=vf m let D:=W7 (v*nf+ep) let B:=D.toBits let dW:=nWs 26 B let ed:=expOf dW let E:=((m.toBits>>>52)&&&2047)+9 let a:=L+Dl+1052 let c:=2*L+2*Dl let f:=(expOf eps).toUInt64+178 let d:=if f ≤ c then c-f else 0 k m (nRi dW ed.toUInt64) ((if a ≤ E then E else a)-ed.toUInt64) dW (nOKs B ((if L+4 ≤ d then d else L+4)+2)&&0Ἅ) (rm nf ep:Ἅ) (L:ἆ) (k:Ἅ->Ἅ->ἆ->Word->Ἆ->β) (hL:L.toNat ≤ 64) (hD:Dl.toNat < 255):sLQ eps s Dl vf rm nf ep L k=nLQk eps s Dl vf rm nf ep L k:=by unfold sLQ nLQk nElK3 dsimp only rw [kpU _ _ _ _ hL hD (by rw [Ε]; exact ϝ) (e8 _),lcU _ _ _ hL hD (e8 _)] theorem nCKL {n:ℕ} {eps:Word} {rm nf ep z0:Ἅ} {L:ἆ} (hC:nCK n eps rm nf ep z0 L) (hn:n < 2^(32:ℕ)):L.toNat ≤ 64:=by obtain ⟨-,-,-,-,h⟩:=hC; subst h have h1:Aq (n+4) < 33:=(m9 (by omega)).mpr (by omega) rw [kZ1 (n+4) (by omega),kOfS _ (by omega)]; omega theorem kU {t:Ἄ} {k n N s:ℕ} (ht:t.toNat=k) (hN:n=N) (hk:k < N) (h:n ≤ s):t.toNat < s:=by omega theorem kQ {r n k s:ℕ} {t:Ἄ} (ht:t.toNat=k) (hk:k < n) (hb:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (G0 (r*n)+t).toNat < s:=by have q1:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) hb) rw [nCa (by rw [q1,ht]; omega),q1,ht]; omega theorem cQS {x:Ἂ Word} {w0:Word} {i e:Ἄ} (h:i < e) : cQ x w0 i e=if (ck x i==w0||(ck x i<<<1==0&&w0<<<1==0)) then cQ x w0 (i+1) e else false:=by rw [cQ.eq_def x w0 i e]; simp only [AT h] theorem cQE {x:Ἂ Word} {w0:Word} {i e:Ἄ} (h:¬i < e):cQ x w0 i e=true:=by rw [cQ.eq_def x w0 i e]; simp only [dite_eq_right h] theorem kQl {r n k s:ℕ} {lo t:Ἄ} (hlo:lo=G0 (r*n)) (ht:t.toNat=k) (hk:k < n) (hb:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (lo+t).toNat < s:=by subst hlo; exact kQ ht hk hb ho theorem loS {r n:ℕ} {lo nn:Ἄ} (hlo:lo.toNat=r*n) (hnn:nn.toNat=n) (hb:r*n+n < 2^(32:ℕ)):(lo+nn).toNat=(r+1)*n:=by rw [nCa (by rw [hlo,hnn]; exact hb),hlo,hnn,Ο] theorem lE {lo:Ἄ} {m:ℕ} (h:lo.toNat=m) (hm:m < 2^(32:ℕ)):lo=G0 m:=D6.1 (h.trans (Conv.aa _ hm).symm) noncomputable def cRw (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if (nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true then Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out else nRow1 n eps x g b nd rm nf ep z0 L hC r out hg' hd' hx ho hb theorem uT0:(0:Ἄ).toNat=0:=Ϧ theorem uT1:(0+1:Ἄ).toNat=1:=by rw [nCa (by rw [uT0,mA]; decide),uT0,mA] theorem uT2:(0+1+1:Ἄ).toNat=2:=by rw [nCa (by rw [uT1,mA]; decide),uT1,mA] theorem uT3:(0+1+1+1:Ἄ).toNat=3:=by rw [nCa (by rw [uT2,mA]; decide),uT2,mA] theorem uT4:(0+1+1+1+1:Ἄ).toNat=4:=by rw [nCa (by rw [uT3,mA]; decide),uT3,mA] theorem uT5:(0+1+1+1+1+1:Ἄ).toNat=5:=by rw [nCa (by rw [uT4,mA]; decide),uT4,mA] theorem uT6:(0+1+1+1+1+1+1:Ἄ).toNat=6:=by rw [nCa (by rw [uT5,mA]; decide),uT5,mA] theorem uT7:(0+1+1+1+1+1+1+1:Ἄ).toNat=7:=by rw [nCa (by rw [uT6,mA]; decide),uT6,mA] theorem uT8:(0+1+1+1+1+1+1+1+1:Ἄ).toNat=8:=by rw [nCa (by rw [uT7,mA]; decide),uT7,mA] @[inline] def k4O (out:Ἂ Word) (lo:Ἄ) (o0 o1 o2 o3:Word) (h0:(lo+0).toNat < out.size) (h1:(lo+(0+1)).toNat < out.size) (h2:(lo+(0+1+1)).toNat < out.size) (h3:(lo+(0+1+1+1)).toNat < out.size):Ἂ Word:= ((((out.uset (lo+0) o0 h0).uset (lo+(0+1)) o1 (by rw [BT]; exact h1)).uset (lo+(0+1+1)) o2 (by rw [BT,BT]; exact h2)).uset (lo+(0+1+1+1)) o3 (by rw [BT,BT,BT]; exact h3)) @[inline] def k4 (n:ℕ) (hN:n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= let w0:=ck x (lo); let w1:=ck x (lo+1); let w2:=ck x (lo+1+1); let w3:=ck x (lo+1+1+1) if (nfe w0 < 255&&(if (w0==w0||(w0<<<1==0&&w0<<<1==0)) then if (w1==w0||(w1<<<1==0&&w0<<<1==0)) then if (w2==w0||(w2<<<1==0&&w0<<<1==0)) then if (w3==w0||(w3<<<1==0&&w0<<<1==0)) then true else false else false else false else false))=true then Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb lo lo (G0 (r*n+n)) out else let v0:=dw w0; let v1:=dw w1; let v2:=dw w2; let v3:=dw w3 let D0:=if (0:ἆ) < nfe w0 then nfe w0 else 0 let D1:=if D0 < nfe w1 then nfe w1 else D0 let D2:=if D1 < nfe w2 then nfe w2 else D1 let D3:=if D2 < nfe w3 then nfe w3 else D2 if D3 < 255 then sLQ eps ((((z0+v0)+v1)+v2)+v3) D3 (fun m=>((((z0+(v0-m)*(v0-m))+(v1-m)*(v1-m))+(v2-m)*(v2-m))+(v3-m)*(v3-m))) rm nf ep L (fun m ri Kp dW fast=> if fast then oE n eps x g b nd r dW m ri Kp v0 (gd.uget (0) (kU uT0 hN (by decide) hg)) (bd.uget (0) (kU uT0 hN (by decide) hd)) (ge.uget (0) (kU uT0 hN (by decide) he)).toUInt64 (lo+0) (0) none (fun o0 e1=> oE n eps x g b nd r dW m ri Kp v1 (gd.uget (0+1) (kU uT1 hN (by decide) hg)) (bd.uget (0+1) (kU uT1 hN (by decide) hd)) (ge.uget (0+1) (kU uT1 hN (by decide) he)).toUInt64 (lo+(0+1)) (0+1) e1 (fun o1 e2=> oE n eps x g b nd r dW m ri Kp v2 (gd.uget (0+1+1) (kU uT2 hN (by decide) hg)) (bd.uget (0+1+1) (kU uT2 hN (by decide) hd)) (ge.uget (0+1+1) (kU uT2 hN (by decide) he)).toUInt64 (lo+(0+1+1)) (0+1+1) e2 (fun o2 e3=> oE n eps x g b nd r dW m ri Kp v3 (gd.uget (0+1+1+1) (kU uT3 hN (by decide) hg)) (bd.uget (0+1+1+1) (kU uT3 hN (by decide) hd)) (ge.uget (0+1+1+1) (kU uT3 hN (by decide) he)).toUInt64 (lo+(0+1+1+1)) (0+1+1+1) e3 (fun o3 _=> k4O out lo o0 o1 o2 o3 (kQl hlo uT0 (by rw [hN]; decide) hb ho) (kQl hlo uT1 (by rw [hN]; decide) hb ho) (kQl hlo uT2 (by rw [hN]; decide) hb ho) (kQl hlo uT3 (by rw [hN]; decide) hb ho))))) else nRowS n eps x g b nd r lo (G0 (r*n+n)) out) else #[] theorem k4_eq (n:ℕ) (hN:n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hC:nCK n eps rm nf ep z0 L) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) : k4 n hN eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb=cRw n eps x g b nd rm nf ep z0 L hC cb r out hg' hd' hx ho hb:=by subst hN hlo have q1:(G0 (r*4)).toNat=r*4:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*4+4)).toNat=r*4+4:=Conv.aa _ hb have q2:(G0 4).toNat=4:=Conv.aa _ (C0 (N2 _ _) hb) have o1:(1:Ἄ).toNat=1:=mA have b1:(G0 (r*4)+1).toNat=r*4+1:=by rw [nCa (by rw [q1,o1]; omega),q1,o1] have b2:(G0 (r*4)+1+1).toNat=r*4+2:=by rw [nCa (by rw [b1,o1]; omega),b1,o1] have b3:(G0 (r*4)+1+1+1).toNat=r*4+3:=by rw [nCa (by rw [b2,o1]; omega),b2,o1] have b4:(G0 (r*4)+1+1+1+1).toNat=r*4+4:=by rw [nCa (by rw [b3,o1]; omega),b3,o1] have c0:(G0 (r*4)+0).toNat=r*4:=by rw [nCa (by rw [q1,uT0]; omega),q1,uT0]; rfl have c1:(G0 (r*4)+(0+1)).toNat=r*4+1:=by rw [nCa (by rw [q1,uT1]; omega),q1,uT1] have c2:(G0 (r*4)+(0+1+1)).toNat=r*4+2:=by rw [nCa (by rw [q1,uT2]; omega),q1,uT2] have c3:(G0 (r*4)+(0+1+1+1)).toNat=r*4+3:=by rw [nCa (by rw [q1,uT3]; omega),q1,uT3] have l0:G0 (r*4) < G0 (r*4+4):=ε.mpr (by rw [q1,q3]; exact X6 (by decide)) have l1:G0 (r*4)+1 < G0 (r*4+4):=ε.mpr (by rw [b1,q3]; exact O1 (by decide) _) have l2:G0 (r*4)+1+1 < G0 (r*4+4):=ε.mpr (by rw [b2,q3]; exact O1 (by decide) _) have l3:G0 (r*4)+1+1+1 < G0 (r*4+4):=ε.mpr (by rw [b3,q3]; exact O1 (by decide) _) have l4:¬G0 (r*4)+1+1+1+1 < G0 (r*4+4):=fun h=>by have:=ε.mp h; rw [b4,q3] at this; exact N4 _ this have m0:(0:Ἄ) < G0 4:=ε.mpr (by rw [uT0,q2]; decide) have m1:(0+1:Ἄ) < G0 4:=ε.mpr (by rw [uT1,q2]; decide) have m2:(0+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT2,q2]; decide) have m3:(0+1+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT3,q2]; decide) have m4:¬(0+1+1+1+1:Ἄ) < G0 4:=fun h=>by have:=ε.mp h; rw [uT4,q2] at this; exact N4 _ this unfold k4 cRw nRow1; dsimp only rw [cQS l0,cQS l1,cQS l2,cQS l3,cQE l4] refine ite_congr rfl (fun _=>rfl) (fun _=>?_) rw [s1S l0,s1S l1,s1S l2,s1S l3,s1E l4] simp only [s2S l0,s2S l1,s2S l2,s2S l3,s2E l4] refine ite_congr rfl (fun hD=>?_) (fun _=>rfl) rw [sLQ_e _ _ _ _ _ _ _ _ _ (nCKL hC (by decide)) (by have:=μ.mp hD; simpa using this)] congr 1; funext m ri Kp dW fast cases fast · simp only [υ,↓reduceIte] · simp only [↓reduceIte] obtain ⟨e01,e02,e03⟩:=k4c (0) (n:=4) (by rw [uT0]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e11,e12,e13⟩:=k4c (0+1) (n:=4) (by rw [uT1]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e21,e22,e23⟩:=k4c (0+1+1) (n:=4) (by rw [uT2]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e31,e32,e33⟩:=k4c (0+1+1+1) (n:=4) (by rw [uT3]; decide) hG hB hE hg hd he hg' hd' rw [f2S m0]; refine oE_c (congrArg _ (cku (D6.1 (by rw [q1,c0])) _)) e01 e02 e03 (fun o0 e1=>?_) rw [f2S m1]; refine oE_c (congrArg _ (cku (D6.1 (by rw [b1,c1])) _)) e11 e12 e13 (fun o1 e2=>?_) rw [f2S m2]; refine oE_c (congrArg _ (cku (D6.1 (by rw [b2,c2])) _)) e21 e22 e23 (fun o2 e3=>?_) rw [f2S m3]; refine oE_c (congrArg _ (cku (D6.1 (by rw [b3,c3])) _)) e31 e32 e33 (fun o3 e4=>?_) rw [f2E m4]; rfl @[inline] def kS (n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if h:n=4 then k4 n h eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb else absurd (hK.elim id id) h theorem kS_eq (n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hC:nCK n eps rm nf ep z0 L) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!):kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb=cRw n eps x g b nd rm nf ep z0 L hC cb r out hg' hd' hx ho hb:=by unfold kS; split · exact k4_eq n _ eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb hC hg' hd' hx hG hB hE · exact absurd (hK.elim id id) ‹_› def cRowsK (rows n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) : (k r:ℕ) → (lo:Ἄ) → lo.toNat=r*n → (out:Ἂ Word) → rows*n ≤ out.size → r+k=rows → Ἂ Word | 0,_,_,_,out,_,_=>out | k+1,r,lo,hlo,out,ho,hk => have kk:r*n+n ≤ rows*n:=nHk2 hk let p:=kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb) if hs:T ≤ p.size then cRowsK rows n hK eps x g b gd bd ge nd rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k (r+1) (lo+nn) (loS hlo hnn (C0 kk hb)) p (hT.2.trans hs) (nHk3 hk) else #[] theorem cRowsK_eq (rows n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) (hX : ∀ j,j < rows*n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (hN:(4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (hcb : ∀ j,j < n → cb[j]! = roundRational (rationalWord b[j]!)) : ∀ k (r:ℕ) (lo:Ἄ) (hlo:lo.toNat=r*n) (out:Ἂ Word) (ho:rows*n ≤ out.size) (hk:r+k=rows), out.size=rows*n → cRowsK rows n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k r lo hlo out ho hk = Yr (fun r=>nLR n eps x r) (nEO n eps x g b (I0 n).toInt64.toFloat) n rows r out:=by intro k; induction k with | zero => intro r lo hlo out ho hk hos; rw [Yr,AC (by rw [← hk]; exact N4 r)]; rfl | succ k ih => intro r lo hlo out ho hk hos have kk:=nHk2 (n:=n) hk rw [Yr,AD (hk ▸ X6 (I9 k))] have E:kS n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb) =Yq (nEO n eps x g b (I0 n).toInt64.toFloat) (nLR n eps x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out:=by rw [kS_eq n hK eps x g b gd bd ge _ rm nf ep z0 L cb r lo _ out hg hd he (kk.trans ho) (C0 kk hb) hC hg' hd' (kk.trans hx) hG hB hE] unfold cRw; split · exact cB n eps x g b cb r out (kk.trans ho) (C0 kk hb) (by rw [hos]; exact hb) (fun j hj=>hX j (U1 hj kk)) heps hN F D hcb (by assumption) · exact nRow1_eq n eps x g b _ rm nf ep z0 L hC r out hg' hd' (kk.trans hx) (kk.trans ho) (C0 kk hb) (by rw [hos]; exact hb) (fun j hj=>hX j (U1 hj kk)) heps hN have S2:(kS n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb)).size=rows*n:=by rw [E,nYq_sz _ _ _ _ _ _ _ rfl,hos] rw [cRowsK,AT (hT.1.trans S2.ge)] refine (ih (r+1) _ _ _ _ (nHk3 hk) S2).trans ?_ rw [E] theorem cRowsK_bad (rows n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) (hn:0 < n) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) : ∀ k (r:ℕ) (lo:Ἄ) (hlo:lo.toNat=r*n) (out:Ἂ Word) (ho:rows*n ≤ out.size) (hk:r+k=rows) (j:ℕ), r*n ≤ j → j < rows*n → expOf x[j]! = 255 → cRowsK rows n hK eps x g b gd bd ge nd rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k r lo hlo out ho hk = #[]:=by intro k; induction k with | zero=>intro r lo hlo out ho hk j j1 j2 hj; rw [ϑ] at hk; subst hk; omega | succ k ih => intro r lo hlo out ho hk j j1 j2 hj have kk:=nHk2 (n:=n) hk rw [cRowsK]; split · rename_i S by_cases c:j < r*n+n · have E:kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb)=#[]:=by rw [kS_eq n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo _ out hg hd he (kk.trans ho) (C0 kk hb) hC hg' hd' (kk.trans hx) hG hB hE] unfold cRw; split · exact (cBb n x r (C0 kk hb) j j1 c hj (by assumption)).elim · exact nRow1_bad n eps x g b nd rm nf ep z0 L hC r out hg' hd' (kk.trans hx) (kk.trans ho) (C0 kk hb) j j1 c hj rw [E] at S; simp only [Yd] at S; omega · exact ih (r+1) _ _ _ _ (nHk3 hk) j (by rw [Ϡ,n4]; omega) j2 hj · rfl def Yw3 (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (hW:W=nWF2 (g,b)):Ἂ Word := let nd:=(I0 n).toInt64.toFloat let lg:=ai (I0 n) let rm:=(((1:ἆ)<<<(52+lg))/I0 n).toInt64.toFloat*I5 ((971-lg)<<<52) let nf:=(((1:ἆ)<<<52)/I0 n).toInt64.toFloat let ep:=dw eps*nS201; let z0:=(eps.toUInt64>>>32).toInt64.toFloat let L:=ai (I0 (n+4))+1 have hC:nCK n eps rm nf ep z0 L:=⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (kO0 eps),rfl⟩ if h:x.size=rows*n∧g.size=n∧b.size=n∧rows*n ≤ 4294967295 then if (4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true then have hg:n ≤ W.1.1.size:=by simp only [hW,nWF2,(nWF_sp g).1,h.2.1,le_refl] have hd:n ≤ W.2.1.size:=by simp only [hW,nWF2,(nWF_sp b).1,h.2.2.1,le_refl] have he:n ≤ W.1.2.size:=by simp only [hW,nWF2,(nWF_sp g).2.2.1,h.2.1,le_refl] if h1:rows=1 then (nRow n eps x g b (nZw n) W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L hC 0 (mB (rows*n) 0) (nZw_sz n) hg hd he (by rw [h.1,h1]; omega) (by simp only [X4]; rw [h1]; omega) (by have:=h.2.2.2; rw [h1] at this; omega)).2 else if hK:n=4∨n=4 then cRowsK rows n hK eps x g b W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L (cbG b) hg hd he h.1.ge (Z4 h.2.2.2) (G0 n) (Conv.aa _ (by omega)) (rows*n) ⟨le_refl _,le_refl _⟩ rows 0 0 (Ϧ.trans (ϳ n).symm) (mB (rows*n) 0) (by simp only [X4]; exact Jv _) (Κ rows) else cRows rows n eps x g b W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L hC (cbG b) hg hd he h.1.ge (Z4 h.2.2.2) rows 0 (nZw n) (mB (rows*n) 0) (nZw_sz n) (by simp only [X4]; exact Jv _) (Κ rows) else if x.all finiteWord then layernormStable rows n eps x g b else #[] else mB (rows*n) 0 theorem V3L3 (e n:ℕ) (h:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (hW:W=nWF2 (g,b)) (m:0 < n) (B:e*n < 2^(32:ℕ)) (q:0 < rationalWord h) (H : ∀ i,i < e*n → expOf x[i]! ≠ 255) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (sx:x.size=e*n) (sg:g.size=n) (sb:b.size=n) : Yw3 e n h x g b W hW=layernormStable e n h x g b:=by rw [Yw3]; dsimp only; split · rename_i hs; split · rename_i hN have G:=nWF_sp g; have Bq:=nWF_sp b have e1:W.1=nWF g:=by rw [hW]; rfl have e2:W.2.1=(nWF b).1:=by rw [hW]; rfl rw [← e1] at G; rw [← e2] at Bq have hG:=fun t (ht:t < n)=>G.2.1 t (by rw [hs.2.1]; exact ht) have hB:=fun t (ht:t < n)=>Bq.2.1 t (by rw [hs.2.2.1]; exact ht) have hE:=fun t (ht:t < n)=>G.2.2.2 t (by rw [hs.2.1]; exact ht) split · rename_i h1; subst h1 have Y:=V3Lo 1 n h x g b m B q H F D rw [Yr,AD Nat.zero_lt_one,Κ,Yr,AC (N4 1)] at Y refine Eq.trans (nRow_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only [X4]; exact B) (by rw [ϳ,Κ]; intro j hj; exact H j (by rw [n4]; exact hj)) q hG hB hE hN) ?_ simp only [ϳ,Κ] at Y ⊢; exact Y · split · rename_i hK exact (cRowsK_eq _ _ hK _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (kO0 h),rfl⟩ _ _ _ _ sg.ge sb.ge _ _ _ _ _ _ H q hG hB hE hN F D (cbG_sp b n sb) _ 0 _ _ _ _ _ (by simp only [X4])).trans (V3Lo e n h x g b m B q H F D) · exact (cRows_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ H q hG hB hE hN F D (cbG_sp b n sb) _ 0 _ _ _ _ _ (by simp only [X4])).trans (V3Lo e n h x g b m B q H F D) · rename_i hN have X:x.all finiteWord=true:=np.mpr (fun i hi=>by have t:=H i (sx ▸ hi); rw [AB x i hi] at t; simp only [finiteWord,AM,Ak]; exact t) rw [AD X] · rename_i hn; exact absurd ⟨sx,sg,sb,U2 B⟩ hn theorem V3L3_bad (e n:ℕ) (h:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (hW:W=nWF2 (g,b)) (m:0 < n) (B:e*n < 2^(32:ℕ)) (sx:x.size=e*n) (sg:g.size=n) (sb:b.size=n) (hX:x.all finiteWord=false):Yw3 e n h x g b W hW = #[]:=by obtain ⟨j,j2,hj⟩ : ∃ j,j < e*n∧expOf x[j]! = 255:=by by_contra c; simp only [not_exists,not_and] at c have:x.all finiteWord=true:=np.mpr (fun i hi=>by have t:=c i (sx ▸ hi); rw [AB x i hi] at t; simp only [finiteWord,AM,Ak]; exact t) rw [this] at hX; exact absurd hX (by decide) rw [Yw3]; dsimp only; rw [AT ⟨sx,sg,sb,U2 B⟩]; split · have G:=nWF_sp g; have Bq:=nWF_sp b have e1:W.1=nWF g:=by rw [hW]; rfl have e2:W.2.1=(nWF b).1:=by rw [hW]; rfl rw [← e1] at G; rw [← e2] at Bq split · rename_i h1; subst h1; exact nRow_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j (by omega) (by omega) hj · split · rename_i hK exact cRowsK_bad _ _ hK _ _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (kO0 h),rfl⟩ _ _ _ _ sg.ge sb.ge _ _ _ _ _ _ m (fun t ht=>G.2.1 t (by rw [sg]; exact ht)) (fun t ht=>Bq.2.1 t (by rw [sb]; exact ht)) (fun t ht=>G.2.2.2 t (by rw [sg]; exact ht)) _ 0 _ _ _ _ _ j (by omega) j2 hj · exact cRows_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ m _ 0 _ _ _ _ _ j (by omega) j2 hj · simp only [hX,υ, ↓reduceIte] def bnC (rows n:ℕ) (eps:Word) (x g b:Ἂ Word):Ἂ Word := if rows > 0∧n > 0∧x.size=rows*n∧g.size=n∧b.size=n∧rows*n ≤ 4294967295 then let W:=nWG2 g b if (W.2.2&&finiteWord eps&&(!signOf eps&&Core.mW eps != 0))=true then let r:=Yw3 rows n eps x g b W (nWG2_v g b) if (r.size==rows*n)=true then r else layernormSpec rows n eps x g b else layernormSpec rows n eps x g b else layernormSpec rows n eps x g b theorem bnC_eq:bnC=layernormSpec:=by funext l n m x g b unfold bnC; split · rename_i h; obtain ⟨l0,n0,sx,sg,sb,B⟩:=h; dsimp only; split · rename_i h2 have e:(nWG2 g b).2.2=(g.all finiteWord&&b.all finiteWord):=by rw [nWG2_v]; rfl rw [e] at h2 by_cases hX:x.all finiteWord=true · have E:Yw3 l n m x g b (nWG2 g b) (nWG2_v g b)=layernormSpec l n m x g b:=by have h:(SN l n m x g&&b.size==n&&b.all finiteWord)=true:=by simp only [Η] at h2 rw [SN]; simp only [Η,AQ,AJ] exact ⟨⟨⟨⟨⟨⟨⟨⟨⟨l0,n0⟩,sx⟩,sg⟩,hX⟩,h2.1.1.1⟩,h2.1.2⟩,h2.2⟩,sb⟩,h2.1.1.2⟩ have sz:=h; simp only [SN,Η,AQ] at sz; rw [fG] at h; rw [layernormSpec,layernormWith,AD h]; simp only [Η] at h obtain ⟨a,e,c,d⟩:=jm h.1.1; have o:b.size=n:=by simpa using h.1.2 exact V3L3 l n m x g b _ _ a (by omega) e c d (fun j p=>Norm.NR.ic b (by simpa [np] using h.2) j (by exact B5 p (id (Eq.symm o)))) sz.1.1.1.1.1.1.1.2 sz.1.1.1.1.1.1.2 o rw [E]; simp only [ite_self] · have Z:=V3L3_bad l n m x g b _ (nWG2_v g b) n0 (by omega) sx sg sb (M9.mpr hX) have N:¬((#[]:Ἂ Word).size==l*n)=true:=by simp only [Yd,AQ]; exact W8 (Ϯ l0 n0) rw [Z,AC N] · rfl · rfl end NXc def kernels:Kernels:= { Z6 with dense:=⟨Dense.c7,gC⟩ conv:=⟨cvK,dwK,Z6.conv.convTranspose⟩ elem:=⟨apK,mpK,Bn.cq,Bn.br⟩ rnn:=⟨Rnn.lstmK Dense.c7 SAct.sg SAct.th,Rnn.gruK Dense.c7 SAct.sg SAct.th⟩ norm:=⟨NX.rms,NXc.bnC⟩ } theorem dwK_eq:dwK=M6:=by funext s relu inp wts b;unfold dwK;split ·rename_i h;rw[Η]at h;rw[Conv.cY,dwB s h.1] ·split ·rename_i h;simp only[Η]at h exact K1.runD_eq s relu inp wts b _ (by simp only[Z6,Q8];rfl) h.1 ·simp only[Z6,Q8];rfl theorem apK_eq:apK=Kn:=by funext s inp;unfold apK;split ·rename_i h;rw[Conv.eV,apB s h] ·simp only[Z6,Q8];rfl theorem mpK_eq:mpK=Ko:=by funext s inp;unfold mpK;split ·rename_i h;rw[Conv.fo,mpB s h] ·simp only[Z6,Ux] theorem correct:Obligation kernels:=by have h:=Pinned.correct simp only[Obligation,Z6]at h simp only[Obligation,kernels,Z6,Dense.eD,gCv,cvK_eq,dwK_eq,apK_eq,mpK_eq,Bn.dT,Bn.cO,NX.rms_eq,NXc.bnC_eq, SAct.sg_eq,SAct.th_eq,Q8,Rnn.lstmK_spec,Rnn.gruK_spec] rw[←h] simp only[Q8,Ux] all_goals rfl end Submission