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))⟩ @[inline] def hq (r:Float):Float := ((((Float.ofBits 0xbf56c16c16c16c17*r+Float.ofBits 0x3f81111111111111)*r + Float.ofBits 0xbfa5555555555555)*r+Float.ofBits 0x3fc5555555555555)*r + Float.ofBits 0xbfe0000000000000)*r+Float.ofBits 0x3ff0000000000000 @[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 * Float.ofBits ((ee+873)<<<52) @[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) * (Float.ofBits 0x3ff0000000000000-r*hq r) let d:=Float.ofBits 0x3ff0000000000000+t let y:=if w < 0x80000000 then Float.ofBits 0x3ff0000000000000/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/(Float.ofBits 0x4000000000000000-nu) else let t:=(tE.get! (k>>>6).toNat*tT.get! (k&&&63).toNat) * (Float.ofBits 0x3ff0000000000000-r*hq r) (Float.ofBits 0x3ff0000000000000-t)/(Float.ofBits 0x3ff0000000000000+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 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 hex:rv (rOf ee m)=(rI.toNat:ℝ)*2^((ee.toNat:ℤ)-150):=by show rv (rI.toInt64.toFloat*Float.ofBits ((ee+873)<<<52))=_ rw [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 ⟨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| ≤ 1:=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 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| ≤ 1/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 ⟨g4,e4,b4⟩:=hstep f5 hr f4 hR h0 h1 (c5.trans (by norm_num)) c4 have ⟨g3,e3,b3⟩:=hstep g4 hr f3 hR h0 h1 e4 c3 (b4.trans (by norm_num [abs_div])) have ⟨g2,e2,b2⟩:=hstep g3 hr f2 hR h0 h1 e3 c2 (b3.trans (by norm_num [abs_div])) have ⟨g1,e1,b1⟩:=hstep g2 hr f1 hR h0 h1 e2 c1 (b2.trans (by norm_num [abs_div])) obtain ⟨g0,e0, -⟩:=hstep g1 hr f0 hR h0 h1 e1 c0 (b1.trans (by norm_num [abs_div])) exact ⟨g0,e0⟩ 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*(1/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)) (3/2^49):=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 [if_pos 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 [if_pos ⟨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 [if_pos 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 [if_neg 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 [if_pos c1] at h ⊢ by_cases c2:(w&&&0x7FFFFFFF==0)=true · rw [if_pos c2]; exact sgZero w (by simpa using c2) · rw [if_neg c2] at h; exact absurd rfl h rw [if_neg 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 [if_pos c3]; simp only [Bool.and_eq_true,decide_eq_true_eq] at c3; exact sgSat w c3.1 c3.2 c1.2 rw [if_neg c3] at h ⊢ by_cases c4:0x42AE0000 ≤ w&&&0x7FFFFFFF · rw [if_pos c4] at h; exact absurd rfl h rw [if_neg 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 [if_pos c1] at h ⊢ by_cases c2:(w&&&0x7FFFFFFF==0)=true · rw [if_pos c2]; exact thZero w (by simpa using c2) · rw [if_neg c2] at h; exact absurd rfl h rw [if_neg 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 [if_pos c3]; exact thSat w c3 c1.2 rw [if_neg c3] at h ⊢ by_cases c4:(rnd (thY w).toBits==0xFFFFFFFF)=true · rw [if_pos c4] at h; exact absurd (beq_iff_eq.1 c4) h rw [if_neg 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 [if_neg (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 [if_neg (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&&0inp[(q.val%k/kh)*h+q.val/k+q.val%k%kh]! def trn(rows cols:Nat)(Y:Array Word):Array Word:=Array.ofFn (n:=cols*rows) fun q=>Y[(q.val%rows)*cols+q.val/rows]! theorem c1F(s:ConvShape)(hc:c1Ok s=true):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∧0by simp[z]at h1)) have hi:(q%ho)*s.cout+q/hoinp[c*h+q.val/kh+q.val%kh]! def dwRows(s:ConvShape)(relu:Bool)(inp wts b:Array Word)(lin:Nat->Nat->Nat->Bool->Array Word->Array Word->Array Word->Array Word):Array Word:= let ho:=s.h+1-s.kh let Ys:=Array.ofFn (n:=s.cin) fun c=>lin ho s.kh 1 relu (im2d s.h s.kh ho c.val inp) (Array.ofFn (n:=s.kh) fun t=>wts[c.val*s.kh+t.val]!) #[b[c.val]!] Array.ofFn (n:=s.cin*ho) fun q=>(Ys[q.val/ho]!)[q.val%ho]! theorem lin_dw1(s:ConvShape)(hc:d1Ok s=true)(relu:Bool)(inp wts b:Array Word): dwRows s relu inp wts b linearSpec=depthwiseSpec s relu inp wts b:=by have hc':c1Ok s=true:=hc obtain⟨hw,hkw,hsh,hsw,hpt,hpl,hpb,hpr,hdh,hdw,hk0,hkh⟩:=c1F s hc' have e1:s.depthwise.ho=s.h+1-s.kh:=by simp only[ConvShape.ho,ConvShape.ekh,ConvShape.depthwise,hpt,hpb,hdh,hsh,Nat.one_mul,Nat.add_zero,Nat.div_one];omega have e2:s.depthwise.wo=1:=by simp only[ConvShape.wo,ConvShape.ekw,ConvShape.depthwise,hpl,hpr,hdw,hsw,hw,hkw,Nat.one_mul,Nat.add_zero,Nat.div_one] unfold dwRows depthwiseSpec depthwiseWith conv2dWith apply Array.ext · simp only[Array.size_ofFn];rw[e1,e2];simp[ConvShape.depthwise] intro q h1 h2 simp only[Array.size_ofFn]at h1 generalize hH:s.h+1-s.kh=ho at * have hcin:0by simp[z]at h1) have e3:s.depthwise.taps=s.kh:=by simp only[ConvShape.taps,ConvShape.cpg,ConvShape.depthwise,Nat.div_self hcin,Nat.one_mul,hkw,Nat.mul_one] have e4:s.depthwise.opg=1:=by simp only[ConvShape.opg,ConvShape.depthwise,Nat.div_self hcin] have e5:s.depthwise.cpg=1:=by simp only[ConvShape.cpg,ConvShape.depthwise,Nat.div_self hcin] have hq:q/hoby simp[z]at h1)) simp only[Array.getElem_ofFn,e1,e2,e3,e4,Nat.mul_one,Nat.div_one,Nat.mod_one] rw[getElem!_pos (Array.ofFn _) (q/ho) (by simpa using hq),Array.getElem_ofFn] unfold linearSpec linearWith rw[getElem!_pos (Array.ofFn _) (q%ho) (by simpa using hr),Array.getElem_ofFn] simp only[Nat.div_one,Nat.mod_one,Nat.zero_mul,Nat.zero_add] congr 2 · funext t by_cases ht:tUSize.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 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,Nat.le_sub_of_add_le (by rw[Τ];exact (J1 ((by decide):23<=25) j).trans h),(Nat.le_add_left 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=Int.negSucc a∧e+j- -149=Int.negSucc (a-j)∧a-j+1=a+1-j∧j+2<=a+1:=by obtain⟨a,v,y⟩:∃a:Ἀ,e- -149=Int.negSucc a∧j+2<=a:=⟨(Int.toNat (-(e+149)-1)),by omega,by omega⟩ exact⟨a,v,by (clear * - v y;omega),(Nat.sub_add_comm ((V1 j 2).trans y)).symm,y.trans (Nat.le_succ 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) (Nat.le_succ 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 ἅ,if_pos k.2.1,if_pos 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 _ (Nat.le_sub_of_add_le h) end lemma ab(n:Ἀ)(f:Ἀ->ἇ)(k:Ἀ)(d:kf (Fin.val 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 Nat.succ_add_eq_add_succ i k):i+1+k=i+(k+1))]) rfl lemma cH(n:Ἀ)(d e:Ἀ->kF): dsum (kK (n:=n) λi=>d (Fin.val i)) (kK (n:=n) λi=>e (Fin.val 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,Bool.and_false,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[Array.getElem_map,m6];exact AM.2 (h k (Nat.lt_of_lt_of_eq 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:=Nat.le_of_eq (Κ _) have hb:0+(A.map (kT (fmt:=lU))).size<=(B.map (kT (fmt:=lU))).size:=Nat.le_of_eq ((Κ _).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 (Nat.lt_of_lt_of_eq 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 (Fin.val i)) (kK (n:=n) λi=>p (Fin.val 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:ἇ):ἆ:=(UInt32.toUInt64 (w&&&8388607))|||(f5 w<<<23) @[inline]def iW(w:ἇ):ἆ:=(UInt32.toUInt64 ((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[Nat.and_two_pow,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:ἆ):ἇ:= (UInt64.toUInt32 (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 (UInt64.toUInt32 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 (UInt64.toUInt32 (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,Nat.zero_div]))];simp only[Nat.pow_succ,m7]at d⊢;rw[Ϗ (2^k)];exact⟨e,by rwa[Nat.mul_right_comm]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,β,Nat.div_eq_zero_iff]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 Nat.two_mul k.toNat)) lemma dr(n:Ἀ)(h:n<2):(Aq n)=0:=by rw[Nat.log2_def,AC (by exact Nat.not_le_of_lt 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[if_pos a,if_pos a];rw[if_neg a,if_neg a];by_cases b:d<64;rw[if_pos b,if_pos b,gH _ _ (fun h=>a (by subst h;rfl)) b];rw[if_neg b,if_neg 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,UInt64.ofNat_toNat,(ξ.1 ((Α ((Nat.sub_le _ _).trans_lt p)).trans (χ d 1 (θ.2 (Nat.one_le_iff_ne_zero.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:ἆ):(UInt64.toUInt32 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),Int.ofNat (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):(Int.natAbs ((e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456))=(18446744073709551616-e)*18446744073709551616/\(e:Ἁ)*18446744073709551616<340282366920938463463374607431768211456:=by have k:(e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456=-(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by rw[Nat.cast_mul,pO m.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by exact_mod_cast Ϯ (Nat.sub_pos_of_lt m) (϶ 64) exact⟨by rw[k,Int.natAbs_neg,Int.natAbs_cast],by rw[←sub_neg,k];exact neg_neg_of_pos p⟩ lemma fk_h2(e d:Ἀ)(m:e<18446744073709551616)(o:d<18446744073709551616):(Int.natAbs ((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[Nat.cast_add,Nat.cast_mul,pO (Nat.le_of_lt_succ m),pO o.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551615-e)*18446744073709551616+(18446744073709551616-d):Ἀ):Ἁ):=by exact_mod_cast (Nat.sub_pos_of_lt o).trans_le (Nat.le_add_left _ _) exact⟨by rw[k,Int.natAbs_neg,Int.natAbs_cast],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 [Int.reducePow,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 [Int.reducePow,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 [Int.reducePow,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(UInt32.toUInt64 (az neg mlo B)) else if mhi>>>32==0 then let q:=(mhi<<<32)+(mlo>>>32) (UInt32.toUInt64 (az neg (if mlo&&&0xFFFFFFFF==0 then q else q|||1) (B+32))) else(UInt32.toUInt64 (az neg (if mlo==0 then mhi else mhi|||1) (B+64))) lemma toUInt32_toUInt64(x:ἇ):(UInt64.toUInt32 (UInt32.toUInt64 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[if_pos (AQ.mpr (ξ.mp (k.trans (c.trans ϋ.symm)))),if_pos (AQ.mpr c)];exact l · rw[if_neg (fun q=>c (k.symm.trans ((congrArg lq (AQ.mp q)).trans ϋ))),if_neg (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,ο,β,Nat.mod_add_mod];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⟨(Nat.mul_eq_zero.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/\ (UInt64.toUInt32 (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[if_pos t]at h;exact (UInt64.lt_irrefl _ h).elim rw[if_neg 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[if_pos p]at h;exact (UInt64.lt_irrefl _ h).elim rw[if_neg p]at h⊢;have g:(lq B)<=442:=θ.1 (UInt64.not_lt.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[if_pos j,(congrArg lq (AQ.1 j)).trans ϋ,ϳ,Κ,toUInt32_toUInt64,aJ _ _ _ (g.trans ((by decide):442<=506))] rw[if_neg j];have v:(lq (aQ d e))≠0:=λl=>j (by simp[<-ξ,l]) by_cases l:(aQ d e>>>32==0)=true · rw[if_pos l];have q:(lq (aQ d e))<2^(32:Ἀ):=Nat.lt_of_not_le fun h=>BD.1 (Nat.div_pos 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[if_neg l];have u:2^(32:Ἀ)<=(lq (aQ d e)):=Nat.not_lt.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=(UInt64.toUInt32 (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 (UInt64.toUInt32 (x-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 M))%2^(23:Ἀ)=(G-110)*2^(23:Ἀ)+r:=by obtain⟨d,rfl⟩:=Nat.exists_eq_add_of_le w;obtain⟨e,f⟩:=Nat.exists_eq_add_of_le 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 Nat.lt_of_add_lt_add_left 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 (UInt64.toUInt32 ((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 γ ((Nat.add_lt_add_right (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) ((Nat.add_lt_add_of_lt_of_le (Nat.add_lt_add_right s _) (Nat.le_of_lt_succ 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:=⟨(Nat.add_lt_add_right p _).trans (by decide),(Nat.add_lt_add_of_lt_of_le (Nat.add_lt_add_right p _) (Nat.le_of_lt_succ (ϊ _ ((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 ((Nat.le_of_eq ἅ).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 (Nat.le_succ _),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 Nat.ne_zero_of_lt 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[if_neg (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 Nat.lt_or_ge 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 ἅ,Nat.add_left_comm,Nat.sub_add_cancel h] have s1:S-172<18446744073709551616:=Nat.sub_lt_left_of_lt_add h (hS.trans ((by decide):63+2^(64:Ἀ)<172+18446744073709551616)) rw[e,Nat.add_mod_right,γ 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:Ἀ):=(Nat.add_le_add (ι (2^(23:Ἀ)) (Nat.sub_le_sub_right 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 _ (Nat.le_of_lt_succ A)).trans (congrArg (·-62) (Τ _ _)) rw[u2];exact⟨Nat.sub_le_iff_le_add.2 (((by decide):62<=172).trans (y.trans_eq (Τ _ _))),ἅ,Nat.le_sub_of_add_le y,(Nat.sub_le_sub_right (Nat.le_of_lt_succ k) 62).trans_lt (by decide),(Nat.le_add_left _ _).trans (k.le.trans ((by decide):425<=506)),(Nat.sub_le _ _).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:Ἀ)) (Nat.sub_le_sub_right 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 (Nat.le_of_lt_succ 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=(UInt32.toUInt64 (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:=Nat.add_lt_of_lt_sub ((μ.1 F).trans_eq (χ 0x8000000000000000 p (θ.2 g)));have E:(lq m)=(lq (m-p))+(lq p):=(congrArg lq (UInt64.sub_add_cancel m p).symm).trans ((η _ _).trans (γ (H.trans (by decide))));exact⟨(Nat.le_add_left _ _).trans_eq E.symm,E.trans_lt H⟩ have o:(lq m)≠0:=Nat.ne_of_gt (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,Nat.add_mod_mod]at q⊢;exact dZ_h3 _ (Nat.add_lt_add A B.toNat_lt) q refine⟨j.1,j.2,dZ_h6 _ _ y A,Nat.le_of_lt_succ ((Nat.le_add_left _ _).trans_lt k),?_⟩;have D:(lq (62-L))=62-l:=by rw[χ _ _ (by rw[θ,r];exact Nat.le_of_lt_succ A),r]<;>rfl have z:(lq m)*2^(62-l)<2^(63:Ἀ):=AN (ϐ g (϶ _)) (by rw[<-AF];exact Θ (by decide) (Nat.le_of_eq (by rw[lO,Nat.add_sub_cancel' (Nat.le_of_lt_succ A)])));have w:(lq (m<<<(62-L)))=(lq m)*2^(62-l):=by rw[ψ,D,ο,γ (AO (Nat.sub_le _ _) (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,Nat.add_sub_cancel' (Nat.le_of_lt_succ 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 Nat.mul_ne_zero 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),(Nat.add_sub_cancel' 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,Nat.sub_sub]:(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,Nat.div_eq_zero_iff,OfNat.ofNat_ne_zero,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 Nat.lt_of_succ_le 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 Nat.bitwise_rec_lemma 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[Nat.log2_def 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 Nat.bitwise_rec_lemma 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[Nat.mod_eq_sub_mod k,γ (Nat.sub_lt_left_of_lt_add k (Nat.add_lt_add hL hb)),γ ((Nat.lt_succ_self _).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:Ἀ):=Nat.lt_of_not_le λh=>c (by rw[Nat.mod_eq_sub_mod h,γ (Nat.sub_lt_left_of_lt_add h (Nat.add_lt_add hL hb))];exact Nat.sub_lt_left_of_lt_add 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,Nat.sub_add_cancel (AZ j (by decide))],pow_one,Nat.mul_div_mul_right _ _ ((by positivity):0<2^(lq s))] have:=l.toNat_lt;simp only[gd,μ,η,ψ,ν,d,ο,β,γ (AO j (by decide):(lq s)<64),γ (AO (Nat.sub_le _ _) (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,Bool.not_false,υ,ἁ,ἂ,↓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 Nat.mul_eq_zero.1 h with h|h<;>rw[h]<;>simp only[Nat.cast_zero,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=(UInt64.toUInt32 (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:=Nat.le_antisymm ht (Nat.sub_eq_zero_iff_le.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,γ ((Nat.add_le_add 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 (Nat.add_le_add 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 _▸Nat.add_le_add G l) ?_ j;rw[D,J,q,A,Nat.cast_add _ T];ring have q:=V r u I;refine e (t+1) _ _ o p y X x (by rw[q];exact Ο t _▸Nat.add_le_add I l) (G.trans m) ?_ j;rw[D,J,q,A,Nat.cast_add _ 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 (UInt64.toUInt32 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 Nat.lt_of_succ_le 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): |Model.roundAt 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:(Int.natAbs (Int64.toInt i))<2^(53:Ἀ)):fv i.toFloat/\rv i.toFloat=(Int64.toInt i):=by have g:kI i.toFloat.toModel=kE kC (kR (Int64.toInt 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 (Int64.toInt i) 0).toReal=(Int64.toInt i):=by rw[<-ϖ,nD];simp have⟨j,l⟩:=lL kC (by decide) (kR (Int64.toInt i) 0) (Int.natAbs (Int64.toInt i)) 0 (by simp[kR]) e (by simp[kR];decide) (by rw[d];exact AZ (((by rw[<-mI,Ϲ];exact_mod_cast e.le:|((Int64.toInt 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:=Int.le_sub_left_of_add_le (Int.add_le_add_right (Int.add_le_add_right (Int.ofNat_le.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[Nat.cast_mul,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 (Nat.le_mul_of_pos_right 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:Model.modelSign (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₂ (·*·) (Model.unpackedToReal_finite l o g v) (Model.unpackedToReal_finite 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 ἅ,ἁ,Model.ieeeRoundDyadic,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),Model.unpackedToReal_zero,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,Int.cast_one,pow_zero]⟩ |succ k e=> have⟨f,v⟩:=e (by exact Nat.le_of_succ_le 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 Int.neg_ofNat_le_natCast 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 (Fin.val i)<256 then pw ((Fin.val i)-1)else nm*pw ((Fin.val 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 (UInt32.toUSize (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:(Int.natAbs 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:ἇ):(Int.natAbs (sv w))<2^(24:Ἀ):=by have:=lB w;rw[sv];split<;>simp<;>exact Nat.lt_of_succ_le this lemma bL(a b c:Ἀ)(e:a+b<=c)(h:c<=971)(z:Ἁ)(g:(Int.natAbs 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:(Int64.toInt u.toInt64)=n:=by rw[show (Int64.toInt u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [Int.natAbs_natCast,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:=(Nat.sub_le _ _).trans (h.le.trans (by decide)) lemma qV_h2(x c:Ἀ)(h:x<256):1+(x-c)<=971:=(J1 ((Nat.sub_le _ _).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 (UInt32.toUSize (w>>>23)) h)/\∃σ:Ἁ, (∀v,k9 v=k9 w->σ*kM v=sv v)/\(Int.natAbs σ)=1/\ rv (A.uget (UInt32.toUSize (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):(Int64.toInt (-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 Int.neg_ofNat_le_natCast 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 ((Nat.mul_lt_mul_of_pos_left hK (by decide)).trans_le (by decide)),(by decide:(-1074:Ἁ)<=0).trans (Nat.cast_nonneg _),(J1 ((Nat.sub_le _ _).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 (UInt32.toUSize (w>>>23)) h)/\ rv (u.toInt64.toFloat*A.uget (UInt32.toUSize (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:(Int.natAbs (((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 dJ_h1(a b:Ἀ)(h:a<256)(k:b<256):48+(a-1+(b-1))<=971:=AZ (J1 (Nat.add_le_add ((Nat.sub_le _ _).trans h.le) ((Nat.sub_le _ _).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:(Int.natAbs (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[Nat.and_two_pow,β,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=Model.ofFields kC (v.toBits>>>63!=0) ((lq ((v.toBits>>>52)&&&2047))) ((lq (v.toBits&&&0xfffffffffffff))):=by have d:Model.expField (kI v.toModel)=(lq ((v.toBits>>>52)&&&2047)):=ἅ;have e:Model.fracField (kI v.toModel)=(lq (v.toBits&&&0xfffffffffffff)):=ἅ;have g:Model.signBit (kI v.toModel)=(v.toBits>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Model.signBit,AM,Ak];rw[<-UInt64.toBitVec_inj];exact Iff.rfl rw[<-Model.ofFields_signBit_expField_fracField (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,Model.toDyadic?_ofFields_of_isFinite _ _ _ _ j l e,AC d];simp only[show kC.fracWidth=52 from ἅ,show kC.exponentBias=1023 from ἅ,Model.pow2_eq_two_pow];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 Ne.symm (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[Model.eq_of_toReal_eq_of_nonzero 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:Ἀ):=⟨(Nat.add_lt_add_right (ϐ t (by decide)) _).trans_le (by decide),(Nat.add_lt_add_of_lt_of_le (Nat.add_lt_add_right (ϐ t (by decide)) _) (Nat.le_of_lt_succ 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:Ἀ)),Nat.mul_div_mul_right _ _ (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),(Nat.mod_add_div' 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:Ἀ):=⟨(Nat.add_lt_add_right (ϊ _ (by decide)) _).trans_le (by decide),by rw[show (2:Ἀ)^(63:Ἀ)=2^(52:Ἀ)*2^(11:Ἀ) by norm_num,Nat.mod_mul];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 (Nat.add_le_add l l) (by decide))];exact Nat.le_trans (Nat.add_le_add l l) (by decide))),η,hb,γ (C0 (Nat.add_le_add l l) (by decide))] at q' rw[η,η,hb,pS,γ (C0 (L1 l 1) (by decide)),ha,γ (U1 (Nat.add_lt_add_of_lt_of_le (q'.trans_le (Nat.sub_le _ _)) (L1 l 1)) (by decide))] at e rw[<-e];exact⟨Nat.le_add_left _ _,by rw[pA,lO G 1 G,<-pA];exact Nat.succ_lt_succ (Nat.add_lt_of_lt_sub q')⟩ lemma j3_h4(f:ἆ)(v:(lq f)<4503599627370496):(lq ((f+268435456)&&&536870911))=((lq f)+268435456)%536870912:=by rw[Ε,η,γ (U1 (Nat.add_lt_add_right 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:=Ϟ ((Nat.add_lt_add_right p _).trans_le (by decide)) generalize (f+2^(28:Ἀ))/2^(29:Ἀ)=k at * obtain⟨e,rfl⟩:=Nat.exists_eq_add_of_le 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,Nat.add_mod_left,γ ((Nat.add_le_add (ι (2^(31:Ἀ)) (Nat.le_of_lt_succ q)) (Nat.add_le_add (ι (2^(23:Ἀ)) ((Nat.le_add_left e 1195).trans_lt o).le) (J1 (Nat.le_of_lt_succ 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),(Nat.add_lt_add_right (((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:Ἀ)),Nat.mod_mul];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,β,ο,Nat.add_mod_mod];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[Nat.add_mod_left,γ (a.trans (by decide))];exact c.ne'⟩ rw[show (2^(31:Ἀ):Ἀ)=2^(23:Ἀ)*2^(8:Ἀ) from rfl,Τ,mv _ _ (by decide),Nat.add_mod_right,γ (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/\(UInt64.toUInt32 (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,β,ϋ,pM] 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(Nat.not_lt_zero _ (Nat.lt_of_succ_lt_succ (Nat.lt_of_succ_lt_succ 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(Nat.sub_le_sub_right 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:=⟨Nat.le_sub_of_add_le e1,(Nat.sub_le_sub_right e2 1085).trans_lt (by decide),(Nat.sub_le_sub_right (Nat.sub_le_sub_right 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:(UInt64.toUInt32 (((S.toBits>>>63)<<<31)+(((S.toBits&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000))=R:=by apply Β.mp;rw[F,Ϫ,D,γ];exact Nat.add_lt_add_of_le_of_lt (by split<;>decide) ((Nat.add_le_add (ι (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,Nat.cast_pow,nZ,<-AA] rw[<-AK AL,show (((lq h):Ἀ):Ἁ)=(((lq h)+1075-l:Ἀ):Ἁ)+((l:Ἁ)-1075) by rw[pO d1,Nat.cast_add,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[Nat.cast_mul,Nat.cast_pow,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,ἁ,neg_mul]<;>rw[t] refine AE ?_ q.le rw[pO K,sub_mul] exact sub_le_comm.mp B refine AE ?_ q.le rw[Nat.cast_add,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[υ,Am,ἁ,neg_mul]<;>rw[t] rw[Nat.cast_add] 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 Nat.le_of_succ_le j),g t j,h,j,g] structure A8 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ local instance:Inhabited A8:=⟨⟨0,0,0,0,0,0,0,0⟩⟩ 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 structure A9 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ o:Ἃ noncomputable def A9.s(R:A9):A8:=⟨R.a0,R.a1,R.a2,R.a3,R.a4,R.a5,R.a6,R.a7⟩ local instance:Inhabited A9:=⟨⟨0,0,0,0,0,0,0,0,0⟩⟩ 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,Nat.sub_add_eq,l,BK],r.trans_le (N1 l),λe=>(Nat.lt_succ_of_lt e).trans_eq r.symm,λh e=>r.trans_le (Nat.lt_of_le_of_ne h (Ne.symm 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,Model.isFinite_ofFields _ _ _ _ (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 Nat.ne_of_lt 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 ((Nat.cast_lt.mpr d).trans_eq (Nat.cast_pow 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 (Nat.add_lt_add_right (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:=Nat.le_antisymm Q (Nat.sub_eq_zero_iff_le.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): (UInt64.toUInt32 (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 (Nat.le_of_sub_eq_zero l);rw[aO,dif_neg (λ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 Nat.pred 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 Nat.sub_le_sub_right 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:=Nat.not_lt.2 (Nat.sub_eq_zero_iff_le.1 h);rw[if_neg q,if_neg q] .rename_i ih;have q:=N1 h;rw[if_pos q,if_pos q];exact ih _ _ ((Nat.sub_succ n t).trans (congrArg Nat.pred 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:=Nat.le_antisymm S (Nat.sub_eq_zero_iff_le.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 (UInt64.toUInt32 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[Nat.and_two_pow,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),Nat.add_mod_right,γ (q.trans (by decide))] at t exact absurd t (Nat.ne_of_lt q) unfold reluW;rw[if_pos (by simp only[h1,h2,decide_false,Bool.false_and,Bool.not_false,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[if_true] 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,ζ,Nat.mod_mod_of_dvd _ (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[if_pos h];exact ha h · rw[if_neg 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 (Nat.lt_succ_of_lt 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[if_neg hT] rw[show kE lU (ofIntDyadic T (-298))=ofUInt32 (roundDyadic (ofIntDyadic T (-298))) from (ofUInt32_roundDyadic _).symm,bD] unfold p8;rw[if_pos 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,if_true] 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[Nat.cast_add,Nat.cast_pow,nZ,zpow_ofNat];exact le_add_of_nonneg_left (Nat.cast_nonneg _) 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 (UInt64.toUInt32 (ak S h))=0:=by unfold p8;rw[if_pos 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:Ἀ):=Nat.le_of_lt_succ ((ϸ (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:Ἀ):=ι _ (Nat.le_of_lt_succ 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 (UInt64.toUInt32 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 mA52 (x:ℕ):x&&&4503599627370495=x%4503599627370496:=ζ x 52 theorem mA29 (x:ℕ):x&&&536870911=x%536870912:=ζ x 29 theorem mA63 (x:ℕ):x&&&9223372036854775807=x%9223372036854775808:=ζ x 63 theorem mA23 (x:ℕ):x&&&8388607=x%8388608:=ζ x 23 theorem mA8 (x:ℕ):x&&&255=x%256:=ζ x 8 theorem kAkF(S:Ἅ)(h:ἆ)(e:ak S h<4294967296):kB (UInt64.toUInt32 (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 [if_pos c] simp only [Η,AJ] at c obtain ⟨⟨⟨-, l⟩, -⟩, -⟩:=c have hB:=b.toNat_lt simp only [μ,θ,BC,Ζ,η,Ε,ψ,ν,ϩ,kA,kH,nr,Nat.reduceMul,ο,β,mA11,mA52,mA29,mA63,mA23,true_or,or_true,true_and,and_true,le_refl] 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 [μ,θ,BC,Ζ,η,Ε,ψ,ν,ϩ,kA,kH,nr,Nat.reduceMul,ο,β,mA11,mA52,mA29,mA63,mA23,true_or,or_true,true_and,and_true,le_refl]; (clear * - l hX;omega) have hs:((b>>>63)<<<31).toNat=0∨((b>>>63)<<<31).toNat=2147483648:=by simp only [μ,θ,BC,Ζ,η,Ε,ψ,ν,ϩ,kA,kH,nr,Nat.reduceMul,ο,β,mA11,mA52,mA29,mA63,mA23,true_or,or_true,true_and,and_true,le_refl]; (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 [μ,θ,BC,Ζ,η,Ε,ψ,ν,ϩ,kA,kH,nr,Nat.reduceMul,ο,β,mA11,mA52,mA29,mA63,mA23,true_or,or_true,true_and,and_true,le_refl,Ξ,Υ,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[Nat.two_mul,<-pA];exact (Nat.sub_le _ _).trans_lt ((Nat.add_le_add J D).trans_lt (by decide)),Int.ofNat_le.2 ((Τ L P).trans_le J)⟩ lemma jE_h2(K L:Ἀ)(y:K<=1993)(D:L<=27):K+L-1076<2^(63:Ἀ):=(Nat.sub_le _ _).trans_lt ((Nat.add_le_add 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((Nat.le_succ _).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[if_pos 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[if_neg 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,Finset.sum_range_zero,Av,sub_self,A5,Nat.cast_zero,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(Nat.sub_le_of_le_add (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 (Fin.val q):=by intro k;induction k with |zero=>intro a j g d;rw[da,AC (Nat.not_lt.2 (Nat.le_of_sub_eq_zero j))];exact mi ((Nat.le_antisymm g (Nat.le_of_sub_eq_zero 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 ((Nat.sub_add_eq _ _ _).trans (congrArg (·-1) j))) ((ϣ _).trans_le (N1 j)) λi h=>if q:iα)(N:Ἀ): da f N (lQ N)=kK (n:=N) λq=>f (Fin.val q):=by exact iC_h1 f N _ _ rfl (ϟ N) λi h=>(Nat.not_lt_zero i h).elim lemma dN(n:Ἀ)(e d:Ἀ->kF):∀c i,i+c=n-> nC (kK (n:=n+1) λt=>if (Fin.val t)if (Fin.val t)e (Fin.val t)) (kK (n:=n) λt=>d (Fin.val t)) i c:=by intro c;induction c with |zero=>intro i h;obtain rfl:i=n:=(by exact Nat.add_right_cancel 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:=Nat.le_antisymm Q (Nat.sub_eq_zero_iff_le.1 D) rw [ao,if_neg (AX _)]; exact ⟨e,o⟩ | succ m G => intro t a D Q e o have d:t < n:=N1 D rw [ao,if_pos 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 (Nat.cast_le.2 Q) hu)).trans_lt hBK) refine G (t+1) (a+p t) (by rw[Nat.sub_add_eq,D,BK]) d this.1 ?_ rw [Ν, ← add_assoc,Nat.cast_succ,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 ((Nat.lt_succ_self n).trans_le ((Nat.le_succ _).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 (Nat.sub_le_iff_le_add.2 (J1 (Nat.mul_le_mul_left 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) ((Finset.abs_sum_le_sum_abs _ _).trans (((Finset.sum_le_sum (fun s hs=>E s ((ϥ.1 hs).le.trans ht))).trans_eq ((Finset.sum_const _).trans ((congrArg (· • (2:ℝ)^P) (Finset.card_range t)).trans (nsmul_eq_mul _ _)))).trans (AE (Nat.cast_le.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):ℝ) + ·) (Finset.sum_range_zero _).symm))))).trans A5).trans_le (Af (Nat.cast_nonneg 0) hU.le)) refine ⟨R.1,?_⟩ exact (congrArg (fun x => |rv (ao p n 0 h0)-x|) ((congrArg Int.cast (Ν (fun s=>tm (d s) (e s)) n)).trans ((Int.cast_add _ _).trans ((congrArg (· + ((tm (d n) (e n):ℤ):ℝ)) (Int.cast_sum _ _)).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 Nat.lt_or_ge 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 (Nat.sub_le_sub_right 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 [Int.cast_neg,Int.cast_natCast,BE,nE]).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) rw [tm,Int.cast_mul,Int.cast_mul,Int.cast_pow,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 (Nat.add_le_add 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:=Nat.le_antisymm 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,if_pos h] theorem aoe (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:n ≤ t):ao p n t a=a:=by rw [ao,if_neg (by exact Nat.not_lt.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 System.Platform.numBits_eq 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 FloatLib.Numerics.StaticStorage.lt_capacity 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,USize.toNat_ofNat]; exact γ (by have:=s5nb; exact FloatLib.Numerics.StaticStorage.lt_capacity 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,if_true,if_false]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 (Nat.le_of_not_lt 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:Ἅ local instance:Inhabited A16:=⟨⟨0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0⟩⟩ def rMu(W:Ἂ Ἃ)(k e:Ἄ)(m:Ἃ):Ἃ:= if h:k>>24 termination_by (J0 e)-(J0 k) decreasing_by all_goals (rw[ac h];exact Nat.sub_succ_lt_self 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:=Nat.sub_eq_zero_iff_le.1 hm; rw [tBi,dif_neg (by rw [ε]; exact not_lt.2 z)]; dsimp only exact ⟨by rw[hA,Nat.le_antisymm 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,dif_pos (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,←Nat.sub_sub,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 Nat.lt_succ_of_lt hi),s5push_get,if_pos (by rw[hA];exact hi)],fun p hp1 hp2 => ?_⟩ rcases Nat.lt_or_ge o.toNat p with hp | hp · exact r3 p (by rw [e1]; exact hp) hp2 · have pe:p=o.toNat:=Nat.le_antisymm hp hp1 subst pe rw [r2 _ (by rw [e1]; exact Nat.lt_succ_self _),s5push_get,if_neg (by rw[hA];exact AX _),if_pos 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 [Array.usize] rw [ε,uz,γ (hWs.trans_le ς)]; exact kb rw [if_pos hw,dif_pos kl,if_pos hw',s5uget,hk] · have hw':¬ o.toNat < ow.toNat:=fun h=>hw (ε.mpr h) rw [if_neg hw,if_neg 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:=Nat.le_of_sub_eq_zero hm; rw [rMu,dif_neg (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,dif_pos (by rw [ε]; exact h1)] have kl:k < W.usize:=by have uz:W.usize.toNat=W.size%kX:=by simp [Array.usize] rw [ε,uz,γ (hWs.trans_le ς)]; exact h1.trans_le he simp only [dif_pos kl] obtain ⟨i1,i2⟩:=ih (k+1) e _ (by rw[e1,←Nat.sub_sub,hm,BK]) he have mono : ∀ a b:ἇ,a ≤ b → (a>>>24).toNat ≤ (b>>>24).toNat:=fun a b h=>by simp only [Υ,β]; exact ϭ (UInt32.le_iff_toNat_le.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 Nat.lt_or_ge 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:=Nat.le_of_sub_eq_zero hm; rw [da,if_neg (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,if_pos (N1 hm)] refine ih _ (by simp; (clear * - hm ha;omega)) (by simp; exact N1 hm) (fun i h => ?_) simp at h rcases Nat.lt_or_ge i a.size with h1|h1 · rw [AB _ i (by simp; exact Nat.le_of_succ_le 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)) ((Int.natAbs_pow 2 _).trans_le (Θ two_pos (Nat.add_le_add (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 (Nat.cast_natAbs _).symm:|(tm ld w:ℝ)|=_).trans_le (((Nat.cast_le (α:=ℝ)).mpr (H1.trans H2)).trans_eq ((Nat.cast_pow 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 Nat.lt_trichotomy a b with h | h | h · exact absurd e (Nat.ne_of_lt (hm a b h hb)) · exact h · exact absurd e.symm (Nat.ne_of_lt (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 [Finset.mem_image,ϥ] at hs ⊢ obtain ⟨k,hk,rfl⟩:=hs; exact hI k hk · intro s hs hn; simp only [Finset.mem_image,ϥ,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 ((Nat.sub_le _ _).trans ((congrArg (P + ·) (Nat.two_mul L)).trans_le ((pA P L L).symm.trans_le ((Nat.add_le_add hPL r).trans (by decide)))):_ ≤ 1000) (by decide))] have Ew : ∀ s < n,expOf W[j*n+s]! ≠ 255:=fun s hs h=>Nat.not_le_of_lt (Ι.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 (if_pos hs)).trans_le (A s hs).2) (fun s hs=>(congrArg (fun w=>(expOf w).toNat) (if_pos hs)).trans_le (hw s hs)) ((congrArg₂ (fun a b => |((tm a b:ℤ):ℝ)|) (if_neg (AX n)) (if_neg (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 (if_pos hk)).trans_le (A _ (hI k hk)).2) (fun k hk=>(congrArg (fun w=>(expOf w).toNat) (if_pos hk)).trans_le (hw _ (hI k hk))) ((congrArg₂ (fun a b => |((tm a b:ℤ):ℝ)|) (if_neg (AX c)) (if_neg (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 (if_pos hkn)).symm.trans H),fun H=>Ew k hkn ((congrArg expOf (if_pos hkn)).symm.trans H)⟩ else ⟨fun H=>(by decide:expOf ld≠255) ((congrArg expOf (if_neg hkn)).symm.trans H),fun H=>K.1 ((congrArg expOf (if_neg 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 Int.cast (congrArg₂ tm (if_pos hk) (if_pos hk))).symm)) ((dJ ld b[j]! (by decide) K.1).imp_right (fun H=>H.trans (congrArg Int.cast (congrArg₂ tm (if_neg (AX c)) (if_neg (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 (if_pos (ϥ.1 hk)) (if_pos (ϥ.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 (if_pos (ϥ.1 hs)) (if_pos (ϥ.1 hs))).symm)) ((congrArg₂ tm (if_neg (AX c)) (if_neg (AX c))).trans (congrArg₂ tm (if_neg (AX n)) (if_neg (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 Int.cast (congrArg₂ tm (if_pos hs) (if_pos hs))).symm)) ((dJ ld b[j]! (by decide) K.1).imp_right (fun H=>H.trans (congrArg Int.cast (congrArg₂ tm (if_neg (AX n)) (if_neg (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 γ (Nat.lt_trans h (by decide)) theorem kOfS (n:ℕ) (h:n < 2^(63:Ἀ)):n.toUInt64.toNat=n:=by rw [Ϣ,UInt64.toNat_ofNat']; exact γ (Nat.lt_trans 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 (Float.Model.sub x.toModel y.toModel)=_;rw[Float.Model.sub,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 (Float.ofBits a).toModel=Model.ofModelBits (fmt:=kC) a.toBitVec:=by have e1:kI (Float.ofBits a).toModel=Model.canonicalizeModel (Model.ofModelBits (fmt:=kC) a.toBitVec):=by show BB (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:FloatFormat.binary64.toModel.exponentBits=11:=rfl have k2:FloatFormat.binary64.toModel.mantissaBitsWithoutImplicit=52:=rfl simp [nX,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 ξ.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:ἆ):Model.ofModelBits (fmt:=kC) a.toBitVec=Model.ofFields kC (a>>>63!=0) ((lq ((a>>>52)&&&2047))) ((lq (a&&&0xfffffffffffff))):=by have d:Model.expField (Model.ofModelBits (fmt:=kC) a.toBitVec)=(lq ((a>>>52)&&&2047)):=ἅ have e:Model.fracField (Model.ofModelBits (fmt:=kC) a.toBitVec)=(lq (a&&&0xfffffffffffff)):=ἅ have g:Model.signBit (Model.ofModelBits (fmt:=kC) a.toBitVec)=(a>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Model.signBit,AM,Ak];rw[<-UInt64.toBitVec_inj];exact Iff.rfl rw[<-Model.ofFields_signBit_expField_fracField (Model.ofModelBits (fmt:=kC) a.toBitVec),d,e,g] lemma s5pw(m:ℕ)(z:Ἁ):((2^m:ℕ):ℝ)*(2:ℝ)^(z-m)=(2:ℝ)^z:=by rw[Nat.cast_pow,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,Nat.and_two_pow,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 Nat.lt_or_ge (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,if_neg (by (clear * - l c;omega)),nj]) cases relu<;>simp[h0,hz,fa] · have h1:w>>>31=1:=Β.mp (by rw[b,UInt32.toNat_one];exact mG c l) have hn:(w&&&0x80000000)≠0:=fun q=>by have:=congrArg mJ q;rw[s1,if_pos (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^((Fin.val 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 Array.size_replicate)⟩ 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,Array.size_replicate];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,dif_neg (λ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,dif_neg (λh=>Nat.sub_ne_zero_of_lt (ε.1 h) e),c q (AN hq a),if_pos (AN hq (Nat.le_of_sub_eq_zero 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[if_pos ἅ,if_pos (by exact lt_add_one iб),kr] .rw[if_neg q1];by_cases q2:q< (J0 i) .rw[if_pos q2,if_pos (Nat.lt_succ_of_lt q2)] .rw[if_neg q2,if_neg (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[if_pos q2,if_pos (Nat.lt_succ_of_lt q2)] .by_cases q3:q=(J0 i) .subst q3;rw[if_neg q2,if_pos (by exact lt_add_one iб),An K _ (λhh=>k (ε.2 (kz▸hh)))];rfl .rw[if_neg q2,if_neg (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:=Nat.sub_lt_sub_left h (Nat.lt_succ_self r) theorem k7d1:1≤7:=Nat.le_of_ble_eq_true rfl theorem k7d2:2≤7:=Nat.le_of_ble_eq_true rfl theorem k7d3:3≤7:=Nat.le_of_ble_eq_true rfl theorem k7d4:4≤7:=Nat.le_of_ble_eq_true rfl theorem k7d5:5≤7:=Nat.le_of_ble_eq_true rfl theorem k7d6:6≤7:=Nat.le_of_ble_eq_true rfl theorem k7d7:7≤7:=Nat.le_of_ble_eq_true 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:=Nat.le_of_sub_eq_zero H;rw[(kX8.eq_1 Wd XT wo n hW hX h31 t a0 a1 a2 a3 a4 a5 a6 a7).trans (dif_neg (by rw[ε];exact Nat.not_lt.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 (Nat.mul_le_mul_left 8 (Nat.le_of_lt ht)) h31.2),kc8] have hw:(J0 (wo+t))=(J0 wo)+(J0 t):=kSm _ _ (AO (J1 (Nat.le_of_lt 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 (dif_pos h)) (IH (t+1) _ _ _ _ _ _ _ _ (by rw[ac h,Nat.sub_add_eq,H,BK]) l hl) (ac h) ((kX8_spec_h1 _ _ _ _ _ _ _ _ _ _ _ (by rw[h8];exact AO ((J1 ((by decide):7<=8) _).trans (Nat.mul_le_mul_left 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:=UInt64.toUInt32 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) else (0xFFFFFFFF:ἇ) @[inline] def mx2(a c:ἆ):ἆ:=if aNat.sub_ne_zero_of_lt (ε.mp h) hk,fun h=>Nat.sub_ne_zero_of_lt 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,dif_neg (kS0 t n hk).1,sT,if_neg (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[Array.uget,q1] have u2:∀hh,Wd.uget (wo+t) hh=Wd.get! ((J0 wo)+(J0 t)):=fun hh=>by rw[ug,gg,q2] rw[sTb,dif_pos h1,sT,if_pos (ε.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 (UInt64.toUInt32 c)else aB () theorem sTB_h(a n:Ἀ)(h:a+n<2^(31:Ἀ)):(J0 (G0 a))=a∧(J0 (G0 n))=n:= ⟨USize.toNat_ofNat_of_lt' (AN (AN ((V1 a n).trans_lt h) (by decide)) ς),USize.toNat_ofNat_of_lt' (AN (AN ((Nat.le_add_left 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,dif_neg (fun h=>(kS0 t n hk).1 h.1),sT,if_neg (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,dif_pos ⟨h1,h3⟩,sT,if_pos (ε.mp h1)];dsimp only;rw[u1,u2,ih (t+1) (q+8) _ _ h2 (by rw[q8,ac h1,hq,Nat.mul_succ,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[Ϧ,USize.toNat_ofNat_of_lt' (AN (AN h.2.2.2.2 (by decide)) ς)];rfl),e.1,e.2,Ϧ] · rfl theorem tR_tS(relu:Ἆ)(L n:Ἀ)(p:Ἀ->Ἅ)(a0:Ἅ)(aB:Unit->Ἃ):tR relu L (sT p n 0 a0 0) aB=tS relu L n p (fun _=>a0) aB:=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:=Nat.le_of_sub_eq_zero 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 (dif_neg (by rw[ε];exact Nat.not_lt.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 (dif_neg (by rw[ε];exact Nat.not_lt.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 (dif_neg (by rw[ε];exact Nat.not_lt.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 (dif_pos 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 (dif_pos 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 (dif_pos h)] exact IH (t+1) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by rw[ac h,Nat.sub_add_eq,H,BK]) @[inline] def dwA(w:ἇ):Ἅ:=(Core.mW w).toInt64.toFloat*P.uget (UInt32.toUSize ((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 (Nat.mul_le_mul_left 8 hk).trans_lt (C0 (V1 _ _) h8)),kc8] rw [kSm _ _ (by rw [e8k]; exact C0 (Nat.add_le_add (Nat.mul_le_mul_left 8 hk) (Nat.le_of_lt_succ 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 (Nat.sub_ne_zero_of_lt (ε.mp h)) · exact uZ _ _ _ _ | succ m ih => intro k Y a hY hm; have h1:(J0 k) < (J0 n):=N1 hm rw [dRw8,dif_pos (ε.mpr h1)]; rw [ih (k+1) _ _ _ (by rw [ac (ε.mpr h1),Nat.sub_add_eq,hm,BK]),uZ] theorem kBRn (b r n:Ἄ)(l:ℕ)(hr:(J0 r)intro r Y hY hm; rw [dX8,dif_neg (show ¬ r < lim from fun h=>Nat.sub_ne_zero_of_lt (ε.mp h) hm)] | succ m ih => intro r Y hY hm; have h1:(J0 r) < (J0 lim):=N1 hm rw [dX8,dif_pos (ε.mpr h1)]; rw [ih (r+1) _ _ (by rw [ac (ε.mpr h1),Nat.sub_add_eq,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 owcK3eq_ok a b) wcBS 32 (b,ow,N) (fun k=>k.1) def bBs(b:Ἂ ἇ)(ow N:Nat)(s:Ἂ (WcE wcBF))(i:Nat):{v:ἀ//v=wcBF (b,ow,N)}:= if h:iwithPtrAddr b (fun p2=>if p1=p2 then (⟨s[i].v,s[i].h.trans (congrArg wcBF (wcK3eq_ok _ _ hk))⟩:{v:ἀ//v=wcBF (b,ow,N)}) else bBo b ow N) (fun _ _=>wcSub _ _)) (fun _ _=>wcSub _ _) else bBs b ow N s (i+1) else bBo b ow N termination_by s.size-i @[inline] def bBg(b:Ἂ ἇ)(ow N:Nat):{v:ἀ//v=wcBF (b,ow,N)}:=bBs b ow N (ST.Prim.Ref.get wcBS (Void.mk ())).val 0 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 Core.f5; rw [kSh,UInt32.and_assoc,UInt32.and_assoc,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,dif_neg (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,dif_pos (ε.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:rtrue |k+1=>let x:=X[rn+k]!;(x==0||x==0x80000000)&&zrRw X rn k theorem zrRw_ok(X:Ἂ ἇ)(rn:Nat):∀k,zrRw X rn k=true→∀sabsurd hs (Nat.not_lt_zero _) |k+1,h,s,hs=>by simp only[zrRw,Η,nM,AQ]at h by_cases e:s=k ·rw[e];exact h.1 exact zrRw_ok X rn k h.2 s (by omega) theorem zrNC(a q:Ἂ Ἃ):∀m i,(decide (kM a[i+m]!*kM q[i+m]! = 0)&&Bool.xor (k9 a[i+m]!) (k9 q[i+m]!))=false→nC a q i (m+1)=false |0,i,h=>by simp only[ϑ]at h;simp only[nC,h,Bool.false_and] |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),Bool.and_false] theorem zrDot(n:ℕ)(D Wf:ℕ→Ἃ)(hz:∀srw[h]<;>exact⟨by decide,hW k e⟩ ·rw[show k=n by omega,hDn,hWn];exact⟨by decide,by decide⟩ have hS:af (n+1) D Wf=0:=by unfold af;apply Finset.sum_eq_zero;intro k hk;have:=ϥ.mp hk;by_cases e:krw[h]<;>decide simp only[tm,e0,zero_mul] ·rw[show k=n by omega,hWn];simp only[tm,show sv (0:Ἃ)=0 by decide,mul_zero,zero_mul] rw[Core.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),Bool.and_false];decide @[noinline] def sQ2(relu:Ἆ)(n:Nat)(X W b E:Ἂ ἇ)(ix ib L:Nat)(Y Q:ἀ)(vo rn j:Nat)(hh:ἆ)(v:Ἅ):ἇ:= if b[j]! == 0&&(E[j]!).toUInt64<(255:ἆ)&&zrRw X rn n then 0 else 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,dif_neg (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,dif_pos (ε.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:=Nat.sub_eq_zero_iff_le.1 hm; rw [tPt,dif_neg (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:=Nat.sub_add_cancel (Nat.le_add_right_of_le (hgB.resolve_right (Nat.zero_lt_of_lt h1).ne')) have e8:B+(t+1).toNat*8=B+t.toNat*8+8:=by rw [e1,Ϡ,n4,pA] rw [tPt,dif_pos (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,←Nat.sub_sub,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 Nat.lt_or_ge 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:=Nat.sub_eq_zero_iff_le.1 hm; rw [tPg8,dif_neg (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,dif_pos (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 Nat.eq_zero_or_pos n.toNat with h|h · exact BA h · exact pZ (by rw[eg]; exact Nat.le_mul_of_pos_right _ 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,←Nat.sub_sub,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 Nat.lt_add_right (nб*8) hi),b2 i hi],fun g s l hg1 hg2 hs hl => ?_⟩ rcases Nat.lt_or_ge 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,dif_neg (by rw [ε]; (clear * - hm;omega))] | succ m ih => intro gi A hm; have h1:gi.toNat < G.toNat:=by exact N1 hm rw [tPg8,dif_pos (by rw [ε]; exact h1),ih (gi+1) _ (by rw[ac (ε.mpr h1)]; (clear * - hm h1;omega)),tPt,dif_neg (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 Nat.eq_zero_or_pos n with hO|hO · subst hO; refine ⟨?_,fun t ht=>by (clear * - ht;omega)⟩; simp only [wcT8F]; rw [tPg8_n0 _ _ _ _ (by simp only [lX,USize.toNat_ofNat',Nat.zero_mod]) _ _ _ 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 Nat.lt_of_lt_of_eq 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:=Int.lt_zpow_succ_log_self (R:=ℝ) (b:=2) (by norm_num) |z|; simpa using this have h2:(2:ℝ)^(ph 2 |z|) ≤ |z| := by have:=Int.zpow_log_le_self (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:=Nat.le_antisymm Q (Nat.sub_eq_zero_iff_le.1 D) rw [ao,if_neg (AX _)]; exact ⟨e,o⟩ | succ m G => intro t a D Q e o have ht:t < n:=N1 D rw [ao,if_pos 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 ((Finset.abs_sum_le_sum_abs _ _).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 (Nat.le_of_lt 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 [Nat.sub_add_eq,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 (Nat.cast_nonneg _) htT hc E o) rw [Nat.cast_succ,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 [UInt32.and_assoc,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 [UInt32.and_assoc,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 [υ,if_false]; 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:(Int64.toInt u.toInt64)=n:=by rw[show (Int64.toInt u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [Int.natAbs_natCast,nr];exact Nat.lt_of_succ_le 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 [χ _ _ (UInt64.le_of_lt 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 Nat.le_of_not_lt 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 (Nat.ofNat_nonneg _) (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) (Nat.ofNat_nonneg 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:=(Nat.one_le_ofNat.trans hT4).trans ((le_mul_of_one_le_left hT0 Nat.one_le_ofNat).trans (hHbig.trans hHb)) have Q:=(AE (mul_le_mul_of_nonneg_left (add_le_add_left hn1 1) (Nat.ofNat_nonneg 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,Ϩ,Ϩ,Int.natAbs_pow,(by decide:(sv ld).natAbs=2^23),(by decide:idxOf ld=126)] refine Nat.le_trans (ι 2 (ϧ (Nat.mul_le_mul_left _ (bg w).le) (Θ (n:=2) (by decide) (J1 K 126)))) ?_ rw [← m7, ← m7, ← Nat.pow_succ] exact Θ (by decide) (by (clear * - al;omega)) rw [← mI,Ϲ,Int.cast_natCast] 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,Ϲ,Int.cast_natCast,Nat.cast_mul,Nat.cast_pow,nZ] have hS : ∑ s∈kP n,(sv (l s)).natAbs*2^(kG (l s)) ≤ 2^(304:Ἀ):=by refine (Finset.sum_le_card_nsmul _ _ (2^(277:Ἀ)) fun s hs => ?_).trans ?_ · exact (ϧ (bg (l s)).le (Θ Nat.zero_lt_two ((aT (l s)).trans_le (Nat.sub_le_of_le_add (Nat.le_of_lt_succ (Nat.lt_of_le_of_ne (Nat.le_of_lt_succ (bm (l s))) (A' s (ϥ.1 hs)))))))).trans_eq (m7 2 24 253).symm · rw [Finset.card_range,smul_eq_mul]; exact (ι _ hn27).trans_eq (m7 2 27 277).symm have hnR:(n:ℝ) ≤ 134217728:=Nat.cast_le.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 ▸ Nat.cast_nonneg _ have hΛb:Λ ≤ 2^(304:Ἀ):=hΛS ▸ (Nat.cast_le.2 hS).trans_eq (by rw [Nat.cast_pow,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,Finset.sum_range_zero,Nat.cast_zero,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:=Nat.mul_le_mul_left 9 (Nat.succ_le_succ 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):=(Nat.cast_mul _ _).trans (congrArg₂ (·*·) nZ (Nat.cast_succ n)) have hFn:=FN.2.trans ((Int.cast_natCast _).trans e) have Zr:=kRM _ Lf FN.1 hf (((Ae _ _).trans (congrArg (·*|rv Lf|) ((congrArg abs hFn).trans (Ad ((Nat.cast_nonneg _).trans_eq e))))).trans_le ((mul_le_mul (e.symm.trans_le (((Nat.cast_le (α:=ℝ)).mpr (a.trans (by decide))).trans_eq ((Nat.cast_pow 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:ℝ)) (Nat.cast_add _ 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:=Nat.le_of_not_lt fun hl=>absurd (Nat.le_of_add_le_add_right (Hn.trans (Θ Nat.zero_lt_two (Nat.le_of_lt_succ hl)):n+2 ≤ 0+2)) (Nat.not_le_of_lt hn) have hn27:n ≤ 134217728:=(V1 n 2).trans (Hn.trans (Θ Nat.zero_lt_two 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' ▸ Nat.not_le_of_lt he) have hT:=Finset.abs_sum_le_sum_abs (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,Finset.mul_sum]; exact Finset.sum_le_sum (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) (Nat.le_of_ble_eq_true rfl:425 ≤ 960)).trans_eq (AA (2:ℝ) 960).symm)) n 0 _ (pQ n) (ϟ _) hd.1 (by rw [hd.2,Finset.sum_range_zero,Av,sub_self,A5,Nat.cast_zero,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,Int.cast_add,af,Int.cast_sum,add_comm,if_neg (AX n),if_neg (AX n)] exact congrArg _ (ϔ rfl (fun s hs=>have h:=ϥ.1 hs; congrArg₂ (fun a b=>((tm a b:ℤ):ℝ)) (if_pos h) (if_pos 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 [if_pos hkn]; exact ⟨A k hkn,Ew k hkn⟩ · simp only [if_neg 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 [if_pos 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 [if_neg hc,Az,ἁ]; exact hfb · have cF:(decide (e < 255)&&decide (p ≤ 372))=false:=Bool.and_eq_false_iff.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 by_cases hc:(b[j]! == 0&&(E[j]!).toUInt64<(255:ἆ)&&zrRw X rn n)=true ·unfold sQ2;rw[if_pos hc];simp only[Η,AQ,AJ]at hc;obtain⟨⟨hb0,hE⟩,hz⟩:=hc have hE':(E[j]!).toNat<255:=by have:=μ.1 hE;simpa using this rw[zrDot n _ _ (fun s hs=>by simp only[hs,if_true];exact zrRw_ok X rn n hz s hs) (fun s hs h=>by simp only[hs,if_true]at h;have:=hEv s hs;rw[h]at this;simp at this;omega) (by simp) (by simp[hb0])];cases relu<;>decide 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; rw[if_neg hc]; dsimp only simp only [sTQ_eq,tR_tS] 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 [if_pos 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 [if_neg 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 [χ _ _ (UInt64.le_of_lt hc)]; simp only [kA,tsub_le_iff_right,Nat.reduceAdd,ge_iff_le]; exact Nat.le_of_lt_succ 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 [if_pos g]; exact (Nat.max_eq_right (Nat.le_of_lt (show e.toNat < 56 from g))).symm · rw [if_neg g]; exact (Nat.max_eq_left (Nat.le_of_not_lt (show ¬ e.toNat < 56 from g))).symm rw [η,m,q, ← pA] exact γ (C0 (Nat.add_le_add (L1 (Nat.max_le.2 ⟨Nat.le_of_lt 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 [if_pos g]; exact (Nat.max_eq_left (Nat.le_of_lt (show b.toNat < a.toNat from g))).symm · rw [if_neg g]; exact (Nat.max_eq_right (Nat.le_of_not_lt (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' ▸ Nat.not_le_of_lt e))) hLf (hcc ▸ hk) rw [hcc] at Wn rw [kOutW_h2,hhb,kOfS _ (C0 (Nat.le_trans (Nat.sub_le _ _) 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,Nat.max_le.2 ⟨Nat.le_trans (Nat.sub_le _ _) (Nat.le_trans z (by decide)),Nat.le_trans 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 UInt64.le_of_lt (by assumption) · exact UInt64.le_refl _ 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 [if_neg this]; cases Y; simp only [FloatArray.uset,kS] at hq h ⊢ rw [An _ _ (by simp only [pP,Array.size_set,not_lt]; exact Nat.le_of_not_lt 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:=Nat.le_of_sub_eq_zero hm rw[dRw,dif_neg (mt ε.mp (Nat.not_lt.mpr e)),kFS,kSm o n hB.2,ao,if_neg (Nat.not_lt.mpr e),if_neg (fun(g:_∧_)=>Nat.not_lt.mpr (Nat.le_trans (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,if_pos h1,dRw,dif_pos (ε.mpr h1)]; dsimp only rw[ih (k+1) _ _ _ (by rw[h2,← Nat.sub_sub,hm,BK]) (by rw[h2]; exact h1) q,h2,kFS,kSm o k (Nat.lt_trans (O1 h1 _) hB.2),kXU _ _ _ _ (kSm i k (Nat.lt_trans (O1 h1 _) hB.1)),kAbsDw] refine congrArg (ite _ _) ?_ by_cases g2:oб+(kб+1)≤q∧qg2 ⟨Nat.lt_of_le_of_ne 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):=Nat.le_antisymm hk (Nat.le_of_sub_eq_zero hm) have nl:¬ (J0 k) < (J0 n):=fun h=>Nat.lt_irrefl _ (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,if_neg nl] rw [dRw8,dif_neg (show ¬ k < n from fun h=>nl (ε.mp h)),kFS,k8i n r (J0 n) (le_refl _) hB.2 hr,eao, if_neg (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 [if_pos hq.symm,if_pos hq] · rw [if_neg (show ¬(8*(J0 n)+(J0 r)=q) from fun h=>hq h.symm),if_neg 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,dif_pos (ε.mpr h1)] rw [ih (k+1) _ _ _ (by rw [a1,Nat.sub_add_eq,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,if_pos h1] rw [kAbsDw, ← eao] by_cases hq:q=8*(J0 n)+(J0 r) · rw [if_pos hq,if_pos hq] rw [if_neg hq,if_neg hq] by_cases hA:q%8=(J0 r)∧(J0 k)+1 ≤ q/8∧q/8 < (J0 n) · rw [if_pos hA,if_pos (show q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n) from ⟨hA.1,Nat.le_of_succ_le hA.2.1,hA.2.2⟩)] rw [if_neg hA] by_cases hk8:8*(J0 k)+(J0 r)=q · subst hk8 have d1:(8*(J0 k)+(J0 r))/8=(J0 k):=by rw [Nat.mul_add_div (by decide),ώ hr,ϑ] have d2:(8*(J0 k)+(J0 r))%8=(J0 r):=by rw [Nat.mul_add_mod,γ hr] rw [if_pos rfl,if_pos (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):=Nat.le_antisymm (Nat.le_of_lt_succ (Nat.lt_of_not_le fun h'=>hA ⟨h.1,h',h.2.2⟩)) h.2.1 rw [← e8, ← h.1]; exact ϛ q 8 rw [if_neg hk8,if_neg 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 [if_neg (fun h=>Nat.not_succ_le_self s h.2.1)] rcases Nat.lt_trichotomy j N with hj|hj|hj · rw [if_neg (fun e=>Nat.ne_of_lt hj (Nat.eq_of_mul_eq_mul_left (by decide) (Nat.add_right_cancel e))),if_pos ⟨rfl,ϟ _,hj⟩,if_pos ⟨(O1 hs8 _).trans_le (L1 (Nat.mul_le_mul_left 8 hj.le) 8),le_refl s,h1⟩,if_pos hj] · subst hj rw [if_pos rfl,if_pos ⟨O1 hs8 _,le_refl s,h1⟩,if_neg (Nat.lt_irrefl j)] · rw [if_neg (fun e=>Nat.ne_of_gt hj (Nat.eq_of_mul_eq_mul_left (by decide) (Nat.add_right_cancel e))),if_neg (fun h=>Nat.lt_asymm h.2.2 hj),if_neg (fun h=>Nat.not_lt.2 (((Nat.mul_succ 8 N).symm.trans_le (Nat.mul_le_mul_left 8 hj)).trans (V1 _ _)) h.1)] · by_cases hc:8*j+s < 8*N+8∧R ≤ s∧s < L · rw [if_pos ⟨hc.1,Nat.lt_of_le_of_ne hc.2.1 (Ne.symm hs),hc.2.2⟩,if_pos hc] · rw [if_neg (fun h=>hc ⟨h.1,Nat.le_of_succ_le h.2.1,h.2.2⟩),if_neg (fun e=>hs (((Nat.mul_add_mod 8 j s).trans (γ hs8)).symm.trans ((congrArg (·%8) e).trans ((Nat.mul_add_mod 8 N R).trans (γ hr8))))),if_neg (fun h=>hs h.1),if_neg 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):=Nat.le_antisymm hr (Nat.le_of_sub_eq_zero hm) rw [dX8,dif_neg (fun h=>Nat.lt_irrefl _ ((ε.mp h).trans_le e.ge))]; exact (if_neg (fun h=>Nat.lt_irrefl _ (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,dif_pos (ε.mpr h1)]; exact (ih (r+1) _ _ ((congrArg ((J0 lim)-·) a1).trans ((Nat.sub_succ _ _).trans (congrArg Nat.pred 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 (Nat.max_eq_right this.le).symm · rename_i h; have:=μ.not.1 h; rw [eN] at this; rw [eN]; exact (Nat.max_eq_left (Nat.le_of_not_lt this)).symm have tp:p.toNat=max (E[j]!).toNat 56+cq.toNat:=by rw [hp,kAddS _ _ (by rw [hm]; exact C0 (Nat.add_le_add (Nat.max_le.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 _ ((Nat.sub_le _ _).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 (Nat.max_eq_left (μ.1 h).le).symm · rename_i h; exact (Nat.max_eq_right (Nat.le_of_not_lt (μ.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 Nat.max_le.2 ⟨(Nat.sub_le _ _).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 _,Nat.le_of_not_lt 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 _ ((Nat.le_add_left _ _).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 _ ((Nat.sub_le _ _).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:=(Nat.mul_add_mod 8 s r).trans (γ hr) have q2:(8*s+r)/8=s:=by rw[Nat.mul_add_div (by decide),ώ hr,ϑ] have c1:8*s+r<8*nn+8:=(O1 hr _).trans_le (L1 (Nat.mul_le_mul_left 8 hs.le) 8) refine (D _).trans ?_ rw[q1,q2,if_pos 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:=(Nat.mul_add_mod 8 nn r).trans (γ r8) have q2:(8*nn+r)/8=nn:=by rw[Nat.mul_add_div (by decide),ώ r8,ϑ] refine (D _).trans ?_ rw[q1,q2,if_neg (Nat.lt_irrefl nn),Ϡ] exact if_pos ⟨O1 r8 _,ϟ _,hr⟩ theorem dOw_spec_h1 {r R n m x y B:Ἀ} (h1:Nat.lt r R) (hnm:Nat.lt n m) (hB:Nat.lt (Nat.mul R m) B) (hX:Nat.le (Nat.mul R n) x) (hY:Nat.le (Nat.mul R m) y) : Nat.lt (Nat.mul r n) B∧Nat.lt (Nat.mul r m) B∧(∀ a,a=Nat.mul r n → Nat.le (Nat.add a n) x)∧(∀ a,a=Nat.mul r m → Nat.lt (Nat.add a n) y)∧(∀ a,a=Nat.mul r n → Nat.lt (Nat.add a n) B)∧(∀ a,a=Nat.mul r m → Nat.lt (Nat.add a n) B):=by have q1:=Nat.le_trans (Nat.le_of_eq (Ο r m).symm) (ι m h1) have q2:=Nat.le_trans (Nat.le_of_eq (Ο r n).symm) (ι n h1) have q3:=Nat.mul_le_mul_left R (Nat.le_of_lt 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 ▸ Nat.lt_trans (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,dif_neg (mt ε.mp (Nat.not_lt.2 (Nat.sub_eq_zero_iff_le.1 hk)))],fun r' t h1 h2 _=>(Nat.lt_irrefl r' (U1 h1 ((Nat.sub_eq_zero_iff_le.1 hk).trans h2))).elim⟩ | succ k ih => intro r Y hY hk hr have h1:=N1 hk have hnm:=Nat.lt_of_lt_of_eq (Nat.lt_succ_self _) 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,dif_pos (ε.mpr h1)]; dsimp only obtain ⟨I1,I2⟩:=ih (r+1) (dRw X _ n _ 0 Y 0 P1 P2 P3) (Nat.le_trans hY (Nat.le_of_eq (dRw_size X _ n _ P1 P3 _ 0 Y 0 P2 rfl).symm)) ((congrArg (Nat.sub R.toNat) hr1).trans ((Nat.sub_succ _ _).trans (congrArg Nat.pred hk))) (Nat.le_trans (Nat.le_of_eq 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 (ι _ ((Nat.le_succ _).trans (Nat.le_of_eq hr1.symm)))),D q,e2,if_neg (by exact Nat.ne_of_lt (U1 hq (V1 _ _))),if_neg (by exact fun h=>Nat.not_lt.2 ((V1 _ _).trans h.1) hq)] rcases Nat.lt_or_ge r.toNat r' with h5 | h5 · exact I2 r' t h2 (Nat.le_trans (Nat.le_of_eq hr1) h5) h4 · obtain rfl:=Nat.le_antisymm 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 [if_pos rfl,if_pos rfl,kc0] · rw [if_neg (by exact fun h=>ht (Nat.add_left_cancel h)),if_neg ht,if_pos (by exact ⟨J1 (ϟ _) _,O1 (Nat.lt_of_le_of_ne 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 [Array.size_set]; exact hq),AB a q hq,Array.getElem_set] · have:(J0 i)≠q:=by omega rw [if_neg this,An (a.set (J0 i) x h) q (by simp only [Array.size_set,not_lt]; exact Nat.le_of_not_lt 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:=Nat.not_lt.mpr (Nat.sub_eq_zero_iff_le.mp h) theorem Lqs(R r k:ℕ)(h:R-r=k+1):r < R∧R-(r+1)=k:=⟨N1 h,by rw[Nat.sub_succ,h];rfl⟩ theorem Lqd(R r:ℕ)(h:r < R):R-(r+1) < R-r:=Nat.sub_lt_sub_left h (Nat.lt_succ_self r) theorem Lq2(R r:ℕ)(h:r+1 < R):R-(r+1+1) < R-r:=Nat.sub_lt_sub_left (Nat.lt_of_succ_lt h) (Nat.lt_succ_of_lt (Nat.lt_succ_self 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=>Nat.lt_irrefl _ (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=>Nat.not_succ_le_self _ g.1 theorem Lqb(a b m:ℕ)(h:b < m):a+b≤a+b∧a+b < a+m:=⟨Nat.le_refl _,O1 h a⟩ theorem Lqc(a b m q:ℕ)(g:a+(b+1)≤q∧q < a+m):a+b≤q∧q < a+m:=⟨Nat.le_of_succ_le 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 ⟨Nat.lt_of_le_of_ne 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 Nat.ne_of_gt (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:=Nat.lt_of_le_of_ne (Nat.le_of_lt_succ (Nat.lt_of_le_of_ne (Nat.le_of_lt_succ h) e1)) e0 theorem Lw7(o o' w:ℕ)(ho:o' < w)(h2:¬o+1 < w)(e0:¬o'=o):o' < o:=Nat.lt_of_le_of_ne (Nat.le_of_lt_succ (U1 ho (Nat.le_of_not_lt h2))) e0 theorem n5d0:0≤7:=Nat.le_of_ble_eq_true rfl theorem n5d1:1≤7:=Nat.le_of_ble_eq_true rfl theorem n5d2:2≤7:=Nat.le_of_ble_eq_true rfl theorem n5d3:3≤7:=Nat.le_of_ble_eq_true rfl theorem n5d4:4≤7:=Nat.le_of_ble_eq_true rfl theorem n5d5:5≤7:=Nat.le_of_ble_eq_true rfl theorem n5d6:6≤7:=Nat.le_of_ble_eq_true rfl theorem n5d7:7≤7:=Nat.le_of_ble_eq_true 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):Float.Model.pack 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):pp k0 (Model.modelSign (decide (M<0))) M.natAbs E=Float.Model.UnpackedFloat.normalize k0 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[Float.Model.UnpackedFloat.normalize,c,Model.modelSign,h,decide_true,if_true,ha] ·subst h;simp[Float.Model.UnpackedFloat.normalize,Model.modelSign] ·have c:compare M 0=.gt:=Int.compare_eq_gt.mpr h;have ha:M.natAbs=M.toNat:=by omega simp only[Float.Model.UnpackedFloat.normalize,c,Model.modelSign,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):Float.Model.pack (Float.Model.UnpackedFloat.normalize k0 M1 E1 .positive)=Float.Model.pack (Float.Model.UnpackedFloat.normalize 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 Model.ofFloatModel_injective rw[Model.ofFloatModel_pack,Model.ofFloatModel_pack,← 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,Model.ieeeRoundDyadic] at e exact e theorem fzZ(s:pK):(Float.Model.pack (.zero s)).unpack=.zero s:=by cases s<;>rfl open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSA(s:pK)(n:ℤ):((s.apply n:ℤ):ℝ)=(if Model.modelSignBit s=true then -1 else 1)*(n:ℝ):=by cases s<;>simp[Float.Model.UnpackedFloat.Sign.apply,Model.modelSignBit] open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSM(s1 s2:pK):(if Model.modelSignBit (s1*s2)=true then (-1:ℝ) else 1)=(if Model.modelSignBit s1=true then -1 else 1)*(if Model.modelSignBit s2=true then -1 else 1):=by cases s1<;>cases s2<;>simp[Model.modelSignBit] 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:Model.unpackedToReal (x*y).toModel.unpack=Model.unpackedToReal x.toModel.unpack*Model.unpackedToReal y.toModel.unpack):Float.fma x y z=z+x*y:=by show (⟨x.toModel.fma y.toModel z.toModel⟩:Ἅ)=⟨z.toModel+(x*y).toModel⟩ congr 1 show Float.Model.pack (fma .binary64 x.toModel.unpack y.toModel.unpack z.toModel.unpack)=Float.Model.pack (add .binary64 z.toModel.unpack (x*y).toModel.unpack) have e3:(x*y).toModel=Float.Model.pack (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:Model.unpackedToReal P≠0:=by rw[hV,Model.unpackedToReal_finite,Model.unpackedToReal_finite,fzBP,fzBP] cases s1<;>cases s2<;>simp[Model.modelSignBit,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 (Model.unpackedToReal_zero sP) hVne | finite sP mP eP hmP=> cases Z with | notANumber=>rfl | infinity s3=>rfl | zero s3=> show Float.Model.pack (mul .binary64 (.finite s1 m1 e1 h1) (.finite s2 m2 e2 h2))=Float.Model.pack (.finite sP mP eP hmP) rw[← hPd,fzPU] | finite s3 m3 e3 h3=> apply fzVD rw[Model.unpackedToReal_finite,Model.unpackedToReal_finite,Model.unpackedToReal_finite,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[Rat.cast_mul,Rat.cast_add,Rat.cast_intCast,Rat.cast_zpow,Rat.cast_ofNat,Int.cast_add,fzSA,Int.cast_natCast] linear_combination (if Model.modelSignBit (s1*s2)=true then (-1:ℝ) else 1)*A+(if Model.modelSignBit s3=true then (-1:ℝ) else 1)*B-(if Model.modelSignBit s3=true then (-1:ℝ) else 1)*C-(if Model.modelSignBit sP=true then (-1:ℝ) else 1)*D+((m1:ℝ)*m2*(2:ℝ)^(e1+e2))*E-hV+((if Model.modelSignBit s1=true then (-1:ℝ) else 1)*(if Model.modelSignBit 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 Float.fma 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 Float.fma (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 Nat.strong_induction_on 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,dif_pos (ε.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 Nat.sub_lt_sub_left h3 (Nat.lt_add_of_pos_right (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 _ _ _ (Nat.le_of_not_lt h2)] rw [sM,dif_neg (fun h=>h2 (by rw [← T]; exact ε.mp h)),dif_pos (ε.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 (Nat.le_of_not_lt h3) rw [sM,dif_neg (fun h=>h3 (Nat.lt_of_succ_lt (show (J0 t)+1 < (J0 nu) by rw [← T]; exact ε.mp h))),dif_neg (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 [if_pos rfl,if_pos (by omega),hv,ϱ] · rw [if_neg e]; by_cases g:(J0 o) ≤ q∧q < (J0 o)+c · rw [if_pos g,if_pos (by omega)] · rw [if_neg g,if_neg (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 [if_neg (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:=Nat.lt_of_succ_lt 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 (Nat.le_of_eq (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:=Nat.lt_of_succ_lt 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 [dif_pos 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 [dif_neg h,sM24_spec arm Q Y vo nu i0 j0 k0 hY hI hJ hK hFi hFj hFk,kc0] theorem wq(a g l:ℕ)(hl:l<8):(8*a ≤ 8*g+l∧8*g+l < 8*a+8) ↔ g=a:=by omega @[inline] def zR(v:Ἅ)(relu:Ἆ)(H:ἆ):ἇ:= let c:=ak v H if c<(4294967296:ἆ) then (let w:=UInt64.toUInt32 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) theorem kAkBig (S:Ἅ):ak S 4000=4294967296:=by unfold ak; unfold F.eF; dsimp only generalize S.toBits=b rw [if_neg] 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 [if_pos 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 [if_neg 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 [if_pos 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 [if_neg hP,kZRBig]; simp only [Az,ἁ]; exact KV structure DC where relu:Ἆ n:Nat X:Ἂ ἇ W:Ἂ ἇ b:Ἂ ἇ E:Ἂ ἇ ix:Nat ib:Nat L:Nat Y:ἀ Q:ἀ Bd:ἀ hb:ἆ em:ἆ f9:Ἅ arm:Ἆ abbrev FMc(c:DC)(vo n G:Nat):Prop:=∀ s (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 @[noinline] 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 [if_neg (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 (Nat.le_succ_of_le 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 (Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel ((dnIx q s k (Nat.le_succ_of_le 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:=Nat.le_of_lt_succ 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 (Nat.le_add_left _ _))) 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 (Bool.eq_false_iff.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 Nat.strong_induction_on 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 [dif_neg h] have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=fun f a=>aoe f _ _ a (Nat.le_of_not_lt (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,Nat.add_sub_cancel' 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,Nat.add_sub_cancel' 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 noncomputable def dnW24o(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))(g:Nat)(h3:g+3<=G)(oU iU:Ἄ)(hoU:oU=G0 (8*g))(hiU:iU=G0 (g*n*8))(out:Ἂ ἇ)(hin:∀ oby 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 (Nat.min_le_left _ _) (by decide)) unfold dnW24o; dsimp only refine ⟨by simp only [dn8_size],fun i hi => ?_,fun o ho h1 h2 => ?_⟩ · 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:Ἄ)(cc:Nat)(hk:kk.toNat=cc)(hc:cc≤7) h,c.Bd.uget (oU+kk) h=c.Bd.data[8*g+cc]!:=fun kk cc hk hc h=>by rw [kFU]; rw [hoU]; rw [kSm _ kk (C0 (J1 (hk ▸ hc) _) B0.2.2.2.2.1),hk,B0.2.2.2.2.2.2.2.2] have eb1:∀ (kk:Ἄ)(cc:Nat)(hk:kk.toNat=cc)(hc:cc≤7) h,c.Bd.uget ((oU+8)+kk) h=c.Bd.data[8*(g+1)+cc]!:=fun kk cc hk hc h=>by rw [kFU]; rw [ho1]; rw [kSm _ kk (C0 (J1 (hk ▸ hc) _) B1.2.2.2.2.1),hk,B1.2.2.2.2.2.2.2.2] have eb2:∀ (kk:Ἄ)(cc:Nat)(hk:kk.toNat=cc)(hc:cc≤7) h,c.Bd.uget ((oU+16)+kk) h=c.Bd.data[8*(g+2)+cc]!:=fun kk cc hk hc h=>by rw [kFU]; rw [ho2]; rw [kSm _ kk (C0 (J1 (hk ▸ hc) _) B2.2.2.2.2.1),hk,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 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,Nat.add_sub_cancel' (by omega)] rw [eo] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+2)) hl (by omega) Q2.2 hs1] rw [sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp only [tv,tn,ti0,ti1,ti2,kc0,eb0 0 0 kc0 n5d0,eb0 1 1 kc1 n5d1,eb0 2 2 kc2 n5d2,eb0 3 3 kc3 n5d3,eb0 4 4 kc4 n5d4,eb0 5 5 kc5 n5d5,eb0 6 6 kc6 n5d6,eb0 7 7 kc7 n5d7,eb1 0 0 kc0 n5d0,eb1 1 1 kc1 n5d1,eb1 2 2 kc2 n5d2,eb1 3 3 kc3 n5d3,eb1 4 4 kc4 n5d4,eb1 5 5 kc5 n5d5,eb1 6 6 kc6 n5d6,eb1 7 7 kc7 n5d7,eb2 0 0 kc0 n5d0,eb2 1 1 kc1 n5d1,eb2 2 2 kc2 n5d2,eb2 3 3 kc3 n5d3,eb2 4 4 kc4 n5d4,eb2 5 5 kc5 n5d5,eb2 6 6 kc6 n5d6,eb2 7 7 kc7 n5d7] 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,Nat.add_sub_cancel' (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,Nat.add_sub_cancel' (by omega)] rw [eo] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix1] at e; rw [ec] at hl'; have:=Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel e); omega)] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+1)) hl (by omega) Q1.2 hs1] rw [sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp only [tv,tn,ti0,ti1,ti2,kc0,eb0 0 0 kc0 n5d0,eb0 1 1 kc1 n5d1,eb0 2 2 kc2 n5d2,eb0 3 3 kc3 n5d3,eb0 4 4 kc4 n5d4,eb0 5 5 kc5 n5d5,eb0 6 6 kc6 n5d6,eb0 7 7 kc7 n5d7,eb1 0 0 kc0 n5d0,eb1 1 1 kc1 n5d1,eb1 2 2 kc2 n5d2,eb1 3 3 kc3 n5d3,eb1 4 4 kc4 n5d4,eb1 5 5 kc5 n5d5,eb1 6 6 kc6 n5d6,eb1 7 7 kc7 n5d7,eb2 0 0 kc0 n5d0,eb2 1 1 kc1 n5d1,eb2 2 2 kc2 n5d2,eb2 3 3 kc3 n5d3,eb2 4 4 kc4 n5d4,eb2 5 5 kc5 n5d5,eb2 6 6 kc6 n5d6,eb2 7 7 kc7 n5d7] 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,Nat.add_sub_cancel' (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,Nat.add_sub_cancel' (by omega)] rw [eo] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix0] at e; rw [ec] at hl'; have:=Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel e); omega)] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q1.2 (fun l hl' e=>by rw [ix1,ix0] at e; rw [e8] at hl'; have:=Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel e); omega)] rw [dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*g) hl (by omega) Q0.2 hs1] rw [sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2]; dsimp only simp only [tv,tn,ti0,ti1,ti2,kc0,eb0 0 0 kc0 n5d0,eb0 1 1 kc1 n5d1,eb0 2 2 kc2 n5d2,eb0 3 3 kc3 n5d3,eb0 4 4 kc4 n5d4,eb0 5 5 kc5 n5d5,eb0 6 6 kc6 n5d6,eb0 7 7 kc7 n5d7,eb1 0 0 kc0 n5d0,eb1 1 1 kc1 n5d1,eb1 2 2 kc2 n5d2,eb1 3 3 kc3 n5d3,eb1 4 4 kc4 n5d4,eb1 5 5 kc5 n5d5,eb1 6 6 kc6 n5d6,eb1 7 7 kc7 n5d7,eb2 0 0 kc0 n5d0,eb2 1 1 kc1 n5d1,eb2 2 2 kc2 n5d2,eb2 3 3 kc3 n5d3,eb2 4 4 kc4 n5d4,eb2 5 5 kc5 n5d5,eb2 6 6 kc6 n5d6,eb2 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)] unfold dnT; rw [(hd g (by omega) (by omega)).1,(hd g (by omega) (by omega)).2,Nat.add_sub_cancel' (by omega)] theorem dnW24_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))(g:Nat)(h3:g+3<=G)(oU iU:Ἄ)(hoU:oU=G0 (8*g))(hiU:iU=G0 (g*n*8))(out:Ἂ ἇ)(hin:∀ oby 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 (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))(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 g h3.2 oU iU hoU hiU out hin hF hs1 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:=Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel 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:=Nat.eq_of_mul_eq_mul_right hs1 (Nat.add_left_cancel 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)) : ∀ 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))(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):=Nat.le_mul_of_pos_right R (Nat.succ_pos 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 _ 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 _ 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,if_pos 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 (Nat.le_of_lt hs)).trans (if_neg (Nat.ne_of_lt hs))) hQ' ?_ ((hYv r hr c.n (le_refl _)).trans (if_pos 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,W,b,E,ix,ib,L,Y,Q,(bBg b ow (8*G)).1,(ib+L-50).toUInt64,em,(I0 (9*(n+1))).toInt64.toFloat,Yarm⟩ n ow G 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,USize.zero_mul]) (mB (R*ow) (0:ἇ)) (fun r hr o ho=>by rw [Array.size_replicate,eow,kc1,ϻ]; have:=hRo2 r hr; omega) else mj R n ow relu X W b theorem bQS_spec (R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(Q:ἀ)(E:Ἂ Ἃ)(em:ἆ) (hn:0dw (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 have hBv:=wcBF_spec b ow (8*((ow+7)/8)) have hBs:8*((ow+7)/8) <= kS ((bBg b ow (8*((ow+7)/8))).1):=by rw [s5wcGet3_val]; exact hBv.1.ge have 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 (if_neg (Nat.ne_of_lt 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,USize.zero_mul]) (mB (R*ow) (0:ἇ)) (fun r hr o ho=>by rw [Array.size_replicate,eow,e1u,ϻ]; have:=ι ow (l7 hr); rw [Ο] at this; omega) rfl subst hYd unfold bQS; dsimp only rw [dif_pos h7] unfold mj linearWith apply mi (by rw [T.1]; simp only [Ϝ,Array.size_replicate]) intro q hq hq' rw [Ϝ] at hq' simp only [Λ] rw [← AB _ q hq] have hpos:0by rw [h,A7] at hq'; exact Nat.not_lt_zero _ 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) (Nat.le_of_lt 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,dif_neg (fun h=>Lq0 _ _ hm (ε.mp h))] | succ m ih => intro j a ha hm; have HQ:=Lqs _ _ _ hm; have h1:=HQ.1 rw [sFG,dif_pos (ε.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,dif_neg (fun h=>Lq0 _ _ hm (ε.mp h)),if_neg (Lqn _ _ _ _ (Nat.sub_eq_zero_iff_le.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,dif_pos (ε.mpr h1)]; dsimp only rw [ih _ _ _ (by rw [e1]; exact HQ.2) (by rw [e1]; exact h1),kAS,kSm q0 j (Lql _ _ _ _ h1 (Nat.le_of_lt hB)),kFU,B.1,e1] by_cases e:(J0 q0)+(J0 j)=q · subst e rw [if_neg (Lqa _ _ _),if_pos rfl,if_pos (Lqb _ _ _ h1),ϱ,kTU] · by_cases g:(J0 q0)+((J0 j)+1) ≤ q∧q < (J0 q0)+(J0 mu) · rw [if_pos g,if_pos (Lqc _ _ _ _ g)] · rw [if_neg g,if_neg e,if_neg (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):=Nat.mul_le_mul_left _ h rw [Nat.mul_succ] 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 (Nat.le_trans 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 (Nat.le_of_lt 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 Nat.strong_induction_on 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,dif_pos (ε.mpr h),dif_pos (ε.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,dif_pos (ε.mpr h),dif_neg (fun h'=>h2 (by rw [← A.2.2.2.2.2.2]; exact ε.mp h'))]; rw [w8_size] · rw [sPX,dif_neg (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 Nat.strong_induction_on 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,dif_pos (ε.mpr h),dif_pos (ε.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,Nat.mul_succ] 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 [if_pos (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 [if_neg (by rw [f1]; exact Lw3 _ _ _ hr e1)] by_cases e0:o'=(J0 o) · subst e0 rw [if_pos (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 [if_neg (by rw [f0]; exact Lw5 _ _ _ hr e0)] exact I o' (Lw6 _ _ ho' e1 e0) ho'w r hr · rw [sPX,dif_pos (ε.mpr h),dif_neg (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 [if_pos (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 [if_neg (by rw [f0]; exact Lw5 _ _ _ hr e0)] exact I o' (Lw7 _ _ _ ho' h2 e0) ho' r hr · rw [sPX,dif_neg (fun h'=>h (ε.mp h'))] intro o' ho' r hr; exact I o' (U1 ho' (Nat.le_of_not_lt 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 (Nat.le_of_lt 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+USize.ofNat r') (USize.ofNat 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,dif_neg (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,dif_pos (ε.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' (Nat.le_of_succ_le h1) h2 h3),G q,if_neg] rw [F.1,kc0,ϑ]; intro ⟨g1,g2⟩ exact hq (J0 r) (q-((J0 r0)+(J0 r))*(J0 ow)) (le_refl _) h (Nat.sub_lt_left_of_lt_add 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,ϑ,if_pos ⟨V1 _ _,O1 h3 _⟩,ϱ,kc8] have er:r0+USize.ofNat (J0 r)=r0+r:=by rw [show USize.ofNat (J0 r)=r from USize.ofNat_toNat] rw [er] · exact T3 r' o' (Nat.lt_of_le_of_ne 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 [if_pos g]; exact (Nat.max_eq_right (Nat.le_of_lt (show e.toNat < 56 from g))).symm · rw [if_neg g]; exact (Nat.max_eq_left (Nat.le_of_not_lt (show ¬ e.toNat < 56 from g))).symm rw [η,m] exact γ (C0 (Nat.add_le_add (Nat.max_le.2 ⟨Nat.le_of_lt 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 [if_pos 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 [if_neg 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 Nat.not_lt_zero _)) 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 (USize.ofNat o'))=o':=USize.toNat_ofNat_of_lt' (hS _ (U1 ho (Nat.le_of_lt (C0 (lZ _ (by decide)) h31.2.2)))) have hr8:r < kX:=hS _ (U1 (U1 hr hl) (by decide)) have hrow:(J0 (r0+USize.ofNat r))=(J0 r0)+r:=by rw [kSm _ _ (by rw [USize.toNat_ofNat_of_lt' hr8]; exact Lql _ _ _ _ hr (Nat.le_of_lt hR)),USize.toNat_ofNat_of_lt' 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,tR_tS,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),if_pos 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:=USize.toNat_ofNat_of_lt' (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=USize.toNat_ofNat_of_lt' (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 lim)))=lim:=USize.toNat_ofNat_of_lt' (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=>Nat.not_lt.2 (Nat.le.intro (kDM _ _ _ _ _ he ho' h3).1) hr)];exact hI row j hr h2 h3 · have:=G3 (row-rb*8) j (lt_min (Nat.sub_lt_left_of_lt_add (Nat.not_lt.1 hr) (by rwa[Ϡ,n4] at h1)) (Nat.sub_lt_sub_right (Nat.not_lt.1 hr) h2)) (ϟ _) h3 rw[BQ (Nat.not_lt.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:=Nat.sub_eq_zero_iff_le.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 (dif_neg (Nat.not_lt.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[Nat.sub_eq_zero_of_le (Nat.not_lt.1 h)];exact ϟ _) hA hI have hl8:min 8 (R-rb*8)<=8:=Nat.min_le_left _ _ have hlR:rb*8+min 8 (R-rb*8)<=R:=(J1 (Nat.min_le_right 8 (R-rb*8)) _).trans (Nat.le_of_eq (BQ (Nat.le_of_lt 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:=USize.toNat_ofNat_of_lt' (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=USize.toNat_ofNat_of_lt' (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 (min 8 (R-rb*8)))))=min 8 (R-rb*8):=USize.toNat_ofNat_of_lt' (hS _ (AO hl8 (by decide))) have e4:(J0 ((G0 ow)))=ow:=USize.toNat_ofNat_of_lt' (hS _ how) have e5:(J0 ((G0 (rb*8))))=rb*8:=USize.toNat_ofNat_of_lt' (hS _ (Nat.lt_trans 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 (Nat.lt_succ_self _) ((Nat.mul_add_one 8 n).symm.trans_le (Nat.mul_le_mul_left 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 (if_pos hr)).trans_le (kCR _ _).2 else (congrArg lq (if_neg 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 (if_pos (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 (dif_pos h)) (IH (rb+1) _ (by rw[Ϡ,n4,Nat.sub_add_eq];exact (Nat.sub_le_sub_left (by decide) _).trans (Nat.sub_le_of_le_add 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 (Nat.le_trans (Nat.le_trans (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 [Array.size_replicate]) (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 Nat.not_lt_zero _ hq') have hrq:q/owwcK3eq_ok a b) wcT8S 32 (W,ow,n) (fun k=>k.1) (fun v=>tchP v.1) 3).1 (s5wcGet3_val _) theorem bTo_eq(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^(32:Ἀ)): bTo R n ow relu X W b ix ib L hW hWs=bQU R n ow relu X W b ix ib L hW hWs (wcT8F (W,ow,n)) rfl:=by unfold bTo;exact bQU_v _ _ _ _ _ _ _ _ _ _ _ _ _ _ def bTs(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^(32:Ἀ))(s:Ἂ (WcE wcT8F))(i:Nat):Ἂ Ἃ:= if h:iwithPtrAddr W (fun p2=>if p1=p2 then bQU R n ow relu X W b ix ib L hW hWs s[i].v (s[i].h.trans (congrArg wcT8F (wcK3eq_ok _ _ hk))) else bTo R n ow relu X W b ix ib L hW hWs) (fun _ _=>by simp only[bQU_v,bTo_eq,ite_self])) (fun _ _=>by simp only[withPtrAddr,bQU_v,bTo_eq,ite_self]) else bTs R n ow relu X W b ix ib L hW hWs s (i+1) else bTo R n ow relu X W b ix ib L hW hWs termination_by s.size-i theorem bTs_eq(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^(32:Ἀ))(s:Ἂ (WcE wcT8F))(i:Nat): bTs R n ow relu X W b ix ib L hW hWs s i=bQU R n ow relu X W b ix ib L hW hWs (wcT8F (W,ow,n)) rfl:=by rw[bTs];split · split · simp only[withPtrAddr,bQU_v,bTo_eq,ite_self] · exact bTs_eq R n ow relu X W b ix ib L hW hWs s (i+1) · exact bTo_eq _ _ _ _ _ _ _ _ _ _ _ _ termination_by s.size-i theorem bQU_spec(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^32) (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) :bQU R n ow relu X W b ix ib L hW hWs (wcT8F (W,ow,n)) rfl=mj R n ow relu X W b:=by unfold bQU; split · rename_i hc have P:=wcT8F_panel W ow n hc.2.1 hW hWs have Q:=wcT8F_exp W ow n hc.2.1 hW hWs split · exact bQS_spec R n ow relu X W b ix ib L H _ _ _ _ _ _ _ _ _ _ P.2 Q.2.1 (fun o ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact hc.1) F hb M Y x z · rfl · rfl def bTc16(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L:Ἀ)(hW:ow*n<=(O0 W))(hWs:(O0 W)<2^(32:Ἀ))(dn:Ἆ):Ἂ Ἃ:= if dn=false then bTs R n ow relu X W b ix ib L hW hWs (ST.Prim.Ref.get wcT8S (Void.mk ())).val 0 else let c:=(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 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 if hq:R*n<=(O0 X)/\R*(n+1)<2^(31:Ἀ)/\R*ow<2^(31:Ἀ) then bQS R n ow relu X W b ix ib L c.1 c.2.1 c.2.2.toUInt64 hc.2.2.2.2 (by show ((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).1.size=_;rw[s5wcGet3_val];exact (wcT8F_panel W ow n hc.2.2.1 hW hWs).1) hc.2.2.1 (by show ow<=((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).2.1.size;rw[s5wcGet3_val];exact (wcT8F_exp W ow n hc.2.2.1 hW hWs).1.ge) hq.1 hq.2.1 hq.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; split · rename_i hdn; rw[bTs_eq]; exact bQU_spec R n ow relu X W b ix ib L H hW hWs F hb M Y x z · 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) · split · exact bQS_spec R n ow relu X W b ix ib L H _ _ _ _ _ _ _ _ _ _ (by rw[hv];exact P.2) (by rw[hv];exact Q.2.1) (by rw[hv];exact fun o ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact hc.1) F hb M Y x z · rfl · rfl end F lemma bc{a:Ἀ}(h:a<=4294967295):a<2^(32:Ἀ):=(by exact Nat.lt_succ_of_le h) def c7(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 eD:c7=mj:=by funext e d g j X W b;unfold c7;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 end Dense namespace Bn namespace NativeAdd lemma en(x:Float32):n5 x.toModel=lI x.toBits:=by exact congrArg Model.mk (pu x.toBits).symm lemma ja(x:Float32):kW (n5 x.toModel)=x.toBits:=by change lA (mJ x.toBits)=x.toBits;exact UInt32.ofNat_toNat lemma bK(a:kF)(h:kB a≠255): (lx a).toBits=a/\(lx a).isFinite=ἃ:=by have j:nX (spec:=li) a.toBitVec≠-1#8:=by intro g;apply h;apply Β.mp;have e:=congrArg BitVec.toNat g;rwa[(by rw[kB,Ξ,Υ,BitVec.extractLsb'_toNat];exact ζ _ 8:(mJ (kB a))=(a.toBitVec.extractLsb' 23 8).toNat)] have e:(lx a).toBits=a:=by change BG (pT li (kL li a.toBitVec))=a;rw[Model.pack_unpack_eq,AC (λd=>j 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(relu:Ἆ)(w:Ἃ):Ἃ:=w&&&~~~((0:Ἃ)-((if relu then w>>>31 else 0)&&&(if w&&&0x7FFFFFFF<=0x7F800000 then 1 else 0))) theorem mR_eq(d:Ἆ)(w:Ἃ):mR d w=act d w:=by have a0:∀x:Ἃ,x&&&~~~((0:Ἃ)-0)=x:=λ_=>UInt32.and_neg_one have a1:∀x:Ἃ,x&&&~~~((0:Ἃ)-1)=0:=λ_=>UInt32.and_zero unfold mR act;cases d · simp only[υ,↓reduceIte,UInt32.zero_and,a0] · simp only[↓reduceIte];unfold reluW have q:(w&&&0x7FFFFFFF<=0x7F800000)↔w.toNat%2^(31:Ἀ)<=0x7F800000:=by rw[UInt32.le_iff_toNat_le,Ξ];exact iff_of_eq (congrArg (·<=_) (ζ _ 31)) have h31:(w>>>31).toNat=w.toNat/2^(31:Ἀ):=(Υ w 31).trans (β _ _) have e1:(w&&&0x80000000).toNat=(w.toNat.testBit 31).toNat*2^(31:Ἀ):=by rw[Ξ];exact Nat.and_two_pow _ 31 have hE:(kB w).toNat=w.toNat%2^(31:Ἀ)/2^(23:Ἀ):=by unfold kB;rw[Ξ,Υ,β];exact(ζ _ 8).trans (Nat.mod_mul_right_div_self _ _ _).symm have hF:(lK w).toNat=w.toNat%2^(31:Ἀ)%2^(23:Ἀ):=by unfold lK;rw[Ξ];exact(ζ _ 23).trans (Nat.mod_mod_of_dvd _ (Nat.pow_dvd_pow 2 (by decide))).symm by_cases g:2^(31:Ἀ)<=w.toNat · have s:w.toNat/2^(31:Ἀ)=1:=mG g w.toNat_lt rw[Β.1 (show (w>>>31).toNat=(1:Ἃ).toNat from h31.trans s),Β.1 (show (w&&&0x80000000).toNat=(0x80000000:Ἃ).toNat by rw[e1,lW,s]<;>rfl)] by_cases j:w.toNat%2^(31:Ἀ)<=0x7F800000 · rw[if_pos (q.2 j),UInt32.and_self,a1] by_cases h:kB w=255 · rw[A6 h,(Β.1 (hF.trans (by rw[Nat.mod_def _ (2^(23:Ἀ)),<-hE,h];exact Nat.sub_eq_zero_of_le j)):lK w=0)]<;>rfl · rw[decide_eq_false h]<;>rfl · have Q:w.toNat%2^(31:Ἀ)/2^(23:Ἀ)=255:=mG (Nat.le_of_not_le j) (ϊ _ (϶ 31)) rw[if_neg (mt q.1 j),UInt32.and_zero,a0,A6 (Β.1 (hE.trans Q):kB w=255),AM.2 (λ(h:lK w=0)=>j (Nat.le_of_eq ((ϛ (w.toNat%2^(31:Ἀ)) (2^(23:Ἀ))).symm.trans (by rw[Q,<-hF,h]<;>rfl))))]<;>rfl · have s:w.toNat/2^(31:Ἀ)=0:=ώ (Nat.gt_of_not_le g) rw[Β.1 (show (w>>>31).toNat=(0:Ἃ).toNat from h31.trans s),Β.1 (show (w&&&0x80000000).toNat=(0:Ἃ).toNat by rw[e1,lW,s]<;>rfl),UInt32.zero_and,a0]<;>rfl @[inline]def add(relu:Ἆ)(a b:Ἃ):Ἃ:= if expOf a !=255&&expOf b !=255 then mR relu (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 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[Int.cast_add,Int.cast_mul,Int.cast_pow,Ac (AL (α:=ℚ)),AA,zpow_neg,zpow_ofNat];ring @[noinline]def jq(relu:Ἆ)(w s t:Ἃ):Ἃ:=act relu (toWord (Model.fma (ofW w) (ofW s) (ofW t))) @[inline]def ad(rb:ἇ)(a b:Ἃ)(_slow:Unit->Ἃ):Ἃ:=NativeAdd.add (rb !=0) a b @[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))]⟩ @[inline]def wX(x:ἆ):ἆ:=((x>>>34)<<<31)+((x&&&0x3FFFFFFFF)-0x255000000) lemma xw_h1(A:Ἀ)(Q:A<2^(64:Ἀ)):A=A/2^(63:Ἀ)*2^(63:Ἀ)+A/2^(52:Ἀ)%2^(11:Ἀ)*2^(52:Ἀ)+A%2^(52:Ἀ)/\A/2^(63:Ἀ)<2:=by refine⟨?_,Ϟ (Q.trans_eq ἅ)⟩;conv_lhs=>rw[←Au A (2^(52:Ἀ)),←Au (A/2^(52:Ἀ)) (2^(11:Ἀ)),lY] rw[Ϡ,Ϛ];rfl lemma xw_h2(s E q r k:Ἀ):(s*2^(63:Ἀ)+E*2^(52:Ἀ)+(q*2^(29:Ἀ)+r)+k)/2^(29:Ἀ)=(r+k)/2^(29:Ἀ)+(s*2^(34:Ἀ)+E*2^(23:Ἀ)+q):=by rw[show s*2^(63:Ἀ)+E*2^(52:Ἀ)+(q*2^(29:Ἀ)+r)+k=(r+k)+(s*2^(34:Ἀ)+E*2^(23:Ἀ)+q)*2^(29:Ἀ) by ring,Ρ _ _ (϶ 29)] lemma xw_h3(r:Ἀ)(c:(r+268435457)/2^(29:Ἀ)=(r+268435453)/2^(29:Ἀ)):r+1≠2^(28:Ἀ)/\r≠2^(28:Ἀ)/\r≠2^(28:Ἀ)+1:= ⟨fun h=>by rw[Nat.eq_sub_of_add_eq h]at c;exact absurd c (by decide),fun h=>by rw[h]at c;exact absurd c (by decide),fun h=>by rw[h]at c;exact absurd c (by decide)⟩ lemma xw_h4(A X:Ἀ)(Q:A<2^(64:Ἀ))(M:X=(A+268435457)%2^(64:Ἀ)/2^(29:Ἀ))(K:X%2^(23:Ἀ)≠0):A+268435457<2^(64:Ἀ):=by by_contra h;have w:A+268435457-2^(64:Ἀ)<268435457:=Nat.sub_lt_left_of_lt_add (not_lt.1 h) (Nat.add_lt_add_right Q _);apply K;rw[M,Nat.mod_eq_sub_mod (not_lt.1 h),γ (w.trans ((by decide):268435457<2^(64:Ἀ))),ώ (w.trans ((by decide):268435457<2^(29:Ἀ)))];rfl lemma xw_h5(q r d T X:Ἀ)(p:X=(q+d)+T*2^(23:Ἀ))(K:X%2^(23:Ἀ)≠0)(g:(r+2^(28:Ἀ))/2^(29:Ἀ)=d):1<=q*2^(29:Ἀ)+r:=ϵ fun h=>K (by obtain⟨h1,h2⟩:=Nat.add_eq_zero_iff.1 h;rw[p,←g,h2,(Nat.mul_eq_zero.1 h1).resolve_right (BD.1 (϶ 29)),Μ];rfl) lemma xw_h6(q r d T X:Ἀ)(p:X=(q+d)+T*2^(23:Ἀ))(K:X%2^(23:Ἀ)≠0)(S:q*2^(29:Ἀ)+r<2^(52:Ἀ))(F:d<=1):q+d<2^(23:Ἀ):= lt_of_le_of_ne ((J1 F q).trans (l7 (Nat.lt_of_mul_lt_mul_right ((V1 (q*2^(29:Ἀ)) r).trans_lt S|>.trans_eq (ἅ:2^(52:Ἀ)=2^(23:Ἀ)*2^(29:Ἀ)))))) (fun h=>K (by rw[p,h,Μ,Nat.mod_self])) lemma xw_h7(E:Ἀ)(J:(2^(64:Ἀ)-1195+E)%2^(64:Ἀ)<253)(D:E<2^(11:Ἀ)):1195<=E/\E<=1447:=by omega lemma xw_h8(r:Ἀ)(w:r<2^(29:Ἀ))(v1:r+1≠2^(28:Ἀ))(v2:r≠2^(28:Ἀ))(v3:r≠2^(28:Ἀ)+1):(r+268435457)/2^(29:Ἀ)=(r+2^(28:Ἀ))/2^(29:Ἀ)/\2<=(r+2^(28:Ἀ))%2^(29:Ἀ)/\(r+2^(28:Ἀ))%2^(29:Ἀ)+2<=2^(29:Ἀ):=by rcases Nat.lt_or_ge r (2^(28:Ἀ)) with h|h · have h2:r+2<=2^(28:Ἀ):=Nat.lt_of_le_of_ne h v1 have a:r+2^(28:Ἀ)<2^(29:Ἀ):=(Nat.add_lt_add_right h _).trans_eq ἅ have b:r+268435457<2^(29:Ἀ):=(L1 (Nat.le_sub_of_add_le h2) 268435457).trans_lt (by decide) rw[ώ b,ώ a,γ a];exact⟨ἅ,((by decide):2<=2^(28:Ἀ)).trans (Nat.le_add_left _ _),(lO _ _ _).trans_le ((L1 h2 _).trans_eq ἅ)⟩ · obtain⟨t,rfl⟩:∃t,r=2^(28:Ἀ)+2+t:=Nat.exists_eq_add_of_le (Nat.lt_of_le_of_ne (Nat.lt_of_le_of_ne h (Ne.symm v2)) (Ne.symm v3)) have tl:t+3<2^(29:Ἀ):=((Τ t 3).trans_le (L1 ((by decide):3<=2^(28:Ἀ)+2) t)).trans_lt w rw[show 2^(28:Ἀ)+2+t+268435457=(t+3)+1*2^(29:Ἀ) by ring,show 2^(28:Ἀ)+2+t+2^(28:Ἀ)=(t+2)+1*2^(29:Ἀ) by ring,Ρ _ _ (϶ 29),Ρ _ _ (϶ 29),ώ tl,ώ (Nat.lt_of_succ_lt tl),Μ,γ (Nat.lt_of_succ_lt tl)] exact⟨ἅ,Nat.le_add_left _ _,tl⟩ lemma xw_h9(q r d:Ἀ)(j:q+d<2^(23:Ἀ))(g:(r+2^(28:Ἀ))/2^(29:Ἀ)=d):q*2^(29:Ἀ)+r+2<=2^(52:Ἀ):=by have a:r+2^(28:Ἀ)>>29==(S.toBits+268435453)>>>29&& (((S.toBits+268435457)>>>29>>>23)&&&2047)-1195<253&& (S.toBits+268435457)>>>29&&&8388607!=0)=true): Dense.F.ak S (Dense.F.eF S.toBits-1075)=wX ((S.toBits+268435457)>>>29)/\ 1195<=(lq (Dense.F.eF S.toBits))/\(lq (Dense.F.eF S.toBits))<=1447/\ (mJ (UInt64.toUInt32 (Dense.F.ak S (Dense.F.eF S.toBits-1075))))%2^(31:Ἀ)<255*2^(23:Ἀ)/\ Dense.F.ak S (Dense.F.eF S.toBits-1075)<4294967296:=by unfold Dense.F.ak;simp only[UInt64.sub_add_cancel,UInt64.sub_self,((by decide):((1:ἆ)<<<(0:ἆ))=1),((by decide):decide ((0:ἆ)<=26)=true),Bool.true_and] generalize S.toBits=a at h⊢;generalize H:(a+268435457)>>>29=x at h⊢;have j(x:Ἀ):x&&&2047=x%2^(11:Ἀ):=ζ x 11;have l(x:Ἀ):x&&&8388607=x%2^(23:Ἀ):=ζ x 23;have t(x:Ἀ):x&&&536870911=x%2^(29:Ἀ):=ζ x 29;have u(x:Ἀ):x&&&17179869183=x%2^(34:Ἀ):=ζ x 34;have e:(lq x)=((lq a)+268435457)%2^(64:Ἀ)/2^(29:Ἀ):=by rw[<-H];simp only[ν,η,kA,kH,β] simp only[Η,AQ,AJ,AM,Ak]at h;obtain⟨⟨D,o⟩,E⟩:=h;have d:=congrArg lq D;rw[e]at d;simp only[ν,η,kA,kH,β]at d;rw[μ,Ζ]at o;simp only[Ε,ν,kA,kH,β,j]at o;have g:(lq x)%2^(23:Ἀ)≠0:=λB=>E (ξ.1 (by rw[Ε];simpa only[kA,l])) obtain⟨y,z,I,J,K,L,M,A⟩:=xw _ _ a.toNat_lt e (e.trans d) o g;have p:(lq (Dense.F.eF a))=(lq a)/2^(52:Ἀ)%2^(11:Ἀ):=by simp only[Dense.F.eF,Ε,ν,kA,kH,β,j] have w:(lq (a&&&0xfffffffffffff))=(lq a)%2^(52:Ἀ):=Ε _ _▸ζ _ 52 rw[AD];have m:=Dense.F.g0 a (p▸y);rw[p,w]at m;have r:(lq a)/2^(63:Ἀ)<2:=Ϟ (a.toNat_lt.trans_eq ἅ);have q:((lq a)%2^(52:Ἀ)+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=Nat.le_of_lt_succ ((ϸ (϶ 29)).2 ((Nat.add_lt_add_right (ϊ _ (϶ 52)) _).trans (by decide)));have v:((lq a)/2^(52:Ἀ)%2^(11:Ἀ)-1085-110)*2^(23:Ἀ)<=252*2^(23:Ἀ):=ι _ (Nat.sub_le_sub_right (Nat.sub_le_sub_right z 1085) 110);have X2:=cX_h2 _ _ r (C0 (Nat.add_le_add v (J1 q _)) ((by decide):252*2^(23:Ἀ)+(2^(23:Ἀ)+2^(23:Ἀ))<255*2^(23:Ἀ)));refine⟨?_,p▸y,p▸z,?_,?_⟩ .apply ξ.1;rw[m];simp only[wX,η,ψ,ν,Ζ,Ε,kA,kH,β,ο,u,M,A];exact wq _ _ _ r y z q .rw[Ϫ,m];exact X2.1 .rw[μ,m];simp only[kA];exact X2.2 simp only[Η,AJ,UInt64.reduceAdd,UInt64.reduceSub,AM,Ak,<-ξ];simp only[μ,Ζ,Ε,η,ν,p,w,kA,kH,β,l,t];rw[ζ _ 63,(by rw[←Au ((lq a)%2^(63:Ἀ)) (2^(52:Ἀ)),show (2:Ἀ)^(63:Ἀ)=2^(52:Ἀ)*2^(11:Ἀ) from ἅ,Nat.mod_mul_right_div_self,Nat.mod_mul_right_mod]:(lq a)%2^(63:Ἀ)=(lq a)/2^(52:Ἀ)%2^(11:Ἀ)*2^(52:Ἀ)+(lq a)%2^(52:Ἀ))];clear*-y z I J K L A g;generalize (lq a)/2^(52:Ἀ)%2^(11:Ἀ)=E at *;generalize (lq a)%2^(52:Ἀ)=f at *;exact cX_h1 _ _ _ g y z I J L A lemma jf(d:Ἆ)(o:ἇ)(j:(mJ o)%2^(31:Ἀ)<255*2^(23:Ἀ)): (if o&&&(if d then 0x80000000 else 0)!=0 then 0 else o)=p8 d o:=by have g:kB o≠255:=λh=>by have e:=congrArg mJ h;simp only[kB,Ξ,Υ,kN,kH,β]at e;rw[show(255:Ἀ)=2^(8:Ἀ)-1 from ἅ,ζ]at e;(clear * - j e;omega) cases d<;>simp[p8,reluW,g] @[inline]def dwQ(Q:ἀ)(hQ:Q=Dense.F.P)(w:ἇ):Ἅ:= (Core.mW w).toInt64.toFloat*Q.uget (UInt32.toUSize (w>>>23)) (by rw[hQ,Dense.F.gL,Dense.aC,Dense.F.dg];have:=w.toNat_lt;exact Ϟ this) lemma dwQ_e(w:ἇ):dwQ Dense.F.P rfl w=Dense.F.dw w:=rfl lemma rB(a:ἆ)(h:3<(a+268435457)&&&536870911):(a+268435457)>>>29=(a+268435453)>>>29:=by have t(x:Ἀ):x&&&536870911=x%2^(29:Ἀ):=ζ x 29 rw[μ,Ε,η]at h;simp only[kA,t]at h;apply ξ.1;simp only[ν,η,kA,kH,β];have:=a.toNat_lt;omega lemma rBb(a:ἆ)(B C:Ἆ)(h:((3<(a+268435457)&&&536870911&&B)&&C)=true): (((a+268435457)>>>29==(a+268435453)>>>29&&B)&&C)=true:=by simp only[Η,AJ]at h ⊢;exact⟨⟨by rw[rB a h.1.1];exact Az _,h.1.2⟩,h.2⟩ @[inline]def eBf(Q:ἀ)(hQ:Q=Dense.F.P)(m:ἇ)(Y Z:Ἅ)(w:Ἃ)(slow:Unit->Ἃ):Ἃ:= let a:=(dwQ Q hQ w*Y+Z).toBits let u:=a+268435457 let x:=u>>>29 if 3>>23)&&&2047)-1195<253&&x&&&8388607!=0 then let o:=(UInt64.toUInt32 (wX x)) if o&&&m !=0 then 0 else o else slow () @[inline]def eB(Q:ἀ)(hQ:Q=Dense.F.P)(g:Ἆ)(m:ἇ)(Y Z:Ἅ)(w:Ἃ)(slow:Unit->Ἃ):Ἃ:= if g&&((w>>>23)&&&255)-1<254 then eBf Q hQ m Y Z w slow else if g&&(w==0||w==0x80000000) then eBf Q hQ m Y Z w slow else slow () lemma i4_h1(E:Ἀ)(p:1195<=E)(q:E<=1447):-1074<=(E:Ἁ)-1022/\(E:Ἁ)-1022<=971/\-1021<=(E:Ἁ)-1022:=⟨le_sub_iff_add_le.2 (((by decide):(-1074:Ἁ)+1022<=0).trans (Nat.cast_nonneg _)),sub_le_iff_le_add.2 (Nat.cast_le.2 (q.trans ((by decide):1447<=1993))),le_sub_iff_add_le.2 (((by decide):(-1021:Ἁ)+1022<=1195).trans (Nat.cast_le.2 p))⟩ lemma cE2_a{i stop:Ἄ}(hi:(J0 i)<=(J0 stop))(hj:1jq relu w0 sc tc let y1:=eB Q hQ g m Y Z w1 λ_=>jq relu w1 sc tc bnL Q hQ g m Y Z relu sc tc stop (i+1+1) ((x.uset i y0 (by omega)).uset (i+1) y1 (by rw[BT];omega)) (by rw[BT,BT];exact h) (by omega) else if hk:ijq relu w0 sc tc) (by have:=ε.1 hk;omega) else x termination_by (J0 stop)-(J0 i) decreasing_by omega theorem bnL_eq(Q:ἀ)(hQ:Q=Dense.F.P)(g:Ἆ)(m:ἇ)(Y Z:Ἅ)(relu:Ἆ)(sc tc:Ἃ)(stop i:Ἄ) (x:Ἂ Ἃ)(h:(J0 stop)<=(O0 x))(hi:(J0 i)<=(J0 stop)): bnL Q hQ g m Y Z relu sc tc stop i x h hi=cE stop (λ_ _ w=>eB Q hQ g m Y Z w λ_=>jq relu w sc tc) i x h:=by fun_induction bnL Q hQ g m Y Z relu sc tc stop i x h hi next i x h hi hj a b c d e w0 w1 y0 y1 ih=> have n:(J0 i)≠(J0 (i+1)):=by omega rw[ih];conv_rhs=>rw[cE,dif_pos b];dsimp only;rw[cE,dif_pos d];dsimp only;simp only[ug x i (i+1) _ _ _ n] next i x h hi hj hk w0=> have g:¬i+1rw[cE,dif_pos hk];dsimp only;rw[cE,dif_neg g] next i x h hi hj hk=>rw[cE,dif_neg hk] lemma i4f(d:Ἆ)(s t w:kF)(g:Unit->kF) (l:g ()=p8 d (kW (pd (lI w) (lI s) (lI t))))(G:((s>>>23)&&&255!=255&&(t>>>23)&&&255!=255&&(w>>>23)&&&255!=255)=true): eBf Dense.F.P rfl (if d then 0x80000000 else 0) (Dense.F.dw s) (Dense.F.dw t*Dense.F.p149) w g=p8 d (kW (pd (lI w) (lI s) (lI t))):=by open Dense Dense.F in rw[Bn.eBf,dwQ_e,l,F.p149];dsimp only;obtain⟨G,m⟩:=Bool.and_eq_true_iff.1 G;obtain⟨x,y⟩:=Bool.and_eq_true_iff.1 G;replace x:¬kB s=255:=AM.1 x;replace y:¬kB t=255:=AM.1 y;replace m:¬kB w=255:=λh=>by change (w>>>23)&&&255=255 at h;rw[h]at m;exact absurd m (by decide) refine ite_eq_right_iff.2 fun L=>?_;obtain⟨v,p,q,D,E⟩:=cX _ (rBb _ _ _ L);rw[<-v];have it:=aT t;have W:=bm t;obtain⟨A,M⟩:=dJ w s m x;obtain⟨H,N⟩:=cI t y;obtain⟨I,O⟩:=iJ 149 (by decide);obtain⟨B,Q⟩:=aE _ _ H I (sv t) ((kG t+149:Ἀ):Ἁ) (by rw[N,O,AA,AF,Ap]) (Ao (bg t) (by decide)) (((by decide):(-1074:Ἁ)<=0).trans (Int.ofNat_nonneg _)) (bL 24 _ 971 (by rw[it];exact (J1 (L1 ((Nat.sub_le _ _).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,Int.cast_add,Int.cast_mul (sv t),Int.cast_pow,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 D 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 ((Nat.sub_le _ _).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 (Int.sub_le_sub_right (Int.ofNat_le.2 q) 1022))) E rw[eC w s t m x y V u.symm r,<-z];exact jf d _ D lemma e255(e:ἇ)(h:e-1<254):e≠255:=by intro he;rw[he]at h;exact absurd h (by decide) lemma i4(d:Ἆ)(s t w:kF)(g:Unit->kF) (l:g ()=p8 d (kW (pd (lI w) (lI s) (lI t)))): eB Dense.F.P rfl ((s>>>23)&&&255!=255&&(t>>>23)&&&255!=255) (if d then 0x80000000 else 0) (Dense.F.dw s) (Dense.F.dw t*Dense.F.p149) w g=p8 d (kW (pd (lI w) (lI s) (lI t))):=by unfold eB;split ·rename_i G;rw[Η]at G exact i4f d s t w g l (Bool.and_eq_true_iff.2 ⟨G.1,AM.2 (e255 _ (by simpa using G.2))⟩) ·split ·rename_i _ G;rw[Η]at G have h0:w=0∨w=0x80000000:=by simpa using G.2 rcases h0 with rfl|rfl<;>exact i4f d s t _ g l (Bool.and_eq_true_iff.2 ⟨G.1,by decide⟩) ·exact l def bH(relu:Ἆ)(hw c:Ἀ)(s t:Ἂ Ἃ)(Q:ἀ)(hQ:Q=Dense.F.P)(ch:Ἀ)(x:Ἂ Ἃ):Ἂ Ἃ:= if ch>>23)&&&255!=255&&(tc>>>23)&&&255!=255 let Y:=Dense.F.dw sc let Z:=Dense.F.dw tc*Dense.F.p149 bH relu hw c s t Q hQ (ch+1) (if h:(J0 stop)<=(O0 x)/\i0<=stop then bnL Q hQ g m Y Z relu sc tc stop i0 x h.1 (USize.le_iff_toNat_le.1 h.2) 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/\jNat.not_lt.2 u v.2)).trans (if_pos (r.trans u)).symm) else if v:a<=j then(if_neg u).trans ((if_pos ⟨v,Nat.lt_of_not_le u⟩).trans ((congrArg (Option.map · o) (q v (Nat.lt_of_not_le u))).trans (if_pos v).symm)) else(if_neg u).trans ((if_neg λw=>v w.1).trans (if_neg 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 (Nat.le_of_sub_eq_zero hk))];split .rw[l5 (p.trans_le ((ι _ (Nat.le_of_sub_eq_zero hk)).trans ‹_›))];rfl rfl;rename_i v;have q:dp8 g (kW (pd (lI w) (lI s[d]!) (lI t[d]!)))) (λ_ _ w=>i4 g s[d]! t[d]! w (λ_=>jq g w s[d]! t[d]!) rfl) (G0 (d*e)) x z;rw[v (d+1) _ (m.trans p) ((Nat.sub_succ c d).trans (congrArg Nat.pred 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*hwkF) (g:e ()=p8 d (kW (pb (lI a) (lI b)))): ad (if d then 1 else 0) a b e=p8 d (kW (pb (lI a) (lI b))):=by cases d<;>simp[ad,NativeAdd.gW] @[noinline]def jN(relu:Ἆ)(x y:Ἃ):Ἃ:=act relu (toWord (Model.add (ofW x) (ofW y))) def cq(relu:Ἆ)(a b:Ἂ Ἃ):Ἂ Ἃ:= if h:(O0 a)<=(O0 b)/\(O0 a) let y:=b.uget i (by rw[Dense.aa h.2]at hi;omega) ad rb x y λ_=>jN relu x y) 0 a (by rw[Dense.aa h.2]) else addReluSpec relu a b lemma dT:cq=addReluSpec:=by funext d a b;rw[cq];dsimp only;split;rename_i h;have g:(J0 (G0 (O0 a)))=(O0 a):=Dense.aa h.2;apply mU;intro j;rw[(cL _ _ (λj x=>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),dif_neg e,l5 (by exact Nat.le_of_not_lt e)];rw[iY d _ _ _ rfl,AB b (J0 i) (by omega)];rfl;rfl end Bn namespace Conv 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#[] def zpA(kk k cb o y x:Ἀ):Ἀ→Ἆ |0=>true |i+1=>((windowAt s I y x (cb*kk+i)==0||windowAt s I y x (cb*kk+i)==0x80000000)&&kB K[o*k+i]! != 255)&&zpA kk k cb o y x i theorem zpA_ok(kk k cb o y x:Ἀ):∀n,zpA s I K kk k cb o y x n=true→∀tabsurd ht (Nat.not_lt_zero _) |n+1,h,t,ht=>by simp only[zpA,Η,nM,AQ,AM,Ak]at h by_cases e:t=n ·subst e;exact⟨h.1.1,h.1.2⟩ ·exact zpA_ok kk k cb o y x n h.2 t (by omega) @[noinline]def aB(kk k cb o y x:Ἀ):Ἃ:= if b[o]! == 0&&zpA s I K kk k cb o y x k then 0 else Dense.gf (k+1) (λi=>if iif iif iif iby simp only[if_pos ht];exact (W t ht).1) (λt ht=>by simp only[if_pos ht];exact (W t ht).2) (by simp) (by simp[hb])).symm ·rfl def zpW(kk k cb o y x:Ἀ):Ἀ→Ἆ |0=>true |i+1=>(K[o*k+i]! == 0||K[o*k+i]! == 0x80000000||windowAt s I y x (cb*kk+i)==0||windowAt s I y x (cb*kk+i)==0x80000000)&&zpW kk k cb o y x i theorem zpW_ok(kk k cb o y x:Ἀ):∀n,zpW s I K kk k cb o y x n=true→∀tabsurd ht (Nat.not_lt_zero _) |n+1,h,t,ht=>by simp only[zpW,Η,nM,AQ]at h by_cases e:t=n ·subst e;have h1:=h.1;tauto ·exact zpW_ok kk k cb o y x n h.2 t (by omega) 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[Core.bI (n+1) D Wf g,hS,Dense.F.zrNC _ _ n 0 (by rw[Κ,ab (n+1) D n (by omega),ab (n+1) Wf n (by omega),hDn,hWn];decide),Bool.and_false];decide theorem aBz(kk k cb o y x:Ἀ)(hb:b[o]! =0)(hz:zpW s I K kk k cb o y x k=true)(hi:∀q:ℕ,kB I[q]!≠255)(hw:∀q:ℕ,kB K[q]!≠255):aB s I K b kk k cb o y x=0:=by have W:=zpW_ok s I K kk k cb o y x k hz rw[aB_eq,Dense.bO] refine zrDot2 k _ _ (λt ht=>by simp only[if_pos ht];exact W t ht) (λt ht=>by simp only[if_pos ht];unfold windowAt;dsimp only;split;exact (by decide);exact hi _) (λt ht=>by simp only[if_pos ht];exact hw _) (by simp) (by simp[hb]) @[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,ϻ,Nat.div_one,Nat.mod_one,ϑ,pQ,Nat.not_lt_zero,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 (Nat.not_lt_zero _) |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[if_pos ht];exact hz t ht) (λt ht=>by simp only[if_pos ht];unfold windowAt;dsimp only;split;exact (by decide);exact hi _) (λt ht=>by simp only[if_pos 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 (UInt64.toUInt32 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:Ἃ):ἆ:=(UInt32.toUInt64 ((u>>>23)&&&255)) noncomputable def gT(ch y x:Ἀ)(e:Ἄ):Ἃ:= let v:=(G0 w) if hb:ecV (.==0x80000000) x0 x1 x2 x3) (λ_=>cU h w 2 I ch y x) d else toWord (Ar (ofW (cU h w 2 I ch y x)) (ofW d)) else toWord (Ar (ofW (cU h w 2 I ch y x)) (ofW d)) 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,Nat.cast_add,pO (by exact Nat.le_of_succ_le 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[UInt64.sub_add_cancel,am,γ ((Nat.add_le_add (g.trans l) m).trans_lt (by decide))]at q rw[q];exact⟨Nat.le_add_left _ _,(Τ _ _).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 Nat.sub_le_iff_le_add'.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:ℕ):=(Int.ofNat_lt.2 (Ϟ (j.trans_eq (m7 2 39 25)))).trans_eq (Int.natCast_pow 2 25) have hH:((E/2^(63:ℕ):ℕ):ℤ)<=1:=Int.ofNat_le.2 (Nat.lt_succ_iff.1 (Ϟ (l.trans_eq (Nat.pow_succ 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) (Int.add_le_add (Int.sub_le_sub (Int.add_le_add (Int.natCast_nonneg _) hI.1) hH) p.1),Int.lt_of_lt_of_le (Int.add_lt_add_of_lt_of_le (Int.sub_lt_sub_of_lt_of_le (Int.add_lt_add_of_lt_of_le hA hI.2) (Int.natCast_nonneg _)) 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)) (Nat.mul_mod_mul_right _ _ 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 Nat.cast 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 (Fin.val 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 (Fin.val 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 Nat.zero_lt_succ 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 Nat.le_of_succ_le A)▸u _ _ _ _ e (by exact Nat.lt_of_succ_le 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 Nat.succ_add_eq_add_succ M j):M+1+j=M+(j+1)),l _ (by exact Nat.add_lt_add_right p 1),((by exact Eq.symm (Nat.succ_add_eq_add_succ 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,USize.add_assoc,USize.add_comm (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 Nat.zero_lt_of_lt 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 Nat.zero_lt_succ 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 Int.neg_ofNat_le_natCast (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 ⟨Nat.lt_of_le_of_ne 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 Dense.F.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:=Nat.le_of_sub_eq_zero e;rw[fcU,dif_neg λh=>Nat.not_lt.2 k (ε.1 h)];exact⟨ἅ,λq _=>by rw[if_neg λ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=>Dense.F.dw I[(J0 p)+(q-(J0 d))]!) _ _ hj (by rw[kr,Dense.aj (((O1 hj _).trans_le hp).trans (hs.trans_le ς)),ϱ]) 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]! =Dense.F.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]! =Dense.F.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:=Nat.sub_eq_zero_iff_le.1 e;have hr:¬rAX _ (U1 (ε.1 h) E);rw[fRU,dif_neg hr];refine⟨ἅ,λq hq=>?_⟩;rw[J q hq];refine congrArg Dense.F.dw ?_;split;rfl;rename_i k;rw[aI,if_neg];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 (Nat.sub_lt v (by decide)) x) _) (Nat.le_trans this (hn▸E))) | succ m ih=> intro r p d y Y e a b c f N O J;have hr:rk (USize.toNat_inj.1 (y1.trans (j.trans hh.symm))) obtain⟨q1,q2⟩:=(Nat.div_mod_unique h0).2 (⟨by rw[lO,Τ ((J0 r)%s.h),rq],Nat.lt_of_le_of_ne 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[Array.uget,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:Dense.F.A8)(h:∀r<8,A.f r=B.f r):A=B:=by cases A;cases B;rw[Dense.F.A8.mk.injEq];exact⟨h 0 (by exact Nat.zero_lt_succ 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 Nat.lt_add_one 7)⟩ noncomputable def eH(f:Ἀ->Ἅ):Dense.F.A8:=⟨f 0,f 1,f 2,f 3,f 4,f 5,f 6,f 7⟩ lemma fW(f:Ἀ->Ἅ)(r:Ἀ)(d:r<8):(eH f).f r=f r:=by rw[eH];interval_cases r<;>rfl 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=USize.ofNat (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]!)*Dense.F.dw d.K[ko+t]!) (λ_=>Dense.F.dw oneW*Dense.F.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):(USize.ofNat n).toNat=n:=USize.toNat_ofNat_of_lt' (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 (Nat.not_lt_zero _) | 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 @[inline]def zb(S:Ἅ):Ἆ:=(S.toBits&&&0x7FFFFFFFFFFFFFFF)==0 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[dif_pos (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[Float.Model.UnpackedFloat.beq_iff_ne_notANumber_and_eq]at hb by_contra hz;simp only[not_exists]at hz obtain⟨h1,-,e|⟨e,_⟩|⟨e,_⟩⟩:=hb ·have E:Float.Model.pack a.toModel.unpack=Float.Model.pack a.toModel.unpack.neg:=by (conv_lhs=>rw[e,Dense.F.fzPU]);rfl have E4:=congrArg (fun m:Float.Model=>Float.Model.UnpackedFloat.unpackSign (spec:=.binary64) m.toBits.toBitVec) E simp only[Float.Model.pack,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 (Dense.F.dw w)=true):w=0∨w=0x80000000:=by obtain⟨s,hs⟩:=czNZ _ h;have r:=(Dense.F.cI w hw).2;rw[Dense.F.iL,hs,Model.unpackedToReal_zero 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 zpW d.s d.I d.K d.kk d.k (if d.D then o else 0) o y x d.k 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:∀tsimp[e] lemma ep(S:Ἅ)(h:ἆ)(e:Dense.F.ak S h<4294967296): kB (UInt64.toUInt32 (Dense.F.ak S h))≠255:=by unfold Dense.F.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,Dense.F.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 Dense.F.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=Dense.F.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 Dense.F.ak;dsimp only;rw[if_pos];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[←Nat.sub_add_comm (hab.trans hb.le),Nat.add_sub_assoc hab,Nat.add_mod_left,γ ((Nat.sub_le 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 (Nat.le_of_lt (Nat.add_lt_add_right 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)),γ (((Nat.sub_le _ _).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:=Nat.not_lt.1 λlt=>absurd (((Nat.sub_le_sub_left l3 _).trans (V1 _ e)).trans_lt ((γ ((O1 lt _).trans_le (Nat.le_of_eq (Nat.sub_add_cancel (l3.trans (by decide)))))).symm.trans_lt c)) (Nat.not_lt.2 (((Nat.sub_le _ _).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:=(Nat.add_lt_add_right hh 1075).trans (by decide) rw[γ (hh.trans (by decide)),γ h2,wok_h1 e (h+1075) (Nat.le_of_lt_succ (he.trans_le m2)) h2,wok_h1 1195 e (l2.trans le) hE] exact⟨Nat.sub_le_of_le_add ((Nat.add_left_comm h 21 1054).trans_le (J1 (l1.trans le) 21):h+1075<=21+e),Nat.sub_lt_left_of_lt_add (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[μ,θ,Ζ,η,Ϣ,UInt64.toNat_ofNat',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:=Dense.F.ak S d.hh if h:c<4294967296 then dR d.J (UInt64.toUInt32 c)else ow d o y x S noncomputable def bV(d:CD)(o y x:Ἀ)(S:Ἅ):Ἃ:= let c:=Dense.F.ak S d.hh if h:c<4294967296 then dR d.J (UInt64.toUInt32 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,Dense.F.tw,Dense.F.tf];dsimp only;rw[AD e];split;swap;rfl;rename_i c;simp only[Η,AJ]at c;obtain⟨⟨r,c1⟩,-⟩:=c;rw[r];exact Dense.F.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 (UInt64.toUInt32 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[<-Nat.sub_sub,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 _ _ _ _ (Ne.symm d)];clear*-d;split_ifs<;>first|rfl|omega @[inline]def ln(d:CD)(o y:Ἀ)(xb nq q r:Ἄ)(S:Ἅ)(a:Ἂ Ἃ):Ἂ Ἃ:= 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 Nat.lt_irrefl (r+1))] conv_rhs=>rw[pl,AC (by exact Nat.lt_irrefl 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:=USize.le_iff_toNat_le.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 Nat.min_eq_left 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,Array.set!_eq_setIfInBounds,Array.setIfInBounds,AT h] iterate 8 rw[s5ux] rw[E 1 (by simp only [kD,Nat.one_lt_ofNat]),E 2 (by simp only [kD,Nat.reduceLT]),E 3 (by simp only [kD,Nat.reduceLT]),E 4 (by simp only [kD,Nat.reduceLT]),E 5 (by simp only [kD,Nat.reduceLT]),E 6 (by simp only [kD,Nat.reduceLT]),E 7 (by simp only [kD,Nat.lt_add_one])] iterate 8 rw[pl,AD (by decide)] rw[pl,AC (by decide)];simp only[iF,kD,ϑ];rfl 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 Nat.not_lt_zero 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,Nat.reduceAdd] lemma l0(d:Ἄ)(h:0Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->Dense.F.A8->Ἂ Ἃ->Ἂ Ἃ)(Wz X:@&ἀ)(Tz:@&Ἂ Ἀ)(wo n:Ἄ)(M:Ἀ) (hs:(kS X)<2^(32:Ἀ)/\(kS Wz)<2^(32:Ἀ)) (hn:(J0 n)<=(O0 Tz)) (hT:∀t<(J0 n),Tz[t]!<=M) (hW:(J0 wo)+(J0 n)<=(kS Wz)) (i:Ἄ) (hi:(J0 i)+M+8<=(kS X)) (d:@&CD) (o y:Ἀ) (xb nq q:Ἄ) (a:Ἂ Ἃ) (t:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ):Ἂ Ἃ:= if h:tἈ->Ἀ->Ἄ->Ἄ->Ἄ->Dense.F.A8->Ἂ kF->Ἂ kF)(g X:ἀ)(e:Ἂ Ἀ)(l n:Ἄ)(M:Ἀ) (U:(kS X)<2^(32:Ἀ)/\(kS g)<2^(32:Ἀ)) (hn:(J0 n)<=(O0 e)) (N:∀t<(J0 n),e[t]!<=M) (hW:(J0 l)+(J0 n)<=(kS g)) (i:Ἄ) (O:(J0 i)+M+8<=(kS X)) (d:CD) (o y:Ἀ) (xb nq q:Ἄ) (a:Ἂ kF) (m:Ἀ) (t:Ἄ) (p u v x B D G H:Ἅ) (A:Dense.F.A8) (hm:(J0 n)-(J0 t)=m) (K:∀r<8,A.f r=Dense.F.ao (λs=>X.data[(J0 i)+e[s]!+r]!*g.data[(J0 l)+s]!) (J0 n) (J0 t) (Dense.F.A8.f ⟨p,u,v,x,B,D,G,H⟩ r)): ey W g X e l n M U hn N hW i O d o y xb nq q a t p u v x B D G H=W d o y xb nq q A a:=by open Dense Dense.F in induction m generalizing t p u v x B D G H A have h:¬tNat.sub_ne_zero_of_lt (ε.mp h) hm rw[ey,dif_neg h];congr 1;exact j2 _ _ λr I=>by rw[K r I,kp _ _ _ _ (mt ε.mpr h)] rename_i ih;have h:tby have:=Conv.aa k (hk.trans (by decide));rw[ug,iQ,aj (by rw[L,this];exact(((Nat.add_lt_add_of_le_of_lt (J1 hM _) hk).trans_le O).trans U.1).trans_le ς),L,this] have J:∀j,g.uget (l+t) j=g.data[(J0 l)+(J0 t)]!:=λj=>by rw[ug,aj (AN (Nat.lt_trans (AN (O1 Y _) hW) U.2) ς)] refine ih (t+1) _ _ _ _ _ _ _ _ A (by rw[ac h,<-Nat.sub_sub,hm,BK]) λr I=>?_;rw[K r I,kq _ _ _ _ Y,ac h];congr 1;interval_cases r<;>exact congrArg (_+·) (congrArg₂ (·*·) (rx _ I _).symm (J _).symm) noncomputable def dK(d:CD)(c:CC d.M)(o y xb r:Ἀ):Ἅ:= Dense.F.ao (λt=>d.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 (Dense.F.dw oneW*Dense.F.dw d.b[o]!) @[inline]def gY(W:CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->Dense.F.A8->Ἂ Ἃ->Ἂ Ἃ)(d:@&CD)(c:@&CC d.M)(o y:Ἀ)(xb nq q i:Ἄ) (hi:(J0 i)+d.M+8<=(kS d.X)) (bp:Ἅ) (a:Ἂ Ἃ):Ἂ Ἃ:= ey W c.Wz d.X c.Tz (G0 c.wo) (G0 c.n) d.M ⟨d.hX,c.h5⟩ (by have:=ς;have:=c.h3;rw[Dense.aa (by omega)];exact c.h1) (by have:=ς;have:=c.h3;rw[Dense.aa (by omega)];exact c.h4) (by have:=ς;have:=c.h3;rw[Dense.aa (by omega),Dense.aa (by omega)];exact c.h2) i hi d o y xb nq q a 0 bp bp bp bp bp bp bp bp lemma gZ(d:CD)(c:CC d.M)(o y:Ἀ)(e m q i:Ἄ)(p:(J0 i)+d.M+8<=(kS d.X))(l:Ἅ) (a:Ἂ kF) (j:(J0 i)=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+y*(d.s.w+2)+(J0 e)) (g:l=Dense.F.dw ld*Dense.F.dw d.b[o]!): gY a9 d c o y e m q i p l a=a9 d o y e m q (eH (dK d c o y (J0 e))) a:=by subst g;unfold gY;have:=ς;have:=c.h3;refine g9 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl λr u=>?_;rw[fW _ _ u];unfold dK;simp only[j,Dense.aa ((by omega):c.woἈ->Ἀ->Ἄ->Ἄ->Ἄ->Dense.F.A8->Ἂ Ἃ->Ἂ Ἃ)(d:@&CD)(c:@&CC d.M)(o y:Ἀ)(xb nq q i:Ἄ)(bp:Ἅ)(a:Ἂ Ἃ) (hI:(J0 i)+(J0 nq)+d.M+7<=(kS d.X)):Ἂ Ἃ:= if h:0kF)(G:∀g x,g<=x->xxbV d o y x (dK d c o y g (x-g))=F x)(g e q:Ἀ)(hx:g+e=d.s.w)(j:Ἀ)(h1:q<=j)(h2:jkF)(b:kF)(I:q<=j->jb=f (g+(j-q))):(if q+8<=j∧jabsurd ⟨A5.1,w.trans_eq (by rw[min_eq_left B.le])⟩ A3) (λw=>absurd ⟨w,A5.2.trans_eq (by rw[pA,Nat.add_sub_cancel' B.le])⟩ A1) ·rfl lemma je_h4(m e g q i a s E8 G8 Q8 I8 X Y:Ἀ)(hm:e<=m+1)(hx:g+e=s)(L:i=X+Y+g)(hq:q+e<=a)(B:8kF)(b:kF)(I:q<=j->jb=f (g+(j-q))):(if q+0<=j∧jkF) (G:∀g x,g<=x->xxbV d o y x (dK d c o y g (x-g))=F x): ∀m (g e q i:Ἄ) (a:Ἂ kF) (v:(J0 i)+(J0 e)+d.M+7<=(kS d.X)),(J0 e)<=m-> (J0 g)+(J0 e)=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 q)+(J0 e)<=(O0 a)->(O0 a)<2^(32:Ἀ)-> (O0 (rB a9 d c o y g e q i u a v))=(O0 a)/\∀j<(O0 a),(rB a9 d c o y g e q i u a v)[j]! = if (J0 q)<=j/\j<(J0 q)+(J0 e)then F ((J0 g)+(j-(J0 q)))else a[j]!:=by intro m;induction m with |zero=>intro g e q i a v hm hx L hq J;rw[rB,dif_neg (λh=>(l0 e h).ne' (Nat.eq_zero_of_le_zero hm))];exact⟨ἅ,λj _=>by rw[AC (by clear*-hm;omega)]⟩ |succ m ih=> intro g e q i a v hm hx L hq J;have S:=ς;have:=d.hX;by_cases h:0bV d o y ((J0 g)+r) ((eH (dK d c o y (J0 g))).f r)) (po 8 (J0 e)) (J0 q) _ 0 a rfl (ϟ _);have I:=je_h1 d c o y F G (J0 g) (J0 e) (J0 q) hx by_cases l:8?_⟩;rw[Y j (by rwa[p]),K j A,N,O,U];exact je_h2 _ _ _ j B _ F _ (I j) rw[dif_neg l];refine⟨p,λj A=>?_⟩;rw[K j A];exact je_h3 _ _ _ j (λhh=>l (ε.2 (by simp only[kD];exact hh))) _ F _ (I j) have h0:(J0 e)=0:=by have:=mt ε.2 h;simp only[kD]at this;exact Nat.eq_zero_of_not_pos this rw[rB,dif_neg h];exact⟨ἅ,λj _=>by rw[AC (λhh=>Nat.lt_irrefl _ ((hh.1.trans_lt hh.2).trans_eq (congrArg _ h0)))]⟩ @[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 (Nat.le_of_sub_eq_zero H);rw[c8,dif_neg (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 @[specialize]def db(W:CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->Dense.F.A8->Ἂ Ἃ->Ἂ Ἃ)(d:@&CD)(c:@&CC d.M)(o q:Ἀ)(bp:Ἅ)(a:Ἂ Ἃ):Ἂ Ἃ:= let V:=d.s.w+2 let i0:=(if d.D then o else 0)*((d.s.h+2)*V) if hb:i0+(d.s.h-1)*V+d.s.w+d.M+7<=(kS d.X)then c8 d.s.h d.s.w (G0 V) i0 (by have K:=C0 (Nat.add_le_add (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (Nat.le_of_ble_eq_true ἅ:2<=7)) (C0 hb (U1 d.hX ς)) exact C0 (J1 (Nat.mul_le_mul_left d.s.h (Nat.le_of_eq (Dense.aa (n:=V) (C0 (L1 (Nat.le_add_left d.s.w (i0+(d.s.h-1)*V)) 2) K)))) i0) (C0 (Nat.le_trans (J1 (Nat.le_add_of_sub_le (Nat.le_of_eq (Nat.sub_one_mul d.s.h V).symm)) i0) (Nat.le_of_eq ((pA i0 _ V).symm.trans (pA _ d.s.w 2).symm))) K)) (λy hy q i hi a=>rB W d c o y 0 (G0 d.s.w) (G0 q) i bp a (by have K:=C0 hb (U1 d.hX ς) exact Nat.le_trans (Nat.le_of_eq (congrArg (·+d.M+7) (congrArg₂ (·+·) (hi.trans (congrArg (i0+y*·) (Dense.aa (n:=V) (C0 (Nat.le_trans (L1 (Nat.le_add_left d.s.w (i0+(d.s.h-1)*V)) 2) (Nat.add_le_add (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (Nat.le_of_ble_eq_true ἅ:2<=7))) K)))) (Dense.aa (n:=d.s.w) (C0 (Nat.le_trans (Nat.le_add_left d.s.w (i0+(d.s.h-1)*V)) (Nat.le_trans (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (V1 _ 7))) K))))) (Nat.le_trans (L1 (L1 (L1 (J1 (ι V (Nat.le_sub_one_of_lt hy)) i0) d.s.w) d.M) 7) hb))) 0 q (G0 i0) ((Dense.aa (n:=i0) (C0 (Nat.le_trans (Nat.le_trans (V1 i0 ((d.s.h-1)*V)) (V1 _ d.s.w)) (Nat.le_trans (V1 _ d.M) (V1 _ 7))) (C0 hb (U1 d.hX ς)))).trans (congrArg (i0+·) (ϳ _)).symm) a else a lemma iG(d:CD)(c:CC d.M)(o q:Ἀ)(l:Ἅ)(a:Ἂ kF)(N:Ἀ)(G:Ἀ->kF) (m:∀y (v:yq'=q+y*d.s.w->(O0 e)=N-> (O0 (rB a9 d c o y 0 (G0 d.s.w) (G0 q') i l e u))=(O0 e)/\ ∀j<(O0 e),(rB a9 d c o y 0 (G0 d.s.w) (G0 q') i l e u)[j]! =if q'<=j/\j(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)): (O0 (db a9 d c o q l a))=(O0 a)/\ ∀j<(O0 a),(db a9 d c o q l a)[j]! =if q<=j/\jm y v q' i e _ (by rw[F,Dense.aa H]) r p) _ 0 q _ _ a rfl (ϟ _) (by simp only [zero_mul,Av]) A;rw[dif_neg g];use ἅ,λj _=>by rw[(pM.mp λh=>g (B (ϵ h)):d.s.h=0),ϳ,ϑ,AC (by (clear * -;omega))] def bA(K:Ἂ Ἃ)(T:Ἂ Ἀ)(M ok k:Ἀ)(hT:∀t(Nat.lt_or_eq_of_le (Nat.le_of_lt_succ (Nat.lt_of_lt_of_eq hj (ϣ ..)))).elim (λhjs=>Nat.le_trans (Nat.le_of_eq (((AB (Tz.push T[t]!) j hj).trans (nU hjs)).trans (AB Tz j hjs).symm)) (hz j hjs)) (λhe=>Nat.le_trans (Nat.le_of_eq ((congrArg (fun (i:Ἀ)=>(Tz.push T[t]!)[i]!) he).trans ((AB (Tz.push T[t]!) (O0 Tz) (Nat.lt_of_lt_of_eq (Nat.lt_succ_self _) (ϣ ..).symm)).trans nV))) (hT t h))) else⟨Tz,Wz,0,(O0 Tz),fQ,AP,Nat.le_of_eq ((Κ _).trans hs),C0 (Nat.le_trans (Nat.le_of_eq (Κ _)) (Nat.le_trans hn ht)) hk,hz,C0 (Nat.le_trans (Nat.le_of_eq hs.symm) (Nat.le_trans hn ht)) hk⟩ termination_by k-t decreasing_by all_goals exact Nat.sub_lt_sub_left h (Nat.lt_succ_self 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 (Nat.le_of_sub_eq_zero L);rwa[bA,dif_neg (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 Nat.pred L) ⟨p,Nat.le.step u,x,λj r=>(o j r).imp_left Nat.lt.step,λz g=>?_⟩;rw[l z (λs D q=>g s (Nat.lt.step D) q),Ν,g t (Nat.lt.base t) G,Av];refine J (t+1) _ _ _ _ _ _ (congrArg Nat.pred L) ⟨by rw[ϣ,Dense.F.bW,p],by rw[ϣ];exact Nat.succ_le_succ 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 Nat.lt.step U;rwa[AB _ _ (by exact r),nU d,<-AB Tz j d];rwa[Dense.F.pg _ _ _ (Nat.lt.step (d.trans_eq p)),AD (d.trans_eq p)];rw[ϣ]at r;cases (Nat.le_of_lt_succ r).antisymm (not_lt.1 d);refine⟨?_,?_,?_⟩<;>simp only[AC (AX _)];exact Nat.lt.base t;rw[AB _ _ ((by simp only [ϣ,lt_add_iff_pos_right,Order.lt_one_iff])),nV];rw[Dense.F.pg _ _ _ (Nat.lt_succ_of_le 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 (Nat.lt.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,dif_neg (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,dif_neg 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,if_neg (by simp[c])] have W:3*(s.w+2)<2^(32:Ἀ):=AO (ι _ (Nat.le_add_left 3 _)) hN;have V:s.cin*(s.h+2)+3<2^(32:Ἀ):=AO (Nat.le_mul_of_pos_right _ (Nat.succ_pos _)) 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 (Nat.mul_le_mul_left _ (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),Ϧ,Nat.zero_div,Nat.zero_mod];ring) z1 Z (λq hq=>by rw[z3 q hq,if_neg (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=Dense.F.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 (Dense.F.dw ld*Dense.F.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(Dense.F.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:=(Dense.F.dh _ _ 126 N (by decide) (hb _).2).trans (AU one_le_two bb) have u:Dense.F.fv (Dense.F.dw ld*Dense.F.dw d.b[o]!)/\ Dense.F.rv (Dense.F.dw ld*Dense.F.dw d.b[o]!)=tm ld d.b[o]!:=Dense.F.dJ ld d.b[o]! l0 (hb _).1 have bp:(c.n:ℝ)<=2^d.L:=by exact_mod_cast(Nat.le_trans bh (Nat.le_trans (V1 _ 2) hL):c.n<=2^d.L) obtain⟨fS,eS⟩:=Dense.F.dM _ _ _ _ _ rfl▸Dense.F.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 (Nat.le_trans (L1 bh 2) hL) m (Nat.le_trans ah (by decide)) c.n 0 _ rfl (ϟ _) u.1 (by simp only[u.2,Finset.sum_range_zero,Av,sub_self,A5,Nat.cast_zero,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[Dense.F.gg] refine(Dense.F.jE d.J d.k (λt=>if tif tDense.F.dw ld*Dense.F.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=Dense.F.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 (Dense.F.dw ld*Dense.F.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(Nat.add_add_add_comm _ _ _ _).trans (congrArg (·+(w+k)) ((Nat.add_add_add_comm _ _ _ _).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) (Nat.add_lt_add_of_lt_of_le hy (jd d.kk t)) (Nat.add_lt_add_of_lt_of_le 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 (Nat.lt_add_of_pos_right (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[dif_pos h]at J;exact J ·rename_i h;rw[dif_neg h]at J;unfold ow2 by_cases hz:(d.b[o]! == 0&&zpC d o y x)=true ·rw[if_pos hz] simp only[Η,AQ]at hz 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) hz.2) (fun q=>(hx q).1) (fun q=>(hw q).1)] ·rw[if_neg 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&&Dense.F.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[Dense.F.wcAeq_ok h1] @[noinline]def czS:ST.Ref Unit (Ἂ (Dense.F.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,dif_neg (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 db a9 d c o q (Dense.F.dw oneW*Dense.F.dw d.b[o]!) a) 0 0 0 (by simp) (Ah (d.Y*(d.s.h*d.s.w)) 0) def g7(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY 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 (Nat.le_of_eq (congrArg (0+d.Y*·) Ϧ)) (AN (϶ 32) ς)) (λo A q _ _ a=> let c:=zcC d Z p cs hT l m hW j o A db a9 d c o q (Dense.F.dw ld*Dense.F.dw d.b[o]!) 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 _ (Nat.succ_pos _)) r;have hK:d.s.w+2?_) hN hK (λbb=>by have a6:=gX _ d.s.w _ G _ (d.s.h-1) (d.s.w-1) _ _ rfl rfl (Nat.sub_lt bb Nat.one_pos) (Nat.sub_lt bB Nat.one_pos) (hc o A) al rw[<-hM]at a6;exact AZ (Nat.le_of_eq ((congrArg (_+·+_+7) (Nat.sub_add_cancel bB).symm).trans (congrArg (·+7) (lO _ 1 _)))) (AZ a6 r)) try dsimp only have bt:(y+1)*d.s.w<=d.s.h*d.s.w:=ι _ hy;rw[Ο]at bt;have e:(o*d.s.h+y)*d.s.w=H:=by rw[Ϡ,Ϛ,bw,hq,Κ] have h2:H+d.s.w<=d.Y*(d.s.h*d.s.w):=AZ (by rw[bw,hq,Κ,pA];exact J1 bt _) bs have B:d.s.wp8 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)) (λxb x h1 h2 h3=>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 x A hy h3 a7 bp aH _ (by rw[dK] exact congrArg (λf=>Dense.F.ao f c.n 0 _) (funext λt=>by rw[lO _ c.Tz[t]! (x-xb),pA _ xb (x-xb),BQ h1]))) _ 0 (G0 d.s.w) (G0 H) i a' hI AP (by rw[Dense.aa B];simp only[kD,Κ]) (by rw[hi];simp only[kD,ϑ]) (by rw[Dense.aa as,Dense.aa B,O];exact h2) (by rw[O];exact U) refine⟨u.1,λi hi=>(u.2 i hi).trans ?_⟩ rw[Dense.aa as,Dense.aa B,Ϧ,Κ];by_cases g:H<=i/\i(AB _ i v).symm.trans ((ba i (Nat.lt_of_lt_of_eq v aL)).trans ((AD ⟨ϟ _,Nat.lt_of_lt_of_eq (Nat.lt_of_lt_of_eq v (aL.trans Array.size_replicate)) (Κ _).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];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[Dense.F.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:=Nat.unpair q.2.2 let c:=Nat.unpair a.2 (Dense.F.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), Dense.F.da (λt=>pc c.1 t*(Nat.unpair a.1).1+py c.1 t*(Nat.unpair a.1).2+px c.1 t) (c.2*c.1) (AS (c.2*c.1))) @[noinline]def lwS:ST.Ref Unit (Ἂ (Dense.F.WcE lwf)):=(ST.Prim.mkRef #[] (Void.mk ())).val lemma lwf_T(K:Ἂ Ἃ)(n A B kk nc:Ἀ):(lwf (K,n,Nat.pair (Nat.pair A B) (Nat.pair kk nc))).2.2.2=Dense.F.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,dif_pos 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,dif_pos h] lemma lwB(s:ConvShape)(nc Y:Ἀ)(K:Ἂ Ἃ)(lw:{v:ἇ×Ἆ×ἀ×Ἂ Ἀ//v=lwf (K,Y*(nc*(s.kh*s.kw)),Nat.pair (Nat.pair ((s.h+2)*(s.w+2)) (s.w+2)) (Nat.pair (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,(USize.ofNat (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 def fL(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= fLc s J I K b D nc Y (Dense.F.wcGet3 Dense.F.wcK3eq Dense.F.wcK3eq_ok lwS 32 (K,Y*(nc*(s.kh*s.kw)),Nat.pair (Nat.pair ((s.h+2)*(s.w+2)) (s.w+2)) (Nat.pair (s.kh*s.kw) nc)) (fun k=>k.1)) lemma ev_h1(s:lR)(kk:Ἀ)(a2:0simp only[ConvShape.ho,ConvShape.wo,e,j,l,m,Nat.div_one]<;>exact⟨Nat.sub_add_cancel a2,Nat.sub_add_cancel 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 (dif_pos ⟨hs,a2,aH,as,ah,X,U,H,p,(by exact Nat.le_of_lt_succ G),(by exact Nat.le_of_lt_succ aL),(by exact Nat.le_of_lt_succ a1),(by exact Nat.le_of_lt_succ u),(by exact Nat.le_of_lt_succ A),(by exact Nat.le_of_lt_succ v),(by exact Nat.le_of_lt_succ x),al,hI,(by exact Nat.le_of_lt_succ 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 Nat.le_of_eq (Κ _);exact ho refine (g8 _ _ _ _ d _ _ _ _ (by exact hs) as (by rfl) (by exact hc) (by rfl) (λt ht=>by dsimp only;rw[E3,Dense.F.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[dif_neg 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,if_neg (by rw[Ϧ];exact Nat.not_lt_zero _)]) q (by rw[this];exact hq)) (by exact Dense.F.bd I (U1 G ς) ah) (by have g:=Dense.F.bd K (U1 aL ς) (E1▸X);rw[<-E1] at g;exact g) (by exact Dense.F.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 unfold fL refine (Classical.em _).elim (λhg=>?_) (λhn=>by exact dif_neg hn) exact (ev_h3 s J I K b D d Y hd (Dense.F.wcGet3 Dense.F.wcK3eq Dense.F.wcK3eq_ok lwS 32 (K,Y*(d*(s.kh*s.kw)),Nat.pair (Nat.pair ((s.h+2)*(s.w+2)) (s.w+2)) (Nat.pair (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 Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Nat.lt_succ_of_le 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 Nat.lt_succ_of_le 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=>(Nat.mod_eq_sub_mod i).trans (γ (Nat.sub_lt_left_of_lt_add i j)) have P:∀z,00C0 (ϟ _) (dv 0 z i) (Nat.lt_or_ge x N).elim (λhx=>(Nat.lt_or_ge y N).elim (λhy=>lt_of_eq_of_lt (if_neg (Nat.not_le.2 hx)) (lt_of_lt_of_eq (Int.ofNat_lt.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 (if_pos hx).symm (lt_of_lt_of_eq h (if_pos hy)))) (γ hy).symm)))) (if_neg (Nat.not_le.2 hy)).symm)) λhy=>have h:=lt_of_eq_of_lt (if_pos hx).symm (lt_of_lt_of_eq h (if_neg (Nat.not_lt.2 hy)));absurd (if e:y=N then lt_of_lt_of_eq h (if_pos e) else Nat.lt_trans (U1 (lt_of_lt_of_eq h (if_neg e)) (Nat.sub_le_sub_left hy _)) q) (Nat.not_lt.2 (Nat.le_add_left _ _))) λhx=>(Nat.lt_or_ge y N).elim (λhy=>have h:=lt_of_eq_of_lt (if_neg (Nat.not_lt.2 hx)).symm (lt_of_lt_of_eq h (if_pos hy));lt_of_eq_of_lt (if_pos hx) (lt_of_lt_of_eq (if e:x=N then Int.lt_of_le_of_lt (Int.neg_nonpos_of_nonneg (Int.natCast_nonneg _)) (Int.natCast_pos.2 (P _ (lt_of_lt_of_eq (Nat.lt_add_left_iff_pos.1 (lt_of_eq_of_lt (if_pos e).symm h)) (γ hy).symm))) else Int.lt_of_lt_of_le (Int.neg_neg_of_pos (Int.natCast_pos.2 (P _ (lt_of_lt_of_eq (Nat.sub_pos_of_lt (Nat.lt_of_le_of_ne hx (Ne.symm e))) (M x hx d).symm)))) (Int.natCast_nonneg _)) (if_neg (Nat.not_le.2 hy)).symm)) λhy=>have h:=lt_of_eq_of_lt (if_neg (Nat.not_lt.2 hx)).symm (lt_of_lt_of_eq h (if_neg (Nat.not_lt.2 hy)));lt_of_eq_of_lt (if_pos hx) (lt_of_lt_of_eq (Int.neg_lt_neg (Int.ofNat_lt.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)) (Nat.sub_pos_of_lt (Nat.lt_of_le_of_ne hx λf=>Nat.lt_irrefl _ (lt_of_eq_of_lt (if_pos f.symm).symm (lt_of_lt_of_eq h (if_pos e))))) else have h:=lt_of_lt_of_eq h (if_neg e);if f:x=N then absurd (Nat.lt_trans (U1 (lt_of_eq_of_lt (if_pos f).symm h) (Nat.sub_le_sub_left hy _)) q) (Nat.lt_irrefl _) else Nat.sub_lt_sub_right hy (Nat.lt_of_not_le λl=>Nat.not_lt.2 (Nat.sub_le_sub_left l _) (lt_of_eq_of_lt (if_neg f).symm h))) (M x hx d).symm))))) (if_pos 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:Model.isZero (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 Ne.symm (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,Nat.mul_mod_left,mul_zero,Nat.ofNat_pos, ↓reduceIte,Ak,OfNat.ofNat_ne_zero,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)∧(Int.toNat ((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),Nat.sub_mul_div];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=u at x⊢ exact⟨λh=>h.trans (Nat.sub_le _ _),λh=>by rw[<-Nat.mod_add_div u 256,Nat.sub_add_comm x.le];exact (Nat.le_mul_of_pos_right 256 (Nat.div_pos h ((by decide):0<256))).trans (Nat.le_add_left _ _)⟩ ·rw[aZ e,g,Ϗ (mJ q),Nat.sub_mul_div,N];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=a at x⊢ have h:=Nat.mod_add_div 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[Nat.sub_add_comm x.le,Nat.add_mul_mod_self_left,γ ((Nat.sub_le _ _).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 (Nat.lt_of_le_of_ne (Nat.le_of_lt_succ 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:Ἁ)=Int.ofNat 23 from ἅ,mw,D,eO] simp only[(beq_eq_false_iff_ne.2 (Nat.ne_of_lt ((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[UInt32.le_iff_toNat_le,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)=ἄ),fT,ἂ,Az,ἁ,Bool.xor_false];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:=UInt32.le_iff_toNat_le.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;rfl 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,List.range_zero,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 (Fin.val 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 Nat.lt_of_add_right_lt m),ab n (λ_=>ld) i (by exact Nat.lt_of_add_right_lt 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 Nat.le_of_succ_le 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 (Fin.val i));have p:=Ϝ (f:=λ_:Fin n=>ld);rw[ms];unfold dotSpec;rw[←Model.Reduction.map_value_dot];generalize (kK (n:=n) λi=>fa (Fin.val 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 Nat.lt_of_lt_of_eq 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 Nat.lt_of_succ_le e)).1;have u:=q B p λk e=>(l k (by exact ϟ k) (by simp[d];exact Nat.lt_of_succ_le 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 Nat.lt_add_left 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(Nat.lt_succ_iff_lt_or_eq.1 d).elim (g t) λe=>e▸j,λh=>⟨λt d=>h t (by exact Nat.lt_add_right 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,Int.cast_sum]) ((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,Int.cast_sum]) ((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 (Int.ofNat_lt.mpr d);rw[<-nE (kM x*_),Nat.cast_mul,Nat.cast_pow,Nat.cast_pow,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,Nat.cast_mul,Nat.cast_pow,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,Nat.reduceLT,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 Nat.le_of_succ_le this .exact UInt64.le_refl _ 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 (Nat.min_eq_left 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 Nat.min_le_left a.toNat b.toNat) lemma fX(a b:ἆ):po a b<=b:=θ.mpr (by rw[mn];exact Nat.min_le_right 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 Nat.le_of_succ_le 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,η,Nat.le_min]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,if_pos (AM.2 m)]at d;apply A6 rw[θ,χ _ _ d,am];exact tsub_le_iff_left.2 ((Dense.aT x).trans_le ((Nat.sub_le _ _).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 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),γ ((Nat.lt_add_one _).trans K),γ K,(Nat.le_add_left w P).trans_lt ((Nat.lt_add_one _).trans (G.trans_le c))⟩ 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:Ἀ)): gT h w I d j y x 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 (cU h w 2 I j y x)) (lI d))=av (2*2) (nI h w 2 I j y x) d:=ἅ;have H:=gU_h1 G;have g:∀i o,I.uget i o=I[(J0 i)]!:=λi o=>(AB I _ o).symm;dsimp only[gT];split;swap;exact m;simp only[g,lJ,mA,aa _ H.2.2.2,H,D,p,r,u,v];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 ἅ,Ν,Finset.sum_range_zero,Ai]) (by simp[bF]) _ (by rw[cW];simp only[AQ]) _ ἅ d B 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,dif_neg (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,Nat.reduceAdd,Int.reducePow,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:ecV (.==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 gTe(h w:Ἀ)(I:Ἂ Ἃ)(d:Ἃ)(ch y x:Ἀ)(e:Ἄ)(u:(ch*h+y*2)*w+x*2=(J0 e)):gT h w I d ch y x e=gTm w (G0 w) I d e:=by rw[gT,gTm];simp only[cUq,u] 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:=Nat.sub_eq_zero_iff_le.1 hm rw[pQ,dif_neg (by rw[ε,hU A (hA.trans_lt hN)];exact Nat.not_lt.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)Nat.not_le_of_lt 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[Array.size_replicate]) (by simp only[Ϧ,ϳ,ϑ]) (ϟ _) H W Ϧ Ϧ (by simp only[Ϧ,ϳ,ϑ]) (λj g=>absurd g (by rw[Ϧ];exact Nat.not_lt_zero 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:Ἄ)=USize.ofNat 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,gTe h w I d _ _ _ _ (by rw[u])] congr 1;apply USize.toNat_inj.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 eT c (h/k) (w/k) λch y x=> let U:=(ch*h+y*k)*w+x*k let B:=wl (λ(m:ἆ) v=>min m (aq v)) I w k (k*k) U 0 255 if B<=255/\wa (ok q B) I w k (k*k) U 0 ἃ=ἃ then wo B (cr (t1 B) I w k (k*k) U 0 0) 0 (λ_=>wa (.==0x80000000) I w k (k*k) U 0 ἃ) (λ_=>cU h w k I ch y x) d else toWord (Ar (ofW (cU h w k I ch y x)) (ofW d)) 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 (if_pos c).trans (h1 c) else (if_neg 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 (Nat.le_of_succ_le 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:Ἄ)=USize.ofNat 2 from rfl,<-BP,<-mC,Ϗ 2,<-lX,aa _ (by clear*-Q;omega)] .have l:=jL _ B;refine eV_h1 (λd=>?_) (λd=>?_) .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 .refine dO _ _ _ _ _ _ λj y x=>?_;refine eV_h1 (λd=>?_) (λ_=>(by rfl)) have g:=(dk _ _ _ _ _ _ e).1 d.2;simp only[cu]at g;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) (em _ h w k I j y x e) (by simp[bF]) _ (by simp only[dk _ _ _ _ _ _ e,cu,AQ]) _ rfl _ m @[inline]def ky(u:Ἃ):ἇ:=if u<0x80000000 then u+0x80000000 else 0xFFFFFFFF-u @[inline]def bu(a b:Ἃ):Ἃ:=if ky asimp only[mh,pU,kN,nr];exact γ (by omega);omega lemma il(a b:kF):(mJ (ky (bu a b)))=max (mJ (ky a)) (mJ (ky b)):=by rw[bu];split<;>rename_i h<;>rw[Ι]at h<;>omega lemma io(a b:kF)(h:(mJ (ky a))=(mJ (ky b))):a=b:=by rw[ci,ci]at h;have:=a.toNat_lt;have:=b.toNat_lt;rw[<-Β];split_ifs at h<;>omega lemma fY_h0(b:ℕ)(h:2147483648rcases fY_h1 b with⟨b1,b2,b3⟩|⟨b1,b2,b3⟩|⟨b1,b2,b3,b4⟩<;>rw[a2,b2]at h rwa[a3,b3] exact absurd h (Nat.not_lt.2 (Nat.le_add_left _ _)) exact absurd (h.trans (fY_h0 _ b1)) (Nat.not_lt.2 ((Nat.le_succ _).trans (Nat.le_add_left _ _))) rw[a3,b3];exact U1 (Nat.lt_succ_self _) (Nat.le_add_left _ _) exact absurd h (Nat.lt_irrefl _) exact absurd (h.trans (fY_h0 _ b1)) (Nat.not_lt.2 (Nat.le_succ _)) rw[a3,b3];exact (fY_h0 _ a1).trans (U1 (Nat.lt_succ_self _) (Nat.le_add_left _ _)) rw[a3,b3];exact fY_h0 _ a1 rwa[a3,b3] lemma fY_h3(a b:Ἃ)(d:¬(mJ (sk a))<(mJ (sk b)))(g:¬(mJ (sk b))<(mJ (sk a)))(m:(mJ a)≠(mJ b)):((mJ a)=0∧(mJ b)=2147483648)∨((mJ a)=2147483648∧(mJ b)=0):=by have e:=Nat.le_antisymm (Nat.not_lt.1 g) (Nat.not_lt.1 d);rcases fY_h1 a with⟨a1,a2,a3⟩|⟨a1,a2,a3⟩|⟨a1,a2,a3,a4⟩<;>rcases fY_h1 b with⟨b1,b2,b3⟩|⟨b1,b2,b3⟩|⟨b1,b2,b3,b4⟩ exact absurd (Nat.add_right_cancel (a2.symm.trans (e.trans b2))) m exact pZ ⟨Nat.add_right_cancel ((a2.symm.trans (e.trans b2)).trans (Κ _).symm),b1⟩ exact absurd (a2.symm.trans (e.trans b2)) (Nat.ne_of_gt ((fY_h0 _ b1).trans (U1 (Nat.lt_succ_self _) (Nat.le_add_left _ _)))) exact BA ⟨a1,Nat.add_right_cancel ((b2.symm.trans (e.symm.trans a2)).trans (Κ _).symm)⟩ exact absurd (a1.trans b1.symm) m exact absurd (a2.symm.trans (e.trans b2)) (Nat.ne_of_gt ((fY_h0 _ b1).trans (Nat.lt_succ_self _))) exact absurd (b2.symm.trans (e.symm.trans a2)) (Nat.ne_of_gt ((fY_h0 _ a1).trans (U1 (Nat.lt_succ_self _) (Nat.le_add_left _ _)))) exact absurd (b2.symm.trans (e.symm.trans a2)) (Nat.ne_of_gt ((fY_h0 _ a1).trans (Nat.lt_succ_self _))) exact absurd ((Nat.sub_sub_self (Nat.le_sub_one_of_lt a4)).symm.trans ((congrArg (4294967295-·) (a2.symm.trans (e.trans b2))).trans (Nat.sub_sub_self (Nat.le_sub_one_of_lt b4)))) m lemma fY(o:kB y≠255)(p:kB z≠255):mx y z=bu y z:=by rw[Conv.mx,bu];by_cases h:sk yh j.2.2];simp only[not_or,Ι]at h;obtain⟨d,g,l⟩:=h;obtain⟨rfl,rfl⟩|⟨rfl,rfl⟩:(y=0/\z=0x80000000)\/(y=0x80000000/\z=0):=(fY_h3 _ _ d g (λe=>l (Β.1 e))).imp (λ⟨a,b⟩=>⟨Β.1 a,Β.1 b⟩) (λ⟨a,b⟩=>⟨Β.1 a,Β.1 b⟩)<;>decide lemma m4(g j l m:kF):(if nn g&&nn j&&nn l&&nn m then bu (bu g j) (bu l m) else mx (mx (mx (mx g g) j) l) m)=mx (mx (mx (mx g g) j) l) m:=by split .rename_i h;simp only[nn,Η,AM,Ak]at h;obtain⟨⟨⟨d,o⟩,p⟩,q⟩:=h;have e:∀a b,kB a≠255->kB b≠255->kB (bu a b)≠255:=λa b r u=>by rw[bu];split<;>assumption rw[fY _ _ d d,fY _ _ (e _ _ d d) o,fY _ _ (e _ _ (e _ _ d d) o) p,fY _ _ (e _ _ (e _ _ (e _ _ d d) o) p) q];apply io;simp only[il,max_self,max_assoc] .rfl noncomputable def iy(ch y x:Ἀ)(e:Ἄ):Ἃ:= let v:=(G0 w) 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[Nat.zero_div,Nat.zero_mod,ϑ,ϑ];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[iy];split;rw[m4];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,List.range_zero,l6,Ϸ,mT];rw[<-cn (wl _ _ _ _ _ _ _ _),fn I w 2 _ (2*2) (by decide)];simp only[nI];exact iz_h1 I _ w x @[inline]def iYm(w:Ἀ)(ww:Ἄ)(I:@&Ἂ Ἃ)(e:Ἄ):Ἃ:= if hb:e(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 _ ((Nat.div_le_self _ _).trans_lt (qL.trans (by decide)))) (aa _ ((Nat.div_le_self _ _).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=>(Nat.not_lt_zero 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:Ἄ)=USize.ofNat 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,iYe h w I _ _ _ _ (by rw[u])] congr 1;apply USize.toNat_inj.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:Ἄ)=USize.ofNat 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[Nat.mul_add_div ((by decide):2>0),ώ h,ϑ],by rw[Nat.mul_add_mod,γ 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[Nat.log2_def,if_pos (by omega:2<=2*q+b),Nat.mul_add_div (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[Nat.cast_succ];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,(Nat.sub_add_comm (Nat.le_trans (by decide) m):(Aq q)+1-23=((Aq q)-23)+1),<-VY q r D _ x t (by exact Nat.le_sub_of_add_le (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 (Nat.le_trans (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₀ _ (Nat.cast_pos.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 Nat.ne_of_gt (U1 (Ϯ (by decide) (ϵ j)) (V1 _ _)),(by rw[Nat.cast_succ,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,(Nat.le_succ_of_le (Nat.le_trans (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:ρ=((Int.toNat ρ.num):ℚ)/ρ.den:=by(conv_lhs=>rw[<-Rat.num_div_den ρ]);congr 1;exact_mod_cast(Int.toNat_of_nonneg (Rat.num_nonneg.2 o)).symm have d:=ρ.den_pos;generalize ρ.den=D,(Int.toNat ρ.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),Nat.cast_lt]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[Nat.cast_natAbs,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[(Int.ofNat_le.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,Int.cast_neg,Int.cast_natCast,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⟨Nat.le_refl _,λ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[Nat.sub_add_eq,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[Nat.sub_add_eq,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 (Nat.sub_le _ _) (by decide):63-k<64),kH,lY] rw[(by rw[<-AF];congr 1;rw[Τ];exact (Nat.sub_add_comm (Nat.lt_succ.1 h)).symm:2^(1:Ἀ)*2^(63-k)=2^(64-k)),(by rw[<-AF,Nat.sub_add_cancel h.le]:2^(64:Ἀ)=2^(64-k)*2^k),Nat.mul_mod_mul_right,<-Ϛ,<-Ϡ,Nat.mod_add_div'];exact⟨ἅ,AO (ZV _ _) ((by omega))⟩ have m:(lq d)*2^(k-64)<2^(62:Ἀ):=calc _<2^(48:Ἀ)*2^(14:Ἀ):=ly o (Θ ((by positivity)) (Nat.sub_le_sub_right 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 (Nat.sub_le_sub_right p 64) (by decide):k-64<64),ο,γ (m.trans (by decide):(lq d)*2^(k-64)<2^(64:Ἀ))] refine⟨?_,m⟩;rw[Ϛ,<-AF];rw[Nat.sub_add_cancel (Nat.le_of_not_lt 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 (Nat.not_lt.2 (Nat.sub_eq_zero_iff_le.1 q))];simp only[ο,Finset.range_zero,Finset.sum_empty];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 (Nat.mul_le_mul_left 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[Nat.sub_add_eq,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[Nat.sub_add_eq,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 [List.range_zero,mT,Finset.range_zero,Finset.sum_empty,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[Nat.cast_mul,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[Nat.cast_mul,Nat.cast_mul,Nat.cast_pow,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,OfNat.ofNat_ne_zero,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):(Int.toNat (e-1-T))=0:=Int.toNat_of_nonpos (Int.sub_nonpos_of_le ((Int.sub_le_self _ (by decide)).trans ((Int.le_add_one (le_refl _)).trans p))) lemma Q4_h2(e T:Ἁ)(p:e+1<=T):∃k,(Int.toNat (T-e))=k+1:=⟨(Int.toNat (T-e))-1,(Nat.sub_add_cancel ((Int.lt_toNat (m:=0)).2 (Int.sub_pos.2 (Int.lt_of_add_one_le p)))).symm⟩ lemma Q4_h3(e T:Ἁ)(k:Ἀ)(p:e+1<=T)(j:(Int.toNat (T-e))=k+1):(Int.toNat (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 (Int.lt_of_add_one_le 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):(Int.toNat (297-s))<2^(64:Ἀ):=by have h:(Int.toNat (297-s))<=506:=Int.toNat_le.2 ((Int.sub_le_sub_left m 297).trans_eq (by decide)) exact C0 h (by decide) lemma V9_h2(s:Ἁ)(o:s<=297):(((Int.toNat (297-s)):Ἀ):Ἁ)-298=-s-1:=by rw[Int.toNat_of_nonneg (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:Ἀ):=(Nat.div_eq_zero_iff.1 ((β R 31).symm.trans l)).resolve_left (BD.1 (϶ 31)) exact(J1 q _).trans_lt ((Nat.add_lt_add_right (Nat.mul_lt_mul_of_pos_left 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 (Int.toNat (297-s))):=by set R:=ZK e d with g;have h:(lq (XF (Int.toNat (297-s))))=(Int.toNat (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 Int.toNat_le.2 (Int.sub_le_sub_left m 297)),h,j,Yf,<-g,Q4 _ _ R (-s) _ (Nat.ne_of_gt (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 (Int.toNat (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<<<(Int.toNat c)else B def YF(Dn:Ἀ)(c:Ἁ):Ἀ:=if 0<=c then Dn else Dn<<<(Int.toNat (-c)) lemma VE(B d:Ἀ)(e:0rw[ο,Nat.cast_mul,Nat.cast_pow,nZ,<-AA];exact⟨e,by rw[Int.toNat_of_nonneg h];exact mul_div_right_comm _ _ _⟩ rw[Int.toNat_of_nonneg (Int.neg_nonneg_of_nonpos (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[(Nat.sub_add_cancel l.le).symm,m7];exact ϐ e (϶ _) rw[if_pos h,ψ,Ϣ,Ϣ,ZG,ZG,ο,ο,γ (AN e (Θ (by decide) ((Nat.sub_le 63 k).trans (by decide))):x<2^(64:Ἀ)),γ (AN l (by decide):k<2^(64:Ἀ)),γ (Nat.lt_succ_of_lt l:k<64)] exact γ (Nat.lt_trans g (by decide)) .exact if_neg 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,if_pos (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 [Finset.range_zero,Finset.sum_empty,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[Nat.sub_add_eq,h,BK]),Nat.cast_add];ring ·rw[ih (i+1) _ _ (by rw[Nat.sub_add_eq,h,BK]),Nat.cast_add];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 Nat.add_sub_self_left (r*n) n)),Vb x u _ n _ 0 0 0 0 ((by exact Nat.add_sub_self_left (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[Nat.cast_mul,pO h,sq] lemma YO_h2(a b:Ἀ)(h:a<=b):(((b-a)*(b-a):Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[Nat.cast_mul,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 (Nat.le_of_not_le h) lemma VF_h1(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(m Y c:ℚ)(w:0sq_nonneg _) (Nat.cast_nonneg _) rw[h,le_div_iff₀ (mul_pos ((Nat.cast_pos (α:=ℚ)).2 w) ((Nat.cast_pos (α:=ℚ)).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,Int.cast_natCast]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,<-Finset.mul_sum,d,m,l,Finset.sum_const,Finset.card_range,nsmul_eq_mul];exact VF_h3 _ _ _ _ ((Nat.cast_ne_zero (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 ((Nat.cast_le (α:=ℚ)).1 (by rw[YO,Nat.cast_mul,o];exact sub_nonneg.1 v)),YO,o,l,Nat.cast_mul,Nat.cast_mul] 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 NF Dense.F open Dense (ay) @[inline]def mx(a b:ἆ):ἆ:=if arename_i h<;>rw[μ]at h<;>omega @[inline]def pk(s:Ἆ)(q σ:ἆ):Ἃ:= (UInt64.toUInt32 ((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) (Core.iW b+A1)) (Core.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:Ἀ):=Nat.add_le_add a hy have d:c+(x*2^(23:Ἀ)+y)<=2^(31:Ἀ)+(252*2^(23:Ἀ)+2^(24:Ἀ)):=Nat.add_le_add 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:Ἀ):=Nat.mul_lt_mul_of_pos_left l (by decide) rw[γ (Nat.lt_trans 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 (Nat.mul_lt_mul_of_pos_left 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) (Nat.sub_le_sub_right o 146) t rw[(by clear p r t;rw[cl s _ _ (by rw[d];exact Nat.succ_ne_zero _) (o.trans (by decide)),cl s _ _ (by rw[g];exact Nat.mul_ne_zero (Nat.succ_ne_zero _) (by decide)) (by rw[h];exact(Nat.sub_le _ _).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)),Nat.cast_mul,Nat.cast_pow,nZ,kj_h4]:az s ((2:ἆ)*q+1) σ=az s (((2:ἆ)*q+1)<<<36) (σ-36))];apply Β.1;rw[p,r,h,Nat.sub_sub] 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 (Int.ofNat_le.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 ((Nat.le_add_left 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:=Nat.succ_le_succ (Nat.succ_le_succ g) rw[pt,d,AB P.data (j+1) (by simp only[P,Ϝ];exact k.trans (by decide))];simp only[P,Λ,if_pos 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:=⟨Nat.min_le_right _ _,AZ (by decide) (Int.ofNat_zero_le _),(J1 l 1).trans (by decide),Nat.add_sub_cancel' (Nat.min_le_left _ _)⟩ theorem jv_h2(e:Ἀ)(l:e<=508):e-po e 254<=254:=Nat.sub_le_iff_le_add.2 ((Nat.le_min.2 ⟨Nat.le_add_left 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 [Int.cast_one,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,Nat.sub_add_cancel (Nat.sub_le 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:=Nat.mul_ne_zero 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 (Nat.mul_div_cancel _ (϶ (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 Nat.mul_le_mul_left _ al.le have bs:=cP d have bA:kG d+(lq x)+52<=342:=L1 (Nat.add_le_add 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) _) (Nat.cast_nonneg (α:=ℝ) _),?_,?_,(bA.trans (by decide)),?_,?_,?_,?_,?_⟩ have hz:(lq (I0 e))=e:=Α (q.trans (by decide)) have W:(Int64.toInt (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 (Nat.not_le.2 (q.trans (by decide))),Int.sub_zero];exact ke_h1 e q have z5:(Int.natAbs (if X then(e:ℤ)else-(e:ℤ)))<2^(53:Ἀ):=by rw[Ax Int.natAbs,Int.natAbs_neg,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) (Int.ofNat_zero_le _)) (bL 53 (j+u) 971 ((J1 Q 53).trans (by decide)) AP _ z5) refine⟨this.1,?_⟩ rw[this.2,AA,Ax (Int.cast:ℤ->ℝ),Int.cast_neg,Int.cast_natCast] 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,<-Nat.cast_mul,Nat.cast_le];exact pr _ _) have a2:(S:ℝ)by have e:(lq (a-b))=2^(64:Ἀ)-((lq b)-(lq a)):=BitVec.toNat_sub_of_lt (x:=a.toBitVec) (y:=b.toBitVec) (μ.2 g);rw[e]at h;exact absurd h (Nat.not_le.2 (AN (by decide) (Nat.sub_le_sub_left ((Nat.sub_le _ _).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 Nat.not_le.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 (Nat.add_lt_add_right eb 10) (by decide)),(γ (AO (Nat.add_le_add ib (L1 Jb 1056)) (by decide))).trans (pA _ _ _).symm,γ (AO (Nat.add_le_add 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,Nat.sub_add_cancel (le_max_of_le_left (le_max_of_le_left (V1 _ _))),hA];exact le_max_of_le_right (Nat.le_of_eq ((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▸Nat.cast_nonneg _) (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▸Nat.le_sub_of_add_le (le_max_of_le_left (le_max_of_le_left (Τ _ _).le))) (by rw[z,Nat.sub_add_cancel (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,Rat.cast_mul,Rat.cast_zpow,Rat.cast_intCast,Rat.cast_ofNat,Ac t2,AA,zpow_ofNat,mul_div_assoc] rw[Rat.cast_add,Rat.cast_div,Rat.cast_mul,Rat.cast_sub,e x,e g,e b,o,AF,hZ] exact jn_h2 _ _ _ _ _ _ _ _ _ (Nat.cast_ne_zero.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 ((γ ((Nat.add_lt_add (ϊ _ (϶ 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[if_pos h,if_pos h,Rat.cast_neg,neg_mul];rw[if_neg h,if_neg h] rw[kq]at lo hi have a6:(q:ℚ)*2^e<(if s then-Y else Y):=Rat.cast_lt.1 (show (((q:ℚ)*2^e:ℚ):ℝ)<((if s then-Y else Y:ℚ):ℝ) by rw[Rat.cast_mul,Rat.cast_zpow,Rat.cast_natCast,Rat.cast_ofNat];exact BF lo hP.le) have A:(if s then-Y else Y)<((q:ℚ)+1)*2^e:=Rat.cast_lt.1 (show ((if s then-Y else Y:ℚ):ℝ)<((((q:ℚ)+1)*2^e:ℚ):ℝ) by rw[Rat.cast_mul,Rat.cast_zpow,Rat.cast_add,Rat.cast_natCast,Rat.cast_one,Rat.cast_ofNat];exact BF hi hP.le) have a0:(0:ℚ)<2^e:=((by positivity)) have v:0<(if s then-Y else Y):=AO (Af (Nat.cast_nonneg _) 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[if_pos h]at v⊢;exact⟨abs_of_neg (neg_pos.1 v),λ_=>h▸A6 (neg_pos.1 v)⟩;rw[if_neg h]at v⊢;exact⟨AW v,λ_=>(Bool.eq_false_iff.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 (Nat.le_add_left _ _) M),Nat.cast_add,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 ((Int.ofNat_le.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 (Int.ofNat_le.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[Nat.div_one];exact b7) (by rw[Nat.div_one,d2];exact k1) (by rw[Nat.div_one,d2];exact k2) (by rw[η,ύ,e3];simp only[kA,V2,Bool.or_true,ἁ,Nat.div_one];exact kj_h2 _ cb) E5] end NE local instance:Inhabited NR.fH:=⟨⟨0,ἄ,0,0,0,0,0,0⟩⟩ 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:=Nat.not_lt.mpr (Nat.sub_eq_zero_iff_le.mp h) rw[Yq,dif_neg (fun x=>z (ε.mp x))];exact ⟨rfl,fun q _=>(if_neg (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[Array.size_set])] by_cases hq1:(J0 i)=q · subst hq1;rw[if_neg (fun c=>Nat.not_succ_le_self _ c.1),if_pos ⟨Nat.le_refl _,hi⟩,Array.getElem_set_self,lX,USize.ofNat_toNat] · rw[Array.getElem_set,if_neg hq1,<-AB d q hq] by_cases c:(J0 i)+1<=q/\q<(J0 e) · rw[if_pos c,if_pos ⟨Nat.le_of_succ_le c.1,c.2⟩] · rw[if_neg c,if_neg (fun x=>c ⟨Nat.lt_of_le_of_ne 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:=Nat.le_of_sub_eq_zero h;rw[Yr,if_neg (Nat.not_lt.2 k0)];exact ⟨rfl,fun q hq=>by rw[if_neg (Nat.not_le.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,if_pos 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[Nat.sub_add_eq,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[if_pos c1,if_pos ((V1 _ _).trans c1)] · rw[if_neg c1];by_cases c2:r*n<=q · rw[if_pos ⟨c2,Nat.not_le.1 c1⟩,if_pos c2,mG c2 ((Nat.not_le.1 c1).trans_eq e1.symm)] · rw[if_neg (c2∘And.left),if_neg 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[dif_neg (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,Nat.sub_add_eq,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[dif_neg (by rw[ε];exact Nat.not_lt.2 (Nat.sub_eq_zero_iff_le.1 hk))];simp only[show¬(J0 i)<(J0 e) from Nat.not_lt.2 (Nat.sub_eq_zero_iff_le.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,γ ((Nat.sub_le _ _).trans_lt this)];rw[θ]at g;rw[ϋ,Nat.sub_eq_zero_of_le (Nat.le_of_not_le g)];rfl);rw[o];generalize q:(lq (ZD w))-(lq u)=d;have t:(lq (I0 d))=d:=by rw[Ϣ,ZG];exact γ (q▸(Nat.sub_le _ _).trans_lt this) have p:(2:ἆ)*(I0 d)=(I0 (2*d)):=(by rw[Ϣ,Ϣ,UInt64.ofNat_mul];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,Nat.sub_add_eq,hk,BK])).1,(j _ _ _ _ _ _ _ _ _ (by rw[m,Nat.sub_add_eq,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 (Nat.mod_mod_of_dvd _ (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 Nat.le_add_left _ _,by rw[hq,bw];exact Ϟ (Nat.add_lt_add_right (ϊ _ (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[if_pos rfl,if_pos rfl,Rat.cast_neg,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 Nat.le_sub_of_add_le ((by decide:146+900<=1047).trans a1) have c1:(lq (eF v.toBits-900))<=398:=by rw[h9];exact Nat.sub_le_of_le_add (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[Rat.cast_zpow,Rat.cast_ofNat] have a6:(q:ℚ)*2^e<(if s then-y else y):=Rat.cast_lt.1 (((Rat.cast_mul _ _).trans (congrArg₂ (·*·) (Rat.cast_natCast q) z2)).trans_lt (BF lo hP.le)) have A:(if s then-y else y)<((q:ℚ)+1)*2^e:=Rat.cast_lt.1 ((BF hi hP.le).trans_eq ((Rat.cast_mul _ _).trans (congrArg₂ (·*·) ((Rat.cast_add _ _).trans (congrArg₂ (·+·) (Rat.cast_natCast 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 (Nat.cast_nonneg _) 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)):=Int.ofNat_le.2 a1 have n2:((lq (eF v.toBits)):ℤ)<=((1298:ℕ):ℤ):=Int.ofNat_le.2 a2 have k1:-126<=((25:ℕ):ℤ)+e:=hE▸(by decide:(-126:ℤ)<=((25:ℕ):ℤ)+(((1047:ℕ):ℤ)-1197)).trans (Int.add_le_add_left (Int.sub_le_sub_right n1 1197) _) have k2:((25:ℕ):ℤ)+e<=126:=hE▸(Int.add_le_add_left (Int.sub_le_sub_right 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[Nat.div_one];exact b7) (by rw[Nat.div_one,d2];exact k1) (by rw[Nat.div_one,d2];exact k2) (by rw[η,ύ,hq];simp only[kA,V2,Bool.or_true,ἁ,Nat.div_one,Nat.mod_one];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) (Nat.sub_add_cancel 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=>Nat.ne_of_gt hd.1 (congrArg mJ q) have hs:(sv d:ℝ)=(kM d:ℝ):=by rw[sv,hd.2.2,if_neg lN,Int.cast_natCast] have hm:2^(23:Ἀ)<=kM d:=by rw[mantOf,if_neg z];exact V1 _ _ have hk:kG d=(mJ (kB d))-1:=by rw[idxOf,if_neg z] rw[hs,hk] calc (2:ℝ)^((mJ (kB d))+22)=2^(23:Ἀ)*2^((mJ (kB d))-1):=by rw[<-AF,<-Nat.add_sub_assoc 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:Ἀ):=(Nat.add_lt_add_right hE 2).trans (by decide) lemma nC_toNat_h2(a b:Ἀ)(h:¬a<=b+2):b<=a:=(V1 _ 2).trans (Nat.le_of_not_le 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,if_pos h] · rw[if_neg 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 (Nat.add_lt_add hp hq) (Nat.le_of_ble_eq_true 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 (Int.ofNat_le.mp h')),hc,pO ((V1 T 2).trans (Nat.le_of_lt (Nat.lt_of_not_le h)))]⟩ obtain⟨w,q⟩:=wq have k1':(G:ℤ)+K<=Sn:=Int.ofNat_le.mpr k1 have k2':(G:ℤ)+(X+Q)<=Sn:=Int.ofNat_le.mpr k2 have k4':(Dd:ℤ)+Q=1054:=congrArg Int.ofNat k4 have w':(Sn:ℤ)<=T+25:=Int.ofNat_le.mpr w have a2':(T:ℤ)<=1298:=Int.ofNat_le.mpr a2 have hG':(G:ℤ)<=255:=Int.ofNat_le.mpr (Nat.le_of_lt_succ hG) have hD':(Dd:ℤ)<=255:=Int.ofNat_le.mpr (Nat.le_of_lt_succ hD) have Aμ:A<=μ:=(Int.le_sub_right_of_add_le ((Int.le_add_of_sub_right_le k3).trans (Int.add_le_add_right (Int.le_sub_left_of_add_le k1') Dd))).trans_eq hμ.symm have μ4:μ<=496:=hμ▸Int.sub_le_sub_right (Int.add_le_add ((Int.sub_le_self _ (Int.natCast_nonneg G)).trans (w'.trans (Int.add_le_add_right 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 ((Int.le_add_of_sub_right_le (v.trans Aμ)).trans_eq (Int.add_assoc μ 51 1022).symm) have g2:(E:ℤ)-1022<=496+51:=g4.trans (Int.add_le_add_right μ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:=Int.add_le_add_right ((Int.sub_le_self _ (Int.natCast_nonneg _)).trans hG') 1 exact⟨(L1 (Nat.le_of_lt hX) 23).trans (by decide),(by decide:1<=22).trans (Nat.le_add_left 22 Dd),(L1 (Nat.le_of_lt_succ hG) 23).trans (by decide),(L1 (Nat.le_of_lt hB) 23).trans (by decide),q,Int.ofNat_le.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[UInt64.toNat_ofNat'];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[UInt64.toNat_ofNat',<-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,Rat.cast_mul,Rat.cast_zpow,Rat.cast_intCast,Rat.cast_ofNat,<-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[Rat.cast_add,Rat.cast_div,Rat.cast_mul,Rat.cast_sub,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:Model.isFinite x=ἃ)(p:0<=Model.toReal x):Model.isZero x=ἃ\/Model.signBit x=ἄ:=by by_cases z:Model.isZero 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 (Bool.eq_false_iff.2 z) rw[<-Model.sign_eq_signBit_of_toDyadic?_some hd] refine Bool.eq_false_iff.2 fun hs=>?_ have hx:Model.toReal 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,if_pos rfl]at q;exact hm (Int.ofNat.inj (le_antisymm (Int.neg_nonneg.1 q) (Int.ofNat_nonneg _))) lemma fS(v:Ἅ)(h:Dense.F.fv v)(p:0<=Dense.F.rv v):Dense.F.fv (Float.sqrt v)/\Dense.F.rv (Float.sqrt v)=ns kC (Real.sqrt (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:Model.canonicalizeModel (Model.sqrt (kI v.toModel))=Model.sqrt (kI v.toModel):=by by_cases z:Model.isZero (kI v.toModel)=ἃ · have hs:Model.sqrt (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 Model.canonicalizeModel_eq_self _ (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 Model.isFinite c).trans f · unfold Dense.F.rv;rw[e];exact (congrArg Model.toReal 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,Nat.two_mul,AF,Int.cast_mul];exact mul_mul_mul_comm _ _ _ _) (m.trans (by decide)) (Int.le_trans (by decide) (Int.natCast_nonneg _)) (Dense.F.bL 48 (2*kG w) 556 (J1 (Nat.mul_le_mul_left 2 (cP w)) 48) (by decide) _ m) exact⟨r.1,by rw[r.2,AA,Nat.two_mul,AF,Int.cast_mul,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) (Nat.cast_nonneg 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∈Finset.Ico (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∈Finset.Ico (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))|<= 2*((k+m:ℕ):ℝ)*(1/2^(53:Ἀ))*(A+∑j∈Finset.Ico (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):=Nat.le_antisymm hie (Nat.sub_eq_zero_iff_le.1 hm) rw[nQs,dif_neg (by rw[ε,q];exact Nat.lt_irrefl _),q,Finset.Ico_self,Finset.sum_empty,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,dif_pos (ε.2 hl)];dsimp only rw[f6 x i] obtain⟨tf,tr⟩:=nQs_t x[(J0 i)]! (hX _ hl) have hs:∑j∈Finset.Ico (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)+∑j∈Finset.Ico ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=Finset.sum_eq_sum_Ico_succ_bot 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∈Finset.Ico ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=Finset.sum_nonneg (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,<-Nat.sub_sub,hm,BK]) (by rw[i1];exact hl) af (add_nonneg hA tn) (by rw[Nat.cast_succ];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:Ἀ):=(Nat.cast_le.2 hn2).trans_eq (by rw[Nat.cast_pow,nZ]) have Tsb:Ts<=2^(568:Ἀ):=by have h0:=Finset.sum_le_card_nsmul (Finset.Ico (r*n) (r*n+n)) (fun j=>((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)) (2^(556:Ἀ)) (fun j _=>nD_tb _) rw[Nat.card_Ico,ϱ,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 Nat.add_sub_self_left _ _) (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,Κ,Nat.cast_zero]at ve obtain⟨qf,qr⟩:=kg2 (4503599627370496/n) ((Nat.div_le_self _ _).trans_lt (by decide)) set q:ℝ:=((4503599627370496/n:ℕ):ℝ) with hq have q0:0<=q:=Nat.cast_nonneg _ have h52:((4503599627370496:ℕ):ℝ)=2^(52:Ἀ):=by rw[show (4503599627370496:ℕ)=2^(52:Ἀ) from rfl,Nat.cast_pow,nZ] have hq1:(n:ℝ)*q<=2^(52:Ἀ):=by have h:=Nat.cast_le (α:=ℝ)|>.2 (pr 4503599627370496 n) rw[Nat.cast_mul]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 (Nat.cast_pos.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[if_pos h]at w1;exact absurd (qpos.trans w1) (not_lt.2 (neg_nonpos.2 Y0)) rw[if_neg (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:(Real.sqrt (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)) (Nat.cast_nonneg 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),Λ] lemma YP_h1{c1 c2:Prop}[Decidable c1][Decidable c2](a b r:kF)(ha:c1→a=r)(hb:c2→b=r):(if c1 then a else if c2 then b else r)=r:=if h:c1 then (if_pos h).trans (ha h) else (if_neg h).trans (ite_eq_right_iff.2 hb) @[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) 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*Float.ofBits ((971-lb)<<<52)) let v:=nS2 x m lo hi z0 let D:=Float.sqrt (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 (Nat.sub_eq_zero_iff_le.1 hm) rw[nS1,dif_neg (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):=Nat.lt_of_sub_pos (hm▸m.succ_pos) rw[nS1,dif_pos (ε.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,Nat.sub_add_eq,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 (Nat.sub_eq_zero_iff_le.1 hm) rw[nS1,dif_neg (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):=Nat.lt_of_sub_pos (hm▸m.succ_pos) rw[nS1,dif_pos (ε.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,Nat.sub_add_eq,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∈Finset.Ico (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):=Nat.le_antisymm hie (Nat.sub_eq_zero_iff_le.1 hm) rw[nS1,dif_neg (by rw[ε,q];exact Nat.lt_irrefl _),q,Finset.Ico_self,Finset.sum_empty,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,dif_pos (ε.2 hl)];dsimp only;rw[f6 x i] obtain⟨tf,tr⟩:=Dense.F.cI x[(J0 i)]! (hX _ hl) have hs:=Finset.sum_eq_sum_Ico_succ_bot 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:=Nat.cast_nonneg 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[Nat.cast_succ,add_one_mul];exact (Ag _ _).trans (add_le_add hA ht) have:=ih (i+1) _ (if Dlhb j (Nat.le_of_succ_le (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:=Nat.ne_of_gt h1 have l3:Aq n<=11:=Nat.le_of_lt_succ ((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,UInt64.toNat_ofNat'] rw[γ (AO l3 (by decide)),γ (show 52<2^(64:Ἀ) by decide),γ (AO c (by decide))] rw[ml,a];simp only[ψ,b,pS] rw[γ (Nat.lt_succ_of_le c),na,γ (lu Nat.one_lt_two (Nat.lt_succ_of_le 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 Nat.mul_div_cancel _ (϶ _) 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,Nat.mul_mod_left] lemma nPw(f:ἆ)(h1:1<=(lq f))(h2:(lq f)<=2046):fv (Float.ofBits (f<<<52))/\rv (Float.ofBits (f<<<52))=(2:ℝ)^(((lq f):ℤ)-1023):=by obtain⟨f1,f2,f3⟩:=nPwF f h1 h2 have ne:=Nat.ne_of_lt (Nat.lt_succ_of_le h2) have K:kI (Float.ofBits (f<<<52)).toModel=Model.ofFields 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:=Nat.lt_succ_of_lt (Nat.lt_succ_of_le h2) have b2:0<2^kC.fracWidth:=϶ _ have fin:Model.isFinite (Model.ofFields kC false (lq f) 0)=true:=by rw[Model.isFinite_ofFields kC _ _ _ b1 b2];exact AM.2 ne refine⟨by unfold fv;rw[K];exact fin,?_⟩ unfold rv;rw[K,BR,Model.toDyadic?_ofFields_of_isFinite _ _ _ _ b1 b2 fin,if_neg (Nat.ne_of_gt h1)] simp only[show kC.fracWidth=52 from rfl,show kC.exponentBias=1023 from rfl,Model.pow2_eq_two_pow] rw[bJ];simp only[υ,if_false,ϑ] exact s5pw 52 _ end lemma nZb(z k:ℕ)(h:(z:ℝ)<=2^(52:Ἀ)):|((z:ℤ):ℝ)*(2:ℝ)^(-(k:ℤ))|<=(2:ℝ)^(971:ℤ):=by rw[Int.cast_natCast,zpow_neg,AA,zpow_ofNat] have p:(0:ℝ)<2^k:=pow_pos two_pos k rw[Ad (Af (Nat.cast_nonneg z) (inv_nonneg.2 p.le))] exact (mul_le_of_le_one_right (Nat.cast_nonneg 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*Float.ofBits ((971-(Aq n).toUInt64)<<<52))/\ Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*Float.ofBits ((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,Nat.mul_div_cancel _ (϶ _)]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[Ϣ,UInt64.toNat_ofNat'];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[Ϣ,UInt64.toNat_ofNat'];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 Nat.le_sub_of_add_le ((J1 l3 1).trans (by decide))) (by rw[pt];exact (Nat.sub_le _ _).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)),Nat.cast_add];ring have r1:((2^(52+Aq n)/n:ℕ):ℝ)<=2^(52:Ἀ):=by have:=(Nat.cast_le (α:=ℝ)).2 R2;rwa[Nat.cast_pow,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 (Int.ofNat_le.2 ((J1 l3 52).trans (by decide)))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,zpow_neg,AA,Int.cast_natCast,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*Float.ofBits ((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*Float.ofBits ((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:=Nat.le_trans (Nat.le_add_left 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,Nat.cast_zero,zero_mul]) (by rw[z0r,Nat.cast_zero,sub_self,A5,zero_pow AL,zero_div,Av,zero_mul,zero_mul,zero_mul,Av]) (Nat.le_trans (Nat.le_of_eq (Κ n)) (Nat.le_trans hn (Nat.le_of_ble_eq_true 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 (Nat.le_add_left 23 Dl) have B1:(2:ℝ)^(Dl+23)<=2^(300:Ἀ):=AU one_le_two (Nat.le_trans (L1 d2 23) (Nat.le_of_ble_eq_true 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∈Finset.Ico (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[Finset.mem_Ico]at hj;exact hB j hj.1 hj.2) rw[Nat.card_Ico,ϱ,nsmul_eq_mul]at h exact hS▸(Finset.abs_sum_le_sum_abs _ _).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*Float.ofBits ((971-(Aq n).toUInt64)<<<52)):=by rw[rir];exact div_nonneg (Nat.cast_nonneg _) P0.le have nR1:=(Nat.cast_le (α:=ℝ)).2 (hR1d▸pr (2^(52+Aq n)) n) rw[Nat.cast_mul,Nat.cast_pow,nZ]at nR1 have hR1:(n:ℝ)*Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*Float.ofBits ((971-(Aq n).toUInt64)<<<52))<=1:=by rw[rir,mul_div_assoc',mul_comm (n:ℝ),div_le_one P0];exact nR1 have lt1:=(Nat.cast_lt (α:=ℝ)).2 (hR1d▸Nat.lt_mul_div_succ (2^(52+Aq n)) h1n) rw[Nat.cast_mul,Nat.cast_pow,nZ,Nat.cast_add,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*Float.ofBits ((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*Float.ofBits ((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 [Nat.cast_add,Nat.cast_pow,nZ] using (Nat.cast_le (α:=ℝ)).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,←Nat.cast_add,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∈Finset.Ico (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∈Finset.Ico (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 (Nat.ofNat_nonneg 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 (Nat.ofNat_nonneg 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):=Nat.le_antisymm hie (Nat.sub_eq_zero_iff_le.1 hM) rw[nS2,dif_neg (by rw[ε,q];exact Nat.lt_irrefl _),q,Finset.Ico_self,Finset.sum_empty,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,dif_pos (ε.2 hl)];dsimp only;rw[f6 x i] obtain⟨tf,tr⟩:=Dense.F.cI x[(J0 i)]! (hX _ hl) have hs:=Finset.sum_eq_sum_Ico_succ_bot 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:=Nat.cast_nonneg 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[Nat.cast_succ,add_one_mul];exact add_le_add hA yy have:=ih (i+1) (v+dF*dF) (A+y*y) (k+1) (by rw[i1,Nat.sub_add_eq,hM,BK]) (i1.le.trans (l7 hl)) rf (add_nonneg A0 y0) hA2 (by rw[Nat.cast_succ];exact step) (by rw[pA,Τ 1 M];exact hk) (fun j h1 h2=>hb j (Nat.le_of_succ_le (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,Finset.sum_const,nsmul_eq_mul,←n8,←Finset.mul_sum,nF,h,Finset.sum_const,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[Ϣ,mY];exact γ (by omega) have b:2^(52:Ἀ)/n<2^(64:Ἀ):=AO (Nat.div_le_self _ _) (by norm_num) rw[ml,a];simp only[Ϣ,UInt64.toNat_ofNat',γ 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 (Nat.ofNat_nonneg 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 (Nat.le_add_left 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:=Nat.le_of_lt_succ ((m9 (Nat.succ_ne_zero _)).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 (Int.ofNat_le.2 ((Τ _ Dl).trans_le (J1 ((Nat.succ_le_succ 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 (Nat.cast_nonneg _) (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∈Finset.Ico (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∈Finset.Ico (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:=Finset.sum_nonneg (fun _ _=>mul_self_nonneg _) have Tmb:Tm<=n*(Y*Y):=by have h:=Finset.sum_le_card_nsmul (Finset.Ico (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[Finset.mem_Ico]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 (Nat.ofNat_nonneg _) 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) ((Nat.div_le_self _ _).trans_lt (Nat.pow_lt_pow_succ (by decide))) have q0:0<=((2^(52:Ἀ)/n:ℕ):ℝ):=Nat.cast_nonneg _ have h0:((n*(2^(52:Ἀ)/n)+2^(52:Ἀ)%n:ℕ):ℝ)=((2^(52:Ἀ):ℕ):ℝ):=congrArg Nat.cast (ϛ (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 _)) (Nat.cast_nonneg _)) (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,Ϡ,Nat.mul_right_comm 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 γ ((Nat.add_lt_add_right f1 _).trans (by decide)) generalize hM:(mJ f)+2^(23:Ἀ)=M at mE have M1:2^(23:Ἀ)<=M:=hM▸Nat.le_add_left _ _ have M2:M<2^(24:Ἀ):=hM▸(Nat.add_lt_add_right 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:Ἀ):=Nat.div_le_of_le_mul (Nat.le_trans (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[Nat.cast_pow,nZ]at this have q:=Dense.F.aE _ _ rf pf (R:ℤ) (-(((74+(lq ed)):ℕ):ℤ)) (by rw[rr,pr,ez,Int.cast_natCast]) (by rw[Int.natAbs_cast];exact R2.trans_lt (by decide)) (Int.neg_le_neg (Int.ofNat_le.2 ((J1 he 74).trans (by decide)):((74+(lq ed):ℕ):ℤ)<=((1074:ℕ):ℤ))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,Int.cast_natCast] 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:=Nat.lt_div_mul_add (a:=2^(75:Ἀ)) M0 generalize 2^(75:Ἀ)/M=Q at a1n a2n ⊢ have a1:(Q:ℝ)*M<=2^(75:Ἀ):=by have:=Nat.cast_le (α:=ℝ)|>.2 a1n;rwa[Nat.cast_mul,Nat.cast_pow,nZ]at this have a2:(2:ℝ)^(75:Ἀ)<=Q*M+M:=by have:=Nat.cast_le (α:=ℝ)|>.2 a2n.le;rwa[Nat.cast_add,Nat.cast_mul,Nat.cast_pow,nZ]at this have a3:(M:ℝ)<=2^(24:Ἀ):=by have:=Nat.cast_le (α:=ℝ)|>.2 M2;rwa[Nat.cast_pow,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) (Nat.le_add_left _ _)) ((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:0Nat.sub_ne_zero_of_lt (ε.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',dif_neg (nO1 hk),dif_neg (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',dif_pos (ε.mpr h1),dif_pos (ε.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*Float.ofBits ((971-lb)<<<52)) let v:=vf m let D:=Float.sqrt (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[if_pos 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,dif_neg (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,dif_pos (ε.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>>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) (nW 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,dif_neg (nO1 hk)] |succ k ih=> intro ex t out ho hk;obtain⟨ht,hk',-⟩:=nOs hk rw[nFE.eq_def,dif_pos (ε.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,dif_neg (nO1 hk)] |succ k ih=> intro i out hk;obtain⟨h1,hk',-⟩:=nOs hk rw[Yq,dif_pos (ε.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,UInt64.toNat_ofNat'] rw[γ h,γ (C0 (Nat.div_le_self _ _) (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:=Nat.log2_le_self 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:=Nat.log2_le_self 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:=Nat.log2_le_self 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*Float.ofBits ((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:=Float.sqrt (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 (Nat.succ_le_succ (Nat.log2_le_self _)) (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 lemma nLR_f(n:Ἀ)(eps:Ἃ)(x:(Ἂ Word))(r:Ἀ)(h:¬(4<=n&&n<=2048&&kB eps != 0&&kB eps != 255)=true):(nLR n eps x r).fast=false:=by unfold nLR;rw[if_neg h] 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 (Nat.le_add_left _ _) 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 (Nat.lt_succ_self _) ((Nat.le_succ _).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]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 (Nat.le_add_left _ _) 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 #[] def nRows(rows n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:rows*n<=(O0 x))(hb:rows*n<2^(32:Ἀ)):(k r:Ἀ)->(Xr:ἀ)->(out:(Ἂ Word))->n+2<=(kS Xr)->rows*n<=(O0 out)->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:=nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb) have q:(kS p.1)=(kS Xr):=(nRow_sz n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb)).1 if hs:rows*n<=(O0 p.2) then nRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC hg hd he hx hb k (r+1) p.1 p.2 (q▸hr) hs (nHk3 hk) 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 Nat.lt_succ_of_le (ϝ.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,Array.getElem_map] · show ((a.map (fun (w:Word)=>((w>>>23)&&&255).toUInt8))[t]!).toUInt64=_;rw[AB _ _ (by rw[m0];exact ht),AB a t ht,Array.getElem_map];exact nGEu _ @[inline]def nWF2(k:(Ἂ Word)×(Ἂ Word)):(ἀ×ByteArray)×ἀ:=(nWF k.1,(nWF k.2).1) @[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 nWG2(g b:(Ἂ Word)):(ἀ×ByteArray)×ἀ:=(Dense.F.wcGet3 nK2eq (fun a b=>nK2eq_ok a b) nWS2 32 (g,b) (fun k=>k.1)).1 theorem nWG2_v(g b:(Ἂ Word)):nWG2 g b=nWF2 (g,b):=Dense.F.s5wcGet3_val _ def nRowsS(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(rows r:Ἀ)(out:(Ἂ Word)):(Ἂ Word):= if rnRowsS n eps x g b nd rows r out=Yr (λr=>nLR n eps x r) (nEO n eps x g b nd) n rows r out:=by intro k;induction k with |zero=> intro r out hk;have c:¬r intro r out hk;have c:r>>32).toInt64.toFloat;let L:=ZR (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:(O0 x)=rows*n∧(O0 g)=n∧(O0 b)=n∧rows*n<=4294967295 then if 4<=n&&n<=2048&&kB eps != 0&&kB eps != 255 then if h1:rows=1 then nRow1 n eps x g b nd rm nf ep z0 L hC 0 (Ah (rows*n) 0) h.2.1.ge h.2.2.1.ge (by rw[h.1,h1];omega) (by simp only[Array.size_replicate];rw[h1];omega) (by have:=h.2.2.2;rw[h1]at this;omega) else let W:=nWG2 g b have hW:W=nWF2 (g,b):=nWG2_v g b nRows rows n eps x g b W.1.1 W.2 W.1.2 nd rm nf ep z0 L hC (by simp only[hW,nWF2,(nWF_sp g).1,h.2.1,le_refl]) (by simp only[hW,nWF2,(nWF_sp b).1,h.2.2.1,le_refl]) (by simp only[hW,nWF2,(nWF_sp g).2.2.1,h.2.1,le_refl]) h.1.ge (Nat.lt_succ_of_le h.2.2.2) rows 0 (Dense.F.zPq (n+2)) (Ah (rows*n) 0) (Dense.F.zPs (n+2)).1 (by simp only[Array.size_replicate];exact Nat.le_refl _) (Κ rows) else if x.all finiteWord then nRowsS n eps x g b nd rows 0 (Ah (rows*n) 0) else #[] else Ah (rows*n) 0 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[USize.add_comm,USize.add_sub_cancel] 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,dif_neg (nO1 hk),Yq,dif_neg (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,if_pos hf];simp only[f6,h2,nElOK,if_neg (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 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,dif_neg (nO1 hk),Yq,dif_neg (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,if_pos hf];simp only[f6,h2,nElOK,if_neg (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):=Nat.le_antisymm ht (Nat.sub_eq_zero_iff_le.mp hk) rw[nDR.eq_def,dif_neg (nO1 hk),nS1,dif_neg (nOz hb hk ht)] refine⟨fun j hj=>?_,?_,rfl⟩ · rw[Dense.F.fuS _ _ _ _ _ (U1 hj ((V1 _ 2).trans hr)),if_neg (Nat.ne_of_gt hj)];exact hX j (by rw[q];exact hj) · rw[Dense.F.fuS _ _ _ _ _ (U1 (Nat.lt_succ_of_lt (Nat.lt_succ_self _)) hr),if_pos 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,dif_pos (ε.mpr h1),nS1,dif_pos (by rw[ε,h2,hn];exact O1 h1 _)] simp only[Dense.cC,f6,USize.add_assoc] 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 (Nat.lt_of_le_of_ne (Nat.le_of_lt_succ 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,dif_neg (nO1 hk),nS2,dif_neg (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,dif_pos (ε.mpr h1),nS2,dif_pos (by rw[ε,h2,hn];exact O1 h1 _)] dsimp only;rw[Dense.F.kFU,hX _ h1,f6,h2,USize.add_assoc] 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 (Nat.le_add_left _ _) 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):=USize.toNat_inj.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 (Nat.not_lt_zero _)) 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[USize.add_zero,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 (Nat.le_add_left _ _) 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[USize.add_zero,hlo]at K;exact K · rename_i hf;exact nRowS_e n eps x g b nd r _ _ out (Bool.eq_false_iff.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 (Nat.le_add_left _ _) 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[USize.add_zero,hlo]at K;exact K · rename_i hf;exact nRowS_e n eps x g b nd r _ _ out (Bool.eq_false_iff.mpr hf) · rename_i hc;exact (hc D).elim lemma nRows_eq(rows n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L) (hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:rows*n<=(O0 x))(hb:rows*n<2^(32:Ἀ))(hX:∀j,jkB 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)=ἃ): ∀k (r:Ἀ)(Xr:ἀ)(out:(Ἂ Word))(hr:n+2<=(kS Xr))(ho:rows*n<=(O0 out))(hk:r+k=rows),(O0 out)=rows*n-> nRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC hg hd he hx hb k r Xr out hr ho hk=Yr (λr=>nLR n eps x r) (nEO n eps x g b nd) n rows r out:=by intro k;induction k with |zero=> intro r Xr out hr ho hk hos;rw[Yr,if_neg (by rw[<-hk];exact Nat.lt_irrefl r)];rfl |succ k ih=> intro r Xr out hr ho hk hos have kk:=nHk2 (n:=n) hk rw[Yr,if_pos (hk▸Nat.lt_add_of_pos_right (Nat.succ_pos k))] have E:=nRow_eq n eps x g b Xr gd bd ge nd rm nf ep z0 L hC 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 have S2:(O0 (nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb)).2)=rows*n:=by rw[E,nYq_sz _ _ _ _ _ _ _ rfl,hos] rw[nRows,dif_pos S2.ge] refine (ih (r+1) _ _ _ _ (nHk3 hk) S2).trans ?_ rw[E] 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 (Nat.not_lt_zero _)) rw[USize.add_zero,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 Nat.not_lt.2 (AZ (by decide) G) unfold nRow;dsimp only;rw[if_neg 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:jjkB x[j]! =255-> nRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC 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[nRows];split · rename_i S by_cases c:jsimp only[Rat.cast_div,Rat.cast_mul,Rat.cast_neg,Rat.cast_pow,Rat.cast_natCast,Rat.cast_ofNat]<;>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 (if_pos h).trans (hp h) else (if_neg 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 (if_pos h0).trans (if h1:c1 then (if_pos h1).trans (ha h0 h1) else (if_neg h1).trans hs) else (if_neg 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:=Nat.lt_div_mul_add m simp only[nLo,nLR_th,f6,Conv.aa _ (G.trans B:i<2^(32:Ἀ)),Conv.aa _ ((r.trans_le ((Nat.le_add_left 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] lemma V3L(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)(sx:(O0 x)=e*n)(sg:(O0 g)=n)(sb:(O0 b)=n): Yw2 e n h x g b=layernormStable e n h x g b:=by rw[Yw2];dsimp only;split · rename_i hs;split · rename_i hN;split · rename_i h1;subst h1 have Y:=V3Lo 1 n h x g b m B q H F D rw[Yr,if_pos Nat.zero_lt_one,Κ,Yr,if_neg (Nat.lt_irrefl 1)]at Y refine Eq.trans (nRow1_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only[Array.size_replicate];exact B) (by rw[ϳ,Κ];intro j hj;exact H j (by rw[n4];exact hj)) q hN) ?_ simp only[ϳ,Κ] at Y ⊢;exact Y have G:=nWF_sp g;have Bq:=nWF_sp b;have e1:(nWG2 g b).1=nWF g:=by rw[nWG2_v];rfl have e2:(nWG2 g b).2=(nWF b).1:=by rw[nWG2_v];rfl rw[<-e1] at G;rw[<-e2] at Bq exact (nRows_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ H q (fun t ht=>G.2.1 t (by rw[hs.2.1];exact ht)) (fun t ht=>Bq.2.1 t (by rw[hs.2.2.1];exact ht)) (fun t ht=>G.2.2.2 t (by rw[hs.2.1];exact ht)) hN _ 0 _ _ _ _ _ (by simp only[Array.size_replicate])).trans (V3Lo e n h x g b m B q H F D) · rename_i hN have X:x.all finiteWord=ἃ:=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[if_pos X] exact (nRowsS_e n h x g b _ e (fun r=>nLR_f n h x r hN) _ 0 _ rfl).trans (V3Lo e n h x g b m B q H F D) · rename_i hn;exact absurd ⟨sx,sg,sb,Nat.le_of_lt_succ B⟩ hn lemma V3L_bad(e n:Ἀ)(h:kF)(x g b:(Ἂ Word))(m:0by 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[Yw2];dsimp only;rw[dif_pos ⟨sx,sg,sb,Nat.le_of_lt_succ B⟩];split · split · rename_i h1;subst h1;exact nRow1_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j (by omega) (by omega) hj · exact nRows_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ m _ 0 _ _ _ _ _ j (by omega) j2 hj · simp only[hX,υ,↓reduceIte] @[noinline]def nOEr(x g:(Ἂ Word))(nd:Ἅ)(e:NR.fH)(i j:Ἄ):Ἃ:= let xw:=ck x i;let gw:=ck g j if ZC xw==0 then ZT 0 else if e.ok then NE.el xw gw 0 nd e.nS e.R e.pz e.A1 e.A2 e.C1 (λ_=>ZT (ZA xw*ZA gw/ZA e.td)) else ZT (ZA xw*ZA gw/ZA e.td) @[noinline]def nFBr(x g:(Ἂ Word))(nd:Ἅ)(td:Ἃ)(i j:Ἄ):Ἃ:=if ZC (ck x i)==0 then ZT 0 else nOEr x g nd (NR.eI 1 (0,0,ἄ,0,0,td)) i j lemma nFBr_e(x g:(Ἂ Word))(nd:Ἅ)(td:Ἃ)(i j:Ἄ):nFBr x g nd td i j=nOEr x g nd (NR.eI 1 (0,0,ἄ,0,0,td)) i j:=by unfold nFBr nOEr;dsimp only;split<;>simp only[*,↓reduceIte] def bn(rows n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word)):(Ἂ Word):= if rows>0∧n>0∧(O0 x)=rows*n∧(O0 g)=n∧(O0 b)=n∧rows*n<=4294967295 then if g.all finiteWord&&b.all finiteWord&&finiteWord eps&&(!ZX eps&&ZC eps !=0) then let r:=Yw2 rows n eps x g b if (O0 r)==rows*n 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 lemma cN:bn=layernormSpec:=by funext l n m x g b;rw[bn];split · rename_i h;obtain⟨l0,n0,sx,sg,sb,B⟩:=h;split · rename_i h2 by_cases hX:x.all finiteWord=ἃ · have E:Yw2 l n m x g b=layernormSpec l n m x g b:=by have h:(SN l n m x g&&(O0 b)==n&&b.all finiteWord)=ἃ:=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:(O0 b)=n:=by simpa using h.1.2 exact V3L l n m x g b a (by omega) e c d (λj p=>NR.ic b (by simpa[np]using h.2) j (by exact Nat.lt_of_lt_of_eq p (id (Eq.symm o)))) sz.1.1.1.1.1.1.1.2 sz.1.1.1.1.1.1.2 o dsimp only;rw[E];simp only[ite_self] · have Z:=V3L_bad l n m x g b n0 (by omega) sx sg sb (Bool.eq_false_iff.mpr hX) have N:¬((O0 (#[]:(Ἂ Word)))==l*n)=ἃ:=by simp only[Array.size_empty,AQ];exact Nat.ne_of_lt (Ϯ l0 n0) dsimp only;rw[Z,if_neg N] · rfl · rfl end Norm end def gC(batch m k n:Nat)(A B:Ἂ Word):Ἂ Word:= if batch==1&&A.size==m*k&&B.size==k*n&&decide (0 < n)&&decide (0 < k)&&decide (0 < m)&&A.all (fun w=>(w>>>23)&&&255!=255)&&B.all (fun w=>(w>>>23)&&&255!=255) then Conv.er ⟨k,1,n,m,1,1,1,0⟩ false B A (mB m (0x80000000:Word)) 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 hc simp only [Η,AQ,AJ] at hc obtain ⟨⟨⟨⟨⟨⟨⟨h1,h2⟩,h3⟩,h4⟩,h5⟩,h6⟩,hA⟩,hB⟩:=hc subst h1 have fA:=np.1 hA have fB:=np.1 hB rw [Conv.eu,Conv.s5c1 _ _ _ _ _ rfl rfl rfl rfl Nat.one_pos h4] unfold gemmSpec gemmWith apply mi · simp only [Ϝ,n4] intro q q1 q2 simp only [Ϝ,n4] at q1 have hi:q/n < m:=Ϟ (by rw [Ϗ]; exact q1) have hj:q%n < n:=ϊ _ h4 have e1:q/(m*n)=0:=ώ q1 have e2:q/n%m=q/n:=γ hi have gz:(mB m (0x80000000:Word))[q/n]! = 0x80000000:=by rw [AB _ _ (by simpa using hi)]; simp simp only [Λ,n4,act,υ, ↓reduceIte,gz,e1,e2,ϳ,Κ] refine Dense.F.dz k (fun t=>A[q/n*k+t]!) (fun t=>B[t*n+q%n]!) h5 (fun t ht=>⟨Norm.NR.ic A fA _ ?_,Norm.NR.ic B fB _ ?_⟩) · rw [h2]; calc q/n*k+t < q/n*k+k:=O1 ht _ _=(q/n+1)*k:=by ring _ ≤ m*k:=ι k hi · rw [h3]; calc t*n+q%n < t*n+n:=O1 hj _ _=(t+1)*n:=by ring _ ≤ k*n:=ι n ht · rfl @[inline]def cvOk(s:ExactRuntime.ConvShape):Ἆ:= 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[ExactRuntime.ConvShape.taps,ExactRuntime.ConvShape.cpg,ExactRuntime.ConvShape.depthwise,Nat.div_self hc,n4] have e4:s.depthwise.opg=1:=by simp only[ExactRuntime.ConvShape.opg,ExactRuntime.ConvShape.depthwise,Nat.div_self hc] have e5:s.depthwise.cpg=1:=by simp only[ExactRuntime.ConvShape.cpg,ExactRuntime.ConvShape.depthwise,Nat.div_self hc] simp only[Λ,e3,e4,Nat.div_one] 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)α)(N:Nat):Dense.F.da f N (lQ N)=kK (n:=N) fun q=>f q.val:= Dense.F.iC_h1 f N N _ (by simp) (by simp) (fun i h=>absurd h (by simp)) @[inline]def im2cF(h kh k ho:Nat)(inp:Ἂ Word):Ἂ Word:=Dense.F.da (fun i=>inp[(i%k/kh)*h+i/k+i%k%kh]!) (ho*k) (lQ (ho*k)) theorem im2cF_eq(h kh k ho:Nat)(inp:Ἂ Word):im2cF h kh k ho inp=Cv1.im2c h kh k ho inp:=daE _ _ @[inline]def trnF(rows cols:Nat)(Y:Ἂ Word):Ἂ Word:=Dense.F.da (fun i=>Y[(i%rows)*cols+i/rows]!) (cols*rows) (lQ (cols*rows)) theorem trnF_eq(rows cols:Nat)(Y:Ἂ Word):trnF rows cols Y=Cv1.trn rows cols Y:=daE _ _ @[inline]def im2dF(h kh ho c:Nat)(inp:Ἂ Word):Ἂ Word:=Dense.F.da (fun i=>inp[c*h+i/kh+i%kh]!) (ho*kh) (lQ (ho*kh)) theorem im2dF_eq(h kh ho c:Nat)(inp:Ἂ Word):im2dF h kh ho c inp=Cv1.im2d h kh ho c inp:=daE _ _ def dwRowsF(s:ExactRuntime.ConvShape)(relu:Ἆ)(inp wts b:Ἂ Word)(lin:Nat->Nat->Nat->Ἆ->Ἂ Word->Ἂ Word->Ἂ Word->Ἂ Word):Ἂ Word:= let ho:=s.h+1-s.kh let Ys:=kK (n:=s.cin) fun c=>lin ho s.kh 1 relu (im2dF s.h s.kh ho c.val inp) (kK (n:=s.kh) fun t=>wts[c.val*s.kh+t.val]!) #[b[c.val]!] Dense.F.da (fun i=>(Ys[i/ho]!)[i%ho]!) (s.cin*ho) (lQ (s.cin*ho)) theorem dwRowsF_eq(s:ExactRuntime.ConvShape)(relu:Ἆ)(inp wts b:Ἂ Word)(lin:Nat->Nat->Nat->Ἆ->Ἂ Word->Ἂ Word->Ἂ Word->Ἂ Word): dwRowsF s relu inp wts b lin=Cv1.dwRows s relu inp wts b lin:=by unfold dwRowsF Cv1.dwRows;simp only[im2dF_eq];exact daE _ _ @[inline]def fpOk(s:ExactRuntime.ConvShape):Ἆ:=s.strideH==1&&(s.kh==3&&s.kw==3&&s.padT==1||s.kh==1&&s.kw==1&&s.padT==0) @[inline]def s31(cin H co:Nat):ConvShape:=⟨cin,1,H,co,3,3,1,1⟩ def k33(n:Nat)(K:Ἂ Word):Ἂ Word:=Dense.F.da (fun j=>if j%9/3=1 then K[j/9*3+j%3]! else 0) (n*9) (lQ (n*9)) def sl31(co H:Nat)(O:Ἂ Word):Ἂ Word:=Dense.F.da (fun i=>O[i/(H-2)*H+i%(H-2)+1]!) (co*(H-2)) (lQ (co*(H-2))) @[inline]def c31Ok(s:ExactRuntime.ConvShape)(inp wts b:Ἂ Word):Ἆ:=Cv1.c1Ok s&&s.kh==3&&b.all (· == 0)&&inp.all (fun w=>(w>>>23)&&&255!=255)&&wts.all (fun w=>(w>>>23)&&&255!=255) theorem dE(n:Nat)(D E D' E':Nat→Word) (hD:∀t<3*n,expOf (D t)≠255)(hE:∀t<3*n,expOf (E t)≠255) (hD':∀t<9*n,expOf (D' t)≠255)(hE':∀t<9*n,expOf (E' t)≠255) (h1:∀cif t<9*n then D' t else oneW) (fun t=>if t<9*n then E' t else 0)= dotOf (3*n+1) (fun t=>if t<3*n then D t else oneW) (fun t=>if t<3*n then E t else 0):=by have g1:aG (9*n+1) (fun t=>if t<9*n then D' t else oneW) (fun t=>if t<9*n then E' t else 0):=by intro k hk;by_cases e:k<9*n ·simp only[if_pos e];exact⟨hD' k e,hE' k e⟩ ·simp only[if_neg e];exact⟨by decide,by decide⟩ have g2:aG (3*n+1) (fun t=>if t<3*n then D t else oneW) (fun t=>if t<3*n then E t else 0):=by intro k hk;by_cases e:k<3*n ·simp only[if_pos e];exact⟨hD k e,hE k e⟩ ·simp only[if_neg e];exact⟨by decide,by decide⟩ have z0:tm oneW 0=0:=by simp only[tm,show sv (0:Word)=0 by decide,mul_zero,zero_mul] have tz:∀x:Word,tm x 0=0:=fun x=>by simp only[tm,show sv (0:Word)=0 by decide,mul_zero,zero_mul] have S:∀m,m≤n→∑t∈kP (9*m),tm (if t<9*n then D' t else oneW) (if t<9*n then E' t else 0)= ∑t∈kP (3*m),tm (if t<3*n then D t else oneW) (if t<3*n then E t else 0):=by intro m;induction m with |zero=>intro _;simp |succ m ih=> intro hm rw[show 9*(m+1)=9*m+9 by ring,show 3*(m+1)=3*m+3 by ring,Finset.sum_range_add,Finset.sum_range_add,ih (by omega)] congr 1 have a:∀j<9,9*m+j<9*n:=fun j hj=>by omega have c:∀j<3,3*m+j<3*n:=fun j hj=>by omega simp only[Ν,Finset.sum_range_zero,Ai] simp only[if_pos (a _ (by decide:0<9)),if_pos (a _ (by decide:1<9)),if_pos (a _ (by decide:2<9)),if_pos (a _ (by decide:3<9)),if_pos (a _ (by decide:4<9)), if_pos (a _ (by decide:5<9)),if_pos (a _ (by decide:6<9)),if_pos (a _ (by decide:7<9)),if_pos (a _ (by decide:8<9)), if_pos (c _ (by decide:0<3)),if_pos (c _ (by decide:1<3)),if_pos (c _ (by decide:2<3))] have hm':mif t<9*n then D' t else oneW) (9*n) (by omega),ab (9*n+1) (fun t=>if t<9*n then E' t else (0:Word)) (9*n) (by omega)];simp only[AX,if_false];decide), Dense.F.zrNC _ _ (3*n) 0 (by rw[Κ,ab (3*n+1) (fun t=>if t<3*n then D t else oneW) (3*n) (by omega),ab (3*n+1) (fun t=>if t<3*n then E t else (0:Word)) (3*n) (by omega)];simp only[AX,if_false];decide)] simp theorem fwA(a:Ἂ Word)(h:a.all finiteWord=true)(q:Nat):expOf a[q]!≠255:=by by_cases d:qnp.1 h i hi) q d ·rw[An a q d];decide theorem k33g(n:Nat)(K:Ἂ Word)(j:Nat)(hj:jby by_cases d:qExactRuntime.windowAt s.depthwise inp c p 0 t) (fun t=>wts[c*3+t]!) (fun t=>windowAt (s31 s.cin s.h s.cin) inp 0 (p+1) (c*9+t)) (fun t=>(k33 s.cin wts)[c*9+t]!) (fun t _=>wNf _ _ hi _ _ _ _) (fun t _=>fwA _ hw _) (fun t _=>wOf _ _ hi _ _ _) (fun t _=>k33f _ _ hw _) ?h1 ?h0 ·simpa using key case h1=> intro c' hc' j hj obtain rfl:c'=0:=by omega simp only[A7,Κ] constructor ·rw[oldW _ _ _ _ c p j hj (by omega),newWd s inp hk hkw hw1 hsh hsw hdh hdw hpt hpl hcin c p j hj (by omega)] ·rw[k33g _ _ _ (by omega),if_pos (by omega)];congr 1;omega case h0=> intro c' hc' j hj hj3 obtain rfl:c'=0:=by omega simp only[A7,Κ] rw[k33g _ _ _ (by omega),if_neg (by omega)] theorem newWc(s:ExactRuntime.ConvShape)(inp:Ἂ Word)(hg:s.groups=1)(hk:s.kh=3)(hkw:s.kw=1)(hw1:s.w=1)(hsh:s.strideH=1)(hsw:s.strideW=1) (hdh:s.dilH=1)(hdw:s.dilW=1)(hpt:s.padT=0)(hpl:s.padL=0)(c p j:Nat)(hj:j<3)(hp:p+2by by_cases d:qExactRuntime.windowAt s inp 0 p 0 t) (fun t=>wts[o*(s.cin*3)+t]!) (fun t=>windowAt (s31 s.cin s.h s.cout) inp 0 (p+1) t) (fun t=>(k33 (s.cout*s.cin) wts)[o*(s.cin*9)+t]!) (fun t _=>wNf _ _ hi _ _ _ _) (fun t _=>fwA _ hw _) (fun t _=>wOf _ _ hi _ _ _) (fun t _=>k33f _ _ hw _) ?h1 ?h0 ·simpa[Ϗ 9 s.cin,Ϗ 3 s.cin] using key case h1=> intro c hc' j hj constructor ·rw[show 9*c+3+j=c*9+(3+j) by ring,oldW _ _ _ _ c p j hj (by omega),newWc s inp hg hk hkw hw1 hsh hsw hdh hdw hpt hpl c p j hj (by omega)] ·have l1:o*(s.cin*9)+(9*c+3+j) intro c hc' j hj hj3 have l1:o*(s.cin*9)+(9*c+j) simp only [aGd0, if_true, if_false, Bool.false_eq_true] def aDu (A B:Array Word) (ka kb ea:USize) (a1 b1 a2 b2:Word) (Bm pH pL nH nL:UInt64):UInt64:= 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=> Core.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:UInt64) (t:Nat) (ht:t < n) (pH pL nH nL:UInt64): 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, if_pos ht]; rfl theorem aDle (fa fb:Nat → Word) (n:Nat) (Bm:UInt64) (t:Nat) (ht:¬ t < n) (pH pL nH nL:UInt64): Dense.dl fa fb n Bm t pH pL nH nL=Core.au (pH-nH-(if pL < nL then 1 else 0)) (pL-nL) Bm:=by rw [Dense.dl, if_neg ht] theorem aJgs (fa fb:Nat → Word) (n t:Nat) (ht:t < n) (Bm:UInt64): Dense.jG fa fb n t Bm=Dense.jG fa fb n (t+1) (aJs (fa t) (fb t) Bm):=by rw [Dense.jG, if_pos ht]; rfl theorem aJge (fa fb:Nat → Word) (n t:Nat) (ht:¬ t < n) (Bm:UInt64):Dense.jG fa fb n t Bm=Bm:=by rw [Dense.jG, if_neg ht] theorem aFn (A:Array Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 n=a1:=by simp [fA] theorem aFm (A:Array Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 (n+1)=a2:=by simp [fA] theorem aFl (A:Array 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:Array Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:USize) (hA:A.size < USize.size) (hB:B.size < USize.size) (he:ea.toNat=ao+n) (hb:bo+n < USize.size): ∀ k t (ka kb:USize) 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:=USize.toNat_lt_size 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 [USize.lt_iff_toNat_lt, h1, he]; exact Nat.lt_irrefl _ rw [aJu, dif_neg 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 [USize.lt_iff_toNat_lt, h1, he]; omega rw [aJu, dif_pos h0, aJgs _ _ _ _ (by omega), aGt_eq A ka hA, aGt_eq B kb hB, 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:Array Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:USize) (Bm:UInt64) (hA:A.size < USize.size) (hB:B.size < USize.size) (he:ea.toNat=ao+n) (hb:bo+n < USize.size): ∀ k t (ka kb:USize) 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:=USize.toNat_lt_size 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 [USize.lt_iff_toNat_lt, h1, he]; exact Nat.lt_irrefl _ rw [aDu, dif_neg 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 [USize.lt_iff_toNat_lt, h1, he]; omega rw [aDu, dif_pos h0]; simp only [aDs2_eq]; rw [aDls _ _ _ _ _ (by omega), aGt_eq A ka hA, aGt_eq B kb hB, 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 ad2 (A B:Array 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 (USize.ofNat ao) (USize.ofNat bo) (USize.ofNat (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 (aJu A B (USize.ofNat ao) (USize.ofNat bo) (USize.ofNat (ao+n)) 1023))) 0 0 0 0 else 4294967296 if r < 4294967296 then UInt64.toUInt32 r else dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2) theorem ad2_eq (A B:Array Word) (ao bo n:Nat) (a1 b1 a2 b2:Word): ad2 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 ad2 by_cases h:n+2 < 262144 ∧ A.size ≤ 4294967295 ∧ B.size ≤ 4294967295 ∧ ao+n ≤ 4294967295 ∧ bo+n ≤ 4294967295 · rw [if_pos h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=USize.le_size have hA':A.size < USize.size:=by omega have hB':B.size < USize.size:=by omega have he:(USize.ofNat (ao+n)).toNat=ao+n:=USize.toNat_ofNat_of_lt' (by omega) have h1:(USize.ofNat ao).toNat=ao+0:=USize.toNat_ofNat_of_lt' (by omega) have h2:(USize.ofNat bo).toNat=bo+0:=USize.toNat_ofNat_of_lt' (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 [if_pos h0] at g exact g · rw [if_neg h]; rfl theorem aDok (fa fb:Nat → Word) (N:Nat) (Bm:UInt64) (g:N < 262144) (h:Dense.dl fa fb N Bm 0 0 0 0 0 < 4294967296):dotOf N fa fb=UInt64.toUInt32 (Dense.dl fa fb N Bm 0 0 0 0 0):= Dense.fE fa fb N Bm (by exact Nat.lt_of_succ_le 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:UInt64) (A B:Array 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 (USize.ofNat ao) (USize.ofNat bo) (USize.ofNat (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 g)) 0 0 0 0 else 4294967296 if r < 4294967296 then UInt64.toUInt32 r else ad2 A B ao bo n a1 b1 a2 b2 theorem ad4_eq (g:UInt64) (A B:Array 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 [if_pos h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=USize.le_size have hA':A.size < USize.size:=by omega have hB':B.size < USize.size:=by omega have he:(USize.ofNat (ao+n)).toNat=ao+n:=USize.toNat_ofNat_of_lt' (by omega) have h1:(USize.ofNat ao).toNat=ao+0:=USize.toNat_ofNat_of_lt' (by omega) have h2:(USize.ofNat bo).toNat=bo+0:=USize.toNat_ofNat_of_lt' (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 ad2_eq A B ao bo n a1 b1 a2 b2 · rw [if_neg h]; exact ad2_eq A B ao bo n a1 b1 a2 b2 def gMn (A:Array Word) (k e:USize) (m:UInt64):UInt64:= if h:k < e then gMn A (k+1) e (let a:=aGt A k; if a &&& 0x7FFFFFFF==0 then m else min m (Core.iW a)) else m termination_by e.toNat-k.toNat decreasing_by exact aUd h @[noinline] def gG (inW H:Nat) (x wih:Array Word):UInt64:= gMn x 0 x.usize 511+gMn wih (USize.ofNat (2*H*inW)) (USize.ofNat (3*H*inW)) 511 abbrev AdFn:=Ἂ Word → Ἂ Word → Nat → Nat → Nat → Word → Word → Word → Word → Word @[inline] def aKd {n:Nat} (f:Fin n → Word):Ἂ Word:=Dense.F.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 [Dense.F.iC]; congr 1; funext q; exact dif_pos q.isLt @[inline] def xh1 (inW H:Nat) (x h:Ἂ Word) (t:Nat):Ἂ Word := aKd (n:=inW+H+1) fun j => if j.val < inW then x[t*inW+j.val]! else if j.val < inW+H then h[j.val-inW]! 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 (Float32.ofBits a * Float32.ofBits 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 [Bool.and_eq_true, bne_iff_ne, ne_eq] 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 (Float32.ofBits a) (Float32.ofBits 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) × Array Word × Array Word × Array Word):Array 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) × Array Word × Array Word × Array Word):Bool := a.1 == b.1 && Dense.F.wcAeq a.2.1 b.2.1 && Dense.F.wcAeq a.2.2.1 b.2.2.1 && Dense.F.wcAeq a.2.2.2 b.2.2.2 theorem wcEq_ok (a b:(Nat × Nat × Nat) × Array Word × Array Word × Array Word) (h:wcEq a b=true):a=b:=by obtain ⟨a1,a2,a3,a4⟩:=a; obtain ⟨b1,b2,b3,b4⟩:=b simp only [wcEq, Bool.and_eq_true, beq_iff_eq] at h obtain ⟨⟨⟨h1,h2⟩,h3⟩,h4⟩:=h rw [h1, Dense.F.wcAeq_ok h2, Dense.F.wcAeq_ok h3, Dense.F.wcAeq_ok h4] @[noinline] def wcS:ST.Ref Unit (Array (Dense.F.WcE wcF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wcG (G inW H:Nat) (wih whh bih:Array Word):Array Word := (Dense.F.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:Array Word):wcG G inW H wih whh bih=wcat G inW H wih whh bih:= Dense.F.s5wcGet3_val _ @[inline] def lstmTail (ad:AdFn) (sig tanh:Word → Word) (H:Nat) (pre cs:Ἂ Word) : Ἂ Word × Ἂ Word := let cell:=aKd (n:=H) fun u => ad #[] #[] 0 0 0 (sig pre[H+u.val]!) (cs[u.val]!) (sig pre[u.val]!) (tanh pre[2*H+u.val]!) let hidden:=aKd (n:=H) fun u => mulN (sig pre[3*H+u.val]!) (tanh (cell[u.val]!)) (hidden,cell) @[inline] def lstmStep (lin:LinFn) (ad:AdFn) (sig tanh:Word → Word) (inW H:Nat) (x Wc bhh:Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word := lstmTail ad 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) (ad:AdFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := recurWith T H (lstmStep lin ad sig tanh inW H x (wcG 4 inW H wih whh bih) bhh) (mB H 0,mB H 0) @[inline] def gruTail (ad adc:AdFn) (tanh:Word → Word) (inW H:Nat) (x wih bih:Ἂ Word) (t:Nat) (h r z hn:Ἂ Word):Ἂ Word := let n:=aKd (n:=H) fun u=>tanh <| adc x wih (t*inW) ((2*H+u.val)*inW) inW oneW bih[2*H+u.val]! hn[u.val]! r[u.val]! aKd (n:=H) fun u=>ad n oneA u.val 0 1 n[u.val]! (negW z[u.val]!) h[u.val]! z[u.val]! @[inline] def gruStep (lin:LinFn) (ad adc:AdFn) (sig tanh:Word → Word) (inW H:Nat) (x wih bih bhh Wrz Whn bhn:Ἂ Word) (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 (gruTail ad adc tanh inW H x wih bih t st.1 (aKd (n:=H) fun u=>sig a[u.val]!) (aKd (n:=H) fun u=>sig a[H+u.val]!) (lin 1 H H false st.1 Whn bhn),st.2) @[specialize] def gruK (lin:LinFn) (ad:AdFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := let g:=gG inW H x wih recurWith T H (gruStep lin ad (ad4 g) sig tanh inW H x wih bih bhh (wcG 2 inW H wih whh bih) (wsub H whh) (bsub H bhh)) (mB H 0, #[]) 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] theorem pre_eq (G inW H:Nat) (x wih whh bih bhh h:Ἂ Word) (t:Nat) : 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 [υ,if_false] unfold gateWith apply dotOf_congr (by omega) · intro j hj by_cases hj1:j < inW+H+1 · rw [if_pos hj1,xh1,aKd_eq,gofn _ _ hj1] · rw [if_neg hj1] have:¬ j < inW:=by omega have:¬ j < inW+H:=by omega simp only [*, if_false] · intro j hj by_cases hj1:j < inW+H+1 · rw [if_pos 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 [Ϗ,Nat.mul_add_div hp,ώ hj1,ϑ] have e2:(i*(inW+H+1)+j)%(inW+H+1)=j:=by rw [Ϗ,Nat.mul_add_mod,γ hj1] simp only [e1,e2] by_cases a1:j < inW · simp only [a1,if_true] · by_cases a2:j < inW+H · simp only [a1,a2,if_true,if_false] · have:j=inW+H:=by omega simp only [a1,a2,this,if_true,if_false] · rw [if_neg hj1] have:¬ j < inW:=by omega have:¬ j < inW+H:=by omega have:j≠inW+H:=by omega simp only [*, if_false] 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 [υ,if_false] 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 [if_pos hj1,if_pos hj1,wsub,aKd_eq,gofn _ _ hq] congr 1; ring · rw [if_neg hj1,if_neg hj1,bsub,aKd_eq,gofn _ _ hi] section variable (ad:AdFn) (had : ∀ A B ao bo n a1 b1 a2 b2, ad A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2)) include had theorem cell_eq (sig tanh:Word → Word) (H:Nat) (P cs:Ἂ Word) : (Array.ofFn (n:=H) fun u => ad #[] #[] 0 0 0 (sig P[H+u.val]!) (cs[u.val]!) (sig P[u.val]!) (tanh P[2*H+u.val]!)) = Array.ofFn (n:=H) fun u => dotOf 2 (fun j=>if j=0 then sig P[H+u.val]! else sig P[u.val]!) (fun j=>if j=0 then cs[u.val]! else tanh P[2*H+u.val]!):=by congr 1; funext u; rw [had] apply dotOf_congr rfl <;> intro j hj <;> simp [fA] theorem lstmStep_eq (sig tanh:Word → Word) (inW H:Nat) (x wih whh bih bhh:Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word) : lstmStep linearSpec ad 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 lstmTail simp -zeta only [aKd_eq] rw [pre_eq,cell_eq ad had] simp only [mulN_eq] rfl theorem cand_eq (tanh:Word → Word) (inW H:Nat) (x wih bih:Ἂ Word) (t:Nat) (R HN:Ἂ Word) : (Array.ofFn (n:=H) fun u=>tanh <| ad x wih (t*inW) ((2*H+u.val)*inW) inW oneW bih[2*H+u.val]! HN[u.val]! R[u.val]!) = Array.ofFn (n:=H) fun u=>tanh <| dotOf (inW+2) (fun j=>if j < inW then x[t*inW+j]! else if j=inW then oneW else HN[u.val]!) (fun j=>if j < inW then wih[(2*H+u.val)*inW+j]! else if j=inW then bih[2*H+u.val]! else R[u.val]!):=by congr 1; funext u; rw [had]; rfl theorem upd_eq (H:Nat) (N Z h:Ἂ Word) : (kK (n:=H) fun u=>ad N oneA u.val 0 1 N[u.val]! (negW Z[u.val]!) h[u.val]! Z[u.val]!) = Array.ofFn (n:=H) fun u=>dotOf 3 (fun j=>if j=2 then h[u.val]! else N[u.val]!) (fun j=>if j=0 then oneW else if j=1 then negW Z[u.val]! else Z[u.val]!):=by congr 1; funext u; rw [had] apply dotOf_congr rfl · intro j hj match j,hj with | 0,_=>simp [fA] | 1,_=>simp [fA] | 2,_=>simp [fA] · intro j hj match j,hj with | 0,_=>simp [fA,oneA] | 1,_=>simp [fA] | 2,_=>simp [fA] theorem gruStep_eq (adc:AdFn) (hadc:∀ A B ao bo n a1 b1 a2 b2, adc A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2)) (sig tanh:Word → Word) (inW H:Nat) (x wih whh bih bhh:Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word) : gruStep linearSpec ad adc sig tanh inW H x wih bih bhh (wcat 2 inW H wih whh bih) (wsub H whh) (bsub H bhh) t st=gruStepWith dotOf sig tanh inW H x wih whh bih bhh t st:=by unfold gruStep gruTail simp -zeta only [aKd_eq] rw [pre_eq,hn_eq] have hr:(kK (n:=H) fun u => sig (kK (n:=2*H) fun k=>gateWith dotOf inW H x wih whh bih bhh st.1 t k.val)[u.val]!) = kK (n:=H) fun u=>sig (gateWith dotOf inW H x wih whh bih bhh st.1 t u.val):=by congr 1; funext u; rw [gofn _ _ (by omega)] have hz:(kK (n:=H) fun u => sig (kK (n:=2*H) fun k=>gateWith dotOf inW H x wih whh bih bhh st.1 t k.val)[H+u.val]!) = kK (n:=H) fun u=>sig (gateWith dotOf inW H x wih whh bih bhh st.1 t (H+u.val)):=by congr 1; funext u; rw [gofn _ _ (by omega)] simp only [hr,hz,cand_eq adc hadc,upd_eq ad had] rfl theorem lstmK_eq (lin:LinFn) (hl:lin=linearSpec) (sig tanh:Word → Word) : lstmK lin ad sig tanh=lstmWith dotOf sig tanh:=by subst hl funext T inW H x wih whh bih bhh unfold lstmK lstmWith rw [wcG_v] have hs:lstmStep linearSpec ad sig tanh inW H x (wcat 4 inW H wih whh bih) bhh = lstmStepWith dotOf sig tanh inW H x wih whh bih bhh:=by funext t st; exact lstmStep_eq ad had sig tanh inW H x wih whh bih bhh t st rw [hs] theorem gruK_eq (lin:LinFn) (hl:lin=linearSpec) (sig tanh:Word → Word) : gruK lin ad sig tanh=gruWith dotOf sig tanh:=by subst hl funext T inW H x wih whh bih bhh unfold gruK gruWith dsimp only rw [wcG_v] have hs:gruStep linearSpec ad (ad4 (gG inW H x wih)) sig tanh inW H x wih bih bhh (wcat 2 inW H wih whh bih) (wsub H whh) (bsub H bhh)=gruStepWith dotOf sig tanh inW H x wih whh bih bhh:=by funext t st; exact gruStep_eq ad had (ad4 (gG inW H x wih)) (ad4_eq (gG inW H x wih)) sig tanh inW H x wih whh bih bhh t st rw [hs] end theorem lstmK_spec (sig tanh:Word → Word):lstmK linearSpec ad2 sig tanh=lstmWith dotOf sig tanh := lstmK_eq ad2 ad2_eq _ rfl sig tanh theorem gruK_spec (sig tanh:Word → Word):gruK linearSpec ad2 sig tanh=gruWith dotOf sig tanh := gruK_eq ad2 ad2_eq _ rfl sig tanh end Rnn namespace NX open ExactRuntime theorem pkF1 (q:Nat) (hq:q < 2^26) : ((2*q+1)*2^36+274877906943+(2*q+1)*2^36/2^39%2)/2^39=(q+2)/4:=by have h4:=ϛ q 4 generalize q/4=a at h4 have hr:=ϊ q (by decide:4 > 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,Nat.mod_mul,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 [nK,Ϫ,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:=Nat.le_of_lt_succ (Ϟ (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:=Nat.le_of_lt_succ (Ϟ (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 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=ExactRuntime.roundRational 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:=Norm.nOK_dec _ _ hk; exact ⟨this.1,this.2.1⟩ rw [pk2_nW _ hE.1 hE.2] exact Norm.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:ℕ):=SAct.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⟩:=Dense.F.mV (I0 1) 1 rfl (by norm_num) have hdiv:=SAct.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:ℕ):=SAct.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 (Dense.F.dw w)∧Dense.F.rv (Dense.F.dw w)=(ExactRuntime.rationalWord w:ℝ)*2^(149:ℕ):=by obtain ⟨f,v⟩:=Dense.F.cI w h refine ⟨f,?_⟩ rw [v,Norm.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 (Dense.F.dw w)| := by obtain ⟨-, v⟩:=Dense.F.cI w h rw [v,Ae,AW (by positivity:(0:ℝ) < 2^(kG w))] have hm:=mant_ne w h0 have:(1:ℝ) ≤ |(ExactRuntime.sv w:ℝ)| := by unfold ExactRuntime.sv; split_ifs <;> simp <;> exact_mod_cast Nat.one_le_iff_ne_zero.mpr hm calc (1:ℝ)=1*1:=by ring _ ≤ |(ExactRuntime.sv 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:=Dense.F.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 (Dense.F.dw xw*(Dense.F.dw gw*((I0 1).toInt64.toFloat/Dense.F.dw td))) ∧ SAct.Rel (Dense.F.rv (Dense.F.dw xw*(Dense.F.dw gw*((I0 1).toInt64.toFloat/Dense.F.dw td)))) (((ExactRuntime.rationalWord xw*ExactRuntime.rationalWord gw/ExactRuntime.rationalWord 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:=Norm.nXb xw hx have Gb:=Norm.nXb gw hg have Dlo:=Norm.nDb td hd have Dhi:=Norm.nXb td hd.2.1 have ex:=mO xw have eg:=mO gw set X:=Dense.F.rv (Dense.F.dw xw) with hXd set G:=Dense.F.rv (Dense.F.dw gw) with hGd set Dd:=Dense.F.rv (Dense.F.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]; nlinarith 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 (Dense.F.dw td) fD D0 iD1 iD2 set R:=Dense.F.rv ((I0 1).toInt64.toFloat/Dense.F.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:ℕ):=SAct.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:ℕ):=SAct.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:ℕ):=SAct.inv2le (by norm_num) _=1*(1/2^(194:ℕ)):=by ring _ ≤ |G| * |R| := mul_le_mul G1 hR2 (by positivity) (Aa _) obtain ⟨fp,rp⟩:=relMul (Dense.F.dw gw) _ fG fr GRu GRl set Pp:=Dense.F.rv (Dense.F.dw gw*((I0 1).toInt64.toFloat/Dense.F.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 (Dense.F.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))=(((ExactRuntime.rationalWord xw*ExactRuntime.rationalWord gw/ExactRuntime.rationalWord td:ℚ):ℝ)*2^(149:ℕ)):=by have hD0:(ExactRuntime.rationalWord 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 ?_ have:(1:ℝ)/2^(52:ℕ)*4 ≤ 1/2^(50:ℕ):=by norm_num nlinarith [e0,e1] theorem zt0:ExactRuntime.roundRational 0=0:=by decide theorem za0 (w:Word) (h0:w<<<1=0):ExactRuntime.rationalWord w=0:=by rw [Norm.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 [if_pos ee,e2]; simp only [nr] at *; omega unfold ExactRuntime.sv; rw [hm]; simp theorem nFBr_val (x g:Ἂ Word) (nd:Ἅ) (td:Word) (i j:Ἄ) (hnd:nd=(I0 1).toInt64.toFloat) (hx:kB (Norm.ck x i)≠255) (hg:kB (Norm.ck g j)≠255) : Norm.nFBr x g nd td i j=ExactRuntime.roundRational (ExactRuntime.rationalWord (Norm.ck x i)*ExactRuntime.rationalWord (Norm.ck g j)/ExactRuntime.rationalWord td):=by rw [Norm.nFBr_e]; unfold Norm.nOEr; dsimp only have p:(ExactRuntime.rationalWord (Norm.ck x i)-0)*ExactRuntime.rationalWord (Norm.ck g j)/ExactRuntime.rationalWord td + ExactRuntime.rationalWord 0=ExactRuntime.rationalWord (Norm.ck x i)*ExactRuntime.rationalWord (Norm.ck g j)/ExactRuntime.rationalWord td:=by rw [Norm.Y1 0,(by decide:ExactRuntime.sv 0=0)]; simp refine Norm.YP_h1 _ _ _ (fun t => ?_) (fun y => ?_) · rw [Norm.Y1 (Norm.ck x i),(Norm.YN _).2 (of_decide_eq_true ((Norm.YK _).symm.trans t))]; simp · subst hnd have etd:(Norm.NR.eI 1 (0,0,false,0,0,td)).td=td:=by first | rfl | simp [Norm.NR.eI] exact (Norm.NE.jn _ _ 0 td _ 1 0 0 0 0 false _ 0 rfl hx hg (by decide) one_pos y (by simp) (by rw [etd]; exact (congrArg ExactRuntime.roundRational p).symm)).trans (congrArg ExactRuntime.roundRational p) @[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*(Dense.F.dw gw*ri)).toBits if okF B 1047=true then pk2 B else Norm.nFBr x g nd td t t theorem elR (x g:Ἂ Word) (nd:Ἅ) (td:Word) (t:Ἄ) (xw gw:Word) (hxw:Norm.ck x t=xw) (hgw:Norm.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 (Dense.F.dw xw) ((I0 1).toInt64.toFloat/Dense.F.dw td) t = ExactRuntime.roundRational (ExactRuntime.rationalWord xw*ExactRuntime.rationalWord gw/ExactRuntime.rationalWord 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) · rw [nFBr_val x g nd td t t hnd (hxw ▸ hx) (hgw ▸ hg),hxw,hgw] 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 [Array.uset,Array.getElem_set] 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:=Dense.F.dw w let e:=Norm.nfe w qR x (Xr.uset t v (U1 ht hr)) (t+1) n hx (by rw [Dense.F.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 Norm.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 Dense.F.dw x[j]! else Xr.data[j]!) ∧ (qR x Xr t n hx hr q Dl).q=Norm.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 → (Norm.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:=Norm.nO1 hk rw [qR.eq_def,dif_neg hnt,Norm.nQs.eq_def,dif_neg hnt] refine ⟨rfl,fun j hj => ?_,rfl,AP,fun j h1 h2=>by omega⟩ rw [if_neg (by omega)] | succ k ih => intro t Xr hr q Dl hk ht obtain ⟨h1,hk',ht'⟩:=Norm.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,dif_pos htn,Norm.nQs.eq_def,dif_pos htn] simp only [Dense.cC,Norm.f6] obtain ⟨a1,a2,a3,a4,a5⟩:=ih (t+1) (Xr.uset t (Dense.F.dw x[t.toNat]!) hrt) (by rw [Dense.F.uZ]; exact hr) (q+Dense.F.dw x[t.toNat]! * Dense.F.dw x[t.toNat]!) (if Dl < Norm.nfe x[t.toNat]! then Norm.nfe x[t.toNat]! else Dl) hk' ht' refine ⟨by rw [a1,Dense.F.uZ],fun j hj => ?_,a3,?_,fun j hj1 hj2 => ?_⟩ · rw [a2 j (by rw [Dense.F.uZ]; exact hj),Dense.F.fuS _ _ _ _ _ hj,e1] by_cases hjt:t.toNat=j · subst hjt; rw [if_neg (by omega),if_pos rfl,if_pos ⟨AP,h1⟩] · simp only [hjt,if_false] by_cases hc:t.toNat ≤ j∧j < n.toNat · rw [if_pos (by omega),if_pos hc] · rw [if_neg (by omega),if_neg 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 (UInt64.not_lt.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 Norm.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 Norm.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 → Norm.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 (USize.ofNat j) else out[j]!):=by intro k; induction k with | zero => intro t out ho hk ht have hnt:¬ t < nn:=Norm.nO1 hk rw [eR.eq_def,dif_neg hnt] exact BA ⟨rfl,fun j h1 h2=>by omega,fun j hj=>by rw [if_neg (by omega)]⟩ | succ k ih => intro t out ho hk ht obtain ⟨h1,hk',ht'⟩:=Norm.nOs hk have htn:t < nn:=ε.mpr h1 have e1:(t+1).toNat=t.toNat+1:=Dense.ac htn rw [eR.eq_def,dif_pos 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 [if_neg (by omega),if_pos rfl,if_pos ⟨AP,h1⟩,ugetF] congr 1; exact USize.ofNat_toNat.symm · simp only [hjt,if_false] by_cases hc:t.toNat ≤ j∧j < nn.toNat · rw [if_pos (by omega),if_pos hc] · rw [if_neg (by omega),if_neg hc] · exact pZ rfl theorem usz (n:Nat) (h:n < 2^32):n < kX:=by rw [nT]; rcases System.Platform.numBits_eq 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 ≤ (Dense.F.zPq n).size:=by have q2:(n.toUSize).toNat=n:=Dense.aa (usz n (by omega)) rw [q2]; exact ⟨hx,(Dense.F.zPs n).1⟩ 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 (Dense.F.zPq 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:=(Float.sqrt (Qr.q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat+Dense.F.dw eps*Norm.nS201)).toBits if Norm.nOKs BD (Core.ai (n+4).toUInt64+4) then let td:=Norm.nWs 26 BD if 0 < (kB td).toUInt64&&(kB td).toUInt64 ≤ 170 && !ExactRuntime.signOf td then eR x g one td Qr.a (one/Dense.F.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 [Array.size_replicate,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]! = Dense.F.dw x[j]!) (htd:td=mK (ExactRuntime.rowVariance n x 0 0+ExactRuntime.rationalWord eps)) (hd:0 < (kB td).toNat∧kB td≠255∧k9 td=false) (hd2:(kB td).toNat ≤ 170) (he1:ExactRuntime.finiteWord eps=true) (hepos:0 < ExactRuntime.rationalWord eps) (hsz:(eR x g (I0 1).toInt64.toFloat td xb ((I0 1).toInt64.toFloat/Dense.F.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/Dense.F.dw td) 0 nn hx hg hr (mB n 0) ho=ExactRuntime.rmsnormSpec 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,(Norm.nfe w).toNat=(kB w).toNat:=fun w=>by unfold Norm.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 ExactRuntime.finiteWord; simpa using this · have:=hG i (by omega); rw [AB g i hi] at this unfold ExactRuntime.finiteWord; simpa using this rw [ExactRuntime.rmsnormSpec,ExactRuntime.rmsnormWith,if_pos hdom] apply mi · rw [E1]; simp [ExactRuntime.rmsnormStable] · 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 [if_pos ⟨ϟ _,by rw [hnn]; exact hj⟩,AB _ j h1] at e3 rw [e3] simp only [ExactRuntime.rmsnormStable,Λ] rw [hxb j hj] have hck : ∀ a:Ἂ Word,Norm.ck a (USize.ofNat j)=a[j]! := fun a=>by rw [Norm.f6,USize.toNat_ofNat_of_lt' (usz j (by omega))] rw [elR x g _ td (USize.ofNat 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 < ExactRuntime.sv eps∧0 < ExactRuntime.rationalWord eps:=by have hm:0 < kM eps:=by unfold kM; rw [if_neg he0]; positivity have hs:0 < ExactRuntime.sv eps:=by unfold ExactRuntime.sv; rw [hes]; simp; exact_mod_cast hm refine ⟨hs,?_⟩ rw [Norm.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=ExactRuntime.rmsnormSpec 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 (Dense.F.zPq 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 [if_pos hdl] at hsz split <;> rename_i hok · rw [if_pos hok] at hsz split <;> rename_i htd · rw [if_pos 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:(Norm.nfe x[j]!).toNat=(kB x[j]!).toNat:=by unfold Norm.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 (Dense.F.zPq 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]! = Dense.F.dw x[j]! := fun j hj=>by rw [Q2 j (AN hj (Dense.F.zPs n).1),if_pos ⟨ϟ _,by rw [q2]; exact hj⟩] have hok':=hok rw [Q3,Norm.kO0,Norm.kQ52 n (by omega),Norm.kZ4 (n+4) (by omega)] at hok' have hcert:=Norm.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':Norm.nWs 26 (Float.sqrt ((qR x (Dense.F.zPq 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 + Dense.F.dw eps*Norm.nS201)).toBits = mK (ExactRuntime.rowVariance n x 0 0+ExactRuntime.rationalWord eps):=by rw [Q3,Norm.kO0,Norm.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 (Norm.nWs 26 (Float.sqrt ((qR x (Dense.F.zPq 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 + Dense.F.dw eps*Norm.nS201)).toBits)≠255:=fun h=>by rw [h] at hd2; simp at hd2 simp only [Norm.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 ExactRuntime.finiteWord; simpa using he1) hep hsz · rw [if_neg htd] at hsz; simp at hsz; omega · rw [if_neg hok] at hsz; simp at hsz; omega · rw [if_neg hdl] at hsz; simp at hsz; omega theorem rms_eq:rms=ExactRuntime.rmsnormSpec:=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 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 [Norm.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 [if_pos (ez0 w h0),e2]; simp only [nr] at *; omega unfold ExactRuntime.sv; rw [hm]; simp theorem nfeL (w:Word) (h:Norm.nfe w < 255):expOf w≠255:=by intro c have e:Norm.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:=Norm.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 [Norm.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,dif_pos hi] at hc dsimp only at hc split at hc · rename_i hw have hs:(i+1).toNat=i.toNat+1:=Norm.uS (by have:=e.toNat_lt_size; omega) by_cases hj:j=i.toNat · subst hj; rw [Norm.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,Nat.cast_add,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) : Norm.nEO n h x g b (I0 n).toInt64.toFloat (Norm.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:=Nat.lt_div_mul_add m dsimp only [Norm.nEO,Norm.nLoN] have hs:=Norm.nSv h q simp only [Norm.nLo,Norm.nLR_th,Norm.f6,Conv.aa _ (Nat.lt_trans hj2 hb:i < 2^(32:ℕ)), Conv.aa _ (U1 r (Nat.le_trans (Nat.le_add_left n _) (Nat.le_of_lt hb)):i%n < 2^(32:ℕ)), Norm.gP,Norm.gN _ _ _ _ m q hb] obtain ⟨v,A, -⟩:=Norm.Vn n h x (i/n) m q refine Norm.nV3 _ _ _ (Norm.nV2 _ _ _ (fun E3 => ?_) (fun E3 => ?_)) (fun E1 E2 => ?_) · rw [← v, ← A]; generalize Norm.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 ‹_› (Norm.V3L_h1 _ _ _ _ _ v) rfl · rw [← v, ← A] · rw [Norm.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) (Nat.lt_div_mul_add 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 (Ἂ (Dense.F.WcE cbF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def cbG (b:Ἂ Word):Ἂ Word := (Dense.F.wcGet3 Dense.F.wcAeq (fun a c h=>Dense.F.wcAeq_ok h) cbS 32 b (fun k=>k)).1 theorem cbG_v (b:Ἂ Word):cbG b=cbF b:=Dense.F.s5wcGet3_val _ 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),Array.getElem_map,AB b j (by omega)] @[inline] def cRow (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:Norm.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:=Norm.ck x lo if (Norm.nfe w0 < 255&&cQ x w0 lo hi)=true then (Xr,Norm.Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb lo lo hi out) else Norm.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:Norm.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 (Norm.nYq_sz _ _ _ _ _ _ _ rfl)⟩ · exact Norm.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:Norm.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:=Norm.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 (Norm.nHk3 hk) else #[] theorem cRow_eq (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (rm nf ep z0:Ἅ) (L:ἆ) (hC:Norm.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]! = Dense.F.dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = Dense.F.dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=Norm.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 = Norm.Yq (Norm.nEO n eps x g b (I0 n).toInt64.toFloat) (Norm.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 · rename_i hc 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⟩:=Norm.ju0 (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) out (by rw [q3]; exact ho) hos obtain ⟨a2,b2⟩:=Norm.ju0 (Norm.nEO n eps x g b (I0 n).toInt64.toFloat) (Norm.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:ℕ):=Nat.lt_trans hk.2 hb have hsub:G0 k-G0 (r*n)=G0 (k%n):=by apply USize.toNat_inj.1 rw [USize.toNat_sub_of_le _ _ (by rw [USize.le_iff_toNat_le,q1,Conv.aa _ k32]; exact hk.1),q1,Conv.aa _ k32, Conv.aa _ (C0 (Ay k n) k32),km] rw [hsub,Norm.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 · exact Norm.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:Norm.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 · rename_i hc exfalso 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) · exact Norm.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:Norm.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]! = Dense.F.dw g[t]!) (hB : ∀ t,t < n → bd.data[t]! = Dense.F.dw b[t]!) (hE : ∀ t,t < n → (ge.data[t]!).toUInt64=Norm.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 = Norm.Yr (fun r=>Norm.nLR n eps x r) (Norm.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 [Norm.Yr,if_neg (by rw [← hk]; exact Nat.lt_irrefl r)]; rfl | succ k ih => intro r Xr out hr ho hk hos have kk:=Norm.nHk2 (n:=n) hk rw [Norm.Yr,if_pos (hk ▸ Nat.lt_add_of_pos_right (Nat.succ_pos 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,Norm.nYq_sz _ _ _ _ _ _ _ rfl,hos] rw [cRows,dif_pos S2.ge] refine (ih (r+1) _ _ _ _ (Norm.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:Norm.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:=Norm.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 [Array.size_empty] at S; omega · exact ih (r+1) _ _ _ _ (Norm.nHk3 hk) j (by rw [Ϡ,n4]; omega) j2 hj · rfl def Yw3 (rows n:ℕ) (eps:Word) (x g b:Ἂ Word):Ἂ Word := let nd:=(I0 n).toInt64.toFloat let lg:=Core.ai (I0 n) let rm:=(((1:ἆ)<<<(52+lg))/I0 n).toInt64.toFloat*Float.ofBits ((971-lg)<<<52) let nf:=(((1:ἆ)<<<52)/I0 n).toInt64.toFloat let ep:=Dense.F.dw eps*Norm.nS201; let z0:=(eps.toUInt64>>>32).toInt64.toFloat let L:=Core.ai (I0 (n+4))+1 have hC:Norm.nCK n eps rm nf ep z0 L:=⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (Norm.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 if h1:rows=1 then Norm.nRow1 n eps x g b nd rm nf ep z0 L hC 0 (mB (rows*n) 0) h.2.1.ge h.2.2.1.ge (by rw [h.1,h1]; omega) (by simp only [Array.size_replicate]; rw [h1]; omega) (by have:=h.2.2.2; rw [h1] at this; omega) else let W:=Norm.nWG2 g b have hW:W=Norm.nWF2 (g,b):=Norm.nWG2_v g b cRows rows n eps x g b W.1.1 W.2 W.1.2 nd rm nf ep z0 L hC (cbG b) (by simp only [hW,Norm.nWF2,(Norm.nWF_sp g).1,h.2.1,le_refl]) (by simp only [hW,Norm.nWF2,(Norm.nWF_sp b).1,h.2.2.1,le_refl]) (by simp only [hW,Norm.nWF2,(Norm.nWF_sp g).2.2.1,h.2.1,le_refl]) h.1.ge (Nat.lt_succ_of_le h.2.2.2) rows 0 (Dense.F.zPq (n+2)) (mB (rows*n) 0) (Dense.F.zPs (n+2)).1 (by simp only [Array.size_replicate]; exact Nat.le_refl _) (Κ rows) else if x.all finiteWord then Norm.nRowsS n eps x g b nd rows 0 (mB (rows*n) 0) else #[] else mB (rows*n) 0 theorem V3L3 (e n:ℕ) (h:Word) (x g b:Ἂ Word) (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=layernormStable e n h x g b:=by rw [Yw3]; dsimp only; split · rename_i hs; split · rename_i hN; split · rename_i h1; subst h1 have Y:=Norm.V3Lo 1 n h x g b m B q H F D rw [Norm.Yr,if_pos Nat.zero_lt_one,Κ,Norm.Yr,if_neg (Nat.lt_irrefl 1)] at Y refine Eq.trans (Norm.nRow1_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only [Array.size_replicate]; exact B) (by rw [ϳ,Κ]; intro j hj; exact H j (by rw [n4]; exact hj)) q hN) ?_ simp only [ϳ,Κ] at Y ⊢; exact Y · have G:=Norm.nWF_sp g; have Bq:=Norm.nWF_sp b have e1:(Norm.nWG2 g b).1=Norm.nWF g:=by rw [Norm.nWG2_v]; rfl have e2:(Norm.nWG2 g b).2=(Norm.nWF b).1:=by rw [Norm.nWG2_v]; rfl rw [← e1] at G; rw [← e2] at Bq exact (cRows_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ H q (fun t ht=>G.2.1 t (by rw [hs.2.1]; exact ht)) (fun t ht=>Bq.2.1 t (by rw [hs.2.2.1]; exact ht)) (fun t ht=>G.2.2.2 t (by rw [hs.2.1]; exact ht)) hN F D (cbG_sp b n sb) _ 0 _ _ _ _ _ (by simp only [Array.size_replicate])).trans (Norm.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 [if_pos X] exact (Norm.nRowsS_e n h x g b _ e (fun r=>Norm.nLR_f n h x r hN) _ 0 _ rfl).trans (Norm.V3Lo e n h x g b m B q H F D) · rename_i hn; exact absurd ⟨sx,sg,sb,Nat.le_of_lt_succ B⟩ hn theorem V3L3_bad (e n:ℕ) (h:Word) (x g b:Ἂ Word) (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 = #[]:=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 [dif_pos ⟨sx,sg,sb,Nat.le_of_lt_succ B⟩]; split · split · rename_i h1; subst h1; exact Norm.nRow1_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j (by omega) (by omega) hj · exact cRows_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ m _ 0 _ _ _ _ _ j (by omega) j2 hj · simp only [hX,υ, ↓reduceIte] theorem Yw3_eq (l n:ℕ) (m:Word) (x g b:Ἂ Word) (l0:0 < l) (n0:0 < n) (sx:x.size=l*n) (sg:g.size=n) (sb:b.size=n) (B:l*n ≤ 4294967295) (h2:(g.all finiteWord&&b.all finiteWord&&finiteWord m&&(!signOf m&&Core.mW m != 0))=true) : Yw3 l n m x g b=Norm.Yw2 l n m x g b:=by by_cases hX:x.all finiteWord=true · have h:(Norm.SN l n m x g&&b.size==n&&b.all finiteWord)=true:=by simp only [Η] at h2 rw [Norm.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⟩ rw [Norm.fG] at h; simp only [Η] at h obtain ⟨a,e,c,d⟩:=Norm.jm h.1.1 have D : ∀ j,j < n → expOf b[j]! ≠ 255:=fun j p => Norm.NR.ic b (by simpa [np] using h.2) j (by omega) rw [V3L3 l n m x g b a (by omega) e c d D sx sg sb,Norm.V3L l n m x g b a (by omega) e c d D sx sg sb] · have hX':x.all finiteWord=false:=Bool.eq_false_iff.mpr hX rw [V3L3_bad l n m x g b n0 (by omega) sx sg sb hX',Norm.V3L_bad l n m x g b n0 (by omega) sx sg sb hX'] 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 if (g.all finiteWord&&b.all finiteWord&&finiteWord eps&&(!signOf eps&&Core.mW eps != 0))=true then let r:=Yw3 rows n eps x 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 rw [← Norm.cN] unfold bnC Norm.bn by_cases h:l > 0∧n > 0∧x.size=l*n∧g.size=n∧b.size=n∧l*n ≤ 4294967295 · rw [if_pos h,if_pos h] by_cases h2:(g.all finiteWord&&b.all finiteWord&&finiteWord m&&(!signOf m&&Core.mW m != 0))=true · rw [if_pos h2,if_pos h2]; obtain ⟨l0,n0,sx,sg,sb,B⟩:=h dsimp only; rw [Yw3_eq l n m x g b l0 n0 sx sg sb B h2] · rw [if_neg h2,if_neg h2] · rw [if_neg h,if_neg h] end NXc def kernels:Kernels:= { Pinned.kernels with dense:=⟨Dense.c7,gC⟩ conv:=⟨cvK,dwK,Pinned.kernels.conv.convTranspose⟩ elem:=⟨apK,mpK,Bn.cq,Bn.br⟩ rnn:=⟨Rnn.lstmK Dense.c7 Rnn.ad2 SAct.sg SAct.th,Rnn.gruK Dense.c7 Rnn.ad2 SAct.sg SAct.th⟩ norm:=⟨NX.rms,NXc.bnC⟩ } theorem dwK_eq:dwK=ExactRuntime.depthwiseSpec:=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;rw[Conv.cY];exact d31_eq s relu inp wts b h ·split ·rename_i h;rw[dwRowsF_eq,Dense.eD];exact Cv1.lin_dw1 s h relu inp wts b ·simp only[Pinned.kernels,Pinned.dotFn_eq_dotOf];rfl theorem apK_eq:apK=ExactRuntime.avgpoolSpec:=by funext s inp;unfold apK;split ·rename_i h;rw[Conv.eV,apB s h] ·simp only[Pinned.kernels,Pinned.dotFn_eq_dotOf];rfl theorem mpK_eq:mpK=ExactRuntime.maxpoolSpec:=by funext s inp;unfold mpK;split ·rename_i h;rw[Conv.fo,mpB s h] ·simp only[Pinned.kernels,Pinned.maxpoolW_eq] theorem correct:Obligation kernels:=by have h:=Pinned.correct simp only[Obligation,Pinned.kernels]at h simp only[Obligation,kernels,Pinned.kernels,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,Pinned.dotFn_eq_dotOf,Rnn.lstmK_spec,Rnn.gruK_spec] rw[←h] simp only[specAttn,specRnn,scoresSpec,mixSpec,softmaxSpec,siluSpec,lstmSpec,gruSpec,Pinned.dotFn_eq_dotOf,Pinned.maxpoolW_eq] all_goals rfl end Submission