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 open Nat renaming le_of_lt_succ->J2,le_add_left->K2,le_trans->U2,le_of_ble_eq_true->N2,sub_eq_zero_iff_le->K3,not_lt->W3,add_lt_add_right->X3,add_le_add->Y3,mul_le_mul_left->U3,cast_nonneg->M3,le_of_eq->B3,lt_succ_self->I3,sub_add_cancel->L3,le_mul_of_pos_right->J4,sub_le->K4,sub_add_eq->V4,le_of_not_lt->W4,le_of_lt->X4,lt_succ_of_le->Z4,cast_mul->Y4,sub_lt_left_of_lt_add->G4,le_of_sub_eq_zero->O4,sub_le_sub_right->P4,add_sub_cancel'->M4,lt_of_le_of_ne->N4,lt_irrefl->B4,le_antisymm->C4,cast_pow->I4,lt_trans->K5,cast_add->W5,le_of_succ_le->X5,sub_succ_lt_self->Z5,le_sub_of_add_le->G5,not_lt_zero->U5,lt_add_of_pos_right->P5,cast_le->R5,sub_lt_sub_left->C5,div_one->F5,div_le_self->L5,lt_succ_of_lt->K6,lt_of_lt_of_eq->V6,pair->X6,lt_succ_iff_lt_or_eq->Z6,add_lt_add_of_lt_of_le->P6,ofNat_nonneg->R6,lt_of_succ_lt->B6,strong_induction_on->C6,add_lt_add->E6,ne_of_gt->L6,cast_succ->X7,lt_or_ge->Z7,mul_add_mod->O7,min_le_left->P7,sub_add_comm->R7,mul_lt_mul_of_pos_left->M7,add_lt_add_of_le_of_lt->N7,eq_of_mul_eq_mul_right->B7,le_succ->E7,sub_sub->F7,lt_of_succ_le->I7,zero_lt_of_lt->L7,add_left_cancel->J8,mul_add_div->W8,sub_ne_zero_of_lt->Z8,lt_of_not_le->O8,mod_eq_sub_mod->P8,ne_of_lt->R8,sub_le_of_le_add->M8,add_right_cancel->N8 open Real renaming sqrt->O2 open USize renaming toNat_ofNat_of_lt'->J3,ofNat->C3,toNat_inj->O5,le_iff_toNat_le->U8 open ExactRuntime renaming rationalWord->V3,ConvShape->L4,windowAt->U6,roundRational->C7,sv->L8,PoolShape->Q9,depthwiseSpec->J9 open Array renaming size_replicate->O3 open UInt64 renaming toUInt32->N3,toNat_ofNat'->O6 open Int renaming ofNat_le->U4,cast_natCast->M5,natCast_nonneg->W6,toNat->F6,natAbs->I6,add_le_add_right->T8 open ExactRuntime.ConvShape renaming depthwise->J5,cpg->T6 open Float renaming ofBits->N5,sqrt->W7 open Finset renaming Ico->B5,abs_sum_le_sum_abs->K8,sum_range_zero->X8,sum_nonneg->D8 open Bool renaming and_eq_true_iff->I5,eq_false_iff->F8 open Model renaming modelSignBit->J6,unpackedToReal_finite->N6,ofModelBits->C8 open Float.Model.UnpackedFloat renaming normalize->G6 open Float.Model renaming pack->M6 open Rat renaming cast_mul->J7,cast_ofNat->G7,cast_natCast->T7,cast_zpow->S8 open Int64 renaming toInt->K7 open UInt32 renaming le_iff_toNat_le->V7 open Pinned renaming kernels->U7 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,G5 (by rw[Τ];exact (J1 ((by decide):23<=25) j).trans h),(K2 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:=⟨(F6 (-(e+149)-1)),by omega,by omega⟩ exact⟨a,v,by (clear * - v y;omega),(R7 ((V1 j 2).trans y)).symm,y.trans (E7 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) (E7 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 _ (G5 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 (V6 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:=B3 (Κ _) have hb:0+(A.map (kT (fmt:=lU))).size<=(B.map (kT (fmt:=lU))).size:=B3 ((Κ _).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 (V6 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:ἆ):ἇ:= (N3 (if n<8388608 then 0 else n-8388608)) @[inline]def az(sign:Ἆ)(product scale:ἆ):ἇ:= if product==0 then if sign then 0x80000000 else 0 else let leading:=ai product let position:=leading+scale if position<172 then let fraction:= if scale<149 then aW product (149-scale)else product<<<(scale-149) if fraction==0 then(if sign then 0x80000000 else 0) else if fraction==8388608 then c9 sign 1 0 else c9 sign 0 (N3 fraction) else let roundedMantissa:= if leading<23 then product<<<(23-leading)else aW product (leading-23) let carry:=roundedMantissa==16777216 let normalizedPosition:=if carry then position+1 else position if normalizedPosition>425 then(if sign then 0xff800000 else 0x7f800000) else let normalizedMantissa:=if carry then 8388608 else roundedMantissa c9 sign (N3 (normalizedPosition-171)) (d0 normalizedMantissa) open Model.NativeBinary32 in lemma bo(n k:Ἀ)(h:n>>>k≠0):(Aq n)=k+(Aq (n>>>k)):=by rw[β]at h⊢;have e:=(mc (϶ k)).1 (ϰ h);have d:=(ϸ (϶ k)).1 (ϙ (n:=n/2^k));rw[mz (λz=>h (by rw[z,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 ((Α ((K4 _ _).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:ἆ):(N3 x)=lA (lq x):=(by rfl) lemma c5(n:ἆ):d0 n=lA ((lq n)-8388608):=by rw[d0];split<;>rename_i h<;>rw[μ]at h<;>rw[bY] .rw[show (lq n)-8388608=0 by simp at h;omega];rfl .rw[χ _ _ (by rw[θ];simp at h⊢;exact l7 h)];rfl open Model.NativeBinary32 in lemma bE(g:Ἆ)(d e:ἆ): az g d e=roundProduct g d e:=by unfold az roundProduct;simp only[aA,eP,c5,bY];rw[show(1:ἇ)=lA 1 from rfl,show(0:ἇ)=lA 0 from rfl];simp only[eJ,FloatLib.Numerics.FixedWord.log2Word_eq_log2] open Model.NativeBinary32 in lemma bD(w:ἇ):kW (ofUInt32 w)=w:=by have h:=toUInt32_ofUInt32 w;unfold ps at h;unfold kW;conv_rhs=>rw[<-h] exact Β.mp (γ (BitVec.isLt _)) open Model.NativeBinary32 in lemma aJ(g:Ἆ)(m d:ἆ)(h:(lq d)<=506): az g m d=kW (kE lU ⟨g,(lq m),((lq d):Ἁ)-298⟩):=by rw[bE,roundProduct_eq_roundDyadic _ _ _ h,show kE lU ⟨g,(lq m),((lq d):Ἁ)-298⟩=ofUInt32 (roundDyadic ⟨g,(lq m),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):(I6 ((e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456))=(18446744073709551616-e)*18446744073709551616/\(e:Ἁ)*18446744073709551616<340282366920938463463374607431768211456:=by have k:(e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456=-(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by rw[Y4,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):(I6 ((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[W5,Y4,pO (J2 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 (K2 _ _) 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:ἇ):(N3 (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/\ (N3 (au d e B))= kW (kE lU (nb (aw d e) (((lq B):Ἁ)-298))):=by obtain⟨m,o⟩:=fk d e;rw[au]at h⊢;by_cases t:(d==0&&e==0)=ἃ · rw[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:Ἀ):=O8 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)):=W3.1 fun x=>l (AQ.2 (ξ.1 (r.trans (ώ x)))) rw[toUInt32_toUInt64];exact eN _ _ _ 64 _ (i7 _ _) g (by decide) (dq_h2 _ _ u) lemma aY(n:Ἀ)(e g:Ἀ->kF)(l m B:ἆ) (j:aG n e g)(d:af n e g=aw l m*2^(lq B)) (h:au l m B<4294967296):ms n e g=(N3 (au l m B)):=by have⟨q,r,p⟩:=dq l m B h;have o:af n e g≠0:=d▸mul_ne_zero q (by positivity) rw[bT n e g j o,p];refine mf _ _ _ _ o ?_;rw[toRat_ofIntDyadic,d];push_cast;rw[Ac AL,AA];field_simp @[inline]def ar(N:ἆ):ἆ:=(N+(0x3FFFFFFFFF:ἆ)+((N>>>39)&&&1))>>>39 noncomputable def a8(lb v B:ἆ):ἆ:= let m:=aF v v let L:=ai m let E:=L+B-172 if m-lb<0x8000000000000000-lb/\E<253 then((v>>>63)<<<31)+((E<<<23)+ar (m<<<(62-L))) else 4294967296 noncomputable def bP(hi lo B:ἆ):ἆ:= let r:=if hi=(0:ἆ)-(lo>>>63)then a8 1 lo B else 4294967296 if r=4294967296 then au hi lo B else r lemma gA(n:Ἆ)(e f:ἇ): (mJ (c9 n e f))=(if n then 2^(31:Ἀ) else 0)+(mJ e)%2^(8:Ἀ)*2^(23:Ἀ)+(mJ f)%2^(23:Ἀ):=by have j:=ϊ (mJ e) ((by positivity):0<2^(8:Ἀ));have d:(mJ ((e&&&255)<<<23|||(f&&&8388607)))=2^(23:Ἀ)*((mJ e)%2^(8:Ἀ))+(mJ f)%2^(23:Ἀ):=by rw[nK,(by rw[ϴ,Ξ,show(mJ (255:ἇ))=2^(8:Ἀ)-1 from ἅ,ζ,ο,Ϗ];exact γ (by simp only [kN,kH,nr];omega):(mJ ((e&&&255)<<<23))=2^(23:Ἀ)*((mJ e)%2^(8:Ἀ))),Ξ,show(mJ (8388607:ἇ))=2^(23:Ἀ)-1 from ἅ,ζ,<-Ϥ (ϊ (mJ f) ((by positivity):0<2^(23:Ἀ)))] rw[c9,UInt32.or_assoc];cases n .simp only[υ,ἂ,UInt32.zero_or,d];clear*-;ring simp only[ἁ,nK,d];rw[show(mJ (0x80000000:ἇ))=2^(31:Ἀ)*1 from ἅ,<-Ϥ (by clear*-j;omega)];clear*-;ring lemma bM_h1_h1(k r G:Ἀ)(x M:ἆ)(y:(lq x)=62+G+k)(w:110<=G)(v:G<363)(j:k<2)(m:8388608<=(lq M))(q:(lq M)<2^(24:Ἀ))(h:k*2^(23:Ἀ)+(lq M)=r):(mJ (N3 (x-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 M))%2^(23:Ἀ)=(G-110)*2^(23:Ἀ)+r:=by obtain⟨d,rfl⟩:=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 (N3 ((if (R==16777216)=ἃ then 62+g+1 else 62+g)-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 (if (R==16777216)=ἃ then 8388608 else R)))%2^(23:Ἀ)=((lq g)-110)*2^(23:Ἀ)+(lq R):=by have H:=bM_h1_h1 have y:(lq (62+g))=62+(lq g):=(η 62 g).trans (γ ((O1 v 62).trans (by decide):62+(lq g)<2^(64:Ἀ))) split .rename_i c;have:R=16777216:=by simpa using c subst this;exact H 1 _ _ _ _ (by rw[η,y];exact γ ((X3 (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) ((P6 (X3 s _) (J2 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:=⟨(X3 p _).trans (by decide),(P6 (X3 p _) (J2 (ϊ _ ((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 ((B3 ἅ).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 (E7 _),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 Z7 S 172 with h|h · rw[γ (O1 h _:18446744073709551444+S<18446744073709551616)]at q;exact absurd ((V1 _ _).trans_lt q) (by decide) · have e:18446744073709551444+S=(S-172)+18446744073709551616:=by rw[show (18446744073709551616:Ἀ)=18446744073709551444+172 from ἅ,Nat.add_left_comm,L3 h] have s1:S-172<18446744073709551616:=G4 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:Ἀ):=(Y3 (ι (2^(23:Ἀ)) (P4 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 _ (J2 A)).trans (congrArg (·-62) (Τ _ _)) rw[u2];exact⟨Nat.sub_le_iff_le_add.2 (((by decide):62<=172).trans (y.trans_eq (Τ _ _))),ἅ,G5 y,(P4 (J2 k) 62).trans_lt (by decide),(K2 _ _).trans (k.le.trans ((by decide):425<=506)),(K4 _ _).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:Ἀ)) (P4 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 (J2 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⟨(K2 _ _).trans_eq E.symm,E.trans_lt H⟩ have o:(lq m)≠0:=L6 (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 _ (E6 A B.toNat_lt) q refine⟨j.1,j.2,dZ_h6 _ _ y A,J2 ((K2 _ _).trans_lt k),?_⟩;have D:(lq (62-L))=62-l:=by rw[χ _ _ (by rw[θ,r];exact J2 A),r]<;>rfl have z:(lq m)*2^(62-l)<2^(63:Ἀ):=AN (ϐ g (϶ _)) (by rw[<-AF];exact Θ (by decide) (B3 (by rw[lO,M4 (J2 A)])));have w:(lq (m<<<(62-L)))=(lq m)*2^(62-l):=by rw[ψ,D,ο,γ (AO (K4 _ _) (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,M4 (J2 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),(M4 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,F7]:(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 I7 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[P8 k,γ (G4 k (E6 hL hb)),γ ((I3 _).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:Ἀ):=O8 λh=>c (by rw[P8 h,γ (G4 h (E6 hL hb))];exact G4 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,L3 (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 (K4 _ _) (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=(N3 (dl d g n B t r u o p)):=by intro k;induction k<;>intro t r u o p hk ht S I G J j .obtain rfl:t=n:=C4 ht (K3.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,γ ((Y3 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 (Y3 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 _▸Y3 G l) ?_ j;rw[D,J,q,A,W5 _ T];ring have q:=V r u I;refine e (t+1) _ _ o p y X x (by rw[q];exact Ο t _▸Y3 I l) (G.trans m) ?_ j;rw[D,J,q,A,W5 _ T];ring @[inline]def gf(n:Ἀ)(fa fb:Ἀ->Ἃ):Ἃ:= let r:=if n<262144 then dl fa fb n (jG fa fb n 0 1023) 0 0 0 0 0 else 4294967296 if r<4294967296 then (N3 r)else dotOf n fa fb lemma bO(n:Ἀ)(d e:Ἀ->kF):gf n d e=ms n d e:=by unfold gf;dsimp only;by_cases g:n<262144 .rw[AD g];split .exact(fE d e n _ (by exact I7 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:(I6 (K7 i))<2^(53:Ἀ)):fv i.toFloat/\rv i.toFloat=(K7 i):=by have g:kI i.toFloat.toModel=kE kC (kR (K7 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 (K7 i) 0).toReal=(K7 i):=by rw[<-ϖ,nD];simp have⟨j,l⟩:=lL kC (by decide) (kR (K7 i) 0) (I6 (K7 i)) 0 (by simp[kR]) e (by simp[kR];decide) (by rw[d];exact AZ (((by rw[<-mI,Ϲ];exact_mod_cast e.le:|((K7 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 (T8 (T8 (U4.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[Y4,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 (J4 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₂ (·*·) (N6 l o g v) (N6 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 X5 g);have d:(⟨ἄ,1,((k+1:Ἀ):Ἁ)⟩:kU).toReal=(2:ℝ)^(k+1):=by rw[bJ];simp only[υ,Am,pJ,one_mul];exact AA 2 (k+1) have:=jJ (F.pw k) (F.pw k) f f _ (by rw[d,v,A4];ring) ((by decide):(1:Ἀ)<2^(53:Ἀ)) ((by exact 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:(I6 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:ἇ):(I6 (sv w))<2^(24:Ἀ):=by have:=lB w;rw[sv];split<;>simp<;>exact I7 this lemma bL(a b c:Ἀ)(e:a+b<=c)(h:c<=971)(z:Ἁ)(g:(I6 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:(K7 u.toInt64)=n:=by rw[show (K7 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:=(K4 _ _).trans (h.le.trans (by decide)) lemma qV_h2(x c:Ἀ)(h:x<256):1+(x-c)<=971:=(J1 ((K4 _ _).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)/\(I6 σ)=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):(K7 (-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 ((M7 hK (by decide)).trans_le (by decide)),(by decide:(-1074:Ἁ)<=0).trans (M3 _),(J1 ((K4 _ _).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:(I6 (((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 (Y3 ((K4 _ _).trans h.le) ((K4 _ _).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:(I6 (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:Ἀ):=⟨(X3 (ϐ t (by decide)) _).trans_le (by decide),(P6 (X3 (ϐ t (by decide)) _) (J2 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:Ἀ):=⟨(X3 (ϊ _ (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 (Y3 l l) (by decide))];exact U2 (Y3 l l) (by decide))),η,hb,γ (C0 (Y3 l l) (by decide))] at q' rw[η,η,hb,pS,γ (C0 (L1 l 1) (by decide)),ha,γ (U1 (P6 (q'.trans_le (K4 _ _)) (L1 l 1)) (by decide))] at e rw[<-e];exact⟨K2 _ _,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 (X3 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:=Ϟ ((X3 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,γ ((Y3 (ι (2^(31:Ἀ)) (J2 q)) (Y3 (ι (2^(23:Ἀ)) ((K2 e 1195).trans_lt o).le) (J1 (J2 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),(X3 (((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/\(N3 (ak S h))=md T (-298) false:=by unfold ak at hc⊢ dsimp only at hc⊢ split at hc swap exact absurd hc (by decide) rename_i o rw[AD o] simp only[Η,AJ]at o obtain⟨⟨⟨c1,c2⟩,c3⟩,c4⟩:=o have y:(lq (F.eF S.toBits))<2048:=(fq S).1 have v:=(fq S).2 obtain⟨d1,d2,e1,e2,X,Y,I,J⟩:=j3 h _ _ hh y v c1 c2 c3 (rb _ c4) have D:=g0 _ e1 have x:=dV _ hS (λh0=>by simp[h0]at e1) have O:(if(S.toBits>>>63!=0)=true then 2^(31:Ἀ) else 0)=(lq S.toBits)/2^(63:Ἀ)*2^(31:Ἀ):=by clear*- simp only[AM,Ak,<-ξ,ν,kA,kH,β,ϋ,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(U5 _ (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(P4 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:=⟨G5 e1,(P4 e2 1085).trans_lt (by decide),(P4 (P4 e2 1085) 110).trans (by decide)⟩ obtain⟨b1,b2,b3,b4,K,z,b7,b9⟩:=ce_h1 _ _ v I J have hq:(g+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=(ϭ (L1 (Nat.le_sub_one_of_lt v) _)).trans (by decide) have U:=Α (b2.trans (by decide)) have n3:=Α (b4.trans (by decide)) obtain⟨F,-,-⟩:=bM E _ e5 (b1.trans_eq U.symm) (U.trans_lt b2) (b5.trans_eq d.symm) (d.trans_lt b6) obtain⟨w3,-,-⟩:=bM E _ e5 (b3.trans_eq n3.symm) (n3.trans_lt b4) (b5.trans_eq d.symm) (d.trans_lt b6) obtain⟨w,t3,k1,k3⟩:=j4 g G as v X Y I J rw[jx _ b7 w,k1,d]at F rw[jx _ b9 t3,k3,d]at w3 generalize(g+2^(28:Ἀ))/2^(29:Ἀ)=q,l-1085-110=k at F w3 D hq al generalize hR:az E (lh ((g+2^(52:Ἀ)-G)*2^(10:Ἀ))) e5=R at F have r:az E (lh ((g+2^(52:Ἀ)+G)*2^(10:Ἀ))) e5=R:=by apply Β.mp;rw[F,w3] have qv:(N3 (((S.toBits>>>63)<<<31)+(((S.toBits&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000))=R:=by apply Β.mp;rw[F,Ϫ,D,γ];exact N7 (by split<;>decide) ((Y3 (ι (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,I4,nZ,<-AA] rw[<-AK AL,show (((lq h):Ἀ):Ἁ)=(((lq h)+1075-l:Ἀ):Ἁ)+((l:Ἁ)-1075) by rw[pO d1,W5,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[Y4,I4,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[W5,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[W5] linear_combination AE B q.le rw[pO K] linear_combination AE w q.le @[specialize]def ao(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ):Ἅ:= if tἉ)(e:Ἁ)(B:ℝ)(g:∀tintro _;simpa using d |succ t h=> intro j;rw[Ν,<-add_assoc];push_cast;linarith only [Ag ((e:ℝ)+∑s∈kP t,(z s:ℝ)) (z t),h (by exact X5 j),g t j,h,j,g] structure A8 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ 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,V4,l,BK],r.trans_le (N1 l),λe=>(K6 e).trans_eq r.symm,λh e=>r.trans_le (N4 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 R8 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 (I4 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 (X3 (fq v).2 _) (by (clear * -;omega)) lemma jz(x y:Ἅ)(r:fv x)(t:fv y)(q:fv (x+y))(E:Ἁ)(l:-1074<=E)(u:E<=971) (h:|rv (x+y)|<(2:ℝ)^E):|rv x+rv y|<(2:ℝ)^E:=by have p:=gV x y r t;have v:=mH (kI x.toModel) (kI y.toModel) (by decide) (by rw[fv]at q;rwa[<-p]);unfold rv at h;rw[p,v]at h have m:|(2:ℝ)^E|<=(2:ℝ)^(971:Ἁ):=by rw[AW (by positivity)];exact AG (by norm_num) u have a:(⟨ἄ,1,E⟩:kU).toReal=2^E:=by simp only[bJ,υ,ἂ,pJ,one_mul] have b:(⟨ἃ,1,E⟩:kU).toReal=-2^E:=by simp only[bJ,ἁ,pJ,one_mul,neg_mul] have g:=rx _ (by norm_num) l (a▸m);have e:=rx ⟨ἃ,1,E⟩ (by norm_num) l (by rw[b,BE];exact m);rw[a]at g;rw[b]at e;have w:=abs_lt.1 h exact abs_lt.2 ⟨not_le.1 λd=>(w.1.trans_le ((lM kC d).trans_eq e)).false,not_le.1 λd=>((g.symm.trans_le (lM kC d)).trans_lt w.2).false⟩ @[specialize]def sT(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ)(m:ἆ):Ἅ×ἆ:= if trename_i h<;>rw[μ]at h<;>omega lemma jg(p:Ἀ->Ἅ)(n:Ἀ):∀k t a m,n-t=k->(lq m)<=(lq (sT p n t a m).2):=by intro k;induction k<;>intro t a m h<;>rw[sT];rw[AC (by omega)];rename_i d;rw[AD (N1 h)];dsimp only;have:=d (t+1) (a+p t) (if mἍ)(z:Ἀ->Ἁ)(u:Ἁ)(n K:Ἀ)(x:1<=K)(y:K<=1993) (E:∀tt<=n->fv a-> |rv a-((u:ℝ)+∑s∈kP t,(z s:ℝ))|<=t*(2:ℝ)^((K:Ἁ)-1076)-> (lq (sT p n t a M).2)<=K-> fv (sT p n t a M).1/\ |rv (sT p n t a M).1-((u:ℝ)+∑s∈kP n,(z s:ℝ))|<=n*(2:ℝ)^((K:Ἁ)-1076):=by intro m;induction m with |zero=>intro t a M D Q e o g;obtain rfl:t=n:=C4 Q (K3.1 D);rw[sT,AC (AX _)];exact⟨e,o⟩ |succ m G=> intro t a M D Q e o g;have d:tlinarith only[H,I,J,L,N] lemma cw(n:Ἀ)(d e:Ἀ->kF)(g:aG n d e)(S:Ἅ)(m:fv S)(h:ἆ) (q:(lq h)<2^(63:Ἀ))(o:|rv S-(af n d e:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (l:|(af n d e:ℝ)|<=(2:ℝ)^(425:Ἁ))(p:ak S h<4294967296): (N3 (ak S h))=ms n d e:=by have⟨j,r⟩:=ce S m h q _ o l p;rw[r,bT n d e g j] def aO(A:Ἂ Ἃ)(i:Ἄ)(m:ἇ):ἇ:= if h:i>>23)&&&255 aO A (i+1) (if m (mJ m)<=(mJ (aO A i m))/\∀q,(J0 i)<=q->q<(O0 A)->(mJ (kB A[q]!))<=(mJ (aO A i m)):=by intro k;induction k with |zero=>intro i m l;have c:=not_lt.2 (O4 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 P4 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:=W3.2 (K3.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:=C4 S (K3.1 O) rw[bC,AC (AX _)] exact⟨o,j⟩ |succ m y=> intro t a O S o j have h:tἍ)(bpf:Unit->Ἅ)(aB:Unit->Ἃ):Ἃ:= let r:=sT p n 0 (bpf ()) 0 let c:=if 1<=(lq r.2)/\(lq r.2)<=1993/\1076<=(lq r.2)+L then ak r.1 (I0 ((lq r.2)+L-1076))else 4294967296 if c<4294967296 then act relu (N3 c)else aB () theorem kRV(w:ἇ)(A:Ἀ)(hw:w.toNat=2^(31:Ἀ)+A)(hA:A<255*2^(23:Ἀ)):reluW w=0:=by have a3:A<2^(31:Ἀ):=hA.trans (by decide) have h1:(w&&&0x80000000!=0)=true:=by rw[AM,Ak,<-Β,Ξ];change ¬w.toNat&&&2^(31:Ἀ)=0 rw[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 (R8 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 (K6 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[W5,I4,nZ,zpow_ofNat];exact le_add_of_nonneg_left (M3 _) have k6:(0:ℝ)<(2:ℝ)^(H:Ἁ):=zpow_pos two_pos _ have s1:rv S<=-((2:ℝ)^(H:Ἁ)*2):=by rw[r,neg_mul,<-zpow_add_one₀ AL];exact neg_le_neg (k1.trans (AE k3 (zpow_nonneg zero_le_two _))) exact Int.cast_lt_zero.1 ((neg_le_sub_iff_le_add.1 (A3.1 o).1).trans_lt (lt_neg_iff_add_neg.1 (s1.trans_lt (neg_lt_neg (lt_mul_of_one_lt_right k6 one_lt_two))))) theorem kTF0(relu:Ἆ)(n:Ἀ)(d e:Ἀ->kF)(g:aG n d e)(S:Ἅ)(m:fv S)(h:ἆ)(q:(lq h)<2^(63:Ἀ)) (o:|rv S-(af n d e:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (c:(relu&&(S.toBits>>>63!=0)&&h+1024<=eF S.toBits)=true):(0:Ἃ)=p8 relu (ms n d e):=by simp only[Η,AJ] at c obtain⟨⟨r,c1⟩,c2⟩:=c have t:=kNg S m h q _ o c1 c2 rw[r,bT n d e g (by (clear * - t;omega))];exact (kRN _ t).symm theorem kEB(E:Ἀ)(m:E<2048)(l:(2^(64:Ἀ)-1195+E)%2^(64:Ἀ)<253):1195<=E∧E-1085-110<253:=by omega theorem kAkN(S:Ἅ)(h:ἆ)(e:ak S h<4294967296)(c1:(S.toBits>>>63!=0)=true):p8 true (N3 (ak S h))=0:=by unfold p8;rw[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:Ἀ):=J2 ((ϸ (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:Ἀ):=ι _ (J2 E2) (clear * - E2 r;omega) @[inline]def tf(relu:Ἆ)(S:Ἅ)(hh:ἆ)(sl:Unit->Ἃ):Ἃ:= if relu&&(S.toBits>>>63!=0)&&hh+1024<=eF S.toBits then 0 else let c:=ak S hh if c<4294967296 then act relu (N3 c)else sl () @[inline]def tw(relu:Ἆ)(S:Ἅ)(hh:ἆ)(L n:Ἀ)(p:Ἀ->Ἅ)(bpf:Unit->Ἅ) (aB:Unit->Ἃ):Ἃ:=tf relu S hh λ_=>tS relu L n p bpf aB @[inline]def hG(e:Ἃ)(ix ib L:Ἀ):Ἆ×ἆ:= let p:=48+ix+max ((mJ e)-1) 55 (decide (e<255/\p+L<=425),(I0 (max p ib+2*L-54))) @[inline]def tG(relu:Ἆ)(S:Ἅ)(e:Ἃ)(ix ib L:Ἀ)(sl fb:Unit->Ἃ):Ἃ:= let h:=hG e ix ib L if h.1 then tf relu S h.2 sl else fb () theorem mA11 (x:ℕ):x&&&2047=x%2048:=ζ x 11 theorem 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 (N3 (ak S h))≠255:=by unfold ak at e ⊢; unfold F.eF at e ⊢; dsimp only at e ⊢ generalize S.toBits=b at e ⊢ split at e · rename_i c; rw [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 (K4 _ _).trans_lt ((Y3 J D).trans_lt (by decide)),U4.2 ((Τ L P).trans_le J)⟩ lemma jE_h2(K L:Ἀ)(y:K<=1993)(D:L<=27):K+L-1076<2^(63:Ἀ):=(K4 _ _).trans_lt ((Y3 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((E7 _).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,X8,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(M8 (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 (W3.2 (O4 j))];exact mi ((C4 g (O4 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 ((V4 _ _ _).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=>(U5 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 N8 h);simp only[nC,ab (i+1) (λt=>if t< i then d t else ld) i (by exact lt_add_one i),ab (i+1) (λt=>if t< i then e t else 0x80000000) i (by exact lt_add_one i),AX,Am];rfl |succ c g=>intro i h;rw[nC,g (i+1) (by (clear * - h;omega)),nC,ab (n+1) (λt=>if tif tkF)(h:0if tif tby split;exacts[(g t ‹_›).symm,(by decide)],bI _ _ _ g,aK,dN n d e n 0 (Κ n)];congr 1 .simp only[AX,Am,((by decide):tm ld 0x80000000=0),Av];exact ϔ rfl λt j=>by simp only[AD (ϥ.mp j)];unfold tm;rw[Τ];ring simp[h.ne'] theorem kStep (a x:Ἅ) (A X ea:ℝ) (K:ℕ) (hK:K ≤ 971) (ha:fv a) (hx:fv x) (hX:rv x=X) (hea : |rv a-A| ≤ ea) (hB : |A+X| + ea < (2:ℝ)^K) : fv (a+x) ∧ |rv (a+x)-(A+X)| ≤ ea+(2:ℝ)^K*(2:ℝ)^(-54:ℤ):=by obtain ⟨h2,h3⟩:=i5 a x ha hx K hK (by rw [hX, ← sub_add_cancel (rv a) A,add_assoc]; exact (Ag _ _).trans_lt ((add_le_add hea AP).trans_lt ((add_comm _ _).trans_lt hB))) rw [hX] at h3 refine ⟨h2,?_⟩ rw [← sub_add_sub_cancel (rv (a+x)) (rv a+X) (A+X),add_sub_add_right_eq_sub,add_comm ea] exact (Ag _ _).trans (add_le_add h3 hea) theorem kSeq (p:ℕ → Ἅ) (z:ℕ → ℤ) (u:ℝ) (n K:ℕ) (B:ℝ) (hK:K ≤ 971) (hp : ∀ t < n,fv (p t)∧rv (p t)=z t) (hS : ∀ t ≤ n, |u + ∑ s ∈ kP t,(z s:ℝ)| ≤ B) (hBK:B+n*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)) < (2:ℝ)^K) : ∀ m t a,n-t=m → t ≤ n → fv a → |rv a-(u + ∑ s ∈ kP t,(z s:ℝ))| ≤ t*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)) → fv (ao p n t a) ∧ |rv (ao p n t a)-(u + ∑ s ∈ kP n,(z s:ℝ))| ≤ n*((2:ℝ)^K*(2:ℝ)^(-54:ℤ)):=by have hu:(0:ℝ) ≤ (2:ℝ)^K*(2:ℝ)^(-54:ℤ):=Af (pow_nonneg zero_le_two K) (zpow_nonneg zero_le_two _) intro m; induction m with | zero => intro t a D Q e o; obtain rfl:t=n:=C4 Q (K3.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 (R5.2 Q) hu)).trans_lt hBK) refine G (t+1) (a+p t) (by rw[V4,D,BK]) d this.1 ?_ rw [Ν, ← add_assoc,X7,add_one_mul]; exact this.2 theorem kE1 (n:ℕ) (d e:ℕ → Ἃ) (p:ℕ → Ἅ) (h0:Ἅ) (P L:ℕ) (K : ∀ s < n,fv (p s)∧rv (p s)=tm (d s) (e s)) (q:fv h0∧rv h0=tm (d n) (e n)) (E : ∀ s ≤ n, |(tm (d s) (e s):ℝ)| ≤ 2^P) (N:n+2 ≤ 2^L) (D:L ≤ 27) (J:P+L ≤ 425) : fv (ao p n 0 h0) ∧ |rv (ao p n 0 h0)-(af (n+1) d e:ℝ)| ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=by have hL1:((n:ℝ)+1)+1 ≤ (2:ℝ)^L:=by exact_mod_cast N have pP:(0:ℝ) < 2^P:=by positivity have hU:(0:ℝ) < (2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ):=by positivity have hn:(n:ℝ) < 2^L:=by exact_mod_cast ((I3 n).trans_le ((E7 _).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 (U3 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) ((K8 _ _).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 (R5.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):ℝ) + ·) (X8 _).symm))))).trans A5).trans_le (Af (M3 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 Z7 s n with h | h · have i1:=hd s h; have i2:=he s h have j2:idxOf (e' s) ≤ max (e.toNat-1) 55:=by unfold idxOf; split_ifs; exact ϟ _; exact (P4 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,M5,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 (Y3 i1 j2)) (by positivity) (by positivity) _=2^(48+ix+max (e.toNat-1) 55):=by rw [← AF, ← AF, ← pA] _ ≤ _:=AU one_le_two (le_max_left _ _) · obtain rfl:s=n:=C4 hs h exact hb.trans (AU one_le_two (le_max_right _ _)) theorem kc0:(0:Ἄ).toNat=0:=by simp only [Ϧ] theorem kc1:(1:Ἄ).toNat=1:=by simp only [kD] theorem kc2:(2:Ἄ).toNat=2:=by simp only [kD] theorem kc3:(3:Ἄ).toNat=3:=by simp only [kD] theorem kc4:(4:Ἄ).toNat=4:=by simp only [kD] theorem kc5:(5:Ἄ).toNat=5:=by simp only [kD] theorem kc6:(6:Ἄ).toNat=6:=by simp only [kD] theorem kc7:(7:Ἄ).toNat=7:=by simp only [kD] theorem kc8:(8:Ἄ).toNat=8:=by simp only [kD] theorem kSm (a b:Ἄ) (h:a.toNat+b.toNat < 2^(31:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by have:2^(32:Ἀ) ≤ 2^nx:=ς rw [lJ]; exact γ (by omega) theorem aos (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:t < n):ao p n t a=ao p n (t+1) (a+p t):=by rw [ao,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 W3.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 (W4 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 Z5 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:=K3.1 hm; rw [tBi,dif_neg (by rw [ε]; exact not_lt.2 z)]; dsimp only exact ⟨by rw[hA,C4 ho z],fun i _=>rfl,fun p h1 h2=>absurd (h1.trans_lt h2) (not_lt.2 z)⟩ | succ m ih => intro o k A hm ho hk hA have h1:o.toNat < o8.toNat:=N1 hm have q1:(o.toNat+1)*n.toNat ≤ (ow.toNat+16)*n.toNat:=ι _ (l7 (h1.trans_le ho8)) have e1:(o+1).toNat=o.toNat+1:=by rw [s5uA (a:=o) (b:=1) (by simp; clear*-h1 ho8 hO hB; omega)]; simp have q2:=nO o.toNat n.toNat have e2:(k+n).toNat=(o.toNat+1)*n.toNat+t.toNat:=by rw [s5uA (a:=k) (b:=n) (by rw [hk]; clear*-htn q1 q2 hB; omega),hk,q2]; exact lO _ _ _ rw [tBi,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,←F7,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 K6 hi),s5push_get,if_pos (by rw[hA];exact hi)],fun p hp1 hp2 => ?_⟩ rcases Z7 o.toNat p with hp | hp · exact r3 p (by rw [e1]; exact hp) hp2 · have pe:p=o.toNat:=C4 hp hp1 subst pe rw [r2 _ (by rw [e1]; exact I3 _),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:=O4 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,←F7,hm,BK]) he have mono : ∀ a b:ἇ,a ≤ b → (a>>>24).toNat ≤ (b>>>24).toNat:=fun a b h=>by simp only [Υ,β]; exact ϭ (V7.mp h) set v:=W.uget k (s5uL kl)<<<1 obtain ⟨mx1,mx2⟩:=s5rMu_spec_h1 x v refine ⟨AZ (mono _ _ mx1) i1,fun j hj1 hj2 => ?_⟩ rcases Z7 k.toNat j with hj | hj · exact i2 j (by rw [e1]; exact hj) hj2 · have je:j=k.toNat:=le_antisymm hj hj1 subst je rw [← s5exp, ← s5uget W k (s5uL kl)]; exact AZ (mono _ _ mx2) i1 theorem s5da_spec{α:Type}[Inhabited α](f:Nat->α)(N:Nat):∀ m (a:Ἂ α),N-a.size=m→a.size≤N→(∀ iintro a hm ha hi; have z:=O4 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 Z7 i a.size with h1|h1 · rw [AB _ i (by simp; exact X5 h1),nU h1, ← AB a i h1]; exact hi i h1 · have:i=a.size:=le_antisymm h h1 subst this; rw [AB _ _ (by simp),nV] theorem s5wcGet3_val {K V:Type} {f:K → V} {a:K} (x : {v // v=f a}):x.1=f a:=x.2 theorem kMm (a b:Ἄ) (h:a.toNat*b.toNat < 2^(31:Ἀ)):(a*b).toNat=a.toNat*b.toNat:=by have:2^(32:Ἀ) ≤ 2^nx:=ς rw [BO]; exact γ (by omega) theorem kFU (S:ἀ) (i:Ἄ) (h:i.toNat < S.size):S.uget i h=S.data[i.toNat]! := by rcases S with ⟨d⟩; simp only [nN,kS] at h ⊢; rw [AB d i.toNat h]; rfl theorem kXU (X:Ἂ Ἃ)(i:Ἄ)(h:(J0 i)<(O0 X))(c:ℕ)(hc:(J0 i)=c):X.uget i h=X[c]! := by subst hc; rw [AB X (J0 i) h]; rfl theorem kIx7 (a k:Ἄ) (c:ℕ) (hk:k.toNat=c) (hc:c ≤ 7) (S:ἀ) (h:a.toNat+7 < S.size) (h2:a.toNat+7 < 2^(31:Ἀ)) : (a+k).toNat < S.size:=by rw [kSm a k (by (clear * - hk hc h2;omega))]; (clear * - hk hc h;omega) theorem kTB (w:Ἃ) (F E:ℕ) (K:idxOf w ≤ F) (al:174+F ≤ E) : |(tm ld w:ℝ)| ≤ 2^E := have H1:(tm ld w).natAbs ≤ 2^23*2^24*2^(126+F):=(Ϩ _ _).trans_le (ϧ ((Ϩ _ _).trans_le (ϧ (by decide) (bg w).le)) ((Int.natAbs_pow 2 _).trans_le (Θ two_pos (Y3 (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 (((R5 (α:=ℝ)).mpr (H1.trans H2)).trans_eq ((I4 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 (R8 (hm a b h hb)) · exact h · exact absurd e.symm (R8 (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 ((K4 _ _).trans ((congrArg (P + ·) (Nat.two_mul L)).trans_le ((pA P L L).symm.trans_le ((Y3 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 γ (K5 h (by decide)) theorem kOfS (n:ℕ) (h:n < 2^(63:Ἀ)):n.toUInt64.toNat=n:=by rw [Ϣ,O6]; exact γ (K5 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 (N5 a).toModel=C8 (fmt:=kC) a.toBitVec:=by have e1:kI (N5 a).toModel=Model.canonicalizeModel (C8 (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,C8,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:ἆ):C8 (fmt:=kC) a.toBitVec=Model.ofFields kC (a>>>63!=0) ((lq ((a>>>52)&&&2047))) ((lq (a&&&0xfffffffffffff))):=by have d:Model.expField (C8 (fmt:=kC) a.toBitVec)=(lq ((a>>>52)&&&2047)):=ἅ have e:Model.fracField (C8 (fmt:=kC) a.toBitVec)=(lq (a&&&0xfffffffffffff)):=ἅ have g:Model.signBit (C8 (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 (C8 (fmt:=kC) a.toBitVec),d,e,g] lemma s5pw(m:ℕ)(z:Ἁ):((2^m:ℕ):ℝ)*(2:ℝ)^(z-m)=(2:ℝ)^z:=by rw[I4,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 Z7 (mJ w) (2^(31:Ἀ)) with c|c · have h0:w>>>31=0:=Β.mp (by rw[b,nj];exact ώ c) have hz:(w&&&0x80000000)=0:=Β.mp (by rw[s1,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 O3)⟩ 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,O3];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=>Z8 (ε.1 h) e),c q (AN hq a),if_pos (AN hq (O4 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 (K6 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 (K6 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:=C5 h (I3 r) theorem k7d1:1≤7:=N2 rfl theorem k7d2:2≤7:=N2 rfl theorem k7d3:3≤7:=N2 rfl theorem k7d4:4≤7:=N2 rfl theorem k7d5:5≤7:=N2 rfl theorem k7d6:6≤7:=N2 rfl theorem k7d7:7≤7:=N2 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:=O4 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 W3.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 (U3 8 (X4 ht)) h31.2),kc8] have hw:(J0 (wo+t))=(J0 wo)+(J0 t):=kSm _ _ (AO (J1 (X4 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,V4,H,BK]) l hl) (ac h) ((kX8_spec_h1 _ _ _ _ _ _ _ _ _ _ _ (by rw[h8];exact AO ((J1 ((by decide):7<=8) _).trans (U3 8 ht)) h31.2) _ _ _ _ _ _ _ _ l hl).trans (by rw [kFU,hw,h8])) ht @[inline] def cEq(F a:Ἅ):ἆ:=let e:=eF (F*a).toBits;if (1078:ἆ)p then hb else p) if c<(4294967296:ἆ) then (let w:=N3 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) else (0xFFFFFFFF:ἇ) @[inline] def mx2(a c:ἆ):ἆ:=if aZ8 (ε.mp h) hk,fun h=>Z8 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 (N3 c)else aB () theorem sTB_h(a n:Ἀ)(h:a+n<2^(31:Ἀ)):(J0 (G0 a))=a∧(J0 (G0 n))=n:= ⟨J3 (AN (AN ((V1 a n).trans_lt h) (by decide)) ς),J3 (AN (AN ((K2 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[Ϧ,J3 (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:=O4 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 W3.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 W3.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 W3.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,V4,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 (U3 8 hk).trans_lt (C0 (V1 _ _) h8)),kc8] rw [kSm _ _ (by rw [e8k]; exact C0 (Y3 (U3 8 hk) (J2 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 (Z8 (ε.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),V4,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=>Z8 (ε.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),V4,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 (U5 _) |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:=K3.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:=L3 (Nat.le_add_right_of_le (hgB.resolve_right (L7 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,←F7,hm,BK]) (by rw [e1]; exact h1) (by rw [b1,e16,e8, ← pA,hsc]) refine ⟨r1,fun i hi=>(r2 i (e8 ▸ U1 hi (V1 _ _))).trans (b2 i (hsc.symm ▸ hi)),fun s l hs1 hs2 hl => ?_⟩ rcases Z7 t.toNat s with hs | hs · exact r3 s l (by rw [e1]; exact hs) hs2 hl · have se:s=t.toNat:=le_antisymm hs hs1 subst se have:=b3 (g16.toNat+l) (V1 _ _) (by rw[e16]; exact O1 hl _) rw [← pA,hsc] at this exact (r2 _ (by rw [e8]; exact O1 hl _)).trans this theorem s5tPg8_inv (W:Ἂ ἇ)(n ow G:Ἄ) (hB:(ow.toNat+16)*n.toNat<2^(31:Ἀ))(hO:ow.toNat+16<2^(31:Ἀ))(hW:ow.toNat*n.toNat≤W.size)(hWs:W.size<2^(32:Ἀ))(hG:8*G.toNat≤ow.toNat+7) : ∀ m (gi:Ἄ)(A:ἀ),G.toNat-gi.toNat=m → gi.toNat≤G.toNat → A.size=8*gi.toNat*n.toNat → let R:=tPg8 W n ow G gi A R.size=8*G.toNat*n.toNat∧(∀ i<8*gi.toNat*n.toNat,R.data[i]! = A.data[i]!) ∧ (∀ g s l,gi.toNat ≤ g → g < G.toNat → s < n.toNat → l < 8 → R.data[8*g*n.toNat+s*8+l]! = if 8*g+l < ow.toNat then dw W[(8*g+l)*n.toNat+s]! else 0):=by intro m; induction m with | zero => intro gi A hm hgi hA; have z:=K3.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 J4 _ 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,←F7,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 Z7 gi.toNat g with hg | hg · exact r3 g s l (by rw [e1]; exact hg) hg2 hs hl · have ge:g=gi.toNat:=le_antisymm hg hg1 subst ge rw [r2 _ (by rw [e1, ← sz]; have:=ι 8 (show s+1≤n.toNat by exact Order.add_one_le_iff.mpr hs); rw[Ϡ,n4] at this; (clear * - hs hl;omega)),b3 s l (ϟ _) hs hl,eg] theorem tPg8_n0 (W:Ἂ ἇ)(n ow G:Ἄ)(hn:n.toNat=0) : ∀ m (gi:Ἄ)(A:ἀ),G.toNat-gi.toNat=m → (tPg8 W n ow G gi A).size=A.size:=by intro m; induction m with | zero=>intro gi A hm; rw [tPg8,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 V6 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:=C4 Q (K3.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 ((K8 _ _).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 (X4 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 [V4,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 (M3 _) htT hc E o) rw [X7,hsucc, ← rp] refine (abs_sub_le _ (rv a+rv (p t)) _).trans ?_ rw [add_sub_add_right_eq_sub]; exact this theorem kMsk (w:ἇ):kB (w&&&0x7FFFFFFF)=kB w∧kG (w&&&0x7FFFFFFF)=kG w∧sv (w&&&0x7FFFFFFF) = |sv w| := by have hs:k9 (w&&&0x7FFFFFFF)=false:=by unfold k9; rw [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:(K7 u.toInt64)=n:=by rw[show (K7 u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [Int.natAbs_natCast,nr];exact I7 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 W4 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 (R6 _) (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) (R6 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) (R6 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 U2 (ι 2 (ϧ (U3 _ (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,Ϲ,M5] 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,Ϲ,M5,Y4,I4,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 (M8 (J2 (N4 (J2 (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:=R5.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 ▸ M3 _ have hΛb:Λ ≤ 2^(304:Ἀ):=hΛS ▸ (R5.2 hS).trans_eq (by rw [I4,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,X8,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:=U3 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):=(Y4 _ _).trans (congrArg₂ (·*·) nZ (X7 n)) have hFn:=FN.2.trans ((M5 _).trans e) have Zr:=kRM _ Lf FN.1 hf (((Ae _ _).trans (congrArg (·*|rv Lf|) ((congrArg abs hFn).trans (Ad ((M3 _).trans_eq e))))).trans_le ((mul_le_mul (e.symm.trans_le (((R5 (α:=ℝ)).mpr (a.trans (by decide))).trans_eq ((I4 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:ℝ)) (W5 _ 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:=W4 fun hl=>absurd (Nat.le_of_add_le_add_right (Hn.trans (Θ Nat.zero_lt_two (J2 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:=K8 (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) (N2 rfl:425 ≤ 960)).trans_eq (AA (2:ℝ) 960).symm)) n 0 _ (pQ n) (ϟ _) hd.1 (by rw [hd.2,X8,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 J2 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 (X4 (show e.toNat < 56 from g))).symm · rw [if_neg g]; exact (Nat.max_eq_left (W4 (show ¬ e.toNat < 56 from g))).symm rw [η,m,q, ← pA] exact γ (C0 (Y3 (L1 (Nat.max_le.2 ⟨X4 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 (X4 (show b.toNat < a.toNat from g))).symm · rw [if_neg g]; exact (Nat.max_eq_right (W4 (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 (U2 (K4 _ _) 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 ⟨U2 (K4 _ _) (U2 z (by decide)),U2 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 W4 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:=O4 hm rw[dRw,dif_neg (mt ε.mp (W3.mpr e)),kFS,kSm o n hB.2,ao,if_neg (W3.mpr e),if_neg (fun(g:_∧_)=>W3.mpr (U2 (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,← F7,hm,BK]) (by rw[h2]; exact h1) q,h2,kFS,kSm o k (K5 (O1 h1 _) hB.2),kXU _ _ _ _ (kSm i k (K5 (O1 h1 _) hB.1)),kAbsDw] refine congrArg (ite _ _) ?_ by_cases g2:oб+(kб+1)≤q∧qg2 ⟨N4 g.1 g3,g.2⟩)] theorem dRw8_spec (X:Ἂ ἇ)(i n r:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(hB:(J0 i)+(J0 n)<2^31/\8*(J0 n)+7<2^31)(hr:(J0 r)<8) : ∀ m (k:Ἄ)(Y:ἀ)(a:Ἅ)(hY:8*(J0 n)+8<=(kS Y)),(J0 n)-(J0 k)=m → (J0 k) ≤ (J0 n) → ∀ q, (dRw8 X i n r k Y a hX hY hB hr).data[q]! = if q=8*(J0 n)+(J0 r) then ao (fun t=>dw (X[(J0 i)+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 k) a else if q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n) then dw X[(J0 i)+q/8]! else Y.data[q]! := by intro m; induction m with | zero => intro k Y a hY hm hk q have e:(J0 k)=(J0 n):=C4 hk (O4 hm) have nl:¬ (J0 k) < (J0 n):=fun h=>B4 _ (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,V4,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,X5 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 [W8 (by decide),ώ hr,ϑ] have d2:(8*(J0 k)+(J0 r))%8=(J0 r):=by rw [O7,γ 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):=C4 (J2 (O8 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=>R8 hj (Nat.eq_of_mul_eq_mul_left (by decide) (N8 e))),if_pos ⟨rfl,ϟ _,hj⟩,if_pos ⟨(O1 hs8 _).trans_le (L1 (U3 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 (B4 j)] · rw [if_neg (fun e=>L6 hj (Nat.eq_of_mul_eq_mul_left (by decide) (N8 e))),if_neg (fun h=>Nat.lt_asymm h.2.2 hj),if_neg (fun h=>W3.2 (((Nat.mul_succ 8 N).symm.trans_le (U3 8 hj)).trans (V1 _ _)) h.1)] · by_cases hc:8*j+s < 8*N+8∧R ≤ s∧s < L · rw [if_pos ⟨hc.1,N4 hc.2.1 (Ne.symm hs),hc.2.2⟩,if_pos hc] · rw [if_neg (fun h=>hc ⟨h.1,X5 h.2.1,h.2.2⟩),if_neg (fun e=>hs (((O7 8 j s).trans (γ hs8)).symm.trans ((congrArg (·%8) e).trans ((O7 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):=C4 hr (O4 hm) rw [dX8,dif_neg (fun h=>B4 _ ((ε.mp h).trans_le e.ge))]; exact (if_neg (fun h=>B4 _ (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 (W4 this)).symm have tp:p.toNat=max (E[j]!).toNat 56+cq.toNat:=by rw [hp,kAddS _ _ (by rw [hm]; exact C0 (Y3 (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 _ ((K4 _ _).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 (W4 (μ.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 ⟨(K4 _ _).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 _,W4 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 _ ((K2 _ _).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 _ ((K4 _ _).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:=(O7 8 s r).trans (γ hr) have q2:(8*s+r)/8=s:=by rw[W8 (by decide),ώ hr,ϑ] have c1:8*s+r<8*nn+8:=(O1 hr _).trans_le (L1 (U3 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:=(O7 8 nn r).trans (γ r8) have q2:(8*nn+r)/8=nn:=by rw[W8 (by decide),ώ r8,ϑ] refine (D _).trans ?_ rw[q1,q2,if_neg (B4 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:=U2 (B3 (Ο r m).symm) (ι m h1) have q2:=U2 (B3 (Ο r n).symm) (ι n h1) have q3:=U3 R (X4 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 ▸ K5 (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 (W3.2 (K3.1 hk)))],fun r' t h1 h2 _=>(B4 r' (U1 h1 ((K3.1 hk).trans h2))).elim⟩ | succ k ih => intro r Y hY hk hr have h1:=N1 hk have hnm:=V6 (I3 _) 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) (U2 hY (B3 (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))) (U2 (B3 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 (ι _ ((E7 _).trans (B3 hr1.symm)))),D q,e2,if_neg (by exact R8 (U1 hq (V1 _ _))),if_neg (by exact fun h=>W3.2 ((V1 _ _).trans h.1) hq)] rcases Z7 r.toNat r' with h5 | h5 · exact I2 r' t h2 (U2 (B3 hr1) h5) h4 · obtain rfl:=C4 h5 h3 rw [I1 _ (by rw [hr1,Ϡ,n4]; exact O1 (C0 h4 hnm) _),D, ← e2, ← e1] by_cases ht:t=n.toNat · subst ht; rw [if_pos rfl,if_pos rfl,kc0] · rw [if_neg (by exact fun h=>ht (J8 h)),if_neg ht,if_pos (by exact ⟨J1 (ϟ _) _,O1 (N4 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 W4 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:=W3.mpr (K3.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:=C5 h (I3 r) theorem Lq2(R r:ℕ)(h:r+1 < R):R-(r+1+1) < R-r:=C5 (B6 h) (K6 (I3 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=>B4 _ (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:=⟨X5 g.1,g.2⟩ theorem Lqe(a b m q:ℕ)(g:¬(a+(b+1)≤q∧q < a+m))(e:¬a+b=q):¬(a+b≤q∧q < a+m):=fun g'=>g ⟨N4 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 L6 (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:=N4 (J2 (N4 (J2 h) e1)) e0 theorem Lw7(o o' w:ℕ)(ho:o' < w)(h2:¬o+1 < w)(e0:¬o'=o):o' < o:=N4 (J2 (U1 ho (W4 h2))) e0 theorem n5d0:0≤7:=N2 rfl theorem n5d1:1≤7:=N2 rfl theorem n5d2:2≤7:=N2 rfl theorem n5d3:3≤7:=N2 rfl theorem n5d4:4≤7:=N2 rfl theorem n5d5:5≤7:=N2 rfl theorem n5d6:6≤7:=N2 rfl theorem n5d7:7≤7:=N2 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):M6 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=G6 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[G6,c,Model.modelSign,h,decide_true,if_true,ha] ·subst h;simp[G6,Model.modelSign] ·have c:compare M 0=.gt:=Int.compare_eq_gt.mpr h;have ha:M.natAbs=M.toNat:=by omega simp only[G6,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):M6 (G6 k0 M1 E1 .positive)=M6 (G6 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):(M6 (.zero s)).unpack=.zero s:=by cases s<;>rfl open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSA(s:pK)(n:ℤ):((s.apply n:ℤ):ℝ)=(if J6 s=true then -1 else 1)*(n:ℝ):=by cases s<;>simp[Float.Model.UnpackedFloat.Sign.apply,J6] open FloatLib.Floats.Formats.BinaryInterchange in theorem fzSM(s1 s2:pK):(if J6 (s1*s2)=true then (-1:ℝ) else 1)=(if J6 s1=true then -1 else 1)*(if J6 s2=true then -1 else 1):=by cases s1<;>cases s2<;>simp[J6] 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 M6 (fma .binary64 x.toModel.unpack y.toModel.unpack z.toModel.unpack)=M6 (add .binary64 z.toModel.unpack (x*y).toModel.unpack) have e3:(x*y).toModel=M6 (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,N6,N6,fzBP,fzBP] cases s1<;>cases s2<;>simp[J6,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 M6 (mul .binary64 (.finite s1 m1 e1 h1) (.finite s2 m2 e2 h2))=M6 (.finite sP mP eP hmP) rw[← hPd,fzPU] | finite s3 m3 e3 h3=> apply fzVD rw[N6,N6,N6,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[J7,Rat.cast_add,Rat.cast_intCast,S8,G7,Int.cast_add,fzSA,M5] linear_combination (if J6 (s1*s2)=true then (-1:ℝ) else 1)*A+(if J6 s3=true then (-1:ℝ) else 1)*B-(if J6 s3=true then (-1:ℝ) else 1)*C-(if J6 sP=true then (-1:ℝ) else 1)*D+((m1:ℝ)*m2*(2:ℝ)^(e1+e2))*E-hV+((if J6 s1=true then (-1:ℝ) else 1)*(if J6 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 C6 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 C5 h3 (P5 (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 _ _ _ (W4 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 (W4 h3) rw [sM,dif_neg (fun h=>h3 (B6 (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:=B6 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 (B3 (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:=B6 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:=N3 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 @[inline] def dn1(c:@& DC)(vo rn:Nat)(cq H:ἆ)(j:Nat)(l cnt q s:Ἄ)(v:Ἅ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,ke h.2)] · rename_i hl; rw [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 (B7 hs1 (J8 ((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:=J2 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 (K2 _ _))) 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 (F8.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 C6 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 (W4 (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,M4 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,M4 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 (P7 _ _) (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,M4 (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,M4 (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,M4 (by omega)] rw [eo] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix1] at e; rw [ec] at hl'; have:=B7 hs1 (J8 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,M4 (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,M4 (by omega)] rw [eo] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (fun l hl' e=>by rw [ix2,ix0] at e; rw [ec] at hl'; have:=B7 hs1 (J8 e); omega)] rw [dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q1.2 (fun l hl' e=>by rw [ix1,ix0] at e; rw [e8] at hl'; have:=B7 hs1 (J8 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,M4 (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:=B7 hs1 (J8 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:=B7 hs1 (J8 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):=J4 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 (X4 hs)).trans (if_neg (R8 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 [O3,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 (R8 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 [O3,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 [Ϝ,O3]) intro q hq hq' rw [Ϝ] at hq' simp only [Λ] rw [← AB _ q hq] have hpos:0by rw [h,A7] at hq'; exact U5 _ 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) (X4 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 _ _ _ _ (K3.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 (X4 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):=U3 _ 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 (U2 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 (X4 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 C6 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 C6 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' (W4 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 (X4 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+C3 r') (C3 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' (X5 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 (G4 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+C3 (J0 r)=r0+r:=by rw [show C3 (J0 r)=r from USize.ofNat_toNat] rw [er] · exact T3 r' o' (N4 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 (X4 (show e.toNat < 56 from g))).symm · rw [if_neg g]; exact (Nat.max_eq_left (W4 (show ¬ e.toNat < 56 from g))).symm rw [η,m] exact γ (C0 (Y3 (Nat.max_le.2 ⟨X4 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 U5 _)) 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 (C3 o'))=o':=J3 (hS _ (U1 ho (X4 (C0 (lZ _ (by decide)) h31.2.2)))) have hr8:r < kX:=hS _ (U1 (U1 hr hl) (by decide)) have hrow:(J0 (r0+C3 r))=(J0 r0)+r:=by rw [kSm _ _ (by rw [J3 hr8]; exact Lql _ _ _ _ hr (X4 hR)),J3 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:=J3 (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=J3 (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 lim)))=lim:=J3 (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=>W3.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 (G4 (W3.1 hr) (by rwa[Ϡ,n4] at h1)) (Nat.sub_lt_sub_right (W3.1 hr) h2)) (ϟ _) h3 rw[BQ (W3.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:=K3.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 (W3.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 (W3.1 h)];exact ϟ _) hA hI have hl8:min 8 (R-rb*8)<=8:=P7 _ _ have hlR:rb*8+min 8 (R-rb*8)<=R:=(J1 (Nat.min_le_right 8 (R-rb*8)) _).trans (B3 (BQ (X4 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:=J3 (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=J3 (hS _ (AO (lZ n (by decide)) h8n)) have e3:(J0 ((G0 (min 8 (R-rb*8)))))=min 8 (R-rb*8):=J3 (hS _ (AO hl8 (by decide))) have e4:(J0 ((G0 ow)))=ow:=J3 (hS _ how) have e5:(J0 ((G0 (rb*8))))=rb*8:=J3 (hS _ (K5 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 (I3 _) ((Nat.mul_add_one 8 n).symm.trans_le (U3 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,V4];exact (Nat.sub_le_sub_left (by decide) _).trans (M8 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 (U2 (U2 (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 [O3]) (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 U5 _ 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 Z4 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[V7,Ξ];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 (B3 ((ϛ (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:=G4 (not_lt.1 h) (X3 Q _);apply K;rw[M,P8 (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 Z7 r (2^(28:Ἀ)) with h|h · have h2:r+2<=2^(28:Ἀ):=N4 h v1 have a:r+2^(28:Ἀ)<2^(29:Ἀ):=(X3 h _).trans_eq ἅ have b:r+268435457<2^(29:Ἀ):=(L1 (G5 h2) 268435457).trans_lt (by decide) rw[ώ b,ώ a,γ a];exact⟨ἅ,((by decide):2<=2^(28:Ἀ)).trans (K2 _ _),(lO _ _ _).trans_le ((L1 h2 _).trans_eq ἅ)⟩ · obtain⟨t,rfl⟩:∃t,r=2^(28:Ἀ)+2+t:=Nat.exists_eq_add_of_le (N4 (N4 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,ώ (B6 tl),Μ,γ (B6 tl)] exact⟨ἅ,K2 _ _,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 (N3 (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:Ἀ):=J2 ((ϸ (϶ 29)).2 ((X3 (ϊ _ (϶ 52)) _).trans (by decide)));have v:((lq a)/2^(52:Ἀ)%2^(11:Ἀ)-1085-110)*2^(23:Ἀ)<=252*2^(23:Ἀ):=ι _ (P4 (P4 z 1085) 110);have X2:=cX_h2 _ _ r (C0 (Y3 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:=(N3 (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 (M3 _)),sub_le_iff_le_add.2 (R5.2 (q.trans ((by decide):1447<=1993))),le_sub_iff_add_le.2 (((by decide):(-1021:Ἁ)+1022<=1195).trans (R5.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⟩:=I5.1 G;obtain⟨x,y⟩:=I5.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 ((K4 _ _).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 ((K4 _ _).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 (U4.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 (I5.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 (I5.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 (U8.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/\jW3.2 u v.2)).trans (if_pos (r.trans u)).symm) else if v:a<=j then(if_neg u).trans ((if_pos ⟨v,O8 u⟩).trans ((congrArg (Option.map · o) (q v (O8 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 (O4 hk))];split .rw[l5 (p.trans_le ((ι _ (O4 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 W4 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 (U5 _) |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 (U5 _) |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,ϻ,F5,Nat.mod_one,ϑ,pQ,U5,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 (U5 _) |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 (N3 r)else fb ()) d @[inline]def aq(w:Ἃ):ἆ:=if mW w !=0 then iW w else 255 @[inline]def cV(x0 x1 x2 x3:Ἃ):Ἆ:=Q x0&&Q x1&&Q x2&&Q x3 @[inline]def eF(u:Ἃ):ἆ:=(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,W5,pO (by exact X5 d)];rw[show((2^(64:Ἀ):Ἀ):ZMod (2^(64:Ἀ)))=0 from ZMod.natCast_self _];ring lemma bF:Z 0=0:=by simp[Z] lemma cB{B:ἆ}(h:B<=255):(lq B)<=255:=by simpa using θ.mp h noncomputable def bU(e:Ἀ)(w:ἇ):Ἁ:=sv w*2^(idxOf w-e) lemma cz(h:kM u=0):sv u=0:=by rw[sv];simp[h] lemma kd(h:kM u=0):mW u=0:= ξ.mp (by rw[an,h];rfl) lemma dI_h1(w:ἇ)(m:(lq E)<=255)(l:(lq C)<=62)(e:iW w-E<=C):(lq E)<=kG w/\kG w<=(lq E)+(lq C)/\(lq (iW w-E))=kG w-(lq E):=by have g:=θ.1 e;have q:=η (iW w-E) E;rw[UInt64.sub_add_cancel,am,γ ((Y3 (g.trans l) m).trans_lt (by decide))]at q rw[q];exact⟨K2 _ _,(Τ _ _).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:=U4.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 (W6 _) 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) (W6 _)) 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 X5 A)▸u _ _ _ _ e (by exact I7 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 X3 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 L7 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 ⟨N4 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:=O4 e;rw[fcU,dif_neg λh=>W3.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:=K3.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) _) (U2 this (hn▸E))) | succ m ih=> intro r p d y Y e a b c f N O J;have hr:rk (O5.1 (y1.trans (j.trans hh.symm))) obtain⟨q1,q2⟩:=(Nat.div_mod_unique h0).2 (⟨by rw[lO,Τ ((J0 r)%s.h),rq],N4 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=C3 (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):(C3 n).toNat=n:=J3 (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 (U5 _) | 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:M6 a.toModel.unpack=M6 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[M6,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 (N3 (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[←R7 (hab.trans hb.le),Nat.add_sub_assoc hab,Nat.add_mod_left,γ ((K4 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 (X4 (X3 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)),γ (((K4 _ _).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:=W3.1 λlt=>absurd (((Nat.sub_le_sub_left l3 _).trans (V1 _ e)).trans_lt ((γ ((O1 lt _).trans_le (B3 (L3 (l3.trans (by decide)))))).symm.trans_lt c)) (W3.2 (((K4 _ _).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:=(X3 hh 1075).trans (by decide) rw[γ (hh.trans (by decide)),γ h2,wok_h1 e (h+1075) (J2 (he.trans_le m2)) h2,wok_h1 1195 e (l2.trans le) hE] exact⟨M8 ((Nat.add_left_comm h 21 1054).trans_le (J1 (l1.trans le) 21):h+1075<=21+e),G4 (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[μ,θ,Ζ,η,Ϣ,O6,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 (N3 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 (N3 c)else ow2 d o y x S lemma iE(d:CD)(o y x:Ἀ)(S:Ἅ):bVo d o y x S=ow d o y x S:=by unfold bVo;dsimp only;split .rename_i e;rw[jI _ _ (ep _ _ e)];rw[ow,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 (N3 c)else ow2 d o y ((J0 xb)+r) S lemma iF(d:CD)(o y:Ἀ)(e:Ἄ)(r:Ἀ)(S:Ἅ):ju d o y e r S=bV d o y ((J0 e)+r) S:=by unfold ju;rw[fz_ak _ _ _ _ d.hz];rfl @[inline]def su(a:Ἂ Ἃ)(u:Ἄ)(v:Ἃ):Ἂ Ἃ:= if h:uἋ)(n r q:Ἀ)(a:Ἂ Ἃ):Ἂ Ἃ:= if rkF)(n q:Ἀ):∀m r (a:Ἂ kF),n-r=m->r<=n->(O0 (pl g n r q a))=(O0 a)/\ ∀i<(O0 a),(pl g n r q a)[i]! =if q+r<=i/\iintro r a l o;rw[pl,AC (by (clear * - l;omega))];exact⟨ἅ,λi e=>by rw[AC (by (clear * - l o;omega))]⟩ |succ m p=> intro r a l o;have h:=N1 l;obtain⟨u,j⟩:=p (r+1) (a.set! (q+r) (g r)) (by rw[<-F7,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 B4 (r+1))] conv_rhs=>rw[pl,AC (by exact B4 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:=U8.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 U5 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:¬tZ8 (ε.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(((N7 (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 (K5 (AN (O1 Y _) hW) U.2) ς)] refine ih (t+1) _ _ _ _ _ _ _ _ A (by rw[ac h,<-F7,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,M4 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=>B4 _ ((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 (O4 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 (Y3 (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (N2 ἅ:2<=7)) (C0 hb (U1 d.hX ς)) exact C0 (J1 (U3 d.s.h (B3 (Dense.aa (n:=V) (C0 (L1 (K2 d.s.w (i0+(d.s.h-1)*V)) 2) K)))) i0) (C0 (U2 (J1 (Nat.le_add_of_sub_le (B3 (Nat.sub_one_mul d.s.h V).symm)) i0) (B3 ((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 U2 (B3 (congrArg (·+d.M+7) (congrArg₂ (·+·) (hi.trans (congrArg (i0+y*·) (Dense.aa (n:=V) (C0 (U2 (L1 (K2 d.s.w (i0+(d.s.h-1)*V)) 2) (Y3 (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (N2 ἅ:2<=7))) K)))) (Dense.aa (n:=d.s.w) (C0 (U2 (K2 d.s.w (i0+(d.s.h-1)*V)) (U2 (V1 (i0+(d.s.h-1)*V+d.s.w) d.M) (V1 _ 7))) K))))) (U2 (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 (U2 (U2 (V1 i0 ((d.s.h-1)*V)) (V1 _ d.s.w)) (U2 (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 (J2 (V6 hj (ϣ ..)))).elim (λhjs=>U2 (B3 (((AB (Tz.push T[t]!) j hj).trans (nU hjs)).trans (AB Tz j hjs).symm)) (hz j hjs)) (λhe=>U2 (B3 ((congrArg (fun (i:Ἀ)=>(Tz.push T[t]!)[i]!) he).trans ((AB (Tz.push T[t]!) (O0 Tz) (V6 (I3 _) (ϣ ..).symm)).trans nV))) (hT t h))) else⟨Tz,Wz,0,(O0 Tz),fQ,AP,B3 ((Κ _).trans hs),C0 (U2 (B3 (Κ _)) (U2 hn ht)) hk,hz,C0 (U2 (B3 hs.symm) (U2 hn ht)) hk⟩ termination_by k-t decreasing_by all_goals exact C5 h (I3 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 (O4 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 (J2 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 _ _ _ (Z4 p.le),AC (p▸AX _)];rw[ϣ,Ν,(ϔ ἅ λj r=>by rw[AD (ϥ.1 r)]:∑j∈kP (O0 Tz),z (if j<(O0 Tz)then x j else t)=∑j∈kP (O0 Tz),z (x j))];dsimp only;rw[AC (AX _),l z (λs D q=>g s (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 (ι _ (K2 3 _)) hN;have V:s.cin*(s.h+2)+3<2^(32:Ἀ):=AO (J4 _ (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 (U3 _ (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(U2 bh (U2 (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 (U2 (L1 bh 2) hL) m (U2 ah (by decide)) c.n 0 _ rfl (ϟ _) u.1 (by simp only[u.2,X8,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) (P6 hy (jd d.kk t)) (P6 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 (P5 (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) @[inline]def ccw{M:Ἀ}(c:CC M)(w:Ἀ)(h2:w+c.n<=(kS c.Wz))(h3:w+c.n<2^32):CC M:=⟨c.Tz,c.Wz,w,c.n,c.ni,c.h1,h2,h3,c.h4,c.h5⟩ def g7w(d:@&CD)(Wd:@&ἀ)(hW:d.Y*d.k<=(kS Wd))(hY:d.Y*d.k<2^(32:Ἀ))(y q:Ἀ)(a:Ἂ Ἃ)(c:CC d.M)(hc:c.Tz=d.T∧c.Wz=Wd∧c.n=d.k∧c.ni=fQ):Ἂ Ἃ:= if hy:y g7w d Wd hW hY y q a c hc=c8 d.Y (d.s.h*d.s.w) 0 0 hN (λo ho q _ _ a=> let c:=zcC d Z Wd cs hT hk hkT hW' hY o ho db a9 d c o q (Dense.F.dw oneW*Dense.F.dw d.b[o]!) a) y q i hi a:=by intro m;induction m with |zero=>intro y q i hi a c hc H;rw[g7w,c8,dif_neg (by omega),dif_neg (by omega)] |succ m ih=> intro y q i hi a c hc H;have hy:ysimp only[ccw,dF,dif_neg hZ,hc.1,hc.2.1,hc.2.2.1,hc.2.2.2] def g7(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY else g7w d Wd (hW.resolve_left (fun e=>hz (.inl e))).1 hY 0 0 (Ah (d.Y*(d.s.h*d.s.w)) 0) ⟨d.T,Wd,0,d.k,fQ,hkT,by rw[Κ];exact (lZ _ (ϵ (fun e=>hz (.inr e)))).trans (hW.resolve_left (fun e=>hz (.inl e))).1, by rw[Κ];exact C0 (lZ _ (ϵ (fun e=>hz (.inr e)))) hY,hT,(hW.resolve_left (fun e=>hz (.inl e))).2⟩ ⟨rfl,rfl,rfl,rfl⟩ theorem g7_eq(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY:=by rw[g7];split · rfl · rename_i hz;rw[g7c];exact g7w_eq d Z Wd _ hT hk hkT hW (fun e=>hz (.inl e)) _ hY _ _ 0 0 0 (by simp) _ _ _ rfl lemma g8c(d:CD)(Z:Ἆ)(p:ἀ)(cs:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(hW:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G IX IW IB P:Ἀ) (hs:fP d.s d.kk) (al:0∀qp8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then q/(d.s.h*d.s.w)else 0) (q/(d.s.h*d.s.w)) (q/d.s.w%d.s.h) (q%d.s.w)):=by rw[g7c] obtain⟨aL,ba⟩:=eE d.Y (d.s.h*d.s.w) 0 0 (AO (B3 (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 (B3 ((congrArg (_+·+_+7) (L3 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 (V6 v aL)).trans ((AD ⟨ϟ _,V6 (V6 v (aL.trans O3)) (Κ _).symm⟩).trans (Λ bS).symm)) lemma g8(d:CD)(Z:Ἆ)(p:ἀ)(hW:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G IX IW IB P:Ἀ) (hs:fP d.s d.kk) (al:0∀qp8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then q/(d.s.h*d.s.w)else 0) (q/(d.s.h*d.s.w)) (q/d.s.w%d.s.h) (q%d.s.w)):=by rw[g7_eq];exact g8c d Z p _ hW G IX IW IB P hs al bq hc hM a3 hT m l j r bR a5 a4 hx hw hb a0 a1 hL N a2 bh bB U def wd(Z:Ἆ)(K:Ἂ Ἃ)(n:Ἀ)(hn:n<2^(32:Ἀ)):{W:ἀ//Z=ἃ\/n<=(kS W)/\(kS W)<2^(32:Ἀ)}:= if hZ:Z=ἃ then⟨AR 0,pZ hZ⟩ else⟨wdU K 0 (G0 n) (zPq n),BA ⟨by rw[wdUz _ _ _ _ _ rfl];exact(zPs n).1,by rw[wdUz _ _ _ _ _ rfl];rcases(zPs n).2.1 with z|z;omega;rw[z];exact hn⟩⟩ lemma tB(kk nc A B:Ἀ)(g:kk=9\/kk=1):∀tpc kk t*A+py kk t*B+px kk t) (nc*kk) (AS (nc*kk)))[t]!<=(nc-1)*A+2*B+2:=by intro t h;rw[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,X6 (X6 A B) (X6 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)),X6 (X6 ((s.h+2)*(s.w+2)) (s.w+2)) (X6 (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,(C3 (s.w+2)),rfl,(k/9),rfl⟩ lw.1.2.1 lw.1.2.2.1 hT hk32 hkT (lwW s nc Y K lw hY32) hY32 else dS s J I K b D @[noinline]def fLo(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= fLc s J I K b D nc Y (Dense.F.wcGet3 Dense.F.wcK3eq Dense.F.wcK3eq_ok lwS 32 (K,Y*(nc*(s.kh*s.kw)),X6 (X6 ((s.h+2)*(s.w+2)) (s.w+2)) (X6 (s.kh*s.kw) nc)) (fun k=>k.1)) def fLs(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y n q:Ἀ)(hn:n=Y*(nc*(s.kh*s.kw)))(hq:q=X6 (X6 ((s.h+2)*(s.w+2)) (s.w+2)) (X6 (s.kh*s.kw) nc)) (st:Ἂ (Dense.F.WcE lwf))(i:Nat):{r:Ἂ Ἃ//r=fLo s J I K b D nc Y}:= if h:iwithPtrAddr K (fun p2=> if p1=p2 then (if hk:Dense.F.wcK3eq st[i].k (K,n,q)=true then ⟨fLc s J I K b D nc Y ⟨st[i].v,by rw[st[i].h,Dense.F.wcK3eq_ok _ _ hk,hn,hq]⟩,by unfold fLo;exact congrArg (fLc s J I K b D nc Y) (Dense.F.wcSub _ _)⟩ else ⟨fLo s J I K b D nc Y,rfl⟩) else fLs s J I K b D nc Y n q hn hq st (i+1)) (fun _ _=>Dense.F.wcSub _ _)) (fun _ _=>Dense.F.wcSub _ _) else ⟨fLo s J I K b D nc Y,rfl⟩ termination_by st.size-i def fL(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= (fLs s J I K b D nc Y (Y*(nc*(s.kh*s.kw))) (X6 (X6 ((s.h+2)*(s.w+2)) (s.w+2)) (X6 (s.kh*s.kw) nc)) rfl rfl (ST.Prim.Ref.get lwS (Void.mk ())).val 0).1 theorem fL_eq(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):fL s J I K b D nc Y=fLo s J I K b D nc Y:=(fLs s J I K b D nc Y _ _ rfl rfl _ 0).2 lemma ev_h1(s:lR)(kk:Ἀ)(a2:0simp only[ConvShape.ho,ConvShape.wo,e,j,l,m,F5]<;>exact⟨L3 a2,L3 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 J2 G),(by exact J2 aL),(by exact J2 a1),(by exact J2 u),(by exact J2 A),(by exact J2 v),(by exact J2 x),al,hI,(by exact J2 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 B3 (Κ _);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 U5 _)]) 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 rw[fL_eq];unfold fLo 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)),X6 (X6 ((s.h+2)*(s.w+2)) (s.w+2)) (X6 (s.kh*s.kw) d)) (fun k=>k.1)) hg.1 hg.2.1 hg.2.2.1 hg.2.2.2.1 hg.2.2.2.2.1 hg.2.2.2.2.2.1 hg.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.2.1 (by exact Z4 hg.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1) (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1) hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1 (by exact Z4 hg.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2)) theorem s5c1(s:ConvShape)(J:Ἆ)(I K b:Ἂ Word)(e:s.kh=1)(g:s.kw=1)(j:s.stride=1)(l:s.pad=0)(p:0act J (dotOf (s.cin+1) (fun t=>if tif tby rw[z] at w8;exact w8 rfl) have hw:0push_cast<;>ring lemma bf: (mJ (sk u))=if (mJ u)<2^(31:Ἀ) then (mJ u)+2^(31:Ἀ) else if (mJ u)=2^(31:Ἀ) then 2^(31:Ἀ) else 2^(32:Ἀ)-1-(mJ u):=by have:=u.toNat_lt;rw[sk];simp only[Ι,AQ,<-Β,kN,nr];split_ifs<;>simp only[mh,pU,kN,nr];exact γ (by omega);omega lemma ga_h1(x y N:Ἀ)(d:xzz%N=z-N:=λz i j=>(P8 i).trans (γ (G4 i j)) have P:∀z,00C0 (ϟ _) (dv 0 z i) (Z7 x N).elim (λhx=>(Z7 y N).elim (λhy=>lt_of_eq_of_lt (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 (W3.2 hy)));absurd (if e:y=N then lt_of_lt_of_eq h (if_pos e) else K5 (U1 (lt_of_lt_of_eq h (if_neg e)) (Nat.sub_le_sub_left hy _)) q) (W3.2 (K2 _ _))) λhx=>(Z7 y N).elim (λhy=>have h:=lt_of_eq_of_lt (if_neg (W3.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 (W6 _)) (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 (N4 hx (Ne.symm e))) (M x hx d).symm)))) (W6 _)) (if_neg (Nat.not_le.2 hy)).symm)) λhy=>have h:=lt_of_eq_of_lt (if_neg (W3.2 hx)).symm (lt_of_lt_of_eq h (if_neg (W3.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 (N4 hx λf=>B4 _ (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 (K5 (U1 (lt_of_eq_of_lt (if_pos f).symm h) (Nat.sub_le_sub_left hy _)) q) (B4 _) else Nat.sub_lt_sub_right hy (O8 λl=>W3.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)∧(F6 ((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 (K4 _ _),λh=>by rw[<-Nat.mod_add_div u 256,R7 x.le];exact (J4 256 (Nat.div_pos h ((by decide):0<256))).trans (K2 _ _)⟩ ·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[R7 x.le,Nat.add_mul_mod_self_left,γ ((K4 _ _).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 (N4 (J2 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 (R8 ((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[V7,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:=V7.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 X5 d) (by (clear * - e;omega))⟩ lemma eW(O:0ld)=0)(g:Ἆ)(L:g=ἃ↔∀tld)=if g then 0x80000000 else 0:=by have G:=cH n fa (λ_=>ld);have H:=dW n fa n 0 (by (clear * -;omega));have D:=ab n fa;have F:=ab n λ_=>ld;have d:=Ϝ (f:=λi:Fin n=>fa (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 V6 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 I7 e)).1;have u:=q B p λk e=>(l k (by exact ϟ k) (by simp[d];exact I7 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(Z6.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*_),Y4,I4,I4,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,Y4,I4,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 X5 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 P7 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 X5 h lemma cQ(x:kF)(B M:ἆ)(d:B<=aq x)(r:eF x<=M)(p:M<=po (B+37) 254) (o:B<=255):ok 37 B x=ἃ:=by have q:=(ia x).ge.trans (θ.1 r);rw[θ,mn,η,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 ((K4 _ _).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,(K2 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 ἅ,Ν,X8,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:=K3.1 hm rw[pQ,dif_neg (by rw[ε,hU A (hA.trans_lt hN)];exact W3.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[O3]) (by simp only[Ϧ,ϳ,ϑ]) (ϟ _) H W Ϧ Ϧ (by simp only[Ϧ,ϳ,ϑ]) (λj g=>absurd g (by rw[Ϧ];exact U5 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:Ἄ)=C3 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 O5.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 (X5 b) _) this have A:=ι w v;rw[nO]at A;have Q:=eV_h2 _ _ _ _ A G this refine gU h w I _ m _ _ _ _ ?_ Q;rw[show(2:Ἄ)=C3 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 (W3.2 (K2 _ _)) exact absurd (h.trans (fY_h0 _ b1)) (W3.2 ((E7 _).trans (K2 _ _))) rw[a3,b3];exact U1 (I3 _) (K2 _ _) exact absurd h (B4 _) exact absurd (h.trans (fY_h0 _ b1)) (W3.2 (E7 _)) rw[a3,b3];exact (fY_h0 _ a1).trans (U1 (I3 _) (K2 _ _)) 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:=C4 (W3.1 g) (W3.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 (N8 (a2.symm.trans (e.trans b2))) m exact pZ ⟨N8 ((a2.symm.trans (e.trans b2)).trans (Κ _).symm),b1⟩ exact absurd (a2.symm.trans (e.trans b2)) (L6 ((fY_h0 _ b1).trans (U1 (I3 _) (K2 _ _)))) exact BA ⟨a1,N8 ((b2.symm.trans (e.symm.trans a2)).trans (Κ _).symm)⟩ exact absurd (a1.trans b1.symm) m exact absurd (a2.symm.trans (e.trans b2)) (L6 ((fY_h0 _ b1).trans (I3 _))) exact absurd (b2.symm.trans (e.symm.trans a2)) (L6 ((fY_h0 _ a1).trans (U1 (I3 _) (K2 _ _)))) exact absurd (b2.symm.trans (e.symm.trans a2)) (L6 ((fY_h0 _ a1).trans (I3 _))) 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 _ ((L5 _ _).trans_lt (qL.trans (by decide)))) (aa _ ((L5 _ _).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=>(U5 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:Ἄ)=C3 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 O5.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:Ἄ)=C3 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[W8 ((by decide):2>0),ώ h,ϑ],by rw[O7,γ 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),W8 (by decide),ώ (AO h one_lt_two)];rfl open FloatLib.Numerics in lemma V0(s:Ἆ)(P d:Ἀ)(o:P≠0)(l:d≠0)(q r D:Ἀ) (x:0decide:(if r=0 then 0 else 1)<=1);have G:(r:ℝ)/D<1:=(div_lt_one ((by positivity))).2 (mod_cast t);have E:(0:ℝ)<=r/D:=((by positivity));have w:lf P d=((Aq q):Ἁ)+e:=by apply Model.floorLog2_eq_of_bounds P d _ .rw[h,Y5,ZL ZQ,ZF];exact AE (le_add_of_le_of_nonneg u E) (by positivity) .rw[h,Y5,(by rw[X7];exact add_right_comm _ _ _:((Aq q):Ἁ)+e+1=(((Aq q)+1:Ἀ):Ἁ)+e),ZL ZQ,ZF];exact AI ((add_lt_add_of_le_of_lt AP G).trans_le v) (by positivity) have p:la (l9 P d (23-(((Aq q):Ἁ)+e))).1 (l9 P d (23-(((Aq q):Ἁ)+e))).2=roundShiftRightEven (2*q+if r=0 then 0 else 1) ((Aq (2*q+if r=0 then 0 else 1))-23):=by rw[roundShiftRightEven_eq_roundQuotientEven,g,(R7 (U2 (by decide) m):(Aq q)+1-23=((Aq q)-23)+1),<-VY q r D _ x t (by exact G5 (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 (U2 (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 L6 (U1 (Ϯ (by decide) (ϵ j)) (V1 _ _)),(by rw[X7,add_add_sub_cancel]:(((Aq q)+1:Ἀ):Ἁ)+(e-1)=((Aq q):Ἁ)+e),show¬(((Aq q):Ἁ)+e>127) from not_lt.2 (AZ B (by decide)),show¬(((Aq q):Ἁ)+e< -150) from not_lt.2 (AZ (by decide) A),show¬(((Aq q):Ἁ)+e< -126) from not_lt.2 A,(Nat.le_succ_of_le (U2 (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:ρ=((F6 ρ.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,(F6 ρ.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[(U4.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,M5,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[V4,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[V4,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 (K4 _ _) (by decide):63-k<64),kH,lY] rw[(by rw[<-AF];congr 1;rw[Τ];exact (R7 (Nat.lt_succ.1 h)).symm:2^(1:Ἀ)*2^(63-k)=2^(64-k)),(by rw[<-AF,L3 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)) (P4 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 (P4 p 64) (by decide):k-64<64),ο,γ (m.trans (by decide):(lq d)*2^(k-64)<2^(64:Ἀ))] refine⟨?_,m⟩;rw[Ϛ,<-AF];rw[L3 (W4 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 (W3.2 (K3.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 (U3 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[V4,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[V4,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[Y4,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[Y4,Y4,I4,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):(F6 (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,(F6 (T-e))=k+1:=⟨(F6 (T-e))-1,(L3 ((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:(F6 (T-e))=k+1):(F6 (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):(F6 (297-s))<2^(64:Ἀ):=by have h:(F6 (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):(((F6 (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 ((X3 (M7 hR (by decide)) 1).trans (by decide)) lemma V9(e d:Ἀ)(s:Ἁ)(p:33554432<=ZK e d) (l:ZK e d>>>31=0)(m:-209<=s)(o:s<=297): Yf e d s=az false (XF (2*ZK e d+ (if e=ZK e d*ZK e d*d then 0 else 1))) (XF (F6 (297-s))):=by set R:=ZK e d with g;have h:(lq (XF (F6 (297-s))))=(F6 (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) _ (L6 (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 (F6 (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<<<(F6 c)else B def YF(Dn:Ἀ)(c:Ἁ):Ἀ:=if 0<=c then Dn else Dn<<<(F6 (-c)) lemma VE(B d:Ἀ)(e:0rw[ο,Y4,I4,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[(L3 l.le).symm,m7];exact ϐ e (϶ _) rw[if_pos h,ψ,Ϣ,Ϣ,ZG,ZG,ο,ο,γ (AN e (Θ (by decide) ((K4 63 k).trans (by decide))):x<2^(64:Ἀ)),γ (AN l (by decide):k<2^(64:Ἀ)),γ (K6 l:k<64)] exact γ (K5 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[V4,h,BK]),W5];ring ·rw[ih (i+1) _ _ (by rw[V4,h,BK]),W5];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[Y4,pO h,sq] lemma YO_h2(a b:Ἀ)(h:a<=b):(((b-a)*(b-a):Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[Y4,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 _) (M3 _) 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,M5]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 ((R5 (α:=ℚ)).1 (by rw[YO,Y4,o];exact sub_nonneg.1 v)),YO,o,l,Y4,Y4] 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 σ:ἆ):Ἃ:= (N3 ((if s then(0x80000000:ἆ)else 0)+((σ-146)<<<23+Core.ar (((2:ἆ)*q+1)<<<36)))) @[inline]def el(x g b:Ἃ)(nd nS R pz:Ἅ)(A1 A2 C1:ἆ)(slow:Unit->Ἃ):Ἃ:= let v:=(dw x*nd+nS)*dw g*R+dw b*pz let B:=v.toBits let E:=eF B let σ:=E-C1 let M:=mF B let L:=M&&&0x7FFFFFF let c:=mx (mx (E+10) (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:Ἀ):=Y3 a hy have d:c+(x*2^(23:Ἀ)+y)<=2^(31:Ἀ)+(252*2^(23:Ἀ)+2^(24:Ἀ)):=Y3 hc b rw[γ (C0 a (by decide):x*2^(23:Ἀ)<2^(64:Ἀ)),γ (C0 b (by decide):x*2^(23:Ἀ)+y<2^(64:Ἀ)),γ (C0 d (by decide):c+(x*2^(23:Ἀ)+y)<2^(64:Ἀ)),γ (C0 d (by decide))] theorem kj_h2(x:ℕ)(l:x<2^(26:Ἀ)):(2*x%2^(64:Ἀ)+1)%2^(64:Ἀ)=2*x+1:=by have a:2*x<2*2^(26:Ἀ):=M7 l (by decide) rw[γ (K5 a (by decide):2*x<2^(64:Ἀ)),γ (C0 (l7 a) (by decide):2*x+1<2^(64:Ἀ))] theorem kj_h3(N S x y:ℕ)(j:2^(25:Ἀ)<=x)(l:x<2^(26:Ἀ))(m:146<=y)(o:y<=398)(g:N=(2*x+1)*2^(36:Ἀ))(h:S=y-36):2^(62:Ἀ)<=N/\N<2^(63:Ἀ)/\110<=S/\S<363:=by subst g h;omega theorem kj_h4(c:Ἆ)(A B P:ℤ):(if c then -A else A)*(B*P)=(if c then -(A*B) else A*B)*P:=by cases c;exact (Ap A B P).symm;exact (neg_mul A (B*P)).trans ((congrArg Neg.neg (Ap A B P).symm).trans (neg_mul (A*B) P).symm) lemma kj(s:Ἆ)(q σ:ἆ)(j:2^(25:Ἀ)<=(lq q))(l:(lq q)<2^(26:Ἀ))(m:146<=(lq σ)) (o:(lq σ)<=398):pk s q σ=az s ((2:ἆ)*q+1) σ:=by have d:(lq ((2:ἆ)*q+1))=2*(lq q)+1:=by rw[η,ύ];simp only[kA];exact kj_h2 _ l have g:(lq (((2:ἆ)*q+1)<<<36))=(2*(lq q)+1)*2^(36:Ἀ):=by rw[ψ,d];simp only[kA,kH,ο];exact γ ((ι (2^(36:Ἀ)) (l7 (M7 l (by decide)))).trans_lt (by decide)) have h:(lq (σ-36))=(lq σ)-36:=by rw[χ σ 36 (AZ (by decide) m:36<=(lq σ))];rfl have H:=kj_h3 _ _ _ _ j l m o g h;obtain⟨r,-,t⟩:=bM s (((2:ἆ)*q+1)<<<36) (σ-36) H.1 H.2.1 H.2.2.1 H.2.2.2;have p:(mJ (pk s q σ))=(if s then 2^(31:Ἀ) else 0)+(((lq σ)-146)*2^(23:Ἀ)+(lq (ar (((2:ἆ)*q+1)<<<36)))):=by rw[pk,Ϫ,η,η,ψ,χ σ 146 m];cases s<;>simp only[ἁ,ἂ,υ,kA,kH,ο]<;>exact kj_h1 _ _ _ (by decide) (P4 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(K4 _ _).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)),Y4,I4,nZ,kj_h4]:az s ((2:ἆ)*q+1) σ=az s (((2:ἆ)*q+1)<<<36) (σ-36))];apply Β.1;rw[p,r,h,F7] 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 (U4.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 ((K2 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),M4 (P7 _ _)⟩ theorem jv_h2(e:Ἀ)(l:e<=508):e-po e 254<=254:=Nat.sub_le_iff_le_add.2 ((Nat.le_min.2 ⟨K2 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,L3 (K4 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 U3 _ al.le have bs:=cP d have bA:kG d+(lq x)+52<=342:=L1 (Y3 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) _) (M3 (α:=ℝ) _),?_,?_,(bA.trans (by decide)),?_,?_,?_,?_,?_⟩ have hz:(lq (I0 e))=e:=Α (q.trans (by decide)) have W:(K7 (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:(I6 (if X then(e:ℤ)else-(e:ℤ)))<2^(53:Ἀ):=by rw[Ax I6,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,M5] 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,<-Y4,R5];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 ((K4 _ _).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 (X3 eb 10) (by decide)),(γ (AO (Y3 ib (L1 Jb 1056)) (by decide))).trans (pA _ _ _).symm,γ (AO (Y3 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,L3 (le_max_of_le_left (le_max_of_le_left (V1 _ _))),hA];exact le_max_of_le_right (B3 ((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▸M3 _) (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▸G5 (le_max_of_le_left (le_max_of_le_left (Τ _ _).le))) (by rw[z,L3 (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,J7,S8,Rat.cast_intCast,G7,Ac t2,AA,zpow_ofNat,mul_div_assoc] rw[Rat.cast_add,Rat.cast_div,J7,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 ((γ ((E6 (ϊ _ (϶ 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[J7,S8,T7,G7];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[J7,S8,Rat.cast_add,T7,Rat.cast_one,G7];exact BF hi hP.le) have a0:(0:ℚ)<2^e:=((by positivity)) have v:0<(if s then-Y else Y):=AO (Af (M3 _) 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,λ_=>(F8.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 (K2 _ _) M),W5,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 ((U4.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 (U4.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[F5];exact b7) (by rw[F5,d2];exact k1) (by rw[F5,d2];exact k2) (by rw[η,ύ,e3];simp only[kA,V2,Bool.or_true,ἁ,F5];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:=W3.mpr (K3.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 ⟨X5 c.1,c.2⟩] · rw[if_neg c,if_neg (fun x=>c ⟨N4 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:=O4 h;rw[Yr,if_neg (W3.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[V4,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,V4,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 W3.2 (K3.1 hk))];simp only[show¬(J0 i)<(J0 e) from W3.2 (K3.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,γ ((K4 _ _).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▸(K4 _ _).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,V4,hk,BK])).1,(j _ _ _ _ _ _ _ _ _ (by rw[m,V4,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 K2 _ _,by rw[hq,bw];exact Ϟ (X3 (ϊ _ (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 G5 ((by decide:146+900<=1047).trans a1) have c1:(lq (eF v.toBits-900))<=398:=by rw[h9];exact M8 (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[S8,G7] have a6:(q:ℚ)*2^e<(if s then-y else y):=Rat.cast_lt.1 (((J7 _ _).trans (congrArg₂ (·*·) (T7 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 ((J7 _ _).trans (congrArg₂ (·*·) ((Rat.cast_add _ _).trans (congrArg₂ (·+·) (T7 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 (M3 _) 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)):=U4.2 a1 have n2:((lq (eF v.toBits)):ℤ)<=((1298:ℕ):ℤ):=U4.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[F5];exact b7) (by rw[F5,d2];exact k1) (by rw[F5,d2];exact k2) (by rw[η,ύ,hq];simp only[kA,V2,Bool.or_true,ἁ,F5,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) (L3 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=>L6 hd.1 (congrArg mJ q) have hs:(sv d:ℝ)=(kM d:ℝ):=by rw[sv,hd.2.2,if_neg lN,M5] 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:Ἀ):=(X3 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 (E6 hp hq) (N2 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 (U4.mp h')),hc,pO ((V1 T 2).trans (X4 (O8 h)))]⟩ obtain⟨w,q⟩:=wq have k1':(G:ℤ)+K<=Sn:=U4.mpr k1 have k2':(G:ℤ)+(X+Q)<=Sn:=U4.mpr k2 have k4':(Dd:ℤ)+Q=1054:=congrArg Int.ofNat k4 have w':(Sn:ℤ)<=T+25:=U4.mpr w have a2':(T:ℤ)<=1298:=U4.mpr a2 have hG':(G:ℤ)<=255:=U4.mpr (J2 hG) have hD':(Dd:ℤ)<=255:=U4.mpr (J2 hD) have Aμ:A<=μ:=(Int.le_sub_right_of_add_le ((Int.le_add_of_sub_right_le k3).trans (T8 (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 _ (W6 G)).trans (w'.trans (T8 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 (T8 μ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:=T8 ((Int.sub_le_self _ (W6 _)).trans hG') 1 exact⟨(L1 (X4 hX) 23).trans (by decide),(by decide:1<=22).trans (K2 22 Dd),(L1 (J2 hG) 23).trans (by decide),(L1 (X4 hB) 23).trans (by decide),q,U4.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[O6];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[O6,<-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,J7,S8,Rat.cast_intCast,G7,<-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,J7,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 (F8.2 z) rw[<-Model.sign_eq_signBit_of_toDyadic?_some hd] refine F8.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 (W7 v)/\Dense.F.rv (W7 v)=ns kC (O2 (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) (W6 _)) (Dense.F.bL 48 (2*kG w) 556 (J1 (U3 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) (M3 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∈B5 (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∈B5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))|<= 2*((k+m:ℕ):ℝ)*(1/2^(53:Ἀ))*(A+∑j∈B5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))+2*((k+m:ℕ):ℝ)*(1/2^(1075:Ἀ)):=by intro m;induction m with |zero=> intro i v A k hm hie hf hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (K3.1 hm) rw[nQs,dif_neg (by rw[ε,q];exact B4 _),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∈B5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)+∑j∈B5 ((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∈B5 ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=D8 (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,<-F7,hm,BK]) (by rw[i1];exact hl) af (add_nonneg hA tn) (by rw[X7];exact step) ((lO k 1 m).trans_le hk) (by rw[i1,add_assoc,<-hs];exact hb) rw[i1,show k+1+m=k+(m+1) from lO k 1 m,add_assoc,<-hs]at this;exact this lemma nD_w(Wr Z e:ℝ)(hZ:0kB x[j]!≠255)(he:kB eps≠255)(hs:0sq_nonneg _) have nb:(n:ℝ)<=2^(12:Ἀ):=(R5.2 hn2).trans_eq (by rw[I4,nZ]) have Tsb:Ts<=2^(568:Ἀ):=by have h0:=Finset.sum_le_card_nsmul (B5 (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) ((L5 _ _).trans_lt (by decide)) set q:ℝ:=((4503599627370496/n:ℕ):ℝ) with hq have q0:0<=q:=M3 _ have h52:((4503599627370496:ℕ):ℝ)=2^(52:Ἀ):=by rw[show (4503599627370496:ℕ)=2^(52:Ἀ) from rfl,I4,nZ] have hq1:(n:ℝ)*q<=2^(52:Ἀ):=by have h:=R5 (α:=ℝ)|>.2 (pr 4503599627370496 n) rw[Y4]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:(O2 (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)) (M3 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*N5 ((971-lb)<<<52)) let v:=nS2 x m lo hi z0 let D:=W7 (v*(((1:ἆ)<<<52)/n6).toInt64.toFloat+Dense.F.dw eps*nS201) let Dl:=p.2.toNat let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW ⟨m,nRi dW ed.toUInt64,nElK m (Aq (n+4)+1) Dl ed.toNat,(1054-ed.toNat).toUInt64, nOKs B (nLc n Dl (kB eps).toNat).toUInt64&&0gP n eps x g b (J0 i) (J0 j) else gP n eps x g b (J0 i) (J0 j) lemma nM_e(a r A t B u w k:ℝ)(u0:0<=u)(w0:0<=w)(k0:0<=k)(B0:0<=B)(ht:|t|<=B)(hA:|A|<=k*B) (sm:(k^(2:Ἀ)/2+k)*u<=1/4)(sw:k*w<=B/4) (H1:|a-A|<=(k^(2:Ἀ)/2+k)*B*u+k*w)(H2:|r-(a+t)|<=u*|a+t|+w): |r-(A+t)|<=((k+1)^(2:Ἀ)/2+(k+1))*B*u+(k+1)*w:=by have h:=AY (a+t) (A+t);rw[add_sub_add_right_eq_sub]at h have E2:=mul_le_mul_of_nonneg_left sm B0 have ua:=mul_le_mul_of_nonneg_left (show |a+t|<=(k+1)*B+B/2 by linear_combination h+Ag A t+hA+ht+H1+E2+sw) u0 have e3:=abs_sub_le r (a+t) (A+t);rw[add_sub_add_right_eq_sub]at e3 linear_combination e3+H2+H1+ua lemma nM_b_h1(P Q B:ℝ)(hP:P<=1/4*B)(hQ:Q<=B/4)(B0:0<=B):P+Q+B<=2*B:=by linear_combination hP+hQ+(1/2:ℝ)*B0 lemma nM_b(a A t B u w k:ℝ)(u0:0<=u)(B0:0<=B)(ht:|t|<=B)(hA:|A|<=k*B) (sm:(k^(2:Ἀ)/2+k)*u<=1/4)(sw:k*w<=B/4)(H1:|a-A|<=(k^(2:Ἀ)/2+k)*B*u+k*w):|a+t|<=(k+2)*B:= (Ag a t).trans ((add_le_add ((sub_le_iff_le_add'.1 (AY a A)).trans (add_le_add hA H1)) ht).trans (((add_assoc _ _ _).trans_le (add_le_add AP (nM_b_h1 _ _ _ ((mul_right_comm _ B u).trans_le (AE sm B0)) sw B0))).trans_eq (add_mul _ _ _).symm)) lemma nKb(w:kF)(h:kB w≠255):(mJ (kB w))<=254:=by have a:(mJ (kB w))<=255:=by show (mJ ((w>>>23)&&&0xFF))<=255;rw[Ξ];exact ϝ.trans (by decide) have b:(mJ (kB w))≠255:=fun q=>h (Β.1 (by rw[q];rfl)) omega lemma nS1_dl(x:(Ἂ Word))(e:Ἄ)(hX:∀j,j<(J0 e)->kB x[j]!≠255):∀m (i:Ἄ)(s:Ἅ)(Dl:ἆ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)->(lq Dl)<=254-> (lq Dl)<=(lq (nS1 x i e s Dl).2)/\(lq (nS1 x i e s Dl).2)<=254/\∀j,(J0 i)<=j->j<(J0 e)->(mJ (kB x[j]!))<=(lq (nS1 x i e s Dl).2):=by intro m;induction m with |zero=> intro i s Dl hm hie hD have q:=not_lt.2 (K3.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,V4,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 (K3.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,V4,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∈B5 (J0 i) (J0 e),(sv x[j]!:ℝ)*2^kG x[j]!)|<=(((k+m:ℕ):ℝ)^(2:Ἀ)/2+((k+m:ℕ):ℝ))*B*(1/2^(53:Ἀ))+((k+m:ℕ):ℝ)*(1/2^(1075:Ἀ)):=by have Bp:(0:ℝ)<=B:=AZ (by norm_num) B0 intro m;induction m with |zero=> intro i s Dl A k hm hie hf hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (K3.1 hm) rw[nS1,dif_neg (by rw[ε,q];exact B4 _),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:=M3 k have sm:((k:ℝ)^(2:Ἀ)/2+k)*(1/2^(53:Ἀ))<=1/4:=by have h1:(k:ℝ)^(2:Ἀ)<=2^(12:Ἀ)*2^(12:Ἀ):=by rw[sq];exact mul_le_mul kk kk k0 (by norm_num) have h2:((k:ℝ)^(2:Ἀ)/2+k)<=2^(23:Ἀ)+2^(12:Ἀ):=by linear_combination h1/2+kk exact (AE h2 (nN 53)).trans (by norm_num) have sw:(k:ℝ)*(1/2^(1075:Ἀ))<=B/4:=by have h1:(k:ℝ)*(1/2^(1075:Ἀ))<=2^(12:Ἀ)*(1/2^(1075:Ἀ)):=AE kk (nN _) have h2:(2:ℝ)^(12:Ἀ)*(1/2^(1075:Ἀ))<=1:=nP 12 1075 (by decide) exact h1.trans (h2.trans (by linear_combination B0/4)) have ab:=nM_b (Dense.F.rv s) A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) Bp ht hA sm sw he have bd:|Dense.F.rv s+Dense.F.rv (Dense.F.dw x[(J0 i)]!)|<=(2:ℝ)^(971:ℤ):=by rw[tr,zpow_ofNat];refine ab.trans ((mul_le_mul_of_nonneg_left B1 (by linear_combination k0)).trans ?_) have h1:((k:ℝ)+2)*2^(300:Ἀ)<=2^(13:Ἀ)*2^(300:Ἀ):=AE (by linear_combination kk) (by positivity) exact h1.trans (by rw[<-AF];exact AU one_le_two (by decide)) obtain⟨af,ae⟩:=NF.fA _ _ hf tf bd rw[tr]at ae have step:=nM_e _ _ A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) (nN _) k0 Bp ht hA sm sw he (ae.trans_eq (by rw[one_div_mul_eq_div])) have hA2:|A+(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!|<=((k+1:ℕ):ℝ)*B:=by rw[X7,add_one_mul];exact (Ag _ _).trans (add_le_add hA ht) have:=ih (i+1) _ (if Dlhb j (X5 (i1.symm.le.trans h1)) h2) rw[i1,pA k 1 m,Τ 1 m,add_assoc,<-hs]at this;exact this lemma nMn(s Q Ri m n B u w L2:ℝ)(n4:4<=n)(B0:0<=B)(u0:0<=u)(w0:0<=w)(hQ:|Q|<=B) (hs:|s-n*Q|<=(n^(2:Ἀ)/2+n)*B*u+n*w)(R0:0<=Ri)(hR1:n*Ri<=1)(hR2:1-4*u<=n*Ri) (hm:|m-s*Ri|<=u*|s*Ri|+w)(sm:(n/2+5)*u<=1/8)(sw:w<=B*u/8)(hL:n+5<=L2): |m-Q|<=L2*B*u:=by have id:Q-s*Ri=Q*(1-n*Ri)+(n*Q-s)*Ri:=by ring have n0:(0:ℝ)<=n:=zero_le_four.trans n4 have r0:(0:ℝ)<=1-n*Ri:=sub_nonneg.2 hR1 have t1:|Q*(1-n*Ri)|<=B*(4*u):=by rw[Ae,Ad r0];exact mul_le_mul hQ (sub_le_comm.1 hR2) r0 B0 have t2:|(n*Q-s)*Ri|<=(n/2+1)*B*u+w:=by rw[Ae,Aw,Ad R0] have e:(n^(2:Ἀ)/2+n)*B*u+n*w=n*((n/2+1)*B*u+w):=by ring have p0:0<=(n/2+1)*B*u+w:=add_nonneg (Af (Af (add_nonneg (div_nonneg n0 zero_le_two) zero_le_one) B0) u0) w0 exact (AE (hs.trans_eq e) R0).trans ((mul_right_comm _ _ _).trans_le (mul_le_of_le_one_left p0 hR1)) have d1:|s*Ri-Q|<=B*(4*u)+((n/2+1)*B*u+w):=by rw[Aw,id];exact (Ag _ _).trans (add_le_add t1 t2) have e1:=AE sm B0 have u1:u<=1:=(le_mul_of_one_le_left u0 (le_add_of_nonneg_of_le (div_nonneg n0 zero_le_two) (by norm_num:(1:ℝ)<=5))).trans (sm.trans (by norm_num)) have e0:B*u<=B:=mul_le_of_le_one_right B0 u1 have d2:B*(4*u)+((n/2+1)*B*u+w)<=B/4:=by linear_combination e1+sw+(1/8)*e0 have sr:|s*Ri|<=B+B/4:=(sub_le_iff_le_add'.1 (AY (s*Ri) Q)).trans (add_le_add hQ (d1.trans d2)) have F:=(abs_sub_le m (s*Ri) Q).trans (add_le_add (hm.trans (add_le_add (mul_le_mul_of_nonneg_left sr u0) AP)) d1) have e2:(n+5)*B*u<=L2*B*u:=AE (AE hL B0) u0 have e7:=Af B0 u0 have e4:=AE n4 e7 exact F.trans (by linear_combination e2+2*sw+(1/2)*e4+(1/2)*e7) lemma nR1(n:Ἀ)(h1:1<=n)(h2:n<=2048): (lq (((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n))=2^(52+Aq n)/n/\2^(Aq n)<=n/\n<2^(Aq n+1)/\Aq n<=11:=by have hn:=L6 h1 have l3:Aq n<=11:=J2 ((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,O6] rw[γ (AO l3 (by decide)),γ (show 52<2^(64:Ἀ) by decide),γ (AO c (by decide))] rw[ml,a];simp only[ψ,b,pS] rw[γ (Z4 c),na,γ (lu Nat.one_lt_two (Z4 c))] lemma nMeq(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(hn:0z/n) (ϔ rfl fun j _=>h2 _) section open NF Dense.F NE lemma nPwF(f:ἆ)(h1:1<=(lq f))(h2:(lq f)<=2046): (lq (((f<<<52)>>>52)&&&2047))=(lq f)/\((f<<<52)>>>63!=0)=false/\(lq ((f<<<52)&&&0xfffffffffffff))=0:=by have m:(lq f)*2^(52:Ἀ)<=2046*2^(52:Ἀ):=ι _ h2 have q:(lq (f<<<52))=(lq f)*2^(52:Ἀ):=by rw[ψ];simp only[kA,ο,kH];exact γ (m.trans_lt (by decide)) have d:(lq ((f<<<52)>>>52))=(lq f):=by rw[ν,q];simp only[β,kA,kH];exact 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 (N5 (f<<<52))/\rv (N5 (f<<<52))=(2:ℝ)^(((lq f):ℤ)-1023):=by obtain⟨f1,f2,f3⟩:=nPwF f h1 h2 have ne:=R8 (Z4 h2) have K:kI (N5 (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:=K6 (Z4 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 (L6 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[M5,zpow_neg,AA,zpow_ofNat] have p:(0:ℝ)<2^k:=pow_pos two_pos k rw[Ad (Af (M3 z) (inv_nonneg.2 p.le))] exact (mul_le_of_le_one_right (M3 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*N5 ((971-(Aq n).toUInt64)<<<52))/\ Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*N5 ((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[Ϣ,O6];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[Ϣ,O6];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 G5 ((J1 l3 1).trans (by decide))) (by rw[pt];exact (K4 _ _).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)),W5];ring have r1:((2^(52+Aq n)/n:ℕ):ℝ)<=2^(52:Ἀ):=by have:=(R5 (α:=ℝ)).2 R2;rwa[I4,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 (U4.2 ((J1 l3 52).trans (by decide)))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,zpow_neg,AA,M5,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*N5 ((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*N5 ((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:=U2 (K2 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]) (U2 (B3 (Κ n)) (U2 hn (N2 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 (K2 23 Dl) have B1:(2:ℝ)^(Dl+23)<=2^(300:Ἀ):=AU one_le_two (U2 (L1 d2 23) (N2 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∈B5 (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▸(K8 _ _).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*N5 ((971-(Aq n).toUInt64)<<<52)):=by rw[rir];exact div_nonneg (M3 _) P0.le have nR1:=(R5 (α:=ℝ)).2 (hR1d▸pr (2^(52+Aq n)) n) rw[Y4,I4,nZ]at nR1 have hR1:(n:ℝ)*Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*N5 ((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[Y4,I4,nZ,W5,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*N5 ((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*N5 ((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 [W5,I4,nZ] using (R5 (α:=ℝ)).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,←W5,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∈B5 (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∈B5 (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 (R6 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 (R6 8) Y0))) have YY:Y*Y<=2^(604:Ἀ):=(mul_le_mul Y1 Y1 Y0 (pow_pos two_pos _).le).trans_eq (by rw[<-AF]) have YY0:0<=Y*Y:=Af Y0 Y0 have u0:=nN 53 have u1:(1:ℝ)/2^(53:Ἀ)<=1:=div_le_one_of_le₀ (one_le_pow₀ one_le_two) (pow_pos two_pos _).le have w0:=nN 1075 have w2:(1:ℝ)/2^(1075:Ἀ)<=1:=div_le_one_of_le₀ (one_le_pow₀ one_le_two) (pow_pos two_pos _).le intro M;induction M with |zero=> intro i v A k hM hie hf A0 hA he hk hb have q:(J0 i)=(J0 e):=C4 hie (K3.1 hM) rw[nS2,dif_neg (by rw[ε,q];exact B4 _),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:=M3 k obtain⟨df,de⟩:=fSb _ m tf hm (by rw[tr,zpow_ofNat];exact hy.trans (Y1.trans (AU one_le_two (by decide)))) rw[tr]at de generalize hyd:(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!-Dense.F.rv m=y at de hy generalize Dense.F.dw x[(J0 i)]!-m=dF at df de ⊢ have hd:|Dense.F.rv dF-y|<=(1/2^(53:Ἀ))*|y|+1/2^(1075:Ἀ):=by rw[one_div_mul_eq_div];exact de have uy:(1/2^(53:Ἀ))*|y|<=|y|:=mul_le_of_le_one_left (Aa _) u1 have aD:|Dense.F.rv dF|<=2^(304:Ἀ):=by have yP:|y|<=2^(302:Ἀ):=hy.trans Y1 rw[A4,A4,mul_two,mul_two] exact (sub_le_iff_le_add.1 (AY _ y)).trans (add_le_add (hd.trans (add_le_add (uy.trans yP) (w2.trans q1))) (yP.trans (le_add_of_nonneg_left (pow_pos two_pos _).le))) have aDD:|Dense.F.rv dF*Dense.F.rv dF|<=(2:ℝ)^(971:Ἁ):=by rw[Ae,zpow_ofNat];exact (mul_le_mul aD aD (Aa _) (pow_pos two_pos _).le).trans (by rw[<-AF];exact AU one_le_two (by decide)) obtain⟨ddf,dde⟩:=NF.fM dF dF df df aDD have yy:y*y<=Y*Y:=by rw[<-abs_mul_abs_self y];exact mul_le_mul hy hy (Aa _) Y0 have y0:=mul_self_nonneg y have Ht:=nV_t y (Dense.F.rv dF) (Dense.F.rv (dF*dF)) (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) Y u0 u1 w0 w2 hy hd (by rw[one_div_mul_eq_div];exact dde) have k16:10*(k:ℝ)<=2^(16:Ἀ):=(AE (by norm_num:(10:ℝ)<=2^(4:Ἀ)) k0).trans ((mul_le_mul_of_nonneg_left kk (pow_pos two_pos _).le).trans_eq (by rw[<-AF])) have kW:10*(k:ℝ)*((8*Y+3)*(1/2^(1075:Ἀ)))<=1:=by have:=mul_le_mul k16 W1 W0 (pow_pos two_pos _).le exact this.trans (by rw[<-Ap,<-AF];exact nP _ _ (by decide)) have ku:10*(k:ℝ)*(1/2^(53:Ἀ))<=1:=(AE k16 u0).trans (nP 16 53 (by decide)) have kuA:10*(k:ℝ)*(1/2^(53:Ἀ))*A<=A:=mul_le_of_le_one_left A0 ku have Ab:A<=2^(616:Ἀ):=hA.trans ((mul_le_mul kk YY YY0 (pow_pos two_pos _).le).trans_eq (by rw[<-AF])) have Y6:(2:ℝ)^(604:Ἀ)<=2^(616:Ἀ):=AU one_le_two (by decide) have q6:(1:ℝ)<=2^(616:Ἀ):=one_le_pow₀ one_le_two have av:|Dense.F.rv v|<=A+(10*k*(1/2^(53:Ἀ))*A+10*k*((8*Y+3)*(1/2^(1075:Ἀ)))):=by have:=AY (Dense.F.rv v) A;rw[Ad A0]at this;exact sub_le_iff_le_add'.mp (this.trans he) have u7:7*(1/2^(53:Ἀ):ℝ)*(y*y)<=y*y:=mul_le_of_le_one_left y0 ((AE (by norm_num:(7:ℝ)<=2^(3:Ἀ)) u0).trans (nP 3 53 (by decide))) have W2:(8*Y+3)*(1/2^(1075:Ἀ):ℝ)<=1:=W1.trans (nP _ _ (by decide)) have ad:|Dense.F.rv (dF*dF)|<=y*y+(7*(1/2^(53:Ἀ))*(y*y)+(8*Y+3)*(1/2^(1075:Ἀ))):=by have:=AY (Dense.F.rv (dF*dF)) (y*y);rw[Ad y0]at this;exact sub_le_iff_le_add'.mp (this.trans Ht) have aS:|Dense.F.rv v+Dense.F.rv (dF*dF)|<=(2:ℝ)^(971:Ἁ):=by rw[zpow_ofNat] have BB:=nS2_s_h1 _ (pow_pos two_pos 616).le have yB:y*y<=2^(616:Ἀ):=yy.trans (YY.trans Y6) refine (Ag _ _).trans ((add_le_add ((av.trans (add_le_add Ab (add_le_add (kuA.trans Ab) (kW.trans q6)))).trans BB) ((ad.trans (add_le_add yB (add_le_add (u7.trans yB) (W2.trans q6)))).trans BB)).trans ?_) rw[<-mul_two,<-mul_two,<-mul_two,<-A4,<-A4,<-A4];exact AU one_le_two (by decide) obtain⟨rf,re⟩:=NF.fA v (dF*dF) hf ddf aS have H2:|Dense.F.rv (v+dF*dF)-(Dense.F.rv v+Dense.F.rv (dF*dF))|<=(1/2^(53:Ἀ))*|Dense.F.rv v+Dense.F.rv (dF*dF)|+(8*Y+3)*(1/2^(1075:Ἀ)):=by rw[one_div_mul_eq_div];exact re.trans (add_le_add AP w1) have step:=nV_e _ _ A (y*y) _ (1/2^(53:Ἀ)) ((8*Y+3)*(1/2^(1075:Ἀ))) k u0 W0 A0 y0 k0 ((AE ((mul_add 10 (k:ℝ) 1).trans_le ((add_le_add k16 (by norm_num:(10:ℝ)*1<=2^(16:Ἀ))).trans_eq (by rw[<-mul_two,<-A4]))) u0).trans (nP 17 53 (by decide))) he Ht H2 have hA2:A+y*y<=((k+1:ℕ):ℝ)*(Y*Y):=by rw[X7,add_one_mul];exact add_le_add hA yy have:=ih (i+1) (v+dF*dF) (A+y*y) (k+1) (by rw[i1,V4,hM,BK]) (i1.le.trans (l7 hl)) rf (add_nonneg A0 y0) hA2 (by rw[X7];exact step) (by rw[pA,Τ 1 M];exact hk) (fun j h1 h2=>hb j (X5 (i1.symm.le.trans h1)) h2) rw[<-hyd,i1,pA k 1 M,Τ 1 M,add_assoc,<-hs]at this;exact this section open NF Dense.F NE end lemma nXHm(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(eps:kF)(hn:0ℝ)(M mr:ℝ)(h:∑j∈s,f j=s.card*M): ∑j∈s,(f j-mr)*(f j-mr)=∑j∈s,(f j-M)^(2:Ἀ)+s.card*((mr-M)*(mr-M)):=by simp only[nTm_h1 _ mr M] rw[nF,nJ,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 (L5 _ _) (by norm_num) rw[ml,a];simp only[Ϣ,O6,γ 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 (R6 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 (K2 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:=J2 ((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 (U4.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 (M3 _) (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∈B5 (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∈B5 (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:=D8 (fun _ _=>mul_self_nonneg _) have Tmb:Tm<=n*(Y*Y):=by have h:=Finset.sum_le_card_nsmul (B5 (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 (R6 _) 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) ((L5 _ _).trans_lt (Nat.pow_lt_pow_succ (by decide))) have q0:0<=((2^(52:Ἀ)/n:ℕ):ℝ):=M3 _ 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 _)) (M3 _)) (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 γ ((X3 f1 _).trans (by decide)) generalize hM:(mJ f)+2^(23:Ἀ)=M at mE have M1:2^(23:Ἀ)<=M:=hM▸K2 _ _ have M2:M<2^(24:Ἀ):=hM▸(X3 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 (U2 (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[I4,nZ]at this have q:=Dense.F.aE _ _ rf pf (R:ℤ) (-(((74+(lq ed)):ℕ):ℤ)) (by rw[rr,pr,ez,M5]) (by rw[Int.natAbs_cast];exact R2.trans_lt (by decide)) (Int.neg_le_neg (U4.2 ((J1 he 74).trans (by decide)):((74+(lq ed):ℕ):ℤ)<=((1074:ℕ):ℤ))) (nZb _ _ r1) refine⟨q.1,?_⟩;rw[q.2,M5] 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:=R5 (α:=ℝ)|>.2 a1n;rwa[Y4,I4,nZ]at this have a2:(2:ℝ)^(75:Ἀ)<=Q*M+M:=by have:=R5 (α:=ℝ)|>.2 a2n.le;rwa[W5,Y4,I4,nZ]at this have a3:(M:ℝ)<=2^(24:Ἀ):=by have:=R5 (α:=ℝ)|>.2 M2;rwa[I4,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) (K2 _ _)) ((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:0Z8 (ε.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*N5 ((971-lb)<<<52)) let v:=vf m let D:=W7 (v*(((1:ἆ)<<<52)/n6).toInt64.toFloat+Dense.F.dw eps*nS201) let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW ⟨m,nRi dW ed.toUInt64,nElK m (Aq (n+4)+1) Dl.toNat ed.toNat,(1054-ed.toNat).toUInt64, nOKs B (nLc n Dl.toNat (kB eps).toNat).toUInt64&&0nS2 x m (G0 (r*n)) (G0 (r*n+n)) (I0 (0:Ἀ)).toInt64.toFloat) (Thunk.mk (λ_=>NR.eI n (gM n eps x r))):=by unfold nLR;rw[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,O6] rw[γ h,γ (C0 (L5 _ _) (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*N5 ((971-ZR (I0 n))<<<52)∧nf=(((1:ἆ)<<<52)/I0 n).toInt64.toFloat∧ep=Dense.F.dw eps*nS201∧z0=(I0 (0:Ἀ)).toInt64.toFloat∧L=ZR (I0 (n+4))+1 @[inline]def nLQk{β:Type}(eps:Ἃ)(s:Ἅ)(Dl:ἆ)(vf:Ἅ->Ἅ)(rm nf ep:Ἅ)(L:ἆ)(k:Ἅ->Ἅ->ἆ->Ἃ->Ἆ->β):β:= let m:=s*rm let v:=vf m let D:=W7 (v*nf+ep) let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW k m (nRi dW ed.toUInt64) (nElK3 m L.toNat Dl.toNat ed.toNat) dW (nOKs B (nLc2 L.toNat Dl.toNat (kB eps).toNat).toUInt64&&0Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(hn:n<2^(32:Ἀ))(th:Thunk NR.fH)(k:Ἅ->Ἅ->ἆ->Ἃ->Ἆ->β):nLQk eps s Dl vf rm nf ep L k=k (nLQ n eps s Dl vf th).m (nLQ n eps s Dl vf th).ri (nLQ n eps s Dl vf th).Kp (nLQ n eps s Dl vf th).dW (nLQ n eps s Dl vf th).fast:=by obtain⟨h1,h2,h3,-,h4⟩:=hC;subst h1 h2 h3 h4 rw[kZ0 n (by omega),kZ1 (n+4) (by omega)] have h63:Aq (n+4)+1<2^(63:Ἀ):=C0 (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 (K2 _ _) 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 (I3 _) ((E7 _).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 (K2 _ _) 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 Z4 (ϝ.trans (by decide)) @[inline]def nWF(a:(Ἂ Word)):ἀ×ByteArray:=(⟨a.map Dense.F.dw⟩,⟨a.map (fun (w:Word)=>((w>>>23)&&&255).toUInt8)⟩) lemma nWF_sp(a:(Ἂ Word)):(kS (nWF a).1)=a.size∧(∀t,t(nWF a).1.data[t]! =Dense.F.dw a[t]!)∧(nWF a).2.size=a.size∧∀t,t((nWF a).2.data[t]!).toUInt64=nfe a[t]!:=by refine⟨m0 ..,fun t ht=>?_,m0 ..,fun t ht=>?_⟩ · show (a.map Dense.F.dw)[t]! =_;rw[AB _ _ (by rw[m0];exact ht),AB a t ht,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 nWGo(g b:(Ἂ Word)):{v//v=nWF2 (g,b)}:=Dense.F.wcGet3 nK2eq (fun a b=>nK2eq_ok a b) nWS2 32 (g,b) (fun k=>k.1) def nWGs(g b:(Ἂ Word))(s:Ἂ (Dense.F.WcE nWF2))(i:Nat):{v//v=nWF2 (g,b)}:= if h:iwithPtrAddr g (fun p2=> if p1=p2 then (if hk:nK2eq s[i].k (g,b)=true then ⟨s[i].v,by rw[s[i].h,nK2eq_ok _ _ hk]⟩ else nWGo g b) else nWGs g b s (i+1)) (fun _ _=>Dense.F.wcSub _ _)) (fun _ _=>Dense.F.wcSub _ _) else nWGo g b termination_by s.size-i @[noinline]def nWG2(g b:(Ἂ Word)):(ἀ×ByteArray)×ἀ:=(nWGs g b (ST.Prim.Ref.get nWS2 (Void.mk ())).val 0).1 theorem nWG2_v(g b:(Ἂ Word)):nWG2 g b=nWF2 (g,b):=(nWGs g b _ 0).2 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[O3];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 (Z4 h.2.2.2) rows 0 (Dense.F.zPq (n+2)) (Ah (rows*n) 0) (Dense.F.zPs (n+2)).1 (by simp only[O3];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):=C4 ht (K3.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 (L6 hj)];exact hX j (by rw[q];exact hj) · rw[Dense.F.fuS _ _ _ _ _ (U1 (K6 (I3 _)) 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 (N4 (J2 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 (K2 _ _) 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):=O5.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 (U5 _)) 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 (K2 _ _) 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 (F8.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 (K2 _ _) 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 (F8.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 B4 r)];rfl |succ k ih=> intro r Xr out hr ho hk hos have kk:=nHk2 (n:=n) hk rw[Yr,if_pos (hk▸P5 (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 (U5 _)) 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 W3.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,J7,Rat.cast_neg,Rat.cast_pow,T7,G7]<;>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 ((K2 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 (B4 1)]at Y refine Eq.trans (nRow1_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only[O3];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[O3])).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,J2 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,J2 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 V6 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 (F8.mpr hX) have N:¬((O0 (#[]:(Ἂ Word)))==l*n)=ἃ:=by simp only[Array.size_empty,AQ];exact R8 (Ϯ 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:L4):Ἆ:= 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,T6,J5,Nat.div_self hc,n4] have e4:s.depthwise.opg=1:=by simp only[ExactRuntime.ConvShape.opg,J5,Nat.div_self hc] have e5:s.depthwise.cpg=1:=by simp only[T6,J5,Nat.div_self hc] simp only[Λ,e3,e4,F5] 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:L4)(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:L4)(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:L4):Ἆ:=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:L4)(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[Ν,X8,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:qU6 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:L4)(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:qU6 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, υ] def aDu (A B:Ἂ Word) (ka kb ea:Ἄ) (a1 b1 a2 b2:Word) (Bm pH pL nH nL:ἆ):ἆ:= if h:ka < ea then aDs2 (aGt A ka) (aGt B kb) Bm pH pL nH nL fun pH pL nH nL=>aDu A B (ka+1) (kb+1) ea a1 b1 a2 b2 Bm pH pL nH nL else aDs2 a1 b1 Bm pH pL nH nL fun pH pL nH nL=>aDs2 a2 b2 Bm pH pL nH nL fun pH pL nH nL=> 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:ἆ) (t:Nat) (ht:t < n) (pH pL nH nL:ἆ): Dense.dl fa fb n Bm t pH pL nH nL=aDs (fa t) (fb t) Bm pH pL nH nL fun pH pL nH nL=>Dense.dl fa fb n Bm (t+1) pH pL nH nL:=by rw [Dense.dl, if_pos ht]; rfl theorem aDle (fa fb:Nat → Word) (n:Nat) (Bm:ἆ) (t:Nat) (ht:¬ t < n) (pH pL nH nL:ἆ): Dense.dl fa fb n Bm t pH pL nH nL=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:ἆ): 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:ἆ):Dense.jG fa fb n t Bm=Bm:=by rw [Dense.jG, if_neg ht] theorem aFn (A:Ἂ Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 n=a1:=by simp [fA] theorem aFm (A:Ἂ Word) (ao n:Nat) (a1 a2:Word):fA A ao n a1 a2 (n+1)=a2:=by simp [fA] theorem aFl (A:Ἂ Word) (ao n:Nat) (a1 a2:Word) (t:Nat) (h:t < n):fA A ao n a1 a2 t=A[ao+t]!:=by simp [fA, h] theorem aJu_eq (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:Ἄ) (hA:A.size < kX) (hB:B.size < kX) (he:ea.toNat=ao+n) (hb:bo+n < kX): ∀ k t (ka kb:Ἄ) Bm,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aJs a2 b2 (aJs a1 b1 (aJu A B ka kb ea Bm))=Dense.jG (fA A ao n a1 a2) (fA B bo n b1 b2) (n+2) t Bm:=by have hs:=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 [ε, h1, he]; exact B4 _ 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 [ε, 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:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word) (ea:Ἄ) (Bm:ἆ) (hA:A.size < kX) (hB:B.size < kX) (he:ea.toNat=ao+n) (hb:bo+n < kX): ∀ k t (ka kb:Ἄ) pH pL nH nL,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aDu A B ka kb ea a1 b1 a2 b2 Bm pH pL nH nL=Dense.dl (fA A ao n a1 a2) (fA B bo n b1 b2) (n+2) Bm t pH pL nH nL:=by have hs:=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 [ε, h1, he]; exact B4 _ 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 [ε, 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 ad2x (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let r:=if n+2 < 262144 ∧ A.size ≤ 4294967295 ∧ B.size ≤ 4294967295 ∧ ao+n ≤ 4294967295 ∧ bo+n ≤ 4294967295 then aDu A B (C3 ao) (C3 bo) (C3 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 (aJu A B (C3 ao) (C3 bo) (C3 (ao+n)) 1023))) 0 0 0 0 else 4294967296 if r < 4294967296 then N3 r else dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2) theorem ad2x_eq (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word): ad2x A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2):=by unfold ad2x by_cases h:n+2 < 262144 ∧ A.size ≤ 4294967295 ∧ B.size ≤ 4294967295 ∧ ao+n ≤ 4294967295 ∧ bo+n ≤ 4294967295 · rw [if_pos h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=ς have hA':A.size < kX:=by omega have hB':B.size < kX:=by omega have he:(C3 (ao+n)).toNat=ao+n:=J3 (by omega) have h1:(C3 ao).toNat=ao+0:=J3 (by omega) have h2:(C3 bo).toNat=bo+0:=J3 (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:ἆ) (g:N < 262144) (h:Dense.dl fa fb N Bm 0 0 0 0 0 < 4294967296):dotOf N fa fb=N3 (Dense.dl fa fb N Bm 0 0 0 0 0):= Dense.fE fa fb N Bm (by exact I7 g) _ 0 0 0 0 0 rfl (by exact ϟ N) (λ_ h=>absurd h (by (clear * - h;omega))) ((by simp)) ((by simp)) (by simp[af]) h @[inline] def ad4 (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let r:=if n+2 < 262144 ∧ A.size ≤ 4294967295 ∧ B.size ≤ 4294967295 ∧ ao+n ≤ 4294967295 ∧ bo+n ≤ 4294967295 then aDu A B (C3 ao) (C3 bo) (C3 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 g)) 0 0 0 0 else 4294967296 if r < 4294967296 then N3 r else ad2x A B ao bo n a1 b1 a2 b2 theorem ad4_eq (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word): ad4 g A B ao bo n a1 b1 a2 b2=dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2):=by unfold ad4 by_cases h:n+2 < 262144 ∧ A.size ≤ 4294967295 ∧ B.size ≤ 4294967295 ∧ ao+n ≤ 4294967295 ∧ bo+n ≤ 4294967295 · rw [if_pos h] obtain ⟨h0,hA,hB,ha,hb⟩:=h have s:=ς have hA':A.size < kX:=by omega have hB':B.size < kX:=by omega have he:(C3 (ao+n)).toNat=ao+n:=J3 (by omega) have h1:(C3 ao).toNat=ao+0:=J3 (by omega) have h2:(C3 bo).toNat=bo+0:=J3 (by omega) rw [aDu_eq A B ao bo n a1 b1 a2 b2 _ _ hA' hB' he (by omega) n 0 _ _ 0 0 0 0 (by omega) (by omega) h1 h2] dsimp only split · rename_i hr; exact (aDok _ _ _ _ h0 hr).symm · exact ad2x_eq A B ao bo n a1 b1 a2 b2 · rw [if_neg h]; exact ad2x_eq A B ao bo n a1 b1 a2 b2 /-! (S5 11-11) GRU candidate/update and LSTM cell dots: the double sum of the exact products (`Dense.F.kE1`, term bound `Dense.F.kHG`), rounded through the window `Dense.F.ak` (`Dense.F.cw`); the exact path when the window or a guard fails. -/ theorem gqT (a b:Word):|(Core.tm a b:ℝ)| ≤ 2^(48+idxOf a+idxOf b):=by have A:∀ w:Word,|(sv w:ℝ)| ≤ 2^24:=fun w=>(show |(sv w:ℝ)|=mantOf w by unfold sv; split_ifs <;> simp).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) unfold Core.tm; push_cast calc |(sv a:ℝ)*sv b*2^(idxOf a+idxOf b)|=|(sv a:ℝ)| * |(sv b:ℝ)| * 2^(idxOf a+idxOf b):=by rw [Ae,Ae,AW (show (0:ℝ) < 2^(idxOf a+idxOf b) by positivity)] _ ≤ 2^24*2^24*2^(idxOf a+idxOf b):=by gcongr <;> exact A _ _=2^(48+idxOf a+idxOf b):=by rw [← AF,← AF]; congr 1; omega theorem gqI {w:Word} (h:idxOf w ≤ 253):expOf w ≠ 255:=by intro e; simp [idxOf,e] at h theorem gqE {w:Word} (h:(expOf w).toNat ≤ 254):expOf w ≠ 255:=by intro e; simp [e] at h theorem gqW (n:ℕ) (d e:ℕ → Word) (p:ℕ → Ἅ) (h0:Ἅ) (P L:ℕ) (K:∀ s < n,Dense.F.fv (p s)∧Dense.F.rv (p s)=Core.tm (d s) (e s)) (q:Dense.F.fv h0∧Dense.F.rv h0=Core.tm (d n) (e n)) (E:∀ s ≤ n,|(Core.tm (d s) (e s):ℝ)| ≤ 2^P) (N:n+2 ≤ 2^L) (D:L ≤ 27) (J:P+L ≤ 425) (g:Core.aG (n+1) d e) (c:Dense.F.ak (Dense.F.ao p n 0 h0) (lh (P+2*L-54)) < 4294967296) : N3 (Dense.F.ak (Dense.F.ao p n 0 h0) (lh (P+2*L-54)))=dotOf (n+1) d e:=by obtain ⟨f,r⟩:=Dense.F.kE1 n d e p h0 P L K q E N D J have hq:(lh (P+2*L-54)).toNat=P+2*L-54:=Α (by unfold n0; omega) have hL:(n:ℝ)+1 ≤ 2^L:=by exact_mod_cast (show n+1 ≤ 2^L by omega) have hA:|(Core.af (n+1) d e:ℝ)| ≤ (2:ℝ)^(425:ℤ):=by unfold Core.af; push_cast calc |∑ k ∈ kP (n+1),(Core.tm (d k) (e k):ℝ)| ≤ ∑ k ∈ kP (n+1),|(Core.tm (d k) (e k):ℝ)|:= K8 _ _ _ ≤ ∑ k ∈ kP (n+1),(2:ℝ)^P:=Finset.sum_le_sum fun k hk=>E k (Nat.lt_succ_iff.1 (ϥ.1 hk)) _=((n:ℝ)+1)*2^P:=by simp _ ≤ 2^L*2^P:=by gcongr _ ≤ (2:ℝ)^(425:ℤ):=by rw [← AF,← AA]; exact AG one_le_two (by omega) exact Dense.F.cw (n+1) d e g _ f _ (by rw [hq]; norm_num; omega) (by rw [hq]; exact r) hA c theorem gqB (n:ℕ) (d e:ℕ → Word) (p:ℕ → Ἅ) (i E L:ℕ) (u v:Word) (hu:d (n+1)=u) (hv:e (n+1)=v) (hp:∀ s < n+1,p s=Dense.F.dw (d s)*Dense.F.dw (e s)) (hb:∀ s < n+1,idxOf (d s) ≤ i∧(expOf (e s)).toNat ≤ E) (hi:i ≤ 253) (hE:E ≤ 254) (ha:expOf u ≠ 255) (hc:expOf v ≠ 255) (N:n+3 ≤ 2^L) (D:L ≤ 27) (J:max (48+i+max (E-1) 55) (48+idxOf u+idxOf v)+L ≤ 425) (c:Dense.F.ak (Dense.F.ao p (n+1) 0 (Dense.F.dw u*Dense.F.dw v)) (lh (max (48+i+max (E-1) 55) (48+idxOf u+idxOf v)+2*L-54)) < 4294967296) : UInt64.toUInt32 (Dense.F.ak (Dense.F.ao p (n+1) 0 (Dense.F.dw u*Dense.F.dw v)) (lh (max (48+i+max (E-1) 55) (48+idxOf u+idxOf v)+2*L-54)))=dotOf (n+2) d e:=by subst hu hv have hE':(lA E).toNat=E:=UInt32.toNat_ofNat_of_lt' (by unfold UInt32.size; omega) have K:=Dense.F.kHG (n+1) d e (lA E) i (48+idxOf (d (n+1))+idxOf (e (n+1))) (fun s hs=>(hb s hs).1) (fun s hs=>by rw [hE']; exact (hb s hs).2) (gqT _ _) rw [hE'] at K exact gqW (n+1) d e p _ _ L (fun s hs=>by rw [hp s hs]; exact Dense.F.dJ _ _ (gqI ((hb s hs).1.trans hi)) (gqE ((hb s hs).2.trans hE))) (Dense.F.dJ _ _ ha hc) K (by omega) D J (fun k hk=>by rcases Z6.1 hk with hk|hk · exact ⟨gqI ((hb k hk).1.trans hi),gqE ((hb k hk).2.trans hE)⟩ · subst hk; exact ⟨ha,hc⟩) c theorem gqL (p:ℕ → Ἅ) (n:ℕ):∀ k t a,n-t=k → t ≤ n → Dense.F.ao p (n+1) t a=Dense.F.ao p n t a+p n:=by intro k; induction k with | zero => intro t a hk ht; obtain rfl:t=n:=by omega rw [Dense.F.aos _ _ _ _ (I3 t),Dense.F.aoe _ _ _ _ AP,Dense.F.aoe _ _ _ _ AP] | succ k ih => intro t a hk ht; have h:t < n:=by omega rw [Dense.F.aos _ _ _ _ (by omega),Dense.F.aos _ _ _ _ h]; exact ih (t+1) _ (by omega) h /-- Exact fallbacks kept out of line: inlined, their `dotOf` closures were built before the branch. -/ @[noinline] def gqY (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad2x A B ao bo n a1 b1 a2 b2 @[noinline] def gqX (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad4 g A B ao bo n a1 b1 a2 b2 @[inline] def gq1 (n x y:Nat):Nat:=if n=1 then max x y else y @[inline] def gq2 (n:Nat) (h a b:Ἅ):Ἅ:=if n=1 then h+a*b else h /-- The fast path for `n ≤ 1` array terms (LSTM cell, GRU update): two or three products. -/ @[inline] def ad2 (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let a0:=if h:ao < A.size then A[ao] else 0 let b0:=if h:bo < B.size then B[bo] else 0 let i:=gq1 n (idxOf a0) (idxOf a1) let e:=gq1 n (expOf b0).toNat (expOf b1).toNat let P:=max (48+i+max (e-1) 55) (48+idxOf a2+idxOf b2) if n ≤ 1∧i ≤ 253∧e ≤ 254∧expOf a2 ≠ 255∧expOf b2 ≠ 255∧P+2 ≤ 425 then let o:=Dense.F.ak (gq2 n (Dense.F.dw a2*Dense.F.dw b2) (Dense.F.dw a0) (Dense.F.dw b0)+Dense.F.dw a1*Dense.F.dw b1) (lh (P+2*2-54)) if o < 4294967296 then o.toUInt32 else gqY A B ao bo n a1 b1 a2 b2 else gqY A B ao bo n a1 b1 a2 b2 theorem ad2_eq (A B:Ἂ 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 have e0:(if h:ao < A.size then A[ao] else 0)=A[ao+0]!:=by by_cases h:ao < A.size · rw [dif_pos h]; exact (AB A ao h).symm · rw [dif_neg h]; exact (An A ao h).symm have e1:(if h:bo < B.size then B[bo] else 0)=B[bo+0]!:=by by_cases h:bo < B.size · rw [dif_pos h]; exact (AB B bo h).symm · rw [dif_neg h]; exact (An B bo h).symm unfold ad2; dsimp only; rw [e0,e1] split · rename_i hc; obtain ⟨c0,c1,c2,c3,c4,c5⟩:=hc split · rename_i ho let p:ℕ → Ἅ:=fun s=>if s < n then Dense.F.dw A[ao+s]!*Dense.F.dw B[bo+s]! else Dense.F.dw a1*Dense.F.dw b1 have hS:gq2 n (Dense.F.dw a2*Dense.F.dw b2) (Dense.F.dw A[ao+0]!) (Dense.F.dw B[bo+0]!) +Dense.F.dw a1*Dense.F.dw b1=Dense.F.ao p (n+1) 0 (Dense.F.dw a2*Dense.F.dw b2):=by rcases (by omega:n=0∨n=1) with rfl|rfl · rw [Dense.F.aos _ _ _ _ (by omega),Dense.F.aoe _ _ _ _ AP]; simp [gq2,p] · rw [Dense.F.aos _ _ _ _ (by omega),Dense.F.aos _ _ _ _ (by omega),Dense.F.aoe _ _ _ _ AP]; simp [gq2,p] rw [hS] at ho ⊢ refine gqB n _ _ p _ _ 2 a2 b2 (by simp [fA]) (by simp [fA]) (fun s hs=>?_) (fun s hs=>?_) c1 c2 c3 c4 (by simp; omega) (by omega) c5 ho · rcases Z6.1 hs with hs|rfl · simp [p,fA,hs] · simp [p,fA] · rcases Z6.1 hs with hs|rfl · obtain rfl:n=1:=by omega obtain rfl:s=0:=by omega simp [fA,gq1] · simp only [fA,AX,if_false,if_true,gq1]; constructor <;> split <;> simp · exact ad2x_eq A B ao bo n a1 b1 a2 b2 · exact ad2x_eq A B ao bo n a1 b1 a2 b2 theorem gqH {A:ἀ} {i:Ἄ} (h:i < A.usize):i.toNat < A.size:=by have:=ε.mp h rw [FloatArray.usize,lX,USize.toNat_ofNat'] at this exact U1 this (Ay _ _) @[inline] def gqF (A:ἀ) (i:Ἄ):Ἅ:=if h:i < A.usize then A.uget i (gqH h) else 0 theorem gqV (A:ἀ) (i:Ἄ) (hA:A.size < kX) (h:i.toNat < A.size):gqF A i=A.data[i.toNat]!:=by have g:i < A.usize:=by rw [ε,FloatArray.usize,lX,USize.toNat_ofNat',γ hA]; exact h unfold gqF; rw [dif_pos g] rcases A with ⟨d⟩ simp only [nN] exact (AB d i.toNat h).symm def gqS (X W:ἀ) (i j e:Ἄ) (v:Ἅ):Ἅ:= if h:i < e then gqS X W (i+1) (j+1) e (v+gqF X i*gqF W j) else v termination_by e.toNat-i.toNat decreasing_by exact aUd h theorem gqS_eq (X W:ἀ) (p:ℕ → Ἅ) (xo wo n:ℕ) (e:Ἄ) (hX:X.size < kX) (hW:W.size < kX) (he:e.toNat=xo+n) (hx:xo+n ≤ X.size) (hw:wo+n ≤ W.size) (hp:∀ s < n,p s=X.data[xo+s]!*W.data[wo+s]!) : ∀ k t (i j:Ἄ) v,n-t=k → t ≤ n → i.toNat=xo+t → j.toNat=wo+t → gqS X W i j e v=Dense.F.ao p n t v:=by intro k; induction k with | zero => intro t i j v hk ht h1 h2; obtain rfl:t=n:=by omega have h0:¬ i < e:=by rw [ε,h1,he]; omega rw [gqS,dif_neg h0,Dense.F.aoe _ _ _ _ AP] | succ k ih => intro t i j v hk ht h1 h2 have htn:t < n:=by omega have h0:i < e:=by rw [ε,h1,he]; omega rw [gqS,dif_pos h0,Dense.F.aos _ _ _ _ htn,gqV X i hX (by omega),gqV W j hW (by omega),h1,h2,← hp t htn] exact ih (t+1) (i+1) (j+1) _ (by omega) (by omega) (by rw [aUs (by omega),h1]; rfl) (by rw [aUs (by omega),h2]; rfl) /-- Words decoded as doubles (`Dense.F.dw`), once per call. -/ def gqD (A:Ἂ Word):ἀ:=A.foldl (fun r w=>r.push (Dense.F.dw w)) (kJ A.size) theorem gqD_s (A:Ἂ Word):(gqD A).size=A.size∧∀ q < A.size,(gqD A).data[q]! =Dense.F.dw A[q]!:=by unfold gqD apply Array.foldl_induction (motive:=fun i (r:ἀ)=>r.size=i∧∀ q < i,r.data[q]! =Dense.F.dw A[q]!) · exact ⟨rfl,fun q h=>absurd h (U5 _)⟩ · intro i r ⟨h1,h2⟩ refine ⟨by rw [Dense.F.bW,h1],fun q hq=>?_⟩ rw [Dense.F.s5push_get] rcases Z6.1 hq with hq|rfl · rw [if_pos (h1 ▸ hq)]; exact h2 _ hq · rw [if_neg (by omega),if_pos h1.symm,AB A _ i.2]; rfl def gqM (A:Ἂ Word):Nat:=A.foldl (fun m w=>max m (idxOf w)) 0 theorem gqM_le (A:Ἂ Word) (q:Nat):idxOf A[q]! ≤ gqM A:=by by_cases hq:q < A.size · exact Array.foldl_induction (as:=A) (motive:=fun i (m:Nat)=>∀ q < i,idxOf A[q]! ≤ m) (fun q h=>absurd h (U5 _)) (fun i m h q hq=>by rcases Z6.1 hq with hq|rfl · exact (h q hq).trans (le_max_left _ _) · rw [AB A _ i.2]; exact le_max_right _ _) q hq · rw [An A q hq,show idxOf (default:Word)=0 by decide]; exact ϟ _ def gqN (A:Ἂ Word):Nat:=A.foldl (fun m w=>max m (expOf w).toNat) 0 theorem gqN_le (A:Ἂ Word) (q:Nat):(expOf A[q]!).toNat ≤ gqN A:=by by_cases hq:q < A.size · exact Array.foldl_induction (as:=A) (motive:=fun i (m:Nat)=>∀ q < i,(expOf A[q]!).toNat ≤ m) (fun q h=>absurd h (U5 _)) (fun i m h q hq=>by rcases Z6.1 hq with hq|rfl · exact (h q hq).trans (le_max_left _ _) · rw [AB A _ i.2]; exact le_max_right _ _) q hq · rw [An A q hq,show (expOf (default:Word)).toNat=0 by decide]; exact ϟ _ /-- The GRU candidate dot: `A`,`B` are `x`,`wih`, decoded once per call as `Xd`,`Wd`. -/ @[inline] def gqC (Xd Wd:ἀ) (ix E:Nat) (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:= let i:=max ix (idxOf a1) let e:=max E (expOf b1).toNat let L:=Aq (n+3)+1 let P:=max (48+i+max (e-1) 55) (48+idxOf a2+idxOf b2) if i ≤ 253∧e ≤ 254∧expOf a2 ≠ 255∧expOf b2 ≠ 255∧P+L ≤ 425∧L ≤ 27∧ao+n ≤ Xd.size∧bo+n ≤ Wd.size∧ Xd.size ≤ 4294967295∧Wd.size ≤ 4294967295 then let o:=Dense.F.ak (gqS Xd Wd (C3 ao) (C3 bo) (C3 (ao+n)) (Dense.F.dw a2*Dense.F.dw b2) +Dense.F.dw a1*Dense.F.dw b1) (lh (P+2*L-54)) if o < 4294967296 then o.toUInt32 else gqX g A B ao bo n a1 b1 a2 b2 else gqX g A B ao bo n a1 b1 a2 b2 theorem gqC_eq (x w:Ἂ Word) (ix E:Nat) (hi:∀ q:ℕ,idxOf x[q]! ≤ ix) (he:∀ q:ℕ,(expOf w[q]!).toNat ≤ E) (g:ἆ) (ao bo n:Nat) (a1 b1 a2 b2:Word) : gqC (gqD x) (gqD w) ix E g x w ao bo n a1 b1 a2 b2=dotOf (n+2) (fA x ao n a1 a2) (fA w bo n b1 b2):=by obtain ⟨sx,vx⟩:=gqD_s x; obtain ⟨sw,vw⟩:=gqD_s w unfold gqC; dsimp only split · rename_i hc obtain ⟨c1,c2,c3,c4,c5,c6,c7,c8,c9,c10⟩:=hc split · rename_i ho have s:=ς let p:ℕ → Ἅ:=fun s=>if s < n then (gqD x).data[ao+s]!*(gqD w).data[bo+s]! else Dense.F.dw a1*Dense.F.dw b1 have hS:gqS (gqD x) (gqD w) (C3 ao) (C3 bo) (C3 (ao+n)) (Dense.F.dw a2*Dense.F.dw b2) +Dense.F.dw a1*Dense.F.dw b1=Dense.F.ao p (n+1) 0 (Dense.F.dw a2*Dense.F.dw b2):=by have h1:(C3 ao).toNat=ao+0:=J3 (by omega) have h2:(C3 bo).toNat=bo+0:=J3 (by omega) rw [gqL p n n 0 _ (by omega) (ϟ _), gqS_eq (gqD x) (gqD w) p ao bo n _ (by omega) (by omega) (J3 (by omega)) c7 c8 (fun s hs=>if_pos hs) n 0 _ _ _ (by omega) (ϟ _) h1 h2] simp [p] rw [hS] at ho ⊢ refine gqB n _ _ p _ _ _ a2 b2 (by simp [fA]) (by simp [fA]) (fun s hs=>?_) (fun s hs=>?_) c1 c2 c3 c4 (ϙ (n:=n+3)).le c6 c5 ho · rcases Z6.1 hs with hs|rfl · simp only [p,fA,if_pos hs]; rw [vx _ (by omega),vw _ (by omega)] · simp [p,fA] · rcases Z6.1 hs with hs|rfl · simp only [fA,if_pos hs] exact ⟨(hi _).trans (le_max_left _ _),(he _).trans (le_max_left _ _)⟩ · simp only [fA,AX,if_false,if_true] exact ⟨le_max_right _ _,le_max_right _ _⟩ · exact ad4_eq g x w ao bo n a1 b1 a2 b2 · exact ad4_eq g x w ao bo n a1 b1 a2 b2 def gMn (A:Ἂ Word) (k e:Ἄ) (m:ἆ):ἆ:= if h:k < e then gMn A (k+1) e (let a:=aGt A k; if a &&& 0x7FFFFFFF==0 then m else min m (Core.iW a)) else m termination_by e.toNat-k.toNat decreasing_by exact aUd h @[noinline] def gG (inW H:Nat) (x wih:Ἂ Word):ἆ:= gMn x 0 x.usize 511+gMn wih (C3 (2*H*inW)) (C3 (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 (lx a * lx b).toBits else toWord (Model.mul (ofW a) (ofW b)) theorem mulN_eq (a b:Word):mulN a b=toWord (Model.mul (ofW a) (ofW b)):=by unfold mulN; split · rename_i h simp only [Η, AM, Ak] at h have g:=Bn.NativeAdd.bK a h.1 have j:=Bn.NativeAdd.bK b h.2 have e:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32_mul_of_isFinite (lx a) (lx b) g.2 j.2 simp only [FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32, Bn.NativeAdd.en, g.1, j.1] at e have E:=congrArg toWord e rw [← Bn.NativeAdd.en, Bn.NativeAdd.ja] at E exact E · rfl @[inline] def wcF (k:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἂ Word := wcat k.1.1 k.1.2.1 k.1.2.2 k.2.1 k.2.2.1 k.2.2.2 @[inline] def wcEq (a b:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἆ := a.1 == b.1 && 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) × Ἂ Word × Ἂ Word × Ἂ Word) (h:wcEq a b=true):a=b:=by obtain ⟨a1,a2,a3,a4⟩:=a; obtain ⟨b1,b2,b3,b4⟩:=b simp only [wcEq, Η, AQ] at h obtain ⟨⟨⟨h1,h2⟩,h3⟩,h4⟩:=h rw [h1, Dense.F.wcAeq_ok h2, Dense.F.wcAeq_ok h3, Dense.F.wcAeq_ok h4] @[noinline] def wcS:ST.Ref Unit (Ἂ (Dense.F.WcE wcF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wcG (G inW H:Nat) (wih whh bih:Ἂ Word):Ἂ 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:Ἂ 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 (gqC (gqD x) (gqD wih) (gqM x) (gqN wih) 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 [Ϗ,W8 hp,ώ hj1,ϑ] have e2:(i*(inW+H+1)+j)%(inW+H+1)=j:=by rw [Ϗ,O7,γ 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] theorem gqcand (adc:AdFn) (x wih:Ἂ Word) (hadc:∀ ao bo n a1 b1 a2 b2,adc x wih ao bo n a1 b1 a2 b2=dotOf (n+2) (fA x ao n a1 a2) (fA wih bo n b1 b2)) (tanh:Word → Word) (inW H:Nat) (bih:Ἂ Word) (t:Nat) (R HN:Ἂ Word) : (Array.ofFn (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]!) = 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 [hadc]; rfl 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 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) (sig tanh:Word → Word) (inW H:Nat) (x wih whh bih bhh:Ἂ Word) (hadc:∀ ao bo n a1 b1 a2 b2,adc x wih ao bo n a1 b1 a2 b2=dotOf (n+2) (fA x ao n a1 a2) (fA wih bo n b1 b2)) (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,gqcand adc x wih 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 (gqC (gqD x) (gqD wih) (gqM x) (gqN wih) (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 _ sig tanh inW H x wih whh bih bhh (gqC_eq x wih _ _ (gqM_le x) (gqN_le wih) _) 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:=J2 (Ϟ (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:=J2 (Ϟ (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=C7 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)=(V3 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:ℝ) ≤ |(L8 w:ℝ)| := by unfold L8; split_ifs <;> simp <;> exact_mod_cast Nat.one_le_iff_ne_zero.mpr hm calc (1:ℝ)=1*1:=by ring _ ≤ |(L8 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)))) (((V3 xw*V3 gw/V3 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))=(((V3 xw*V3 gw/V3 td:ℚ):ℝ)*2^(149:ℕ)):=by have hD0:(V3 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:C7 0=0:=by decide theorem za0 (w:Word) (h0:w<<<1=0):V3 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 L8; 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=C7 (V3 (Norm.ck x i)*V3 (Norm.ck g j)/V3 td):=by rw [Norm.nFBr_e]; unfold Norm.nOEr; dsimp only have p:(V3 (Norm.ck x i)-0)*V3 (Norm.ck g j)/V3 td + V3 0=V3 (Norm.ck x i)*V3 (Norm.ck g j)/V3 td:=by rw [Norm.Y1 0,(by decide:L8 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 C7 p).symm)).trans (congrArg C7 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 = C7 (V3 xw*V3 gw/V3 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 (C3 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:=(W7 (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 [O3,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+V3 eps)) (hd:0 < (kB td).toNat∧kB td≠255∧k9 td=false) (hd2:(kB td).toNat ≤ 170) (he1:ExactRuntime.finiteWord eps=true) (hepos:0 < V3 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 (C3 j)=a[j]! := fun a=>by rw [Norm.f6,J3 (usz j (by omega))] rw [elR x g _ td (C3 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 < L8 eps∧0 < V3 eps:=by have hm:0 < kM eps:=by unfold kM; rw [if_neg he0]; positivity have hs:0 < L8 eps:=by unfold L8; 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 (W7 ((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+V3 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 (W7 ((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 L8; 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,W5,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 _ (K5 hj2 hb:i < 2^(32:ℕ)), Conv.aa _ (U1 r (U2 (K2 n _) (X4 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 cbGo (b:Ἂ Word):{v//v=cbF b}:=Dense.F.wcGet3 Dense.F.wcAeq (fun a c h=>Dense.F.wcAeq_ok h) cbS 32 b (fun k=>k) def cbGs (b:Ἂ Word) (s:Ἂ (Dense.F.WcE cbF)) (i:Nat):{v//v=cbF b}:= if h:iwithPtrAddr b (fun p2=> if p1=p2 then (if hk:Dense.F.wcAeq s[i].k b=true then ⟨s[i].v,by rw [s[i].h,Dense.F.wcAeq_ok hk]⟩ else cbGo b) else cbGs b s (i+1)) (fun _ _=>Dense.F.wcSub _ _)) (fun _ _=>Dense.F.wcSub _ _) else cbGo b termination_by s.size-i @[noinline] def cbG (b:Ἂ Word):Ἂ Word:=(cbGs b (ST.Prim.Ref.get cbS (Void.mk ())).val 0).1 theorem cbG_v (b:Ἂ Word):cbG b=cbF b:=(cbGs b _ 0).2 theorem cbG_sp (b:Ἂ Word) (n:ℕ) (sb:b.size=n) : ∀ j,j < n → (cbG b)[j]! = roundRational (rationalWord b[j]!):=by intro j hj rw [cbG_v,cbF,AB _ j (by rw [m0]; omega),Array.getElem_map,AB b j (by omega)] theorem cB (n:ℕ) (eps:Word) (x g b:Ἂ Word) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hos:out.size < 2^(32:ℕ)) (hX : ∀ j,j < r*n+n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hN:(4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (hcb : ∀ j,j < n → cb[j]! = roundRational (rationalWord b[j]!)) (hc:(Norm.nfe (Norm.ck x (G0 (r*n))) < 255&&cQ x (Norm.ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true) : Norm.Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out = 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 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:ℕ):=K5 hk.2 hb have hsub:G0 k-G0 (r*n)=G0 (k%n):=by apply O5.1 rw [USize.toNat_sub_of_le _ _ (by rw [U8,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 theorem cBb (n:ℕ) (x:Ἂ Word) (r:ℕ) (hb:r*n+n < 2^(32:ℕ)) (j:ℕ) (j1:r*n ≤ j) (j2:j < r*n+n) (hj:expOf x[j]! = 255) (hc:(Norm.nfe (Norm.ck x (G0 (r*n))) < 255&&cQ x (Norm.ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true) : False:=by simp only [Η,AJ] at hc obtain ⟨hf0,hq⟩:=hc have q1:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*n+n)).toNat=r*n+n:=Conv.aa _ hb rcases cQ_spec x _ _ _ _ rfl hq j (by rw [q1]; exact j1) (by rw [q3]; exact j2) with e | ⟨e1, -⟩ · rw [e] at hj; exact nfeL _ hf0 hj · rw [ez0 _ e1] at hj; exact absurd hj (by decide) @[inline] def cRow (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC: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 · exact cB n eps x g b cb r out ho hb hos hX heps hN F D hcb (by assumption) · 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 · exact (cBb n x r hb j j1 j2 hj (by assumption)).elim · 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 B4 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 ▸ P5 (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 theorem s1S {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {Dl:ἆ} (h:i < e) : Norm.nS1 x i e s Dl=Norm.nS1 x (i+1) e (s+Dense.F.dw (Norm.ck x i)) (if Dl < Norm.nfe (Norm.ck x i) then Norm.nfe (Norm.ck x i) else Dl):=by rw [Norm.nS1.eq_def x i e s Dl]; simp only [dif_pos h] theorem s1E {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {Dl:ἆ} (h:¬i < e) : Norm.nS1 x i e s Dl=(s,Dl):=by rw [Norm.nS1.eq_def x i e s Dl]; simp only [dif_neg h] theorem s2S {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:i < e) : Norm.nS2 x m i e v=Norm.nS2 x m (i+1) e (v+(Dense.F.dw (Norm.ck x i)-m)*(Dense.F.dw (Norm.ck x i)-m)):=by rw [Norm.nS2.eq_def x m i e v]; simp only [dif_pos h] theorem s2E {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:¬i < e) : Norm.nS2 x m i e v=v:=by rw [Norm.nS2.eq_def x m i e v]; simp only [dif_neg h] @[inline] def oE {β:Type} (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd:Ἅ) (r:ℕ) (dW:Word) (m ri:Ἅ) (Kp:ἆ) (v gw bw:Ἅ) (gx:ἆ) (i j:Ἄ) (ex:Option Norm.NR.fH) (k:Word → Option Norm.NR.fH → β):β:= let B:=((v-m)*(gw*ri)+bw).toBits if Norm.nOK B (Norm.nC (gx+Kp) ((B>>>52)&&&2047)) then k (Norm.nW B) ex else let p:=Norm.nFB n eps x g b nd r dW ex i j; k p.1 (some p.2) theorem oE_c {β:Type} {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd:Ἅ} {r:ℕ} {dW:Word} {m ri:Ἅ} {Kp:ἆ} {v gw bw v' gw' bw':Ἅ} {gx gx':ἆ} {i j:Ἄ} {ex:Option Norm.NR.fH} {k k':Word → Option Norm.NR.fH → β} (h1:v=v') (h2:gw=gw') (h3:bw=bw') (h4:gx=gx') (h5:∀ o e,k o e=k' o e) : oE n eps x g b nd r dW m ri Kp v gw bw gx i j ex k=oE n eps x g b nd r dW m ri Kp v' gw' bw' gx' i j ex k':=by subst h1 h2 h3 h4; rw [show k=k' from funext fun o=>funext fun e=>h5 o e] theorem f2S {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd m ri:Ἅ} {Kp:ἆ} {r:ℕ} {dW:Word} {ex:Option Norm.NR.fH} {lo t nn:Ἄ} {hg:nn.toNat ≤ g.size} {hd:nn.toNat ≤ b.size} {hx:lo.toNat+nn.toNat ≤ x.size} {hb:lo.toNat+nn.toNat < 2^(32:ℕ)} {out:Ἂ Word} {ho:lo.toNat+nn.toNat ≤ out.size} (h:t < nn) : Norm.nFE2 n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho = oE n eps x g b nd r dW m ri Kp (Dense.F.dw (x.uget (lo+t) (Norm.nH1 (ε.mp h) hb hx))) (Dense.F.dw (g.uget t (U1 (ε.mp h) hg))) (Dense.F.dw (b.uget t (U1 (ε.mp h) hd))) (Norm.nfe (g.uget t (U1 (ε.mp h) hg))) (lo+t) t ex (fun o e=>Norm.nFE2 n eps x g b nd m ri Kp r dW e lo (t+1) nn hg hd hx hb (out.uset (lo+t) o (Norm.nH1 (ε.mp h) hb ho)) (Norm.nH3 _ _ _ _ ho)):=by rw [Norm.nFE2.eq_def n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho]; simp only [dif_pos h,oE] theorem f2E {n:ℕ} {eps:Word} {x g b:Ἂ Word} {nd m ri:Ἅ} {Kp:ἆ} {r:ℕ} {dW:Word} {ex:Option Norm.NR.fH} {lo t nn:Ἄ} {hg:nn.toNat ≤ g.size} {hd:nn.toNat ≤ b.size} {hx:lo.toNat+nn.toNat ≤ x.size} {hb:lo.toNat+nn.toNat < 2^(32:ℕ)} {out:Ἂ Word} {ho:lo.toNat+nn.toNat ≤ out.size} (h:¬t < nn) : Norm.nFE2 n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho=out:=by rw [Norm.nFE2.eq_def n eps x g b nd m ri Kp r dW ex lo t nn hg hd hx hb out ho]; simp only [dif_neg h] theorem cku {x:Ἂ Word} {i j:Ἄ} (hij:i=j) (h:j.toNat < x.size) : Norm.ck x i=x.uget j h:=by subst hij; rw [Norm.f6,Dense.cC] theorem k4c {g b:Ἂ Word} {gd bd:ἀ} {ge:ByteArray} (t:Ἄ) {n:ℕ} (ht:t.toNat < n) (hG : ∀ t,t < n → gd.data[t]! = 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]!) (p1:n ≤ gd.size) (p2:n ≤ bd.size) (p3:n ≤ ge.size) (p4:n ≤ g.size) (p5:n ≤ b.size) : gd.uget t (U1 ht p1)=Dense.F.dw (g.uget t (U1 ht p4)) ∧ bd.uget t (U1 ht p2)=Dense.F.dw (b.uget t (U1 ht p5)) ∧ (ge.uget t (U1 ht p3)).toUInt64=Norm.nfe (g.uget t (U1 ht p4)):=by refine ⟨?_,?_,?_⟩ · rw [Dense.F.kFU,hG _ ht,Dense.cC] · rw [Dense.F.kFU,hB _ ht,Dense.cC] · rw [Norm.nBu,hE _ ht,Dense.cC] @[inline] def sLQ {β:Type} (eps:Word) (s:Ἅ) (Dl:ἆ) (vf:Ἅ->Ἅ) (rm nf ep:Ἅ) (L:ἆ) (k:Ἅ->Ἅ->ἆ->Word->Ἆ->β):β:= let m:=s*rm let v:=vf m let D:=W7 (v*nf+ep) let B:=D.toBits let dW:=Norm.nWs 26 B let ed:=expOf dW let E:=((m.toBits>>>52)&&&2047)+9 let a:=L+Dl+1052 let c:=2*L+2*Dl let f:=(expOf eps).toUInt64+178 let d:=if f ≤ c then c-f else 0 k m (Norm.nRi dW ed.toUInt64) ((if a ≤ E then E else a)-ed.toUInt64) dW (Norm.nOKs B ((if L+4 ≤ d then d else L+4)+2)&&0Ἅ) (rm nf ep:Ἅ) (L:ἆ) (k:Ἅ->Ἅ->ἆ->Word->Ἆ->β) (hL:L.toNat ≤ 64) (hD:Dl.toNat < 255) : sLQ eps s Dl vf rm nf ep L k=Norm.nLQk eps s Dl vf rm nf ep L k:=by unfold sLQ Norm.nLQk Norm.nElK3 dsimp only rw [kpU _ _ _ _ hL hD (by rw [Ε]; exact ϝ) (e8 _),lcU _ _ _ hL hD (e8 _)] theorem nCKL {n:ℕ} {eps:Word} {rm nf ep z0:Ἅ} {L:ἆ} (hC:Norm.nCK n eps rm nf ep z0 L) (hn:n < 2^(32:ℕ)) : L.toNat ≤ 64:=by obtain ⟨-,-,-,-,h⟩:=hC; subst h have h1:Aq (n+4) < 33:=(m9 (by omega)).mpr (by omega) rw [Norm.kZ1 (n+4) (by omega),Dense.F.kOfS _ (by omega)]; omega theorem kU {t:Ἄ} {k n N s:ℕ} (ht:t.toNat=k) (hN:n=N) (hk:k < N) (h:n ≤ s):t.toNat < s:=by omega theorem kQ {r n k s:ℕ} {t:Ἄ} (ht:t.toNat=k) (hk:k < n) (hb:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (G0 (r*n)+t).toNat < s:=by have q1:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) hb) rw [Norm.nCa (by rw [q1,ht]; omega),q1,ht]; omega theorem cQS {x:Ἂ Word} {w0:Word} {i e:Ἄ} (h:i < e) : cQ x w0 i e=if (Norm.ck x i==w0||(Norm.ck x i<<<1==0&&w0<<<1==0)) then cQ x w0 (i+1) e else false:=by rw [cQ.eq_def x w0 i e]; simp only [dif_pos h] theorem cQE {x:Ἂ Word} {w0:Word} {i e:Ἄ} (h:¬i < e) : cQ x w0 i e=true:=by rw [cQ.eq_def x w0 i e]; simp only [dif_neg h] theorem kQl {r n k s:ℕ} {lo t:Ἄ} (hlo:lo=G0 (r*n)) (ht:t.toNat=k) (hk:k < n) (hb:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (lo+t).toNat < s:=by subst hlo; exact kQ ht hk hb ho theorem loS {r n:ℕ} {lo nn:Ἄ} (hlo:lo.toNat=r*n) (hnn:nn.toNat=n) (hb:r*n+n < 2^(32:ℕ)) : (lo+nn).toNat=(r+1)*n:=by rw [Norm.nCa (by rw [hlo,hnn]; exact hb),hlo,hnn,Ο] theorem lE {lo:Ἄ} {m:ℕ} (h:lo.toNat=m) (hm:m < 2^(32:ℕ)) : lo=G0 m:=O5.1 (h.trans (Conv.aa _ hm).symm) def cRw (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd rm nf ep z0:Ἅ) (L:ἆ) (hC:Norm.nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if (Norm.nfe (Norm.ck x (G0 (r*n))) < 255&&cQ x (Norm.ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true then Norm.Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out else Norm.nRow1 n eps x g b nd rm nf ep z0 L hC r out hg' hd' hx ho hb theorem uT0:(0:Ἄ).toNat=0:=Ϧ theorem uT1:(0+1:Ἄ).toNat=1:=by rw [Norm.nCa (by rw [uT0,mA]; decide),uT0,mA] theorem uT2:(0+1+1:Ἄ).toNat=2:=by rw [Norm.nCa (by rw [uT1,mA]; decide),uT1,mA] theorem uT3:(0+1+1+1:Ἄ).toNat=3:=by rw [Norm.nCa (by rw [uT2,mA]; decide),uT2,mA] theorem uT4:(0+1+1+1+1:Ἄ).toNat=4:=by rw [Norm.nCa (by rw [uT3,mA]; decide),uT3,mA] theorem uT5:(0+1+1+1+1+1:Ἄ).toNat=5:=by rw [Norm.nCa (by rw [uT4,mA]; decide),uT4,mA] theorem uT6:(0+1+1+1+1+1+1:Ἄ).toNat=6:=by rw [Norm.nCa (by rw [uT5,mA]; decide),uT5,mA] theorem uT7:(0+1+1+1+1+1+1+1:Ἄ).toNat=7:=by rw [Norm.nCa (by rw [uT6,mA]; decide),uT6,mA] theorem uT8:(0+1+1+1+1+1+1+1+1:Ἄ).toNat=8:=by rw [Norm.nCa (by rw [uT7,mA]; decide),uT7,mA] @[inline] def k4O (out:Ἂ Word) (lo:Ἄ) (o0 o1 o2 o3:Word) (h0:(lo+0).toNat < out.size) (h1:(lo+(0+1)).toNat < out.size) (h2:(lo+(0+1+1)).toNat < out.size) (h3:(lo+(0+1+1+1)).toNat < out.size):Ἂ Word:= ((((out.uset (lo+0) o0 h0).uset (lo+(0+1)) o1 (by rw [BT]; exact h1)).uset (lo+(0+1+1)) o2 (by rw [BT,BT]; exact h2)).uset (lo+(0+1+1+1)) o3 (by rw [BT,BT,BT]; exact h3)) @[inline] def k4 (n:ℕ) (hN:n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= let w0:=Norm.ck x (lo); let w1:=Norm.ck x (lo+1); let w2:=Norm.ck x (lo+1+1); let w3:=Norm.ck x (lo+1+1+1) if (Norm.nfe w0 < 255&&(if (w0==w0||(w0<<<1==0&&w0<<<1==0)) then if (w1==w0||(w1<<<1==0&&w0<<<1==0)) then if (w2==w0||(w2<<<1==0&&w0<<<1==0)) then if (w3==w0||(w3<<<1==0&&w0<<<1==0)) then true else false else false else false else false))=true then Norm.Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb lo lo (G0 (r*n+n)) out else let v0:=Dense.F.dw w0; let v1:=Dense.F.dw w1; let v2:=Dense.F.dw w2; let v3:=Dense.F.dw w3 let D0:=if (0:ἆ) < Norm.nfe w0 then Norm.nfe w0 else 0 let D1:=if D0 < Norm.nfe w1 then Norm.nfe w1 else D0 let D2:=if D1 < Norm.nfe w2 then Norm.nfe w2 else D1 let D3:=if D2 < Norm.nfe w3 then Norm.nfe w3 else D2 if D3 < 255 then sLQ eps ((((z0+v0)+v1)+v2)+v3) D3 (fun m=>((((z0+(v0-m)*(v0-m))+(v1-m)*(v1-m))+(v2-m)*(v2-m))+(v3-m)*(v3-m))) rm nf ep L (fun m ri Kp dW fast=> if fast then oE n eps x g b nd r dW m ri Kp v0 (gd.uget (0) (kU uT0 hN (by decide) hg)) (bd.uget (0) (kU uT0 hN (by decide) hd)) (ge.uget (0) (kU uT0 hN (by decide) he)).toUInt64 (lo+0) (0) none (fun o0 e1=> oE n eps x g b nd r dW m ri Kp v1 (gd.uget (0+1) (kU uT1 hN (by decide) hg)) (bd.uget (0+1) (kU uT1 hN (by decide) hd)) (ge.uget (0+1) (kU uT1 hN (by decide) he)).toUInt64 (lo+(0+1)) (0+1) e1 (fun o1 e2=> oE n eps x g b nd r dW m ri Kp v2 (gd.uget (0+1+1) (kU uT2 hN (by decide) hg)) (bd.uget (0+1+1) (kU uT2 hN (by decide) hd)) (ge.uget (0+1+1) (kU uT2 hN (by decide) he)).toUInt64 (lo+(0+1+1)) (0+1+1) e2 (fun o2 e3=> oE n eps x g b nd r dW m ri Kp v3 (gd.uget (0+1+1+1) (kU uT3 hN (by decide) hg)) (bd.uget (0+1+1+1) (kU uT3 hN (by decide) hd)) (ge.uget (0+1+1+1) (kU uT3 hN (by decide) he)).toUInt64 (lo+(0+1+1+1)) (0+1+1+1) e3 (fun o3 _=> k4O out lo o0 o1 o2 o3 (kQl hlo uT0 (by rw [hN]; decide) hb ho) (kQl hlo uT1 (by rw [hN]; decide) hb ho) (kQl hlo uT2 (by rw [hN]; decide) hb ho) (kQl hlo uT3 (by rw [hN]; decide) hb ho))))) else Norm.nRowS n eps x g b nd r lo (G0 (r*n+n)) out) else #[] theorem k4_eq (n:ℕ) (hN:n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hC:Norm.nCK n eps rm nf ep z0 L) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = 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]!) : k4 n hN eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb=cRw n eps x g b nd rm nf ep z0 L hC cb r out hg' hd' hx ho hb:=by subst hN hlo have q1:(G0 (r*4)).toNat=r*4:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*4+4)).toNat=r*4+4:=Conv.aa _ hb have q2:(G0 4).toNat=4:=Conv.aa _ (C0 (K2 _ _) hb) have o1:(1:Ἄ).toNat=1:=mA have b1:(G0 (r*4)+1).toNat=r*4+1:=by rw [Norm.nCa (by rw [q1,o1]; omega),q1,o1] have b2:(G0 (r*4)+1+1).toNat=r*4+2:=by rw [Norm.nCa (by rw [b1,o1]; omega),b1,o1] have b3:(G0 (r*4)+1+1+1).toNat=r*4+3:=by rw [Norm.nCa (by rw [b2,o1]; omega),b2,o1] have b4:(G0 (r*4)+1+1+1+1).toNat=r*4+4:=by rw [Norm.nCa (by rw [b3,o1]; omega),b3,o1] have c0:(G0 (r*4)+0).toNat=r*4:=by rw [Norm.nCa (by rw [q1,uT0]; omega),q1,uT0]; rfl have c1:(G0 (r*4)+(0+1)).toNat=r*4+1:=by rw [Norm.nCa (by rw [q1,uT1]; omega),q1,uT1] have c2:(G0 (r*4)+(0+1+1)).toNat=r*4+2:=by rw [Norm.nCa (by rw [q1,uT2]; omega),q1,uT2] have c3:(G0 (r*4)+(0+1+1+1)).toNat=r*4+3:=by rw [Norm.nCa (by rw [q1,uT3]; omega),q1,uT3] have l0:G0 (r*4) < G0 (r*4+4):=ε.mpr (by rw [q1,q3]; exact P5 (by decide)) have l1:G0 (r*4)+1 < G0 (r*4+4):=ε.mpr (by rw [b1,q3]; exact O1 (by decide) _) have l2:G0 (r*4)+1+1 < G0 (r*4+4):=ε.mpr (by rw [b2,q3]; exact O1 (by decide) _) have l3:G0 (r*4)+1+1+1 < G0 (r*4+4):=ε.mpr (by rw [b3,q3]; exact O1 (by decide) _) have l4:¬G0 (r*4)+1+1+1+1 < G0 (r*4+4):=fun h=>by have:=ε.mp h; rw [b4,q3] at this; exact B4 _ this have m0:(0:Ἄ) < G0 4:=ε.mpr (by rw [uT0,q2]; decide) have m1:(0+1:Ἄ) < G0 4:=ε.mpr (by rw [uT1,q2]; decide) have m2:(0+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT2,q2]; decide) have m3:(0+1+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT3,q2]; decide) have m4:¬(0+1+1+1+1:Ἄ) < G0 4:=fun h=>by have:=ε.mp h; rw [uT4,q2] at this; exact B4 _ this unfold k4 cRw Norm.nRow1; dsimp only rw [cQS l0,cQS l1,cQS l2,cQS l3,cQE l4] refine ite_congr rfl (fun _=>rfl) (fun _=>?_) rw [s1S l0,s1S l1,s1S l2,s1S l3,s1E l4] simp only [s2S l0,s2S l1,s2S l2,s2S l3,s2E l4] refine ite_congr rfl (fun hD=>?_) (fun _=>rfl) rw [sLQ_e _ _ _ _ _ _ _ _ _ (nCKL hC (by decide)) (by have:=μ.mp hD; simpa using this)] congr 1; funext m ri Kp dW fast cases fast · simp only [υ,↓reduceIte] · simp only [↓reduceIte] obtain ⟨e01,e02,e03⟩:=k4c (0) (n:=4) (by rw [uT0]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e11,e12,e13⟩:=k4c (0+1) (n:=4) (by rw [uT1]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e21,e22,e23⟩:=k4c (0+1+1) (n:=4) (by rw [uT2]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e31,e32,e33⟩:=k4c (0+1+1+1) (n:=4) (by rw [uT3]; decide) hG hB hE hg hd he hg' hd' rw [f2S m0]; refine oE_c (congrArg _ (cku (O5.1 (by rw [q1,c0])) _)) e01 e02 e03 (fun o0 e1=>?_) rw [f2S m1]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b1,c1])) _)) e11 e12 e13 (fun o1 e2=>?_) rw [f2S m2]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b2,c2])) _)) e21 e22 e23 (fun o2 e3=>?_) rw [f2S m3]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b3,c3])) _)) e31 e32 e33 (fun o3 e4=>?_) rw [f2E m4]; rfl @[inline] def k8O (out:Ἂ Word) (lo:Ἄ) (o0 o1 o2 o3 o4 o5 o6 o7:Word) (h0:(lo+0).toNat < out.size) (h1:(lo+(0+1)).toNat < out.size) (h2:(lo+(0+1+1)).toNat < out.size) (h3:(lo+(0+1+1+1)).toNat < out.size) (h4:(lo+(0+1+1+1+1)).toNat < out.size) (h5:(lo+(0+1+1+1+1+1)).toNat < out.size) (h6:(lo+(0+1+1+1+1+1+1)).toNat < out.size) (h7:(lo+(0+1+1+1+1+1+1+1)).toNat < out.size):Ἂ Word:= ((((((((out.uset (lo+0) o0 h0).uset (lo+(0+1)) o1 (by rw [BT]; exact h1)).uset (lo+(0+1+1)) o2 (by rw [BT,BT]; exact h2)).uset (lo+(0+1+1+1)) o3 (by rw [BT,BT,BT]; exact h3)).uset (lo+(0+1+1+1+1)) o4 (by rw [BT,BT,BT,BT]; exact h4)).uset (lo+(0+1+1+1+1+1)) o5 (by rw [BT,BT,BT,BT,BT]; exact h5)).uset (lo+(0+1+1+1+1+1+1)) o6 (by rw [BT,BT,BT,BT,BT,BT]; exact h6)).uset (lo+(0+1+1+1+1+1+1+1)) o7 (by rw [BT,BT,BT,BT,BT,BT,BT]; exact h7)) @[inline] def k8 (n:ℕ) (hN:n=8) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= let w0:=Norm.ck x (lo); let w1:=Norm.ck x (lo+1); let w2:=Norm.ck x (lo+1+1); let w3:=Norm.ck x (lo+1+1+1); let w4:=Norm.ck x (lo+1+1+1+1); let w5:=Norm.ck x (lo+1+1+1+1+1); let w6:=Norm.ck x (lo+1+1+1+1+1+1); let w7:=Norm.ck x (lo+1+1+1+1+1+1+1) if (Norm.nfe w0 < 255&&(if (w0==w0||(w0<<<1==0&&w0<<<1==0)) then if (w1==w0||(w1<<<1==0&&w0<<<1==0)) then if (w2==w0||(w2<<<1==0&&w0<<<1==0)) then if (w3==w0||(w3<<<1==0&&w0<<<1==0)) then if (w4==w0||(w4<<<1==0&&w0<<<1==0)) then if (w5==w0||(w5<<<1==0&&w0<<<1==0)) then if (w6==w0||(w6<<<1==0&&w0<<<1==0)) then if (w7==w0||(w7<<<1==0&&w0<<<1==0)) then true else false else false else false else false else false else false else false else false))=true then Norm.Yq (fun (c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>Norm.ck c j) cb lo lo (G0 (r*n+n)) out else let v0:=Dense.F.dw w0; let v1:=Dense.F.dw w1; let v2:=Dense.F.dw w2; let v3:=Dense.F.dw w3; let v4:=Dense.F.dw w4; let v5:=Dense.F.dw w5; let v6:=Dense.F.dw w6; let v7:=Dense.F.dw w7 let D0:=if (0:ἆ) < Norm.nfe w0 then Norm.nfe w0 else 0 let D1:=if D0 < Norm.nfe w1 then Norm.nfe w1 else D0 let D2:=if D1 < Norm.nfe w2 then Norm.nfe w2 else D1 let D3:=if D2 < Norm.nfe w3 then Norm.nfe w3 else D2 let D4:=if D3 < Norm.nfe w4 then Norm.nfe w4 else D3 let D5:=if D4 < Norm.nfe w5 then Norm.nfe w5 else D4 let D6:=if D5 < Norm.nfe w6 then Norm.nfe w6 else D5 let D7:=if D6 < Norm.nfe w7 then Norm.nfe w7 else D6 if D7 < 255 then sLQ eps ((((((((z0+v0)+v1)+v2)+v3)+v4)+v5)+v6)+v7) D7 (fun m=>((((((((z0+(v0-m)*(v0-m))+(v1-m)*(v1-m))+(v2-m)*(v2-m))+(v3-m)*(v3-m))+(v4-m)*(v4-m))+(v5-m)*(v5-m))+(v6-m)*(v6-m))+(v7-m)*(v7-m))) rm nf ep L (fun m ri Kp dW fast=> if fast then oE n eps x g b nd r dW m ri Kp v0 (gd.uget (0) (kU uT0 hN (by decide) hg)) (bd.uget (0) (kU uT0 hN (by decide) hd)) (ge.uget (0) (kU uT0 hN (by decide) he)).toUInt64 (lo+0) (0) none (fun o0 e1=> oE n eps x g b nd r dW m ri Kp v1 (gd.uget (0+1) (kU uT1 hN (by decide) hg)) (bd.uget (0+1) (kU uT1 hN (by decide) hd)) (ge.uget (0+1) (kU uT1 hN (by decide) he)).toUInt64 (lo+(0+1)) (0+1) e1 (fun o1 e2=> oE n eps x g b nd r dW m ri Kp v2 (gd.uget (0+1+1) (kU uT2 hN (by decide) hg)) (bd.uget (0+1+1) (kU uT2 hN (by decide) hd)) (ge.uget (0+1+1) (kU uT2 hN (by decide) he)).toUInt64 (lo+(0+1+1)) (0+1+1) e2 (fun o2 e3=> oE n eps x g b nd r dW m ri Kp v3 (gd.uget (0+1+1+1) (kU uT3 hN (by decide) hg)) (bd.uget (0+1+1+1) (kU uT3 hN (by decide) hd)) (ge.uget (0+1+1+1) (kU uT3 hN (by decide) he)).toUInt64 (lo+(0+1+1+1)) (0+1+1+1) e3 (fun o3 e4=> oE n eps x g b nd r dW m ri Kp v4 (gd.uget (0+1+1+1+1) (kU uT4 hN (by decide) hg)) (bd.uget (0+1+1+1+1) (kU uT4 hN (by decide) hd)) (ge.uget (0+1+1+1+1) (kU uT4 hN (by decide) he)).toUInt64 (lo+(0+1+1+1+1)) (0+1+1+1+1) e4 (fun o4 e5=> oE n eps x g b nd r dW m ri Kp v5 (gd.uget (0+1+1+1+1+1) (kU uT5 hN (by decide) hg)) (bd.uget (0+1+1+1+1+1) (kU uT5 hN (by decide) hd)) (ge.uget (0+1+1+1+1+1) (kU uT5 hN (by decide) he)).toUInt64 (lo+(0+1+1+1+1+1)) (0+1+1+1+1+1) e5 (fun o5 e6=> oE n eps x g b nd r dW m ri Kp v6 (gd.uget (0+1+1+1+1+1+1) (kU uT6 hN (by decide) hg)) (bd.uget (0+1+1+1+1+1+1) (kU uT6 hN (by decide) hd)) (ge.uget (0+1+1+1+1+1+1) (kU uT6 hN (by decide) he)).toUInt64 (lo+(0+1+1+1+1+1+1)) (0+1+1+1+1+1+1) e6 (fun o6 e7=> oE n eps x g b nd r dW m ri Kp v7 (gd.uget (0+1+1+1+1+1+1+1) (kU uT7 hN (by decide) hg)) (bd.uget (0+1+1+1+1+1+1+1) (kU uT7 hN (by decide) hd)) (ge.uget (0+1+1+1+1+1+1+1) (kU uT7 hN (by decide) he)).toUInt64 (lo+(0+1+1+1+1+1+1+1)) (0+1+1+1+1+1+1+1) e7 (fun o7 _=> k8O out lo o0 o1 o2 o3 o4 o5 o6 o7 (kQl hlo uT0 (by rw [hN]; decide) hb ho) (kQl hlo uT1 (by rw [hN]; decide) hb ho) (kQl hlo uT2 (by rw [hN]; decide) hb ho) (kQl hlo uT3 (by rw [hN]; decide) hb ho) (kQl hlo uT4 (by rw [hN]; decide) hb ho) (kQl hlo uT5 (by rw [hN]; decide) hb ho) (kQl hlo uT6 (by rw [hN]; decide) hb ho) (kQl hlo uT7 (by rw [hN]; decide) hb ho))))))))) else Norm.nRowS n eps x g b nd r lo (G0 (r*n+n)) out) else #[] theorem k8_eq (n:ℕ) (hN:n=8) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hC:Norm.nCK n eps rm nf ep z0 L) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = 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]!) : k8 n hN eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb=cRw n eps x g b nd rm nf ep z0 L hC cb r out hg' hd' hx ho hb:=by subst hN hlo have q1:(G0 (r*8)).toNat=r*8:=Conv.aa _ (C0 (V1 _ _) hb) have q3:(G0 (r*8+8)).toNat=r*8+8:=Conv.aa _ hb have q2:(G0 8).toNat=8:=Conv.aa _ (C0 (K2 _ _) hb) have o1:(1:Ἄ).toNat=1:=mA have b1:(G0 (r*8)+1).toNat=r*8+1:=by rw [Norm.nCa (by rw [q1,o1]; omega),q1,o1] have b2:(G0 (r*8)+1+1).toNat=r*8+2:=by rw [Norm.nCa (by rw [b1,o1]; omega),b1,o1] have b3:(G0 (r*8)+1+1+1).toNat=r*8+3:=by rw [Norm.nCa (by rw [b2,o1]; omega),b2,o1] have b4:(G0 (r*8)+1+1+1+1).toNat=r*8+4:=by rw [Norm.nCa (by rw [b3,o1]; omega),b3,o1] have b5:(G0 (r*8)+1+1+1+1+1).toNat=r*8+5:=by rw [Norm.nCa (by rw [b4,o1]; omega),b4,o1] have b6:(G0 (r*8)+1+1+1+1+1+1).toNat=r*8+6:=by rw [Norm.nCa (by rw [b5,o1]; omega),b5,o1] have b7:(G0 (r*8)+1+1+1+1+1+1+1).toNat=r*8+7:=by rw [Norm.nCa (by rw [b6,o1]; omega),b6,o1] have b8:(G0 (r*8)+1+1+1+1+1+1+1+1).toNat=r*8+8:=by rw [Norm.nCa (by rw [b7,o1]; omega),b7,o1] have c0:(G0 (r*8)+0).toNat=r*8:=by rw [Norm.nCa (by rw [q1,uT0]; omega),q1,uT0]; rfl have c1:(G0 (r*8)+(0+1)).toNat=r*8+1:=by rw [Norm.nCa (by rw [q1,uT1]; omega),q1,uT1] have c2:(G0 (r*8)+(0+1+1)).toNat=r*8+2:=by rw [Norm.nCa (by rw [q1,uT2]; omega),q1,uT2] have c3:(G0 (r*8)+(0+1+1+1)).toNat=r*8+3:=by rw [Norm.nCa (by rw [q1,uT3]; omega),q1,uT3] have c4:(G0 (r*8)+(0+1+1+1+1)).toNat=r*8+4:=by rw [Norm.nCa (by rw [q1,uT4]; omega),q1,uT4] have c5:(G0 (r*8)+(0+1+1+1+1+1)).toNat=r*8+5:=by rw [Norm.nCa (by rw [q1,uT5]; omega),q1,uT5] have c6:(G0 (r*8)+(0+1+1+1+1+1+1)).toNat=r*8+6:=by rw [Norm.nCa (by rw [q1,uT6]; omega),q1,uT6] have c7:(G0 (r*8)+(0+1+1+1+1+1+1+1)).toNat=r*8+7:=by rw [Norm.nCa (by rw [q1,uT7]; omega),q1,uT7] have l0:G0 (r*8) < G0 (r*8+8):=ε.mpr (by rw [q1,q3]; exact P5 (by decide)) have l1:G0 (r*8)+1 < G0 (r*8+8):=ε.mpr (by rw [b1,q3]; exact O1 (by decide) _) have l2:G0 (r*8)+1+1 < G0 (r*8+8):=ε.mpr (by rw [b2,q3]; exact O1 (by decide) _) have l3:G0 (r*8)+1+1+1 < G0 (r*8+8):=ε.mpr (by rw [b3,q3]; exact O1 (by decide) _) have l4:G0 (r*8)+1+1+1+1 < G0 (r*8+8):=ε.mpr (by rw [b4,q3]; exact O1 (by decide) _) have l5:G0 (r*8)+1+1+1+1+1 < G0 (r*8+8):=ε.mpr (by rw [b5,q3]; exact O1 (by decide) _) have l6:G0 (r*8)+1+1+1+1+1+1 < G0 (r*8+8):=ε.mpr (by rw [b6,q3]; exact O1 (by decide) _) have l7:G0 (r*8)+1+1+1+1+1+1+1 < G0 (r*8+8):=ε.mpr (by rw [b7,q3]; exact O1 (by decide) _) have l8:¬G0 (r*8)+1+1+1+1+1+1+1+1 < G0 (r*8+8):=fun h=>by have:=ε.mp h; rw [b8,q3] at this; exact B4 _ this have m0:(0:Ἄ) < G0 8:=ε.mpr (by rw [uT0,q2]; decide) have m1:(0+1:Ἄ) < G0 8:=ε.mpr (by rw [uT1,q2]; decide) have m2:(0+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT2,q2]; decide) have m3:(0+1+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT3,q2]; decide) have m4:(0+1+1+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT4,q2]; decide) have m5:(0+1+1+1+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT5,q2]; decide) have m6:(0+1+1+1+1+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT6,q2]; decide) have m7:(0+1+1+1+1+1+1+1:Ἄ) < G0 8:=ε.mpr (by rw [uT7,q2]; decide) have m8:¬(0+1+1+1+1+1+1+1+1:Ἄ) < G0 8:=fun h=>by have:=ε.mp h; rw [uT8,q2] at this; exact B4 _ this unfold k8 cRw Norm.nRow1; dsimp only rw [cQS l0,cQS l1,cQS l2,cQS l3,cQS l4,cQS l5,cQS l6,cQS l7,cQE l8] refine ite_congr rfl (fun _=>rfl) (fun _=>?_) rw [s1S l0,s1S l1,s1S l2,s1S l3,s1S l4,s1S l5,s1S l6,s1S l7,s1E l8] simp only [s2S l0,s2S l1,s2S l2,s2S l3,s2S l4,s2S l5,s2S l6,s2S l7,s2E l8] refine ite_congr rfl (fun hD=>?_) (fun _=>rfl) rw [sLQ_e _ _ _ _ _ _ _ _ _ (nCKL hC (by decide)) (by have:=μ.mp hD; simpa using this)] congr 1; funext m ri Kp dW fast cases fast · simp only [υ,↓reduceIte] · simp only [↓reduceIte] obtain ⟨e01,e02,e03⟩:=k4c (0) (n:=8) (by rw [uT0]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e11,e12,e13⟩:=k4c (0+1) (n:=8) (by rw [uT1]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e21,e22,e23⟩:=k4c (0+1+1) (n:=8) (by rw [uT2]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e31,e32,e33⟩:=k4c (0+1+1+1) (n:=8) (by rw [uT3]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e41,e42,e43⟩:=k4c (0+1+1+1+1) (n:=8) (by rw [uT4]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e51,e52,e53⟩:=k4c (0+1+1+1+1+1) (n:=8) (by rw [uT5]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e61,e62,e63⟩:=k4c (0+1+1+1+1+1+1) (n:=8) (by rw [uT6]; decide) hG hB hE hg hd he hg' hd' obtain ⟨e71,e72,e73⟩:=k4c (0+1+1+1+1+1+1+1) (n:=8) (by rw [uT7]; decide) hG hB hE hg hd he hg' hd' rw [f2S m0]; refine oE_c (congrArg _ (cku (O5.1 (by rw [q1,c0])) _)) e01 e02 e03 (fun o0 e1=>?_) rw [f2S m1]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b1,c1])) _)) e11 e12 e13 (fun o1 e2=>?_) rw [f2S m2]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b2,c2])) _)) e21 e22 e23 (fun o2 e3=>?_) rw [f2S m3]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b3,c3])) _)) e31 e32 e33 (fun o3 e4=>?_) rw [f2S m4]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b4,c4])) _)) e41 e42 e43 (fun o4 e5=>?_) rw [f2S m5]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b5,c5])) _)) e51 e52 e53 (fun o5 e6=>?_) rw [f2S m6]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b6,c6])) _)) e61 e62 e63 (fun o6 e7=>?_) rw [f2S m7]; refine oE_c (congrArg _ (cku (O5.1 (by rw [b7,c7])) _)) e71 e72 e73 (fun o7 e8=>?_) rw [f2E m8]; rfl @[inline] def kS (n:ℕ) (hK:n=4∨n=8) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if h:n=4 then k4 n h eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb else k8 n (by omega) eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb theorem kS_eq (n:ℕ) (hK:n=4∨n=8) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)) (hC:Norm.nCK n eps rm nf ep z0 L) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = 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]!) : kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb=cRw n eps x g b nd rm nf ep z0 L hC cb r out hg' hd' hx ho hb:=by unfold kS; split · exact k4_eq n _ eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb hC hg' hd' hx hG hB hE · exact k8_eq n _ eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb hC hg' hd' hx hG hB hE def cRowsK (rows n:ℕ) (hK:n=4∨n=8) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) : (k r:ℕ) → (lo:Ἄ) → lo.toNat=r*n → (out:Ἂ Word) → rows*n ≤ out.size → r+k=rows → Ἂ Word | 0,_,_,_,out,_,_=>out | k+1,r,lo,hlo,out,ho,hk => have kk:r*n+n ≤ rows*n:=Norm.nHk2 hk let p:=kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb) if hs:T ≤ p.size then cRowsK rows n hK eps x g b gd bd ge nd rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k (r+1) (lo+nn) (loS hlo hnn (C0 kk hb)) p (hT.2.trans hs) (Norm.nHk3 hk) else #[] theorem cRowsK_eq (rows n:ℕ) (hK:n=4∨n=8) (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) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) (hX : ∀ j,j < rows*n → expOf x[j]! ≠ 255) (heps:0 < rationalWord eps) (hG : ∀ t,t < n → gd.data[t]! = 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:ℕ) (lo:Ἄ) (hlo:lo.toNat=r*n) (out:Ἂ Word) (ho:rows*n ≤ out.size) (hk:r+k=rows), out.size=rows*n → cRowsK rows n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k r lo hlo out ho hk = 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 lo hlo out ho hk hos; rw [Norm.Yr,if_neg (by rw [← hk]; exact B4 r)]; rfl | succ k ih => intro r lo hlo out ho hk hos have kk:=Norm.nHk2 (n:=n) hk rw [Norm.Yr,if_pos (hk ▸ P5 (Nat.succ_pos k))] have E:kS n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb) =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 rw [kS_eq n hK eps x g b gd bd ge _ rm nf ep z0 L cb r lo _ out hg hd he (kk.trans ho) (C0 kk hb) hC hg' hd' (kk.trans hx) hG hB hE] unfold cRw; split · exact cB n eps x g b cb r out (kk.trans ho) (C0 kk hb) (by rw [hos]; exact hb) (fun j hj=>hX j (U1 hj kk)) heps hN F D hcb (by assumption) · exact Norm.nRow1_eq n eps x g b _ rm nf ep z0 L hC r out hg' hd' (kk.trans hx) (kk.trans ho) (C0 kk hb) (by rw [hos]; exact hb) (fun j hj=>hX j (U1 hj kk)) heps hN have S2:(kS n hK eps x g b gd bd ge (I0 n).toInt64.toFloat rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb)).size=rows*n:=by rw [E,Norm.nYq_sz _ _ _ _ _ _ _ rfl,hos] rw [cRowsK,dif_pos (hT.1.trans S2.ge)] refine (ih (r+1) _ _ _ _ (Norm.nHk3 hk) S2).trans ?_ rw [E] theorem cRowsK_bad (rows n:ℕ) (hK:n=4∨n=8) (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) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) (hn:0 < n) (hG : ∀ t,t < n → gd.data[t]! = 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]!) : ∀ k (r:ℕ) (lo:Ἄ) (hlo:lo.toNat=r*n) (out:Ἂ Word) (ho:rows*n ≤ out.size) (hk:r+k=rows) (j:ℕ), r*n ≤ j → j < rows*n → expOf x[j]! = 255 → cRowsK rows n hK eps x g b gd bd ge nd rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k r lo hlo out ho hk = #[]:=by intro k; induction k with | zero=>intro r lo hlo out ho hk j j1 j2 hj; rw [ϑ] at hk; subst hk; omega | succ k ih => intro r lo hlo out ho hk j j1 j2 hj have kk:=Norm.nHk2 (n:=n) hk rw [cRowsK]; split · rename_i S by_cases c:j < r*n+n · have E:kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb)=#[]:=by rw [kS_eq n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo _ out hg hd he (kk.trans ho) (C0 kk hb) hC hg' hd' (kk.trans hx) hG hB hE] unfold cRw; split · exact (cBb n x r (C0 kk hb) j j1 c hj (by assumption)).elim · exact Norm.nRow1_bad n eps x g b nd rm nf ep z0 L hC r out hg' hd' (kk.trans hx) (kk.trans ho) (C0 kk hb) j j1 c hj rw [E] at S; simp only [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*N5 ((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 [O3]; 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 if hK:n=4∨n=8 then cRowsK rows n hK eps x g b W.1.1 W.2 W.1.2 nd rm nf ep z0 L (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 (Z4 h.2.2.2) (G0 n) (Conv.aa _ (by omega)) (rows*n) ⟨le_refl _,le_refl _⟩ rows 0 0 (Ϧ.trans (ϳ n).symm) (mB (rows*n) 0) (by simp only [O3]; exact Nat.le_refl _) (Κ rows) else 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 (Z4 h.2.2.2) rows 0 (Dense.F.zPq (n+2)) (mB (rows*n) 0) (Dense.F.zPs (n+2)).1 (by simp only [O3]; 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 (B4 1)] at Y refine Eq.trans (Norm.nRow1_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only [O3]; 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 split · rename_i hK exact (cRowsK_eq _ _ hK _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (Norm.kO0 h),rfl⟩ _ _ _ _ sg.ge sb.ge _ _ _ _ _ _ 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 [O3])).trans (Norm.V3Lo e n h x g b m B q H F D) · 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 [O3])).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,J2 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,J2 B⟩]; split · split · rename_i h1; subst h1; exact Norm.nRow1_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j (by omega) (by omega) hj · split · rename_i hK 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 cRowsK_bad _ _ hK _ _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (fun u:ἆ=>u.toInt64.toFloat) (Norm.kO0 h),rfl⟩ _ _ _ _ sg.ge sb.ge _ _ _ _ _ _ m (fun t ht=>G.2.1 t (by rw [sg]; exact ht)) (fun t ht=>Bq.2.1 t (by rw [sb]; exact ht)) (fun t ht=>G.2.2.2 t (by rw [sg]; exact ht)) _ 0 _ _ _ _ _ j (by omega) j2 hj · exact cRows_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ m _ 0 _ _ _ _ _ j (by omega) j2 hj · simp only [hX,υ, ↓reduceIte] 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:=F8.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:= { U7 with dense:=⟨Dense.c7,gC⟩ conv:=⟨cvK,dwK,U7.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=J9:=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[U7,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[U7,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[U7,Pinned.maxpoolW_eq] theorem correct:Obligation kernels:=by have h:=Pinned.correct simp only[Obligation,U7]at h simp only[Obligation,kernels,U7,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