import ContractExact local notation:max "ж"=>(by decide) local notation:max "щ"=>(by omega) local notation:max "ш"=>(by norm_num) local notation:max "ф"=>(by positivity) local notation:max "ц"=>(by simp) 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) λj=>toF (Model.Transcendentals.CorrectlyRounded.exp (dyM j.val 6))⟩ def tM:FloatArray := ⟨Array.ofFn (n:=64) λj=>toF (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j.val 6))⟩ def tE:FloatArray := ⟨Array.ofFn (n:=88) λi=>toF (Model.Transcendentals.CorrectlyRounded.exp (dyM i.val 0))⟩ structure SC where (a b c d e f g h:Float) @[noinline] def sc:SC:=⟨Float.ofBits 0xbf56c16c16c16c17,Float.ofBits 0x3f81111111111111,Float.ofBits 0xbfa5555555555555, Float.ofBits 0x3fc5555555555555,Float.ofBits 0xbfe0000000000000,Float.ofBits 0x3ff0000000000000,Float.ofBits 0x4000000000000000, Float.ofBits 0x3da0000000000000⟩ @[inline] def hq (r:Float):Float:=let C:=sc; let r2:=r*r; ((C.a*r+C.b)*r2+(C.c*r+C.d))*r2+(C.e*r+C.f) @[inline] def rnd (Y:UInt64):UInt32 := let ef:=Y>>>52 let f:=Y&&&0xFFFFFFFFFFFFF if 897 ≤ ef&&ef ≤ 1022&&1024 ≤ f&&f < 0xFFFFFFFFFFC00 && 2048 < (Y&&&0x1FFFFFFF)-0xFFFFC00 then ((Y+0x10000000)>>>29).toUInt32-0xC0000000 else 0xFFFFFFFF def tWf (i:Nat):Float := let k:=i/2 let T:=if k < 64 then tT.get! k else tE.get! (k/64)*tT.get! (k%64) if i%2=0 then T else if k < 64 then tM.get! k else T-sc.f @[irreducible] def tW:FloatArray:=⟨Array.ofFn (n:=4096) λi=>tWf i.val⟩ lemma tW_size:tW.size=4096:=by unfold tW; simp [FloatArray.size] lemma tU (x:UInt64) (h:x.toNat < 4096):x.toUSize.toNat=x.toNat:=by rw[UInt64.toNat_toUSize];refine Nat.mod_eq_of_lt (lt_of_lt_of_le h ?_);rcases System.Platform.numBits_eq with e|e<;>rw[e]<;>norm_num @[inline] def fxOf (a b:UInt32):UInt64:=((a&&&0x7FFFFF)|||0x800000).toUInt64<<<((a>>>23)-b).toUInt64 @[inline] def jOf (fx:UInt64):UInt64:=((fx>>>31)&&&2047)<<<1 lemma jOf_v (a:UInt64):(jOf a).toNat=2*((a>>>31).toNat%2048)∧(jOf a+1).toNat=2*((a>>>31).toNat%2048)+1:=by have c:(jOf a).toNat=2*((a>>>31).toNat%2048):=by unfold jOf;rw[UInt64.toNat_shiftLeft,UInt64.toNat_and];simp only[UInt64.reduceToNat,Nat.reduceMod,Nat.shiftLeft_eq] rw[show (2047:ℕ)=2^11-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have:(a>>>31).toNat%2^11<2048:=Nat.mod_lt _ ш rw[Nat.mod_eq_of_lt щ];ring refine ⟨c,?_⟩;rw[UInt64.toNat_add,c];simp only[UInt64.reduceToNat] have:(a>>>31).toNat%2048<2048:=Nat.mod_lt _ ш omega lemma jOf_lt (a:UInt64):(jOf a).toUSize.toNat < tW.size∧(jOf a+1).toUSize.toNat < tW.size:=by have c:=tW_size;obtain ⟨e,d⟩:=jOf_v a have:(a>>>31).toNat%2048<2048:=Nat.mod_lt _ ш rw[c,tU _ щ,tU _ щ];omega @[inline] def tG (fx:UInt64):Float:=tW.uget (jOf fx).toUSize (jOf_lt fx).1 @[inline] def tH (fx:UInt64):Float:=tW.uget (jOf fx+1).toUSize (jOf_lt fx).2 @[inline] def rF (fx:UInt64):Float:=(fx&&&0x7FFFFFFF).toInt64.toFloat*sc.h @[inline] def ySgC (w:UInt32) (fx:UInt64) (r:Float):Float := let t:=tG fx*(sc.f-r*hq r) let s:=(w>>>31).toUInt64.toInt64.toFloat (s*t+(sc.f-s))/(sc.f+t) @[inline] def yThC (fx:UInt64) (r:Float):Float := let nu:=tG fx*(r*hq r)-tH fx nu/(sc.g-nu) @[inline] def ySg (w:UInt32):Float:=let fx:=fxOf (w&&&0x7FFFFFFF) 113; ySgC w fx (rF fx) @[inline] def yTh (w:UInt32):Float:=let fx:=fxOf (w&&&0x7FFFFFFF) 112; yThC fx (rF fx) @[inline] def rT (a d:UInt32):Float := ((a&&&0x7FFFFF)|||0x800000).toUInt64.toInt64.toFloat*Float.ofBits ((((a>>>23)+d).toUInt64+873)<<<52) @[inline] def rC (Y:UInt64):Bool:=(Y>>>52)-897 ≤ 125&&2048 < ((Y+1024)&&&0x0FFFFFFF) @[inline] def rV (Y:UInt64):UInt32:=((Y+0x10000000)>>>29).toUInt32-0xC0000000 @[noinline] def sgR (w:UInt32) (Y:UInt64):UInt32:=let o:=rnd Y; if o==0xFFFFFFFF then sigmoidCR w else o @[noinline] def thR (w:UInt32) (Y:UInt64):UInt32:=let o:=rnd Y; if o==0xFFFFFFFF then tanhCR w else o+(w&&&0x80000000) @[noinline] def sgE (w:UInt32):UInt32 := if (w&&&0x7FFFFFFF)-0x00800000 < 0x38000000 then let o:=rnd (ySgC w 0 (rT (w&&&0x7FFFFFFF) 0)).toBits if o==0xFFFFFFFF then sigmoidCR w else o else if w&&&0x7FFFFFFF==0 then 0x3F000000 else if (w < 0x80000000&&0x41900000 ≤ w&&&0x7FFFFFFF&&w&&&0x7FFFFFFF < 0x7F800000) then 0x3F800000 else sigmoidCR w @[noinline] def thE (w:UInt32):UInt32 := if (w&&&0x7FFFFFFF)-0x00800000 < 0x37800000 then let o:=rnd (yThC 0 (rT (w&&&0x7FFFFFFF) 1)).toBits if o==0xFFFFFFFF then tanhCR w else o+(w&&&0x80000000) else if w&&&0x7FFFFFFF==0 then w else if (0x41180000 ≤ w&&&0x7FFFFFFF&&w&&&0x7FFFFFFF < 0x7F800000) then (w&&&0x80000000)+0x3F800000 else tanhCR w @[inline] def sg (w:UInt32):UInt32 := if (w&&&0x7FFFFFFF)-0x38800000 < 0x09100000 then let Y:=(ySg w).toBits if rC Y then rV Y else sgR w Y else sgE w @[inline] def th (w:UInt32):UInt32 := if (w&&&0x7FFFFFFF)-0x38000000 < 0x09180000 then let Y:=(yTh w).toBits if rC Y then rV Y+(w&&&0x80000000) else thR w Y else thE w 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) lemma zp (k:ℕ):(2:ℝ)^(-(k:ℤ))=1/2^k:=by rw [zpow_neg,zpow_natCast,one_div] lemma fv_iff (x:Float):fv x ↔ x.isFinite=true:=by rw[fv,← Model.toDyadic?_isSome_eq_isFinite,Model.toDyadic?_ieee_eq_model _ ж,Model.toModel_ofFloatModel] show _ ↔ x.toModel.unpack.isFinite=true;cases x.toModel.unpack<;>rfl lemma pmax:(2:ℝ)^(60:ℕ) ≤ Model.toReal (Model.posMaxFinite F64):=by have h:=Model.abs_signed_mul_bpow_le_toReal_posMaxFinite F64 false 1 60 ж ж simp only[Bool.false_eq_true,ite_false,Nat.cast_one,one_mul] at h;change |(2:ℝ)^(60:ℤ)| ≤ _ at h rw[abs_of_pos ф] at h exact_mod_cast h lemma p4:(4:ℝ) ≤ Model.toReal (Model.posMaxFinite F64):=le_trans ш pmax lemma opF {z:Float} {M:Model F64} {v:ℝ} (e:Model.ofFloatModel z.toModel=M) (a:Model.isFinite M=true) (c:Model.toReal M=Model.roundAt F64 v) : fv z∧rv z=Model.roundAt F64 v:=⟨by unfold fv; rw [e]; exact a,by unfold rv; rw [e]; exact c⟩ lemma mulF (x y:Float) (c:fv x) (a:fv y) (e : |rv x*rv y| ≤ 4) : fv (x*y)∧rv (x*y)=Model.roundAt F64 (rv x*rv y):=by have d : |rv x| * |rv y| ≤ Model.toReal (Model.posMaxFinite F64):=by rw[← abs_mul];exact e.trans p4 exact opF (z:=x*y) (ExecFloat.Binary.toModel_ofFloat_mul_of_isFinite x y ((fv_iff x).1 c) ((fv_iff y).1 a)) (Model.isFinite_mul_of_abs_mul_le_posMaxFinite _ _ ж c a d) (Model.toReal_mul_eq_roundAt_of_abs_mul_le_posMaxFinite _ _ ж c a d) lemma addF (x y:Float) (c:fv x) (a:fv y) (g : |rv x| ≤ 2) (e : |rv y| ≤ 2) (_ : |rv x+rv y| ≤ 4):fv (x+y)∧rv (x+y)=Model.roundAt F64 (rv x+rv y):=by have d : |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 c) ((fv_iff y).1 a)) (Model.isFinite_add_of_abs_add_le_posMaxFinite _ _ ж c a d) (Model.toReal_add_eq_roundAt_of_abs_add_le_posMaxFinite _ _ ж c a d) lemma subF (x y:Float) (c:fv x) (a:fv y) (g : |rv x| ≤ 2) (e : |rv y| ≤ 2) (_ : |rv x-rv y| ≤ 4):fv (x-y)∧rv (x-y)=Model.roundAt F64 (rv x-rv y):=by have d : |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 c) ((fv_iff y).1 a)) (Model.isFinite_sub_of_abs_add_le_posMaxFinite _ _ ж c a d) (Model.toReal_sub_eq_roundAt_of_abs_add_le_posMaxFinite _ _ ж c a d) lemma divF (x y:Float) (d:fv x) (c:fv y) (g:rv y≠0) (e : |rv x/rv y| ≤ 4) : fv (x/y)∧rv (x/y)=Model.roundAt F64 (rv x/rv y):=by have a:Model.isZero (Model.ofFloatModel y.toModel)=false:=by cases a:Model.isZero (Model.ofFloatModel y.toModel) ·rfl ·exact absurd (Model.toReal_eq_zero_of_isZero _ a) g exact opF (z:=x/y) (ExecFloat.Binary.toModel_ofFloat_div_of_isFinite x y ((fv_iff x).1 d) ((fv_iff y).1 c)) (Model.isFinite_div_of_abs_div_le_posMaxFinite _ _ ж d c a (e.trans p4)) (Model.toReal_div_eq_roundAt_of_abs_div_le_posMaxFinite _ _ ж d c a (e.trans p4)) lemma inv2le {a b:ℕ} (h:a ≤ b):(1:ℝ)/2^b ≤ 1/2^a := one_div_le_one_div_of_le ф (pow_le_pow_right₀ ш h) lemma 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 c:(2:ℝ)^(-((F64.fracWidth:ℤ)+1))=2^(-((53:ℕ):ℤ)):=by congr 1 have d:(2:ℝ)^(FloatFormat.minSubnormalExponent F64-1) = 2^(-((1075:ℕ):ℤ)):=by congr 1 rw[c,d,zp,zp] at h;exact h.trans (add_le_add le_rfl (inv2le (a:=256) (b:=1075) ш)) def Rel (a b δ:ℝ):Prop := |a-b| ≤ δ * |b| def Ap (x:Float) (X d:ℝ):Prop:=fv x∧Rel (rv x) X d lemma Rel.mono {a b d e:ℝ} (h:Rel a b d) (c:d ≤ e):Rel a b e := h.trans (mul_le_mul_of_nonneg_right c (abs_nonneg _)) lemma 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 lemma 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 lemma Rel.zero {a b d:ℝ} (h:Rel a b d) (c:b=0):a=0:=by unfold Rel at h;rw[c,abs_zero,mul_zero,sub_zero] at h;exact abs_nonpos_iff.1 h theorem Rel.trans {a b c d e:ℝ} (h:Rel a b d) (g:Rel b c e) (j:0 ≤ d:=by norm_num) : Rel a c (d+e+d*e):=by have i:=g.le;unfold Rel at * calc |a-c| ≤ |a-b| + |b-c|:=abs_sub_le a b c _≤d * |b| + e * |c|:=add_le_add h g _≤d*((1+e) * |c|)+e * |c|:=by gcongr _=(d+e+d*e) * |c|:=by ring theorem Rel.mul {g a c b2 e d:ℝ} (k:Rel g a e) (j:Rel c b2 d) (i:0 ≤ e:=by norm_num) : Rel (g*c) (a*b2) (e+d+e*d):=by have h:=j.le;unfold Rel at * rw[abs_mul a b2] calc |g*c-a*b2| = |(g-a)*c+a*(c-b2)|:=by ring_nf _ ≤ |g-a| * |c| + |a| * |c-b2|:=by rw[← abs_mul,← abs_mul];exact abs_add_le _ _ _≤(e * |a|)*((1+d) * |b2|) + |a| * (d * |b2|):=by apply add_le_add ·exact mul_le_mul k h (abs_nonneg _) (mul_nonneg i (abs_nonneg _)) ·exact mul_le_mul_of_nonneg_left j (abs_nonneg _) _=(e+d+e*d)*(|a| * |b2|):=by ring lemma Rel.div {g a d b2 e c:ℝ} (o:Rel g a e) (l:Rel d b2 c) (i:b2≠0) (q:0 ≤ e:=by norm_num) (n:0 ≤ c:=by norm_num) (k:c < 1:=by norm_num) : Rel (g/d) (a/b2) ((e+c)/(1-c)):=by have m:0 < |b2|:=abs_pos.2 i;have j:=l.ge have hA:0 < |d|:=lt_of_lt_of_le (mul_pos (sub_pos.2 k) m) j;unfold Rel at * rw[div_sub_div _ _ (abs_pos.1 hA) i,abs_div,abs_mul,abs_div];have h : |g*b2-d*a| ≤ (e+c) * |a| * |b2|:=by calc |g*b2-d*a| = |(g-a)*b2-a*(d-b2)|:=by ring_nf _ ≤ |g-a| * |b2| + |a| * |d-b2|:=by rw[← abs_mul,← abs_mul];exact abs_sub _ _ _≤e * |a| * |b2| + |a| * (c * |b2|):=by apply add_le_add ·exact mul_le_mul_of_nonneg_right o (abs_nonneg _) ·exact mul_le_mul_of_nonneg_left l (abs_nonneg _) _=(e+c) * |a| * |b2|:=by ring rw[div_le_iff₀ (mul_pos hA m)];have p:0<1-c:=sub_pos.2 k calc |g*b2-d*a| ≤ (e+c) * |a| * |b2|:=h _=(e+c)/(1-c)*(|a| / |b2|)*((1-c) * |b2| * |b2|):=by rw[div_mul_div_comm,div_mul_eq_mul_div,eq_div_iff (mul_ne_zero p.ne' m.ne')];ring _≤(e+c)/(1-c)*(|a| / |b2|)*(|d| * |b2|):=by apply mul_le_mul_of_nonneg_left _ (mul_nonneg (div_nonneg (add_nonneg q n) p.le) (div_nonneg (abs_nonneg _) m.le));exact mul_le_mul_of_nonneg_right j (abs_nonneg _) lemma Rel.add {g a e b2 d:ℝ} (j:Rel g a d) (i:Rel e b2 d) (h:0 ≤ a) (c:0 ≤ b2):Rel (g+e) (a+b2) d:=by unfold Rel at *;rw[abs_of_nonneg h] at j;rw[abs_of_nonneg c] at i rw[abs_of_nonneg (add_nonneg h c)] calc |g+e-(a+b2)| = |(g-a)+(e-b2)|:=by ring_nf _ ≤ |g-a| + |e-b2|:=abs_add_le _ _ _≤d*a+d*b2:=add_le_add j i _=d*(a+b2):=by ring lemma rnd52 {x:ℝ} (a:1/2^203 ≤ |x|) : Rel (Model.roundAt F64 x) x (1/2^52):=by unfold Rel;have b:(1:ℝ)/2^256≤1/2^53*|x|:=le_trans ш (mul_le_mul_of_nonneg_left a ш) exact (rndA x).trans (le_of_le_of_eq (add_le_add le_rfl b) (by ring)) lemma rndR {v b d:ℝ} (h:Rel v b d) (c:d ≤ 1/2) (a:b=0∨1/2^202 ≤ |b|) : Rel (Model.roundAt F64 v) b (d+1/2^51):=by rcases a with a | a ·rw[h.zero a,Model.roundAt_zero,a];unfold Rel;simp ·have e:1/2 * |b| ≤ (1-d) * |b|:=mul_le_mul_of_nonneg_right (by linarith only[c]) (abs_nonneg _) exact ((rnd52 (le_trans (le_trans ш (mul_le_mul_of_nonneg_left a ш)) (e.trans h.ge))).trans h).mono (by linarith only[c]) lemma opR {z:Float} {v b d:ℝ} (i : |v| ≤ 4 → fv z∧rv z=Model.roundAt F64 v) (h:Rel v b d) (j:b=0∨1/2^202 ≤ b) (c:b ≤ 2) (a:0 ≤ b:=by positivity) (g:d ≤ 1/2:=by norm_num):Ap z b (d+1/2^51):=by rw[← abs_of_nonneg a] at c;have k:(1+d) * |b| ≤ 3/2*2:=mul_le_mul (by linarith) c (abs_nonneg _) ш obtain ⟨f,e⟩:=i (by linarith [h.le]) exact ⟨f,by rw[e];exact rndR h g (by rwa [abs_of_nonneg a])⟩ lemma 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 lemma 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] lemma valW (a:UInt64) (e:((a>>>52)&&&2047).toNat≠0) (g:((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 c:(a&&&0xFFFFFFFFFFFFF).toNat<2^F64.fracWidth:=by rw[UInt64.toNat_and];exact lt_of_le_of_lt Nat.and_le_right ж have d:((a>>>52)&&&2047).toNat<2^F64.expWidth:=by show _<2^11;omega refine ⟨?_,?_⟩ ·rw[Model.isFinite_ofFields _ _ _ _ d c];show (((a>>>52)&&&2047).toNat != 2047)=true simp only[bne_iff_ne,ne_eq];omega ·rw[Model.toReal_ofFields_normal _ _ _ _ e (by show _<2047;exact g) c] 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 lemma ofBitsM (a:UInt64) (d:¬ (a>>>52)&&&2047=2047) : Model.ofFloatModel (Float.ofBits a).toModel=Model.ofModelBits (fmt:=F64) a.toBitVec:=by have h: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[h];apply Model.canonicalizeModel_eq_self;refine ⟨λc _=>absurd c ?_⟩ intro c;apply d;have:=congrArg BitVec.toNat c have g:F64.toModel.exponentBits=11:=rfl;have e:F64.toModel.mantissaBitsWithoutImplicit=52:=rfl simp[Float.Model.UnpackedFloat.unpackExponent,Model.toModelBits,Model.ofModelBits,g,e] 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 lemma rvB (a:UInt64) (e:((a>>>52)&&&2047).toNat≠0) (c:((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 d:¬ (a>>>52)&&&2047=2047:=λh=>by rw[h] at c;simp at c have ⟨f,v⟩:=valW a e c;exact ⟨by unfold fv;rw[ofBitsM a d];exact f,by unfold rv;rw[ofBitsM a d];exact v⟩ lemma modelW (y:Float):Model.ofFloatModel y.toModel = Model.ofModelBits (fmt:=F64) y.toBits.toBitVec:=rfl lemma 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 ж d d.significand 0 (by simp only[pow_zero,mul_one]) l g (e.trans p4) rw[← Model.toReal_roundDyadic_eq_roundAt _ ж d h,j] lemma 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 ж] exact Model.ofModel_ofInt_eq_roundDyadic FloatFormat.binary64 ж _ 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 c : |((Int64.toInt i:ℤ):ℝ)| ≤ (2:ℝ)^(60:ℕ):=by have a:((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[← a];linarith only[this] have ⟨j,l⟩:=Model.roundDyadic_of_representable FloatFormat.binary64 ж (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 c.trans pmax) exact ⟨by rw[fv,g];exact j,by rw[rv,g,l,d]⟩ lemma i64U (u:UInt64) (h:u.toNat < 2^53):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⟩ lemma 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 lemma canonR (m:Model F64) : Model.toReal (Model.canonicalizeModel m)=Model.toReal m:=by rw[Model.toReal_eq_unpackedToReal_toModel ж,Model.toReal_eq_unpackedToReal_toModel ж,Model.toModel_canonicalizeModel] lemma 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 _ ж,Model.toDyadic?_ieee_eq_model _ ж,Model.toModel_canonicalizeModel] lemma 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]⟩ lemma dyM_spec (n k:ℕ) (d:n < 2^(53:ℕ)) (i:k ≤ 1000) : Model.isFinite (dyM n k)=true ∧ Model.toReal (dyM n k) = -((n:ℝ)*2^(-(k:ℤ))):=by have c:(⟨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 e : |(⟨true,n,-(k:ℤ)⟩:FloatLib.Numerics.Dyadic).toReal| ≤ Model.toReal (Model.posMaxFinite F64):=by refine le_trans ?_ pmax;rw[c,abs_neg,abs_of_nonneg ф] have l:(n:ℝ)≤2^(53:ℕ):=by exact_mod_cast d.le have g:(2:ℝ)^(-(k:ℤ))≤1:=zpow_le_one_of_nonpos₀ ш щ calc (n:ℝ)*2^(-(k:ℤ))≤2^(53:ℕ)*1:=by gcongr _≤2^(60:ℕ):=by norm_num have a:F64.minSubnormalExponent=-1074:=rfl;have ⟨h,j⟩:=Model.roundDyadic_of_representable F64 ж ⟨true,n,-(k:ℤ)⟩ n 0 ц d (by rw[a];show (-1074:ℤ)≤-(k:ℤ);omega) e exact ⟨h,by unfold dyM;rw[j,c]⟩ lemma expLB {x:ℝ} (h:x ≤ 100):1/2^(200:ℕ) ≤ exp (-x):=by have e:exp (-100)≤exp (-x):=exp_le_exp.2 (by linarith) have c:exp 1≤3:=by have:=Real.exp_one_lt_d9;linarith have a: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 c 100 have g:(3:ℝ)^(100:ℕ)≤2^(200:ℕ):=by norm_num have d:exp (-100)=1/exp 100:=by rw[Real.exp_neg,one_div] refine le_trans ?_ e;rw[d];exact one_div_le_one_div_of_le (exp_pos _) (a.trans g) lemma getT (j:ℕ) (a:j < 64) : tT.get! j=toF (Model.Transcendentals.CorrectlyRounded.exp (dyM j 6)):=by show (Array.ofFn _)[j]! = _;rw[getElem!_pos _ _ (by simpa using a),Array.getElem_ofFn] lemma getM (j:ℕ) (a:j < 64) : tM.get! j=toF (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j 6)):=by show (Array.ofFn _)[j]! = _;rw[getElem!_pos _ _ (by simpa using a),Array.getElem_ofFn] lemma 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] lemma expTab (n k:ℕ) (e:n < 2^53) (d:k ≤ 1000) (g:(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 e d;have a:exp (Model.toReal (dyM n k)) < Model.Transcendentals.Certified.overflowThreshold F64:=by refine lt_of_le_of_lt ?_ (Model.Transcendentals.CorrectlyRounded.one_lt_overflowThreshold ж) have i:(0:ℝ)≤n*2^(-(k:ℤ)):=by positivity rw[hv];exact exp_le_one_iff.2 (by linarith) have h:=Model.Transcendentals.CorrectlyRounded.toReal_exp_eq_roundAt ж hf a (budget:={}) have c:=Model.Transcendentals.CorrectlyRounded.isFinite_exp ж hf a (budget:={}) have ⟨f3,v3⟩:=toF_spec (Model.Transcendentals.CorrectlyRounded.exp (dyM n k));refine ⟨f3.2 c,?_⟩ rw[v3,h,hv];refine rnd52 ?_ rw[abs_of_pos (exp_pos _)];exact le_trans (inv2le ш) (expLB g) lemma tT_spec (j:ℕ) (a: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 c:(j:ℝ)≤64:=by exact_mod_cast a.le rw[getT j a,e];exact expTab j 6 щ ш (by rw[← e];exact (div_le_iff₀ ш).2 (c.trans ш)) lemma 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 a:(i:ℝ)≤88:=by exact_mod_cast hi.le rw[getE i hi];conv=>arg 2;rw[e] exact expTab i 0 щ ш (by rw[← e];exact a.trans ш) lemma tM_spec (j:ℕ) (h:j < 64) : Ap (tM.get! j) (exp (-((j:ℝ)/64))-1) (1/2^52):=by have ⟨hf,hv⟩:=dyM_spec j 6 щ ш have a:Model.toReal (dyM j 6)=-((j:ℝ)/64):=by rw[hv];norm_num;ring have l:exp (-((j:ℝ)/64))≤1:=exp_le_one_iff.2 (neg_nonpos.2 ф) have d: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 ж) rw[a];linarith only[l] have k:=Model.Transcendentals.CorrectlyRounded.toReal_expMinus1_eq_roundAt ж hf d (budget:={}) have g:=Model.Transcendentals.CorrectlyRounded.isFinite_expMinus1 ж hf d (budget:={}) have ⟨f3,v3⟩:=toF_spec (Model.Transcendentals.CorrectlyRounded.expMinus1 (dyM j 6));rw[getM j h] refine ⟨f3.2 g,?_⟩;rw[v3,k,a] rcases Nat.eq_zero_or_pos j with c | c ·subst c;unfold Rel;simp[Model.roundAt_zero] ·refine rnd52 ?_;have i:(1:ℝ)/64≤(j:ℝ)/64:=by gcongr;exact_mod_cast c have e:(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 only[this])) rw[Real.exp_neg,le_inv_comm₀ ш (exp_pos 1)];exact this.le.trans ш have:=mul_le_mul i e ш ф rw[abs_of_nonpos (sub_nonpos.2 l)];exact le_trans ш (this.trans ((gLB _).trans (neg_sub _ _).symm.le)) lemma 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 ⟨i,g,c,d,j⟩:=h;subst i g c;exact rvB a d j lemma 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⟩ lemma kone:fv one∧rv one=1:=by have ⟨f,v⟩:=cstE 0x3ff0000000000000 false 0 1023;exact ⟨f,by rw[v];norm_num⟩ lemma ktwo:fv two∧rv two=2:=by have ⟨f,v⟩:=cstE 0x4000000000000000 false 0 1024;exact ⟨f,by rw[v];norm_num⟩ lemma dP1 {a b x y:ℝ} (h:|a-b| ≤ x) (g:|b| ≤ y):|a| ≤ x+y:=(sub_le_iff_le_add.1 (abs_sub_abs_le_abs_sub a b)).trans (add_le_add h g) lemma hstep {s r c:Float} {S R C:ℝ} (u:fv s) (y:fv r) (v:fv c) (hR:rv r=R) (a:0 ≤ R) (h:R ≤ 1/64) (n : |rv s-S| ≤ 1/2^50) (o : |rv c-C| ≤ 1/2^52) (i : |S| ≤ 1:=by norm_num [abs_div]) (g : |C| ≤ 3/2:=by norm_num [abs_div]) : fv (s*r+c) ∧ |rv (s*r+c)-(S*R+C)| ≤ 1/2^50 ∧ |S*R+C| ≤ 1/64 + |C| := by have w : |rv s| ≤ 2:=(dP1 n i).trans ш have d : |rv s*R| ≤ 1/32:=by rw[abs_mul,abs_of_nonneg a];exact (mul_le_mul w h a ш).trans ш have A : |rv s*R-S*R| ≤ 1/2^56:=by rw[← sub_mul,abs_mul,abs_of_nonneg a];exact (mul_le_mul n h a ф).trans ш obtain ⟨fm,t⟩:=mulF s r u y (by rw[hR];exact d.trans ш) rw[hR] at t;have e:=rndA (rv s*R);rw[← t] at e have k:=e.trans (add_le_add (mul_le_mul_of_nonneg_left d ш) le_rfl) have j : |rv (s*r)| ≤ 1/16:=(dP1 k d).trans ш have m : |rv c| ≤ 2:=(dP1 o g).trans ш have a8 : |rv (s*r)+rv c| ≤ 3:=(abs_add_le _ _).trans ((add_le_add j m).trans ш) obtain ⟨x,z⟩:=addF _ c fm v (j.trans ш) m (a8.trans ш) have q:=rndA (rv (s*r)+rv c);rw[← z] at q;have a9 : |S*R| ≤ 1/64:=by rw[abs_mul,abs_of_nonneg a];exact (mul_le_mul i h a ш).trans ш refine ⟨x,?_,(abs_add_le _ _).trans (add_le_add a9 le_rfl)⟩;exact (abs_sub_le _ _ _).trans ((add_le_add (q.trans (add_le_add (mul_le_mul_of_nonneg_left a8 ш) le_rfl)) (le_trans (by rw[add_sub_add_comm];exact abs_add_le _ _) (add_le_add ((abs_sub_le _ (rv s*R) _).trans (add_le_add k A)) o))).trans ш) noncomputable def Q6 (R:ℝ):ℝ := ((((-1/720*R+1/120)*R + -1/24)*R+1/6)*R + -1/2)*R+1 lemma hqC {R a Y c d:ℝ} (g:0 ≤ R) (e:R ≤ 1/64) (i:0 ≤ a) (q:|a-R*R| ≤ 1/2^53*|R*R|+1/2^256) (n:|Y-(((-1/720*R+1/120)*a+c)*a+d)| ≤ 1/2^50) (p:|c-(-1/24*R+1/6)| ≤ 1/2^50) (l:|d-(-1/2*R+1)| ≤ 1/2^50):|Y-Q6 R| ≤ 3/2^50:=by have j:=mul_self_nonneg R;have h:R*R≤1/4096:=(mul_le_mul e e g ш).trans ш rw[abs_of_nonneg j] at q;have D:|a-R*R| ≤ 1/2^64:=q.trans ((add_le_add (mul_le_mul_of_nonneg_left h ш) le_rfl).trans ш) have k:=(sub_le_iff_le_add.1 (abs_le.1 D).2).trans (add_le_add le_rfl h);have o:|(c-(-1/24*R+1/6))*a| ≤ 1/2^50*(1/32):=by rw[abs_mul,abs_of_nonneg i];exact mul_le_mul p (k.trans ш) i ф have u:=add_nonneg i j;have w:=mul_le_mul (add_le_iff_nonpos_left.2 (mul_nonpos_of_nonpos_of_nonneg ш g):-1/720*R+1/120≤1/120) ((add_le_add k h).trans ш:a+R*R≤1) u ш have x:=mul_nonneg (show (0:ℝ)≤-1/720*R+1/120 from le_trans ш (add_le_add (mul_le_mul_of_nonpos_left e ш) le_rfl)) u have m:|(a-R*R)*((-1/24*R+1/6)+(-1/720*R+1/120)*(a+R*R))| ≤ 1/2^64*1:=by rw[abs_mul];exact mul_le_mul D (abs_le.2 ⟨(show (-1:ℝ)≤0+0 by norm_num).trans (add_le_add (le_trans ш (add_le_add (mul_le_mul_of_nonpos_left e ш) le_rfl)) x),(add_le_add (add_le_iff_nonpos_left.2 (mul_nonpos_of_nonpos_of_nonneg ш g):-1/24*R+1/6≤1/6) w).trans ш⟩) (abs_nonneg _) ф have E:Y-Q6 R=(Y-(((-1/720*R+1/120)*a+c)*a+d))+(c-(-1/24*R+1/6))*a+(a-R*R)*((-1/24*R+1/6)+(-1/720*R+1/120)*(a+R*R))+(d-(-1/2*R+1)):=by unfold Q6;ring rw[E];exact ((abs_add_le _ _).trans (add_le_add ((abs_add_le _ _).trans (add_le_add ((abs_add_le _ _).trans (add_le_add n o)) m)) l)).trans ш lemma hqSpec (r:Float) (R:ℝ) (d:fv r) (hR:rv r=R) (c:0 ≤ R) (a:R ≤ 1/64) : fv (hq r) ∧ |rv (hq r)-Q6 R| ≤ 3/2^50:=by obtain ⟨f5,c5⟩:=cst 0xbf56c16c16c16c17 true 1901519842667543 1013 (-1/720);obtain ⟨t,v⟩:=cst 0x3f81111111111111 false 300239975158033 1016 (1/120) obtain ⟨p,n⟩:=cst 0xbfa5555555555555 true 1501199875790165 1018 (-1/24);obtain ⟨o,s⟩:=cst 0x3fc5555555555555 false 1501199875790165 1020 (1/6) obtain ⟨y,q⟩:=cst 0xbfe0000000000000 true 0 1022 (-1/2);obtain ⟨f0,c0⟩:=cst 0x3ff0000000000000 false 0 1023 1 have ⟨g1,e1,b1⟩:=hstep f5 d t hR c a (c5.trans ш) v have ⟨g2,e2,b2⟩:=hstep p d o hR c a (n.trans ш) s have ⟨g3,e3,b3⟩:=hstep y d f0 hR c a (q.trans ш) c0 have j:=mul_self_nonneg R;have h:R*R≤1/4096:=(mul_le_mul a a c ш).trans ш obtain ⟨l,i⟩:=mulF r r d d (by rw[hR,abs_of_nonneg j];exact h.trans ш) have e:=rndA (rv r*rv r);rw[← i,hR] at e;have g:0≤rv (r*r):=by rw[i];have:=Model.roundAt_mono F64 (mul_self_nonneg (rv r));rwa [Model.roundAt_zero] at this have k:rv (r*r)≤1/64:=by have:=(abs_le.1 e).2;rw[abs_of_nonneg j] at this;exact (sub_le_iff_le_add.1 this).trans ((add_le_add (add_le_add (mul_le_mul_of_nonneg_left h ш) le_rfl) h).trans ш) set p2:=Float.ofBits 0xbfa5555555555555*r+Float.ofBits 0x3fc5555555555555;set u:=Float.ofBits 0xbfe0000000000000*r+Float.ofBits 0x3ff0000000000000 have m:|rv p2| ≤ 1/4:=(dP1 e2 b2).trans (by norm_num [abs_div]) have ⟨g5,e5,b5⟩:=hstep (C:=rv p2) g1 l g2 rfl g k e1 (by rw[sub_self,abs_zero];positivity) (b1.trans (by norm_num [abs_div])) (m.trans ш) obtain ⟨g6,x,-⟩:=hstep (C:=rv u) g5 l g3 rfl g k e5 (by rw[sub_self,abs_zero];positivity) (b5.trans ((add_le_add le_rfl m).trans ш)) ((dP1 e3 b3).trans ш) exact ⟨g6,hqC c a g e x e2 e3⟩ lemma trunc (R:ℝ) (a:0 ≤ R) (e: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 a];linarith) (n:=7) ш have d : ∑ 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[d,abs_neg,abs_of_nonneg a] at h;rw[show (1-exp (-R))-R*Q6 R=-(exp (-R)-(1-R*Q6 R)) by ring,abs_neg] refine h.trans ?_;have g:R^6≤(1/64)^6:=pow_le_pow_left₀ a e 6 have c:((Nat.succ 7:ℕ):ℝ)/((Nat.factorial 7:ℕ)*(7:ℕ))=1/4410:=by norm_num [Nat.factorial] rw[c] 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 ш a _=R/2^48:=by ring lemma gSpec (r:Float) (R:ℝ) (h:fv r) (hR:rv r=R) (a:0 ≤ R) (c:R ≤ 1/64) (e:R=0∨1/2^150 ≤ R) : Ap (r*hq r) (1-exp (-R)) (1/2^47):=by obtain ⟨fq,k⟩:=hqSpec r R h hR a c;have j:=trunc R a c have g:=add_one_le_exp (-R);have hG:R*(63/64)≤1-exp (-R):=(mul_le_mul_of_nonneg_left (show 63/64≤exp (-R) from (le_trans ш (add_le_add (neg_le_neg c) le_rfl)).trans g) a).trans (gLB R) have l : |R*rv (hq r)-R*Q6 R| ≤ R*(3/2^50):=by rw[← mul_sub,abs_mul,abs_of_nonneg a];exact mul_le_mul_of_nonneg_left k a have i:Rel (rv r*rv (hq r)) (1-exp (-R)) (15/2^51):=by unfold Rel;rw[hR,abs_of_nonneg (le_trans (mul_nonneg a ш) hG)] have:=abs_sub_le (R*rv (hq r)) (R*Q6 R) (1-exp (-R));rw[abs_sub_comm (R*Q6 R)] at this;exact this.trans ((add_le_add l j).trans (by linarith only[hG,a])) have:=opR (mulF r (hq r) h fq) i (by rcases e with d | d ·left;rw[d,neg_zero,exp_zero,sub_self] ·right;exact le_trans ш ((mul_le_mul_of_nonneg_right d ш).trans hG)) (by linarith only[exp_pos (-R)]) (le_trans (mul_nonneg a ш) hG) exact ⟨this.1,this.2.mono ш⟩ lemma 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 lemma Rel.b2 {a b d:ℝ} (h:Rel a b d) (c : |b| ≤ 1) (e:d ≤ 1:=by norm_num) : |a| ≤ 2:=by have:=mul_le_mul (show 1+d≤2 by linarith) c (abs_nonneg _) ш;linarith [h.le] lemma rel1 {d:ℝ} (a:0 ≤ d):Rel 1 1 d:=by unfold Rel; simpa using a lemma thirdE:(1:ℝ)/3 ≤ exp (-1):=by have:=Real.exp_one_lt_d9;rw[Real.exp_neg,le_inv_comm₀ ш (exp_pos 1)];exact this.le.trans ш lemma halfE:exp (-1) ≤ 1/2:=by have:=Real.exp_one_gt_d9;rw[Real.exp_neg,inv_le_comm₀ (exp_pos 1) ш];exact le_trans ш this.le lemma 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 lemma erSpec (r:Float) (R:ℝ) (n:fv r) (hR:rv r=R) (c:0 ≤ R) (d:R ≤ 1/64) (e:R=0∨1/2^150 ≤ R):Ap (one-r*hq r) (exp (-R)) (1/2^50):=by obtain ⟨l,h⟩:=gSpec r R n hR c d e;obtain ⟨m,j⟩:=kone have i:=add_one_le_exp (-R);have a:0≤1-exp (-R):=(mul_nonneg c (exp_pos _).le).trans (gLB R) have g:=h;unfold Rel at g;rw[abs_of_nonneg a] at g;have k:Rel (rv one-rv (r*hq r)) (exp (-R)) (1/2^51):=by unfold Rel;rw[j,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[g,i,d] have:=opR (subF _ _ m l (by rw[j];norm_num) (h.b2 (by rw[abs_of_nonneg a];exact sub_le_self _ (exp_pos _).le))) k (Or.inr (by linarith only[i,d])) ((exp_le_one_iff.2 (neg_nonpos.2 c)).trans one_le_two) exact ⟨this.1,this.2.mono ш⟩ lemma expP (j:ℕ) (o:j < 64) (r:Float) (R:ℝ) (p:fv r) (hR:rv r=R) (d:0 ≤ R) (i:R ≤ 1/64) (c: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 o;obtain ⟨n,m⟩:=gSpec r R p hR d i c have g:(j:ℝ)≤63:=by exact_mod_cast (by omega:j≤63) have e:exp (-((j:ℝ)/64))≤1:=exp_le_one_iff.2 (neg_nonpos.2 ф) have k:1/3≤exp (-((j:ℝ)/64)):=thirdE.trans (exp_le_exp.2 (by linarith only[g])) have l:=add_one_le_exp (-R);have hG:=mul_le_mul_of_nonneg_left (show 63/64≤exp (-R) by linarith only[l,i]) d have a:0≤1-exp (-R):=(mul_nonneg d (exp_pos _).le).trans (gLB R);have:=opR (mulF _ _ fT n) (rT.mul m) (by rcases c with h | h ·left;rw[h,neg_zero,exp_zero,sub_self,mul_zero] ·right;linarith only[mul_le_mul_of_nonneg_right k a,gLB R,hG,h]) (by linarith only[mul_le_mul_of_nonneg_right e a,l,i]) (mul_nonneg (exp_pos _).le a) exact ⟨this.1,this.2.mono ш⟩ lemma expU (j:ℕ) (t:j < 64) (r:Float) (R:ℝ) (y:fv r) (hR:rv r=R) (k:0 ≤ R) (s:R ≤ 1/64) (g: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 ⟨x,u⟩:=expP j t r R y hR k s g;obtain ⟨fM,w⟩:=tM_spec j t have a:(0:ℝ)≤j:=by positivity have p:(j:ℝ)≤63:=by exact_mod_cast (by omega:j≤63) have d:exp (-((j:ℝ)/64))≤1:=exp_le_one_iff.2 (neg_nonpos.2 ф) have z:=add_one_le_exp (-R);have i:0≤1-exp (-R):=(mul_nonneg k (exp_pos _).le).trans (gLB R) have h:0≤exp (-((j:ℝ)/64))*(1-exp (-R)):=mul_nonneg (exp_pos _).le i;have o:Rel (-rv (tM.get! j)) (1-exp (-((j:ℝ)/64))) (9/2^50):=by have:=w.neg;rw[neg_sub] at this;exact this.mono ш have v:=u.add o h (sub_nonneg.2 d);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 v have c:=mul_le_mul_of_nonneg_left (thirdE.trans (exp_le_exp.2 (by linarith only[p,s] : -1≤-((j:ℝ)/64+R)))) (by positivity:(0:ℝ)≤(j:ℝ)/64+R) have N:=c.trans (gLB ((j:ℝ)/64+R));have l : |exp (-((j:ℝ)/64))*(1-exp (-R))| ≤ 1:=by rw[abs_of_nonneg h];linarith only[mul_le_mul_of_nonneg_right d i,z,s] have m : |exp (-((j:ℝ)/64))-1| ≤ 1:=by rw[abs_of_nonpos (sub_nonpos.2 d),neg_sub];exact sub_le_self _ (exp_pos _).le have:=opR (subF _ _ x fM (u.b2 l) (w.b2 m)) v (by rcases g with q | q ·rcases Nat.eq_zero_or_pos j with e | e ·left;rw[q,e];simp ·right;have:(1:ℝ)≤j:=by exact_mod_cast e linarith only[N,this,k] ·right;linarith only[N,q,a]) ((sub_le_self _ (exp_pos _).le).trans one_le_two) (by linarith only[N,a,k]) exact ⟨this.1,this.2.mono ш⟩ lemma dSpec (t:Float) (T d:ℝ) (j:fv t) (hR:Rel (rv t) T d) (a:0 ≤ T) (c:T ≤ 1) (e:0 ≤ d:=by norm_num) (g:d ≤ 1/4:=by norm_num) : Ap (one+t) (1+T) (d+1/2^51):=by obtain ⟨i,h⟩:=kone;have k:Rel (rv one+rv t) (1+T) d:=by rw[h];exact (rel1 e).add hR ш a exact opR (addF _ _ i j (by rw[h];norm_num) (hR.b2 (by rw[abs_of_nonneg a];exact c) (g.trans ш))) k (Or.inr (le_trans ш (le_add_of_nonneg_right a))) ((add_le_add le_rfl c).trans_eq one_add_one_eq_two) (add_nonneg zero_le_one a) (g.trans ш) lemma dPos {x:Float} {D d:ℝ} (h:Rel (rv x) D d) (c:d < 1) (a:0 < D):rv x≠0 := λe=>by have:=h.ge;rw[e,abs_zero,abs_of_pos a] at this exact absurd this (not_le.2 (mul_pos (sub_pos.2 c) a)) lemma qSpec {x d:Float} {X D j g:ℝ} (q:fv x) (p:fv d) (rx:Rel (rv x) X j) (o:Rel (rv d) D g) (h:1 ≤ D) (n:D ≤ 2) (k:1/2^201 ≤ X) (m:X ≤ 2) (l:0 ≤ j:=by norm_num) (i:0 ≤ g:=by norm_num) (a:g ≤ 1/8:=by norm_num) (c:j ≤ 1/8:=by norm_num):Ap (x/d) (X/D) ((j+g)/(1-g)+1/2^51):=by have D0:=one_pos.trans_le h;have g1:=a.trans_lt (by norm_num:(1:ℝ)/8<1) have hq:X/D≤2:=by rw[div_le_iff₀ D0];exact m.trans (le_mul_of_one_le_right zero_le_two h) have e:1/2^202≤X/D:=by rw[le_div_iff₀ D0];linarith only[n,k] exact opR (divF _ _ q p (dPos o g1 D0)) (rx.div o D0.ne' l i g1) (Or.inr e) hq (le_trans ф e) (by rw[div_le_iff₀ (by linarith only[a])];linarith only[a,c,i]) lemma thTailU (nu:Float) (N:ℝ) (g:fv nu) (hR:Rel (rv nu) N (5/2^47)) (c:1/2^200 ≤ N) (a:N ≤ 2/3):Ap (nu/(two-nu)) (N/(2-N)) (1/2^44):=by obtain ⟨j,h⟩:=ktwo;have e:0>>52)&&&2047).toNat=Y.toNat/2^52 ∧ (Y&&&0xFFFFFFFFFFFFF).toNat=Y.toNat%2^52∧(Y>>>63 != 0)=false:=by have k:=Y.toNat_lt;have e:(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 d;rw[ite_eq_left d] simp only[Bool.and_eq_true,decide_eq_true_eq] at d;obtain ⟨⟨⟨⟨g,c⟩,a⟩,i⟩,c5⟩:=d rw[UInt64.le_iff_toNat_le,UInt64.toNat_shiftRight] at g c;rw[UInt64.le_iff_toNat_le,e] at a rw[UInt64.lt_iff_toNat_lt,e] at i;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 g c a i c5;rw[show (536870911:ℕ)=2^29-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] at c5 have j:Y.toNat%2^52%2^29=Y.toNat%2^29:=Nat.mod_mod_of_dvd _ ш refine ⟨g,c,a,by omega,by rw[j];omega,?_,?_,e,?_⟩<;>clear a i c5 j h e ·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 lemma rwN (neg:Bool) (ef f m:ℕ) (i:897 ≤ ef) (h:ef ≤ 1022) (g:1024 ≤ f) (j:f+1024 < 2^52) (d:f%2^29+1024 < 2^28∨2^28+1024 < f%2^29) (c:2^52+f ≤ m+1024) (a: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 e:m.log2=52:=by rw[Nat.log2_eq_iff щ];omega unfold FastRound.roundW;simp only[e,show 52-23=29 from rfl,rse f m d c a,FastRound.p23,FastRound.p24] have hq:(f+2^28)/2^29≤2^23:=by omega rw[ite_eq_left ⟨by norm_num,by omega,by omega,by omega,by omega⟩,add_assoc] refine congrArg (λ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] clear g j d c a e;split_ifs<;>omega lemma encl {y v P:ℝ} {M:ℕ} (hR:Rel y v (1/2^44)) (a:0 < v) (d:0 < P) (g:y=M*P) (e:M < 2^53) : ((M:ℝ)-1024)*P ≤ v∧v ≤ ((M:ℝ)+1024)*P:=by unfold Rel at hR;rw[abs_of_pos a,g] at hR;have h:(M:ℝ)*P≤2^53*P:=mul_le_mul_of_nonneg_right (by exact_mod_cast e.le) d.le have c:=abs_le.1 hR;constructor<;>linarith only[c.1,c.2,h,a,d] lemma wordOK (a:UInt32) (j:2^23 ≤ a.toNat%2^31) (e:a.toNat%2^31 < 255*2^23) : expOf a≠255∧(decodeD a).significand≠0:=by have d:(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 i:=a.toNat_lt;have g:a.toNat/2^23%256=a.toNat%2^31/2^23:=by omega refine ⟨λh=>?_,?_⟩ ·have:=congrArg UInt32.toNat h;rw[d] at this;simp at this;omega ·unfold decodeD;have c:¬ expOf a=0:=λh=>by have:=congrArg UInt32.toNat h;rw[d] at this;simp at this;omega simp only[c,ite_false];omega lemma fin (y:Float) (v:ℝ) (q:0 < v) (hR:Rel (rv y) v (1/2^44)) (ho:rnd y.toBits≠0xFFFFFFFF) (neg:Bool) {z:Model Fmt} (e: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 ⟨m,l,i,n,j,t,h,r,s⟩:=rndN y.toBits ho;generalize y.toBits.toNat/2^52=ef at * generalize y.toBits.toNat%2^52=f at *;have g:rv y=((2^52+f:ℕ):ℝ)*2^((ef:ℤ)-1075):=by unfold rv;rw[modelW];have ⟨_,v1⟩:=valW y.toBits щ щ rw[v1,h,r,s];simp have ⟨lo,hi⟩:=encl hR q ф g щ have p:rnd y.toBits=UInt32.ofNat ((ef-896)*2^23+(f+2^28)/2^29):= UInt32.toNat_inj.mp (by rw[t,UInt32.toNat_ofNat'];omega) have a:=rwN neg ef f (2^52+f-1024) m l i n j щ щ have c:=rwN neg ef f (2^52+f+1024) m l i n j щ щ clear j h r s;rw[← p] at a c;have d:=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 o:(((2^52+f-1024:ℕ):ℤ):ℝ)=((2^52+f:ℕ):ℝ)-1024:=by rw[Int.cast_natCast,Nat.cast_sub щ];push_cast;ring have k:(((2^52+f+1024:ℕ):ℤ):ℝ)=((2^52+f:ℕ):ℝ)+1024:=by push_cast;ring cases neg ·rw[FastRound.roundW_signed _ _ _ (by omega)] at a c simp only[Bool.false_eq_true,ite_false] at a c e⊢;exact FastRound.bracket_spec щ щ a c d.1 d.2 (by rw[o];exact lo) (by rw[k];exact hi) e ·rw[FastRound.roundW_signed _ _ _ (by omega)] at a c simp only[ite_true] at a c e⊢;refine FastRound.bracket_spec щ щ c a d.1 d.2 ?_ ?_ e ·rw[Int.cast_neg,k];linarith only[hi] ·rw[Int.cast_neg,o];linarith only[lo] lemma toReal_ofW' (w:UInt32) (a: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 _ a];simp only[FloatLib.Numerics.Dyadic.toReal,FloatLib.Numerics.Dyadic.cast_signedSignificand] ring lemma 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 j:=w.toNat_lt have a:(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] have d:(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 g:(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 c:(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] refine ⟨?_,?_,?_,?_,?_,?_⟩ ·rw[UInt32.toNat_toUInt64,UInt32.toNat_shiftRight,d,g];simp only[UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow];clear a c d g;omega ·rw[UInt32.toNat_toUInt64,UInt32.toNat_or,UInt32.toNat_and,d,c];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 _ ф)] clear a g d c;omega ·rw[d,g,c];clear a d g c;omega ·rw[c];exact Nat.mod_lt _ ф ·clear d g c;unfold signOf;rw[UInt32.le_iff_toNat_le] simp only[bne_iff_ne,ne_eq,← UInt32.toNat_inj,a,UInt32.reduceToNat];constructor<;>intro h<;>omega ·clear d g c;unfold signOf;rw[a] by_cases h:w.toNat/2^31=0 ·have:(w&&&0x80000000)=0:=UInt32.toNat_inj.mp (by rw[a,h];rfl) simp[this];omega ·have i:w.toNat/2^31=1:=by omega have:(w&&&0x80000000)≠0:=λe=>by have:=congrArg UInt32.toNat e;rw[a,i] at this;simp at this simp[this];omega lemma xval (w:UInt32) (a:expOf w≠0) (c: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 c];unfold decodeD simp only[a,ite_false] noncomputable def C32 (ex fr:ℕ):ℝ:=((2^23+fr:ℕ):ℝ)*(2:ℝ)^((ex:ℤ)-150) lemma C32_lt (a e c d:ℕ) (k:e < 2^(23:ℕ)) (j:d < 2^(23:ℕ)) (h:a*2^(23:ℕ)+e < c*2^(23:ℕ)+d):C32 a e < C32 c d:=by unfold C32;rcases Nat.lt_or_ge a c with i | i ·have n:((2^(23:ℕ)+e:ℕ):ℝ)*(2:ℝ)^((a:ℤ)-150)<(2:ℝ)^(24:ℕ)*2^((a:ℤ)-150):=by apply mul_lt_mul_of_pos_right _ ф;exact_mod_cast (by omega:2^(23:ℕ)+e<2^(24:ℕ)) have m:(2:ℝ)^(24:ℕ)*2^((a:ℤ)-150)≤(2:ℝ)^(23:ℕ)*2^((c:ℤ)-150):=by rw[← zpow_natCast,← zpow_natCast,← zpow_add₀ two_ne_zero,← zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ ш (by push_cast;omega) have l:(2:ℝ)^(23:ℕ)*2^((c:ℤ)-150)≤((2^(23:ℕ)+d:ℕ):ℝ)*2^((c:ℤ)-150):=by apply mul_le_mul_of_nonneg_right _ ф;exact_mod_cast (by omega:2^(23:ℕ)≤2^(23:ℕ)+d) exact (n.trans_le m).trans_le l ·have g:a=c:=by omega subst g;apply mul_lt_mul_of_pos_right _ ф;exact_mod_cast (by omega:2^(23:ℕ)+e<2^(23:ℕ)+d) lemma C32_le (d c e a:ℕ) (i:c < 2^23) (g:a < 2^23) (h:e*2^23+a ≤ d*2^23+c):C32 e a ≤ C32 d c:=by rcases (Nat.lt_or_ge (e*2^23+a) (d*2^23+c)) with j | j ·exact (C32_lt e a d c g i j).le ·have:e=d∧a=c:=by omega rw[this.1,this.2] lemma e18:exp (-18) ≤ 1/2^25:=by have c:(2.7:ℝ)≤exp 1:=le_trans ш Real.exp_one_gt_d9.le have a:(2.7:ℝ)^(18:ℕ)≤exp 18:=by rw[show (18:ℝ)=((18:ℕ):ℝ)*1 by norm_num,Real.exp_nat_mul] exact pow_le_pow_left₀ ш c 18 rw[Real.exp_neg,inv_eq_one_div];exact one_div_le_one_div_of_le ф (le_trans ш a) lemma sgS (w:UInt32) (a:expOf w≠255) : Model.toReal (sigmoidModel (ofW w))=Model.roundAt Fmt (realSigmoid (Model.toReal (ofW w))) := (toReal_sigmoidModel (fmt:=Fmt) ж (input:=Model.ofUInt32 w) (by simp[isFinite_ofUInt32,a])).2 lemma thS (w:UInt32) (a:expOf w≠255) : Model.toReal (tanhModel (ofW w))=Model.roundAt Fmt (tanh (Model.toReal (ofW w))) := (toReal_tanhModel (fmt:=Fmt) ж (input:=Model.ofUInt32 w) (by simp[isFinite_ofUInt32,a])).2 lemma sgZero (w:UInt32) (h:(w&&&0x7FFFFFFF)=0):sigmoidCR w=0x3F000000:=by obtain ⟨_,_,g,k,_,_⟩:=dec32 w;rw[h] at g;simp at g have c:expOf w=0:=UInt32.toNat_inj.mp (by simp;omega) have i:fracOf w=0:=UInt32.toNat_inj.mp (by simp;omega) have j:Model.toReal (ofW w)=0:=by rw[toReal_ofW' w (by simp[c])];unfold decodeD;simp[c,i] have a:=sgS w (by simp[c]) rw[j] at a;change toWord (sigmoidModel (ofW w))=_ have e:realSigmoid 0=((2^23:ℤ):ℝ)*2^(-24:ℤ):=by unfold realSigmoid;norm_num have d:finishWord (2^23) (-24) false=0x3F000000:= (FastRound.roundW_signed false (2^23) (-24) ш).symm.trans ж exact FastRound.bracket_spec ш ш d d ж ж (le_of_eq e.symm) (le_of_eq e) a lemma thZero (w:UInt32) (h:(w&&&0x7FFFFFFF)=0):tanhCR w=w:=by have c:=w.toNat_lt;have a:(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 a;simp at a;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 lemma wv (w:UInt32) (j:2^23 ≤ (w&&&0x7FFFFFFF).toNat) (k:(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 ⟨d,h,l,i,-,-⟩:=dec32 w;have c:expOf w≠0:=λe=>by have:=congrArg UInt32.toNat e;simp at this;omega have a:expOf w≠255:=λe=>by have:=congrArg UInt32.toNat e;simp at this;omega have g:cv (eW w) (mW w)=C32 (expOf w).toNat (fracOf w).toNat:=by unfold cv C32;rw[d,h] exact ⟨a,by rw[xval w c a,g];rfl,g,by omega⟩ lemma satW (neg:Bool) (v:ℝ) (g:1-1/2^25 ≤ v) (a:v ≤ 1) {z:Model Fmt} (c:Model.toReal z=Model.roundAt Fmt (if neg then -v else v)) : toWord z=(if neg then 0x80000000 else 0)+0x3F800000:=by have d:(((2^25-1:ℤ):ℝ)*2^(-25:ℤ))=1-1/2^25:=by norm_num have h:(((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) _ ш).symm.trans ж) ((FastRound.roundW_signed false (2^25) _ ш).symm.trans ж) ж ж (by rw[d];exact g) (by rw[h];exact a) c ·exact FastRound.bracket_spec (lo:=-(2^25)) (hi:=-(2^25-1)) (e:=-25) (v:=-v) (by norm_num) ш ((FastRound.roundW_signed true (2^25) _ ш).symm.trans ж) ((FastRound.roundW_signed true (2^25-1) _ ш).symm.trans ж) ж ж (by rw[Int.cast_neg,neg_mul,h];exact neg_le_neg a) (by rw[Int.cast_neg,neg_mul,d];exact neg_le_neg g) c lemma sgSat (w:UInt32) (o:w < 0x80000000) (i:0x41900000 ≤ w&&&0x7FFFFFFF) (d:w&&&0x7FFFFFFF < 0x7F800000):sigmoidCR w=0x3F800000:=by obtain ⟨_,_,p,e,m,-⟩:=dec32 w;rw[UInt32.le_iff_toNat_le] at i;rw[UInt32.lt_iff_toNat_lt] at d simp only[UInt32.reduceToNat] at i d;obtain ⟨h,l,k,-⟩:=wv w щ d have c:signOf w=false:=by cases hh:signOf w ·rfl ·exact absurd (m.1 hh) (UInt32.not_le.2 o) have g:18≤cv (eW w) (mW w):=by rw[k];exact le_trans (by unfold C32;norm_num) (C32_le _ _ 131 1048576 e ш щ) have a:=sgS w h;rw[l,c] at a have n:exp (-cv (eW w) (mW w))≤1/2^25:= le_trans (exp_le_exp.2 (neg_le_neg g)) e18 have j:=exp_pos (-cv (eW w) (mW w));have:=satW false (realSigmoid (cv (eW w) (mW w))) (by unfold realSigmoid;rw[le_div_iff₀ (add_pos one_pos j)];linarith only[n,j]) (realSigmoid_lt_one _).le (z:=sigmoidModel (ofW w)) (by simpa using a) change toWord (sigmoidModel (ofW w))=_;simpa using this lemma thSat (w:UInt32) (i:0x41180000 ≤ w&&&0x7FFFFFFF) (c:w&&&0x7FFFFFFF < 0x7F800000) : tanhCR w=(w&&&0x80000000)+0x3F800000:=by obtain ⟨_,_,o,g,-,e⟩:=dec32 w;rw[UInt32.le_iff_toNat_le] at i;rw[UInt32.lt_iff_toNat_lt] at c simp only[UInt32.reduceToNat] at i c;obtain ⟨h,m,k,-⟩:=wv w щ c have d:19/2≤cv (eW w) (mW w):=by rw[k];exact le_trans (by unfold C32;norm_num) (C32_le _ _ 130 1572864 g ш щ) have a:=thS w h;rw[m] at a have n:exp (-2*cv (eW w) (mW w))≤1/2^26:=by have:=mul_le_mul (le_trans (exp_le_exp.2 (by linarith only[d] : -2*cv (eW w) (mW w)+1≤-18)) e18) halfE (exp_pos _).le ш rw[← exp_add,show -2*cv (eW w) (mW w)+1+-1=-2*cv (eW w) (mW w) by ring] at this exact this.trans_eq ш have j:=exp_pos (-2*cv (eW w) (mW w));have l:=satW (signOf w) (tanh (cv (eW w) (mW w))) (by rw[tanh_eq_exp_neg_two,le_div_iff₀ (add_pos one_pos j)];linarith only[n,j]) (Real.tanh_lt_one _).le (z:=tanhModel (ofW w)) (by rw[a];cases signOf w<;>simp[Real.tanh_neg]) change toWord (tanhModel (ofW w))=_;rw[l];congr 1 apply UInt32.toNat_inj.mp;rw[e];cases signOf w<;>simp lemma kh:fv sc.h∧rv sc.h=1/2^37:=by show fv (Float.ofBits 0x3da0000000000000)∧rv (Float.ofBits 0x3da0000000000000)=1/2^37;have ⟨f,v⟩:=cstE 0x3da0000000000000 false 0 986;exact ⟨f,by rw[v];norm_num⟩ lemma fxSpec (a b:UInt32) (B:ℕ) (q:b.toNat=B) (D:B*2^23 ≤ a.toNat) (C:a.toNat < (B+19)*2^23) : fv (rF (fxOf a b))∧0 ≤ rv (rF (fxOf a b))∧rv (rF (fxOf a b)) ≤ 1/64 ∧ (rv (rF (fxOf a b))=0∨1/2^150 ≤ rv (rF (fxOf a b)))∧(fxOf a b>>>31).toNat < 2048 ∧ ((2^23+a.toNat%2^23:ℕ):ℝ)*(2:ℝ)^(((a.toNat/2^23:ℕ):ℤ)-((B+37:ℕ):ℤ)) = ((fxOf a b>>>31).toNat:ℝ)/64+rv (rF (fxOf a b)):=by have A:=a.toNat_lt;have w:(((a&&&0x7FFFFF)|||0x800000).toUInt64).toNat=2^23+a.toNat%2^23:=by rw[UInt32.toNat_toUInt64,UInt32.toNat_or,UInt32.toNat_and];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 _ ф)];omega have j:(a>>>23).toNat=a.toNat/2^23:=by rw[UInt32.toNat_shiftRight];simp only[UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] have p:(((a>>>23)-b).toUInt64).toNat=a.toNat/2^23-B:=by rw[UInt32.toNat_toUInt64,UInt32.toNat_sub_of_le _ _ (by rw[UInt32.le_iff_toNat_le,j,q];omega),j,q] generalize hS:a.toNat/2^23-B=s at p;have h:=Nat.mul_lt_mul_of_lt_of_le (by omega:2^23+a.toNat%2^23<2^24) (Nat.pow_le_pow_right Nat.zero_lt_two (by omega:s≤18)) ф have i:(fxOf a b).toNat=(2^23+a.toNat%2^23)*2^s:=by unfold fxOf;rw[UInt64.toNat_shiftLeft,w,p,Nat.mod_eq_of_lt (by omega:s<64),Nat.shiftLeft_eq];exact Nat.mod_eq_of_lt щ generalize fxOf a b=fx at i⊢;have t:(fx>>>31).toNat=fx.toNat/2^31:=by rw[UInt64.toNat_shiftRight];simp only[UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] have hi:(fx&&&0x7FFFFFFF).toNat=fx.toNat%2^31:=by rw[UInt64.toNat_and];simp only[UInt64.reduceToNat];rw[show (2147483647:ℕ)=2^31-1 from rfl,Nat.and_two_pow_sub_one_eq_mod] have ⟨fi,vi⟩:=i64U (fx&&&0x7FFFFFFF) щ obtain ⟨y,u⟩:=kh;generalize (fx&&&0x7FFFFFFF).toNat=N at hi vi;have e:(N:ℝ)*(1/2^37)<1/64:=by have:(N:ℝ)<2^31:=by exact_mod_cast (by omega:N<2^31) exact (mul_lt_mul_of_pos_right this ш).trans_le ш have ⟨fr,vr⟩:=mulF _ _ fi y (by rw[vi,u,abs_of_nonneg ф];exact e.le.trans ш) have d:rv (rF fx)=N*(1/2^37):=by show rv ((fx&&&0x7FFFFFFF).toInt64.toFloat*sc.h)=_;rw[vr,vi,u,←zp,←FloatLib.Numerics.Dyadic.toReal_mk_false] exact rndExact _ (by show N<2^53;omega) (by show (-1074:ℤ)≤-((37:ℕ):ℤ);norm_num) (by rw[FloatLib.Numerics.Dyadic.toReal_mk_false,zp,abs_of_nonneg ф];exact e.le.trans ш) refine ⟨fr,?_⟩;rw[d,t];refine ⟨by positivity,e.le,?_,by omega,?_⟩ ·rcases N.eq_zero_or_pos with n|n ·simp[n] ·right;exact le_trans ш (mul_le_mul_of_nonneg_right (by exact_mod_cast n:(1:ℝ)≤N) ш) ·have m:(fx.toNat:ℝ)=((fx.toNat/2^31:ℕ):ℝ)*2^31+N:=by rw[hi];exact_mod_cast (Nat.div_add_mod' fx.toNat (2^31)).symm rw[show (((a.toNat/2^23:ℕ):ℤ)-((B+37:ℕ):ℤ))=(s:ℤ)+(-((37:ℕ):ℤ)) by omega,zpow_add₀ two_ne_zero,zpow_natCast,zp,←mul_assoc] have:((2^23+a.toNat%2^23:ℕ):ℝ)*2^s=(fx.toNat:ℝ):=by rw[i];push_cast;ring rw[this,m];ring lemma ug (A:FloatArray) (i:USize) (h:i.toNat < A.size):A.uget i h=A.data[i.toNat]'h:=rfl lemma tWe:tW=⟨Array.ofFn (n:=4096) λi=>tWf i.val⟩:=by unfold tW; rfl lemma tWd:tW.data=Array.ofFn (n:=4096) λi=>tWf i.val:=by rw [tWe] lemma tGH (a:UInt64) (g:(a>>>31).toNat < 2048) : tG a=(if (a>>>31).toNat < 64 then tT.get! (a>>>31).toNat else tE.get! ((a>>>31).toNat/64)*tT.get! ((a>>>31).toNat%64)) ∧ tH a=(if (a>>>31).toNat < 64 then tM.get! (a>>>31).toNat else tE.get! ((a>>>31).toNat/64)*tT.get! ((a>>>31).toNat%64)-sc.f):=by obtain ⟨d,c⟩:=jOf_v a;rw[Nat.mod_eq_of_lt g] at d c have h:=tU (jOf a) щ have e:=tU (jOf a+1) щ generalize (a>>>31).toNat=k at *;have o:2*k%2=0∧2*k/2=k∧¬(2*k+1)%2=0∧(2*k+1)/2=k:=by omega constructor ·unfold tG;rw[ug];simp only[tWd,Array.getElem_ofFn,h,d,tWf];rw[if_pos o.1,o.2.1] ·unfold tH;rw[ug];simp only[tWd,Array.getElem_ofFn,e,c,tWf];rw[if_neg o.2.2.1,o.2.2.2] split_ifs<;>rfl lemma tTk (k:ℕ) (d:k < 2048) : Ap (if k < 64 then tT.get! k else tE.get! (k/64)*tT.get! (k%64)) (exp (-((k:ℝ)/64))) (1/2^49):=by split_ifs with h ·obtain ⟨f,r⟩:=tT_spec k h;exact ⟨f,r.mono ш⟩ ·obtain ⟨fE,i⟩:=tE_spec (k/64) (by omega) obtain ⟨fT,rT⟩:=tT_spec (k%64) (Nat.mod_lt _ ш) have a:exp (-((k/64:ℕ):ℝ))*exp (-(((k%64:ℕ):ℝ)/64))=exp (-((k:ℝ)/64)):=by rw[← exp_add,← cast64 k,neg_add] have c:(k:ℝ)≤2048:=by exact_mod_cast d.le have g:=expLB (x:=(k:ℝ)/64) ((div_le_div_of_nonneg_right c ш).trans ш) have j:exp (-((k:ℝ)/64))≤1:=exp_le_one_iff.2 (neg_nonpos.2 ф) have ⟨f,r⟩:=opR (mulF _ _ fE fT) (i.mul rT) (Or.inr (by rw[a];exact (inv2le ш).trans g)) (by rw[a];exact j.trans one_le_two) rw[a] at r;exact ⟨f,r.mono ш⟩ lemma expG (K:ℕ) (i:K < 2048) (T:Float) (k:Ap T (exp (-((K:ℝ)/64))) (1/2^49)) (r:Float) (R:ℝ) (n:fv r) (hR:rv r=R) (g:0 ≤ R) (m:R ≤ 1/64) (e:R=0∨1/2^150 ≤ R) : Ap (T*(one-r*hq r)) (exp (-((K:ℝ)/64+R))) (1/2^48):=by obtain ⟨fT,rT⟩:=k;obtain ⟨c,d⟩:=erSpec r R n hR g m e have j:(K:ℝ)≤2048:=by exact_mod_cast i.le have a:exp (-((K:ℝ)/64))*exp (-R)=exp (-((K:ℝ)/64+R)):=by rw[← exp_add,neg_add] have p2:=expLB (x:=(K:ℝ)/64+R) ((add_le_add (div_le_div_of_nonneg_right j ш) m).trans ш) have h:exp (-((K:ℝ)/64+R))≤1:=exp_le_one_iff.2 (neg_nonpos.2 (add_nonneg ф g)) have ⟨ft,rt⟩:=opR (mulF _ _ fT c) (rT.mul d) (Or.inr (by rw[a];exact (inv2le ш).trans p2)) (by rw[a];exact h.trans one_le_two) rw[a] at rt;exact ⟨ft,rt.mono ш⟩ lemma expL32 {x:ℝ} (h:x ≤ 32):1/2^(47:ℕ) ≤ exp (-x):=by have e:exp (-32)≤exp (-x):=exp_le_exp.2 (neg_le_neg h);have c:exp 1≤2.72:=Real.exp_one_lt_d9.le.trans ш have a:exp (32:ℝ)≤2.72^(32:ℕ):=by rw[show (32:ℝ)=((32:ℕ):ℝ)*1 by norm_num,Real.exp_nat_mul] exact pow_le_pow_left₀ (exp_pos 1).le c 32 have g:(2.72:ℝ)^(32:ℕ)≤2^(47:ℕ):=by norm_num have d:exp (-32)=1/exp 32:=by rw[Real.exp_neg,one_div] refine le_trans ?_ e;rw[d];exact one_div_le_one_div_of_le (exp_pos _) (a.trans g) lemma expV (K:ℕ) (u:64 ≤ K) (C:K < 2048) (T:Float) (I:Ap T (exp (-((K:ℝ)/64))) (1/2^49)) (r:Float) (R:ℝ) (J:fv r) (hR:rv r=R) (x:0 ≤ R) (w:R ≤ 1/64) (k:R=0∨1/2^150 ≤ R) : Ap (T*(r*hq r)-(T-one)) (1-exp (-((K:ℝ)/64+R))) (1/2^48):=by obtain ⟨fT,rT⟩:=I;obtain ⟨H,L⟩:=gSpec r R J hR x w k;obtain ⟨M,o⟩:=kone;have z:(64:ℝ)≤ K:=by exact_mod_cast u have F:(K:ℝ)≤2048:=by exact_mod_cast C.le have c:0< exp (-((K:ℝ)/64)):=exp_pos _;have a:exp (-((K:ℝ)/64))≤1/2:=le_trans (exp_le_exp.2 (neg_le_neg ((one_le_div ш).2 z))) halfE have h:1/2^47≤ exp (-((K:ℝ)/64)):=expL32 ((div_le_iff₀ ш).2 (F.trans ш)) have l:=add_one_le_exp (-R);have O:R/2≤1-exp (-R):=le_trans (by rw[div_eq_mul_one_div];exact mul_le_mul_of_nonneg_left (le_trans (le_trans ш (add_le_add (neg_le_neg w) le_rfl)) l) x) (gLB R) have q:1-exp (-R)≤ R:=sub_le_comm.2 ((neg_add_eq_sub R 1).symm.trans_le l);rw[show 1-exp (-((K:ℝ)/64+R))=exp (-((K:ℝ)/64))*(1-exp (-R))+(1-exp (-((K:ℝ)/64))) by rw[neg_add,exp_add];ring] generalize exp (-((K:ℝ)/64))=E at c a h rT⊢;generalize 1-exp (-R)=Q at O q L⊢;have m:0≤Q:=(div_nonneg x zero_le_two).trans O;have p:=rT.b2 (by rw[abs_of_pos c];exact a.trans ш) obtain ⟨fM,y⟩:=subF T one fT M p (by rw[o];norm_num) ((abs_sub _ _).trans (by rw[o,abs_one];exact (add_le_add p le_rfl).trans ш)) rw[o]at y;have g:E-1<0:=sub_neg.2 (a.trans_lt ш) have s:Rel (rv T-1) (E-1) (1/2^49):=by unfold Rel at rT⊢;rw[abs_of_neg g,sub_sub_sub_cancel_right];rw[abs_of_pos c]at rT;exact rT.trans (mul_le_mul_of_nonneg_left (by linarith only[a]) ш) have A:=rndR s ш (Or.inr (by rw[abs_of_neg g];exact le_trans ш (by linarith only[a]:(1:ℝ)/2≤-(E-1)))) rw[←y]at A;have aM:=abs_le.1 A;rw[abs_of_neg g]at aM;have e:0≤ E*Q:=mul_nonneg c.le m;have d:E*Q≤1/128:=(mul_le_mul a (q.trans w) m ш).trans ш have ⟨fP,rP⟩:=opR (mulF _ _ fT H) (rT.mul L) (by rcases k with B|B ·left;rw[show Q=0 from le_antisymm (q.trans_eq B) ((show (0:ℝ)=R/2 by rw[B,zero_div]).trans_le O),mul_zero] ·right;exact le_trans ш (mul_le_mul h (((by norm_num:(1:ℝ)/2^151=1/2^150/2).trans_le (div_le_div_of_nonneg_right B zero_le_two)).trans O) ш c.le)) (d.trans ш) e have aP:=abs_le.1 rP;rw[abs_of_nonneg e]at aP;have X:(0:ℝ)≤ E*Q+(1-E):=add_nonneg e (sub_nonneg.2 (a.trans ш)) have ⟨f,i⟩:=opR (subF _ _ fP fM (rP.b2 (by rw[abs_of_nonneg e];exact d.trans (by norm_num))) (A.b2 (by rw[abs_of_neg g];linarith only[c]))) (by have Z:(1/2^49+1/2^47+1/2^49*(1/2^47)+1/2^51)*(E*Q)+(1/2^49+1/2^51)*-(E-1)≤(1/2^48-1/2^51)*(E*Q+(1-E)):=by linarith only[d,a,e] unfold Rel;rw[abs_of_nonneg X,show ∀ p n:ℝ,p-n-(E*Q+(1-E))=p-E*Q-(n-(E-1)) from λp n=>by ring,abs_le] exact ⟨(neg_le_neg Z).trans ((neg_add' _ _).trans_le (sub_le_sub aP.1 aM.2)),(sub_le_sub aP.2 aM.1).trans (by rw[sub_neg_eq_add];exact Z)⟩:Rel _ (E*Q+(1-E)) (1/2^48-1/2^51)) (Or.inr (le_trans ш (by linarith only[e,a]:(1:ℝ)/2≤E*Q+(1-E)))) (by linarith only[d,c,a]) X exact ⟨f,i.mono ш⟩ lemma thTailV (nu:Float) (N:ℝ) (e:fv nu) (hR:Rel (rv nu) N (1/2^48)) (c:1/2^200 ≤ N) (a:N ≤ 1):Ap (nu/(two-nu)) (N/(2-N)) (1/2^44):=by obtain ⟨i,g⟩:=ktwo;have d:0>>31).toUInt64.toInt64.toFloat*t+(one-(w>>>31).toUInt64.toInt64.toFloat)) ∧ rv ((w>>>31).toUInt64.toInt64.toFloat*t+(one-(w>>>31).toUInt64.toInt64.toFloat)) = (if w < 0x80000000 then 1 else rv t):=by have q:=w.toNat_lt;have m:((w>>>31).toUInt64).toNat=(if w<0x80000000 then 0 else 1):=by rw[UInt32.toNat_toUInt64,UInt32.toNat_shiftRight];simp only[UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] split_ifs with h<;>rw[UInt32.lt_iff_toNat_lt] at h<;>simp at h<;>omega obtain ⟨i,a⟩:=i64U ((w>>>31).toUInt64) (by rw[m];split_ifs<;>norm_num) rw[m] at a;generalize (w>>>31).toUInt64.toInt64.toFloat=s at i a⊢ obtain ⟨o,e⟩:=kone;have n:Model.roundAt F64 (rv t)=rv t:=Model.roundAt_toReal_eq _ l split_ifs at a⊢ with hw' ·simp only[Nat.cast_zero] at a;obtain ⟨fm,c⟩:=mulF s t i l (by rw[a];simp) rw[a,zero_mul,Model.roundAt_zero] at c;obtain ⟨fd,d⟩:=subF one s o i (by rw[e];norm_num) (by rw[a];norm_num) (by rw[e,a];norm_num) rw[e,a,sub_zero,Model.roundAt_one] at d;obtain ⟨k,g⟩:=addF _ _ fm fd (by rw[c];norm_num) (by rw[d];norm_num) (by rw[c,d];norm_num) rw[c,d,zero_add,Model.roundAt_one] at g;exact ⟨k,g⟩ ·simp only[Nat.cast_one] at a;obtain ⟨fm,c⟩:=mulF s t i l (by rw[a,one_mul,abs_of_nonneg j];linarith) rw[a,one_mul,n] at c;obtain ⟨fd,d⟩:=subF one s o i (by rw[e];norm_num) (by rw[a];norm_num) (by rw[e,a];norm_num) rw[e,a,sub_self,Model.roundAt_zero] at d;obtain ⟨k,g⟩:=addF _ _ fm fd (by rw[c,abs_of_nonneg j];exact p) (by rw[d];norm_num) (by rw[c,d,add_zero,abs_of_nonneg j];linarith) rw[c,d,add_zero,n] at g;exact ⟨k,g⟩ lemma sgTailN (x t:Float) (X T:ℝ) (h:fv x) (rx:Rel (rv x) X (1/2^48)) (d:1/2^201 ≤ X) (e:X ≤ 2) (i:fv t) (hR:Rel (rv t) T (1/2^48)) (c:0 ≤ T) (a:T ≤ 1) : Ap (x/(one+t)) (X/(1+T)) (1/2^44):=by obtain ⟨fd,g⟩:=dSpec t T _ i hR c a;have:=qSpec h fd rx g (le_add_of_nonneg_right c) ((add_le_add le_rfl a).trans_eq one_add_one_eq_two) d e exact ⟨this.1,this.2.mono ш⟩ lemma rC_rnd (Y:UInt64) (h:rC Y=true):rnd Y=rV Y∧rnd Y≠0xFFFFFFFF:=by unfold rC at h;simp only[Bool.and_eq_true,decide_eq_true_eq] at h;obtain ⟨g,a⟩:=h have k:=Y.toNat_lt;have d:(Y>>>52).toNat=Y.toNat/2^52:=by rw[UInt64.toNat_shiftRight];simp only[UInt64.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] rw[UInt64.le_iff_toNat_le,UInt64.toNat_sub,d] at g;simp only[UInt64.reduceToNat] at g;have i:897≤Y.toNat/2^52:=by omega have j:Y.toNat/2^52≤1022:=by omega rw[UInt64.lt_iff_toNat_lt,UInt64.toNat_and,UInt64.toNat_add] at a;simp only[UInt64.reduceToNat] at a;rw[show (268435455:ℕ)=2^28-1 from rfl,Nat.and_two_pow_sub_one_eq_mod,Nat.mod_eq_of_lt (show Y.toNat+1024<2^64 by omega)] at a have c:((897:UInt64)≤Y>>>52&&Y>>>52≤1022&&1024≤Y&&&0xFFFFFFFFFFFFF&&Y&&&0xFFFFFFFFFFFFF<0xFFFFFFFFFFC00 && 2048<(Y&&&0x1FFFFFFF)-0xFFFFC00)=true:=by simp only[Bool.and_eq_true,decide_eq_true_eq];rw[UInt64.le_iff_toNat_le,UInt64.le_iff_toNat_le,UInt64.le_iff_toNat_le,UInt64.lt_iff_toNat_lt,UInt64.lt_iff_toNat_lt,UInt64.toNat_sub,UInt64.toNat_and,UInt64.toNat_and,d] simp only[UInt64.reduceToNat];rw[show (4503599627370495:ℕ)=2^52-1 from rfl,show (536870911:ℕ)=2^29-1 from rfl,Nat.and_two_pow_sub_one_eq_mod,Nat.and_two_pow_sub_one_eq_mod] omega unfold rnd;dsimp only;rw[if_pos c];refine ⟨rfl,λe=>?_⟩ have:=congrArg UInt32.toNat e;rw[UInt32.toNat_sub,UInt64.toNat_toUInt32,UInt64.toNat_shiftRight,UInt64.toNat_add] at this simp only[UInt64.reduceToNat,UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow] at this;omega lemma pw2 (ee:UInt64) (h:1 ≤ ee.toNat) (g: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) щ] simp only[Nat.reduceMod];omega have c:(((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 _ ф,show (2047:ℕ)=2^11-1 from rfl,Nat.and_two_pow_sub_one_eq_mod];omega have d:(((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 e:((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 щ)];rfl have ⟨f,v⟩:=rvB ((ee+873)<<<52) (by rw[c];omega) (by rw[c];omega) refine ⟨f,?_⟩;rw[v,c,d,e,show ((ee.toNat+873:ℕ):ℤ)-1075=(ee.toNat:ℤ)-150+-52 by push_cast;ring,zpow_add₀ two_ne_zero] norm_num;ring lemma rTSpec (a d:UInt32) (D:ℕ) (n:d.toNat=D) (o:2^23 ≤ a.toNat) (j:a.toNat/2^23+D ≤ 112) : fv (rT a d)∧0 ≤ rv (rT a d)∧rv (rT a d) ≤ 1/64∧(rv (rT a d)=0∨1/2^150 ≤ rv (rT a d)) ∧ ((2^23+a.toNat%2^23:ℕ):ℝ)*(2:ℝ)^(((a.toNat/2^23+D:ℕ):ℤ)-150)=rv (rT a d):=by have p:=a.toNat_lt;have k:(((a&&&0x7FFFFF)|||0x800000).toUInt64).toNat=2^23+a.toNat%2^23:=by rw[UInt32.toNat_toUInt64,UInt32.toNat_or,UInt32.toNat_and];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 _ ф)];omega have g:(((a>>>23)+d).toUInt64).toNat=a.toNat/2^23+D:=by rw[UInt32.toNat_toUInt64,UInt32.toNat_add,UInt32.toNat_shiftRight,n];simp only[UInt32.reduceToNat,Nat.reduceMod,Nat.shiftRight_eq_div_pow];omega have ⟨fi,vi⟩:=i64U (((a&&&0x7FFFFF)|||0x800000).toUInt64) (by rw[k];omega) have ⟨fp,vp⟩:=pw2 (((a>>>23)+d).toUInt64) (by rw[g];omega) (by rw[g];omega) rw[g] at vp;rw[k] at vi;have l:(0:ℝ)<2^(((a.toNat/2^23+D:ℕ):ℤ)-150):=by positivity have h:(2:ℝ)^(((a.toNat/2^23+D:ℕ):ℤ)-150)≤1/2^38:=by rw[← zp];exact zpow_le_zpow_right₀ ш щ have m:((2^23+a.toNat%2^23:ℕ):ℝ)<2^24:=by exact_mod_cast (by omega:2^23+a.toNat%2^23<2^24) have c:((2^23+a.toNat%2^23:ℕ):ℝ)*2^(((a.toNat/2^23+D:ℕ):ℤ)-150)≤1/64:= (mul_le_mul m.le h l.le ф).trans ш have ⟨fr,vr⟩:=mulF _ _ fi fp (by rw[vi,vp,abs_of_nonneg ф];exact c.trans ш) have e:rv (rT a d)=((2^23+a.toNat%2^23:ℕ):ℝ)*2^(((a.toNat/2^23+D:ℕ):ℤ)-150):=by show rv (((a&&&0x7FFFFF)|||0x800000).toUInt64.toInt64.toFloat*Float.ofBits ((((a>>>23)+d).toUInt64+873)<<<52))=_;rw[vr,vi,vp,← FloatLib.Numerics.Dyadic.toReal_mk_false] exact rndExact _ (by show 2^23+a.toNat%2^23<2^53;omega) (by show (-1074:ℤ)≤((a.toNat/2^23+D:ℕ):ℤ)-150;omega) (by rw[FloatLib.Numerics.Dyadic.toReal_mk_false,abs_of_nonneg ф];exact c.trans ш) refine ⟨fr,by rw[e];positivity,by rw[e];exact c,Or.inr ?_,e.symm⟩ rw[e];have j:(1:ℝ)/2^150≤2^(((a.toNat/2^23+D:ℕ):ℤ)-150):=by rw[← zp];exact zpow_le_zpow_right₀ ш щ exact j.trans (le_mul_of_one_le_left l.le (by exact_mod_cast (by omega:1≤2^23+a.toNat%2^23))) lemma sgCore (w:UInt32) (c:UInt64) (r:Float) (C:ℝ) (p:(c>>>31).toNat < 2048) (B:fv r) (F:0 ≤ rv r) (A:rv r ≤ 1/64) (D:rv r=0∨1/2^150 ≤ rv r) (l:C=((c>>>31).toNat:ℝ)/64+rv r) (H:0 < C) (x:C < 18) (s:expOf w≠255) (G:Model.toReal (ofW w)=(if signOf w then -1 else 1)*C) (u:signOf w=true ↔ 0x80000000 ≤ w) (h:rnd (ySgC w c r).toBits≠0xFFFFFFFF) : sigmoidCR w=rnd (ySgC w c r).toBits:=by obtain ⟨hG,-⟩:=tGH c p;have v:=tTk _ p;rw[← hG] at v obtain ⟨ft,i⟩:=expG _ p (tG c) v r _ B rfl F A D;rw[← l] at i have e:=exp_pos (-C);have g:exp (-C)≤1:=exp_le_one_iff.2 (neg_nonpos.2 H.le) have q:=abs_le.1 i;rw[abs_of_pos e] at q;have n:0≤rv (tG c*(one-r*hq r)):=by linarith only[q.1,e] have k:rv (tG c*(one-r*hq r))≤2:=by linarith only[q.2,g] obtain ⟨fn,j⟩:=numS w _ ft n k;have a:=sgS w s change toWord (sigmoidModel (ofW w))=_;rw[G] at a have y:ySgC w c r=((w>>>31).toUInt64.toInt64.toFloat*(tG c*(one-r*hq r))+ (one-(w>>>31).toUInt64.toInt64.toFloat))/(one+tG c*(one-r*hq r)):=rfl rw[y] at h⊢;by_cases hw:w<0x80000000 ·rw[if_pos hw] at j;have d:signOf w=false:=by cases hh:signOf w ·rfl ·exact absurd (u.1 hh) (UInt32.not_le.2 hw) simp only[d,Bool.false_eq_true,ite_false,one_mul] at a;obtain ⟨fy,t⟩:=sgTailN _ _ 1 (exp (-C)) fn (by rw[j];exact rel1 ш) ш ш ft i e.le g have:=fin _ _ ф t h false (z:=sigmoidModel (ofW w)) a simpa using this ·rw[if_neg hw] at j;have d:signOf w=true:=u.2 (UInt32.not_lt.1 hw) simp only[d,ite_true,neg_mul,one_mul] at a;obtain ⟨fy,t⟩:=sgTailN _ _ (exp (-C)) (exp (-C)) fn (by rw[j];exact i) (le_trans (inv2le ш) (expLB (by linarith only[x]))) (g.trans one_le_two) ft i e.le g have m:realSigmoid (-C)=exp (-C)/(1+exp (-C)):=by unfold realSigmoid;rw[neg_neg,div_eq_div_iff ф ф,one_mul,mul_add,mul_one,← exp_add,neg_add_cancel,exp_zero,add_comm] rw[m] at a;have:=fin _ _ ф t h false (z:=sigmoidModel (ofW w)) a simpa using this lemma sgMain (w:UInt32) (j:(w&&&0x7FFFFFFF)-0x38800000 < 0x09100000) (h:rnd (ySg w).toBits≠0xFFFFFFFF) : sigmoidCR w=rnd (ySg w).toBits:=by have A:=(w&&&0x7FFFFFFF).toNat_lt;rw[UInt32.lt_iff_toNat_lt,UInt32.toNat_sub] at j;simp only[UInt32.reduceToNat] at j have y:0x38800000≤(w&&&0x7FFFFFFF).toNat:=by omega have s:(w&&&0x7FFFFFFF).toNat<0x41900000:=by omega obtain ⟨t,z,p,g,l,-⟩:=dec32 w;obtain ⟨d,v,i,k⟩:=wv w щ щ obtain ⟨n,u,m,q,r,a⟩:=fxSpec (w&&&0x7FFFFFFF) 113 113 rfl щ щ have x:(w&&&0x7FFFFFFF).toNat/2^23=(expOf w).toNat:=by omega have o:(w&&&0x7FFFFFFF).toNat%2^23=(fracOf w).toNat:=by omega rw[x,o,show ((113+37:ℕ):ℤ)=150 from rfl] at a have c:cv (eW w) (mW w)<18:=by rw[i];exact (C32_lt _ _ 131 1048576 g ш щ).trans_eq (by unfold C32;norm_num) have e:0>>31).toNat=0:=rfl have d:0>>31).toNat < 2048) (s:fv r) (v:0 ≤ rv r) (q:rv r ≤ 1/64) (t:rv r=0∨1/2^150 ≤ rv r) (d:2*C=((a>>>31).toNat:ℝ)/64+rv r) (p:1/2^150 ≤ C) (y:C < 19/2) (n:expOf w≠255) (G:Model.toReal (ofW w)=(if signOf w then -1 else 1)*C) (o:(w&&&0x80000000).toNat=(if signOf w then 2^31 else 0)) (h:rnd (yThC a r).toBits≠0xFFFFFFFF) : tanhCR w=rnd (yThC a r).toBits+(w&&&0x80000000):=by obtain ⟨hG,j⟩:=tGH a l;have A:yThC a r=(tG a*(r*hq r)-tH a)/(two-(tG a*(r*hq r)-tH a)):=rfl have g:1/2^200≤1-exp (-(2*C)):=by linarith only[gLB (2*C),mul_le_mul_of_nonneg_right (mul_le_mul_of_nonneg_left p zero_le_two) (exp_pos (-(2*C))).le] have D:Ap (yThC a r) (tanh C) (1/2^44):=by rw[A];have m:(1-exp (-(2*C)))/(2-(1-exp (-(2*C))))=tanh C:=by rw[tanh_eq_exp_neg_two];ring_nf rw[← m];by_cases hK64:(a>>>31).toNat<64 ·rw[if_pos hK64] at hG j;rw[hG,j];obtain ⟨fn,i⟩:=expU _ hK64 _ _ s rfl v q t rw[← d] at i;have B:1/3≤exp (-(2*C)):=thirdE.trans (exp_le_exp.2 (by have:((a>>>31).toNat:ℝ)≤63:=by exact_mod_cast (by omega:(a>>>31).toNat≤63) linarith only[this,d,q])) exact thTailU _ _ fn i g (by linarith only[B]) ·rw[if_neg hK64] at hG j;have u:=tTk _ l;rw[if_neg hK64,← hG] at u have k:tH a=tG a-one:=by rw[j,hG];rfl rw[k];obtain ⟨fn,i⟩:=expV _ щ l (tG a) u _ _ s rfl v q t rw[← d] at i;exact thTailV _ _ fn i g (by linarith only[exp_pos (-(2*C))]) have c:=thS w n;change toWord (tanhModel (ofW w))=_ rw[G] at c;have F:=fin _ _ (tanhPos _ (lt_of_lt_of_le ф p)) D.2 h (signOf w) (z:=tanhModel (ofW w)) (by rw[c];cases signOf w<;>simp[Real.tanh_neg]) rw[F,add_comm];congr 1 apply UInt32.toNat_inj.mp;rw[o];cases signOf w<;>simp lemma cvLB (w:UInt32) (h:2^23 ≤ (w&&&0x7FFFFFFF).toNat) :1/2^150 ≤ cv (eW w) (mW w):=by obtain ⟨g,i,c,d,-,-⟩:=dec32 w;unfold cv have e:(1:ℝ)≤(mW w).toNat:=by exact_mod_cast (by omega:1≤(mW w).toNat) have a:(1:ℝ)/2^150≤2^(((eW w).toNat:ℤ)-150):=by rw[← zp];exact zpow_le_zpow_right₀ ш щ exact a.trans (le_mul_of_one_le_left ф e) lemma thMain (w:UInt32) (k:(w&&&0x7FFFFFFF)-0x38000000 < 0x09180000) (h:rnd (yTh w).toBits≠0xFFFFFFFF) : tanhCR w=rnd (yTh w).toBits+(w&&&0x80000000):=by have A:=(w&&&0x7FFFFFFF).toNat_lt;rw[UInt32.lt_iff_toNat_lt,UInt32.toNat_sub] at k;simp only[UInt32.reduceToNat] at k have y:0x38000000≤(w&&&0x7FFFFFFF).toNat:=by omega have s:(w&&&0x7FFFFFFF).toNat<0x41180000:=by omega obtain ⟨t,z,p,i,-,g⟩:=dec32 w;obtain ⟨e,v,j,l⟩:=wv w щ щ obtain ⟨o,u,m,q,r,a⟩:=fxSpec (w&&&0x7FFFFFFF) 112 112 rfl щ щ have x:(w&&&0x7FFFFFFF).toNat/2^23=(expOf w).toNat:=by omega have n:(w&&&0x7FFFFFFF).toNat%2^23=(fracOf w).toNat:=by omega rw[x,n,show ((112+37:ℕ):ℤ)=149 from rfl] at a have d:2*cv (eW w) (mW w)=((fxOf (w&&&0x7FFFFFFF) 112>>>31).toNat:ℝ)/64+rv (rF (fxOf (w&&&0x7FFFFFFF) 112)):=by rw[j,← a];unfold C32;rw[show (((expOf w).toNat:ℤ)-149)=((expOf w).toNat:ℤ)-150+1 by ring,zpow_add₀ two_ne_zero];ring have c:cv (eW w) (mW w)<19/2:=by rw[j];exact (C32_lt _ _ 130 1572864 i ш щ).trans_eq (by unfold C32;norm_num) exact thCoreN w _ _ _ r o u m q d (cvLB w щ) c e v g h lemma thTiny (w:UInt32) (k:(w&&&0x7FFFFFFF)-0x00800000 < 0x37800000) (h:rnd (yThC 0 (rT (w&&&0x7FFFFFFF) 1)).toBits≠0xFFFFFFFF) : tanhCR w=rnd (yThC 0 (rT (w&&&0x7FFFFFFF) 1)).toBits+(w&&&0x80000000):=by have B:=(w&&&0x7FFFFFFF).toNat_lt;rw[UInt32.lt_iff_toNat_lt,UInt32.toNat_sub] at k;simp only[UInt32.reduceToNat] at k have z:0x00800000≤(w&&&0x7FFFFFFF).toNat:=by omega have s:(w&&&0x7FFFFFFF).toNat<0x38000000:=by omega obtain ⟨t,A,q,y,-,j⟩:=dec32 w;obtain ⟨i,v,p,l⟩:=wv w щ щ obtain ⟨o,u,m,r,a⟩:=rTSpec (w&&&0x7FFFFFFF) 1 1 rfl щ щ have x:(w&&&0x7FFFFFFF).toNat/2^23=(expOf w).toNat:=by omega have n:(w&&&0x7FFFFFFF).toNat%2^23=(fracOf w).toNat:=by omega rw[x,n] at a;have g:((0:UInt64)>>>31).toNat=0:=rfl have c:(2:ℝ)*cv (eW w) (mW w)=(((0:UInt64)>>>31).toNat:ℝ)/64+rv (rT (w&&&0x7FFFFFFF) 1):=by rw[g,p,← a];unfold C32;push_cast;rw[show (((expOf w).toNat:ℤ)+1-150)=((expOf w).toNat:ℤ)-150+1 by ring,zpow_add₀ two_ne_zero];ring have d:cv (eW w) (mW w)<19/2:=by have e:=c;rw[g,Nat.cast_zero,zero_div,zero_add] at e;linarith only[e,m] exact thCoreN w 0 _ _ (by rw[g];norm_num) o u m r c (cvLB w щ) d i v j h lemma sgE_eq (w:UInt32):sgE w=sigmoidCR w:=by unfold sgE;dsimp only;split_ifs with h0 ho h1 h2 ·rfl ·exact (sgTiny w h0 (by simpa using ho)).symm ·exact (sgZero w (by simpa using h1)).symm ·simp only[Bool.and_eq_true,decide_eq_true_eq] at h2;exact (sgSat w h2.1.1 h2.1.2 h2.2).symm ·rfl lemma thE_eq (w:UInt32):thE w=tanhCR w:=by unfold thE;dsimp only;split_ifs with h0 ho h1 h2 ·rfl ·exact (thTiny w h0 (by simpa using ho)).symm ·exact (thZero w (by simpa using h1)).symm ·simp only[Bool.and_eq_true,decide_eq_true_eq] at h2;exact (thSat w h2.1 h2.2).symm ·rfl lemma sg_eq:sg=sigmoidCR:=by funext w;unfold sg;dsimp only;split_ifs with hr hc ·obtain ⟨a,c⟩:=rC_rnd _ hc;rw[← a];exact (sgMain w hr c).symm ·unfold sgR;dsimp only;split_ifs with ho ·rfl ·exact (sgMain w hr (by simpa using ho)).symm ·exact sgE_eq w lemma th_eq:th=tanhCR:=by funext w;unfold th;dsimp only;split_ifs with hr hc ·obtain ⟨a,c⟩:=rC_rnd _ hc;rw[← a];exact (thMain w hr c).symm ·unfold thR;dsimp only;split_ifs with ho ·rfl ·exact (thMain w hr (by simpa using ho)).symm ·exact thE_eq w end SAct namespace Cv1 open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats @[inline]def c1Ok(s:ConvShape):Bool:= s.w==1&&s.kw==1&&s.strideH==1&&s.strideW==1&&s.padT==0&&s.padL==0&&s.padB==0&&s.padR==0&&s.dilH==1&&s.dilW==1&&0USize.toNat local postfix:max "и"=>Fin.val open _root_ renaming FloatArray->ἀ,ite_true->ἁ,ite_false->ἂ,rfl->ἅ,UInt64->ἆ,UInt32->ἇ,Nat->Ἀ,Int->Ἁ,Array->Ἂ,USize->Ἄ,Float->Ἅ,Bool->Ἆ open Bool renaming true->ἃ,false->ἄ open ExactRuntime renaming Word->Ἃ open ExactRuntime hiding ConvShape windowAt conv2dWith conv2dSpec depthwiseWith depthwiseSpec avgpoolWith avgpoolSpec maxpoolSpec open FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats structure ConvShape where cin:Nat h:Nat w:Nat cout:Nat kh:Nat kw:Nat stride:Nat pad:Nat def ConvShape.ho (s:ConvShape):Nat:=(s.h+2*s.pad-s.kh)/s.stride+1 def ConvShape.wo (s:ConvShape):Nat:=(s.w+2*s.pad-s.kw)/s.stride+1 @[inline] def windowAt (s:ConvShape) (inp:Array Word) (y x t:Nat):Word := let c:=t/(s.kh*s.kw) let dy:=t/s.kw%s.kh let dx:=t%s.kw let yy:=y*s.stride+dy let xx:=x*s.stride+dx if yy < s.pad∨xx < s.pad∨yy-s.pad ≥ s.h∨xx-s.pad ≥ s.w then 0 else inp[(c*s.h+(yy-s.pad))*s.w+(xx-s.pad)]! @[specialize] def conv2dWith (dot:DotFn) (s:ConvShape) (relu:Bool) (inp wts b:Array Word) : Array Word := let k:=s.cin*s.kh*s.kw Array.ofFn (n:=s.cout*(s.ho*s.wo)) λ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) (λt=>if t < k then windowAt s inp y x t else oneW) (λ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)) λ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) (λt=>if t < k then windowAt s inp y x (c*k+t) else oneW) (λ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))) λ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) (λ_=>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))) λ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 (λ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 USize renaming ofNat->W0,toNat_ofNat_of_lt'->X3,le_iff_toNat_le->R4,toNat_inj->H6,toNat_sub_of_le->R6,toNat_ofNat'->J7,toNat_ofNat->Z9,add_assoc->I9,toNat_lt_size->Jf,add_zero->Jr,ofNat_toNat->Jv,lt_irrefl->Zi,add_sub_cancel->Gh,zero_mul->Uw,add_comm->Ux,add_mul->Oa,one_mul->Ob open Nat renaming le_of_lt_succ->Z0,le_add_left->H0,mul_le_mul_left->U0,sub_eq_zero_iff_le->M0,le_trans->N0,add_le_add->E0,le_of_sub_eq_zero->W1,le_of_ble_eq_true->G1,le_mul_of_pos_right->H1,lt_succ_self->M1,add_lt_add_right->I1,sub_add_cancel->J2,not_lt->X2,le_of_lt->U2,le_antisymm->N2,sub_le->I2,sub_add_eq->Q3,lt_succ_of_le->J3,sub_lt_left_of_lt_add->K3,le_of_not_lt->V3,sub_lt_sub_left->Z3,le_of_eq->Y3,cast_mul->U3,sub_le_sub_right->O3,add_sub_cancel'->M3,lt_trans->N3,sub_succ_lt_self->C3,cast_nonneg->I3,lt_irrefl->K4,lt_add_of_pos_right->V4,cast_pow->W4,le_sub_of_add_le->Z4,cast_add->Y4,lt_succ_of_lt->H4,lt_of_le_of_ne->U4,strong_induction_on->O4,succ_pos->P4,le_of_succ_le->M4,lt_of_lt_of_eq->N4,not_lt_zero->D4,zero_lt_of_lt->E4,cast_le->F4,div_one->I4,add_lt_add_of_lt_of_le->J5,sub_sub->X5,not_le->U5,ofNat_nonneg->P5,lt_of_succ_lt->N5,le_succ->B5,add_lt_add->D5,pair->L5,le_succ_of_le->V6,cast_succ->X6,mul_add_div->G6,le_add_right_of_le->U6,sub_ne_zero_of_lt->P6,lt_or_ge->M6,mul_lt_mul_of_pos_left->N6,eq_of_mul_eq_mul_right->B6,add_left_cancel->D6,mul_add_mod->E6,min_le_left->F6,ne_of_lt->K7,succ_le_succ->V7,lt_of_not_le->N7,succ_ne_zero->C7,mod_eq_sub_mod->D7,add_mul_mod_self_left->E7,two_mul->L7,ne_of_gt->J8,max_eq_left->Z8,lt_succ_iff_lt_or_eq->U8,sub_add_comm->M8,not_le_of_lt->N8,pred->B8,max_eq_right->D8,dvd_of_mod_eq_zero->E8,mod_mod_of_dvd->I8,min_eq_left->Q9,cast_zero->J9,lt_of_mul_lt_mul_right->K9,sub_le_of_le_add->Y9,mul_div_le->H9,succ_add_eq_add_succ->U9,zero_lt_succ->S9,min_le_right->T9,cast_pos->M9,sub_le_sub_left->C9,exists_eq_add_of_le->D9,div_le_self->L9,sub_pos_of_lt->Qb,lt_of_succ_le->Qc,sub_succ->Qf,mul_succ->Qm,sub_lt->Qs,le_of_not_le->Qy,mod_mul_right_div_self->Qz,add_lt_add_of_le_of_lt->Ja,cast_lt->Jd,mod_one->Je,and_two_pow->Jg,lt_of_add_lt_add_left->Jh,eq_zero_or_pos->Jk,div_mul_cancel->Jm,lt_div_mul_add->Jo,lt_trichotomy->Ju,le_refl->Jy,lt->Jz,eq_zero_of_not_pos->Ka,reduceAdd->Kd,cast_ne_zero->Kj,log2_le_self->Kk,sub_le_iff_le_add->Km,mul->Ko,add_sub_self_left->Kq,mod_add_mod->Kt,mul_ne_zero->Ku,add_right_cancel->Va,le->Ve,zero_lt_two->Vf,not_succ_le_self->Vg,sub_lt_sub_right->Vk,add_one_le_of_lt->Vl,mod_add_div->Vm,eq_sub_of_add_eq->Vo,div_self->Vq,exists_eq_succ_of_ne_zero->Vs,div_eq_zero_iff->Vt,pow_lt_pow_succ->Vu,one_lt_two->Vz,mod_mul->We,two_pos->Wf,div_mod_unique->Wh,mul_div_cancel->Wj,reduceMul->Wn,le_of_add_le_add_right->Wq,add_mod_right->Wy,add_sub_assoc->Xb,max_le->Xh,eq_of_mul_eq_mul_left->Xi,mod_add_div'->Xm,succ_lt_succ->Xn,add_mod_left->Xo,zero_mod->Xs,pos_of_mul_pos_right->Xy,pos_of_mul_pos_left->Zd,add_mod_mod->Ze,lt_succ_iff->Zf,cast_natAbs->Zg,lt_add_left->Zj,one_le_iff_ne_zero->Zk,div_pos->Zl,mod_eq_sub_mul_div->Zn,sub_le_iff_le_add'->Zo,one_pos->Zp,lt_of_add_right_lt->Zq,bitwise_rec_lemma->Zw,mul_div_mul_right->Zx,add_lt_of_lt_sub'->Yo,sub_eq_zero_of_le->Yp,sub_lt_iff_lt_add->Yt,mul_mod_mul_right->Yu,lt_add_one->Yv,add_lt_of_lt_sub->Yw,le_sub_one_of_lt->Yy,add_add_add_comm->Gb,add_le_of_le_sub->Gc,sub_one_lt_of_lt->Gd,unpair->Gf,reduceDiv->Gj,lt_mul_div_succ->Go,mul_div_cancel'->Gp,zero_div->Gq,pow_succ->Gr,mul_right_comm->Gs,log2_def->Gu,reduceLT->Ha,lt_or_eq_of_le->Hb,ne_zero_of_lt->Hj,shiftLeft_eq'->Hl,lt_of_sub_pos->Hm,add_div_right->Ho,or_comm->Hq,mul_add->Ht,add_pos_left->Hv,lt_add_right->Hx,one_le_ofNat->Hy,reduceLeDiff->Hz,cast->Ub,mul_eq_zero->Uf,one_le_cast->Uj,strongRecOn->Um,sub_mul_div->Up,le_min->Uq,add->Uv open Real renaming sqrt->S0,sqrt_mul->Wt,sqrt_le_sqrt->Xe,sqrt_sq->Xv,sqrt_nonneg->Xx,sq_sqrt->He open UInt64 renaming toUInt32->O2,toNat_ofNat'->J6,toNat_max->Kl,sub_add_cancel->Kn,not_lt->Wm,lt_irrefl->Xk,le_of_lt->Zh,toBitVec_inj->Gl,ofNat_toNat->Gv,ofNat_mul->Uc,add_zero->Ud open Array renaming size_replicate->W3,getElem!_set!_ne->P7,usize->Q8,getElem!_set!_self->H8,getElem_set->Qd,size_append->Qe,size_set->Ql,getElem_map->Jt,foldl_induction->Kr,uget->Kv,set!->Xj,size_empty->Za,setIfInBounds->Gm,uset->Ui open Int renaming ofNat_le->B3,cast_natCast->X4,natCast_nonneg->K5,natAbs->G5,toNat->Z6,add_le_add_right->X7,cast_add->K8,toNat_of_nonneg->S8,natAbs_natCast->F8,neg_ofNat_le_natCast->O9,cast_sum->R9,cast_mul->Qk,sub_le_sub_right->Qt,neg_nonpos_of_nonneg->Jn,ofNat_zero_le->Jw,ofNat_lt->Kw,cast_neg->Kz,sub_le_self->Vp,toNat_of_nonpos->Vv,add_le_add->Wa,ofNat->Wg,reducePow->Wk,le_sub_right_of_add_le->Wo,sub_right_le_of_le_add->Wp,add_lt_add_of_lt_of_le->Wr,le_add_of_sub_right_le->Ww,le_sub_left_of_add_le->Xf,lt_zpow_succ_log_self->Xg,neg_nonneg_of_nonpos->Xw,natAbs_neg->Zv,natAbs_pow->Yb,zpow_log_le_self->Ga,lt_of_add_one_le->Gg,sub_le_sub_left->Gn,cast_pow->Gw,toNat_le->Hc,toNat_le_toNat->Hh,negSucc->Hp,ofNat_nonneg->Ua,natAbs_cast->Ue,natCast_pow->Ul,natCast_pos->Uo open ExactRuntime renaming rationalWord->J4,ConvShape->B4,depthwiseSpec->R5,conv2dSpec->W6,conv2dWith->T6,sv->O7,PoolShape->R7,roundRational->X9,rmsnormSpec->B9,finiteWord->E9,windowAt->Qo,depthwiseWith->Jc,avgpoolSpec->Jp,maxpoolSpec->Jq,rmsnormStable->Wx,rowVariance->Xz,poolOut->Gi open UInt32 renaming toUSize->G4,le_iff_toNat_le->C5,toUInt64->U7,and_assoc->Ki,toNat_one->Xq,ne_of_lt->Uk open ExactRuntime.ConvShape renaming depthwise->C4,cpg->C6,ekh->T7,ekw->M7,ho->F7,wo->I7,taps->L8,opg->W9 open Finset renaming Ico->Q5,sum_nonneg->H7,sum_eq_sum_Ico_succ_bot->W8,sum_empty->C8,abs_sum_le_sum_abs->G9,sum_range_zero->Qj,sum_Ico_eq_sum_range->Qq,sum_const->Kh,Ico_self->Ky,card_range->Xa,range_zero->Xc,sum_le_card_nsmul->Xt,mul_sum->Yg,sum_le_sum->Hk,mem_image->Hw,mem_Ico->Uy open Pinned renaming kernels->W5,dotFn_eq_dotOf->L6,maxpoolW_eq->Hi open Model renaming modelSignBit->Z5,unpackedToReal_finite->K6,ofModelBits->G7,ofFields_signBit_expField_fracField->Qp,unpackedToReal->Qv,modelSign->Ji,unpackedToReal_zero->Jj,toDyadic?_ofFields_of_isFinite->Jl,ofFloatModel_pack->Js,roundAt->Kb,signBit->Kc,eq_of_toReal_eq_of_nonzero->Kg,canonicalizeModel_eq_self->Ks,toReal_eq_zero_of_isZero->Kx,isFinite->Vw,ofFloatModel_injective->Vx,ofFields->Vy,toReal->Xl,isZero->Xu,isFinite_ofFields->Zb,canonicalizeModel->Zc,ieeeRoundDyadic->Zy,pow2_eq_two_pow->Zz,fracField->Ug,sqrt->Us,expField->Uu open Float.Model.UnpackedFloat renaming normalize->H5,beq_iff_ne_notANumber_and_eq->Wi,unpackSign->Gz open Int64 renaming toInt->O5,ofInt->Hr open Float renaming ofBits->F5,sqrt->O6,fma->Gy,ofModel->Uz open Float.Model renaming pack->I5,ofBits->Gx,sub->Uh open Fin renaming val->I6 open Rat renaming cast_mul->W7,cast_ofNat->Z7,cast_intCast->B7,cast_zpow->R8,cast_natCast->N9,cast_div->Qn,cast_add->Vj,cast_sub->Hd,cast_sum->Hf,cast_pow->Hg,cast_lt->Hs,cast_nonneg->Ur open Bool renaming and_eq_true_iff->X8,eq_false_iff->O8,and_false->Zs,false_and->Yd,and_eq_false_iff->Yj,not_false->Ut open OfNat renaming ofNat->A9,ofNat_ne_zero->Gk open FloatLib.Numerics.StaticStorage renaming lt_capacity->Qa open BitVec renaming toNat_sub_of_lt->Jx,extractLsb'_toNat->Xp,toNat_sub_of_le->Zm,toNat->Oc 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 (ж:1<=25) j).trans h,Z4 (by rw[Τ];exact (J1 (ж:23<=25) j).trans h),(H0 23 j).trans ((J1 (ж:23<=25) j).trans h)⟩ lemma cm_h2(e:Ἁ)(j L:Ἀ)(h:j+25<=L)(c:(L:Ἁ)+e< -126):∃a:Ἀ,e- -149=Hp a∧e+j- -149=Hp (a-j)∧a-j+1=a+1-j∧j+2<=a+1:=by obtain⟨a,v,y⟩:∃a:Ἀ,e- -149=Hp a∧j+2<=a:=⟨(Z6 (-(e+149)-1)),by omega,by omega⟩ exact⟨a,v,by (clear * - v y;omega),(M8 ((V1 j 2).trans y)).symm,y.trans (B5 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 (Θ ш 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 (Θ ш (B5 j)) u);rw[<-Ϻ,<-Ϻ];simp only[Model.roundDyadicGeneral,t,g,AQ,Am,d];clear d o u t g;rw[(by rw[pO ((V1 j 25).trans h)];ring:(((Aq m)-j:Ἀ):Ἁ)+(e+j)=((Aq m):Ἁ)+e),show Fmt.fracWidth=23 from ἅ,show Fmt.minSubnormalExponent=-149 from ἅ,show Fmt.minNormalExponent=-126 from ἅ,AD k.2.1,AD k.2.2];split_ifs with c1 c2 rfl;congr 1;obtain⟨a,v,w,x,y⟩:=cm_h2 e j _ h c2;rw[v,w];dsimp only;rw[x];exact lS m j (a+1) y;congr 1;rw[Nat.sub_right_comm _ j];exact lS m j _ (Z4 h) end lemma ab(n:Ἀ)(f:Ἀ->ἇ)(k:Ἀ)(d:kf (I6 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 U9 i k):i+1+k=i+(k+1))]) rfl lemma cH(n:Ἀ)(d e:Ἀ->kF): dsum (kK (n:=n) λi=>d (I6 i)) (kK (n:=n) λi=>e (I6 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] lemma bI_h1{s a p c d:Ἆ}(g:s=(false||c))(e:a=(true&&d)):(s&&(a||(!p&&false)))=(c&&d):=by rw[g,e,Bool.false_or,Bool.true_and,Zs,Bool.or_false] lemma bI_h2(A B:Ἂ kF)(n:Ἀ)(S:Ἁ)(q:dsum A B 0 n=S)(hA:A.size=n)(o: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[Jt,m6];exact AM.2 (h k (N4 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 (o▸w)).2 have p:0+(A.map (kT (fmt:=lU))).size<=(A.map (kT (fmt:=lU))).size:=Y3 (Κ _) have i:0+(A.map (kT (fmt:=lU))).size<=(B.map (kT (fmt:=lU))).size:=Y3 ((Κ _).trans l) have j:∀k,0<=k->k<0+(A.map (kT (fmt:=lU))).size->kB A[k]!≠255/\kB B[k]!≠255:=λk _ F=>m k (N4 F ((Κ _).trans a)) have d:=(finiteDotSlice_eq A B 0 _ p i j).trans ((congrArg (λs=>(dsum A B 0 s:ℚ)*2^(-298:ℤ)) a).trans (congrArg (λt:Ἁ=>(t:ℚ)*2^(-298:ℤ)) q)) 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 _ p i 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) a)) · have c: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 c] 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 (I6 i)) (kK (n:=n) λi=>p (I6 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:ἇ):ἆ:=(U7 (w&&&8388607))|||(f5 w<<<23) @[inline]def iW(w:ἇ):ἆ:=(U7 ((w>>>23)&&&255))-f5 w noncomputable def ae(x:ἆ):Ἁ:=x.toBitVec.toInt lemma gr(w:ἇ):(mJ (w&&&8388607))<2^(23:Ἀ):=by rw[Ξ];exact AO ϝ ж 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 ἅ,Hq,<-Ϥ 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 ж h rw[ώ щ];exact iff_of_false ж 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[Jg,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:ἆ):ἇ:= (O2 (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 (O2 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 (O2 (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,Gq]))];simp only[Gr,m7]at d⊢;rw[Ϗ (2^k)];exact⟨e,by rwa[Gs]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,β,Vt]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 L7 k.toNat)) lemma dr(n:Ἀ)(h:n<2):(Aq n)=0:=by rw[Gu,AC (by exact N8 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 simp only [ϋ,Ai]) d;obtain⟨p,g⟩:=cx x _ _ 16 ж ж o (by simpa using e);obtain⟨q,h⟩:=cx x _ _ 8 ж ж p (by simpa using g);obtain⟨r,j⟩:=cx x _ _ 4 ж ж q (by simpa using h);obtain⟨t,l⟩:=cx x _ _ 2 ж ж r (by simpa using j);obtain⟨u,m⟩:=cx x _ _ 1 ж ж 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)) (ж:0<2);generalize (lq (v>>>s))%2=b at *;generalize (lq (1<<<(s-1)))=H at *;generalize (lq v)%2^(lq s)=R at *;exact gH_h2 _ _ _ _ this lemma eP_h1(e d:ἆ):aW e d=(if d==0 then e else if d<64 then f7 e d else if d==64 then(if e>0x8000000000000000 then 1 else 0) else 0):=by rw[aW];by_cases a:(d==0)=true;rw[AD a,AD a];rw[AC a,AC a];by_cases b:d<64;rw[AD b,AD b,gH _ _ (λh=>a (by subst h;rfl)) b];rw[AC b,AC b] lemma eP(e d:ἆ): aW e d=lk e (lq d):=by rw[eP_h1,f7,lk];have p:=d.toNat_lt;by_cases g:d=0;subst g;rfl;have j:(lq d)≠0:=λh=>g (ξ.1 (h.trans ϋ.symm));simp only[g,AQ,j,reduceIte,Gv,(ξ.1 ((Α ((I2 _ _).trans_lt p)).trans (χ d 1 (θ.2 (Zk.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:ἆ):(O2 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),Wg (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):(G5 ((e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456))=(18446744073709551616-e)*18446744073709551616/\(e:Ἁ)*18446744073709551616<340282366920938463463374607431768211456:=by have k:(e:Ἁ)*18446744073709551616-340282366920938463463374607431768211456=-(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by rw[U3,pO m.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551616-e)*18446744073709551616:Ἀ):Ἁ):=by exact_mod_cast Ϯ (Qb m) (϶ 64) exact⟨by rw[k,Zv,Ue],by rw[←sub_neg,k];exact neg_neg_of_pos p⟩ lemma fk_h2(e d:Ἀ)(m:e<18446744073709551616)(o:d<18446744073709551616):(G5 ((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[Y4,U3,pO (Z0 m),pO o.le];push_cast;ring have p:(0:Ἁ)<(((18446744073709551615-e)*18446744073709551616+(18446744073709551616-d):Ἀ):Ἁ):=by exact_mod_cast (Qb o).trans_le (H0 _ _) exact⟨by rw[k,Zv,Ue],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 [Wk,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 [Wk,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 [Wk,sub_zero,nr,decide_eq_false_iff_not,not_lt];exact⟨by norm_cast,ф⟩ @[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(U7 (az neg mlo B)) else if mhi>>>32==0 then let q:=(mhi<<<32)+(mlo>>>32) (U7 (az neg (if mlo&&&0xFFFFFFFF==0 then q else q|||1) (B+32))) else(U7 (az neg (if mlo==0 then mhi else mhi|||1) (B+64))) lemma toUInt32_toUInt64(x:ἇ):(O2 (U7 x))=x:=(by simp only [UInt32.toUInt32_toUInt64]) lemma i6_h1(e d:Ἀ):(e*2^(64:Ἀ)+d)/2^(32:Ἀ)=e*2^(32:Ἀ)+d/2^(32:Ἀ)/\(e*2^(64:Ἀ)+d)%2^(32:Ἀ)=d%2^(32:Ἀ):=by have k:e*2^(64:Ἀ)+d=d+e*2^(32:Ἀ)*2^(32:Ἀ):=by rw[Ϛ];exact Τ _ _ exact⟨by rw[k,Ρ _ _ (϶ 32),Τ],by rw[k,Μ]⟩ lemma i6_h2(e d:Ἀ)(h:e<2^(32:Ἀ))(j:d<2^(64:Ἀ)):e*4294967296+d/4294967296<18446744073709551616:=(O1 ((ϸ (϶ 32)).2 j) _).trans_le ((Ο _ _).symm.trans_le (ι _ h)) lemma i6_h3(X Y:ἆ)(m r:ℕ)(l:(lq X)=m)(k:(lq Y)=r):(lq (if Y==0 then X else X|||1))=if (r==0)=true then m else m|||1:=by by_cases c:r=0 · rw[AD (AQ.mpr (ξ.mp (k.trans (c.trans ϋ.symm)))),AD (AQ.mpr c)];exact l · rw[AC (λq=>c (k.symm.trans ((congrArg lq (AQ.mp q)).trans ϋ))),AC (λ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,ο,β,Kt];exact γ (i6_h2 _ _ h d.toNat_lt) obtain⟨c,a⟩:=i6_h1 (lq e) (lq d);simp only[kQ,c,a];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):=щ;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 ф d))).2 d)];congr 3;(clear * -;omega) lemma dq_h3(d e:Ἀ)(a:d<2^(64:Ἀ))(c: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 c _).trans_le ((Ο d _).symm.trans_le (ι _ a)) 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⟨c,a⟩:=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⟨(Uf.1 c).resolve_right (BD.1 (϶ 64)),a⟩ lemma dq_h1(a b:Ἀ)(v:a≠0):2^(57:Ἀ)<=a*2^(64:Ἀ)+b:=(ж:2^(57:Ἀ)<=2^(64:Ἀ)).trans ((lZ _ (ϵ v)).trans (V1 _ _)) lemma dq_h2(a b:Ἀ)(u:2^(32:Ἀ)<=a):2^(89:Ἀ)<=a*2^(64:Ἀ)+b:=(ж: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/\ (O2 (au d e B))= kW (kE lU (nb (aw d e) (((lq B):Ἁ)-298))):=by obtain⟨m,o⟩:=fk d e;rw[au]at h⊢;by_cases t:(d==0&&e==0)=ἃ · rw[AD t]at h;exact (Xk _ h).elim rw[AC t]at h⊢;have w:aw d e≠0:=λj=>t (by rw[bN]at j;simp only[Η,AQ,<-ξ,ϋ];split at j;exact dq_h3 _ _ d.toNat_lt e.toNat_lt j;exact dq_h4 _ _ j);by_cases p:B>442 · rw[AD p]at h;exact (Xk _ h).elim rw[AC p]at h⊢;have g:(lq B)<=442:=θ.1 (Wm.1 p) refine⟨w,g,?_⟩;rw[nb,o,m];have r:=ν (aQ d e) 32;rw[β]at r by_cases j:(aQ d e==0)=true · rw[AD j,(congrArg lq (AQ.1 j)).trans ϋ,ϳ,Κ,toUInt32_toUInt64,aJ _ _ _ (g.trans (ж:442<=506))] rw[AC j];have v:(lq (aQ d e))≠0:=λl=>j (by simp[<-ξ,l]) by_cases l:(aQ d e>>>32==0)=true · rw[AD l];have q:(lq (aQ d e))<2^(32:Ἀ):=N7 λh=>BD.1 (Zl h (϶ 32)) (r.symm.trans (congrArg lq (AQ.1 l))) rw[toUInt32_toUInt64];exact eN _ _ _ 32 _ (i6 _ _ q) g ж (dq_h1 _ _ v) rw[AC l];have u:2^(32:Ἀ)<=(lq (aQ d e)):=X2.1 λx=>l (AQ.2 (ξ.1 (r.trans (ώ x)))) rw[toUInt32_toUInt64];exact eN _ _ _ 64 _ (i7 _ _) g ж (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=(O2 (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 ф 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) (ф: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) (ф: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 (O2 (x-171)))%2^(8:Ἀ)*2^(23:Ἀ)+(mJ (d0 M))%2^(23:Ἀ)=(G-110)*2^(23:Ἀ)+r:=by obtain⟨d,rfl⟩:=D9 w;obtain⟨e,f⟩:=D9 m have l:(lq (x-171))=d+k+1:=by rw[χ x 171 (θ.2 (by rw[y];show 171<=_;exact (ж: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 a:d+k+1<2^(8:Ἀ):=by clear*-v j;omega have c:e<2^(23:Ἀ):=by rw[f]at q;exact Jh q rw[Ϫ,l,c5,lE,f,ϱ,ϱ,γ (a.trans ж:d+k+1<2^(32:Ἀ)),γ (a:d+k+1<2^(8:Ἀ)),γ (c.trans ж:e<2^(32:Ἀ)),γ c,<-h,f];simp only[Ϡ,n4,pA];rfl lemma bM_h1(g R:ἆ)(w:110<=(lq g))(v:(lq g)<363)(t:2^(23:Ἀ)<=(lq R)/\(lq R)<=2^(24:Ἀ)):(mJ (O2 ((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 ж: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 γ ((I1 (O1 v 62) 1).trans ж:62+(lq g)+1<2^(64:Ἀ))) w v ж ж ж ἅ rename_i c;have c:¬R=16777216:=by simpa using c exact H 0 _ _ _ _ y w v ж 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) ((J5 (I1 s _) (Z0 h)).trans_le ж) · exact ώ (by rw[lO];exact (L1 (not_lt.1 c) _).trans_lt ж) lemma bM_h3(Q R b:Ἀ)(hR:R<2^(39:Ἀ))(a: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 ж: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:=⟨(I1 p _).trans ж,(J5 (I1 p _) (Z0 (ϊ _ (ф:0<2)))).trans_le ж⟩ 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⟨a,c⟩:=bM_h6 _ p;rw[ar];simp(disch:=assumption) only[ν,η,j,kA,β,nr,γ];exact bM_h2 _ _ (ϊ _ (ф:0<2)) have d:2^(23:Ἀ)<=(lq N)/2^(39:Ἀ)/\(lq N)/2^(39:Ἀ)<2^(24:Ἀ):=⟨(mc (϶ 39)).2 ((Y3 ἅ).trans o),(ϸ (϶ 39)).2 (p.trans_eq ἅ)⟩ have e:2^(23:Ἀ)<=(lq (ar N))/\(lq (ar N))<=2^(24:Ἀ):=by rw[m];split;exact⟨d.1.trans (B5 _),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)) (ϊ _ (ф: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 Hj o:(N==0)=ἄ),bM_h5 g w v,(ж:¬(62:ἆ)<23),ἂ,υ];generalize aW N (62-23)=R at h⊢;have t:2^(23:Ἀ)<=(lq R)/\(lq R)<=2^(24:Ἀ):=h▸e;rw[<-h];clear l j m h q o p d e;rw[AC (by split<;>simp[μ]<;>first|exact (bM_h4 _ v).1|exact (bM_h4 _ v).2),gA,pA,Nat.add_left_cancel_iff];exact bM_h1 g R w v t lemma cl(n:Ἆ)(M a:ἆ)(e:(lq M)≠0)(d:(lq a)<=506): az n M a=md ((if n then-((lq M):Ἁ)else (lq M))*2^(lq a)) (-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:Ἀ)(a:S<63+2^(64:Ἀ))(q:(18446744073709551444+S)%18446744073709551616<253):(18446744073709551444+S)%18446744073709551616=S-172/\172<=S/\S<425:=by rcases M6 S 172 with h|h · rw[γ (O1 h _:18446744073709551444+S<18446744073709551616)]at q;exact absurd ((V1 _ _).trans_lt q) ж · have e:18446744073709551444+S=(S-172)+18446744073709551616:=by rw[show (18446744073709551616:Ἀ)=18446744073709551444+172 from ἅ,Nat.add_left_comm,J2 h] have c:S-172<18446744073709551616:=K3 h (a.trans (ж:63+2^(64:Ἀ)<172+18446744073709551616)) rw[e,Wy,γ c]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:Ἀ):=(E0 (ι (2^(23:Ἀ)) (O3 k.le 172)) N).trans_lt ж rw[γ (b.trans ж),Κ];exact⟨b.trans ж,(O1 b _).trans ж,b.trans ж⟩ 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 a:B-(62-l)=l+B-62:=(Nat.sub_sub_right _ (Z0 A)).trans (congrArg (·-62) (Τ _ _)) rw[a];exact⟨Km.2 ((ж:62<=172).trans (y.trans_eq (Τ _ _))),ἅ,Z4 y,(O3 (Z0 k) 62).trans_lt ж,(H0 _ _).trans (k.le.trans (ж:425<=506)),(I2 _ _).trans (k.le.trans (ж:425<=506))⟩ lemma dZ_h2(S:Ἀ)(k:S<425):(S-172)*2^(23:Ἀ)%2^(64:Ἀ)=(S-172)*2^(23:Ἀ):=γ ((ι (2^(23:Ἀ)) (O3 k.le 172)).trans_lt ж) lemma dZ_h6(l B:Ἀ)(y:172<=l+B)(A:l<63):110<=B:=Nat.le_of_add_le_add_left (y.trans (L1 (Z0 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=(U7 (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:=Yw ((μ.1 F).trans_eq (χ 0x8000000000000000 p (θ.2 g)));have E:(lq m)=(lq (m-p))+(lq p):=(congrArg lq (Kn m p).symm).trans ((η _ _).trans (γ (H.trans ж)));exact⟨(H0 _ _).trans_eq E.symm,E.trans_lt H⟩ have o:(lq m)≠0:=J8 (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,Ze]at q⊢;exact dZ_h3 _ (D5 A B.toNat_lt) q refine⟨j.1,j.2,dZ_h6 _ _ y A,Z0 ((H0 _ _).trans_lt k),?_⟩;have D:(lq (62-L))=62-l:=by rw[χ _ _ (by rw[θ,r];exact Z0 A),r]<;>rfl have z:(lq m)*2^(62-l)<2^(63:Ἀ):=AN (ϐ g (϶ _)) (by rw[<-AF];exact Θ ж (Y3 (by rw[lO,M3 (Z0 A)])));have w:(lq (m<<<(62-L)))=(lq m)*2^(62-l):=by rw[ψ,D,ο,γ (AO (I2 _ _) ж:62-l<64),γ (z.trans (ж:2^(63:Ἀ)<2^(64:Ἀ)))] obtain⟨a,n,O,C,c,s⟩:=dZ_h1 l (lq B) y k A;have u:(lq (B-(62-L)))=(lq B)-(62-l):=by rw[χ _ _ (by rw[θ,D];exact a),D] obtain⟨K,M,N⟩:=bM (v>>>63!=0) (m<<<(62-L)) (B-(62-L)) (w▸AZ (Eq.le (by rw[<-AF,M3 (Z0 A)])) (ι _ t)) (w▸z) (by rw[u];exact O) (by rw[u];exact C);rw[<-ξ,ϩ,(by rw[cl _ m B o c,cl _ (m<<<(62-L)) (B-(62-L)) (by rw[w];exact Ku o (϶ _).ne') (by rw[u];exact s),w,u];refine congrArg (md · (-298) ἄ) ?_;obtain⟨d,J⟩:∃d,(lq B)=62-l+d:=⟨(lq B)-(62-l),(M3 a).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[n,X5]:(lq B)-(62-l)-110=l+(lq B)-172)];obtain⟨I,G,i⟩:=dZ_h4 _ _ k N;split<;>rw[γ,γ]<;>with_reducible first|exact I|exact G|exact i 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 ж ж 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,Qz] lemma eZ(x:ἇ):kB x=0↔(mJ (bj x))<2^(23:Ἀ):=by rw[<-Β,aN];simp only [nr,nj,Vt,Gk,false_or] 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 Qc 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 Zw 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[Gu k];by_cases d:2<=k .rw[AC щ,AD d] .rw[AD щ,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 Zw 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 e:=ϛ M (2^(64:Ἀ)) generalize M/2^(64:Ἀ)=a,M%2^(64:Ἀ)=b at *;subst e 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[D7 k,γ (K3 k (D5 d i)),γ ((M1 _).trans s),γ s];clear*-k;omega lemma fD_h2(H L M:Ἀ)(e:L<2^(64:Ἀ))(g:H*2^(64:Ἀ)+L+M<2^(128:Ἀ))(c:¬(L+M%2^(64:Ἀ))%2^(64:Ἀ)0);have i:=ϛ M (2^(64:Ἀ)) generalize M/2^(64:Ἀ)=a,M%2^(64:Ἀ)=b at *;subst i have k:L+b<2^(64:Ἀ):=N7 λh=>c (by rw[D7 h,γ (K3 h (D5 e d))];exact K3 h ((O1 d 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 ж)];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,J2 (AZ j ж)],pow_one,Zx _ _ (ф:0<2^(lq s))] have:=l.toNat_lt;simp only[gd,μ,η,ψ,ν,d,ο,β,γ (AO j ж:(lq s)<64),γ (AO (I2 _ _) ж: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 ж),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,Ut,υ,↓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 Uf.1 h with h|h<;>rw[h]<;>simp only[J9,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:ἆ)(i: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=(O2 (dl d g n B t r u o p)):=by intro k;induction k<;>intro t r u o p a ht S I G J j .obtain rfl:t=n:=N2 ht (M0.1 a);rw[dl,AC (AX _)]at j⊢;exact aY _ _ _ _ _ _ S (by rw[J,ku _ _ _ _ (I.trans_lt ((ϐ i ж).trans_le ж)) (G.trans_lt ((ϐ i ж).trans_le ж))]) j rename_i k e;obtain⟨X,y⟩:tif h:sF (by simp[h]);have z:=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,γ ((E0 z i2).trans_lt ж)] 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 (Θ ш (not_lt.1 O))).trans_eq ш 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 (N:(lq H)*2^(64:Ἀ)+(lq L)<=t*2^(108:Ἀ))=>fD H L _ _ (E▸not_lt.1 O) (by rw[U,E,w];exact (E0 N l).trans_lt (((Ο t _).symm.trans_le (ι _ X)).trans_lt ((ϐ i ж).trans ж)));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 _▸E0 G l) ?_ j;rw[D,J,q,A,Y4 _ T];ring have q:=V r u I;refine e (t+1) _ _ o p y X x (by rw[q];exact Ο t _▸E0 I l) (G.trans m) ?_ j;rw[D,J,q,A,Y4 _ 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 (O2 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 Qc g) _ 0 0 0 0 0 rfl (by exact ϟ n) (λ_ h=>absurd h (by (clear * - h;omega))) (ц) (ц) (by simp[af]) ‹_›).symm .rfl .rw[AC g,AC ж] @[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) ж (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 ж (e.trans_eq ж);simp only[υ,Am,pJ,one_mul]at h;change|(2:ℝ)^E|<=_ at h;simpa only[AW (zpow_pos (ш:(0:ℝ)<2) E)]using h open FloatLib.Floats.Formats.Flocq in lemma re(x:ℝ)(E:Ἁ)(g:-1021<=E)(e:|x|<(2:ℝ)^E): |Kb 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 _ ш;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 ш;(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) ж d e j;exact⟨by rwa[fv,h],by rw[rv,h];exact mH _ _ ж 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 ж d d.significand 0 ((by simp only [pow_zero,mul_one])) l g (e.trans (pm 971 AP));rw[<-ό _ ж 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:(G5 (O5 i))<2^(53:Ἀ)):fv i.toFloat/\rv i.toFloat=(O5 i):=by have g:kI i.toFloat.toModel=kE kC (kR (O5 i) 0):=by have h:=ma i;rw[m5]at h;rw[h,<-Model.ofModel_ofInt_eq_intToFloat kC ж];exact Model.ofModel_ofInt_eq_roundDyadic kC ж _ have d:(kR (O5 i) 0).toReal=(O5 i):=by rw[<-ϖ,nD];simp have⟨j,l⟩:=lL kC ж (kR (O5 i) 0) (G5 (O5 i)) 0 (by simp[kR]) e (by simp[kR];decide) (by rw[d];exact AZ (((by rw[<-mI,Ϲ];exact_mod_cast e.le:|((O5 i):ℝ)|<=(2:ℝ)^(53:Ἀ)).trans_eq (AA _ _).symm).trans (AG ш ш)) (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 ж Nat.left_le_or lemma jo_h1(X:Ἀ)(a:Ἁ)(h:52<=X):a<=(X:Ἁ)+1+a-53:=Xf (X7 (X7 (B3.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[U3,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 (H1 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 ж) let q:kU:=⟨mS (l*m),o*p,g+h⟩;have D:Ji (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₂ (·*·) (K6 l o g v) (K6 m p h w)).symm have j:=Ϙ kC ж 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 ἅ,ἁ,Zy,q,D];rfl:pv kC (lc k0 (.finite l o g v) (.finite m p h w))=kE kC q)];exact⟨j,by rw[ό _ ж q j,d]⟩ all_goals simp only[lc,Model.isFinite_ofModel_zero kC ж,Model.toReal_ofModel_zero kC ж,Jj,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 ж;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 M4 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) (ж:(1:Ἀ)<2^(53:Ἀ)) ((by exact O9 1074 (k+1)):(-1074:Ἁ)<=((k+1:Ἀ):Ἁ)) (by rw[d,AW ф,<-AA];exact AG ш (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 (I6 i)<256 then pw ((I6 i)-1)else nm*pw ((I6 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 (G4 (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:(G5 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:ἇ):(G5 (sv w))<2^(24:Ἀ):=by have:=lB w;rw[sv];split<;>simp<;>exact Qc this lemma bL(a b c:Ἀ)(e:a+b<=c)(h:c<=971)(z:Ἁ)(g:(G5 z)<2^a): |(z:ℝ)*(2:ℝ)^(b:Ἁ)|<=(2:ℝ)^(971:Ἁ):=by rw[Ae,AW (ф:(0:ℝ)<2^(b:Ἁ)),AA];have d:|(z:ℝ)|<=2^a:=by rw[<-mI,Ϲ];exact_mod_cast g.le refine(AE d ф).trans ?_;rw[<-AF,<-AA];exact AG ш (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:(O5 u.toInt64)=n:=by rw[show (O5 u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [F8,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)(a:x<256)(t:q<2):q=1:=by omega lemma qV_h1(x c:Ἀ)(h:x<256):x-c<=900:=(I2 _ _).trans (h.le.trans ж) lemma qV_h2(x c:Ἀ)(h:x<256):1+(x-c)<=971:=(J1 ((I2 _ _).trans h.le) 1).trans ж 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)(a: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 (G4 (w>>>23)) h)/\∃k:Ἁ, (∀v,k9 v=k9 w->k*kM v=sv v)/\(G5 k)=1/\ rv (A.uget (G4 (w>>>23)) h)=k*2^((mJ (kB w))-c):=by have a:=bm w;have n:=w.toNat_lt;have d:=ap w;obtain⟨j,l⟩:=iJ ((mJ (kB w))-c) (qV_h1 _ _ a);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 a (Ϟ n)),ϻ,BK];have e:=dB (-1) ж;rw[(ж:(O5 (-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 exact O9 1074 ((expOf w).toNat-c)) (bL 1 _ 971 (qV_h2 _ _ a) AP _ ж);exact⟨this.1,-1,λv g=>by rw[sv,g,AD (d.mpr (qV_h6 _ _ H a))];ring,ἅ,by rw[this.2,AA]⟩ lemma dG_h1(q K X c:Ἀ)(r:q<=2)(a:K<2^(24:Ἀ))(hX:X<256):q*K<2^(25:Ἀ)∧-1074<=((X-c:Ἀ):Ἁ)∧25+(X-c)<=971:=⟨(ι K r).trans_lt ((N6 a ж).trans_le ж),(by decide:(-1074:Ἁ)<=0).trans (I3 _),(J1 ((I2 _ _).trans hX.le) 25).trans ж⟩ 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 (G4 (w>>>23)) h)/\ rv (u.toInt64.toFloat*A.uget (G4 (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:(G5 (((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 ш) k2 (bL 25 _ 971 k3 AP _ e);exact⟨this.1,by rw[this.2,<-p,AA,<-d v t];push_cast;ring⟩ lemma cI(w:ἇ)(_:kB w≠255):fv (dw w)/\rv (dw w)=(sv w:ℝ)*2^kG w:= dG 1 1 P iV _ w w _ (by exact NeZero.one_le) (by simp[an]) rfl (by simp[aT]) lemma xbF(a b:Ἅ)(h:rv a=rv b)(z:rv a≠0):a=b:=congrArg Uz (Vx (Kg h z)) lemma xbM{a b:Ἅ}(h:a.toModel=b.toModel):a=b:=congrArg Uz h def xbKv(i:Nat):Int:=(if i%256=0 then 0 else 8388608)-i*8388608+i/256*4294967296 def xbKf(i:Nat):Ἅ:=(Hr (xbKv i)).toFloat def xbK:ἀ:=⟨kK (n:=512) λi=>xbKf i.val⟩ lemma xbL:xbK.size=512:=by simp[xbK,kS] lemma xbU(i:Ἄ)(h):xbK.uget i h=xbKf i.toNat:=by simp[xbK,nN] @[inline]def xbW(w:ἇ):Ἅ:=(w.toInt32.toInt64.toFloat+xbK.uget (G4 (w>>>23)) (by rw[xbL,aC,dg];exact Ϟ w.toNat_lt))*P.uget (G4 (w>>>23)) (by rw[gL,aC,dg];exact Ϟ w.toNat_lt) lemma xbA(w:ἇ):w.toInt32.toInt64.toFloat+xbKf (w>>>23).toNat=(Core.mW w).toInt64.toFloat:=by have n:=w.toNat_lt;have D:=ϛ w.toNat (2^(23:Ἀ));have hi:=dg w;rw[jW]at D hi have m:(lK w).toNat=w.toNat%2^(23:Ἀ):=fe w have a:(kM w:Int)=((w.toNat%2^(23:Ἀ):Ἀ):Ἁ)+(if kB w=0 then 0 else 8388608):=by unfold kM;rw[m];split<;>push_cast<;>ring have l:=mV (Core.mW w) _ (an w) ((lB w).trans ж) have E:=bm w;have Z:kB w=0↔mJ (kB w)=0:=by rw[←nj,Β] have s:=Nat.le_one_iff_eq_zero_or_eq_one.mp (Zf.mp (Ϟ n:w.toNat/2^(31:Ἀ)<2)) by_cases z:kM w=0 ·have:w.toNat=0∨w.toNat=2147483648:=by unfold kM at z;split at z ·rename_i h;rw[m]at z;rw[h,nj,z,Κ,ϑ]at D;rcases s with s|s<;>rw[s]at D;exact pZ D.symm;exact BA D.symm ·exact absurd z (BD.mp (U1 (϶ 23) (V1 _ _))) rcases this with h|h<;>[rw[show w=0 from Β.1 h];rw[show w=2147483648 from Β.1 h]]<;>exact xbM ж have f:=ϊ w.toNat (϶ 23);generalize(w>>>23).toNat=i at hi⊢;generalize w.toNat%2^(23:Ἀ)=F at D a m f;generalize w.toNat/2^(31:Ἀ)=S at D s hi;generalize mJ (kB w)=e at D E Z hi have j:fv w.toInt32.toInt64.toFloat∧rv w.toInt32.toInt64.toFloat=((w.toNat-2^(32:Ἀ)*S:Ἁ):ℝ):=by have k:O5 w.toInt32.toInt64=if 2*w.toNat<2^32 then (w.toNat:Int) else w.toNat-2^32:=by rw[Int32.toInt_toInt64];exact lv _ have e:O5 w.toInt32.toInt64=w.toNat-2^(32:Ἀ)*S:=by rw[k];clear * - D s E f;split<;>omega rw[←e];exact dB _ (by rw[e];clear * - n s;omega) have v:xbKv i=(if kB w=0 then 0 else 8388608)-(i:Ἁ)*8388608+S*4294967296:=by unfold xbKv;rw[hi,E7,γ E,if_congr Z.symm rfl rfl];congr 2;rw[Y4,U3,nZ,Int.add_mul_ediv_left _ _ ж,Int.ediv_eq_zero_of_lt (b:=256) (K5 _) (Kw.mpr E),Int.zero_add] have c0:(kM w:Ἁ)=(w.toNat-2^(32:Ἀ)*S:Ἁ)+xbKv i:=by rw[v,a,hi,←D];push_cast;ring have B:-2^33omega have kv:O5 (Hr (xbKv i))=xbKv i:=by apply Int64.toInt_ofInt_of_le<;>clear * - B<;>omega have d:fv (xbKf i)∧rv (xbKf i)=xbKv i:=by have:=dB (Hr (xbKv i)) (by rw[kv];clear * - B;omega);rw[kv]at this;exact this have c:((kM w:Int):ℝ)=rv w.toInt32.toInt64.toFloat+rv (xbKf i):=by rw[j.2,d.2,←K8,←c0] have g:=jJ _ _ j.1 d.1 (kR (kM w) 0) (by rw[←c,←ϖ,nD];simp) ((lB w).trans ж) (ж:(-1074:Ἁ)≤0) (by rw[←ϖ,nD];simp;exact_mod_cast (lB w).le.trans (Θ ж ж:2^24<=2^971)) apply xbF _ _ (by rw[g.2,←c,l.2]);rw[g.2,←c];exact_mod_cast z lemma xbE(w:ἇ):xbW w=dw w:=by rw[xbW,dw,xbU,aC,xbA] lemma dJ_h1(a b:Ἀ)(h:a<256)(k:b<256):48+(a-1+(b-1))<=971:=AZ (J1 (E0 ((I2 _ _).trans h.le) ((I2 _ _).trans k.le)) _) ж 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:(G5 (sv x*sv w))<2^(48:Ἀ):=by rw[Ϩ];exact(ϕ (bg x) (bg w)).trans_eq ш have:=aE _ _ e g (sv x*sv w) (kG x+kG w:Ἀ) (by rw[l,m,AA,AF];push_cast;ring) (Ao d ш) (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[Jg,β,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=Vy kC (v.toBits>>>63!=0) ((lq ((v.toBits>>>52)&&&2047))) ((lq (v.toBits&&&0xfffffffffffff))):=by have d:Uu (kI v.toModel)=(lq ((v.toBits>>>52)&&&2047)):=ἅ;have e:Ug (kI v.toModel)=(lq (v.toBits&&&0xfffffffffffff)):=ἅ;have g:Kc (kI v.toModel)=(v.toBits>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Kc,AM,Ak];rw[<-Gl];exact Iff.rfl rw[<-Qp (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 ϝ ж,AO ϝ ж⟩ 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,Jl _ _ _ _ j l e,AC d];simp only[show kC.fracWidth=52 from ἅ,show kC.exponentBias=1023 from ἅ,Zz];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 _ ш);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 ж e (D.trans (by have h:=ϫ lU ἄ (2^(23:Ἀ)) (127-23) ж ж;simp only[υ,ἂ,one_mul]at h;change|((2^(23:Ἀ):Ἀ):ℝ)*(2:ℝ)^((127:Ἁ)-23)|<=_ at h;rwa[(ш:((2^(23:Ἀ):Ἀ):ℝ)*(2:ℝ)^((127:Ἁ)-23)=(2:ℝ)^(127:Ἁ)),AW ф]at h));have G:=ό lU ж d o;have A:=ό lU ж e v;have H:=ό lU ж 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[Kg 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:Ἀ):=⟨(I1 (ϐ t ж) _).trans_le ж,(J5 (I1 (ϐ t ж) _) (Z0 o)).trans_le ж⟩ 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 ж).trans_le ж);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:Ἀ)),Zx _ _ ф]: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:Ἀ),ϊ _ ш,(Xm x _).symm⟩;rw[Ρ _ _ ш,ώ p,Κ];rw[Μ,γ p]at m;have o:=ϊ q (ж: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 _ _ ш,mv _ _ ш,(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:Ἀ):=⟨(I1 (ϊ _ ж) _).trans_le ж,by rw[show (2:Ἀ)^(63:Ἀ)=2^(52:Ἀ)*2^(11:Ἀ) by norm_num,We];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,Ρ _ _ ш,Μ]at h;rw[ζ _ 52];have:=ϊ (lq b) (ш: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:Ἀ)(d:(lq A)=R)(c:(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 a:=μ.1 q rw[χ (536870911:ἆ) (b+b) (θ.2 (by rw[η,c,γ (C0 (E0 l l) ж)];exact N0 (E0 l l) ж)),η,c,γ (C0 (E0 l l) ж)] at a rw[η,η,c,pS,γ (C0 (L1 l 1) ж),d,γ (U1 (J5 (a.trans_le (I2 _ _)) (L1 l 1)) ж)] at e rw[<-e];exact⟨H0 _ _,by rw[pA,lO G 1 G,<-pA];exact Xn (Yw a)⟩ lemma j3_h4(f:ἆ)(v:(lq f)<4503599627370496):(lq ((f+268435456)&&&536870911))=((lq f)+268435456)%536870912:=by rw[Ε,η,γ (U1 (I1 v _) ж)];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 _ _ (Θ ж d) t (j3_h3 _ _ _ _ (j3_h4 f v) (by rw[ψ,g,γ (AO d ж),pS,na,γ (lu ж (AO d ж))]) (Θ ж 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 _ _ ж] have r:(f+2^(28:Ἀ))/2^(29:Ἀ)<2^(23:Ἀ)+1:=Ϟ ((I1 p _).trans_le ж) generalize (f+2^(28:Ἀ))/2^(29:Ἀ)=k at * obtain⟨e,rfl⟩:=D9 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,Xo,γ ((E0 (ι (2^(31:Ἀ)) (Z0 q)) (E0 (ι (2^(23:Ἀ)) ((H0 e 1195).trans_lt o).le) (J1 (Z0 r) _))).trans_lt ж)] 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 ж).trans_le ж,(I1 (((O1 p (E*2^(52:Ἀ))).trans_eq (Ο E _).symm).trans_le (ι _ o)) 268435456).trans_le ж⟩ 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:Ἀ)),We];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,β,ο,Ze];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 ж),γ (a.trans ж)];exact⟨b.ne,c.ne'⟩ · refine⟨?_,by rw[Xo,γ (a.trans (by decide))];exact c.ne'⟩ rw[show (2^(31:Ἀ):Ἀ)=2^(23:Ἀ)*2^(8:Ἀ) from rfl,Τ,mv _ _ ж,Wy,γ (b.trans ж)];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:Ἁ)) (s:ak S h<4294967296):T≠0/\(O2 (ak S h))=md T (-298) false:=by unfold ak at s⊢ dsimp only at s⊢ split at s swap exact absurd s ж 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,a,n,X,Y,I,J⟩:=j3 h _ _ hh y v c1 c2 c3 (rb _ c4) have D:=g0 _ a have x:=dV _ hS (λc=>by simp[c]at a) have O:(if(S.toBits>>>63!=0)=true then 2^(31:Ἀ) else 0)=(lq S.toBits)/2^(63:Ἀ)*2^(31:Ἀ):=by clear*- simp only[AM,Ak,<-ξ,ν,kA,kH,β,ϋ] have:(lq S.toBits)/2^(63:Ἀ)<2:=Ϟ S.toBits.toNat_lt generalize (lq S.toBits)/2^(63:Ἀ)=b at this⊢ rcases b with _|_|b rfl rfl exact absurd this щ rw[<-O]at D have d:(lq (F.eF S.toBits-1085))=(lq (F.eF S.toBits))-1085:=χ _ _ (θ.mpr (AZ ж a)) have j:(lq (F.eF S.toBits-1085))<=506:=(by rw[d];exact(O3 n 1085).trans ж) 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 a n 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,A⟩:110<=l-1085/\l-1085<363/\l-1085-110<=252:=⟨Z4 a,(O3 n 1085).trans_lt ж,(O3 (O3 n 1085) 110).trans ж⟩ obtain⟨b1,b2,b3,b4,K,z,b7,b9⟩:=ce_h1 _ _ v I J have hq:(g+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=(ϭ (L1 (Yy v) _)).trans ж have U:=Α (b2.trans ж) have C:=Α (b4.trans ж) obtain⟨F,-,-⟩:=bM E _ e5 (b1.trans_eq U.symm) (U.trans_lt b2) (b5.trans_eq d.symm) (d.trans_lt b6) obtain⟨H,-,-⟩:=bM E _ e5 (b3.trans_eq C.symm) (C.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 H generalize(g+2^(28:Ἀ))/2^(29:Ἀ)=q,l-1085-110=k at F H D hq A 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,H] have qv:(O2 (((S.toBits>>>63)<<<31)+(((S.toBits&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000))=R:=by apply Β.mp;rw[F,Ϫ,D,γ];exact Ja (by split<;>decide) ((E0 (ι (2^(23:Ἀ)) A) (J1 hq (2^(23:Ἀ)))).trans_lt ж) 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 A 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 A hq).2 p rw[qv] subst hR rw[aJ _ _ _ j,U,d]at V W⊢ rw[aJ _ _ _ j,aJ _ _ _ j,U,C,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,W4,nZ,<-AA] rw[<-AK AL,show (((lq h):Ἀ):Ἁ)=(((lq h)+1075-l:Ἀ):Ἁ)+((l:Ἁ)-1075) by rw[pO d1,Y4,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 ж a),nZ];ring:(((l-1085:Ἀ):Ἁ)-298)+10=((l:Ἁ)-1075)+(-298))] have ah:((m*2^(10:Ἀ):Ἀ):ℝ)=(m:ℝ)*(2:ℝ)^(10:Ἁ):=by rw[U3,W4,nZ,<-AA];rfl rw[ah,Ap (m:ℝ) ((2:ℝ)^(10:Ἁ)),mul_comm ((2:ℝ)^(10:Ἁ)),e,<-Ap] have q:(0:ℝ)<(2:ℝ)^(-298:Ἁ):=ф 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):=ф have aH:(G:ℝ)simp only[υ,Am,ἁ]at x<;>rw[x]at w B · have M:T≠0:=λc=>by rw[c,lH,sub_zero]at B;exact not_lt.mpr B i refine⟨M,?_⟩ unfold md rw[AC M] refine(iN _ _ _ ?_ ?_ r.symm V W N).symm<;>rw[aV,bJ]<;>simp only[υ,Am]<;>rw[t] refine AE ?_ q.le rw[pO K,sub_mul] exact sub_le_comm.mp B refine AE ?_ q.le rw[Y4,add_mul] exact neg_le_sub_iff_le_add.mp w · have M:T≠0:=by intro c rw[c,lH]at w exact not_le.mpr i (by linear_combination w) refine⟨M,?_⟩ unfold md rw[AC M] rw[<-r]at V W refine((iN _ _ _ ?_ ?_ r V W N).trans r).symm<;>rw[aV,bJ]<;>simp only[ἁ,neg_mul]<;>rw[t] rw[Y4] 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 M4 j),g t j,h,j,g] structure A8 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ noncomputable def A8.f(s:A8):Ἀ->Ἅ | 0=>s.a0 | 1=>s.a1 | 2=>s.a2 | 3=>s.a3 | 4=>s.a4 | 5=>s.a5 | 6=>s.a6 | _=>s.a7 lemma uk{i k:Ἄ}{S:Ἀ}(d:(J0 k)<8)(h:(J0 i)+8<=S)(e:S<2^(32:Ἀ)): (J0 (i+k))Ἅ)(N:Ἀ)(Y:ἀ):ἀ:= if (kS Y)q¬q=a->b<=q:=⟨N1 l,by rw[r,Q3,l,BK],r.trans_le (N1 l),λe=>(H4 e).trans_eq r.symm,λh e=>r.trans_le (U4 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,Zb _ _ _ _ (fq v).1 (fq v).2];change(lq (v.toBits>>>52&&&2047))<2047 at h;rw[show kC.encoding=.ieee from ἅ,(ж:kC.expAllOnesNat=2047),AM,Ak];exact K7 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 ((Jd.mpr d).trans_eq (W4 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,Kx _ ((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 (I1 (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 rw[fv]at q;rwa[<-p]);unfold rv at h;rw[p,v]at h have m:|(2:ℝ)^E|<=(2:ℝ)^(971:Ἁ):=by rw[AW ф];exact AG ш 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 _ ш l (a▸m);have e:=rx ⟨ἃ,1,E⟩ ш 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 щ];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:=N2 Q (M0.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): (O2 (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 (W1 l);rw[aO,dite_eq_right (λh=>c (cD h))];exact⟨AP,λq g d=>absurd (AO g d) c⟩ |succ k v=> intro i m l;have h:iby split<;>rename_i j<;>rw[Ι]at j<;>clear*-j<;>omega obtain⟨t,u⟩:=v (i+1) (if m<(A.uget i (cD h)>>>23)&&&255 then(A.uget i (cD h)>>>23)&&&255 else m) (by rw[ac h];exact congrArg B8 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 O3 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:=X2.2 (M0.1 h);rw[AC q,AC q] .rename_i c;have q:=N1 h;rw[AD q,AD q];exact c _ _ ((Qf n t).trans (congrArg B8 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:Ἁ):=ф have u:(0:ℝ)<2^P:=ф have r:(0:ℝ)<2^L:=ф intro m induction m with |zero=> intro t a O S o j obtain rfl:t=n:=N2 S (M0.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 (O2 c)else aB () lemma kRV(w:ἇ)(A:Ἀ)(a:w.toNat=2^(31:Ἀ)+A)(hA:A<255*2^(23:Ἀ)):reluW w=0:=by have e:A<2^(31:Ἀ):=hA.trans ж have d:(w&&&0x80000000!=0)=true:=by rw[AM,Ak,<-Β,Ξ];change ¬w.toNat&&&2^(31:Ἀ)=0 rw[Jg,a,Nat.testBit_two_pow_add_eq,Nat.testBit_lt_two_pow e];decide have q:A/2^(23:Ἀ)<255:=(ϸ ж).2 hA have c:(expOf w=255)=False:=by apply eq_false;intro z;have t:=congrArg mJ z unfold expOf at t;rw[Ξ,Υ,β,a] 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 _ _ ж,Wy,γ (q.trans ж)] at t exact absurd t (K7 q) unfold reluW;rw[AD (by simp only[d,c,decide_false,Yd,Ut,Bool.and_self])] open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in lemma kMB(e f:Ἀ)(a:e<256):(mkBits true e f).toNat=2^(31:Ἀ)+e*2^(23:Ἀ)+f%2^(23:Ἀ):=by unfold mkBits;simp only[ἁ] have g:((1:ἇ)<<<31).toNat=2^(31:Ἀ):=by decide have d:((lA e&&&0xff)<<<23).toNat=e<<<23:=by rw[ϴ,Ξ,lE] simp only[kN] rw[show (255:Ἀ)=2^(8:Ἀ)-1 from rfl,ζ,γ (by (clear * - a;omega):e%2^(32:Ἀ)<2^(8:Ἀ)),γ (by (clear * - a;omega):e<2^(32:Ἀ))] show (e<<<(23%32))%2^(32:Ἀ)=_;rw[ο];exact γ (by norm_num;(clear * - a;omega)) have h:(lA f&&&0x007fffff).toNat=f%2^(23:Ἀ):=by rw[Ξ,lE];simp only[kN] rw[show (8388607:Ἀ)=2^(23:Ἀ)-1 from rfl,ζ,I8 _ ж] rw[nK,nK,g,d,h] have r:f%2^(23:Ἀ)<2^(23:Ἀ):=ϊ _ ж have c:(2^(31:Ἀ)|||e<<<23)=(2^(8:Ἀ)*1+e)<<<23:=by rw[Ϥ (by (clear * - a;omega):e<2^(8:Ἀ)) 1,Nat.shiftLeft_or_distrib];congr 1 rw[c,←Nat.shiftLeft_add_eq_or_of_lt r,ο];ring open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in lemma kRD_h1{c:Prop}{i:Decidable c}{a b:ἇ}(e:c->reluW a=0)(d:¬c->reluW b=0):reluW (@ite _ c i a b)=0:=by by_cases h:c · rw[AD h];exact e h · rw[AC h];exact d h lemma kRD_h2(e f:Ἀ)(a:e<255):reluW (FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32.mkBits true e f)=0:= kRV _ _ ((kMB e f (H4 a)).trans (pA _ _ _)) ((O1 (ϊ f ж) _).trans_le (by rw[<-Ο];exact ι _ a)) lemma kRD_h3(x:Int)(h:¬127by decide) λ_=>kRD_h1 (λ_=>kRD_h1 (λ_=>by decide) λ_=>kRD_h1 (λ_=>kRD_h2 1 0 ж) λ_=>kRD_h2 0 _ ж) λ_=>kRD_h1 (λ_=>by decide) λh=>kRD_h2 _ _ (kRD_h3 _ h) open FloatLib.Floats.Formats.BinaryInterchange.Model.NativeBinary32 in lemma kRN(T:Ἁ)(h:T<0):p8 true (md T (-298) false)=0:=by have a:T≠0:=by omega unfold md;rw[AC a] rw[show kE lU (ofIntDyadic T (-298))=ofUInt32 (roundDyadic (ofIntDyadic T (-298))) from (ofUInt32_roundDyadic _).symm,bD] unfold p8;rw[AD rfl] exact kRD _ (by simp[ofIntDyadic,h]) lemma kNg(S:Ἅ)(m:fv S)(h:ἆ)(q:(lq h)<2^(63:Ἀ))(T:Ἁ)(o:|rv S-(T:ℝ)|<=(2:ℝ)^((lq h):Ἁ)) (j:(S.toBits>>>63!=0)=true)(c:h+1024<=eF S.toBits):T<0:=by have a:(lq h)+1024<=(lq (eF S.toBits)):=by have t:=θ.1 c;rwa[η,γ (by simp only[kA];(clear * - q;omega))] at t have g:¬eF S.toBits=0:=λz=>by rw[z] at a;simp at a have r:=dV S m g;rw[bJ] at r;simp only[j,ἁ] at r generalize (lq (S.toBits&&&0xfffffffffffff))=F at r generalize (lq (eF S.toBits))=E at r a generalize (lq h)=H at o a have e:(2:ℝ)^((H:Ἁ)+1)<=(2:ℝ)^(52:Ἁ)*(2:ℝ)^((E:Ἁ)-1075):=by rw[<-AK AL];exact AG one_le_two (by (clear * - a;omega)) have d:(2:ℝ)^(52:Ἁ)<=((F+2^(52:Ἀ):Ἀ):ℝ):=by rw[Y4,W4,nZ,zpow_ofNat];exact le_add_of_nonneg_left (I3 _) have i:(0:ℝ)<(2:ℝ)^(H:Ἁ):=zpow_pos two_pos _ have k:rv S<=-((2:ℝ)^(H:Ἁ)*2):=by rw[r,neg_mul,<-zpow_add_one₀ AL];exact neg_le_neg (e.trans (AE d (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 (k.trans_lt (neg_lt_neg (lt_mul_of_one_lt_right i one_lt_two))))) lemma kTF0(a:Ἆ)(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:(a&&(S.toBits>>>63!=0)&&h+1024<=eF S.toBits)=true):(0:Ἃ)=p8 a (ms n d e):=by simp only[Η,AJ] at c obtain⟨⟨r,i⟩,j⟩:=c have t:=kNg S m h q _ o i j rw[r,bT n d e g (by (clear * - t;omega))];exact (kRN _ t).symm lemma kEB(E:Ἀ)(m:E<2048)(l:(2^(64:Ἀ)-1195+E)%2^(64:Ἀ)<253):1195<=E∧E-1085-110<253:=by omega lemma kAkN(S:Ἅ)(h:ἆ)(e:ak S h<4294967296)(n:(S.toBits>>>63!=0)=true):p8 true (O2 (ak S h))=0:=by unfold p8;rw[AD rfl] unfold ak at e⊢;dsimp only at e⊢;split at e;swap;exact absurd e ж;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 ϝ ж rw[μ,Ζ]at l;simp only[kA]at l obtain⟨c,a⟩:=kEB _ m l have j:(lq S.toBits)/2^(63:Ἀ)≠0:=by have t:=n;simp only[AM,Ak,<-ξ,ν,kA]at t;simpa[β] using t have i:(lq S.toBits)/2^(63:Ἀ)<2:=(ϸ ж).2 (S.toBits.toNat_lt.trans_eq ш) have o:(lq S.toBits)/2^(63:Ἀ)=1:=by (clear * - j i;omega) have f0:(lq (S.toBits&&&0xfffffffffffff))<2^(52:Ἀ):=Ε S.toBits 0xfffffffffffff▸AO ϝ ж have r:((lq (S.toBits&&&0xfffffffffffff))+2^(28:Ἀ))/2^(29:Ἀ)<=2^(23:Ἀ):=Z0 ((ϸ ж).2 (by (clear * - f0;omega))) rw[μ]at e;simp only[kA]at e refine kRV _ _ (by rw[Ϫ,γ e,g0 S.toBits c,o,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:Ἀ):=ι _ (Z0 a) (clear * - a r;omega) @[specialize]def fz(p:Ἀ->Ἅ)(h:Unit->Ἅ)(n t:Ἀ)(mg G:ἆ)(a:Ἅ):ἆ:= if t<=n then let v:=if tἍ)(n L:Ἀ)(h:Unit->Ἅ)(S:Ἅ):ἆ:= let mg:=eF S.toBits+8 let G:=mg+I0 L if n<=27&&G<=1993 then let b:=fz p h n 0 mg G (dw 0) let E:=eF b if 1195<=E&&E<=1448 then U7 (az (b>>>63!=0) ((b&&&0xfffffffffffff)|||0x10000000000000) (E-1075)) else 4294967296 else 4294967296 @[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 (O2 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 twF(relu:Ἆ)(S:Ἅ)(hh:ἆ)(L n:Ἀ)(p:Ἀ->Ἅ)(bpf:Unit->Ἅ) (aB:Unit->Ἃ):Ἃ:=tf relu S hh λ_=>let c:=ftv p n L bpf S;if c<4294967296 then act relu (O2 c)else 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 () lemma mA11 (x:ℕ):x&&&2047=x%2048:=ζ x 11 lemma mA63 (x:ℕ):x&&&9223372036854775807=x%9223372036854775808:=ζ x 63 lemma mA8 (x:ℕ):x&&&255=x%256:=ζ x 8 lemma kAkF(S:Ἅ)(h:ἆ)(e:ak S h<4294967296):kB (O2 (ak S h))≠255:=by unfold ak at e ⊢; unfold F.eF at e ⊢; dsimp only at e ⊢ generalize S.toBits=b at e ⊢ split at e · rename_i c; rw [AD c] simp only [Η,AJ] at c obtain ⟨⟨⟨-, l⟩, -⟩, -⟩:=c have g:=b.toNat_lt simp only [μ,Ζ,Ε,ν,kA,kH,nr,β,mA11] at l g have hX:b.toNat%9223372036854775808/4503599627370496=b.toNat/4503599627370496%2048:=by (clear * -;omega) have hR:1195*8388608 ≤ (((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29).toNat∧(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29).toNat ≤ 1448*8388608:=by simp only [η,Ε,ν,kA,kH,nr,Wn,β,mA63]; (clear * - l hX;omega) have d:((b>>>63)<<<31).toNat=0∨((b>>>63)<<<31).toNat=2147483648:=by simp only [ψ,ν,kA,kH,nr,ο,β]; (clear * - g;omega) generalize (((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)=R at hR ⊢ generalize (b>>>63)<<<31=s at d ⊢ intro hq; have a:=congrArg mJ hq unfold kB at a simp only [Ζ,η,kA,kH,nr,β,Ξ,Υ,kN,Ϫ,mA8] at a (clear * - hR d a;omega) · exact absurd e ж lemma mQ52(x:ℕ):x&&&4503599627370495=x%4503599627370496:=ζ x 52 lemma ftZ(v:Ἅ)(z:v.toBits<<<1=0):rv v=0:=Kx _ (by have h:=congrArg lq z;simp only[ψ,ϋ,kA,kH,ο,nr]at h change ((lq ((v.toBits>>>52)&&&2047))==0&&(lq (v.toBits&&&0xfffffffffffff))==0)=true simp only[Ε,ν,kA,kH,mA11,mQ52,β,nr,Η,AQ];omega) lemma fxa1(v:Ἅ):lq ((v.toBits&&&0xfffffffffffff)|||0x10000000000000)=lq (v.toBits&&&0xfffffffffffff)+2^(52:Ἀ):=by rw[my,show lq (0x10000000000000:ἆ)=2^(52:Ἀ)*1 from ἅ,Hq,<-Ϥ (fq v).2,ϻ,Τ] lemma fzS(p:Ἀ->Ἅ)(h:Unit->Ἅ)(n:Ἀ)(mg G:ἆ)(L:Ἀ)(hG:lq G=lq mg+L)(hQ:lq G<=1993)(N:n+2<=2^L) (F:∀s≤n,fv (if st<=n+1->fv a-> rv a=(za:ℝ)*(2:ℝ)^(((lq G):Ἁ)-1075)->(G5 za)*2^L<=t*2^(53:Ἀ)->1<=lq (eF (fz p h n t mg G a))-> ∃r:Ἅ,fz p h n t mg G a=r.toBits/\fv r/\rv r=rv a+∑s∈Q5 t (n+1),rv (if sintro t a za O T o _ _ _;obtain rfl:=N2 T (M0.1 O);rw[fz,AC (Nat.not_add_one_le_self n)];exact⟨a,ἅ,o,by rw[Ky,C8,Av]⟩ |succ k y=> intro t a za O T o j B have u:t<=n:=Z0 (N1 O) have Y:n+1-(t+1)=k:=(Qf _ t).trans (congrArg B8 O) rw[fz,AD u,W8 (J3 u)];have f:=F t u generalize(if tby rw[c,ϋ]at l;exact absurd l ж),bJ] generalize lq (v.toBits&&&0xfffffffffffff)+2^(52:Ἀ)=M at hK h53 ⊢ generalize M/2^(lq G-lq (eF v.toBits))=K at hK generalize lq G=g at hK hL hEG ⊢ generalize lq (eF v.toBits)=x at hK hL hEG ⊢ subst hK refine⟨(if v.toBits>>>63!=0 then -1 else 1)*(K:Ἁ),?_,?_⟩ · split<;>rw[<-sub_add_sub_cancel (g:Ἁ) x,AK AL,<-pO hEG,AA]<;>simp only[U3,W4,nZ,X4,Kz,Ap,neg_mul,one_mul] rw[Ϩ,show G5 (if v.toBits>>>63!=0 then -1 else 1:Ἁ)=1 by split<;>rfl,one_mul,F8] exact(U0 K (Θ ж hL)).trans_lt h53 have W:=(ι _ (Int.natAbs_add_le za z)).trans ((Ϡ _ _ _).trans_le ((E0 B Z2.le).trans_eq (Ο t _).symm)) have M2:=K9 ((W.trans (ι _ (V7 u))).trans_lt ((ϐ (N:n+1<2^L) (϶ 53)).trans_eq (Ϗ _ _))) have g:rv a+rv v=((za+z:Ἁ):ℝ)*(2:ℝ)^(((lq G):Ἁ)-1075):=by rw[j,Z1,K8,add_mul] obtain⟨P1,P2⟩:=jJ a v o f (nb _ _) ((aV _ _).trans g.symm) M2 (Wo (B3.2 (l.trans hEG))) ((congrArg abs (aV _ _)).trans_le (AZ (by rw[Ae,Ae,AW (zpow_pos (two_pos:(0:ℝ)<2) _),AW (zpow_pos (two_pos:(0:ℝ)<2) _)];exact mul_le_mul_of_nonneg_left (AG one_le_two (Wp (B3.2 hQ))) (Aa _)) (bL 53 918 971 AP AP _ M2))) obtain⟨r,R1,R2,R3⟩:=y _ _ _ Y (V7 u) P1 (P2.trans g) W E;exact⟨r,R1,R2,by rw[R3,P2,add_assoc]⟩ · exact absurd E ж lemma fxd5{c:Prop}[Decidable c]{x:ἆ}(w:(if c then x else 4294967296)<4294967296):c:=by by_contra k;rw[AC k]at w;exact Xk _ w lemma jE_h1(P L:Ἀ)(J:P+L<=425)(D:L<=27):P+2*L-54<2^(63:Ἀ)∧((L+P:Ἀ):Ἁ)<=425:=⟨by rw[L7,<-pA];exact (I2 _ _).trans_lt ((E0 J D).trans_lt ж),B3.2 ((Τ L P).trans_le J)⟩ lemma jE_h2(K L:Ἀ)(y:K<=1993)(D:L<=27):K+L-1076<2^(63:Ἀ):=(I2 _ _).trans_lt ((E0 y D).trans_lt ж) 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((B5 _).trans N:n+1<=2^L);refine(AE y (pow_nonneg zero_le_two _)).trans ?_;rw[<-AF,<-AA];exact AG one_le_two (jE_h1 P L J D).2 by_cases RZ:(g&&(S.toBits>>>63!=0)&&u+1024<=eF S.toBits)=true · unfold tw tf;rw[AD RZ];exact kTF0 g (n+1) d e j S I u (by rw[x];exact (jE_h1 P L J D).1) v RZ unfold tw tf tS;rw[AC RZ];dsimp only;split .rename_i w;rw[cw _ _ _ j _ I u (by rw[x];exact (jE_h1 P L J D).1) v o w] generalize A:sT p n 0 (h ()) 0=r;split .rename_i t;split .rename_i w;obtain⟨m,l⟩:=iM _ _ (tm (d n) (e n)) n (lq r.2) t.1 t.2.1 K n 0 _ 0 rfl (ϟ _) q.1 (by simp only[q.2,Qj,Av,sub_self,A5,J9,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(Y9 (J1 (D.trans ж) _)).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 ж];exact G lemma jEF(g:Ἆ)(n:Ἀ)(d e:Ἀ->kF)(p:Ἀ->Ἅ)(h:Unit->Ἅ)(u:ἆ)(P L:Ἀ) (B:Unit->kF) (K:∀srename_i r ·rw[AD r];exact T rw[AC r];split at T<;>rename_i a ·rw[AD a];exact T rw[AC a];split<;>rename_i w;swap;exact T;refine congrArg _ ?_ unfold ftv at w ⊢;dsimp only at w ⊢;have c:=fxd5 w;rw[AD c]at w ⊢;have k:=fxd5 w;rw[AD k];obtain⟨-,c⟩:=X8.1 c;obtain⟨k,O⟩:=X8.1 k have i:=θ.1 (of_decide_eq_true k);have m:=θ.1 (of_decide_eq_true O);have Q:=θ.1 (of_decide_eq_true c) have M:=((η (eF S.toBits) 8).trans_le (Ay _ _)).trans_lt (I1 (fq S).1 _) have z:lq (eF S.toBits+8+I0 L)=lq (eF S.toBits+8)+L:=by rw[η,Ϣ,Α (D.trans_lt ж),γ ((E0 M.le D).trans_lt ж)] have t:∀s≤n,fv (if sif c:s(t s l).1) _ 0 (dw 0) 0 ἅ (ϟ _) Z.1 (by rw[o,lH,zero_mul]) ((ϳ _).trans_le (ϟ _)) ((by decide:1<=1195).trans i) have F:rv r=(af (n+1) d e:ℝ):=by rw[U,o,Ai,af,R9];exact ϔ (Finset.range_eq_Ico _).symm λs l=>(t s (Z0 (ϥ.1 l))).2 rw[A]at i m ⊢ have y:lq (eF r.toBits-1075)=lq (eF r.toBits)-1075:=χ _ _ (θ.mpr (AZ ж i)) have H:(⟨r.toBits>>>63!=0,lq (r.toBits&&&0xfffffffffffff)+2^(52:Ἀ),((lq (eF r.toBits)-1075:Ἀ):Ἁ)-298⟩:kU).toRat=(af (n+1) d e:ℚ)*2^(-298:Ἁ):=Rat.cast_injective (α:=ℝ) (by rw[ϖ,bJ,W7,B7,R8,Z7,<-F,dV _ C (λc=>by rw[c,ϋ]at i;exact absurd i ж),bJ,Ap,<-AK AL,pO (AZ ж i),nZ];rfl) have NZ:af (n+1) d e≠0:=λc=>by rw[c,lH,zero_mul,ϲ]at H;exact (U1 (϶ 52) (H0 _ _)).ne' H rw[toUInt32_toUInt64,bT (n+1) d e j NZ,aJ _ _ _ (by rw[y];exact(O3 m _).trans ж),fxa1,y];exact(mf _ _ _ _ NZ H).symm 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 (I6 q):=by intro k;induction k with |zero=>intro a j g d;rw[da,AC (X2.2 (W1 j))];exact mi ((N2 g (W1 j)).trans Ϝ.symm) λi e c=>(d i e).trans (Λ c).symm |succ k l=>intro a j g d;rw[da,AD (N1 j)];exact l _ ((congrArg (N-·) (ϣ _)).trans ((Q3 _ _ _).trans (congrArg (·-1) j))) ((ϣ _).trans_le (N1 j)) λi h=>if q:iα)(N:Ἀ): da f N (lQ N)=kK (n:=N) λq=>f (I6 q):=by exact iC_h1 f N _ _ rfl (ϟ N) λi h=>(D4 i h).elim lemma dN(n:Ἀ)(e d:Ἀ->kF):∀c i,i+c=n-> nC (kK (n:=n+1) λt=>if (I6 t)if (I6 t)e (I6 t)) (kK (n:=n) λt=>d (I6 t)) i c:=by intro c;induction c with |zero=>intro i h;obtain rfl:i=n:=(by exact Va 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,ж],bI _ _ _ g,aK,dN n d e n 0 (Κ n)];congr 1 .simp only[AX,Am,(ж:tm ld 0x80000000=0),Av];exact ϔ rfl λt j=>by simp only[AD (ϥ.mp j)];unfold tm;rw[Τ];ring simp[h.ne'] lemma kStep (a x:Ἅ) (A X d:ℝ) (K:ℕ) (g:K ≤ 971) (k:fv a) (j:fv x) (hX:rv x=X) (c : |rv a-A| ≤ d) (i : |A+X| + d < (2:ℝ)^K) : fv (a+x) ∧ |rv (a+x)-(A+X)| ≤ d+(2:ℝ)^K*(2:ℝ)^(-54:ℤ):=by obtain ⟨h,e⟩:=i5 a x k j K g (by rw [hX, ← sub_add_cancel (rv a) A,add_assoc]; exact (Ag _ _).trans_lt ((add_le_add c AP).trans_lt ((add_comm _ _).trans_lt i))) rw [hX] at e refine ⟨h,?_⟩ rw [← sub_add_sub_cancel (rv (a+x)) (rv a+X) (A+X),add_sub_add_right_eq_sub,add_comm d] exact (Ag _ _).trans (add_le_add e c) lemma kSeq (p:ℕ → Ἅ) (z:ℕ → ℤ) (u:ℝ) (n K:ℕ) (B:ℝ) (i:K ≤ 971) (k : ∀ t < n,fv (p t)∧rv (p t)=z t) (h : ∀ t ≤ n, |u + ∑ s ∈ kP t,(z s:ℝ)| ≤ B) (g: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 j:(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:=N2 Q (M0.1 D) rw [ao,AC (AX _)]; exact ⟨e,o⟩ | succ m G => intro t a D Q e o have d:t < n:=N1 D rw [ao,AD d] obtain ⟨q,N⟩:=k t d have c:=h (t+1) d rw [Ν, ← add_assoc] at c have:=kStep a (p t) _ _ _ K i e q N o ((add_le_add c (AE (F4.2 Q) j)).trans_lt g) refine G (t+1) (a+p t) (by rw[Q3,D,BK]) d this.1 ?_ rw [Ν, ← add_assoc,X6,add_one_mul]; exact this.2 lemma kE1 (n:ℕ) (d e:ℕ → Ἃ) (p:ℕ → Ἅ) (a:Ἅ) (P L:ℕ) (K : ∀ s < n,fv (p s)∧rv (p s)=tm (d s) (e s)) (q:fv a∧rv a=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 a) ∧ |rv (ao p n 0 a)-(af (n+1) d e:ℝ)| ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=by have h:((n:ℝ)+1)+1≤(2:ℝ)^L:=by exact_mod_cast N have pP:(0:ℝ)<2^P:=by positivity have g:(0:ℝ)<(2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ):=by positivity have j:(n:ℝ)<2^L:=by exact_mod_cast ((M1 n).trans_le ((B5 _).trans N)) have k: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 i:(2:ℝ)^(((P+2*L-54:ℕ)):ℤ)≤2^P:= (AA (2:ℝ) _).trans_le (AU one_le_two (Km.2 (J1 (U0 2 D) P))) 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 (fun t l=> (Ag _ _).trans ((add_le_add (E n AP) ((G9 _ _).trans (((Hk (λs o=>E s ((ϥ.1 o).le.trans l))).trans_eq ((Kh _).trans ((congrArg (· • (2:ℝ)^P) (Xa t)).trans (nsmul_eq_mul _ _)))).trans (AE (F4.2 l) pP.le)))).trans_eq ((add_comm _ _).trans (add_one_mul _ _).symm))) ((add_lt_add_of_le_of_lt AP ((AI j g).trans_le (k.trans i))).trans_le ((add_one_mul _ _).symm.trans_le ((AE h pP.le).trans_eq ((mul_comm _ _).trans (AF _ _ _).symm)))) n 0 a (pQ n) (ϟ n) q.1 (((congrArg abs (sub_eq_zero.2 (q.2.trans ((Av _).symm.trans (congrArg ((tm (d n) (e n):ℝ) + ·) (Qj _).symm))))).trans A5).trans_le (Af (I3 0) g.le)) exact ⟨R.1,(congrArg (λx=>|rv (ao p n 0 a)-x|) ((congrArg Int.cast (Ν (λs=>tm (d s) (e s)) n)).trans ((K8 _ _).trans ((congrArg (· + ((tm (d n) (e n):ℤ):ℝ)) (R9 _ _)).trans (add_comm _ _))))).trans_le (R.2.trans ((AE j.le g.le).trans k))⟩ lemma 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 M6 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 (O3 i2 1).trans (le_max_left _ _) have A : ∀ w:Ἃ, |(sv w:ℝ)| ≤ 2^24:=λw=>(show |(sv w:ℝ)| = mantOf w by unfold sv; split_ifs <;> simp only [Kz,X4,BE,nE]).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) rw [tm,Qk,Qk,Gw,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 _) ф) (AU one_le_two (E0 i1 j2)) ф ф _=2^(48+ix+max (e.toNat-1) 55):=by rw [← AF, ← AF, ← pA] _ ≤ _:=AU one_le_two (le_max_left _ _) · obtain rfl:s=n:=N2 hs h exact hb.trans (AU one_le_two (le_max_right _ _)) lemma kc0:(0:Ἄ).toNat=0:=by simp only [Ϧ] lemma kc1:(1:Ἄ).toNat=1:=by simp only [kD] lemma kc2:(2:Ἄ).toNat=2:=by simp only [kD] lemma kc3:(3:Ἄ).toNat=3:=by simp only [kD] lemma kc4:(4:Ἄ).toNat=4:=by simp only [kD] lemma kc5:(5:Ἄ).toNat=5:=by simp only [kD] lemma kc6:(6:Ἄ).toNat=6:=by simp only [kD] lemma kc7:(7:Ἄ).toNat=7:=by simp only [kD] lemma kc8:(8:Ἄ).toNat=8:=by simp only [kD] lemma 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 γ щ lemma aos (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:t < n):ao p n t a=ao p n (t+1) (a+p t):=by rw [ao,AD h] lemma aoe (p:ℕ → Ἅ) (n t:ℕ) (a:Ἅ) (h:n ≤ t):ao p n t a=a:=by rw [ao,AC (by exact X2.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 (λ_=>a==b) (λh=>by subst h; exact Az a) lemma 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 lemma wcK3eq_ok (a b:Ἂ ἇ × Nat × Nat) (h:wcK3eq a b=true):a=b:=by obtain ⟨k,j,l⟩:=a; obtain ⟨g,b2,i⟩:=b simp only [wcK3eq,Η,AQ] at h obtain ⟨⟨d,c⟩,e⟩:=h; rw [wcAeq_ok e,d,c] 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? λe=>if hk:eq e.k a=true then some ⟨e.v,by rw [e.h,ok _ _ hk]⟩ else none lemma 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? (λ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) (λp1=>withPtrAddr (pk a) (λ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]⟩) (λ_ _=>wcSub _ _)) (λ_ _=>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? (λ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) (λp1=>withPtrAddr (pk a) (λ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 (λ(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]⟩) (λ_ _=>wcSub _ _)) (λ_ _=>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 (λ(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⟩ lemma s5nb:2^(32:Ἀ) ≤ 2^nx:=by rcases System.Platform.numBits_eq with h|h <;> rw [h] <;> decide lemma s5uA {a b:Ἄ} (h:a.toNat+b.toNat < 2^(32:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by rw [lJ,γ (by have:=s5nb; exact Qa h this)] lemma s5uL {W:Ἂ ἇ}{k:Ἄ}(h:k>>24).toNat=(kB w).toNat:=((Υ _ _).trans (β _ _)).trans (eS w).symm lemma s5tu (k:Nat)(h:k<2^(32:Ἀ)):(k.toUSize).toNat=k:=by simp only [G0]; exact γ (by have:=s5nb; exact Qa h this) lemma s5fmax(l:List ἇ):∀ m0:ἇ,m0.toNat ≤ (l.foldl (λ(m v:ἇ)=>if mif mexact λ_=>⟨le_refl _,λ_ h=>nomatch h⟩ |cons y l i=> intro m0;simp only[Ϸ];obtain⟨a,e⟩:=i (if m0simp only[c,ἁ,ἂ]at a e⊢ ·exact⟨AZ (Ι.mp c).le a,λx d=>(List.mem_cons.mp d).elim (λh=>h▸a) (e x)⟩ ·exact⟨a,λx d=>(List.mem_cons.mp d).elim (λh=>h▸AZ (V3 λg=>c (Ι.mpr g)) a) (e x)⟩ structure A16 where a0:Ἅ a1:Ἅ a2:Ἅ a3:Ἅ a4:Ἅ a5:Ἅ a6:Ἅ a7:Ἅ b0:Ἅ b1:Ἅ b2:Ἅ b3:Ἅ b4:Ἅ b5:Ἅ b6:Ἅ b7:Ἅ def rMu(W:Ἂ Ἃ)(k e:Ἄ)(m:Ἃ):Ἃ:= if h:k>>24 termination_by (J0 e)-(J0 k) decreasing_by all_goals (rw[ac h];exact C3 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 lemma s5tBi_inv (W:Ἂ ἇ)(n ow d t:Ἄ)(B:Nat) (D:(ow.toNat+16)*n.toNat<2^(31:Ἀ))(r:d.toNat≤ow.toNat+16)(K:ow.toNat*n.toNat≤W.size)(u:W.size<2^(32:Ἀ))(g:t.toNat intro o k A s ho e hA; have z:=M0.1 s; rw [tBi,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only exact ⟨by rw[hA,N2 ho z],λi _=>rfl,λp l L=>absurd (l.trans_lt L) (not_lt.2 z)⟩ | succ m N => intro o k A s ho e hA have l:o.toNat < d.toNat:=N1 s have O:(o.toNat+1)*n.toNat ≤ (ow.toNat+16)*n.toNat:=ι _ (l7 (l.trans_le r)) have j:(o+1).toNat=o.toNat+1:=by rw [s5uA (a:=o) (b:=1) (by simp; clear*-l r hO D; omega)]; simp have C:=nO o.toNat n.toNat have H:(k+n).toNat=(o.toNat+1)*n.toNat+t.toNat:=by rw [s5uA (a:=k) (b:=n) (by rw [e]; clear*-g O C D; omega),e,C]; exact lO _ _ _ rw [tBi,AT (by rw [ε]; exact l)] have y:(A.push (if oby show (A.data.push v).size=A.data.size+1; simp rw [q,j,hA,pA] obtain ⟨G,F,J⟩:=N (o+1) (k+n) _ (by rw [j,←X5,s,BK]) (by rw [j]; exact l) (by rw [H,j]) y refine ⟨G,λi hi=>by rw [F i (by rw [j]; exact H4 hi),s5push_get,AD (by rw[hA];exact hi)],λp w x => ?_⟩ rcases M6 o.toNat p with q | q · exact J p (by rw [j]; exact q) x · have pe:p=o.toNat:=N2 q w subst pe rw [F _ (by rw [j]; exact M1 _),s5push_get,AC (by rw[hA];exact AX _),AD hA.symm] by_cases hw:o < ow · have c:=ε.mp hw have kb:k.toNat < W.size:=by rw [e]; have:=ι n.toNat (l7 c); rw [Ο] at this; exact (O1 g _).trans_le (this.trans K) have I:k < W.usize:=by have M:W.usize.toNat=W.size%kX:=by simp [Q8] rw [ε,M,γ (u.trans_le ς)]; exact kb rw [AD hw,AT I,AD c,s5uget,e] · have c:¬ o.toNat < ow.toNat:=λh=>hw (ε.mpr h) rw [AC hw,AC c] lemma s5rMu_spec_h1 (x v:ἇ):x ≤ (if x>>24).toNat ≤ (rMu W k e x).toNat ∧ ∀ j,k.toNat≤j → jintro k e x i g; have z:=W1 i; rw [rMu,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; exact ⟨le_refl _,λj d t=>absurd (d.trans_lt t) (not_lt.2 z)⟩ | succ m w => intro k e x i g have d:k.toNat < e.toNat:=N1 i have s:(k+1).toNat=k.toNat+1:=by rw [s5uA (a:=k) (b:=1) (by rw[mA]; exact C0 d (g.trans_lt c))]; simp rw [rMu,AT (by rw [ε]; exact d)] have q:k < W.usize:=by have u:W.usize.toNat=W.size%kX:=by simp [Q8] rw [ε,u,γ (c.trans_le ς)]; exact d.trans_le g simp only [AT q] obtain ⟨r,A⟩:=w (k+1) e _ (by rw[s,←X5,i,BK]) g have mono : ∀ a b:ἇ,a ≤ b → (a>>>24).toNat ≤ (b>>>24).toNat:=λa b h=>by simp only [Υ,β]; exact ϭ (C5.mp h) set v:=W.uget k (s5uL q)<<<1 obtain ⟨n,mx2⟩:=s5rMu_spec_h1 x v refine ⟨AZ (mono _ _ n) r,λj o l => ?_⟩ rcases M6 k.toNat j with p | p · exact A j (by rw [s]; exact p) l · have y:j=k.toNat:=le_antisymm p o subst y rw [← s5exp, ← s5uget W k (s5uL q)]; exact AZ (mono _ _ mx2) r lemma s5da_spec{α:Type}[Inhabited α](f:Nat->α)(N:Nat):∀ m (a:Ἂ α),N-a.size=m→a.size≤N→(∀ iintro a d e hi; have z:=W1 d; rw [da,AC (not_lt.2 z)]; exact ⟨le_antisymm e z,λi h=>hi i (h.trans_le z)⟩ | succ m g => intro a d e hi; rw [da,AD (N1 d)] refine g _ (by simp; (clear * - d e;omega)) (by simp; exact N1 d) (λi h => ?_) simp at h rcases M6 i a.size with c|c · rw [AB _ i (by simp; exact M4 c),nU c, ← AB a i c]; exact hi i c · have:i=a.size:=le_antisymm h c subst this; rw [AB _ _ ц,nV] lemma s5wcGet3_val {K V:Type} {f:K → V} {a:K} (x : {v // v=f a}):x.1=f a:=x.2 lemma 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 γ щ lemma 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 lemma kXU (X:Ἂ Ἃ)(i:Ἄ)(h:(J0 i)<(O0 X))(c:ℕ)(a:(J0 i)=c):X.uget i h=X[c]! := by subst a; rw [AB X (J0 i) h]; rfl lemma kIx7 (a k:Ἄ) (c:ℕ) (d:k.toNat=c) (e:c ≤ 7) (S:ἀ) (h:a.toNat+7 < S.size) (g:a.toNat+7 < 2^(31:Ἀ)) : (a+k).toNat < S.size:=by rw [kSm a k (by (clear * - d e g;omega))]; (clear * - d e h;omega) lemma kTB (w:Ἃ) (F E:ℕ) (K:idxOf w ≤ F) (a:174+F ≤ E) : |(tm ld w:ℝ)| ≤ 2^E := have d:(tm ld w).natAbs ≤ 2^23*2^24*2^(126+F):=(Ϩ _ _).trans_le (ϧ ((Ϩ _ _).trans_le (ϧ ж (bg w).le)) ((Yb 2 _).trans_le (Θ two_pos (E0 ж K)))) have c: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 a)) (mI.symm.trans (Zg _).symm:|(tm ld w:ℝ)|=_).trans_le (((F4 (α:=ℝ)).mpr (d.trans c)).trans_eq ((W4 2 E).trans (congrArg (·^E) nZ))) lemma kLS (n c:ℕ) (I:ℕ → ℕ) (f:ℕ → ℤ) (p : ∀ k < c,I k < n) (m : ∀ a b,a < b → b < c → I a < I b) (q : ∀ s < n,(∀ k < c,I k≠s) → f s=0) : ∑ k ∈ kP c,f (I k) = ∑ s ∈ kP n,f s:=by have l:Set.InjOn I (kP c):=by intro a i b g e simp only [Finset.coe_range,Set.mem_Iio] at i g rcases Ju a b with h | h | h · exact absurd e (K7 (m a b h g)) · exact h · exact absurd e.symm (K7 (m b a h i)) rw [← Finset.sum_image (λa i b g e=>l i g e)] apply Finset.sum_subset · intro s d; simp only [Hw,ϥ] at d ⊢ obtain ⟨k,j,rfl⟩:=d; exact p k j · intro s d o; simp only [Hw,ϥ,not_exists,not_and] at d o exact q s d (λk j e=>o k j e) lemma dZ1 (n:ℕ){f g:ℕ→Ἃ}{h e:Ἃ}{t E F:ℕ}(A:∀ s(congrArg kG (AD d)).trans_le (A s d)) (λs d=>(congrArg (λw=>(kB w).toNat) (AD d)).trans_le (v s d)) ((congrArg₂ (λa b=>|((tm a b:ℤ):ℝ)|) (AC (AX n)) (AC (AX n))).trans_le (kTB _ F E K G)) lemma dZ2 {x:Ἅ}{a b c d:Ἃ}(h:c=a)(k:d=b)(H:fv x∧rv x=tm a b):fv x∧rv x=tm c d:=by rwa[h,k] lemma dZ3 (n:ℕ)(f g:ℕ→Ἃ)(x y:Ἃ):af (n+1) (λs=>if sif scongrArg₂ tm (AD (ϥ.1 d)) (AD (ϥ.1 d))) (congrArg₂ tm (AC (AX n)) (AC (AX n)))).trans (add_comm _ _)) lemma dZ4 (n:ℕ){f g:ℕ→Ἃ}{y:Ἃ}(A:∀ sif sif sif h:kif s < n then l s else ld) (λ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 (λ_=>tS g L n q (λ_=>dw ld*dw b[j]!) B) B = p8 g (ms (n+1) (λs=>if s < n then l s else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)):=by unfold tG;dsimp only;split;swap;exact D rename_i Y obtain ⟨M,x⟩:=of_decide_eq_true Y let P:=max (48+t+max (e.toNat-1) 55) E have m:P+L≤425:=(max_add_add_right _ _ L).symm.trans_le (max_le x S) have hq:(hG e t E L).2.toNat=P+2*L-54:=by unfold hG;dsimp only rw[Α (AO (by omega:P+2*L-54≤1000) ж)] have C:∀ sN8 (Ι.1 M) ((congrArg mJ h).symm.trans_le (v s d)) have R:=kE1 c (λk=>if kif kdZ2 (AD i) (AD i) (T k i (C _ (u k i)))) (dZ2 (AC (AX c)) (AC (AX c)) (dJ ld b[j]! ж K.1)) (dZ1 c (λk i=>(A _ (u k i)).2) (λk i=>v _ (u k i)) K.2 G) ((L1 N 2).trans H) r m show tw g _ _ L n q (λ_=>dw ld*dw b[j]!) B=_ exact jE g n _ _ q (λ_=>dw ld*dw b[j]!) (hG e t E L).2 P L B (λs d=>dZ2 (AD d) (AD d) (z s d (C s d))) (dZ2 (AC (AX n)) (AC (AX n)) (dJ ld b[j]! ж K.1)) (dZ4 n (λs d=>⟨(A s d).1,C s d⟩) K.1) (dZ1 n (λs d=>(A s d).2) v K.2 G) H r m hq D _ R.1 (by rw[hq,dZ3,← kLS n c I _ u U X];rw[dZ3] at R;exact R.2) lemma kAD (n:ℕ) (a:Ἆ) (X W b:Ἂ Ἃ) (r o:ℕ) : aD n a X W b (r*n) 1 o=act a (dotOf (n+1) (λt=>if t < n then X[r*n+t]! else oneW) (λt=>if t < n then W[o*n+t]! else b[o]!)):=by unfold aD; rw [bO]; simp only [ϻ] lemma kAddS (a b:ἆ) (h:a.toNat+b.toNat < 2^(63:Ἀ)):(a+b).toNat=a.toNat+b.toNat:=by rw [η]; exact γ (N3 h ж) lemma kOfS (n:ℕ) (h:n < 2^(63:Ἀ)):n.toUInt64.toNat=n:=by rw [Ϣ,J6]; exact γ (N3 h ж) lemma 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 (Uh x.toModel y.toModel)=_;rw[Uh,nu] have h:=Model.sub_eq_ofModel_sub_of_isFinite (fmt:=kC) ж (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) ж d e j exact⟨by rwa[fv,h],by rw[rv,h];exact Model.toReal_sub_eq_roundAt _ _ ж g⟩ lemma s5ofb(a:ἆ)(d:¬(a>>>52)&&&2047=2047):kI (F5 a).toModel=G7 (fmt:=kC) a.toBitVec:=by have h:kI (F5 a).toModel=Zc (G7 (fmt:=kC) a.toBitVec):=by show BB (Gx a)=_ unfold Gx;exact Js _ rw[h];apply Ks refine ⟨λc _=>absurd c ?_⟩ intro c;apply d have:=congrArg Oc c have g:FloatFormat.binary64.toModel.exponentBits=11:=rfl have e:FloatFormat.binary64.toModel.mantissaBitsWithoutImplicit=52:=rfl simp [nX,Model.toModelBits,G7,g,e] at this change (BitVec.extractLsb' 52 11 (a.toBitVec:BitVec 64)).toNat=2047 at this rw[Xp] 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:ἆ):G7 (fmt:=kC) a.toBitVec=Vy kC (a>>>63!=0) ((lq ((a>>>52)&&&2047))) ((lq (a&&&0xfffffffffffff))):=by have d:Uu (G7 (fmt:=kC) a.toBitVec)=(lq ((a>>>52)&&&2047)):=ἅ have e:Ug (G7 (fmt:=kC) a.toBitVec)=(lq (a&&&0xfffffffffffff)):=ἅ have g:Kc (G7 (fmt:=kC) a.toBitVec)=(a>>>63!=0):=by rw[<-jT];apply ϓ.mpr;simp only[Kc,AM,Ak];rw[<-Gl];exact Iff.rfl rw[<-Qp (G7 (fmt:=kC) a.toBitVec),d,e,g] lemma s5pw(m:ℕ)(z:Ἁ):((2^m:ℕ):ℝ)*(2:ℝ)^(z-m)=(2:ℝ)^z:=by rw[W4,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,Jg,lW] by_cases c:(mJ w)/2147483648%2=1<;>simp[c] lemma kReluW(a:Ἆ)(w:ἇ)(g:expOf w≠255): w&&&((if a then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))=act a w:=by have l:=w.toNat_lt have b:(mJ (w>>>31))=(mJ w)/2^(31:Ἀ):=by rw[Υ];simp[β] have j:w&&&(4294967295:ἇ)=w:=by apply Β.mp;rw[Ξ];simp only[kN] rw[show (4294967295:ℕ)=2^(32:Ἀ)-1 from rfl,ζ];exact γ l have d:=s5and w unfold act reluW rcases M6 (mJ w) (2^(31:Ἀ)) with c|c · have e:w>>>31=0:=Β.mp (by rw[b,nj];exact ώ c) have i:(w&&&0x80000000)=0:=Β.mp (by rw[d,AC (by (clear * - l c;omega)),nj]) cases a<;>simp[e,i] · have k:w>>>31=1:=Β.mp (by rw[b,Xq];exact mG c l) have h:(w&&&0x80000000)≠0:=λq=>by have:=congrArg mJ q;rw[d,AD (by (clear * - l c;omega))]at this;simp at this cases a<;>simp[k,h,g,j] 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^((I6 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 W3)⟩ 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,W3];refine⟨(ϙ (n:=n)).le.trans (Θ ж (by exact le_tsub_add)),.inl (Θ ж щ),zPs_h1 _⟩;exact zPs_h2 n def wdU(K:Ἂ Ἃ)(i n:Ἄ)(Y:ἀ):ἀ:= if h:i(kS (wdU K i n Y))=(kS Y):=by intro m;induction m with |zero=>intros;rw[wdU,dite_eq_right (λh=>by have:=ε.mp h;omega)] |succ m r=>intro i Y e;have h:isimp only[uZ] lemma wdUs(K:Ἂ kF)(n:Ἄ)(o:(O0 K)<2^(32:Ἀ)):∀m (i:Ἄ)(Y:ἀ),(J0 n)-(J0 i)=m->(J0 n)<=(kS Y)->(kS Y)<2^(32:Ἀ)->(∀q<(kS Y),Y.data[q]! =if q< (J0 i) then Dense.F.dw K[q]! else Dense.F.dw 0)-> ∀q<(J0 n),(wdU K i n Y).data[q]! =Dense.F.dw K[q]!:=by intro m;induction m with |zero=> intro i Y e a b c q hq;rw[wdU,dite_eq_right (λh=>P6 (ε.1 h) e),c q (AN hq a),AD (AN hq (W1 e))] |succ m j=> intro i Y e a b c;have h:i?_ rw[d]at hq;rw[fuS _ _ _ _ _ hq,Dense.ac h,c q hq];by_cases q1:(J0 i)=q .subst q1;rw[AD ἅ,AD (by exact lt_add_one iб),kr] .rw[AC q1];by_cases q2:q< (J0 i) .rw[AD q2,AD (H4 q2)] .rw[AC q2,AC (by (clear * - g k q1 q2;omega))] .rename_i k;refine j (i+1) Y l a b λq hq=>?_ rw[c q hq,Dense.ac h];by_cases q2:q< (J0 i) .rw[AD q2,AD (H4 q2)] .by_cases q3:q=(J0 i) .subst q3;rw[AC q2,AD (by exact lt_add_one iб),An K _ (λr=>k (ε.2 (p▸r)))];rfl .rw[AC q2,AC (by (clear * - q2 q3;omega))] lemma Lk2(t n S:ℕ)(h:t < n)(hX:8*n≤S):8*t+7 < S:=(U0 8 (l7 h)).trans hX lemma Lkd(R r:ℕ)(h:r < R):R-(r+1) < R-r:=Z3 h (M1 r) lemma k7d1:1≤7:=G1 rfl lemma k7d2:2≤7:=G1 rfl lemma k7d3:3≤7:=G1 rfl lemma k7d4:4≤7:=G1 rfl lemma k7d5:5≤7:=G1 rfl lemma k7d6:6≤7:=G1 rfl lemma k7d7:7≤7:=G1 rfl def Yarm:Bool:=!(System.Platform.target.startsWith "x86") @[inline] def fM(arm:Ἆ)(a x q:Ἅ):Ἅ:=if arm then Gy x q a else a+x*q 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:tfM Yarm _ x w) (kFU _ _ _) all_goals exact congrArg (λx=>fM Yarm _ x w) (kX8_spec_h3 _ _ _ _ (by first | exact kc1 | exact kc2 | exact kc3 | exact kc4 | exact kc5 | exact kc6 | exact kc7) s ж _) lemma kX8_spec_h2(z y:A8)(f:Ἀ->Ἅ)(c k d l:Ἀ)(u v:Ἅ)(e:z=y)(I:y.f l=ao f c d u)(a:d=k+1)(h:u=v+f k)(g:k ∀ l,l<8 -> (kX8 e d wo n w hX c t g u q k p j o r).f l = ao (λs=>d.data[8*s+l]!*e.data[(J0 wo)+s]!) (J0 n) (J0 t) (A8.f ⟨g,u,q,k,p,j,o,r⟩ l):=by intro m; induction m with | zero => intro t g u q k p j o r H l v have z:=W1 H;rw[(kX8.eq_1 e d wo n w hX c t g u q k p j o r).trans (dite_eq_right (by rw[ε];exact X2.2 z)),aoe _ _ _ _ z] | succ m A => intro t g u q k p j o r H l v have i:(J0 t) < (J0 n):=N1 H have h:t < n:=ε.mpr i have x:(J0 (8*t))=8*(J0 t):=by rw[kMm _ _ (by rw[kc8];exact AO (U0 8 (U2 i)) c.2),kc8] have B:(J0 (wo+t))=(J0 wo)+(J0 t):=kSm _ _ (AO (J1 (U2 i) _) c.1) exact kX8_spec_h2 _ _ _ _ _ _ _ _ _ ((kX8.eq_1 e d wo n w hX c t g u q k p j o r).trans (AT h)) (A (t+1) _ _ _ _ _ _ _ _ (by rw[ac h,Q3,H,BK]) l v) (ac h) ((kX8_spec_h1 _ _ _ _ _ _ _ _ _ _ _ (by rw[x];exact AO ((J1 (ж:7<=8) _).trans (U0 8 i)) c.2) _ _ _ _ _ _ _ _ l v).trans (by rw [kFU,B,x]; exact y _ i l v _)) i @[inline] def cEq(F a:Ἅ):ἆ:=let e:=eF (F*a).toBits;if (1078:ἆ)p then hb else p) if c<(4294967296:ἆ) then (let w:=O2 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) else (0xFFFFFFFF:ἇ) @[inline] def mx2(a c:ἆ):ἆ:=if aP6 (ε.mp h) a,λh=>P6 h a⟩ 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 e c wo n hX i t a m=sT (λs=>dw X[(J0 c)+s]!*e.get! ((J0 wo)+s)) (J0 n) (J0 t) a m:=by intro k;induction k with |zero=>intro t a m h;rw[sTb,dite_eq_right (kS0 t n h).1,sT,AC (kS0 t n h).2] |succ k q=> intro t a m h;obtain⟨g,p⟩:=kSt t n k h have j:=(kUb c t n _ (ε.mp g) hX).2 have o:=(kUb wo t n _ (ε.mp g) i).2 have r:∀d,X.uget (c+t) d=X[(J0 c)+(J0 t)]! :=λd=>by rw[AB X _ (j▸d)];simp only[Kv,j] have l:∀d,e.uget (wo+t) d=e.get! ((J0 wo)+(J0 t)):=λd=>by rw[ug,gg,o] rw[sTb,AT g,sT,AD (ε.mp g)];dsimp only;rw[r,l,q (t+1) _ _ p,ac g] @[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 (O2 c)else aB () lemma sTB_h(a n:Ἀ)(h:a+n<2^(31:Ἀ)):(J0 (G0 a))=a∧(J0 (G0 n))=n:= ⟨X3 (AN (AN ((V1 a n).trans_lt h) ж) ς),X3 (AN (AN ((H0 n a).trans_lt h) ж) ς)⟩ @[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 (λs=>dw X[(J0 row)*n+s]!*Wd.get! ((J0 j)*n+s)) n 0 a0 0 lemma sTB_eq(X:Ἂ Ἃ)(d:ἀ)(n:Ἀ)(a j:Ἄ)(c:Ἅ):sTB X d n a j c=sT (λs=>dw X[(J0 a)*n+s]!*d.get! ((J0 j)*n+s)) n 0 c 0:=by unfold sTB;split · rename_i h;rw[sTb_eq _ _ _ _ _ _ _ _ 0 c 0 rfl,(sTB_h _ _ h.2.1).1,(sTB_h _ _ h.2.1).2,(sTB_h _ _ h.2.2.2).1,Ϧ] · rfl lemma kQb(c t n a:Ἀ)(h:t(J0 q)=i+8*(J0 t)-> sTq Y Q c n o e hQ t q a m=sT (λs=>Y.get! ((J0 c)+s)*Q.get! (i+8*s)) (J0 n) (J0 t) a m:=by intro k;induction k with |zero=>intro t q a m j hq;rw[sTq,dite_eq_right (λh=>(kS0 t n j).1 h.1),sT,AC (kS0 t n j).2] |succ k v=> intro t q a m j hq;obtain⟨d,u⟩:=kSt t n k j have l:qby rw[ug,gg,x] have p:∀g,Q.uget q g=Q.get! (i+8*(J0 t)):=λg=>by rw[ug,gg,hq] rw[sTq,AT ⟨d,l⟩,sT,AD (ε.mp d)];dsimp only;rw[y,p,v (t+1) (q+8) _ _ u (by rw[r,ac d,hq,Qm,pA]),ac d] @[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 (λs=>Y.get! (vo+s)*Q.get! (xb+8*s)) n 0 a0 0 lemma sTQ_eq(Y Q:ἀ)(n d a:Ἀ)(c:Ἅ):sTQ Y Q n d a c=sT (λs=>Y.get! (d+s)*Q.get! (a+8*s)) n 0 c 0:=by unfold sTQ;split · rename_i h;have e:=sTB_h _ _ h.2.1 rw[sTq_eq _ _ _ _ _ _ _ a (by rw[e.2,(sTB_h _ _ h.2.2.2.1).1];exact h.2.2.1) _ 0 _ c 0 rfl (by rw[Ϧ,X3 (AN (AN h.2.2.2.2 ж) ς)];rfl),e.1,e.2,Ϧ] · rfl noncomputable def bXfb(relu:Ἆ)(X W b E:Ἂ Ἃ)(Wd:ἀ)(ix ib L N:Ἀ):Ἄ->Ἄ->Ἅ->Ἃ:=λ(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 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a0,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a1,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a2,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a3,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a4,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a5,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a6,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).a7⟩:A8)=kX8 c d wo n y hX ⟨a.1,a.2.2⟩ t u o i w r g k s ∧ (⟨(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b0,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b1,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b2,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b3,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b4,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b5,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b6,(kX16 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).b7⟩:A8)=kX8 c d v n x hX ⟨a.2.1,a.2.2⟩ t c0 j l e p c5 q c7:=by intro m; induction m with | zero => intro t u o i w r g k s c0 j l e p c5 q c7 H have z:=W1 H rw[(kX16.eq_1 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).trans (dite_eq_right (by rw[ε];exact X2.2 z)), (kX8.eq_1 c d wo n y hX ⟨a.1,a.2.2⟩ t u o i w r g k s).trans (dite_eq_right (by rw[ε];exact X2.2 z)), (kX8.eq_1 c d v n x hX ⟨a.2.1,a.2.2⟩ t c0 j l e p c5 q c7).trans (dite_eq_right (by rw[ε];exact X2.2 z))] exact ⟨rfl,rfl⟩ | succ m A => intro t u o i w r g k s c0 j l e p c5 q c7 H have B:(J0 t) < (J0 n):=N1 H have h:t < n:=ε.mpr B rw[(kX16.eq_1 c d wo v n y x hX a t u o i w r g k s c0 j l e p c5 q c7).trans (AT h), (kX8.eq_1 c d wo n y hX ⟨a.1,a.2.2⟩ t u o i w r g k s).trans (AT h), (kX8.eq_1 c d v n x hX ⟨a.2.1,a.2.2⟩ t c0 j l e p c5 q c7).trans (AT h)] exact A (t+1) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by rw[ac h,Q3,H,BK]) @[inline] def dwA(w:ἇ):Ἅ:=(Core.mW w).toInt64.toFloat*P.uget (G4 ((w>>>23)&&&255)) (by rw[gL,aC,Ξ];exact AO ϝ ж) lemma k8i (k r:Ἄ)(n:ℕ)(d:(J0 k)<=n)(c:8*n+7<2^31)(e:(J0 r)<8):(J0 (8*k+r))=8*(J0 k)+(J0 r):=by have a:(J0 (8*k))=8*(J0 k):=by rw [kMm _ _ (by rw [kc8]; exact (U0 8 d).trans_lt (C0 (V1 _ _) c)),kc8] rw [kSm _ _ (by rw [a]; exact C0 (E0 (U0 8 d) (Z0 e)) c),a] 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 (P6 (ε.mp h)) · exact uZ _ _ _ _ | succ m ih => intro k Y a hY hm; have h1:(J0 k) < (J0 n):=N1 hm rw [dRw8,AT (ε.mpr h1)]; rw [ih (k+1) _ _ _ (by rw [ac (ε.mpr h1),Q3,hm,BK]),uZ] lemma kBRn (b r n:Ἄ)(l:ℕ)(c:(J0 r)intro r Y c d; rw [dX8,dite_eq_right (show ¬ r < a from λh=>P6 (ε.mp h) d)] | succ m i => intro r Y c d; have e:(J0 r) < (J0 a):=N1 d rw [dX8,AT (ε.mpr e)]; rw [i (r+1) _ _ (by rw [ac (ε.mpr e),Q3,d,BK]),dRw8_size X _ _ _ _ _ _ _ 0 Y 0 c rfl] lemma 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,λk a=>B.2.2 k (by simp[AR,kS]) a⟩ 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 (λ(m v:ἇ)=>if mif odkEq_ok a b) dkS 32 (W,b,ow,n) (λk=>k.1) (λv=>tchP v.Q) 3 def dkGs(W b:@& Ἂ ἇ)(ow n:Nat)(s:@& Ἂ (WcE dkF))(i:Nat):{v//v=dkF (W,b,ow,n)}:= if h:iwithPtrAddr W (λp2=> if p1=p2 then (if hk:dkEq s[i].k (W,b,ow,n)=true then ⟨s[i].v,by rw[s[i].h,dkEq_ok _ _ hk]⟩ else dkGo W b ow n) else dkGs W b ow n s (i+1)) (λ_ _=>wcSub _ _)) (λ_ _=>wcSub _ _) else dkGo W b ow n termination_by s.size-i decreasing_by exact Z3 h (M1 i) lemma 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 lemma kAbsDw (w:ἇ):dwA w=dw (w&&&0x7FFFFFFF):=by have a:Core.mW (w&&&0x7FFFFFFF)=Core.mW w:=by unfold Core.mW f5; rw [kSh,Ki,Ki,show (0x7FFFFFFF&&&8388607:ἇ)=8388607 by decide,show (255&&&255:ἇ)=255 by decide] unfold dwA dw; rw [a]; congr 2; rw [kSh] def dRw(X:Ἂ ἇ)(i n o k:Ἄ)(Y:ἀ)(a:Ἅ)(hX:(J0 i)+(J0 n)<=(O0 X))(hY:(J0 o)+(J0 n)<(kS Y))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):ἀ:= if h:k(kS (dRw X i n o k Y a hX hY hB))=(kS Y):=by intro m;induction m with | zero=>intro k Y a hY hm;rw[dRw,dite_eq_right (by rw[ε];(clear * - hm;omega))];exact uZ _ _ _ _ | succ m ih=>intro k Y a hY hm;have h1:(J0 k)<(J0 n):=by exact N1 hm rw[dRw,AT (ε.mpr h1)];dsimp only;rw[ih _ _ _ _ (by rw[ac (ε.mpr h1)];(clear * - hm h1;omega)),uZ] def dOw(X:Ἂ ἇ)(n m R r:Ἄ)(Y:ἀ)(hX:(J0 R)*(J0 n)<=(O0 X))(hY:(J0 R)*(J0 m)<=(kS Y))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):ἀ:= if h:rby simp only[ϑ]at h;simp only[nC,h,Yd] |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),Zs] @[noinline] def sQ2(relu:Ἆ)(n:Nat)(X W b E:Ἂ ἇ)(ix ib L:Nat)(Y Q:ἀ)(vo rn j:Nat)(hh:ἆ)(v:Ἅ):ἇ:= let tg:=λ(_:Unit)=>tG relu v E[j]! ix ib L (λ_=>tR relu L (sTQ Y Q n vo (j/8*n*8+j%8) (dw oneW*dw b[j]!)) λ_=>aD n relu X W b rn 1 j) (λ_=>aD n relu X W b rn 1 j) if (E[j]!).toUInt64<(255:ἆ)&&hh<=(372:ἆ) then tf relu v hh tg else tg () lemma dOw_size(X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):∀ k (r:Ἄ)(Y:ἀ)(hY:(J0 R)*(J0 m)<=(kS Y)),(J0 R)-(J0 r)=k->(kS (dOw X n m R r Y hX hY hm hB))=(kS Y):=by intro k;induction k with | zero=>intro r Y hY hk;rw[dOw,dite_eq_right (by rw[ε];(clear * - hk;omega))] | succ k ih=>intro r Y hY hk;have h1:(J0 r)<(J0 R):=by exact N1 hk rw[dOw,AT (ε.mpr h1)];dsimp only;rw[ih _ _ _ (by rw[ac (ε.mpr h1)];(clear * - hk h1;omega)),dRw_size _ _ _ _ _ _ _ 0 _ _ _ rfl] lemma s5tPt8_inv_h1 (n g t:Ἄ)(ow:Nat)(d:(ow+16)*n.toNat<2^(31:Ἀ))(e:g.toNat+8≤ow+16)(h:t.toNat intro t A g x hA; have z:=M0.1 g; rw [tPt,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only have:t.toNat=n.toNat:=le_antisymm x z exact ⟨by rw [hA,this],λi _=>rfl,λs l e J _=>absurd (e.trans_lt J) (not_lt.2 z)⟩ | succ m K => intro t A g x hA have e:t.toNat < n.toNat:=N1 g have h:(t+1).toNat=t.toNat+1:=ac (ε.mpr e) have c:B+t.toNat*8-a.toNat+a.toNat=B+t.toNat*8:=J2 (U6 (r.resolve_right (E4 e).ne')) have e8:B+(t+1).toNat*8=B+t.toNat*8+8:=by rw [h,Ϡ,n4,pA] rw [tPt,AT (by rw [ε]; exact e)] obtain ⟨y,b2,F⟩:=s5tBi_inv W n ow (a+8) t (B+t.toNat*8-a.toNat) v (d.trans_le q) I j e _ a (a*n+t) A rfl ((V1 _ 8).trans_eq d.symm) (s5tPt8_inv_h1 n a t _ v q e) (hA.trans c.symm) obtain ⟨C,w,H⟩:=K (t+1) _ (by rw[h,←X5,g,BK]) (by rw [h]; exact e) (by rw [y,d,e8, ← pA,c]) refine ⟨C,λi hi=>(w i (e8 ▸ U1 hi (V1 _ _))).trans (b2 i (c.symm ▸ hi)),λs l k o u => ?_⟩ rcases M6 t.toNat s with p | p · exact H s l (by rw [h]; exact p) o u · have D:s=t.toNat:=le_antisymm p k subst D have:=F (a.toNat+l) (V1 _ _) (by rw[d]; exact O1 u _) rw [← pA,c] at this exact (w _ (by rw [e8]; exact O1 u _)).trans this lemma s5tPg8_inv (W:Ἂ ἇ)(n ow G:Ἄ) (y:(ow.toNat+16)*n.toNat<2^(31:Ἀ))(hO:ow.toNat+16<2^(31:Ἀ))(D:ow.toNat*n.toNat≤W.size)(k: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 j d hA; have z:=M0.1 j; rw [tPg8,dite_eq_right (by rw [ε]; exact not_lt.2 z)]; dsimp only have:gi.toNat=G.toNat:=le_antisymm d z exact ⟨by rw [hA,this],λi _=>rfl,λg s l c F _ _=>absurd (c.trans_lt F) (not_lt.2 z)⟩ | succ m H => intro gi A j d hA have c:gi.toNat < G.toNat:=N1 j have a:(gi+1).toNat=gi.toNat+1:=ac (ε.mpr c) have eg:(8*gi).toNat=8*gi.toNat:=by rw [kMm _ _ (by rw[kc8]; (clear * - hO hG c a;omega)),kc8] have B:(8*gi+8)=(8*gi)+8:=rfl rw [tPg8,AT (by rw [ε]; exact c)] obtain ⟨u,b2,v⟩:=s5tPt8_inv W n ow (8*gi) (8*gi.toNat*n.toNat) y hO (by rw[eg]; (clear * - hG c a;omega)) D k (by rcases Jk n.toNat with h|h · exact BA h · exact pZ (by rw[eg]; exact H1 _ h)) _ 0 A rfl (by simp only [Ϧ,zero_le]) (by simp only [Ϧ,zero_mul,Av]; exact hA) simp only [Ϧ,ϳ,ϑ] at u b2 v have r:8*gi.toNat*n.toNat+n.toNat*8=8*(gi.toNat+1)*n.toNat:=by ring obtain ⟨x,w,C⟩:=H (gi+1) _ (by rw[a,←X5,j,BK]) (by rw [a]; exact c) (by rw [u,a,r]) refine ⟨x,λi hi=>by rw [w i (by rw [a, ← r]; exact Hx (nб*8) hi),b2 i hi],λg s l o t e q => ?_⟩ rcases M6 gi.toNat g with p | p · exact C g s l (by rw [a]; exact p) t e q · have ge:g=gi.toNat:=le_antisymm p o subst ge rw [w _ (by rw [a, ← r]; have:=ι 8 (show s+1≤n.toNat by exact Order.add_one_le_iff.mpr e); rw[Ϡ,n4] at this; (clear * - e q;omega)),v s l (ϟ _) e q,eg] lemma tPg8_n0 (W:Ἂ ἇ)(n ow G:Ἄ)(e: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 a; rw [tPg8,dite_eq_right (by rw [ε]; (clear * - a;omega))] | succ m d => intro gi A a; have c:gi.toNat < G.toNat:=by exact N1 a rw [tPg8,AT (by rw [ε]; exact c),d (gi+1) _ (by rw[ac (ε.mpr c)]; (clear * - a c;omega)),tPt,dite_eq_right (by rw [ε]; exact Std.Rxo.size_eq_zero_iff_not_le.mp e)] lemma wcT8F_panel (W:Ἂ ἇ)(ow n:Nat)(c:(ow+16)*n<2^(31:Ἀ))(q:ow*n≤W.size)(e:W.size<2^(32:Ἀ)) : let m:=(wcT8F (W,ow,n)).1 m.size=n*(8*((ow+7)/8)) ∧ ∀ t < n, ∀ g l,l < 8 → 8*g+l < 8*((ow+7)/8) → m.data[(g*n+t)*8+l]! = if 8*g+l < ow then dw W[(8*g+l)*n+t]! else 0:=by rcases Jk n with hO|hO · subst hO; refine ⟨?_,λt j=>by (clear * - j;omega)⟩; simp only [wcT8F]; rw [tPg8_n0 _ _ _ _ (by simp only [lX,J7,Xs]) _ _ _ rfl]; simp only [ϳ]; rfl · have d:=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 p g t l (ϟ _) (by (clear * - o i;omega)) j o lemma wcT8F_exp (W:Ἂ ἇ)(ow n:Nat)(r:(ow+16)*n<2^(31:Ἀ))(g:ow*n≤W.size)(a: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 ц (λi h=>by simp at h) simp only [wcT8F] refine ⟨l,λo ho s m => ?_,λo ho => ?_⟩ · rw [p o ho] have j:(o+1)*n ≤ ow*n:=ι _ ho have d:=nO o n have q:=s5tu (o*n) (by (clear * - g a m j d;omega)); have k:=s5tu (o*n+n) (by (clear * - g a j d;omega)) exact (s5rMu_spec W a _ (o*n).toUSize (o*n+n).toUSize 0 rfl (by rw [k]; (clear * - g j d k;omega))).2 (o*n+s) (by rw [q]; exact V1 (o*n) s) (by rw [k]; exact O1 m (o*n)) · have e:(da (λo=>rMu W (o*n).toUSize (o*n+n).toUSize 0) ow (lQ ow))[o]! ∈ (da (λo=>rMu W (o*n).toUSize (o*n+n).toUSize 0) ow (lQ ow)).toList:=by rw [AB _ o (by exact N4 ho (id (Eq.symm l)))]; exact Array.getElem_mem_toList _ rw [← Array.foldl_toList]; exact (s5fmax _ 0).2 _ e lemma kRR_h1 (n:ℤ):(0:ℝ) < (2:ℝ)^n:=zpow_pos two_pos n lemma 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 a:0 < |z| := AN (kRR_h1 _) hs have d : |z| < (2:ℝ)^(ph 2 |z| + 1):=by have:=Xg (R:=ℝ) (b:=2) ш |z|; simpa using this have e:(2:ℝ)^(ph 2 |z|) ≤ |z| := by have:=Ga (R:=ℝ) (b:=2) ш a; simpa using this have c:(-1021:ℤ) ≤ ph 2 |z| := by have:=(Int.zpow_le_iff_le_log (R:=ℝ) (b:=2) (x:=-1021) ш a).1 (by exact_mod_cast hs); exact this have h:=re z (ph 2 |z| + 1) (by exact Int.le_add_one c) d 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 e (kRR_h1 _).le).trans ((mul_comm _ _).trans_le (le_add_of_nonneg_right (kRR_h1 _).le))) lemma kRA (x y:Ἅ)(c:fv x)(a: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 c a (h.le.trans (pm 971 ш)) exact ⟨g,by rw [e]; exact kRR _⟩ lemma kRM (x y:Ἅ)(c:fv x)(a: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 c a h exact ⟨g,by rw [e]; exact kRR _⟩ lemma kSR_h (A t c d e:ℝ) (hA:0 ≤ A) (h:0 ≤ t) (a:t ≤ 134217728) (g: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 a (g▸by positivity) linear_combination P+E+1/9007199254740992*k+66060287/633825300114114700748351602688*hA+(1/67108864-1)*g lemma kSR (p:ℕ→Ἅ)(z:ℕ→ℝ)(c0 A:ℝ)(n:ℕ)(M:n≤134217728) (K:∀ tAa _)) hA generalize hc':(1/9007199254740992+1/9444732965739290427392)*A+1/9007199254740992=c have r:=hc'.symm have v:0≤c:=by rw[r];exact add_nonneg (Af ш g) ш intro m;induction m with |zero=>intro t a D Q e o;obtain rfl:t=n:=N2 Q (M0.1 D);rw[ao,AC (AX _)];exact ⟨e,o⟩ |succ m G=> intro t a D Q e o have k:tϥ.2 (AN (ϥ.1 N) k)) λ_ _ _=>Aa _)))) hA have d:c0+∑ s∈kP (t+1),z s=(c0+∑ s∈kP t,z s)+z t:=by rw[Ν,add_assoc] have h:(t:ℝ)≤134217728:=by exact_mod_cast (U2 k).trans M rw[d] at B have y:|rv a+rv (p t)| ≤ A+t*c:=by rw[C,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 B) have i:A+t*c<(2:ℝ)^(971:ℤ):=by have O:(2:ℝ)^(971:ℤ)=2^(960:ℤ)*2^(11:ℤ):=AK AL 960 11 have F:(1:ℝ)≤2^(960:ℤ):=one_le_zpow₀ one_le_two ж rw[O,show (2:ℝ)^(11:ℤ)=2048 by norm_num];generalize (2:ℝ)^(960:ℤ)=X at j F ⊢;linarith only [AE h v,r,j,F,g] obtain ⟨I,H⟩:=kRA a (p t) e L (AO y i) refine G (t+1) _ (by rw[Q3,D,BK]) k I ?_ have w:(2:ℝ)^(-1075:ℤ)≤1/1208925819614629174706176:=(AG one_le_two (by norm_num:(-1075:ℤ) ≤ -80)).trans_eq (by norm_num[zpow_neg]) rw[show (2:ℝ)^(-53:ℤ)=1/9007199254740992 by norm_num[zpow_neg]] at H have:=(add_comm _ _).trans_le (kSR_h A t c _ _ g (I3 _) h r (H.trans (add_le_add (mul_le_mul_of_nonneg_left y (one_div_nonneg.2 ш)) w)) o) rw[X6,d,← C] refine (abs_sub_le _ (rv a+rv (p t)) _).trans ?_ rw[add_sub_add_right_eq_sub];exact this lemma kMsk (w:ἇ):kB (w&&&0x7FFFFFFF)=kB w∧kG (w&&&0x7FFFFFFF)=kG w∧sv (w&&&0x7FFFFFFF) = |sv w| := by have e:k9 (w&&&0x7FFFFFFF)=false:=by unfold k9; rw [Ki,show (0x7FFFFFFF&&&0x80000000:ἇ)=0 by decide,UInt32.and_zero]; decide have a: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 d:lK (w&&&0x7FFFFFFF)=lK w:=by unfold lK; rw [Ki,show (0x7FFFFFFF&&&0x7FFFFF:ἇ)=0x7FFFFF by decide] have c:kM (w&&&0x7FFFFFFF)=kM w:=by unfold kM; rw [a,d] refine ⟨a,by unfold kG; rw [a],?_⟩ unfold sv; rw [e,c]; simp only [υ,ἂ]; by_cases h:k9 w=true <;> simp [h] lemma mV53(u:ἆ)(n:Ἀ)(d:(lq u)=n)(e:n<2^(53:Ἀ)): fv u.toInt64.toFloat/\rv u.toInt64.toFloat=(n:Ἁ):=by have:(O5 u.toInt64)=n:=by rw[show (O5 u.toInt64)=ae u from ἅ,ay,d];split<;>omega rw[<-this];exact dB _ (by rw[this];simp only [F8,nr];exact Qc e) lemma kCE (F a:Ἅ)(i:fv (F*a)) : |rv (F*a)| < (2:ℝ)^(((cEq F a).toNat:ℤ)+56)∧(cEq F a).toNat ≤ 969:=by have h:=fK (F*a) i have g:(eF (F*a).toBits).toNat < 2048:=by unfold eF; rw [Ε]; exact AO ϝ ж unfold cEq; dsimp only split · rename_i c have d:1078 < (eF (F*a).toBits).toNat:=by rw [μ] at c; simpa using c have e:(eF (F*a).toBits-1078).toNat=(eF (F*a).toBits).toNat-1078:=by rw [χ _ _ (Zh c)]; rfl rw [e] refine ⟨?_,by (clear * - g d;omega)⟩ have:((((eF (F*a).toBits).toNat-1078:ℕ)):ℤ)+56=(((eF (F*a).toBits).toNat:ℕ):ℤ)-1022:=by (clear * - g d;omega) rw [this]; exact h · rename_i c have d:(eF (F*a).toBits).toNat ≤ 1078:=by rw [μ] at c; simp at c; (clear * - c;omega) refine ⟨AN h (AG ш (by simp; exact V3 c)),by simp⟩ lemma kWinR (a T Λ lf q B S M X P y H x R v:ℝ) (m:1 ≤ a) (z:a+2 ≤ T) (hT:T ≤ 134217728) (l:4 ≤ T) (o:0 ≤ Λ) (D : |lf-Λ| ≤ a*((1/9007199254740992+1/9444732965739290427392)*Λ+1/9007199254740992)) (V:0 ≤ v) (U:v ≤ 1/1208925819614629174706176) (O : |q-(9*(a+1))*lf| ≤ 1/9007199254740992*|(9*(a+1))*lf| + v) (u : |q| < X) (hX:72057594037927936 ≤ X) (F:0 ≤ B) (J:B*2 ≤ x) (p:0 ≤ S) (N:S ≤ M*Λ) (Y:0 ≤ M) (s:M*X=P*72057594037927936) (C:T*x=y*1125899906842624) (n:P ≤ H) (g:y ≤ H) (e:21267647932558653966460912964485513216*T ≤ y) (r:P*9007199254740992 ≤ R) (t:x*4 ≤ R) : a*((1/9007199254740992+1/9444732965739290427392)*(B+S)+1/9007199254740992) ≤ H ∧ B+S+H ≤ H*4503599627370496∧B+S ≤ R:=by have d:=zero_le_one.trans m have c:a≤T:=by linear_combination z have h:=c.trans hT have k:=d.trans c have i:(0:ℝ)≤9*(a+1):=Af (P5 _) (add_nonneg d zero_le_one) have G:=(le_abs_self _).trans ((Aw Λ lf).trans_le (D.trans (AE h (add_nonneg (Af ш o) ш)))) have A:=(sub_le_iff_le_add'.1 (AY _ q)).trans (add_le_add u.le (((Aw _ q).trans_le O).trans (add_le_add_right U _))) have F1:9*(a+1)*Λ≤X*(1+1/8388608):=by have w:=mul_le_mul_of_nonneg_left (add_le_add_left h 1) (P5 9) generalize 9*(a+1)=W at i w A ⊢ linear_combination (70368744177664/70368743129087:ℝ)*(mul_le_mul_of_nonneg_left G i+le_abs_self (W*lf))+(633825300114114700748351602688/633825290669372657441063305217:ℝ)*A+(1048576/70368743129087:ℝ)*w+(554597052006948792370591694849/5316911903911424829191363170649767936:ℝ)*hX have I:9*(a+1)*S≤P*72057594037927936*(1+1/8388608):=(mul_le_mul_of_nonneg_left N i).trans ((mul_left_comm _ _ _).trans_le ((mul_le_mul_of_nonneg_left F1 Y).trans_eq (by rw[← Ap,s]))) have K:=(mul_le_mul_of_nonneg_left J k).trans C.le have b2:=Af F zero_le_two have j:=(Hy.trans l).trans ((le_mul_of_one_le_left k Hy).trans (e.trans g)) have Q:=(AE (mul_le_mul_of_nonneg_left (add_le_add_left m 1) (P5 9)) p).trans I have L:=(AE J zero_le_four).trans t refine ⟨?_,?_,?_⟩ · linear_combination (1048577/18889465931478580854784:ℝ)*((AE c b2).trans K)+(1048577/85002596691653613846528:ℝ)*I+(1048577/9444732965739290427392:ℝ)*p+(1/9007199254740992:ℝ)*h+(2932034153131/3298534883328:ℝ)*n+(1048577/16777216:ℝ)*g+(160342103381/3298534883328:ℝ)*j · linear_combination (1/8:ℝ)*((AE l b2).trans K)+(1/18:ℝ)*Q+(12009600437977088/3:ℝ)*n+(140737488355328:ℝ)*g+(1078985979068413/3:ℝ)*j · linear_combination (1/8:ℝ)*L+(1/18:ℝ)*Q+(2796203/6291456:ℝ)*r+(2708821/6291456:ℝ)*((Af b2 zero_le_four).trans L) lemma 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?] lemma kTB2 (w:Ἃ) (F E:ℕ) (K:idxOf w ≤ F) (a:174+F ≤ E) : |(tm ld w:ℝ)| * 2 ≤ 2^E:=by have h:(tm ld w).natAbs*2 ≤ 2^E:=by rw [tm,Ϩ,Ϩ,Yb,(by decide:(sv ld).natAbs=2^23),(by decide:idxOf ld=126)] refine N0 (ι 2 (ϧ (U0 _ (bg w).le) (Θ (n:=2) ж (J1 K 126)))) ?_ rw [← m7, ← m7, ← Gr] exact Θ ж (by (clear * - a;omega)) rw [← mI,Ϲ,X4] exact_mod_cast h lemma 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 ?_ ф 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 ш b lemma 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 hS:∑ s∈kP n,(sv (l s)).natAbs*2^(kG (l s))≤2^(304:Ἀ):=(Xt _ _ (2^(277:Ἀ)) λs hs=>(ϧ (bg (l s)).le (Θ Vf ((aT (l s)).trans_le (Y9 (Z0 (U4 (Z0 (bm (l s))) λh=>A s (ϥ.1 hs) (Β.1 (by rw[h];rfl)))))))).trans_eq (m7 2 24 253).symm).trans (by rw[Xa,smul_eq_mul];exact (ι _ hn27).trans_eq (m7 2 27 277).symm) have hnR:(n:ℝ)≤134217728:=F4.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 λs _=>by rw[← mI,Ϲ,X4,U3,W4,nZ] generalize hΛ:∑ s∈kP n,|(sv (l s):ℝ)| *2^(kG (l s))=Λ at hΛS ⊢ have hΛ0:0≤Λ:=hΛS ▸ I3 _ have hΛb:Λ≤2^(304:Ἀ):=hΛS ▸ (F4.2 hS).trans_eq (by rw[W4,nZ]) have RL:=kSR (fun k=>dw (l k&&&0x7FFFFFFF)) (fun s=>|(sv (l s):ℝ)| *2^(kG (l s))) 0 Λ n hn27 (fun s hs=>by 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]⟩) (by rw[A5,Ai,← hΛ];exact (ϔ rfl λs _=>Ad ф).le) (hΛb.trans (by rw[← AA];exact AG one_le_two ж)) n 0 0 (pQ n) (ϟ _) kZ0.1 (by rw[kZ0.2,Qj,J9,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 ф hΛ0) ф)))+(70368745226241/70368744177664:ℝ)*hΛb+(211106231484415/70368744177664:ℝ)*X1 lemma kZq (n:ℕ)(c:Ἅ)(g:n ≤ 134217728)(k:fv c)(j:|rv c| ≤ 2^(306:Ἀ)) : fv ((I0 (9*(n+1))).toInt64.toFloat*c) ∧ |rv ((I0 (9*(n+1))).toInt64.toFloat*c)-(9*((n:ℝ)+1))*rv c| ≤ 1/9007199254740992*|(9*((n:ℝ)+1))*rv c| + (2:ℝ)^(-1075:ℤ) ∧ |rv ((I0 (9*(n+1))).toInt64.toFloat*c)| < (2:ℝ)^((cEq (I0 (9*(n+1))).toInt64.toFloat c).toNat+56) ∧ (cEq (I0 (9*(n+1))).toInt64.toFloat c).toNat ≤ 969 := have a:=U0 9 (V7 g) have i:=mV53 (I0 (9*(n+1))) (9*(n+1)) (kOfS _ (a.trans_lt ж)) (a.trans_lt ж) have e:((9*(n+1):ℕ):ℝ)=9*((n:ℝ)+1):=(U3 _ _).trans (congrArg₂ (·*·) nZ (X6 n)) have d:=i.2.trans ((X4 _).trans e) have Zr:=kRM _ c i.1 k (((Ae _ _).trans (congrArg (·*|rv c|) ((congrArg abs d).trans (Ad ((I3 _).trans_eq e))))).trans_le ((mul_le_mul (e.symm.trans_le (((F4 (α:=ℝ)).mpr (a.trans ж)).trans_eq ((W4 2 31).trans (congrArg (·^31) nZ)))) j (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 ж))))) have h:=kCE _ c Zr.1 ⟨Zr.1,d▸(by norm_num [zpow_neg]:(2:ℝ)^(-53:ℤ)=1/9007199254740992)▸Zr.2,h.1.trans_eq ((congrArg (HPow.hPow (2:ℝ)) (Y4 _ 56).symm).trans (AA _ _)),h.2⟩ lemma kWinS (n L a e c:ℕ) (Λ lf o B d:ℝ) (z:0dw (l k&&&0x7FFFFFFF)) n 0 0) (O: max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat g).toNat ≤ 372) : aG (n+1) (λs=>if s < n then l s else ld) (λ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) (λs=>if s < n then l s else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((max (i+L-50) (max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat g).toNat)):ℕ):ℤ) ∧ |(af (n+1) (λs=>if s < n then l s else ld) (λ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 (i+L-50) (max e 56+23+(cEq (I0 (9*(n+1))).toInt64.toFloat g).toNat))+52:ℕ):ℤ):=by have w:2≤L:=V3 λV=>absurd (Wq (y.trans (Θ Vf (Z0 V)):n+2≤0+2)) (N8 G) have c:n≤134217728:=(V1 n 2).trans (y.trans (Θ Vf r)) obtain ⟨I,h,t,a⟩:=kL1 n l g A c Y obtain ⟨u,T,J,-⟩:=kZq n g c I a have B:=G9 (λs=>(tm (l s) W[j*n+s]!:ℝ)) (kP n) generalize hSm : ∑ s∈kP n,|(tm (l s) W[j*n+s]!:ℝ)| = Sm at B have v:0≤Sm:=(Aa _).trans B have q:Sm≤2^(max e 56+23) * ∑ s∈kP n,|(sv (l s):ℝ)| * 2^(kG (l s)):=by rw[← hSm,Yg];exact Hk (λs m=>(kTW _ _ e (C s (ϥ.1 m))).trans_eq (mul_comm _ _)) have o:=kWinS n L i e _ _ _ _ _ Sm G y r S (Nat.le_of_add_right_le D) w O (nonneg_of_mul_nonneg_right (v.trans q) (pow_pos ш _)) h T J (Aa _) (kTB2 _ H i K.2 D) v q have F:=dJ ld b[j]! ж K.1 have z:=kSR p (fun s=>(tm (l s) W[j*n+s]!:ℝ)) (tm ld b[j]!:ℝ) (|(tm ld b[j]!:ℝ)|+Sm) n c U (by rw[hSm]) (o.2.2.trans ((AU (by norm_num) (G1 rfl:425≤960)).trans_eq (AA (2:ℝ) 960).symm)) n 0 _ (pQ n) (ϟ _) F.1 (by rw[F.2,Qj,Av,sub_self,A5,J9,zero_mul]) have d:=(Ag (tm ld b[j]!:ℝ) _).trans (add_le_add AP B) rw[dZ3,K8,R9] refine ⟨dZ4 n (λs m=>⟨A s m,λM=>absurd (C s m) (M ▸ N8 N)⟩) K.1,z.1,(z.2.trans o.1).trans_eq (AA _ _).symm,(d.trans o.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 d (z.2.trans o.1))).trans o.2.1 lemma kAD2 (n:ℕ) (a:Ἆ) (X W b:Ἂ Ἃ) (c o:ℕ) : aD n a X W b c 1 o=act a (dotOf (n+1) (λt=>if t < n then X[c+t]! else oneW) (λt=>if t < n then W[o*n+t]! else b[o]!)):=by unfold aD; rw [bO]; simp only [ϻ,ϻ] lemma kZQ2 (v:Ἅ)(e cq c:ἆ)(a:Ἆ)(n:ℕ)(D d:ℕ→Ἃ)(l:Ἃ)(h:l=p8 a (ms (n+1) D d)) (m:∀ p:ἆ,p=(if e<(56:ἆ) then (56:ἆ) else e)+cq → e<(255:ἆ) → p ≤ (372:ἆ) → aG (n+1) D d∧fv v ∧ |rv v-(af (n+1) D d:ℝ)| ≤ (2:ℝ)^(((if c>p then c else p).toNat:ℕ):ℤ) ∧ |(af (n+1) D d:ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if c>p then c else p).toNat)+52:ℕ):ℤ)∧(if c>p then c else p).toNat ≤ 600) : (if zq2 v e a cq c==(0xFFFFFFFF:Ἃ) then l else zq2 v e a cq c)=p8 a (ms (n+1) D d):=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,i,j,b2,_,k⟩:=m p hp.symm W.1 W.2 have o:(decide (e < 255)&&decide (p ≤ 372))=true:=by simp [W.1,W.2] simp only [o,ἁ] generalize hP:(if c>p then c else p)=P at j k ⊢ by_cases hc:ak v P < (4294967296:ἆ) · have R:=cw (n+1) D d g v i P (by (clear * - k;omega)) j b2 hc rw [AD hc,kReluW a _ (kAkF v P hc),R] by_cases hf:p8 a (ms (n+1) D d)=0xFFFFFFFF · rw [hf]; simp only [Az,ἁ]; rw [h,hf] · have q:(p8 a (ms (n+1) D d)==0xFFFFFFFF)=false:=by simpa using hf simp only [q,υ,ἂ] · simp only [AC hc,Az,ἁ]; exact h · have cF:(decide (e < 255)&&decide (p ≤ 372))=false:=Yj.2 ((not_and_or.1 W).imp decide_eq_false decide_eq_false) simp only [cF,υ,ἂ,Az,ἁ]; exact h lemma kSQ2 (a:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix r L H:ℕ)(Y Q:ἀ)(e c j:ℕ)(i:ἆ)(v:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(t:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ r)(B:n+2 ≤ 2^L)(x:L≤27)(z:r+L≤425) (u:∀ sY.data[e+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (A:(E[j]!).toUInt64 < 255 → i ≤ 372 → aG (n+1) (λs=>if s < n then X[c+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (λs=>if s < n then X[c+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^((i.toNat:ℕ):ℤ) ∧ |(af (n+1) (λs=>if s < n then X[c+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ)) : sQ2 a n X W b E ix r L Y Q e c j i v=p8 a (ms (n+1) (λs=>if s < n then X[c+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)):=by have G:=kGB1T a n n j (λs=>X[c+s]!) W b (λk=>k) (λs=>Y.data[e+s]!*Q.data[j/8*n*8+j%8+8*s]!) (λs=>Y.get! (e+s)*Q.get! (j/8*n*8+j%8+8*s)) E[j]! ix r L H (λ_=>aD n a X W b c 1 j) (λs _=>F _) u (t j) M B x z AP (λk d=>d) (λ_ _ J _=>J) (λs C h=>absurd rfl (h s C)) (λk d h=>by rw[p k d,o k d];exact dJ _ _ (F _).1 h) (λk d h=>by simp only[gg];rw[p k d,o k d];exact dJ _ _ (F _).1 h) (kAD2 _ _ _ _ _ _ _) rw[← D] at G unfold sQ2;dsimp only simp only[sTQ_eq] split;swap;exact G rename_i l simp only[Η,AJ] at l obtain ⟨g,m,y,b2⟩:=A l.1 l.2 have q:=θ.1 l.2 simp at q unfold tf by_cases RZ:(a&&(v.toBits>>>63!=0)&&i+1024<=eF v.toBits)=true · rw[AD RZ];exact kTF0 a (n+1) _ _ g v m i (by (clear * - q;omega)) y RZ rw[AC RZ];dsimp only;split;swap;exact G rw[cw (n+1) _ _ g v m i (by (clear * - q;omega)) y b2 ‹_›] lemma kCEb (F a:Ἅ):(cEq F a).toNat ≤ 969:=by have c:(eF (F*a).toBits).toNat < 2048:=by unfold eF; rw [Ε]; exact AO ϝ ж unfold cEq; dsimp only; split · rename_i d rw [χ _ _ (Zh d)]; simp only [kA,tsub_le_iff_right,Kd,ge_iff_le]; exact Z0 c · simp only [ϋ,zero_le] lemma kOutW_h1 (e c:ἆ) (h:e.toNat < 255) (a: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 a 23) ж) have m:(if e < (56:ἆ) then (56:ἆ) else e).toNat=max e.toNat 56:=by by_cases g:e < (56:ἆ) · rw [AD g]; exact (D8 (U2 (show e.toNat < 56 from g))).symm · rw [AC g]; exact (Z8 (V3 (show ¬ e.toNat < 56 from g))).symm rw [η,m,q, ← pA] exact γ (C0 (E0 (L1 (Xh.2 ⟨U2 h,by decide⟩) 23) a) ж) lemma kOutW_h2 (a b:ἆ):(if a > b then a else b).toNat=max a.toNat b.toNat:=by by_cases g:a > b · rw [AD g]; exact (Z8 (U2 (show b.toNat < a.toNat from g))).symm · rw [AC g]; exact (D8 (V3 (show ¬ b.toNat < a.toNat from g))).symm lemma kOutW (n:ℕ)(X W b E:Ἂ Ἃ)(ix o L H:ℕ)(Y Q:ἀ)(u h j:ℕ)(cq d p:ἆ)(v i:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(t:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ o)(G:n+2 ≤ 2^L)(x:L≤27)(z:o+L≤425)(O:0Y.data[u+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (w:i=ao (λk=>dw (X[h+k]! &&& 0x7FFFFFFF)) n 0 0) (m:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat i) (y:d=(o+L-50).toUInt64) (N:p=(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) (J:(E[j]!).toUInt64 < 255) (a:p ≤ 372) : aG (n+1) (λs=>if s < n then X[h+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (λs=>if s < n then X[h+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((if d>p then d else p).toNat:ℕ):ℤ) ∧ |(af (n+1) (λs=>if s < n then X[h+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if d>p then d else p).toNat)+52:ℕ):ℤ)∧(if d>p then d else p).toNat ≤ 600:=by have eN:=kE64 E[j]! have c:=kCEb (I0 (9*(n+1))).toInt64.toFloat i generalize hcc:(cEq (I0 (9*(n+1))).toInt64.toFloat i)=cc at m c have e:(E[j]!).toNat < 255:=J have C:p.toNat=max (E[j]!).toNat 56+23+cc.toNat:=by rw [N,m]; exact kOutW_h1 _ _ e c have D:max (E[j]!).toNat 56+23+cc.toNat ≤ 372:=C ▸ a have g:=kWin n (λs=>X[h+s]!) W b j (E[j]!).toNat o L H (λs=>Y.data[u+s]! * Q.data[j/8*n*8+j%8+8*s]!) i (λs _=>(F _).1) l e (t j) M G x z O (λs r=>by rw [B s r,A s r]; exact dJ _ _ (F _).1 (λI=>absurd (l s r) (I ▸ N8 e))) w (hcc ▸ D) rw [hcc] at g rw [kOutW_h2,y,kOfS _ (C0 (N0 (I2 _ _) z) ж),C,K] exact ⟨g.1,g.2.1,g.2.2.1,g.2.2.2.1,g.2.2.2.2,Xh.2 ⟨N0 (I2 _ _) (N0 z ж),N0 D ж⟩⟩ lemma kOut (c:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix i L H:ℕ)(Y Q:ἀ)(r o j:ℕ)(cq d:ἆ)(v y:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(g:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ i)(A:n+2 ≤ 2^L)(x:L≤27)(z:i+L≤425)(G:0Y.data[r+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (u:y=ao (λk=>dw (X[o+k]! &&& 0x7FFFFFFF)) n 0 0) (t:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat y) (w:d=(i+L-50).toUInt64) : (if zq2 v (E[j]!).toUInt64 c cq d==(0xFFFFFFFF:Ἃ) then sQ2 c n X W b E ix i L Y Q r o j (if d > (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq then d else (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) v else zq2 v (E[j]!).toUInt64 c cq d) = p8 c (ms (n+1) (λs=>if s < n then X[o+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)):=by refine kZQ2 v _ cq d c n _ _ _ ?_ (λp I B e=>kOutW n X W b E ix i L H Y Q r o j cq d p v y F g M A x z G h m l C u t w I B e) refine kSQ2 c n X W b E ix i L H Y Q r o j _ v F g M A x z h m l C (λB J => ?_) have D:(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq ≤ 372:=by refine ϗ ?_ J generalize (if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq=a split · exact Zh (by assumption) · exact UInt64.le_refl _ have:=kOutW n X W b E ix i L H Y Q r o j cq d _ v y F g M A x z G h m l C u t w rfl B D exact ⟨this.1,this.2.1,this.2.2.1,this.2.2.2.1⟩ lemma kFS (Y:ἀ)(i:Ἄ)(v:Ἅ)(h:(J0 i)<(kS Y))(q:ℕ):(Y.uset i v h).data[q]! = if (J0 i)=q then v else Y.data[q]! := by by_cases hq:q < (kS Y) · exact fuS Y i v h q hq · have:(J0 i)≠q:=by omega rw [AC this]; cases Y; simp only [FloatArray.uset,kS] at hq h ⊢ rw [An _ _ (by simp only [pP,Ql,not_lt]; exact V3 hq),An _ _ (by exact Not.imp hq λa=>a)] lemma dRw_spec (X:Ἂ ἇ)(i n o:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(d:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)) : ∀ m (k:Ἄ)(Y:ἀ)(a:Ἅ)(l:(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 l d).data[q]! = if q=(J0 o)+(J0 n) then ao (λ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 l h p q have e:=W1 h rw[dRw,dite_eq_right (mt ε.mp (X2.mpr e)),kFS,kSm o n d.2,ao,AC (X2.mpr e),AC (fun(g:_∧_)=>X2.mpr (N0 (J1 e _) g.1) g.2)] exact ite_cond_congr (propext eq_comm) | succ m r => intro k Y a l h p q have c:=N1 h have j:=ac (ε.mpr c) rw[ao,AD c,dRw,AT (ε.mpr c)]; dsimp only rw[r (k+1) _ _ _ (by rw[j,← X5,h,BK]) (by rw[j]; exact c) q,j,kFS,kSm o k (N3 (O1 c _) d.2),kXU _ _ _ _ (kSm i k (N3 (O1 c _) d.1)),kAbsDw] refine congrArg (ite _ _) ?_ by_cases g2:oб+(kб+1)≤q∧qg2 ⟨U4 g.1 g3,g.2⟩)] lemma dRw8_spec (X:Ἂ ἇ)(i n r:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(j:(J0 i)+(J0 n)<2^31/\8*(J0 n)+7<2^31)(g:(J0 r)<8) : ∀ m (k:Ἄ)(Y:ἀ)(a:Ἅ)(p: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 p j g).data[q]! = if q=8*(J0 n)+(J0 r) then ao (λ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 p l v q have e:(J0 k)=(J0 n):=N2 v (W1 l) have o:¬ (J0 k) < (J0 n):=λh=>K4 _ (h.trans_le e.ge) rw [dRw8,dite_eq_right (show ¬ k < n from λh=>o (ε.mp h)),kFS,k8i n r (J0 n) (le_refl _) j.2 g,aoe _ _ _ a e.ge, AC (show ¬(q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n)) from λh=>o (h.2.1.trans_lt h.2.2))] exact ite_cond_congr (propext eq_comm) | succ m w => intro k Y a p l v q have d:(J0 k) < (J0 n):=N1 l have s:=ac (ε.mpr d) rw [dRw8,AT (ε.mpr d)] rw [w (k+1) _ _ _ (by rw [s,Q3,l,BK]) (by rw [s]; exact d) q,s,kFS,k8i k r (J0 n) d.le j.2 g] rw [kXU X (i+k) _ ((J0 i)+(J0 k)) (kSm i k ((O1 d _).trans j.1)),kAbsDw,← aos _ _ _ a d] by_cases hq:q=8*(J0 n)+(J0 r) · rw [AD hq,AD hq] rw [AC hq,AC hq] by_cases hA:q%8=(J0 r)∧(J0 k)+1 ≤ q/8∧q/8 < (J0 n) · rw [AD hA,AD (show q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n) from ⟨hA.1,M4 hA.2.1,hA.2.2⟩)] rw [AC hA] by_cases hk8:8*(J0 k)+(J0 r)=q · subst hk8 have u:(8*(J0 k)+(J0 r))/8=(J0 k):=by rw [G6 ж,ώ g,ϑ] have y:(8*(J0 k)+(J0 r))%8=(J0 r):=by rw [E6,γ g] rw [AD rfl,AD (show (8*(J0 k)+(J0 r))%8=(J0 r)∧(J0 k) ≤ (8*(J0 k)+(J0 r))/8∧(8*(J0 k)+(J0 r))/8 < (J0 n) from ⟨y,u.ge,by rw [u]; exact d⟩),u] · have x:¬(q%8=(J0 r)∧(J0 k) ≤ q/8∧q/8 < (J0 n)):=by intro h; apply hk8 have e8:q/8=(J0 k):=N2 (Z0 (N7 λz=>hA ⟨h.1,z,h.2.2⟩)) h.2.1 rw [← e8, ← h.1]; exact ϛ q 8 rw [AC hk8,AC x] lemma dX8_spec_h1{α:Type}(f:ℕ→ℕ→α)(g:ℕ→α)(Yq o t r:α)(q N R L p k0 j s:ℕ)(hq:8*j+s=q)(c:s < 8)(i:R < 8)(u:R < L)(m:p=R+1)(k:k0=0)(l:t=f R j)(d:r=g R)(n:o=if q=8*N+R then r else if s=R∧k0 ≤ j∧j < N then t else Yq): (if q < 8*N+8∧p ≤ s∧s < L then (if j < N then f s j else g s) else o)=if q < 8*N+8∧R ≤ s∧s < L then (if j < N then f s j else g s) else Yq:=by subst m k l d n hq by_cases hs:s=R · subst hs rw [AC (λh=>Vg s h.2.1)] rcases Ju j N with a|a|a · rw [AC (λe=>K7 a (Xi ж (Va e))),AD ⟨rfl,ϟ _,a⟩,AD ⟨(O1 c _).trans_le (L1 (U0 8 a.le) 8),le_refl s,u⟩,AD a] · subst a rw [AD rfl,AD ⟨O1 c _,le_refl s,u⟩,AC (K4 j)] · rw [AC (λe=>J8 a (Xi ж (Va e))),AC (λh=>Nat.lt_asymm h.2.2 a),AC (λh=>X2.2 (((Qm 8 N).symm.trans_le (U0 8 a)).trans (V1 _ _)) h.1)] · by_cases hc:8*j+s < 8*N+8∧R ≤ s∧s < L · rw [AD ⟨hc.1,U4 hc.2.1 (Ne.symm hs),hc.2.2⟩,AD hc] · rw [AC (λh=>hc ⟨h.1,M4 h.2.1,h.2.2⟩),AC (λe=>hs (((E6 8 j s).trans (γ c)).symm.trans ((congrArg (·%8) e).trans ((E6 8 N R).trans (γ i))))),AC (λh=>hs h.1),AC hc] lemma dX8_spec (X:Ἂ ἇ)(b n a:Ἄ)(hX:(J0 b)+(J0 a)*(J0 n)<=(O0 X))(o:(J0 b)+(J0 a)*(J0 n)<2^31/\8*(J0 n)+7<2^31)(l:(J0 a)<=8) : ∀ m (r:Ἄ)(Y:ἀ)(g:8*(J0 n)+8<=(kS Y)),(J0 a)-(J0 r)=m → (J0 r) ≤ (J0 a) → ∀ q, (dX8 X b n a r Y hX g o l).data[q]! = if q < 8*(J0 n)+8∧(J0 r) ≤ q%8∧q%8 < (J0 a) then (if q/8 < (J0 n) then dw X[(J0 b)+(q%8)*(J0 n)+q/8]! else ao (λ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 g j p q have e:(J0 r)=(J0 a):=N2 p (W1 j) rw [dX8,dite_eq_right (λh=>K4 _ ((ε.mp h).trans_le e.ge))]; exact (AC (λh=>K4 _ (h.2.1.trans_lt (h.2.2.trans_le e.ge)))).symm | succ m u => intro r Y g j p q have c:(J0 r) < (J0 a):=N1 j have k:=ac (ε.mpr c) have K:=kBRn b r n (J0 a) c o.1 have d:(J0 r) < 8:=c.trans_le l rw [dX8,AT (ε.mpr c)]; exact (u (r+1) _ _ ((congrArg ((J0 a)-·) k).trans ((Qf _ _).trans (congrArg B8 j))) (k.trans_le c) q).trans (dX8_spec_h1 (λs t=>dw X[(J0 b)+s*(J0 n)+t]!) (λs=>ao (λt=>dw (X[(J0 b)+s*(J0 n)+t]! &&& 0x7FFFFFFF)) (J0 n) 0 0) _ _ _ _ q _ _ _ _ _ (q/8) (q%8) (ϛ q 8) (ϊ _ ж) d c k rfl (congrArg (λi=>dw X[i+q/8]!) K.1) (congrArg (λi=>ao (λt=>dw (X[i+t]! &&& 0x7FFFFFFF)) (J0 n) (J0 0) 0) K.1) (dRw8_spec X _ n r _ _ d _ 0 Y 0 g rfl (ϟ _) q)) lemma dZ5 (e:Ἃ):(if e.toUInt64<(56:ἆ) then (56:ἆ) else e.toUInt64).toNat=max e.toNat 56:=by rw[← kE64 e];split;exact (D8 (μ.1 ‹_›).le).symm;exact (Z8 (V3 (μ.not.1 ‹_›))).symm lemma dZ6 {a c:ℕ}(h:a≤c):(2:ℝ)^(a:ℤ)≤(2:ℝ)^(c:ℤ):=AG one_le_two (B3.2 h) lemma kOutWm (n:ℕ)(l:ℕ→Ἃ)(W b E:Ἂ Ἃ)(m L H:ℕ)(j:ℕ)(cq d p:ἆ)(f:ℕ→Ἅ)(v r:Ἅ) (A:∀ sdw (l k&&&0x7FFFFFFF)) n 0 0) (t:23+(cEq (I0 (9*(n+1))).toInt64.toFloat r).toNat ≤ cq.toNat)(w:cq.toNat ≤ 992)(G:d=(m+L-50).toUInt64) (T:p=(if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq) (O:(E[j]!).toUInt64 < 255) (g:p ≤ 372) : aG (n+1) (λs=>if s < n then l s else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)∧fv v ∧ |rv v-(af (n+1) (λs=>if s < n then l s else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(((if d>p then d else p).toNat:ℕ):ℤ) ∧ |(af (n+1) (λs=>if s < n then l s else ld) (λs=>if s < n then W[j*n+s]! else b[j]!):ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if d>p then d else p).toNat)+52:ℕ):ℤ)∧(if d>p then d else p).toNat ≤ 600:=by have B:=kCEb (I0 (9*(n+1))).toInt64.toFloat r generalize hcc:(cEq (I0 (9*(n+1))).toInt64.toFloat r)=cc at t B have i:(E[j]!).toNat<255:=O have I:p.toNat=max (E[j]!).toNat 56+cq.toNat:=by rw[T,kAddS _ _ (by rw[dZ5];exact C0 (E0 (Xh.2 ⟨i.le,ж⟩) w) ж),dZ5] have e:=θ.1 g have J:max (E[j]!).toNat 56+23+cc.toNat≤p.toNat:=by rw[I,pA];exact J1 t _ have o:=kWin n l W b j (E[j]!).toNat m L H f r A C i y M N x z U (q i) F (by rw[hcc];exact J.trans e) rw[hcc] at o have u:=max_le_max_left (m+L-50) J rw[S,kOutW_h2,G,kOfS _ ((I2 _ _).trans_lt (C0 z ж))] exact ⟨o.1,o.2.1,o.2.2.1.trans (dZ6 u),o.2.2.2.1,o.2.2.2.2.trans (dZ6 (L1 u 52)),Xh.2 ⟨(I2 _ _).trans (z.trans ж),e.trans ж⟩⟩ lemma 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 _,V3 this,pZ rfl⟩ lemma kMx8 (f:ℕ→ἆ)(B:ℕ)(d:∀ 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 j:=kMx2 (f 0) (f 1); have h:=kMx2 (f 2) (f 3); have i:=kMx2 (f 4) (f 5); have k:=kMx2 (f 6) (f 7) have o:=kMx2 (mx2 (f 0) (f 1)) (mx2 (f 2) (f 3)); have n:=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 g : ∀ a c:ἆ,a.toNat ≤ B → c.toNat ≤ B → (mx2 a c).toNat ≤ B:=λa c t s => (kMx2 a c).2.2.elim (λe=>e.trans_le t) (λe=>e.trans_le s) have p:=o.1.trans c.1; have l:=o.2.1.trans c.1; have q:=n.1.trans c.2.1; have m:=n.2.1.trans c.2.1 refine ⟨λr u => ?_,g _ _ (g _ _ (g _ _ (d 0 ж) (d 1 ж)) (g _ _ (d 2 ж) (d 3 ж))) (g _ _ (g _ _ (d 4 ж) (d 5 ж)) (g _ _ (d 6 ж) (d 7 ж)))⟩ interval_cases r exacts [j.1.trans p,j.2.1.trans p,h.1.trans l,h.2.1.trans l,i.1.trans q,i.2.1.trans q,k.1.trans m,k.2.1.trans m] lemma kHB (a l0:ℕ)(h:50 ≤ a)(g:a+l0 ≤ 425):a.toUInt64+l0.toUInt64-(50:ἆ)=(a+l0-50).toUInt64:=by have t:a+l0 < 2^63:=C0 g ж have d:a.toUInt64.toNat=a:=kOfS _ ((V1 _ _).trans_lt t) have e:l0.toUInt64.toNat=l0:=kOfS _ ((H0 _ _).trans_lt t) have c:(a.toUInt64+l0.toUInt64).toNat=a+l0:=by rw [kAddS _ _ (by rw [d,e]; exact t),d,e] apply ξ.1 rw [χ _ _ (by rw [θ,c]; exact h.trans (V1 _ _)),c,kOfS _ ((I2 _ _).trans_lt t)]; simp lemma 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) ж) exact ⟨e,by rw [e]; exact J1 this 23⟩ lemma gXb_spec_h2(Z Y:ἀ)(X:Ἂ Ἃ)(b a l z g n:Ἀ)(w:z=0)(v:a=n)(o:b=g*n)(p:l<=8)(u:∀q,q<8*n+8->Y.data[q]! =dw 0) (D:∀q,Z.data[q]! =if q<8*a+8∧z<=q%8∧q%8dw (X[b+(q%8)*a+t]! &&& 0x7FFFFFFF)) a 0 0) else Y.data[q]!): (∀s,s∀r,r<8->Z.data[8*s+r]! =if rZ.data[8*n+r]! =ao (λk=>dw (X[(g+r)*n+k]! &&& 0x7FFFFFFF)) n 0 0):=by subst w o v refine ⟨λs j r c=>?_,λr c=>?_⟩ · have i:(8*s+r)%8=r:=(E6 8 s r).trans (γ c) have e:(8*s+r)/8=s:=by rw[G6 ж,ώ c,ϑ] have m:8*s+r<8*a+8:=(O1 c _).trans_le (L1 (U0 8 j.le) 8) refine (D _).trans ?_ rw[i,e,AD j,Ϡ] exact if_congr ⟨λh=>h.2.2,λh=>⟨m,ϟ _,h⟩⟩ rfl (u _ m) · have d:r<8:=c.trans_le p have i:(8*a+r)%8=r:=(E6 8 a r).trans (γ d) have e:(8*a+r)/8=a:=by rw[G6 ж,ώ d,ϑ] refine (D _).trans ?_ rw[i,e,AC (K4 a),Ϡ] exact AD ⟨O1 d _,ϟ _,c⟩ structure YM where Y:ἀ m:ἇ lemma dTe(T:ἀ)(a:T=P)(w:ἇ):(J0 (G4 ((w>>>23)&&&255)))<(kS T):=by rw[a,gL,aC,Ξ];exact AO ϝ ж lemma dTs(T:ἀ)(a:T=P)(w:ἇ):(J0 (G4 (w>>>23)))<(kS T):=by rw[a,gL,aC,dg];have:=w.toNat_lt;exact Ϟ this lemma dR1(k:Ἄ)(h:(J0 k)+1<2^(32:Ἀ)):(J0 (k+1))=(J0 k)+1:=by have:2^(32:Ἀ) ≤ 2^nx:=ς;rw[lJ,kc1];exact γ щ lemma dR5(k:Ἄ)(h:(J0 k)+4<2^(32:Ἀ)):(J0 (k+4))=(J0 k)+4:=by have:2^(32:Ἀ) ≤ 2^nx:=ς;rw[lJ,kc4];exact γ щ def dRwM(X:Ἂ ἇ)(i n o k:Ἄ)(Y:ἀ)(a:Ἅ)(m:ἇ)(T:@& ἀ)(hT:T=P)(hX:(J0 i)+(J0 n)<=(O0 X))(hY:(J0 o)+(J0 n)<(kS Y))(hB:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):YM:= if h:k>>23)&&&255 let f0:=(Core.mW w0).toInt64.toFloat let e1:=(w1>>>23)&&&255 let f1:=(Core.mW w1).toInt64.toFloat let e2:=(w2>>>23)&&&255 let f2:=(Core.mW w2).toInt64.toFloat let e3:=(w3>>>23)&&&255 let f3:=(Core.mW w3).toInt64.toFloat let a2:=a+f0*T.uget (G4 e0) (dTe T hT w0)+f1*T.uget (G4 e1) (dTe T hT w1)+f2*T.uget (G4 e2) (dTe T hT w2)+f3*T.uget (G4 e3) (dTe T hT w3) let m1:=if m>>23)) (dTs T hT w0) let d1:=f1*T.uget (G4 (w1>>>23)) (dTs T hT w1) let d2:=f2*T.uget (G4 (w2>>>23)) (dTs T hT w2) let d3:=f3*T.uget (G4 (w3>>>23)) (dTs T hT w3) dRwM X i n o (k+1+1+1+1) ((((Y.uset (o+k) d0 (by rw[kSm o k щ];omega)).uset (o+(k+1)) d1 (by rw[uZ,kSm o (k+1) (by rw[c1];omega),c1];omega)).uset (o+(k+1+1)) d2 (by rw[uZ,uZ,kSm o (k+1+1) (by rw[c2];omega),c2];omega)).uset (o+(k+1+1+1)) d3 (by rw[uZ,uZ,uZ,kSm o (k+1+1+1) (by rw[c3];omega),c3];omega)) a2 (if m3>>23)&&&255 let f:=(Core.mW w).toInt64.toFloat dRwM X i n o (k+1) (Y.uset (o+k) (f*T.uget (G4 (w>>>23)) (dTs T hT w)) (by rw[kSm o k щ];omega)) (a+f*T.uget (G4 e) (dTe T hT w)) (if m(dRwM X i n o k Y a m P rfl hX c g).Y=dRw X i n o k Y a hX c g:=by intro _ k Y a m c u;clear u fun_induction dRwM X i n o k Y a m P rfl hX c g with | case1 k Y a m c h l b2 s v q p r j I M C J A f0 L N D x H y z m1 G m3 d0 K B F d=> simp only[dite_eq_ite]at d;rw[d];symm rw[dRw,AT h];dsimp only rw[dRw,AT (ε.mpr (by rw[p];clear * - q;omega))];dsimp only rw[dRw,AT (ε.mpr (by rw[r];clear * - q;omega))];dsimp only rw[dRw,AT (ε.mpr (by rw[j];clear * - q;omega))];rfl | case2 k Y a m c h l b2 s v w e f d=>simp only[dite_eq_ite]at d;rw[d];symm;rw[dRw,AT h];rfl | case3 k Y a m c h=>rw[dRw,dite_eq_right h] lemma dRwM_m(X:Ἂ ἇ)(i n o:Ἄ)(hX:(J0 i)+(J0 n)<=(O0 X))(y:(J0 i)+(J0 n)<2^(31:Ἀ)/\(J0 o)+(J0 n)<2^(31:Ἀ)):∀ t (k:Ἄ)(Y:ἀ)(a:Ἅ)(m:ἇ)(c:(J0 o)+(J0 n)<(kS Y)),(J0 n)-(J0 k)=t-> (mJ m)<=(mJ (dRwM X i n o k Y a m P rfl hX c y).m)/\∀q,(J0 k)<=q->q<(J0 n)->(mJ (kB X[(J0 i)+q]!))<=(mJ (dRwM X i n o k Y a m P rfl hX c y).m):=by have r:∀m e:ἇ,(mJ (if mby split<;>rename_i j<;>rw[Ι]at j<;>clear*-j<;>omega have E:∀ j h,(J0 j)<(J0 n)→(mJ (kB X[(J0 i)+(J0 j)]!))=(mJ (kB (X.uget (i+j) h))):=λj h b=>by rw[cC,kSm i j (N3 (O1 b _) y.1)] intro _ k Y a m c K;clear K fun_induction dRwM X i n o k Y a m P rfl hX c y with | case1 k Y a m c h F b2 H L q s x l w0 w1 U w3 z f0 D f1 A M C O S m1 B m3 d0 d1 T V p=> simp only[dite_eq_ite]at p;obtain⟨u,v⟩:=p have G:(J0 (k+1+1+1+1))=(J0 k)+4:=by rw[dR1 (k+1+1+1) (l▸C0 q (N3 (C0 (H0 _ _) F) (Vu Vz))),l] have r2:(mJ m3)=_:=r B A;have r1:(mJ B)=_:=r m1 D;have J:(mJ m1)=_:=r m z;rw[r m3 C,r2,r1,J]at u;simp only[max_le_iff]at u;obtain⟨⟨⟨⟨u,i1⟩,i2⟩,i3⟩,i4⟩:=u refine⟨u,λq g d=>?_⟩ by_cases g4:(J0 k)+4<=q · exact v q (by rw[G];exact g4) d · rcases (by clear * - g g4;omega:q=(J0 k)∨q=(J0 k)+1∨q=(J0 k)+2∨q=(J0 k)+3) with rfl|rfl|rfl|rfl ·exact (E k _ H).trans_le i1 ·rw[←s];exact (E _ _ (s.trans_lt ((V1 _ 2).trans q))).trans_le i2 ·rw[←x];exact (E _ _ (x.trans_lt ((V1 _ 1).trans q))).trans_le i3 ·rw[←l];exact (E _ _ (l.trans_lt q)).trans_le i4 | case2 k Y a m c h F b2 H L w e f p=> simp only[dite_eq_ite]at p;obtain⟨u,v⟩:=p rw[r m e]at u;simp only[max_le_iff]at u refine⟨u.1,λq g d=>?_⟩ by_cases g1:(J0 k)+1<=q · exact v q (by rw[ac h];exact g1) d · rcases N2 (Z0 (U5.1 g1)) g with rfl;exact (E k _ H).trans_le u.2 | case3 k Y a m c h=>exact⟨le_refl _,λq g d=>(h (ε.2 (AO g d))).elim⟩ def dOwM(X:Ἂ ἇ)(n m R r:Ἄ)(Y:ἀ)(mx:ἇ)(hX:(J0 R)*(J0 n)<=(O0 X))(hY:(J0 R)*(J0 m)<=(kS Y))(hm:(J0 m)=(J0 n)+1)(hB:(J0 R)*(J0 m)<2^(31:Ἀ)):YM:= if h:r(dOwM X n m R r Y mx hX c e d).Y=dOw X n m R r Y hX c e d:=by intro k;induction k with | zero=>intro r Y mx c a;have i:¬ rP6 (ε.mp h) a rw[dOwM,dOw];simp only [dite_eq_right i] | succ k j=> intro r Y mx c a;have g:(J0 r)<(J0 R):=N1 a rw[dOwM,dOw];simp only [AT (ε.mpr g)] rw[j (r+1) _ _ _ (by rw[ac (ε.mpr g),Q3,a,BK])] congr 1 exact dRwM_Y _ _ _ _ _ _ _ _ _ _ _ _ rfl lemma dOwM_m(X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(e:(J0 m)=(J0 n)+1)(c:(J0 R)*(J0 m)<2^(31:Ἀ)):∀ k (r:Ἄ)(Y:ἀ)(mx:ἇ)(a:(J0 R)*(J0 m)<=(kS Y)),(J0 R)-(J0 r)=k-> (mJ mx)<=(mJ (dOwM X n m R r Y mx hX a e c).m)/\∀q,(J0 r)*(J0 n)<=q->q<(J0 R)*(J0 n)->(mJ (kB X[q]!))<=(mJ (dOwM X n m R r Y mx hX a e c).m):=by intro k;induction k with | zero=>intro r Y mx a o;have C:¬ rP6 (ε.mp h) o rw[dOwM];simp only [dite_eq_right C] exact⟨le_refl _,λq g d=>(C (ε.2 (K9 (AO g d)))).elim⟩ | succ k G=> intro r Y mx a o;have s:(J0 r)<(J0 R):=N1 o rw[dOwM];simp only [AT (ε.mpr s)] have y:=ι (J0 n) s;have z:=ι (J0 m) s;have D:(J0 R)*(J0 n)<=(J0 R)*(J0 m):=U0 _ (Ve.intro e.symm);rw[nO] at y z have u:=kMm r n (C0 ((V1 _ _).trans (y.trans D)) c);have x:=kMm r m (C0 ((V1 _ _).trans z) c) have nm:(J0 n)<(J0 m):=e▸M1 _ rw[←u] at y;rw[←x] at z have l:=y.trans hX;have i:=U1 (O1 nm _) (z.trans a);have j:=And.intro (C0 (y.trans D) c) (N3 (U1 (O1 nm _) z) c) have t:(J0 R)*(J0 m)<=kS (dRwM X (r*n) n (r*m) 0 Y 0 mx P rfl l i j).Y:=by rw[dRwM_Y X (r*n) n (r*m) l j _ 0 Y 0 mx i rfl,dRw_size X (r*n) n (r*m) _ _ _ 0 Y 0 _ rfl];exact a obtain⟨v,B⟩:=G (r+1) _ (dRwM X (r*n) n (r*m) 0 Y 0 mx P rfl l i j).m t (by rw[ac (ε.mpr s),Q3,o,BK]) obtain⟨A,F⟩:=dRwM_m X (r*n) n (r*m) l j _ 0 Y 0 mx i rfl refine⟨A.trans v,λq g d=>?_⟩ by_cases o2:q<(J0 r)*(J0 n)+(J0 n) · have w:=F (q-(J0 r)*(J0 n)) (by rw[kc0];exact ϟ _) (K3 g o2) rw[u,M3 g] at w exact w.trans v · exact B q (by rw[ac (ε.mpr s),Ο];exact X2.1 o2) d lemma bdM(A:Ἂ kF)(m:ἇ)(a:∀q,q<(O0 A)->(mJ (kB A[q]!))<=(mJ m))(h:m<255)(q:Ἀ): kB A[q]!≠255/\kG A[q]!<=(mJ m)-1:=by have g:=Ι.mp h;have d:(mJ (kB A[q]!))<=(mJ m):=by by_cases d:q<(O0 A) .exact a q d .rw[An A q d];exact ϟ _ refine⟨λe=>by simp[e]at d g;(clear * - g d;omega),by rw[aT];exact O3 d 1⟩ lemma dOw_spec_h1 {r R n m x y B:Ἀ} (j:Jz r R) (c:Jz n m) (d:Jz (Ko R m) B) (hX:Ve (Ko R n) x) (k:Ve (Ko R m) y) : Jz (Ko r n) B∧Jz (Ko r m) B∧(∀ a,a=Ko r n → Ve (Uv a n) x)∧(∀ a,a=Ko r m → Jz (Uv a n) y)∧(∀ a,a=Ko r n → Jz (Uv a n) B)∧(∀ a,a=Ko r m → Jz (Uv a n) B):=by have g:=N0 (Y3 (Ο r m).symm) (ι m j) have e:=N0 (Y3 (Ο r n).symm) (ι n j) have i:=U0 R (U2 c) exact ⟨C0 ((V1 _ _).trans (e.trans i)) d,C0 ((V1 _ _).trans g) d,λ_ h=>h ▸ e.trans hX,λ_ h=>h ▸ U1 (O1 c _) (g.trans k),λ_ h=>h ▸ C0 (e.trans i) d,λ_ h=>h ▸ N3 (O1 c _) (C0 g d)⟩ lemma dOw_spec (X:Ἂ ἇ)(n m R:Ἄ)(hX:(J0 R)*(J0 n)<=(O0 X))(w:(J0 m)=(J0 n)+1)(p:(J0 R)*(J0 m)<2^(31:Ἀ)) : ∀ k (r:Ἄ)(Y:ἀ)(e:(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 e w p).data[q]! = Y.data[q]!) ∧ ∀ c t,c < (J0 R) → (J0 r) ≤ c → t ≤ (J0 n) → (dOw X n m R r Y hX e w p).data[c*(J0 m)+t]! = if t=(J0 n) then ao (λs=>dw (X[c*(J0 n)+s]! &&& 0x7FFFFFFF)) (J0 n) 0 0 else dw X[c*(J0 n)+t]! := by intro k; induction k with | zero => intro r Y e g K exact ⟨λq _=>by rw [dOw,dite_eq_right (mt ε.mp (X2.2 (M0.1 g)))],λc t d x _=>(K4 c (U1 d ((M0.1 g).trans x))).elim⟩ | succ k L => intro r Y e g K have d:=N1 g have i:=N4 (M1 _) w.symm obtain ⟨H,F,M,I,C,G⟩:=dOw_spec_h1 d i p hX e have y:=kMm r n H have j:=kMm r m F have a:=ac (ε.mpr d) have u:=M _ y have l:=I _ j have o:=And.intro (C _ y) (G _ j) rw [dOw,AT (ε.mpr d)]; dsimp only obtain ⟨A,J⟩:=L (r+1) (dRw X _ n _ 0 Y 0 u l o) (N0 e (Y3 (dRw_size X _ n _ u o _ 0 Y 0 l rfl).symm)) ((congrArg (Nat.sub R.toNat) a).trans ((Qf _ _).trans (congrArg B8 g))) (N0 (Y3 a) d) have D:=dRw_spec X _ n _ u o _ 0 Y 0 l rfl (kc0 ▸ ϟ _) refine ⟨λq hq => ?_,λc t x B z => ?_⟩ · rw [A q (U1 hq (ι _ ((B5 _).trans (Y3 a.symm)))),D q,j,AC (by exact K7 (U1 hq (V1 _ _))),AC (by exact λh=>X2.2 ((V1 _ _).trans h.1) hq)] rcases M6 r.toNat c with v | v · exact J c t x (N0 (Y3 a) v) z · obtain rfl:=N2 v B rw [A _ (by rw [a,Ϡ,n4]; exact O1 (C0 z i) _),D, ← j, ← y] by_cases ht:t=n.toNat · subst ht; rw [AD rfl,AD rfl,kc0] · rw [AC (by exact λh=>ht (D6 h)),AC ht,AD (by exact ⟨J1 (ϟ _) _,O1 (U4 z 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 lemma 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 [Ql]; exact hq),AB a q hq,Qd] · have:(J0 i)≠q:=by omega rw [AC this,An (a.set (J0 i) x h) q (by simp only [Ql,not_lt]; exact V3 hq),An a q hq] lemma kOutV (a:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix c L H:ℕ)(Y Q:ἀ)(e d j:ℕ)(cq g:ἆ)(v m:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(p:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ c)(w:n+2 ≤ 2^L)(x:L≤27)(z:c+L≤425)(y:0Y.data[e+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (r:m=ao (λk=>dw (X[d+k]! &&& 0x7FFFFFFF)) n 0 0) (o:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat m) (h:g=(c+L-50).toUInt64) : oV a n X W b E ix c L Y Q e d cq g j v=p8 a (ms (n+1) (λs=>if s < n then X[d+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)):=by unfold oV; exact kOut a n X W b E ix c L H Y Q e d j cq g v m F p M w x z y t l i u r o h lemma 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]) a⟩ lemma sMb1(Q Y:ἀ)(c nu a:Ἄ)(e:(J0 c)+(J0 nu)<=(kS Y)/\(J0 c)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 a)+8*(J0 nu)<=(kS Q)/\(J0 a)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(h:(J0 t)<(J0 nu)) : (J0 (c+t))=(J0 c)+(J0 t)∧(J0 (a+8*t))=(J0 a)+8*(J0 t) ∧ (J0 (c+t))<(kS Y)∧(J0 (a+8*t))+7<(kS Q)∧(J0 (a+8*t))+7<2^(31:Ἀ)∧(J0 (t+1))=(J0 t)+1:=by have l:=U0 8 (U2 h) have e8:(J0 (8*t))=8*(J0 t):=by rw[kMm 8 t (kc8▸C0 l (C0 (H0 _ _) hQ.2)),kc8] have g:=kSm c t (N3 (O1 h _) e.2); have d:=kSm a (8*t) (e8▸C0 (J1 l _) hQ.2) have i:=kSm t 1 (kc1▸C0 (l7 h) (C0 (H0 _ _) e.2)); rw[kc1] at i rw[e8] at d have z:=(pA (J0 a) (8*J0 t) 8).trans_le (J1 (U0 8 (l7 h)) _) exact ⟨g,d,g▸U1 (O1 h _) e.1,d▸U1 z hQ.1,d▸N3 z hQ.2,i⟩ lemma sMb(Q Y:ἀ)(d nu a:Ἄ)(g:(J0 d)+(J0 nu)<=(kS Y)/\(J0 d)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 a)+8*(J0 nu)<=(kS Q)/\(J0 a)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(h:(J0 t)<(J0 nu))(c:(J0 t)+1<(J0 nu)) : (J0 (t+2))=(J0 t)+2 ∧ (J0 (d+(t+1)))=(J0 d)+((J0 t)+1)∧(J0 (a+8*(t+1)))=(J0 a)+8*((J0 t)+1) ∧ (J0 (d+(t+1)))<(kS Y)∧(J0 (a+8*(t+1)))+7<(kS Q)∧(J0 (a+8*(t+1)))+7<2^(31:Ἀ):=by have A:=(sMb1 Q Y d nu a g hQ t h).2.2.2.2.2 have B:=sMb1 Q Y d nu a g hQ (t+1) (A▸c) rw[A] at B exact ⟨by rw[kSm t 2 (by rw[kc2];exact C0 (l7 c) (C0 (H0 _ _) g.2)),kc2],B.1,B.2.1,B.2.2.1,B.2.2.2.1,B.2.2.2.2.1⟩ lemma Lq0(R r:ℕ)(h:R-r=0):¬r < R:=X2.mpr (M0.mp h) lemma Lqs(R r k:ℕ)(h:R-r=k+1):r < R∧R-(r+1)=k:=⟨N1 h,by rw[Qf,h];rfl⟩ lemma Lqd(R r:ℕ)(h:r < R):R-(r+1) < R-r:=Z3 h (M1 r) lemma Lq2(R r:ℕ)(h:r+1 < R):R-(r+1+1) < R-r:=Z3 (N5 h) (H4 (M1 r)) lemma Lql(a j m c:ℕ)(h:j < m)(d:a+m<=c):a+j < c:=U1 (O1 h a) d lemma Lqn(a j m q:ℕ)(h:m<=j):¬(a+j<=q∧q < a+m):=λg=>K4 _ (C0 ((J1 h a).trans g.1) g.2) lemma Lqa(a b m:ℕ):¬(a+(b+1)≤a+b∧a+b < a+m):=λg=>Vg _ g.1 lemma Lqb(a b m:ℕ)(h:b < m):a+b≤a+b∧a+b < a+m:=⟨Jy _,O1 h a⟩ lemma Lqc(a b m q:ℕ)(g:a+(b+1)≤q∧q < a+m):a+b≤q∧q < a+m:=⟨M4 g.1,g.2⟩ lemma Lqe(a b m q:ℕ)(g:¬(a+(b+1)≤q∧q < a+m))(e:¬a+b=q):¬(a+b≤q∧q < a+m):=λc=>g ⟨U4 c.1 e,c.2⟩ lemma Lqf(a r c w o e:ℕ)(g:r+1≤c)(d:o < w):(a+c)*w+e≠(a+r)*w+o:=by have m:=ι w (J1 g a); rw [show a+(r+1)=(a+r)+1 from rfl,Ο] at m exact J8 (U1 (O1 d _) (m.trans (V1 _ _))) lemma Lwq(a g l:ℕ)(c:l < 8):(8*a ≤ 8*g+l∧8*g+l < 8*a+8) ↔ g=a:=by omega lemma Lw1(o r:ℕ)(a:r < 8):8*o+8≤8*(o+1)+r∧8*(o+1)+r < 8*o+8+8:=(Lwq (o+1) (o+1) r a).mpr rfl lemma Lw2(o r:ℕ):8*(o+1)+r-(8*o+8)=r:=ϱ (8*o+8) r lemma Lw8(x o r:ℕ)(f:x=8*o+8):8*(o+1)+r-x=r:=by rw[f];exact Lw2 o r lemma Lw3(o a r:ℕ)(c:r < 8)(e:¬a=o+1):¬(8*o+8≤8*a+r∧8*a+r < 8*o+8+8):=λg=>e ((Lwq (o+1) a r c).mp g) lemma Lw4(o r:ℕ)(a:r < 8):8*o≤8*o+r∧8*o+r < 8*o+8:=⟨V1 _ _,O1 a _⟩ lemma Lw5(o a r:ℕ)(c:r < 8)(e:¬a=o):¬(8*o≤8*a+r∧8*a+r < 8*o+8):=λg=>e ((Lwq o a r c).mp g) lemma Lw6(o a:ℕ)(h:a < o+1+1)(d:¬a=o+1)(c:¬a=o):a < o:=U4 (Z0 (U4 (Z0 h) d)) c lemma Lw7(o a w:ℕ)(ho:a < w)(c:¬o+1 < w)(d:¬a=o):a < o:=U4 (Z0 (U1 ho (V3 c))) d lemma n5d0:0≤7:=G1 rfl lemma n5d1:1≤7:=G1 rfl lemma n5d2:2≤7:=G1 rfl lemma n5d3:3≤7:=G1 rfl lemma n5d4:4≤7:=G1 rfl lemma n5d5:5≤7:=G1 rfl lemma n5d6:6≤7:=G1 rfl lemma n5d7:7≤7:=G1 rfl lemma sMbT(Q Y:ἀ)(c nu d:Ἄ)(e:(J0 c)+(J0 nu)<=(kS Y)/\(J0 c)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 d)+8*(J0 nu)<=(kS Q)/\(J0 d)+8*(J0 nu)<2^(31:Ἀ))(t:Ἄ)(a:(J0 t)<=(J0 nu)):(J0 (t+1))=(J0 t)+1:=by rw[kSm t 1 (by rw[kc1];clear * - a hQ;omega),kc1] lemma fzPU(m:Float.Model):I5 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 lemma fzRN(M E:Int)(d:Float.Model.Format):pp d (Ji (decide (M<0))) M.natAbs E=H5 d 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 a:M.natAbs=(-M).toNat:=by omega simp only[H5,c,Ji,h,decide_true,ἁ,a] ·subst h;simp[H5,Ji] ·have c:compare M 0=.gt:=Int.compare_eq_gt.mpr h;have a:M.natAbs=M.toNat:=by omega simp only[H5,c,Ji,not_lt.mpr h.le,decide_false,υ,↓reduceIte,a] lemma 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 lemma fzVD(c i a g:Int)(h:(c:ℚ)*2^i=(a:ℚ)*2^g):I5 (H5 k0 c i .positive)=I5 (H5 k0 a g .positive):=by by_cases h1:c=0 ·have d:a=0:=by subst h1;simp at h rcases h with h|h ·exact_mod_cast h ·exact absurd h ф subst h1;subst d;rfl have d:a≠0:=by intro d;subst d;simp at h rcases h with h|h ·exact h1 (by exact_mod_cast h) ·exact absurd h ф apply Vx rw[Js,Js,← fzRN,← fzRN] have e:=ExactRuntime.roundDyadic_congr FloatFormat.binary64 ж ⟨decide (c<0),c.natAbs,i⟩ ⟨decide (a<0),a.natAbs,g⟩ (by simpa using h1) (by simpa using d) (by simp only[pR,fzSS];exact h) simp[Model.roundDyadic,Zy] at e exact e lemma fzZ(s:pK):(I5 (.zero s)).unpack=.zero s:=by cases s<;>rfl open FloatLib.Floats.Formats.BinaryInterchange in lemma fzSA(s:pK)(n:ℤ):((s.apply n:ℤ):ℝ)=(if Z5 s=true then -1 else 1)*(n:ℝ):=by cases s<;>simp[Float.Model.UnpackedFloat.Sign.apply,Z5] open FloatLib.Floats.Formats.BinaryInterchange in lemma fzSM(c a:pK):(if Z5 (c*a)=true then (-1:ℝ) else 1)=(if Z5 c=true then -1 else 1)*(if Z5 a=true then -1 else 1):=by cases c<;>cases a<;>simp[Z5] lemma fzBP(e:ℤ):kZ kO e=(2:ℝ)^e:=by simp[kZ,kO,mg] lemma 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 lemma fzFma(x y z:Ἅ)(hX:x.toModel.unpack.isFinite=true)(k:y.toModel.unpack.isFinite=true)(s:(x*y).toModel.unpack.isFinite=true) (i:Qv (x*y).toModel.unpack=Qv x.toModel.unpack*Qv y.toModel.unpack):Gy x y z=z+x*y:=by show (⟨x.toModel.fma y.toModel z.toModel⟩:Ἅ)=⟨z.toModel+(x*y).toModel⟩ congr 1 show I5 (fma .binary64 x.toModel.unpack y.toModel.unpack z.toModel.unpack)=I5 (add .binary64 z.toModel.unpack (x*y).toModel.unpack) have e:(x*y).toModel=I5 (mul .binary64 x.toModel.unpack y.toModel.unpack):=rfl generalize hPd:(x*y).toModel.unpack=P at s i ⊢ rw[e] at hPd generalize x.toModel.unpack=X at hX i hPd ⊢ generalize y.toModel.unpack=Y at k i hPd ⊢ generalize z.toModel.unpack=Z cases X with | notANumber=>simp[isFinite] at hX | infinity d=>simp[isFinite] at hX | zero d=> cases Y with | notANumber=>simp[isFinite] at k | infinity a=>simp[isFinite] at k | zero a=> have l:P=.zero (d*a):=by rw[← hPd];exact fzZ _ subst l cases Z with | notANumber=>rfl | infinity c=>rfl | zero c=>cases d<;>cases a<;>cases c<;>rfl | finite c m3 e o=>rfl | finite a j g t=> have l:P=.zero (d*a):=by rw[← hPd];exact fzZ _ subst l cases Z with | notANumber=>rfl | infinity c=>rfl | zero c=>cases d<;>cases a<;>cases c<;>rfl | finite c m3 e o=>rfl | finite d m1 h u=> cases Y with | notANumber=>simp[isFinite] at k | infinity a=>simp[isFinite] at k | zero a=> have l:P=.zero (d*a):=by rw[← hPd];exact fzZ _ subst l cases Z with | notANumber=>rfl | infinity c=>rfl | zero c=>cases d<;>cases a<;>cases c<;>rfl | finite c m3 e o=>rfl | finite a j g t=> have q:(0:ℝ) < m1:=by exact_mod_cast u have p:(0:ℝ) < j:=by exact_mod_cast t have m:Qv P≠0:=by rw[i,K6,K6,fzBP,fzBP] exact mul_ne_zero (mul_ne_zero (mul_ne_zero (by split<;>norm_num) q.ne') (zpow_ne_zero _ AL)) (mul_ne_zero (mul_ne_zero (by split<;>norm_num) p.ne') (zpow_ne_zero _ AL)) cases P with | notANumber=>simp[isFinite] at s | infinity n=>simp[isFinite] at s | zero n=>exact absurd (Jj n) m | finite n mP eP r=> cases Z with | notANumber=>rfl | infinity c=>rfl | zero c=> show I5 (mul .binary64 (.finite d m1 h u) (.finite a j g t))=I5 (.finite n mP eP r) rw[← hPd,fzPU] | finite c m3 e o=> apply fzVD rw[K6,K6,K6,fzBP,fzBP,fzBP] at i have A:=fzAL (m1*j) (h+g) (min (h+g) e) (min_le_left _ _) have B:=fzAL m3 e (min (h+g) e) (min_le_right _ _) have C:=fzAL m3 e (min e eP) (min_le_left _ _) have D:=fzAL mP eP (min e eP) (min_le_right _ _) have E:=fzSM d a have F:(2:ℝ)^(h+g)=(2:ℝ)^h*(2:ℝ)^g:=AK ш _ _ push_cast at A rw[← Rat.cast_inj (α:=ℝ)] simp only[W7,Vj,B7,R8,Z7,K8,fzSA,X4] linear_combination (if Z5 (d*a)=true then (-1:ℝ) else 1)*A+(if Z5 c=true then (-1:ℝ) else 1)*B-(if Z5 c=true then (-1:ℝ) else 1)*C-(if Z5 n=true then (-1:ℝ) else 1)*D+((m1:ℝ)*j*(2:ℝ)^(h+g))*E-i+((if Z5 d=true then (-1:ℝ) else 1)*(if Z5 a=true then (-1:ℝ) else 1)*m1*j)*F 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]! lemma FMok_f(Q Y:ἀ)(a c nu:Ἄ):FMok false Q Y a c nu:=λ_ _ _ _ _=>rfl lemma fzD(c:Ἆ)(w:ἇ)(d:kB w≠255)(q:Ἅ)(hq:(∃ v,kB v≠255∧q=dw v)∨q=0)(a:Ἅ):fM c a (dw w) q=a+dw w*q:=by cases c;·rfl show Gy (dw w) q a=a+dw w*q have X:=cI w d rcases hq with ⟨v,e,rfl⟩|rfl ·have V:=cI v e;have P:=dJ w v d e 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))⟩ lemma sM1_spec(g:Ἆ)(Q Y:ἀ)(d nu a:Ἄ)(p:(J0 d)+(J0 nu)<=(kS Y)/\(J0 d)+(J0 nu)<2^(31:Ἀ))(hQ:(J0 a)+8*(J0 nu)<=(kS Q)/\(J0 a)+8*(J0 nu)<2^(31:Ἀ))(w:FMok g Q Y d a nu)(t:Ἄ)(h:(J0 t)<(J0 nu))(l s r u o m j q:Ἅ) : sM1 g Q Y d nu a p hQ t h l s r u o m j q=⟨l+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+0]!,s+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+1]!,r+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+2]!,u+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+3]!,o+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+4]!,m+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+5]!,j+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+6]!,q+Y.data[(J0 d)+(J0 t)]! * Q.data[(J0 a)+8*(J0 t)+7]!⟩:=by have C:=sMb1 Q Y d nu a p hQ t h have v : ∀ h,Y.uget (d+t) h=Y.data[(J0 d)+(J0 t)]! := λh=>by rw [kFU,C.1] have e : ∀ (k:Ἄ)(c:ℕ)(i:(J0 k)=c)(n:c≤7) h,Q.uget ((a+8*t)+k) h=Q.data[(J0 a)+8*(J0 t)+c]! := λk c i n h=>by rw [kFU,kSm (a+8*t) k (C0 (J1 (i ▸ n) _) C.2.2.2.2.1),i,C.2.1] unfold sM1; simp (disch:=decide) only [v,e 0 0 kc0 n5d0,e 1 1 kc1 n5d1,e 2 2 kc2 n5d2,e 3 3 kc3 n5d3,e 4 4 kc4 n5d4,e 5 5 kc5 n5d5,e 6 6 kc6 n5d6,e 7 7 kc7 n5d7,w (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 d)+s]! * Q.data[(J0 c)+8*s+0]!) (J0 nu) (J0 t) k,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+1]!) (J0 nu) (J0 t) q,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+2]!) (J0 nu) (J0 t) p,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+3]!) (J0 nu) (J0 t) r,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+4]!) (J0 nu) (J0 t) n,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+5]!) (J0 nu) (J0 t) l,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+6]!) (J0 nu) (J0 t) j,ao (λs=>Y.data[(J0 d)+s]! * Q.data[(J0 c)+8*s+7]!) (J0 nu) (J0 t) o⟩:=by intro m; induction m using O4 with | _ m u => intro t e k q p r n l j o v have T:=sMbT Q Y d nu c i hQ t e by_cases h3:(J0 t) < (J0 nu) · by_cases h2:(J0 t)+1 < (J0 nu) · have B:=sMb Q Y d nu c i hQ t h3 h2 have g : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=ao f (J0 nu) ((J0 t)+2) ((a+f (J0 t))+f ((J0 t)+1)):=λf a=>by rw [aos f _ _ a h3,aos f _ _ _ h2] rw [sM,AT (ε.mpr (by rw [T]; exact h2))]; simp only [sM1_spec false Q Y d nu c i hQ (FMok_f _ _ _ _ _)] rw [u ((J0 nu)-(J0 (t+2))) (by rw [B.1, ← v]; exact Z3 h3 (V4 ж)) (t+2) _ _ _ _ _ _ _ _ _ rfl] simp only [B.1,T,g] · have g : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a+f (J0 t):=λf a=>by rw [aos f _ _ a h3,aoe f _ _ _ (V3 h2)] rw [sM,dite_eq_right (λh=>h2 (by rw [← T]; exact ε.mp h)),AT (ε.mpr h3),sM1_spec false Q Y d nu c i hQ (FMok_f _ _ _ _ _)] simp only [g] · have g : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=λf a=>aoe f _ _ a (V3 h3) rw [sM,dite_eq_right (λh=>h3 (N5 (show (J0 t)+1 < (J0 nu) by rw [← T]; exact ε.mp h))),dite_eq_right (λh=>h3 (ε.mp h))] simp only [g] @[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 ж 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 ж 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 ж 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 ж 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 ж 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 ж 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 ж 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 ж S7 g7 h2) lemma w8_size(S:ἀ)(o:Ἄ)(y:A8)(h:(J0 o)+7<(kS S))(a:(J0 o)+7<2^(31:Ἀ)):(kS (w8 S o y h a))=(kS S):=by unfold w8;dsimp only;simp only[uZ] lemma w8_st (S d:ἀ)(o k:Ἄ)(c:ℕ)(a:(J0 k)=c)(l:c≤7)(v:Ἅ)(lz:ℕ→Ἅ)(i:v=lz c)(h:(J0 o)+7<(kS S))(j:(J0 o)+7<2^(31:Ἀ)) (H:∀ q,S.data[q]! = if (J0 o) ≤ q∧q < (J0 o)+c then lz (q-(J0 o)) else d.data[q]!) : ∀ q,(S.uset (o+k) v (kIx7 o k c a l S h j)).data[q]! = if (J0 o) ≤ q∧q < (J0 o)+(c+1) then lz (q-(J0 o)) else d.data[q]! := by intro q; rw [kFS,kSm o k щ,a,H] by_cases e:(J0 o)+c=q · subst e; rw [AD rfl,AD щ,i,ϱ] · rw [AC e]; by_cases g:(J0 o) ≤ q∧q < (J0 o)+c · rw [AD g,AD щ] · rw [AC g,AC щ] lemma w8_spec(S:ἀ)(o:Ἄ)(y:A8)(h:(J0 o)+7<(kS S))(a:(J0 o)+7<2^(31:Ἀ))(q:ℕ): (w8 S o y h a).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 j : ∀ 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]! := λq=>by rw [AC щ] have l:=w8_st S S o 0 0 kc0 ж y.a0 _ (by simp [lsel]) h a j have c:=w8_st _ S o 1 1 kc1 ж y.a1 _ (by simp [lsel]) (by simp only [uZ]; exact h) a l have m:=w8_st _ S o 2 2 kc2 ж y.a2 _ (by simp [lsel]) (by simp only [uZ]; exact h) a c have e:=w8_st _ S o 3 3 kc3 ж y.a3 _ (by simp [lsel]) (by simp only [uZ]; exact h) a m have k:=w8_st _ S o 4 4 kc4 ж y.a4 _ (by simp [lsel]) (by simp only [uZ]; exact h) a e have g:=w8_st _ S o 5 5 kc5 ж y.a5 _ (by simp [lsel]) (by simp only [uZ]; exact h) a k have d:=w8_st _ S o 6 6 kc6 ж y.a6 _ (by simp [lsel]) (by simp only [uZ]; exact h) a g have i:=w8_st _ S o 7 7 kc7 ж y.a7 _ (by simp [lsel]) (by simp only [uZ]; exact h) a d exact i q lemma sPb(n G g a Ys e d c:ℕ)(m:g rfl lemma n5g(g G k:ℕ)(a:k<3)(h:g+3<=G):g+k⟨⟨a0,a1,a2,a3,a4,a5,a6,a7⟩,⟨c0,c1,c2,c3,c4,c5,c6,c7⟩,⟨d0,d1,d2,d3,d4,d5,d6,d7⟩⟩ | 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:=N5 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 lemma sM24_spec(g:Ἆ)(Q Y:ἀ)(c nu e h k0:Ἄ)(j:(J0 c)+(J0 nu)<=(kS Y)/\(J0 c)+(J0 nu)<2^(31:Ἀ))(i:((J0 e)+8*(J0 nu)<=(kS Q)/\(J0 e)+8*(J0 nu)<2^(31:Ἀ)))(I:((J0 h)+8*(J0 nu)<=(kS Q)/\(J0 h)+8*(J0 nu)<2^(31:Ἀ)))(H:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(N:FMok g Q Y c e nu)(M:FMok g Q Y c h nu)(O:FMok g Q Y c k0 nu) : ∀ f (t:Ἄ)(J:(J0 t)+2*f=(J0 nu))(D x m w A l u B c0 p v k y c5 z c7 d0 G n q d4 o F d7:Ἅ), sM24 g Q Y c nu e h k0 j i I H f t J D x m w A l u B c0 p v k y c5 z c7 d0 G n q d4 o F d7 = ⟨⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+0]!) (J0 nu) (J0 t) D,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+1]!) (J0 nu) (J0 t) x,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+2]!) (J0 nu) (J0 t) m,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+3]!) (J0 nu) (J0 t) w,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+4]!) (J0 nu) (J0 t) A,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+5]!) (J0 nu) (J0 t) l,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+6]!) (J0 nu) (J0 t) u,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+7]!) (J0 nu) (J0 t) B⟩,⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+0]!) (J0 nu) (J0 t) c0,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+1]!) (J0 nu) (J0 t) p,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+2]!) (J0 nu) (J0 t) v,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+3]!) (J0 nu) (J0 t) k,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+4]!) (J0 nu) (J0 t) y,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+5]!) (J0 nu) (J0 t) c5,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+6]!) (J0 nu) (J0 t) z,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 h)+8*s+7]!) (J0 nu) (J0 t) c7⟩,⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+0]!) (J0 nu) (J0 t) d0,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+1]!) (J0 nu) (J0 t) G,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+2]!) (J0 nu) (J0 t) n,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+3]!) (J0 nu) (J0 t) q,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+4]!) (J0 nu) (J0 t) d4,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+5]!) (J0 nu) (J0 t) o,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+6]!) (J0 nu) (J0 t) F,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+7]!) (J0 nu) (J0 t) d7⟩⟩:=by intro f;induction f with | zero=>intro t J;simp only[aoe _ (J0 nu) (J0 t) _ J.ge];intros;rfl | succ f U=> intro t J D x m w A l u B c0 p v k y c5 z c7 d0 G n q d4 o F d7 have L:=n5p t nu f J have K:=N5 L have S:∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=ao f (J0 nu) ((J0 t)+2) ((a+f (J0 t))+f ((J0 t)+1)):=λf a=>by rw [aos f _ _ a K,aos f _ _ _ L] erw[U];simp only[st24_spec g Q Y c nu e h k0 j i I H N M O,(sMb Q Y c nu e j i t K L).1,(sMb1 Q Y c nu e j i t K).2.2.2.2.2,S] lemma 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 lemma 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 lemma sM24P_spec(d:Ἆ)(Q Y:ἀ)(c nu e g k0:Ἄ)(o:(J0 c)+(J0 nu)<=(kS Y)/\(J0 c)+(J0 nu)<2^(31:Ἀ))(m:((J0 e)+8*(J0 nu)<=(kS Q)/\(J0 e)+8*(J0 nu)<2^(31:Ἀ)))(p:((J0 g)+8*(J0 nu)<=(kS Q)/\(J0 g)+8*(J0 nu)<2^(31:Ἀ)))(l:((J0 k0)+8*(J0 nu)<=(kS Q)/\(J0 k0)+8*(J0 nu)<2^(31:Ἀ)))(j:FMok d Q Y c e nu)(i:FMok d Q Y c g nu)(k:FMok d Q Y c k0 nu)(n:ℕ)(en:(J0 nu)=n)(I B t A F r y G c0 w z q C c5 D c7 d0 K u x d4 v J d7:Ἅ) : sM24P d Q Y c nu e g k0 o m p l n en I B t A F r y G c0 w z q C c5 D c7 d0 K u x d4 v J d7 = ⟨⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+0]!) (J0 nu) 0 I,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+1]!) (J0 nu) 0 B,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+2]!) (J0 nu) 0 t,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+3]!) (J0 nu) 0 A,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+4]!) (J0 nu) 0 F,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+5]!) (J0 nu) 0 r,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+6]!) (J0 nu) 0 y,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 e)+8*s+7]!) (J0 nu) 0 G⟩,⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+0]!) (J0 nu) 0 c0,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+1]!) (J0 nu) 0 w,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+2]!) (J0 nu) 0 z,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+3]!) (J0 nu) 0 q,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+4]!) (J0 nu) 0 C,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+5]!) (J0 nu) 0 c5,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+6]!) (J0 nu) 0 D,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 g)+8*s+7]!) (J0 nu) 0 c7⟩,⟨ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+0]!) (J0 nu) 0 d0,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+1]!) (J0 nu) 0 K,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+2]!) (J0 nu) 0 u,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+3]!) (J0 nu) 0 x,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+4]!) (J0 nu) 0 d4,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+5]!) (J0 nu) 0 v,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+6]!) (J0 nu) 0 J,ao (λs=>Y.data[(J0 c)+s]! * Q.data[(J0 k0)+8*s+7]!) (J0 nu) 0 d7⟩⟩:=by unfold sM24P;split ·have H:=n5o nu n en ‹_›;rw[kc0] at H simp only[sM24_spec d Q Y c nu e g k0 o m p l j i k,st24_spec d Q Y c nu e g k0 o m p l j i k,kc0,kc1,aos _ _ _ _ H.1] ·simp only[sM24_spec d Q Y c nu e g k0 o m p l j i k,kc0] @[inline] def zR(v:Ἅ)(relu:Ἆ)(H:ἆ):ἇ:= let c:=ak v H if c<(4294967296:ἆ) then (let w:=O2 c; w&&&((if relu then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))) else (0xFFFFFFFF:ἇ) @[inline] def zQ(v:Ἅ)(relu:Ἆ)(H:ἆ):ἇ:= let b:=v.toBits;let E:=eF b;let d:=H+1075-E;let g:=(1:ἆ)<<>>29)&&&8388607!=0 then let w:=O2 (((b>>>63)<<<31)+(t>>>29)-0x255000000) if relu then (if w<0x80000000 then w else 0) else w else 0xFFFFFFFF lemma zQu(b:ἆ):(b+268435456)&&&536870911=((b&&&0xfffffffffffff)+268435456)&&&536870911:=by apply ξ.1;simp only[Ε,η];rw[show (536870911:ἆ).toNat=2^29-1 from rfl,show (0xfffffffffffff:ἆ).toNat=2^52-1 from rfl,show (268435456:ἆ).toNat=2^28 from rfl,ζ,ζ,ζ];have:=b.toNat_lt;omega lemma zQr(b:ἆ):((b+268435456)>>>(29:ἆ))&&&(8388607:ἆ)=(((b&&&(0x7FFFFFFFFFFFFFFF:ἆ))+268435456)>>>(29:ἆ))&&&(8388607:ἆ):=by apply ξ.1;simp only[Ε,η,ν];rw[show (8388607:ἆ).toNat=2^23-1 from rfl,show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,show (268435456:ἆ).toNat=2^28 from rfl,show (29:ἆ).toNat%64=29 from rfl];simp only[ζ,β];have:=b.toNat_lt;omega lemma zQm(a:Ἆ)(w:ἇ):w&&&((if a then (0:ἇ) else (0xFFFFFFFF:ἇ))|||((w>>>31)-1))=(if a then (if w<0x80000000 then w else 0) else w):=by have c:w&&&(4294967295:ἇ)=w:=by apply Β.1;rw[Ξ,show (4294967295:ἇ).toNat=2^32-1 from rfl,ζ];exact γ w.toNat_lt have l:=w.toNat_lt by_cases h:w<0x80000000 · have z:w>>>31=0:=by apply Β.1;rw[Υ,β];rw[Ι]at h;simp at h⊢;omega cases a<;>simp only[z,h,ἁ,υ,ἂ]<;>exact c · have z:w>>>31=1:=by apply Β.1;rw[Υ,β];rw[Ι]at h;simp at h⊢;omega cases a<;>simp only[z,h,ἁ,υ,ἂ] · exact c · apply Β.1;rw[Ξ];simp lemma zQeq(v:Ἅ)(a:Ἆ)(H:ἆ):zQ v a H=zR v a H:=by unfold zQ zR ak eF;dsimp only;generalize v.toBits=b;rw[zQu b,zQr b];split · rename_i g;simp only[Η,AJ]at g;obtain⟨⟨⟨-,c⟩,-⟩,-⟩:=g;have l:=b.toNat_lt rw[μ,Ζ,Ε,ν]at c;simp only[show (2047:ἆ).toNat=2^11-1 from rfl,ζ,β]at c;simp only[kA,kH,nr,Nat.reduceSub]at c have j:b.toNat%2^63=b.toNat%2^52+2^52*(b.toNat/2^52%2^11):=by rw[show (2:Ἀ)^63=2^52*2^11 from rfl];exact We have i:b.toNat%2^52<2^52:=ϊ _ (϶ 52) have k:b.toNat%9223372036854775808<1448*2^52∧1195*2^52<=b.toNat%9223372036854775808:=by rw[show (9223372036854775808:Ἀ)=2^63 from rfl,j];clear*-c i;omega have nw:(b.toNat%9223372036854775808+268435456)%18446744073709551616=b.toNat%9223372036854775808+268435456:=γ (by clear*-;omega) have n:10024386560<=(b.toNat%9223372036854775808+268435456)/536870912∧(b.toNat%9223372036854775808+268435456)/536870912<=12146704384:=by clear*-k;omega have o:b.toNat/9223372036854775808<=1:=by clear*-l;omega have e:((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000<(4294967296:ἆ):=by rw[μ,Ζ,η,ψ,ν,ν,η,Ε];simp only[show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,ζ,β,ο];simp;rw[nw];clear*-n o;omega rw[AD e] have h:O2 (((b>>>63)<<<31)+((b+268435456)>>>29)-0x255000000)=O2 (((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000):=by apply Β.1;simp only[Ϫ,Ζ,η,ψ,ν,Ε];simp only[show (0x7FFFFFFFFFFFFFFF:ἆ).toNat=2^63-1 from rfl,ζ,β,ο];simp;rw[nw];clear*-l k;omega rw[h,zQm] · simp lemma kAkBig (S:Ἅ):ak S 4000=4294967296:=by unfold ak; unfold F.eF; dsimp only generalize S.toBits=b rw [AC] intro h simp only [Η,AJ] at h obtain ⟨⟨⟨a, -⟩, -⟩, -⟩:=h have d:((b>>>52)&&&2047).toNat ≤ 2047:=by rw [Ε]; exact ϝ have c:(b>>>52)&&&2047 ≤ (4000:ἆ)+1075:=by rw [θ]; exact d.trans ж rw [θ,χ _ _ c] at a have:((4000:ἆ)+1075).toNat=5075:=by decide rw [this] at a; have:(26:ἆ).toNat=26:=by decide omega lemma kZRBig (v:Ἅ)(a:Ἆ):zR v a 4000=(0xFFFFFFFF:ἇ):=by unfold zR; rw [kAkBig]; rfl lemma kZR (v:Ἅ)(H:ἆ)(a:Ἆ)(n:ℕ)(D c:ℕ→Ἃ)(h:Ἃ)(d:h=p8 a (ms (n+1) D c)) (g:aG (n+1) D c)(e:fv v)(i:|rv v-(af (n+1) D c:ℝ)| ≤ (2:ℝ)^((H.toNat:ℕ):ℤ))(b2:|(af (n+1) D c:ℝ)| ≤ (2:ℝ)^(425:ℤ))(k:H.toNat ≤ 600) : (if zR v a H==(0xFFFFFFFF:Ἃ) then h else zR v a H)=p8 a (ms (n+1) D c):=by unfold zR; dsimp only by_cases hc:ak v H < (4294967296:ἆ) · have R:=cw (n+1) D c g v e H (by omega) i b2 hc rw [AD hc,kReluW a _ (kAkF v H hc),R] by_cases hf:p8 a (ms (n+1) D c)=0xFFFFFFFF · rw [hf]; simp only [Az,ἁ]; rw [d,hf] · have j:(p8 a (ms (n+1) D c)==0xFFFFFFFF)=false:=by simpa using hf simp only [j,υ,ἂ] · simp only [AC hc,Az,ἁ]; exact d 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:ἆ)) lemma kOutR (a:Ἆ)(n:ℕ)(X W b E:Ἂ Ἃ)(ix i L H:ℕ)(Y Q:ἀ)(u l j:ℕ)(em cq d:ἆ)(v e:Ἅ) (F:∀ q:ℕ,kB X[q]! ≠ 255∧kG X[q]! ≤ ix)(r:∀ q:ℕ,kB b[q]! ≠ 255∧kG b[q]! ≤ H)(M:174+H ≤ i)(K:n+2 ≤ 2^L)(x:L≤27)(z:i+L≤425)(T:0Y.data[u+s]! * Q.data[j/8*n*8+j%8+8*s]!) n 0 (dw ld*dw b[j]!)) (y:e=ao (λk=>dw (X[l+k]! &&& 0x7FFFFFFF)) n 0 0) (h:cq=23+cEq (I0 (9*(n+1))).toInt64.toFloat e) (A:d=(i+L-50).toUInt64) (C:(E[j]!).toNat ≤ em.toNat)(p:em.toNat < 255) : oR a n X W b E ix i L Y Q u l em cq d j v=p8 a (ms (n+1) (λs=>if s < n then X[l+s]! else ld) (λs=>if s < n then W[j*n+s]! else b[j]!)):=by have I:=kOutV a n X W b E ix i L H Y Q u l j cq d v e F r M K x z T t D B N y h A unfold oR by_cases hP:((if em<(56:ἆ) then (56:ἆ) else em)+cq)<=(372:ἆ) · rw[AD hP] have c:=kCEb (I0 (9*(n+1))).toInt64.toFloat e have m:=(ϩ E[j]!).trans_lt (C0 C p) have w:=θ.1 hP have mE:((if (E[j]!).toUInt64<(56:ἆ) then (56:ἆ) else (E[j]!).toUInt64)+cq).toNat≤((if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat:=by rw[h,kOutW_h1 _ _ m c,kOutW_h1 _ _ p c];exact L1 (L1 (max_le_max_right 56 ((ϩ _).trans_le C)) 23) _ obtain ⟨g,G,U,b2,_,J⟩:=kOutW n X W b E ix i L H Y Q u l j cq d _ v e F r M K x z T t D B N y h A rfl m (θ.2 (mE.trans w)) rw[kOutW_h2] at J exact kZR v _ a n _ _ _ I g G (AZ U (dZ6 (by rw[kOutW_h2,kOutW_h2];exact max_le_max_left _ mE))) b2 (by rw[kOutW_h2];exact max_le ((le_max_left _ _).trans J) (w.trans ж)) · rw[AC hP,kZRBig];simp only[Az,ἁ];exact I structure DC where relu:Ἆ n:Nat X:Ἂ ἇ K:DK ix:Nat ib:Nat L:Nat Y:ἀ hb:ἆ em:ἆ f9:Ἅ arm:Ἆ @[reducible,inline] def DC.W(c:DC):Ἂ ἇ:=c.K.W @[reducible,inline] def DC.b(c:DC):Ἂ ἇ:=c.K.b @[reducible,inline] def DC.E(c:DC):Ἂ ἇ:=c.K.E @[reducible,inline] def DC.Q(c:DC):ἀ:=c.K.Q @[reducible,inline] def DC.Bd(c:DC):ἀ:=c.K.Bd abbrev FMc(c:DC)(vo n G:Nat):Prop:=∀ 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 lemma dnS_eq(c:DC)(a d:Nat)(cq:ἆ)(j:Nat)(v:Ἅ):dnS c a d 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 a d 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 g; rw [AC (show ¬(lg 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 (λ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 (λ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 (λ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 (λ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 (λ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 (λk hk=>by rw [r6.2,r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk)).1 lemma dn8_size(c:DC)(p m:Nat)(cq H:ἆ)(j:Nat)(d q s:Ἄ)(a:Ἂ ἇ)(hin)(g n l o i h e k:Ἅ): (dn8 c p m cq H j d q s a hin g n l o i h e k).size=a.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 lemma dn1_ne(c:DC)(e g:Nat)(cq H:ἆ)(j:Nat)(l a q s:Ἄ)(v:Ἅ)(d:Ἂ ἇ)(hin)(i:Nat) (h:¬(l h k.toNat (ε.mp g.1) (by rw [← dnIx q s k (V6 o) hq]; exact g.2) unfold dn8; dsimp only rw [dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ (N 7 (by rw [kc7])),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))] lemma dn8_hit(c:DC)(y v:Nat)(cq H:ἆ)(j:Nat)(d q s:Ἄ)(i:Ἂ ἇ)(hin)(o w u x r p n t:Ἅ)(l:Nat) (A:lby split · subst l;rw[← dnIx q s k щ hq,dn1_hit _ _ _ _ _ _ _ _ _ _ _ _ _ (ε.mpr A)] · exact dn1_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ λg=>‹¬_› (B6 h (D6 ((dnIx q s k (V6 B) hq).symm.trans g.2))) unfold dn8;simp only[N,kD,Hz];interval_cases l<;>simp only[lsel,Nat.reduceEqDiff,↓reduceIte] noncomputable def dnT(c:DC)(n vo rn:Nat)(cq H:ἆ)(o:Nat):ἇ:= dnV c vo rn cq H o (ao (λs=>c.Y.data[vo+s]! * c.Q.data[o/8*n*8+8*s+o%8]!) n 0 (c.Bd.data[o]!)) lemma dnQ(c a:Ἄ)(G g:Nat)(i:g+1<=G)(hq:c.toNat+8*G*a.toNat<2^(31:Nat))(e:(G0 (8*g)).toNat=8*g): (c+(G0 (8*g))*a).toNat=c.toNat+8*g*a.toNat∧(c+(G0 (8*g))*a).toNat+8*a.toNat<2^(31:Nat):=by have m:8*g*a.toNat+8*a.toNat<=8*G*a.toNat:=by rw [← Ϡ]; exact ι _ щ have d:=kMm (G0 (8*g)) a (by rw [e]; exact C0 ((V1 (8*g*a.toNat) (8*a.toNat)).trans (m.trans (H0 _ _))) hq) rw [e] at d have h:(c+(G0 (8*g))*a).toNat=c.toNat+8*g*a.toNat:=by rw [kSm _ _ (by rw [d]; exact C0 (J1 ((V1 _ _).trans m) _) hq),d] exact ⟨h,by rw [h,pA]; exact C0 (J1 m _) hq⟩ lemma dnHin(e c:Ἄ)(ow G g:Nat)(d:Ἂ ἇ)(h:g+1<=G)(hq:e.toNat+8*G*c.toNat<2^(31:Nat))(p:(G0 (8*g)).toNat=8*g) (i:∀ 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 (λ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 (λ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 (λ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 (λ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 (λ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 (λk hk=>by rw [r6.2,r5.2,r4.2,r3.2,r2.2,r1.2,r0.2]; exact hin k hk)).1 lemma dn8G_eq(c:DC)(t:Ἆ)(d:t=c.relu)(s o:Nat)(cq H:ἆ)(j:Nat)(q:Ἄ)(a:Ἂ ἇ)(e:∀ 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 (O8.mpr hr).symm vo rn cq H j q out (λ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 lemma dn8D_eq(c:DC)(t o:Nat)(cq H:ἆ)(j:Nat)(a q s:Ἄ)(d:Ἂ ἇ)(e:∀ k:Ἄ,kY.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+0]!) (J0 nu) (J0 t) a0) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+1]!) (J0 nu) (J0 t) a1) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+2]!) (J0 nu) (J0 t) a2) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+3]!) (J0 nu) (J0 t) a3) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+4]!) (J0 nu) (J0 t) a4) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+5]!) (J0 nu) (J0 t) a5) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+6]!) (J0 nu) (J0 t) a6) (ao (λs=>Y.data[(J0 vo)+s]! * Q.data[(J0 i0)+8*s+7]!) (J0 nu) (J0 t) a7):=by intro m; induction m using O4 with | _ m ih => intro t ht0 a0 a1 a2 a3 a4 a5 a6 a7 hm rw [mc8] by_cases h:taos f _ _ a h1 simp only [sM1_spec c.arm Q Y vo nu i0 hY hQ hF,e1,st] · simp only [dite_eq_right h] have st : ∀ (f:ℕ→Ἅ)(a:Ἅ),ao f (J0 nu) (J0 t) a=a:=λf a=>aoe f _ _ a (V3 (λh3=>h (ε.mpr h3))) simp only [st] lemma mc8_eq(c:DC)(vN rN:Nat)(cq H:ἆ)(j:Nat)(cnt q s:Ἄ)(out:Ἂ ἇ)(hin:∀ k:Ἄ,k intro t d x u o y v n p w A rw[mc8];split ·rename_i h;have D:=sMbT Q Y i nu g r hQ t d;exact B _ (by rw[← A,D];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 D;exact ⟨D.trans_le (F6 _ _),Yo (D.trans_le (T9 _ _))⟩ have ix:∀ l,(j+(G0 (8*g))*a).toNat+l*a.toNat=j.toNat+(8*g+l)*a.toNat:=λl=>by rw[N.1,Ϡ,pA] refine⟨dn8_size ..,λi hi=>dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i N.2 (λl D e=>hi (8*g+l) (F l D).2 (V1 _ _) (O1 (F l D).1 _) (by rw[←ix];exact e)),λo ho T h2=>?_⟩ have W:=K3 T h2 have D:o-8*g<(G0 (min 8 (ow-8*g))).toNat:=by rw[ec];exact Nat.lt_min.2 ⟨W,Vk T ho⟩ have V:j.toNat+o*a.toNat=(j+(G0 (8*g))*a).toNat+(o-8*g)*a.toNat:=by rw[ix,M3 T] rw[V,dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*g) D W N.2 M] rw[sM_spec _ _ _ _ _ _ _ _ 0 _ _ _ _ _ _ _ _ _ rfl] have z:∀ (k:Ἄ)(J:Nat)(O:k.toNat=J)(S:J≤7) h,c.Bd.uget (G0 (8*g)+k) h=c.Bd.data[8*g+J]!:=λk J O S h=>by rw[kFU,kSm _ k (C0 (J1 (O ▸ S) _) B.2.2.2.2.1),O,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,z 0 0 kc0 n5d0,z 1 1 kc1 n5d1,z 2 2 kc2 n5d2,z 3 3 kc3 n5d3,z 4 4 kc4 n5d4,z 5 5 kc5 n5d5,z 6 6 kc6 n5d6,z 7 7 kc7 n5d7] rw[lselAo (λl s=>c.Y.data[m+s]! * c.Q.data[g*n*8+8*s+l]!) (λl=>c.Bd.data[8*g+l]!) n 0 (o-8*g) W] have Y:o/8=g:=by clear * - T h2;omega have X:o%8=o-8*g:=by clear * - T h2;omega unfold dnT;rw[Y,X,M3 T] lemma 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 (λk hk=>by rw [s1]; exact e2 k hk) d0 d1 d2 d3 d4 d5 d6 d7 @[inline] def dnW24(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:id _:=dnQ m d G (g+1) q1 hq B1.2.2.2.2.2.2.2.2 rw[←ad]at Q1 have K:∀ l,(m+(t+8)*d).toNat+l*d.toNat=m.toNat+(8*(g+1)+l)*d.toNat:=λl=>by rw[Q1.1,Ϡ,pA] have Q2:id _:=dnQ m d G (g+2) q2 hq B2.2.2.2.2.2.2.2.2 rw[←aL]at Q2 have I:∀ l,(m+(t+16)*d).toNat+l*d.toNat=m.toNat+(8*(g+2)+l)*d.toNat:=λl=>by rw[Q2.1,Ϡ,pA] have ec:(G0 (min 8 (ow-8*(g+2)))).toNat=min 8 (ow-8*(g+2)):=s5tu _ (C0 (F6 _ _) ж) refine ⟨by unfold dnW24 fin24;simp only[dn8D_eq,dn8_size],λi hi=>?_,λo ho a h2=>?_⟩ ·unfold dnW24 fin24;simp only[dn8D_eq] rw[dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q2.2 (fun l v e=>have q:=x8C2 g l ow (ec▸v);hi (8*(g+2)+l) q.1 q.2.1 q.2.2 (by rw[←I];exact e)), dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q1.2 (λl v e=>have q:=x8C1 g l ow G 1 O S ж (kc8▸v);hi (8*(g+1)+l) q.1 q.2.1 q.2.2 (by rw[←K];exact e)), dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ i Q0.2 (λl v e=>have q:=x8C1 g l ow G 0 O S ж (kc8▸v);hi (8*g+l) q.1 q.2.1 q.2.2 (by rw[←M];exact e))] have Z:∀ k (s:Ἄ),(J0 s)=8*k→(J0 s)+7<2^31→∀ q h,q.toNat≤7→c.Bd.uget (s+q) h=c.Bd.data[8*k+q.toNat]!:=λk s e b q h hc=>by rw[kFU,kSm _ q (C0 (J1 hc _) b),e] have T:r.toNat=p:=L▸U.2.2.2.2.2.1 have X:nU.toNat=n:=J▸U.2.2.2.2.2.2.1 have al:iU.toNat=g*n*8:=C▸U.2.2.2.2.2.2.2.1 have ax:(iU+j).toNat=(g+1)*n*8:=aH▸B1.2.2.2.2.2.2.2.1 have aU:(iU+j+j).toNat=(g+2)*n*8:=a2▸B2.2.2.2.2.2.2.2.1 have F0:=FMc_ok c p n G g r nU iU T X al q0 hF have F1:=FMc_ok c p n G (g+1) r nU (iU+j) T X ax q1 hF have F2:=FMc_ok c p n G (g+2) r nU (iU+j+j) T X aU q2 hF by_cases p2:8*(g+2)<=o ·have Y:=x8C0 o (g+2) p2 h2 have v:o-8*(g+2)<(G0 (min 8 (ow-8*(g+2)))).toNat:=by rw[ec];exact Nat.lt_min.2 ⟨Y.2.2,Vk p2 ho⟩ have eo:m.toNat+o*d.toNat=(m+(t+16)*d).toNat+(o-8*(g+2))*d.toNat:=by rw[I,M3 p2] rw[eo];unfold dnW24 fin24;simp only[dn8D_eq] rw[dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+2)) v Y.2.2 Q2.2 w] rw[sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2];dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only[T,X,aU,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,Z (g+2) (t+16) (aL▸B2.2.2.2.2.2.2.2.2) (aL▸B2.2.2.2.2.1)] rw[lselAo (λl s=>c.Y.data[p+s]! * c.Q.data[(g+2)*n*8+8*s+l]!) (λl=>c.Bd.data[8*(g+2)+l]!) n 0 (o-8*(g+2)) Y.2.2] unfold dnT;rw[Y.1,Y.2.1,M3 p2] by_cases p1:8*(g+1)<=o ·have Y:=x8C0 o (g+1) p1 (U5.1 p2) have v:o-8*(g+1)<(8:Ἄ).toNat:=by rw[kc8];exact Y.2.2 have eo:m.toNat+o*d.toNat=(m+(t+8)*d).toNat+(o-8*(g+1))*d.toNat:=by rw[K,M3 p1] rw[eo];unfold dnW24 fin24;simp only[dn8D_eq] rw[dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (λl F e=>by rw[I,K,M3 p1]at e;exact p2 ((V1 _ _).trans_eq (B6 w (D6 e))))] rw[dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*(g+1)) v Y.2.2 Q1.2 w] rw[sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2];dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only[T,X,ax,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,Z (g+1) (t+8) (ad▸B1.2.2.2.2.2.2.2.2) (ad▸B1.2.2.2.2.1)] rw[lselAo (λl s=>c.Y.data[p+s]! * c.Q.data[(g+1)*n*8+8*s+l]!) (λl=>c.Bd.data[8*(g+1)+l]!) n 0 (o-8*(g+1)) Y.2.2] unfold dnT;rw[Y.1,Y.2.1,M3 p1] ·have Y:=x8C0 o g a (U5.1 p1) have v:o-8*g<(8:Ἄ).toNat:=by rw[kc8];exact Y.2.2 have eo:m.toNat+o*d.toNat=(m+t*d).toNat+(o-8*g)*d.toNat:=by rw[M,M3 a] rw[eo];unfold dnW24 fin24;simp only[dn8D_eq] rw[dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q2.2 (λl F e=>by rw[I,M,M3 a]at e;exact p1 ((U0 8 (B5 _)).trans ((V1 _ _).trans_eq (B6 w (D6 e)))))] rw[dn8_ne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Q1.2 (λl F e=>by rw[K,M,M3 a]at e;exact p1 ((V1 _ _).trans_eq (B6 w (D6 e))))] rw[dn8_hit _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (o-8*g) v Y.2.2 Q0.2 w] rw[sM24P_spec c.arm _ _ _ _ _ _ _ _ _ _ _ F0 F1 F2];dsimp only simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];decide)) only[T,X,al,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,Z g t (u▸U.2.2.2.2.2.2.2.2) (u▸U.2.2.2.2.1)] rw[lselAo (λl s=>c.Y.data[p+s]! * c.Q.data[g*n*8+8*s+l]!) (λl=>c.Bd.data[8*g+l]!) n 0 (o-8*g) Y.2.2] unfold dnT;rw[Y.1,Y.2.1,M3 a] lemma dnW8_size(c:DC)(n G ow e w:Nat)(cq H:ἆ)(s i d nU:Ἄ)(v:e+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(l:8*G<=c.Bd.size)(j:e+n<2^(31:Nat))(k:n*(8*G)<2^(31:Nat))(m:8*G<2^(31:Nat))(p:d=G0 e)(t:nU=G0 n)(hq:s.toNat+8*G*i.toNat<2^(31:Nat))(g:Nat)(x:gby rw [dnW24_size]; exact hin o ho) else dnP c n G ow vo rn cq H q0 qs voU nU hY hQ hBd hB1 hB2 hB3 hvo hnU hq hG2 n8U hn8 (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) (λ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 lemma dnP_spec(c:DC)(n G ow y J:Nat)(cq H:ἆ)(C z r nU:Ἄ)(K:y+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(s:8*G<=c.Bd.size)(v:y+n<2^(31:Nat))(w:n*(8*G)<2^(31:Nat))(u:8*G<2^(31:Nat))(x:r=G0 y)(t:nU=G0 n)(hq:C.toNat+8*G*z.toNat<2^(31:Nat))(D:8*G<=ow+7)(m:Ἄ)(q:m=G0 (n*8))(hG:ow<=8*G)(T:FMc c y n G)(B:0 intro g A iU l d a j O rw[dnP] split · rename_i N split · rename_i L have W:=dnW24_spec c n G ow y J cq H C z r nU K hQ s v w u x t hq D m q g L.2 A iU l d a j T B have I:=S (G-(g+3)) (by rw[←O];exact dnLt3 G g L.2) (g+3) _ _ (dnO g A 3 l) (dnI g n 3 iU m d q) _ (λo ho=>by rw[W.1];exact j o ho) rfl refine⟨by rw[I.1,W.1],λi hi=>?_,λo ho F=>?_⟩ · rw[I.2.1 i (λo ho h e=>hi o ho ((U0 8 (V1 g 3)).trans h) e),W.2.1 i (λo ho F _ e=>hi o ho F e)] · by_cases p:o<8*g+24 · rw[I.2.1 _ (λV M U e=>U5.2 p ((Ht 8 g 3).symm.trans_le (U.trans_eq (B6 B (D6 e))))),W.2.2 o ho F p] · exact I.2.2 o ho ((Ht 8 g 3).trans_le (X2.1 p)) · rename_i L have W:=dnW8_spec c n G ow y J cq H C z r nU K hQ s v w u x t hq g N A iU l d a j T B have I:=S (G-(g+1)) (by rw[←O];exact dnLt1 G g N) (g+1) _ _ (dnO g A 1 l) (dnI g n 1 iU m d q) _ (λo ho=>by rw[W.1];exact j o ho) rfl refine⟨by rw[I.1,W.1],λi hi=>?_,λo ho F=>?_⟩ · rw[I.2.1 i (λo ho h e=>hi o ho ((U0 8 (V1 g 1)).trans h) e),W.2.1 i (λo ho F _ e=>hi o ho F e)] · by_cases p:o<8*g+8 · rw[I.2.1 _ (λV M U e=>U5.2 p ((Ht 8 g 1).symm.trans_le (U.trans_eq (B6 B (D6 e))))),W.2.2 o ho F p] · exact I.2.2 o ho ((Ht 8 g 1).trans_le (X2.1 p)) · rename_i N exact⟨rfl,λi _=>rfl,λo ho F=>absurd ho (X2.2 (hG.trans ((U0 8 (X2.1 N)).trans F)))⟩ lemma dnP_sizeK(c:DC)(n G ow l F:Nat)(cq H:ἆ)(q y j nU:Ἄ)(C:l+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(p:8*G<=c.Bd.size)(v:l+n<2^(31:Nat))(w:n*(8*G)<2^(31:Nat))(t:8*G<2^(31:Nat))(x:j=G0 l)(r:nU=G0 n)(hq:q.toNat+8*G*y.toNat<2^(31:Nat))(u:8*G<=ow+7)(h:Ἄ)(s:h=G0 (n*8)) : ∀ k g (m iU:Ἄ)(i:m=G0 (8*g))(d:iU=G0 (g*n*8))(a:Ἂ ἇ)(e:∀ o intro g m iU i d a e z rw [dnP] split · rename_i D split · rename_i B; rw [A _ (by rw [← z]; exact dnLt3 G g B.2) _ _ _ _ _ _ _ rfl,dnW24_size] · rw [A _ (by rw [← z]; exact dnLt1 G g D) _ _ _ _ _ _ _ rfl,dnW8_size] · rfl lemma dnP_size(c:DC)(n G ow t z:Nat)(cq H:ἆ)(v w e nU:Ἄ)(y:t+n<=c.Y.size)(hQ:c.Q.size=n*(8*G))(h:8*G<=c.Bd.size)(q:t+n<2^(31:Nat))(r:n*(8*G)<2^(31:Nat))(l:8*G<2^(31:Nat))(s:e=G0 t)(j:nU=G0 n)(hq:v.toNat+8*G*w.toNat<2^(31:Nat))(p:8*G<=ow+7)(d:Ἄ)(k:d=G0 (n*8))(g:Nat)(x iU:Ἄ)(u:x=G0 (8*g))(i:iU=G0 (g*n*8))(a:Ἂ ἇ)(m:∀ 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)) (λ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) lemma 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):=H1 R (P4 n) have eq0:q0U.toNat=r*qr.toNat:=by rw [hq0]; exact dnQR r qr qs G (hq r hr) (N3 hr (C0 hR1 hRm)) 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:=λh=>by unfold dnCqE dnCq; rw [kFU,hvn,V.2.2.2] have lt:R-(r+1) ?_,λr' h1 h2 o ho => ?_⟩ · rw [(ih _ lt (r+1) _ _ _ _ _ _ rfl).1,dnP_size] · rw [(ih _ lt (r+1) _ _ _ _ _ _ rfl).2.1 i (λr' h1 h2 o ho e=>hi r' h1 (M4 h2) 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 _ hr) hs1 _ 0 0 0 _ _ out _ rfl).2.1 i (λ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 _ (λr'' h1' h2' o' ho' e'=>Vg _ (h2'.trans_eq (hD _ _ _ _ h1' h1 ho' ho e')))] 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 _ hr) hs1 _ 0 0 0 _ _ out _ rfl).2.2 o ho (ϟ _)] unfold dnH; rw [ecq] · exact (ih _ lt (r+1) _ _ _ _ _ _ rfl).2.2 r' h1 (U4 h2 (Ne.symm e)) o ho · rename_i hr exact ⟨rfl,λi _=>rfl,λr' h1 h2=>(hr (C0 h2 h1)).elim⟩ lemma dnT_ok(c:DC)(R ow G H:Nat)(r o:Nat)(A:rdw (c.X[u*c.n+s]! &&& 0x7FFFFFFF)) c.n 0 0 else dw c.X[u*c.n+t]!) (j:∀ 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 m:∀ sby have y:=j s h (o/8) (o%8) (ϊ _ ж) (by have:=ϛ o 8; omega) rw [show 8*(o/8)+o%8=o from ϛ o 8,AD ho] at y rw [show o/8*c.n*8+o%8+8*s=(o/8*c.n+s)*8+o%8 by ring]; exact y 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 p M B x z C (w o ho) (λs h=>(a r A s (U2 h)).trans (AC (K7 h))) m ?_ ((a r A c.n (le_refl _)).trans (AD rfl)) (by unfold dnCq; rw [v]) i (n o ho) k rw [d 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] lemma dnB2(n ow:Nat)(c:0by have:=ι ow (l7 hr); rw [Ο] at this; exact this dnR ⟨relu,n,X,K,ix,ib,L,Y,(ib+L-50).toUInt64,em,(I0 (9*(n+1))).toInt64.toFloat,Yarm⟩ n ow ((ow+7)/8) R (G0 n) (G0 (n+1)) (G0 (n*8)) (G0 ow) 1 rfl rfl rfl hYs hQ hBs hRm (dnB2 n ow hn hon) (dnB3 n ow hn hon) щ (λ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,Uw]) (mB (R*ow) (0:ἇ)) (λr hr o ho=>by rw [W3,eow,kc1,ϻ]; have:=hRo2 r hr; omega) else mj R n ow relu X W b lemma bQSg_spec (R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(ix ib L H:Ἀ)(K:DK)(Q:ἀ)(E:Ἂ Ἃ)(em32:ἇ)(Bd:ἀ)(eb:ἇ)(L2:Nat)(okk:Ἆ)(em:ἆ)(Y:ἀ) (hK:K=⟨W,b,Q,E,em32,Bd,eb,L2,okk⟩) (hn:0dw (X[r'*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[r'*n+t]!) (hBdv:∀ oby rw[eow,e1u];have:=ι ow (l7 hr);rw[Ο] at this;clear * - this h7;omega) (by clear * -;omega) (by rw[e1u];decide) (λr hr=>FMd _ n _ ow (r*(n+1)) (r*n) (λt ht=>(hYv r hr t ht.le).trans (AC (K7 ht))) hQv (λq=>(F q).1) (λo ho s hs h=>absurd ((hEv o ho s hs).trans (hEm o ho)) (by rw[show (kB W[o*n+s]!)=255 from h];exact U5.mpr hem))) (λ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,Uw]) (mB (R*ow) (0:ἇ)) (fun r hr o ho=>by rw[W3,eow,e1u,ϻ];have:=ι ow (l7 hr);rw[Ο] at this;clear * - this ho;omega) rfl unfold bQSg;dsimp only rw[AT h7] unfold mj linearWith apply mi (by rw[T.1];simp only[Ϝ,W3]) intro q hq hq' rw[Ϝ] at hq' simp only[Λ] rw[←AB _ q hq] have hpos:0by rw[h,A7] at hq';exact D4 _ 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:=zQ 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) (U2 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)) lemma sFG_size(relu:Ἆ)(H:ἆ)(fb:Ἄ->Ἅ->Ἃ)(S:ἀ)(st s0 q0 mu:Ἄ)(hS:(J0 s0)<(J0 st)∧(J0 st)*(J0 mu)<=(kS S)∧(J0 st)*(J0 mu)<2^(31:Ἀ))(hB:(J0 q0)+(J0 mu)<2^(31:Ἀ)) : ∀ m (j:Ἄ)(a:Ἂ Ἃ)(ha:(J0 q0)+(J0 mu)<=(O0 a)),(J0 mu)-(J0 j)=m → (O0 (sFG relu H fb S st s0 q0 mu hS hB j a ha))=(O0 a):=by intro m; induction m with | zero=>intro j a ha hm; rw [sFG,dite_eq_right (λh=>Lq0 _ _ hm (ε.mp h))] | succ m ih => intro j a ha hm; have HQ:=Lqs _ _ _ hm; have h1:=HQ.1 rw [sFG,AT (ε.mpr h1)]; dsimp only; rw [ih _ _ _ (by rw [ac (ε.mpr h1)]; exact HQ.2),BT] lemma sFG_sz(c:Ἆ)(H:ἆ)(k:Ἄ->Ἅ->Ἃ)(S:ἀ)(d g e mu:Ἄ)(h:(J0 g)<(J0 d)∧(J0 d)*(J0 mu)<=(kS S)∧(J0 d)*(J0 mu)<2^(31:Ἀ))(i:(J0 e)+(J0 mu)<2^(31:Ἀ)) (j:Ἄ)(a:Ἂ Ἃ)(l:(J0 e)+(J0 mu)<=(O0 a)) : (O0 (sFG c H k S d g e mu h i j a l))=(O0 a):=sFG_size c H k S d g e mu h i _ j a l rfl lemma sFG_spec(d:Ἆ)(H:ἆ)(s:Ἄ->Ἅ->Ἃ)(S:ἀ)(i l c mu:Ἄ)(r:(J0 l)<(J0 i)∧(J0 i)*(J0 mu)<=(kS S)∧(J0 i)*(J0 mu)<2^(31:Ἀ))(t:(J0 c)+(J0 mu)<2^(31:Ἀ)) : ∀ m (j:Ἄ)(a:Ἂ Ἃ)(o:(J0 c)+(J0 mu)<=(O0 a)),(J0 mu)-(J0 j)=m → (J0 j) ≤ (J0 mu) → ∀ q, (sFG d H s S i l c mu r t j a o)[q]! = if (J0 c)+(J0 j) ≤ q∧q < (J0 c)+(J0 mu) then (if zR (S.data[(J0 i)*(q-(J0 c))+(J0 l)]!) d H==(0xFFFFFFFF:ἇ) then s (G0 (q-(J0 c))) (S.data[(J0 i)*(q-(J0 c))+(J0 l)]!) else zR (S.data[(J0 i)*(q-(J0 c))+(J0 l)]!) d H) else a[q]! := by intro m; induction m with | zero=>intro j a o n v q; rw [sFG,dite_eq_right (λh=>Lq0 _ _ n (ε.mp h)),AC (Lqn _ _ _ _ (M0.mp n))] | succ m w => intro j a o n v q have u:=Lqs _ _ _ n; have k:=u.1 have p:=ac (ε.mpr k) have B:=sFGb S i l mu j r k rw [sFG,AT (ε.mpr k)]; dsimp only; simp only [zQeq] rw [w _ _ _ (by rw [p]; exact u.2) (by rw [p]; exact k),kAS,kSm c j (Lql _ _ _ _ k (U2 t)),kFU,B.1,p] by_cases e:(J0 c)+(J0 j)=q · subst e rw [AC (Lqa _ _ _),AD rfl,AD (Lqb _ _ _ k),ϱ,kTU] · by_cases g:(J0 c)+((J0 j)+1) ≤ q∧q < (J0 c)+(J0 mu) · rw [AD g,AD (Lqc _ _ _ _ g)] · rw [AC g,AC e,AC (Lqe _ _ _ _ g e)] lemma sPXb(d S:ἀ)(n ow o:Ἄ)(i:(J0 ow)*(J0 n)<=(kS d))(a:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ))(e:8*(J0 ow)<=(kS S))(h:(J0 o)<(J0 ow)) : (J0 (o*n))=(J0 o)*(J0 n)∧(J0 (o*n))+(J0 n)<=(kS d)∧(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 c:8*((J0 o)+1) ≤ 8*(J0 ow):=U0 _ h rw [Qm] at c have j:(J0 (o*n))=(J0 o)*(J0 n):=kMm _ _ (C0 ((V1 _ _).trans m1) a.1) have e8:(J0 (8*o))=8*(J0 o):=by rw [kMm _ _ (by rw [kc8]; exact C0 ((V1 _ _).trans c) a.2.2),kc8] have g:(J0 (o+1))=(J0 o)+1:=by rw [kSm _ _ (by rw [kc1]; exact C0 (N0 h (lZ _ ж)) a.2.2),kc1] rw [j,e8] exact ⟨rfl,m1.trans i,C0 m1 a.1,rfl,U1 (O1 (by decide) _) (c.trans e), U1 (O1 ж _) (c.trans (U2 a.2.2)),g⟩ 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) lemma sPX_size(d i:ἀ)(b:Ἂ Ἃ)(n ow:Ἄ)(e:(J0 ow)*(J0 n)<=(kS d))(hX:8*(J0 n)<=(kS i))(a:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ)) : ∀ m (o:Ἄ)(S:ἀ)(c:8*(J0 ow)<=(kS S)),(J0 ow)-(J0 o)=m → (kS (sPX d i b n ow e hX a o S c))=(kS S):=by intro m; induction m using O4 with | _ m k => intro o S c l by_cases h:(J0 o) < (J0 ow) · have A:=sPXb d S n ow o e a c h by_cases h2:(J0 o)+1 < (J0 ow) · have j:=sPXb d S n ow (o+1) e a c (by rw [A.2.2.2.2.2.2]; exact h2) rw [sPX,AT (ε.mpr h),AT (ε.mpr (by rw [A.2.2.2.2.2.2]; exact h2))]; dsimp only rw [k _ (by rw [j.2.2.2.2.2.2,A.2.2.2.2.2.2, ← l]; exact Lq2 _ _ h2) _ _ _ rfl,w8_size,w8_size] · rw [sPX,AT (ε.mpr h),dite_eq_right (λg=>h2 (by rw [← A.2.2.2.2.2.2]; exact ε.mp g))]; rw [w8_size] · rw [sPX,dite_eq_right (λg=>h (ε.mp g))] lemma kLs (i h g j d c a e:Ἅ)(r:ℕ)(k:r<8):lsel i h g j d c a e r=A8.f ⟨i,h,g,j,d,c,a,e⟩ r:=by interval_cases r <;> rfl lemma sPX_v(h e:ἀ)(b:Ἂ Ἃ)(wo n:Ἄ)(t:(J0 wo)+(J0 n)<=(kS h))(hX:8*(J0 n)<=(kS e))(i:(J0 wo)+(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)) (d:ℕ)(g:(J0 wo)=d*(J0 n))(c:Ἅ)(q:c=dw oneW*dw b[d]!)(y:A8)(m:y=kX8 h e wo n t hX i 0 c c c c c c c c)(o:∀ s<(J0 n),∀ l<8,∀ a:Ἅ,fM Yarm a e.data[8*s+l]! h.data[d*(J0 n)+s]! = a+e.data[8*s+l]!*h.data[d*(J0 n)+s]!) : ∀ r<8,lsel y.a0 y.a1 y.a2 y.a3 y.a4 y.a5 y.a6 y.a7 r=ao (λs=>e.data[8*s+r]!*h.data[d*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[d]!):=by intro r j rw [kLs _ _ _ _ _ _ _ _ r j,show (⟨y.a0,y.a1,y.a2,y.a3,y.a4,y.a5,y.a6,y.a7⟩:A8)=y from rfl,m,kX8_spec _ _ _ _ _ _ _ (λs p l k a=>by rw[g];exact o s p l k a) _ _ _ _ _ _ _ _ _ _ rfl r j,f8,g,q] rfl lemma sPX_spec(i k:ἀ)(b:Ἂ Ἃ)(n ow:Ἄ)(w:(J0 ow)*(J0 n)<=(kS i))(hX:8*(J0 n)<=(kS k))(e:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ))(v:∀ c<(J0 ow),∀ s<(J0 n),∀ l<8,∀ a:Ἅ,fM Yarm a k.data[8*s+l]! i.data[c*(J0 n)+s]! = a+k.data[8*s+l]!*i.data[c*(J0 n)+s]!) : ∀ m (o:Ἄ)(S:ἀ)(q:8*(J0 ow)<=(kS S)),(J0 ow)-(J0 o)=m → (∀ c<(J0 o),c<(J0 ow) → ∀ r<8,S.data[8*c+r]! = ao (λs=>k.data[8*s+r]!*i.data[c*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[c]!)) → ∀ c<(J0 ow), ∀ r<8,(sPX i k b n ow w hX e o S q).data[8*c+r]! = ao (λs=>k.data[8*s+r]!*i.data[c*(J0 n)+s]!) (J0 n) 0 (dw oneW*dw b[c]!):=by intro m; induction m using O4 with | _ m y => intro o S q x I by_cases h:(J0 o) < (J0 ow) · have A:=sPXb i S n ow o w e q h by_cases h2:(J0 o)+1 < (J0 ow) · have p:=sPXb i S n ow (o+1) w e q (by rw [A.2.2.2.2.2.2]; exact h2) rw [sPX,AT (ε.mpr h),AT (ε.mpr (by rw [A.2.2.2.2.2.2]; exact h2))]; dsimp only refine y _ (by rw [p.2.2.2.2.2.2,A.2.2.2.2.2.2, ← x]; exact Lq2 _ _ h2) _ _ _ rfl ?_ intro c d j r g rw [p.2.2.2.2.2.2,A.2.2.2.2.2.2] at d have f0:(J0 (8*o))=8*(J0 o):=A.2.2.2.1 have t:(J0 (8*(o+1)))=8*(J0 o)+8:=by rw [p.2.2.2.1,A.2.2.2.2.2.2,Qm] have K:=kX16_eq i k (o*n) ((o+1)*n) n A.2.1 p.2.1 hX ⟨A.2.2.1,p.2.2.1,e.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:c=(J0 o)+1 · subst e1 rw [AD (show (J0 (8*(o+1))) ≤ 8*((J0 o)+1)+r∧8*((J0 o)+1)+r < (J0 (8*(o+1)))+8 by rw [t]; exact Lw1 _ _ g),Lw8 _ _ _ t] exact sPX_v i k b ((o+1)*n) n p.2.1 hX ⟨p.2.2.1,e.2.1⟩ ((J0 o)+1) (by rw [p.1,A.2.2.2.2.2.2]) _ (by rw [A.2.2.2.2.2.2]) _ K.2 (v _ j) r g · rw [AC (by rw [t]; exact Lw3 _ _ _ g e1)] by_cases e0:c=(J0 o) · subst e0 rw [AD (by rw [f0]; exact Lw4 _ _ g)]; simp only [f0,ϱ] exact sPX_v i k b (o*n) n A.2.1 hX ⟨A.2.2.1,e.2.1⟩ (J0 o) A.1 _ rfl _ K.1 (v _ j) r g · rw [AC (by rw [f0]; exact Lw5 _ _ _ g e0)] exact I c (Lw6 _ _ d e1 e0) j r g · rw [sPX,AT (ε.mpr h),dite_eq_right (fun u=>h2 (by rw [← A.2.2.2.2.2.2]; exact ε.mp u))] intro c d r g have f0:(J0 (8*o))=8*(J0 o):=A.2.2.2.1 rw [w8_spec] by_cases e0:c=(J0 o) · subst e0 rw [AD (by rw [f0]; exact Lw4 _ _ g)]; simp only [f0,ϱ] exact sPX_v i k b (o*n) n A.2.1 hX ⟨A.2.2.1,e.2.1⟩ (J0 o) A.1 _ rfl _ rfl (v _ d) r g · rw [AC (by rw [f0]; exact Lw5 _ _ _ g e0)] exact I c (Lw7 _ _ _ d h2 e0) d r g · rw [sPX,dite_eq_right (λu=>h (ε.mp u))] intro c d r g; exact I c (U1 d (V3 h)) d r g lemma sFBb(a ow c r:Ἄ)(e:(J0 c)<=8)(hR:(J0 a)+(J0 c)<2^(31:Ἀ))(g:((J0 a)+(J0 c))*(J0 ow)<2^(31:Ἀ))(h:(J0 r)<(J0 c)) : (J0 ((a+r)*ow))=((J0 a)+(J0 r))*(J0 ow)∧(J0 (a+r))=(J0 a)+(J0 r) ∧ ((J0 a)+(J0 r))*(J0 ow)+(J0 ow)<=((J0 a)+(J0 c))*(J0 ow)∧(J0 r)<(J0 (8:Ἄ))∧(J0 (r+1))=(J0 r)+1:=by have m1:((J0 a)+(J0 r)+1)*(J0 ow) ≤ ((J0 a)+(J0 c))*(J0 ow):=ι _ (O1 h _) rw [Ο] at m1 have d:(J0 (a+r))=(J0 a)+(J0 r):=kSm _ _ (Lql _ _ _ _ h (U2 hR)) have i:(J0 ((a+r)*ow))=((J0 a)+(J0 r))*(J0 ow):=by rw [kMm _ _ (by rw [d]; exact C0 ((V1 _ _).trans m1) g),d] exact ⟨i,d,m1,by rw [kc8]; exact U1 h e,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)) lemma sFB_spec(d:Ἆ)(H:ἆ)(p:Ἄ->Ἄ->Ἅ->Ἃ)(S:ἀ)(i ow c:Ἄ)(n:8*(J0 ow)<=(kS S)∧8*(J0 ow)<2^(31:Ἀ))(v:(J0 c)<=8)(hR:(J0 i)+(J0 c)<2^(31:Ἀ))(o:((J0 i)+(J0 c))*(J0 ow)<2^(31:Ἀ)) : ∀ m (r:Ἄ)(a:Ἂ Ἃ)(k:((J0 i)+(J0 c))*(J0 ow)<=(O0 a)),(J0 c)-(J0 r)=m → (O0 (sFB d H p S i ow c n v hR o r a k))=(O0 a) ∧ (∀ q,(∀ g j,(J0 r) ≤ g → g<(J0 c) → j<(J0 ow) → ((J0 i)+g)*(J0 ow)+j≠q) → (sFB d H p S i ow c n v hR o r a k)[q]! = a[q]!) ∧ (∀ g j,(J0 r) ≤ g → g<(J0 c) → j<(J0 ow) → (sFB d H p S i ow c n v hR o r a k)[((J0 i)+g)*(J0 ow)+j]! = (if zR (S.data[8*j+g]!) d H==(0xFFFFFFFF:ἇ) then p (i+W0 g) (W0 j) (S.data[8*j+g]!) else zR (S.data[8*j+g]!) d H)):=by intro m; induction m with | zero => intro r a k w rw [sFB,dite_eq_right (λh=>Lq0 _ _ w (ε.mp h))] exact ⟨rfl,λq _=>rfl,λg j t s _=>absurd (C0 t s) (Lq0 _ _ w)⟩ | succ m J => intro r a k w have A:=Lqs _ _ _ w; have h:=A.1 have F:=sFBb i ow c r v hR o h rw [sFB,AT (ε.mpr h)]; dsimp only obtain ⟨D,y,z⟩:=J (r+1) _ _ (by rw [F.2.2.2.2]; exact A.2) have G:=sFG_spec d H (p (i+r)) S 8 r ((i+r)*ow) ow ⟨F.2.2.2.1,by rw[kc8];exact n.1,by rw[kc8];exact n.2⟩ (by rw[F.1];exact C0 F.2.2.1 o) _ 0 a (by rw[F.1];exact F.2.2.1.trans k) rfl (ϟ _) rw [F.2.2.2.2] at y z refine ⟨by rw [D,sFG_sz],λq hq => ?_,λg j t s l => ?_⟩ · rw [y q (λg j t s l=>hq g j (M4 t) s l),G q,AC] rw [F.1,kc0,ϑ]; intro ⟨u,B⟩ exact hq (J0 r) (q-((J0 i)+(J0 r))*(J0 ow)) (le_refl _) h (K3 u B) (BQ u) · by_cases e:g=J0 r · subst e rw [y _ (λC I u B K=>Lqf _ _ _ _ _ _ u l), G,F.1,kc0,ϑ,AD ⟨V1 _ _,O1 l _⟩,ϱ,kc8] have er:i+W0 (J0 r)=i+r:=by rw [show W0 (J0 r)=r from Jv] rw [er] · exact z g j (U4 t (λx=>e x.symm)) s l lemma kPm (e c:ἆ) (h:e.toNat < 255) (a:c.toNat ≤ 992) : ((if e < (56:ἆ) then (56:ἆ) else e)+c).toNat=max e.toNat 56+c.toNat:=by have m:(if e < (56:ἆ) then (56:ἆ) else e).toNat=max e.toNat 56:=by by_cases g:e < (56:ἆ) · rw [AD g]; exact (D8 (U2 (show e.toNat < 56 from g))).symm · rw [AC g]; exact (Z8 (V3 (show ¬ e.toNat < 56 from g))).symm rw [η,m] exact γ (C0 (E0 (Xh.2 ⟨U2 h,by decide⟩) a) ж) lemma kOutRb (v:Ἅ)(a:Ἆ)(n:ℕ)(D i:ℕ→Ἃ)(s:Ἃ)(j:s=p8 a (ms (n+1) D i))(e cq c em:ἆ) (u:∀ p:ἆ,p=(if e<(56:ἆ) then (56:ἆ) else e)+cq → e<(255:ἆ) → p ≤ (372:ἆ) → aG (n+1) D i∧fv v ∧ |rv v-(af (n+1) D i:ℝ)| ≤ (2:ℝ)^(((if c>p then c else p).toNat:ℕ):ℤ) ∧ |(af (n+1) D i:ℝ)| ≤ (2:ℝ)^(425:ℤ) ∧ |rv v| ≤ (2:ℝ)^((((if c>p then c else p).toNat)+52:ℕ):ℤ)∧(if c>p then c else p).toNat ≤ 600) (h:e.toNat ≤ em.toNat)(d:em.toNat < 255)(l:cq.toNat ≤ 992) : (if zR v a (if (if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) then (if c>(if em<(56:ἆ) then (56:ἆ) else em)+cq then c else (if em<(56:ἆ) then (56:ἆ) else em)+cq) else (4000:ἆ))==(0xFFFFFFFF:Ἃ) then s else zR v a (if (if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) then (if c>(if em<(56:ἆ) then (56:ἆ) else em)+cq then c else (if em<(56:ἆ) then (56:ἆ) else em)+cq) else (4000:ἆ)))=p8 a (ms (n+1) D i):=by by_cases hP:(if em<(56:ἆ) then (56:ἆ) else em)+cq<=(372:ἆ) · rw [AD hP] have q:e.toNat < 255:=C0 h d have k:=kPm e cq q l have t:=kPm em cq d l have m:((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 h) _ have pe:(if e<(56:ἆ) then (56:ἆ) else e)+cq ≤ (372:ἆ):=(show ((if e<(56:ἆ) then (56:ἆ) else e)+cq).toNat ≤ 372 by rw [k]; exact mE.trans (by rw [← t]; exact m)) obtain ⟨g,o,w,b2,_,r⟩:=u _ rfl q pe have mono:(if c>(if e<(56:ἆ) then (56:ἆ) else e)+cq then c else (if e<(56:ἆ) then (56:ἆ) else e)+cq).toNat ≤ (if c>(if em<(56:ἆ) then (56:ἆ) else em)+cq then c else (if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat:=by rw [kOutW_h2,kOutW_h2,k,t]; exact max_le_max_left _ mE have x:(if c>(if em<(56:ἆ) then (56:ἆ) else em)+cq then c else (if em<(56:ἆ) then (56:ἆ) else em)+cq).toNat ≤ 600:=by rw [kOutW_h2] at r ⊢; exact max_le ((le_max_left _ _).trans r) (m.trans ж) exact kZR v _ a n _ _ _ j g o (AZ w (AG ш (by exact_mod_cast mono))) b2 x · rw [AC hP,kZRBig]; simp only [Az,ἁ]; exact j 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 lemma gY_spec(m y:ἀ)(E:Ἂ Ἃ)(X W b:Ἂ Ἃ)(d:Ἆ)(ix C L H N:Ἀ)(n ow i g:Ἄ) (hW:(J0 ow)*(J0 n)<=(kS m))(hX:8*(J0 n)<=(kS y))(u:(J0 ow)*(J0 n)<2^(31:Ἀ)∧8*(J0 n)<2^(31:Ἀ)∧8*(J0 ow)<2^(31:Ἀ))(I:(J0 n)=N) (B:(J0 g)<=8)(hR:(J0 i)+(J0 g)<2^(31:Ἀ))(hB:((J0 i)+(J0 g))*(J0 ow)<2^(31:Ἀ)) (S:∀k,k<(J0 ow)*(J0 n)->m.data[k]! =dw W[k]!) (ad:∀s,s<(J0 n)->∀r,r<8->y.data[8*s+r]! =if r<(J0 g) then dw X[((J0 i)+r)*N+s]! else dw 0) (D:∀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<=C)(Y:N+2<=2^L)(x:L<=27)(z:C+L<=425)(a1:ix<=425)(cq j em:ἆ)(aL:∀ r,r<(J0 g) → 23+(cEq (I0 (9*(N+1))).toInt64.toFloat (ao (λk=>dw (X[((J0 i)+r)*N+k]! &&& 0x7FFFFFFF)) N 0 0)).toNat ≤ cq.toNat)(J:cq.toNat ≤ 992)(aH:j=(C+L-50).toUInt64)(hN:0(E[o]!).toNat<=em.toNat)(aU:em.toNat<255) (v:Ἂ Ἃ)(ha:((J0 i)+(J0 g))*(J0 ow)<=(O0 v)) : (O0 (gY m y b d cq j em (bXfb d X W b E m ix C L N) n ow i g hW hX u B hR hB v))=(O0 v) ∧ (∀q,(∀r e,r<(J0 g)->e<(J0 ow)->((J0 i)+r)*(J0 ow)+e≠q)->(gY m y b d cq j em (bXfb d X W b E m ix C L N) n ow i g hW hX u B hR hB v)[q]! =v[q]!) ∧ (∀r e,r<(J0 g)->e<(J0 ow)->(gY m y b d cq j em (bXfb d X W b E m ix C L N) n ow i g hW hX u B hR hB v)[((J0 i)+r)*(J0 ow)+e]! =act d (dotOf (N+1) (λt=>if tif tP then j else P) else (4000:ἆ)) (bXfb d X W b E m ix C L N) (sPX m y b n ow hW hX u 0 (zPq (8*(J0 ow))) (zPs _).1) i ow g ⟨by rw[sPX_size _ _ _ _ _ _ _ _ _ _ _ _ rfl];exact (zPs _).1,u.2.2⟩ B hR hB _ 0 v ha rfl have SP:=sPX_spec m y b n ow hW hX u (λe ho s w l B a=>by have A:e*(J0 n)+s<(J0 ow)*(J0 n):=by have:=ι (J0 n) (show e+1≤(J0 ow) from ho);rw[Ο] at this;exact U1 (O1 w _) this have O:kB W[e*(J0 n)+s]!≠255:=λh=>by have e1:=D e ho s (by rwa[← I]);rw[← I,h] at e1;simp at e1;exact U5.2 aU (e1.trans (al e ho)) rw[ad s w l B,S _ A];split · exact fzD Yarm _ (F _).1 _ (pZ ⟨_,O,rfl⟩) a · exact fzD Yarm 0 ж _ (pZ ⟨_,O,rfl⟩) a) _ 0 (zPq (8*(J0 ow))) (zPs _).1 rfl (λe h _=>absurd h (by rw [kc0]; exact D4 _)) refine ⟨T1,λq hq=>T2 q (λr' e _ h2 h3=>hq r' e h2 h3),λr e T ho => ?_⟩ rw [T3 r e (by rw [kc0]; exact ϟ _) T ho,SP e ho r (U1 T B)] have hS : ∀k,k<2^(31:Ἀ)->kAN (AN A ж) ς have U:=X3 (hS _ (U1 ho (U2 (C0 (lZ _ ж) u.2.2)))) have ax:=X3 (hS _ (U1 (U1 T B) ж)) have K:(J0 (i+W0 r))=(J0 i)+r:=by rw [kSm _ _ (by rw [ax]; exact Lql _ _ _ _ T (U2 hR)),ax] have m1:e*(J0 n)+(J0 n) ≤ (J0 ow)*(J0 n):=by have:=ι (J0 n) (show e+1 ≤ (J0 ow) from ho); rwa [Ο] at this simp only [bXfb,K,U,I] simp only [sTB_eq,K,U] have V : ∀ k < N,expOf W[e*N+k]! ≠ 255 → fv (y.data[8*k+r]! * m.data[e*N+k]!)∧rv (y.data[8*k+r]! * m.data[e*N+k]!)=tm X[((J0 i)+r)*N+k]! W[e*N+k]! := λk A O=>by rw [ad k (I▸A) r (U1 T B),AD T,S _ (by rw [← I] at A ⊢; exact AN (O1 A _) m1)] exact dJ _ _ (F _).1 O have G:=kGB1T d N N e (λs=>X[((J0 i)+r)*N+s]!) W b (λk=>k) (λk=>y.data[8*k+r]! * m.data[e*N+k]!) (λs=>dw X[((J0 i)+r)*N+s]! * m.get! (e*N+s)) E[e]! ix C L H (λ_=>aD N d X W b (((J0 i)+r)*N) 1 e) (λs _=>F _) (λs w=>D e ho s w) (hb _) M Y x z (le_refl _) (λk A=>A) (λa c h _=>h) (λs w hh=>absurd rfl (hh s w)) V (λs w O=>by rw [gg,S _ (by rw [← I] at w ⊢; exact AN (O1 w _) m1)]; exact dJ _ _ (F _).1 O) (kAD N d X W b ((J0 i)+r) e) exact kOutRb _ d N _ _ _ G (E[e]!).toUInt64 cq j em (λp hp he ah=>kOutWm N (λs=>X[((J0 i)+r)*N+s]!) W b E C L H e cq j p (λk=>y.data[8*k+r]! * m.data[e*N+k]!) _ _ (λs _=>(F _).1) (hb _) M Y x z hN (λs w=>D e ho s w) (λa0 s w=>V s w (λh'=>by have:=D e ho s w; rw [h'] at this; simp at this; exact U5.2 aU (this.trans (al e ho)))) rfl rfl (aL r T) J aH hp he ah) (by rw [ϩ]; exact al e ho) aU J 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 ж) ς have hR1:rb*8*n+lim*n<=R*n:=by rw[← Ϡ];exact ι n hlR have e1:(J0 ((G0 (rb*8*n))))=rb*8*n:=X3 (hS _ (AO ((V1 _ _).trans hR1) hRn)) have e2:(J0 ((G0 n)))=n:=X3 (hS _ (AO (lZ n ж) h8n)) have e3:(J0 ((G0 lim)))=lim:=X3 (hS _ (AO hl8 ж)) 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Ἀ->Ἃ)(n:z=y) (o:(O0 A)=R*ow->(∀d j,d<(rb+1)*8->djA[d*ow+j]! =i d j)->(O0 y)=R*ow ∧ ∀d j,djy[d*ow+j]! =i d j) (G:(O0 A)=R*ow∧(∀q,(∀r e,rd0<=e->e(b+r)*a+e≠q)->A[q]! =h[q]!)∧(∀r e,rd0<=e->eA[(b+r)*a+e]! =i (b+r) e)) (D:a=ow)(B:b=rb*8)(C:c=min 8 (R-rb*8))(F:d0=0) (p:∀d j,ddjh[d*ow+j]! =i d j): (O0 z)=R*ow ∧ ∀d j,djz[d*ow+j]! =i d j:=by subst n a b c d0; obtain ⟨x,w,u⟩:=G refine o x (λd j t m k=>?_) by_cases g:d < rb*8 · rw[w _ (λr e s _ l v=>X2.2 (Ve.intro (kDM _ _ _ _ _ v l k).1) g)];exact p d j g m k · have:=u (d-rb*8) j (lt_min (K3 (X2.1 g) (by rwa[Ϡ,n4] at t)) (Vk (X2.1 g) m)) (ϟ _) k rw[BQ (X2.1 g)] 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:=λ(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) lemma tKa{n:Ἀ}(h:n<2^31):(J0 (G0 n))=n:=aa (AN (AN h ж) ς) lemma gXb_spec(X:Ἂ Ἃ)(C:ἀ)(E:Ἂ Ἃ)(W b:Ἂ Ἃ)(d:Ἆ)(ix v L H R n ow:Ἀ)(em:ἆ) (w:R*n<=(O0 X))(hW:ow*n<=(kS C))(p:R*n<2^31)(l:8*n<2^31)(G:ow*n<2^31)(y:ow<2^31)(i:R<2^31)(I:R*ow<2^31)(A:8*ow<2^31) (aL:∀k,kC.data[k]! =dw W[k]!) (ax:∀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<=v)(Y:n+2<=2^L)(x:L<=27)(z:v+L<=425)(al:ix<=425)(hN:0(E[o]!).toNat<=em.toNat)(ah:em.toNat<255) : ∀ m rb (g:Ἂ Ἃ),R-rb*8<=m -> (O0 g)=R*ow -> (∀e j,eejg[e*ow+j]! =act d (dotOf (n+1) (λt=>if tif t (O0 (gXb X C E b d (48+ix).toUInt64 L.toUInt64 v.toUInt64 em (bXfb d X W b E C ix v L n) R n ow w hW p l G y i I A rb g))=R*ow ∧ ∀e j,ej(gXb X C E b d (48+ix).toUInt64 L.toUInt64 v.toUInt64 em (bXfb d X W b E C ix v L n) R n ow w hW p l G y i I A rb g)[e*ow+j]! =act d (dotOf (n+1) (λt=>if tif t intro rb g HH hA hI;have hz:=M0.1 (Nat.le_zero.1 HH);rw[gXb.eq_1,dite_eq_right (X2.2 hz)] exact⟨hA,λe j a h2=>hI e j (AN a hz) a h2⟩ | succ m IH=> intro rb g HH hA hI by_cases h:rb*8 < R swap · exact IH rb g (by rw[Yp (X2.1 h)];exact ϟ _) hA hI let Q:=min 8 (R-rb*8) have S:Q<=8:=F6 _ _ have U:rb*8+Q<=R:=(J1 (T9 8 (R-rb*8)) _).trans (Y3 (BQ (U2 h))) have ad:rb*8*n+Q*n<=R*n:=by rw[←Ϡ];exact ι n U have e1:=tKa (AO ((V1 _ _).trans ad) p) have u:=tKa (AO (lZ n ж) l) have N:=tKa (AO S ж) have J:=tKa y have e5:=tKa (N3 h i) have T:(J0 (G0 (rb*8*n)))+(J0 (G0 Q))*(J0 (G0 n))<=(O0 X):=by rw[e1,N,u];exact ad.trans w have V:8*(J0 (G0 n))+8<=(kS (zPq (8*n+8))):=by rw[u];exact (zPs _).1 have O:(J0 (G0 (rb*8*n)))+(J0 (G0 Q))*(J0 (G0 n))<2^31/\8*(J0 (G0 n))+7<2^31:=⟨by rw[e1,N,u];exact AO ad p,by rw[u];clear * - l;omega⟩ have B:(J0 (G0 Q))<=8:=by rw[N];exact S have D:=dX8_spec _ _ _ _ T O B _ 0 (zPq (8*n+8)) V rfl (ϟ _) have ZP:=zPs (8*n+8) have P:=gXb_spec_h2 _ (zPq (8*n+8)) X _ _ _ _ (J0 (G0 (rb*8))) n rfl u (by rw[e1,e5]) B (λq hq=>ZP.2.2 _ (hq.trans_le ZP.1)) D let F9:=(I0 (9*(n+1))).toInt64.toFloat let cr:=λ(r:Nat)=>if rif hr:raL k (by rwa[J,u] at hk)) P.1 (λo ho s=>ax o (by rwa[J] at ho) s) F hb M Y x z al _ _ em (λr hr=>((congrArg (λx=>23+(cEq F9 x).toNat) ((gg _ _).trans (P.2 r hr)).symm).trans ((kCR _ _).1.symm.trans (congrArg lq (AD (hr.trans_eq N)).symm))).trans_le (K.1 r ((hr.trans_eq N).trans_le S))) K.2 (kHB v L (by clear * - M;omega) z) hN (λo ho=>aU o (by rwa[J] at ho)) ah g (by rw[e5,N,J,hA];exact ι ow U) exact⟨T1.trans hA,λq hq=>T2 q (λr o' a h3=>hq r o' a (ϟ _) h3),λr o' a _ h3=>T3 r o' a h3⟩) J e5 N rfl hI lemma bX8_spec(R n ow:Ἀ)(a:Ἆ)(X W b:Ἂ Ἃ)(ix u L H:Ἀ)(v:ἀ)(E:Ἂ Ἃ)(em:ἆ) (g:R*n<=(O0 X))(B:ow*n<=(kS v))(p:R*n<2^(31:Ἀ))(r:8*n<2^(31:Ἀ))(t:ow*n<2^(31:Ἀ))(l:ow<2^(31:Ἀ))(c:R<2^(31:Ἀ))(i:R*ow<2^(31:Ἀ))(m:8*ow<2^(31:Ἀ)) (C:∀k,kv.data[k]! =dw W[k]!) (A:∀o,o∀s,s(expOf W[o*n+s]!).toNat<=(E[o]!).toNat) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(J:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=u)(Y:n+2<=2^L)(x:L<=27)(z:u+L<=425)(y:ix<=425)(K:0(E[o]!).toNat<=em.toNat)(w:em.toNat<255) : bX8 R n ow a X W b ix u L v E em g B p r t l c i m=mj R n ow a X W b:=by change gXb X v E b a (48+ix).toUInt64 L.toUInt64 u.toUInt64 em (bXfb a X W b E v ix u L n) R n ow g B p r t l c i m 0 (Ah (R*ow) 0)=mj R n ow a X W b obtain ⟨N,O⟩:=gXb_spec X v E W b a ix u L H R n ow em g B p r t l c i m C A F J M Y x z y K D w (R-0*8) 0 (Ah (R*ow) 0) (le_refl _) (by simp only [W3]) (λI j h=>absurd h (by clear*-;omega)) unfold mj linearWith apply mi (by rw[N];simp only [Ϝ]) intro q hq d rw[Ϝ]at d simp only[Λ] rw[← AB _ q hq] have e:0by rw[h,A7]at d;exact D4 _ d) have G:q/owwcK3eq_ok a b) wcT8S 32 (W,ow,n) (λk=>k.1) (λ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) (λk=>k.1) (λv=>tchP v) 3).1 c.2.1 c.2.2.toUInt64 hd.2.1 (by rw[s5wcGet3_val];exact (wcDF_spec W ow n).1.ge) hc.2.2.2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.2.1 (kBnd ow n R hc.2.2.1 hc.2.2.2.1 hc.2.2.2.2).2.2.2 hd.2.2.1 hd.2.2.2 else mj R n ow relu X W b) else mj R n ow relu X W b lemma bTc16_spec(R n ow:Ἀ)(c:Ἆ)(X W b:Ἂ Ἃ)(ix g L H:Ἀ)(h:ow*n<=(O0 W))(d:(O0 W)<2^32)(dn:Ἆ) (F:∀q:Ἀ,kB X[q]!≠255/\kG X[q]!<=ix)(m:∀q:Ἀ,kB b[q]!≠255/\kG b[q]!<=H)(M:174+H<=g)(Y:n+2<=2^L)(x:L<=27)(z:g+L<=425) (l:(O0 X)<2^32):bTc16 R n ow c X W b ix g L h d dn=mj R n ow c X W b:=by unfold bTc16; dsimp only; split · rename_i e have j:(wcGet3T wcK3eq (λa b=>wcK3eq_ok a b) wcT8S 32 (W,ow,n) (λk=>k.1) (λv=>tchP v.1) 3).1=wcT8F (W,ow,n):=s5wcGet3_val _ have P:=wcT8F_panel W ow n e.2.2.1 h d have Q:=wcT8F_exp W ow n e.2.2.1 h d split · rename_i p have i:(wcGet3T wcK3eq (λa b=>wcK3eq_ok a b) wcDS 32 (W,ow,n) (λk=>k.1) (λv=>tchP v) 3).1=wcDF (W,ow,n):=s5wcGet3_val _ exact bX8_spec R n ow c X W b ix g L H _ _ _ _ _ _ _ _ _ _ _ _ (by rw[i];exact (wcDF_spec W ow n).2) (by rw[j];exact Q.2.1) F m M Y x z (by have:=e.2.1;clear*-this;omega) e.2.2.2.2 (by rw[j];exact λo ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact e.1) · rfl · rfl end F lemma bc{a:Ἀ}(h:a<=4294967295):a<2^(32:Ἀ):=(by exact J3 h) def c7o(rows inW outW:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= let ex:=F.aO X 0 0 let eb:=F.aO b 0 0 let ix:=(mJ ex)-1 let ib:=174+((mJ eb)-1) let L:=Aq (inW+1)+1 if h:ex<255/\eb<255/\ib+L<=425/\L<=27/\outW*inW<=(O0 W)/\(O0 W)<=4294967295/\ 8*inW<=4294967295/\(O0 X)<=4294967295/\(O0 b)<=4294967295 then if 0 assumption lemma eDo:c7o=mj:=by funext e d g j X W b;unfold c7o;dsimp only;split · rename_i h;have:=ς;have⟨l,m,o,p,y,z,A,B,u⟩:=h;have q:d+2<=2^(Aq (d+1)+1):=by have:=@ϙ (d+1);exact l7 this refine kITE ?_ rfl exact F.bTc16_spec _ _ _ _ _ _ _ _ _ _ _ _ _ _ (F.bd X (by exact C0 B this) l) (F.bd b (by exact C0 u this) m) AP q p o (by exact bc B) · rfl open F in @[inline] def c7k(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ)(k:DK)(hk:k=dkF (W,b,ow,n)):Ἂ Ἃ:= if h:k.ok=true/\0by rw[F.2 o (by clear * - ho;omega),AD ho] have hq:n+2<=2^(Aq (n+1)+1):=by have:=@ϙ (n+1);exact l7 this have l:=ς split · rename_i r split · rename_i Y have L:=dOwM_m X (G0 n) (G0 (n+1)) (G0 R) A x p4 _ 0 (zPq (R*(n+1))) 0 p2 rfl rw[B,y,kc0,ϳ] at L have m:∀ ddw (X[d*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[d*n+t]!:= λd r t J=>by rw[dOwM_Y X (G0 n) (G0 (n+1)) (G0 R) A x p4 _ 0 _ 0 p2 rfl];exact K.2 d t r (ϟ _) J have H:R*n=(O0 X):=by rw[r.1,n4];exact r.2 have I:=bdM X _ (λq hq=>L.2 q (ϟ _) (by rw[H];exact hq)) Y exact bQSg_spec R n ow c X W b _ _ _ ((mJ (aO b 0 0))-1) _ _ _ _ _ _ _ _ _ _ rfl _ _ _ _ _ _ _ m i P.2 Q.2.1 (λo ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact u) I (bd b (by exact C0 z l) v) (le_refl _) hq O S · rw[eDo] · split · rename_i T have m:∀ ddw (X[d*n+s]! &&& 0x7FFFFFFF)) n 0 0 else dw X[d*n+t]!:= λd r t J=>K.2 d t r (ϟ _) J exact bQSg_spec R n ow c X W b _ _ _ ((mJ (aO b 0 0))-1) _ _ _ _ _ _ _ _ _ _ rfl _ _ _ _ _ _ _ m i P.2 Q.2.1 (λo ho=>(Q.2.2 o ho).trans_eq (ϩ _).symm) (by rw[ϩ];exact u) (bd X (by exact C0 G l) T) (bd b (by exact C0 z l) v) (le_refl _) hq O S · rw[eDo] · rw[eDo] def c7s(R n ow:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= let kk:=F.dkGs W b ow n (ST.Prim.Ref.get F.dkS (Void.mk ())).val 0 c7k R n ow relu X W b kk.1 kk.2 def c7(rows inW outW:Ἀ)(relu:Ἆ)(X W b:Ἂ Ἃ):Ἂ Ἃ:= if 1j d.1)] use e;change (kL li (lx a).toBits.toBitVec).isFinite=ἃ;rw[e];simp only[kL,j,ἂ];split<;>(try split)<;>rfl section open Float.Model.UnpackedFloat open Model hiding fma add lemma fA{a b p q c d}(h:0rfl simp only[kU.addFields,add,decreaseExponent,AQ,h.ne',k.ne',ἂ,min_def,L,Hl] split_ifs with g H H<;>rw[sub_self,Int.toNat_zero,BH]<;>first|(rw[H];cases a<;>cases b<;>[(simp only[pK.apply,←Hl]at H;omega);rfl;rfl;rfl])|(rw[←Dense.F.fzRN];rfl) lemma fmaB{x y z}{s m e h S M E H s' m' e' h'}(u:toModel x=.finite s m e h)(v:toModel y=.finite S M E H)(w:toModel z=.finite s' m' e' h'):pv lU (fma li (toModel x) (toModel y) (toModel z))=pd x y z:=by have R:=toDyadic?_ieee_eq_model lU rfl;have X:=R x;have Y:=R y;have Z:=R z;simp only[u,v,w,unpackedToDyadic?]at X Y Z;simp only[Proof.fma_eq_spec,Spec.fma,u,v,w,(chooseNaN3_eq_none_iff _ _ _).2 ⟨Χ X,Χ Y,Χ Z⟩,ϡ X,ϡ Y,ϡ Z,X,Y,Z];cases s<;>cases S<;>exact fA (Ϯ h H) h' lemma bN{a}(h:kB a-1<254):lI a=n5 (BL a).toModel/\∃s m e h,toModel (lI a)=.finite s m e h:=⟨by rw[en,(bK a λe=>by simp[e]at h).1],by have:=(toDyadic?_ieee_eq_model lU rfl (lI a)).symm.trans ((kV a λe=>by simp[e]at h).trans (congrArg some (AC λ(e:kB a=0)=>absurd (e▸h) ж))) revert this;cases toModel (lI a)<;>simp[unpackedToDyadic?]<;>omega⟩ end @[noinline]def e9(relu:Ἆ)(a b:Ἃ):Ἃ:= act relu (toWord (Model.add (ofW a) (ofW b))) @[inline]def mR(L w:Ἃ):Ἃ:=if w-0x80000000by split at G ·rename_i H;simp only[Η,AJ]at H;obtain⟨g,_,_,_,_,u⟩:=bN G;obtain⟨j,_,_,_,_,v⟩:=bN H.1;obtain⟨k,_,_,_,_,x⟩:=bN H.2;rw[mR_eq,←ja,←fmaB u v x,g,j,k];rfl simp at G end NativeAdd @[noinline]def jq(relu:Ἆ)(w s t:Ἃ):Ἃ:=act relu (toWord (Model.fma (ofW w) (ofW s) (ofW t))) lemma eC(x s t:kF)(p:kB x≠255)(m:kB s≠255)(o:kB t≠255) (V:Ἁ) (l:V=sv x*sv s*2^(kG x+kG s)+sv t*2^(kG t+149)) (j:V≠0): kW (pd (lI x) (lI s) (lI t))=md V (-298) ἄ:=by have g:=kV x p;have d:=kV s m;have e:=kV t o;rw[Model.Proof.fma_eq_spec,Model.Spec.fma] simp only[lI,(Model.chooseNaN3_eq_none_iff _ _ _).2 ⟨Χ g,Χ d,Χ e⟩,ϡ g,ϡ d,ϡ e,Bool.or_false,υ,Am,g,d,e];refine(mf _ V _ _ j ?_).symm;rw[Model.addDyadic,pF];erw[pG];rw[lG,lG,lG,l,show (-298:ℤ)=-149-149 from rfl] simp only[K8,Qk,Gw,Ac (AL (α:=ℚ)),AA,zpow_neg,zpow_ofNat];ring lemma i4_h1(E:Ἀ)(p:1195<=E)(q:E<=1447):-1074<=(E:Ἁ)-1022/\(E:Ἁ)-1022<=971/\-1021<=(E:Ἁ)-1022:=by omega lemma aqk(S:Ἅ)(b:ἆ)(e:S.toBits=b)(c:(3<(b+268435457)&&&536870911&&(((b+268435457)>>>29>>>23)&&&2047)-1195<253&&(b+268435457)>>>29&&&8388607!=0)=true):Dense.F.ak S (Dense.F.eF b-1075)=((b+268435457)>>>29>>>34<<<31)+(((b+268435457)>>>29&&&0x3FFFFFFFF)-0x255000000)/\Dense.F.ak S (Dense.F.eF b-1075)<4294967296/\1195<=(lq (Dense.F.eF b))/\(lq (Dense.F.eF b))<=1447:=by have m1(x:Ἀ):x&&&536870911=x%2^29:=ζ x 29;have m3(x:Ἀ):x&&&8388607=x%2^23:=ζ x 23;have d(x:Ἀ):x&&&17179869183=x%2^34:=ζ x 34;have B:=b.toNat_lt;simp only[Η,AJ,AM,Ak,μ,←ξ,Ζ,η,ν,Ε,kA,β,kH,nr,m1,Dense.F.mA11,m3]at c;obtain⟨⟨g,a⟩,h⟩:=c;have N:(lq b+268435457)%18446744073709551616=lq b+268435457:=γ (by clear g a;omega);rw[N]at g a h have L(k:Ἀ)(p:8388608∣k):(lq b+268435457)/536870912/k=lq b/536870912/k:=by rcases(by clear g a h N p;omega:(lq b+268435457)/536870912=lq b/536870912∨(lq b+268435457)/536870912=lq b/536870912+1)with D|D<;>rw[D];exact Nat.succ_div_of_not_dvd λH=>h (D▸Nat.mod_eq_zero_of_dvd (p.trans H)) have F:1195<=lq (Dense.F.eF b)/\lq (Dense.F.eF b)<=1447:=by unfold Dense.F.eF;simp only[ν,Ε,kA,kH,β,nr,Dense.F.mA11];rw[←lY _ 536870912 8388608,←L _ dvd_rfl];generalize (lq b+268435457)/536870912/8388608=Y at a⊢;omega have i:(b+268435457)>>>29>>>34=b>>>63:=ξ.1 (by simp only[ν,η,kA,kH,β,nr,N];rw[L 17179869184 ⟨2048,rfl⟩];exact lY _ _ _);have j:(b+268435457)>>>29&&&(0x3FFFFFFFF:ἆ)=((b&&&(0x7FFFFFFFFFFFFFFF:ἆ))+268435456)>>>29:=ξ.1 (by simp only[ν,η,Ε,kA,kH,β,nr,d,Dense.F.mA63,N];clear a F;omega);unfold Dense.F.ak;dsimp only;rw[e,Kn,UInt64.sub_self,AD,i,j] ·refine⟨add_sub_assoc _ _ _,?_,F⟩;have f:=e▸(Dense.F.fq S).2;rw[μ,Dense.F.g0 b F.1];simp only[kA];clear g a h;omega ·rw[←j];simp only[Η,AJ,AM,Ak,μ,θ,←ξ,Ζ,η,ν,ψ,ο,Ε,kA,β,kH,nr,m1,Dense.F.mA63,Dense.F.mQ52,m3,d,N];refine⟨⟨⟨by decide,by clear * - F;omega⟩,by clear * - g B;omega⟩,by rw[I8 _ (by decide:8388608∣17179869184)];exact h⟩ lemma jR(d:Ἆ)(r:Ἃ)(e:kB r≠255):(if r&&&(if d then 0x80000000 else 0)!=0 then 0 else r)=p8 d r:=by cases d<;>simp[p8,reluW,e] @[inline]def eX(L:ἇ)(Y Z:Ἅ)(w:Ἃ)(slow:Unit->Ἃ):Ἃ:= let u:=(Dense.F.xbW w*Y+Z).toBits+268435457 let x:=u>>>29 if 3>>23)&&&2047)-1195<253&&x&&&8388607!=0 then(let r:=O2 ((x>>>34<<<31)+((x&&&0x3FFFFFFFF)-0x255000000));if r&&&L !=0 then 0 else r)else slow () lemma iX(d:Ἆ)(s t w:kF):(if kB w<(if kB s !=255&&kB t !=255 then 255 else 0) then eX (if d then 0x80000000 else 0) (Dense.F.dw s) (Dense.F.dw t*Dense.F.p149) w (λ_=>jq d w s t) else jq d w s t)=p8 d (kW (pd (lI w) (lI s) (lI t))):=by open Dense Dense.F in split<;>split ·rename_i H G;simp only[Η,AM]at H;unfold eX;rw[F.p149,F.xbE];dsimp only;split ·rename_i c;obtain⟨Q1,E,p,q⟩:=aqk _ _ rfl c;rw[←Q1,jR _ _ (Dense.F.kAkF _ _ E)];replace G:=Uk G;have it:=aT t;have W:=bm t;obtain⟨A,M⟩:=dJ w s G H.1;obtain⟨R,N⟩:=cI t H.2;obtain⟨I,O⟩:=iJ 149 (by decide);obtain⟨B,Q⟩:=aE _ _ R I (sv t) ((kG t+149:Ἀ):Ἁ) (by rw[N,O,AA,AF,Ap]) (Ao (bg t) (by decide)) (((by decide):(-1074:Ἁ)<=0).trans (Ua _)) (bL 24 _ 971 (by rw[it];exact (J1 (L1 ((I2 _ _).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,K8,Qk (sv t),Gw,Int.cast_ofNat] rw[J]at j e;generalize u:(tm w s+sv t*2^(kG t+149):Ἁ)=V at j e;generalize dw w*dw s+dw t*F.pw 149=S at E p q o j e⊢;have K0:=χ (F.eF S.toBits) 1075 (θ.2 ((ж:1075<=1195).trans p));have K:((lq (F.eF S.toBits-1075)):Ἁ)=((lq (F.eF S.toBits)):Ἁ)-1075:=by rw[K0];exact pO ((ж:1075<=1195).trans p) obtain⟨r,z⟩:=ce S o (F.eF S.toBits-1075) (K0.trans_lt ((I2 _ _).trans_lt (q.trans_lt ж))) 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 (Qt (B3.2 q) 1022))) E rw[eC w s t G H.1 H.2 V u.symm r,<-z] ·rfl ·rfl ·exact absurd ‹_<0› ц ·rfl @[specialize]def cE(stop:Ἄ)(f:(i:Ἄ)->(J0 i)<(J0 stop)->Ἃ->Ἃ)(i:Ἄ) (x:Ἂ Ἃ) (h:(J0 stop)<=(O0 x)):Ἂ Ἃ:= if hi:i(J0 i)<(J0 d)->kF->kF)(F:Ἀ->kF->kF) (p:∀i e w,f i e w=F (J0 i) w)(i:Ἄ)(x:Ἂ kF)(h:(J0 d)<=(O0 x)): (O0 (cE d f i x h))=(O0 x)/\ ∀j,(cE d f i x h)[j]?=if (J0 i)<=j/\j<(J0 d)then x[j]?.map (F j)else x[j]?:=by fun_induction cE next i x h e r q=>have o:(J0 i)<(O0 x):=(ε.1 e).trans_le h;obtain⟨g,l⟩:=q;refine⟨by rw[g,BT],λj=>?_⟩;rw[l,Dense.ac e,pP,Array.getElem?_set o];by_cases m:(J0 i)=j;subst m;rw[AC (by (clear * - h e r;omega)),AD rfl,AD (by (clear * - h e r;omega)),lC o,Option.map_some,p];rfl;rw[AC m];exact if_congr щ rfl rfl next i x h e=>exact⟨ἅ,λj=>by rw[AC (by rw[ε]at e;(clear * - e;omega))]⟩ def bH(relu:Ἆ)(hw c:Ἀ)(s t:Ἂ Ἃ)(ch:Ἀ)(x:Ἂ Ἃ):Ἂ Ἃ:= if chif kB w-1jq relu w sc tc) else jq relu w sc tc) i0 x h.1 else cE stop (λ_ _ w=>if kB wjq relu w sc tc) else jq relu w sc tc) i0 x h.1) else x) else x termination_by c-ch decreasing_by all_goals omega lemma dn_h1{α:Type}(a b j:Ἀ)(o:Option α)(f h:α->α)(q:a<=j->jf=h)(r:a<=b):(if b<=j then (if a<=j/\jX2.2 u v.2)).trans (AD (r.trans u)).symm) else if v:a<=j then(AC u).trans ((AD ⟨v,N7 u⟩).trans ((congrArg (Option.map · o) (q v (N7 u))).trans (AD v).symm)) else(AC u).trans ((AC λw=>v w.1).trans (AC v).symm) lemma dn(g:Ἆ)(e c:Ἀ)(s t:Ἂ kF)(d:Ἀ)(x:Ἂ kF) (p:(O0 x)=c*e)(r:c*ep8 g (kW (pd (lI w) (lI s[j/e]!) (lI t[j/e]!)))) else x[j]?:=by induction hk:c-d generalizing d x unfold bH;rw[AC (not_lt.2 (W1 hk))];split .rw[l5 (p.trans_le ((ι _ (W1 hk)).trans ‹_›))];rfl rfl;rename_i v;have q:dp8 g (kW (pd (lI w) (lI s[d]!) (lI t[d]!)))) (λ_ _ _=>rfl) (G0 (d*e)) x z;rw[v (d+1) _ (m.trans p) ((Qf c d).trans (congrArg B8 hk)),o,l,h,nO d e];exact dn_h1 _ _ _ _ _ _ (λb c=>by rw[mG b (by rw[Ο];exact c)]) (V1 _ _) def br(relu:Ἆ)(c hw:Ἀ)(x s t:Ἂ Ἃ):Ἂ Ἃ:= if (O0 x)=c*hw/\c*hwNativeAdd.add r w (b.uget i (U1 e a))) i x h:=by fun_induction qAd r b n a i x h next i x h hi d c=>rw[c];conv_rhs=>rw[cE,AT hi] next i x h hi=>rw[cE,dite_eq_right hi] def cq(relu:Ἆ)(a b:Ἂ Ἃ):Ἂ Ἃ:= if h:(O0 a)<=(O0 b)/\(O0 a)p8 d (kW (pb (lI x) (lI b[j]!)))) (λi l x=>?_) 0 a _).2 j,addReluSpec,mE];by_cases e:j<(O0 a);rw[AD ⟨(by simp only [Ϧ,zero_le]),by rwa[g]⟩,AT e,lC e];rfl;rw[AC (by rw[g];exact not_and.mpr λa=>e),dite_eq_right e,l5 (by exact V3 e)];rw[NativeAdd.gW,AB b (J0 i) щ];rfl;rfl end Bn namespace Conv open Dense.F (A8 WcE aO ak ao bW bd cI dJ dL dM da dh dw fzD fzPU g0 gg iC iL jE jEF twF kAkN kFU kMm kSm pg tf tw ug uk wcAeq wcAeq_ok wcGet3 wcK3eq wcK3eq_ok wcSub xbE xbW zrNC) open Core (bI) open Core Finset open Dense.F (jV uL kr ZPq zPq uU fuS uZ zPs wdU wdUz wdUs) variable(C E V S:ἆ) (y z:kF) (t:Ἆ) (P W:Ἂ ἇ) (c h w k n:Ἀ) (Q:kF->Ἆ) (fa:Ἀ->kF) (bx:ἆ) (s:lR) (J:Ἆ) (I K b:Ἂ kF) (D:Ἆ) (nc Y:Ἀ) (r d:kF) (x:ἆ) (v:Ἁ) (B a:ἆ) (m:Ἀ) (e j:Ἄ) (bw:ἆ) (u:ἇ) {α:Type} lemma mo{a b:Ἀ}(h:aif mW w !=0&&iW w< m then iW w else m) 255 @[inline]def ct(h l:ἆ):ἆ:=(h<<<25)+l @[inline]def d4(h l:ἆ):ἆ:= ((h+0x8000000000000000)>>>(39:ἆ))-(16777216:ἆ)-(l>>>(63:ἆ))+ (if ct h l>>31!=0 then 0-m else m @[specialize]def lp(H:Ἀ)(f:Ἀ->Ἀ->Ἂ ἇ->Ἂ ἇ): Ἀ->Ἀ->Ἀ->Ἂ ἇ->Ἂ ἇ | 0,_,_,a=>a | n+1,o,y,a=> let a:=f o y a if y+1Ἄ->ἇ)(s:Ἄ)(x:Ἀ):Ἀ->Ἄ->Ἂ ἇ->Ἂ ἇ | 0,_,a=>a | m+1,e,a=>dc f s (x+1) m (e+s) (a.push (f x e)) @[noinline]def eT(O H W:Ἀ)(f:Ἀ->Ἀ->Ἀ->ἇ):Ἂ ἇ:= if 0dc (λx _=>f o y x) 0 0 W 0) (O*H) 0 0 (AS (O*(H*W))) else#[] @[inline]def wv1(yb xb c dy dx:Nat):Word:= if yb+dya | n+1,c,dy,dx,a => if dx+1intro c dy dx a _ _ _ hp;exact⟨rfl,hp⟩ |succ n ih=> intro c dy dx a hy hx hi hp have P1:(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size=a.size+1:=ϣ _ have P2:∀j<(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size, (a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx))[j]! =windowAt s I y x (cb*(s.kh*s.kw)+j):=by intro j hj;rw[P1]at hj;rw[wP _ _ j hj];split ·exact hp j ‹_› ·rw[N2 (Z0 hj) (X2.1 ‹_›)];exact hi▸wndA s I y x c dy dx hy hx have Q:c*(s.kh*s.kw)+dy*s.kw+(dx+1)=cb*(s.kh*s.kw)+(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size:=by rw[P1];exact congrArg Nat.succ hi rw[show a.size+(n+1)=(a.push (wv1 s I (y*s.stride) (x*s.stride) c dy dx)).size+n by rw[P1,pA,Τ 1 n]] show O0 (@ite _ _ _ _ _)=_∧∀j<_,(@ite (Ἂ Word) _ _ _ _)[j]! =_ split ·exact ih c dy (dx+1) _ hy ‹_› Q P2 ·rw[N2 (Vl hx) (X2.1 ‹_›),pA,←nO]at Q;split ·exact ih c (dy+1) 0 _ ‹_› (E4 hx) Q P2 ·rw[N2 (Vl hy) (X2.1 ‹_›),←nO]at Q;exact ih (c+1) 0 0 _ (E4 hy) (E4 hx) (by rw[ϳ];exact Q) P2 @[noinline]def aB(kk k cb o y x:Nat):Word:= if 0if iif iif iif iif iif iabsurd hj ц) rw[g3];exact W.2 i (by simpa using h) ·rfl ·rfl lemma zrDot2(n:ℕ)(D a:ℕ→Ἃ)(m:∀ssimp only[tm,h,z,show sv (0x80000000:Ἃ)=0 by decide,mul_zero,zero_mul] ·rw[show k=n by omega,c];simp only[tm,z,mul_zero,zero_mul] rw[bI _ _ _ g,j,zrNC _ _ n 0 (by rw[Κ,ab _ D n щ,ab _ a n щ,d,c];decide),Zs];decide @[inline]def wA1(I:Ἂ Ἃ)(h w y x t:Ἀ):Ἃ:=if y ≥ h∨x ≥ w then 0 else I[(t*h+y)*w+x]! lemma wA1_eq(a:s.kh=1)(d:s.kw=1)(c:s.stride=1)(e: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[a,d,c,e,ϻ,I4,Je,ϑ,pQ,D4,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 lemma zpW1_ok(h w k a o y x:Ἀ):∀n,zpW1 I K h w k a o y x n=true→∀tnomatch d |n+1,c,t,d=>by have ⟨g,c⟩:=(Η _ _).mp c rcases BJ (Z0 d) with rfl|d ·simp only[nM,AQ]at g;exact or_assoc.1 g ·exact zpW1_ok h w k a o y x n c t d lemma aBz2(c k d o y x:Ἀ)(e:b[o]! =0)(h:∀tby simp only[AD a];exact h t a) (λt a=>by simp only[AD a];unfold windowAt;dsimp only;split;decide;exact hi _) (λt a=>(AD a).symm▸g _) ц (by simp[e]) 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 (O2 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:Ἃ):ἆ:=(U7 ((u>>>23)&&&255)) def df(I:Ἂ Ἃ)(B:ἆ)(stop:Ἄ)(hs:(J0 stop)<=(O0 I))(e:Ἄ)(acc:ἆ):ἆ:= if h:eomega lemma jC(h:((lq x):Ἁ)≡v [ZMOD2^(64:Ἀ)])(d:-2^(63:Ἀ)<=v) (e:v<2^(63:Ἀ)):ae x=v:=by rw[eQ];have:=x.toNat_lt;rw[pe]at h;omega noncomputable def Z:ZMod (2^(64:Ἀ)):=(lq x) lemma iB:((lq x):Ἁ)≡v [ZMOD2^(64:Ἀ)]↔Z x=v:=by rw[Z,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,Y4] lemma iX(b:ἆ):Z (a-b)=Z a-Z b:=by have d:=b.toNat_lt;unfold Z;rw[Ζ,BN,Y4,pO d.le,show((2^(64:Ἀ):Ἀ):ZMod (2^(64:Ἀ)))=0 from ZMod.natCast_self _,zero_sub,neg_add_eq_sub] 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[Kn,am,γ ((E0 (g.trans l) m).trans_lt ж)]at q rw[q];exact⟨H0 _ _,(Τ _ _).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 (Θ ш d) ф 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 (Zo.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 clear * - p;omega))) lemma jK(b:ἆ):((lq (a+b)):Ἁ)≡((lq a):Ἁ)+(lq b) [ZMOD2^(64:Ἀ)]:=by rw[η];push_cast;exact Int.mod_modEq _ _ 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 lemma 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:ℕ):=(Kw.2 (Ϟ (j.trans_eq (m7 2 39 25)))).trans_eq (Ul 2 25) have c:((E/2^(63:ℕ):ℕ):ℤ)<=1:=B3.2 (Zf.1 (Ϟ (l.trans_eq (Gr 2 63)))) have a:-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⟨AZ ж (Wa (Int.sub_le_sub (Wa (K5 _) a.1) c) p.1),AN (Wr (Int.sub_lt_sub_of_lt_of_le (Wr hA a.2) (K5 _)) p.2) ж⟩ 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 (·%2^64) (congrArg (·+(lq e)) (Yu _ _ (2^39))) 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 Ub 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 rw[Gb,J2 g,J2 j]: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 (I6 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 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 have _b:=@lp.eq_1;clear _b intro n;induction n<;>intro o y a l h;exact h;rename_i n e;have d:=j o y a l h;show S _ (if _ then _ else _);split;exact(congrArg (S · _) (lO (o*H+y) 1 n)).mp (e o (y+1) _ ‹_› d);obtain rfl:H=y+1:=N2 (X2.1 ‹_›) l;exact(congrArg (S · _) ((congrArg (·+n) (nO o (y+1))).trans (lO (o*(y+1)+y) 1 n))).mp (e (o+1) 0 _ (S9 y) ((congrArg (S · _) (nO o (y+1))).mpr 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 (M4 A)▸u _ _ _ _ e A λj x=>by obtain⟨l,m,p⟩:=cf o y j H W e x;simp only[Ϗ W (o*H+y),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 have _b:=@dc.eq_1;clear _b;intro m;induction m<;>intro x e M l;rfl;rename_i n o;have d:=l 0 (S9 n);rw[ϑ,ϑ,show(G0 (0:Ἀ))=0 from ἅ,USize.mul_zero,Jr]at d;rw[dc,<-d,ec,o _ _ _ λj p=>by rw[(U9 M j),l _ (I1 p 1),(U9 x j).symm,show(G0 (j+1))=(G0 j)+1 from mC j 1,USize.mul_add,USize.mul_one,I9,Ux (s*_)],U9] 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,Ϛ] .rw[Ka h,ϳ,A7];exact Array.ofFn_zero.symm 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 have _b:=@wl.eq_1;clear _b intro n;induction n<;>intro j e d l;rfl;rename_i m;show(if _ then _ else _)=_;rw[BS,Ϸ,(by rw[Τ,Ρ _ _ (E4 l),ώ l,Κ]:(j*k+e)/k=j),(by rw[Τ,Μ,mo l]:(j*k+e)%k=e)];split;exact m j (e+1) _ ‹_›;obtain rfl:k=e+1:=N2 (X2.1 ‹_›) l;rw[(by rw[lO _ e w,nO,←pA];exact BK (U+j*w+w) (e+1):U+j*w+e+w+1-(e+1)=U+(j+1)*w+0),m (j+1) 0 _ (S9 e),nO,ϑ,←pA] 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 only[ϳ,ϑ]at this;rw[List.range_eq_range'];exact this lemma aa(h:n<2^(32:Ἀ)):(J0 (G0 n))=n:=j9 h lemma fJ:Z x=(((lq x):Ἁ):ZMod (2^(64:Ἀ))):=(X4 _).symm lemma gS:Z x=((ae x:Ἁ):ZMod (2^(64:Ἀ))):= (iB x _).mp (by rw[eQ,Int.modEq_iff_dvd,sub_sub_cancel_left];exact dvd_neg.2 (dvd_mul_right _ _)) 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) (O9 (2^63) m.toNat) щ .exact sZ _ _ (by rw[iX,bF,fJ,zero_sub,Kz]) щ щ 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:α)(c:Bc1 ⟨h.1.lt_of_ne a,h.2⟩).symm) lemma fcUs(I:Ἂ kF)(p d n:Ἄ)(g:(O0 I)<2^(32:Ἀ))(i:(J0 p)+(J0 n)<=(O0 I)):∀m (j:Ἄ)(Y:ἀ)(a:(J0 d)+(J0 n)<=(kS Y)/\(kS Y)<2^(32:Ἀ)),(J0 n)-(J0 j)=m-> (kS (fcU I p d n g i j Y a))=(kS Y)/\∀q<(kS Y),(fcU I p d n g i j Y a).data[q]! = if (J0 d)+(J0 j)<=q/\q<(J0 d)+(J0 n) then dw I[(J0 p)+(q-(J0 d))]! else Y.data[q]!:=by intro m;induction m<;>intro j Y a e ·have k:=W1 e;rw[fcU,dite_eq_right λh=>X2.2 k (ε.1 h)];exact⟨ἅ,λq _=>by rw[AC λh=>AX _ (h.2.trans_le ((J1 k _).trans h.1))]⟩ rename_i r;have l:=N1 e;have h:=ε.2 l;have c:=(O1 l dб).trans_le a.1;have dj:=Dense.aj (c.trans (a.2.trans_le ς));rw[fcU,AT h];have o:=uZ _ _ (xbW (I.uget (p+j) (uj g i h))) (dj▸c);obtain⟨u,v⟩:=r (j+1) _ (o▸a) (by rw[Dense.ac h,Q3,e,BK]);refine⟨u.trans o,λq hq=>?_⟩;rw[v q (hq.trans_eq o.symm),Dense.ac h,fuS _ _ _ _ _ hq,dj];exact fcUs_h2 _ _ _ _ (λq=>dw I[pб+(q-dб)]!) _ _ l (by rw[xbE,kr,Dense.aj (((O1 l _).trans_le i).trans (g.trans_le ς)),ϱ]) lemma xbG{I:Ἂ kF}{Y:ἀ}{p d w:Ἄ}(i:I.size<2^32):(Y.size<=4294967295∧w<=I.usize∧p<=I.usize-w∧w<=Y.usize∧d<=Y.usize-w)↔p.toNat+w.toNat<=I.size∧d.toNat+w.toNat<=Y.size∧Y.size<2^32:=by have u:=ς;have h:I.usize.toNat=I.size:=Dense.aa (U1 i u);constructor ·rintro⟨a,b,c,e,f⟩;have g:Y.usize.toNat=Y.size:=Dense.aa (U1 (J3 a) u);simp only[R4,R6 _ _ b,R6 _ _ e,h,g]at b c e f;exact⟨Gc b c,Gc e f,J3 a⟩ ·rintro⟨a,b,c⟩;have g:Y.usize.toNat=Y.size:=Dense.aa (U1 c u);have e:=AZ (H0 _ _) a;have f:=AZ (H0 _ _) b;simp only[R4,R6 _ _ (R4.2 (h▸e)),R6 _ _ (R4.2 (g▸f)),h,g];exact⟨Z0 c,e,Z4 a,f,Z4 b⟩ def fRU(I:Ἂ Ἃ)(hs:(O0 I)<2^(32:Ἀ))(w V U h n:Ἄ)(r p d y:Ἄ)(Y:ἀ):ἀ:= if hr:r(J0 r)<=(J0 n)->(J0 y)=(J0 r)%s.h->(J0 p)=(J0 r)*s.w->(J0 d)=((J0 r)/s.h*(s.h+2)+(J0 r)%s.h+1)*(s.w+2)+1-> (s.cin*(s.h+2)+3)*(s.w+2)<=(kS Y)->(kS Y)<2^(32:Ἀ)-> (∀q<(kS Y),Y.data[q]! =dw (if q/((s.h+2)*(s.w+2))*s.h+(q/(s.w+2)%(s.h+2)-1)<(J0 r) then aI s I (q/((s.h+2)*(s.w+2))) (q/(s.w+2)%(s.h+2)) (q%(s.w+2)) else 0))-> (kS (fRU I t w V U h n r p d y Y))=(kS Y)/\∀q<(kS Y),(fRU I t w V U h n r p d y Y).data[q]! =dw (aI s I (q/((s.h+2)*(s.w+2))) (q/(s.w+2)%(s.h+2)) (q%(s.w+2))):=by intro m;induction m<;>intro r p d y Y e a b c f N O J ·have E:=W1 e;rw[fRU,dite_eq_right λh=>AX _ (U1 (ε.1 h) E)];refine⟨ἅ,λq hq=>?_⟩;rw[J q hq];refine congrArg dw ?_;split;rfl;rename_i k;rw[aI,AC];rintro⟨u,v,x,-⟩;have:=ι s.h u;rw[Ο]at this;exact k (U1 (O1 (U1 (Qs v ж) x) _) (AZ this (F▸E))) rename_i ih;have R:=N1 e;have B:=ε.2 R;have C:=ϛ rб s.h;have A:=ϊ rб z;have cl:rб/s.hk (H6.1 (T.trans (j.trans M.symm))) obtain⟨l,i⟩:=(Wh z).2 (⟨by rw[lO,Τ (rб%s.h),C],U4 A (b▸this)⟩:rб%s.h+1+s.h*(rб/s.h)=rб+1/\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)]!:=(AB A _ h).symm 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[lJ,Dense.aa щ,γ (U1 щ ς)] lemma j2(A B:A8)(h:∀r<8,A.f r=B.f r):A=B:=by cases A;cases B;rw[A8.mk.injEq];refine⟨h 0 ?_,h 1 ?_,h 2 ?_,h 3 ?_,h 4 ?_,h 5 ?_,h 6 ?_,h 7 ?_⟩<;>decide lemma kq(p:Ἀ->Ἅ)(n t:Ἀ)(a:Ἅ)(h:tἍ)(n t:Ἀ)(a:Ἅ)(h:¬thh+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=W0 (s.w+2) k9:Ἀ hk9:k9=k/9 lemma cZ(n:Ἀ):(kS (kJ n))=0:=ἅ def fQ:Bool:=System.Platform.target.startsWith "aarch64" structure CC(M:Ἀ)where Tz:Ἂ Ἀ Wz:ἀ wo:Ἀ n:Ἀ ni:Ἆ h1:n<=(O0 Tz) h2:wo+n<=(kS Wz) h3:wo+n<2^32 h4:∀td.X.get! (q+d.T[t]!)*dw d.K[ko+t]!) (λ_=>dw oneW*dw d.b[o]!) λ_=>act d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x) @[inline]def czZ(a:Ἅ):Ἆ:=a == -a lemma czK(n:Nat)(h:n<2^32):(W0 n).toNat=n:=X3 (U1 h ς) lemma czK1:(1:Ἄ).toNat=1:=czK 1 ж lemma czK2:(2:Ἄ).toNat=2:=czK 2 ж lemma 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+2e.1.1|1,_=>e.1.2|2,_=>e.2 @[inline]def cz9(X:ἀ)(b V:Ἄ)(h:b.toNat+V.toNat+V.toNat+2rw[ϳ,ϑ];exact cz3_ok X b _ s e.1.1 _ r |1,_=>rw[n4,←u];exact cz3_ok X (b+V) _ s e.1.2 _ r |2,_=>rw[L7,←pA,←w];exact cz3_ok X (b+V+V) _ s e.2 _ r 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+2nomatch hi | 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 (Ao (C0 (AZ (AZ (V1 b _) (V1 _ _)) (V1 _ _)) h) s)]at k;rwa[ϳ,ϑ] ·nomatch e.1 ·rw[Ο,Τ (i*P),←pA];exact czX9_ok X P V s c _ e.2 i (Nat.lt_of_succ_lt_succ hi) lemma cz3_of(X:ἀ)(p:Ἄ)(h:p.toNat+2decide lemma cz9_of(X:ἀ)(b V:Ἄ)(h:b.toNat+V.toNat+V.toNat+2by have k:=e (j+q*3) щ;rwa[Ρ _ _ ж,Μ,ώ a,γ a,Κ]at k have u:=czU b V (Ao (C0 (AZ (V1 _ _) (V1 _ 2)) h) s);have w:(b+V+V)б=bб+Vб+Vб:=u▸czU (b+V) V (u▸Ao (C0 (V1 _ 2) h) s) simp only[cz9,Η];refine⟨⟨cz3_of X b _ s (λj a=>by have k:=E j a 0 ж;rwa[ϳ,ϑ]at k),cz3_of X (b+V) _ s (λj a=>by have k:=E j a 1 ж;rwa[n4,←u]at k)⟩,cz3_of X (b+V+V) _ s (λj a=>by have k:=E j a 2 ж;rwa[two_mul,←pA,←w]at k)⟩ lemma czK3:(3:Ἄ).toNat=3:=czK 3 ж lemma czK6:(6:Ἄ).toNat=6:=czK 6 ж lemma czK7:(7:Ἄ).toNat=7:=czK 7 ж @[inline]def c10(X:ἀ)(p:Ἄ)(h:p.toNat+9rw[ϳ,ϑ];exact c10_ok X b _ s e.1.1 |1,_=>rw[n4,←u];exact c10_ok X (b+V) _ s e.1.2 |2,_=>rw[two_mul,←pA,←w];exact c10_ok X (b+V+V) _ s e.2 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+9rfl | c+1,b,e,r,g=>by simp only[czRX,Η]at e;split at e ·have k:=cr30_ok X _ V _ s e.1;rw[czK b (by omega)]at k simp only[czX9,Η];refine⟨?_,by rw[lO];exact czRX_X9 X P V s c _ e.2 r g⟩ rw[AT щ];apply cz9_of;rw[czK (b+r) щ] intro j i;have:=k (j/3) (Ϟ i) (r+j%3) (J5 g (Z0 (ϊ j (by decide:0<3))));rwa[←pA,lO b]at this ·nomatch e.1 open Float.Model.UnpackedFloat in lemma czSg(u:Float.Model.UnpackedFloat)(a:u≠.notANumber)(c:∀s,u≠.zero s):unpackSign (pack .binary64 u)≠unpackSign (pack .binary64 u.neg):=by cases u with | notANumber=>nomatch a rfl | zero s=>nomatch c s rfl | infinity s=>simp only[neg,pack,packedInfinity,unpackSign_packComponents];cases s<;>decide | finite s m e d=>simp only[neg,pack];split_ifs<;>simp only[packedInfinity,unpackSign_packComponents]<;>cases s<;>decide lemma czNZ(a:Ἅ)(h:czZ a=true):∃s,a.toModel.unpack=.zero s:=by by_contra! hz;obtain⟨g,-,e|⟨e,_⟩|⟨e,_⟩⟩:=(Wi _ _).1 h<;>try exact hz _ e have E:I5 a.toModel.unpack=I5 a.toModel.unpack.neg:=by (conv_lhs=>rw[e,fzPU]);rfl have d:=congrArg (λm:Float.Model=>Gz (spec:=.binary64) m.toBits.toBitVec) E simp only[I5,UInt64.toBitVec_ofBitVec]at d;exact czSg _ g hz d lemma 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 c;have q:=congrArg mJ c simp only[kB,lK,Ξ,Υ,kN,kH,β]at q m0 rw[ζ _ 8]at q;rw[ζ _ 23]at m0 have l:=w.toNat_lt;exact (show w.toNat=0∨w.toNat=2^31 by omega).imp (Β.mp ·) (Β.mp ·) ·omega lemma czDZ(w:ἇ)(d:kB w≠255)(h:czZ (dw w)=true):w=0∨w=0x80000000:=by obtain⟨s,c⟩:=czNZ _ h;have r:=(cI w d).2;rw[iL,c,Jj s]at r exact czW w (by simpa using r) lemma czWF(s:ConvShape)(I:Ἂ ἇ)(a:∀q:Nat,kB I[q]!≠255)(y x t:Nat):kB (windowAt s I y x t)≠255:=by unfold windowAt;dsimp only;split;decide;exact a _ @[inline]def zpC(d:@&CD)(o y x:Ἀ):Ἆ:= if d.z9 then czX9 d.X d.P9 d.V9 d.hX ((if d.D then o else 0)*d.P9+y*(d.s.w+2)+x) d.k9 else if d.s.kh==1&&d.s.kw==1&&d.s.stride==1&&d.s.pad==0&&d.kk==1 then zpW1 d.I d.K d.s.h d.s.w d.k (if d.D then o else 0) o y x d.k else false lemma zpC_ok(d:CD)(v:Nat)(i:d.k=v*d.kk)(j:(d.s.cin*(d.s.h+2)+3)*(d.s.w+2)<=(kS d.X))(k:∀q:Nat,kB d.I[q]!≠255)(o y x:Nat) (l:∀tsimp[e] lemma ep(S:Ἅ)(h:ἆ)(e:ak S h<4294967296): kB (O2 (ak S h))≠255:=by unfold ak at e⊢;dsimp only at e⊢;split at e;rename_i d;rw[AD d];simp only[Η,AJ]at d;obtain⟨⟨⟨-,l⟩,-⟩,-⟩:=d;have m:(lq (Dense.F.eF S.toBits))<2048:=Ε _ _▸AO ϝ ж have o:(lq (S.toBits&&&0xfffffffffffff))<2^(52:Ἀ):=Ε _ _▸AO ϝ ж simp only[μ,Ζ,kA]at l;have k:=Dense.F.kEB _ m l simp only[μ,kA]at e;intro g;have j:=congrArg mJ g;simp only[kB,Ξ,Υ,Ϫ,kN,kH,β]at j;rw[ζ _ 8,γ e,g0 S.toBits k.1]at j;generalize (lq (Dense.F.eF S.toBits))-1085-110=E at j k;generalize (lq S.toBits)/2^(63:Ἀ)=Q at j;(clear * - k o j;omega) exact absurd e ж @[inline]def fz(S:Ἅ)(lo sp h:ἆ):ἆ:= let b:=S.toBits let u:=((b&&&0xfffffffffffff)+268435456)&&&536870911 let r:=((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29 if Dense.F.eF b-lo>>63)<<<31)+r-0x255000000 else ak S h lemma fz_g(u D:ἆ)(c:u-2097153<532676607)(d:D<=21):u-(((1:ἆ)<<h+1075-E<=21/\E-1195<253):fz S lo a h=ak S h:=by unfold fz;dsimp only;split · rename_i c;simp only[Η,AJ]at c;obtain⟨⟨k,g⟩,e⟩:=c;obtain⟨d,i⟩:=j _ k unfold ak;dsimp only;rw[AD];simp only[Η,AJ] exact⟨⟨⟨ϗ d ж,i⟩,fz_g _ _ g d⟩,e⟩ · rfl def wlo(h:Ἀ):ἆ:=I0 (max (h+1054) 1195) def wsp(h:Ἀ):ἆ:=I0 ((min 1448 (h+1076))-(max (h+1054) 1195)) lemma wok_h1(a b:Ἀ)(c:a<=b)(d:b<18446744073709551616):(18446744073709551616-a+b)%18446744073709551616=b-a:=by rw[←M8 (c.trans d.le),Xb c,Xo,γ ((I2 b a).trans_lt d)] lemma wok_h2(h e:Ἀ)(d:h<1024)(n: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 l:=le_max_left (h+1054) 1195 have g:=le_max_right (h+1054) 1195 have a:max (h+1054) 1195<=2078:=max_le (U2 (I1 d 1054)) ж have m1:=min_le_left 1448 (h+1076) have j:=min_le_right 1448 (h+1076) rw[γ (a.trans_lt ж),γ (((I2 _ _).trans m1).trans_lt ж)]at c generalize max (h+1054) 1195=lo at l g a c generalize min 1448 (h+1076)=m at m1 j c have le:lo<=e:=by omega rw[wok_h1 lo e le n]at c have i:=(Nat.sub_lt_sub_iff_right le).1 c have k:h+1075<18446744073709551616:=(I1 d 1075).trans ж rw[γ (d.trans ж),γ k,wok_h1 e (h+1075) (Z0 (i.trans_le j)) k,wok_h1 1195 e (g.trans le) n] omega lemma wok(h:Ἀ)(a:h<1024):∀E:ἆ,E-wlo h(I0 h)+1075-E<=21/\E-1195<253:=λE c=>by unfold wlo wsp at c;simp only[μ,θ,Ζ,η,Ϣ,J6,mY,kH,nr]at c ⊢;exact wok_h2 h _ a E.toNat_lt c lemma wlt(P L:Ἀ)(a:P+L<=425)(b:L<=27):P+2*L-54<1024:=by omega noncomputable def bVo(d:CD)(o y x:Ἀ)(S:Ἅ):Ἃ:= let c:=ak S d.hh if h:c<4294967296 then dR d.J (O2 c)else ow d o y x S @[inline]def jv(J:Ἆ)(d:@&CD)(S:Ἅ)(k:Unit→Ἃ):Ἃ:= let b:=S.toBits let t:=(b&&&0x7FFFFFFFFFFFFFFF)+268435456 if Dense.F.eF b-d.lo>>29&&&8388607!=0 then dR J (O2 (((b>>>63)<<<31)+(t>>>29)-0x255000000)) else let c:=ak S d.hh;if c<4294967296 then dR J (O2 c) else k () noncomputable def bV(d:CD)(o y x:Ἀ)(S:Ἅ):Ἃ:=jv d.J d S λ_=>ow2 d o y x S lemma ju5(b:ἆ)(c:Dense.F.eF b-1195<253):((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+268435456)>>>29)-0x255000000<4294967296:=by have e:lq (Dense.F.eF b)<2048:=by rw[Dense.F.eF,Ε];exact AO ϝ ж rw[μ,Ζ]at c;simp only[kA]at c;have m:=Dense.F.kEB _ e c;rw[μ,g0 b m.1];have:=b.toNat_lt;have:lq (b&&&0xfffffffffffff)<2^52:=by rw[Ε];exact AO ϝ ж simp only[kA];omega lemma ju1(b:ἆ):((b&&&0x7FFFFFFFFFFFFFFF)+268435456)&&&536870911=((b&&&0xfffffffffffff)+268435456)&&&536870911:=by have q:∀x:Ἀ,x&&&536870911=x%536870912:=(ζ · 29);rw[←ξ];simp only[η,Ε,kA,Dense.F.mA63,Dense.F.mQ52,q];have:=b.toNat_lt;omega 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 next e=>rw[jI _ _ (ep _ _ e),ow,twF,tf];dsimp only;rw[AD e];split;swap;rfl;rename_i c;simp only[Η,AJ]at c;rw[c.1.1];exact kAkN _ _ e c.1.2 rfl @[inline]def su(a:Ἂ Ἃ)(u:Ἄ)(v:Ἃ):Ἂ Ἃ:= if h:urw[pP,Xj,Gm,AT (AN (ε.1 h) (Ay _ _))] rfl @[specialize]def pl(g:Ἀ->Ἃ)(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/\iby induction m with |zero=>intro r a l o;have k:=M0.1 l;rw[pl,AC k.not_gt];exact⟨ἅ,λi e=>by rw[AC (by intro h;exact(J1 k q).not_gt (C0 h.1 h.2))]⟩ |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[<-X5,l,BK]) h;rw[pl,AD h,u,BU];refine⟨ἅ,λi e=>?_⟩;rw[j i (by rwa[BU])];by_cases d:q+r=i;subst d;rw[H8 _ _ _ e,AC (by intro c;exact AX (q+r) c.1),AD (by exact⟨AP,O1 h q⟩),ϱ] rw[P7 _ _ _ _ d];exact if_congr ⟨λx=>⟨U2 x.1,x.2⟩,λx=>⟨x.1.lt_of_ne d,x.2⟩⟩ rfl rfl @[inline]def lnF(f:Nat→Ἅ→Word)(nq q r:Ἄ)(S:Ἅ)(a:Ἂ Word):Ἂ Word:= if rif z&&r<8 then 0 else ow2 d o y ((J0 xb)+r) S lemma jzS(d:CD)(J:Ἆ)(i:d.J=J)(o y:Nat)(a:Ἄ)(c:Ἆ):jz J d o y a (c&&zk d o y a)=λr S=>bV d o y ((J0 a)+r) S:=by subst i;funext r S;unfold jz bV;congr 1;funext;split next z=>simp only[zk,Η,AQ,AJ]at z;obtain⟨⟨-,⟨e,g⟩,hR⟩,h⟩:=z;rw[owZ _ _ _ _ _ e (zpC_R _ _ _ _ g hR r h)];cases d.J<;>decide rfl lemma uq{u q:Ἄ}(h:8<=u∧q<=u-8):(J0 q)+8<=(J0 u):=by have:=R4.1 h.1;have:=R4.1 h.2;rw[R6 _ _ h.1]at this;simp only[kD]at *;omega lemma uk2{a:Ἂ Ἃ}{i k:Ἄ}(d:(J0 k)<8)(h:(J0 i)+8<=(J0 a.usize)):(J0 (i+k))<(O0 a):=by have:J0 a.usize=O0 a%kX:=by simp[Q8] have:=Ay (O0 a) kX;have:=a.usize.toNat_lt_size;rw[Dense.aj щ];omega @[inline]def fC8g(a:Ἂ Ἃ)(q:Ἄ)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(h:(J0 q)+8<=(J0 a.usize))(f:Ἀ→Ἅ→Ἃ):Ἂ Ἃ:= ((((((((a.uset q (f 0 a0) (by simpa using uk2 (k:=0) ц h)).uset (q+1) (f 1 a1) (by simp only[BT];exact uk2 ц h)).uset (q+2) (f 2 a2) (by simp only[BT];exact uk2 ц h)).uset (q+3) (f 3 a3) (by simp only[BT];exact uk2 ц h)).uset (q+4) (f 4 a4) (by simp only[BT];exact uk2 ц h)).uset (q+5) (f 5 a5) (by simp only[BT];exact uk2 ц h)).uset (q+6) (f 6 a6) (by simp only[BT];exact uk2 ц h)).uset (q+7) (f 7 a7) (by simp only[BT];exact uk2 ц h)) @[noinline]def fCp(d:@&CD)(o y:Nat)(xb nq q:Ἄ)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(a:Ἂ Word):Ἂ Word:= let f:=jz d.J d o y xb (czZ a0&&zk d o y xb) lnF f nq q 7 a7 (lnF f nq q 6 a6 (lnF f nq q 5 a5 (lnF f nq q 4 a4 (lnF f nq q 3 a3 (lnF f nq q 2 a2 (lnF f nq q 1 a1 (lnF f nq q 0 a0 a))))))) @[noinline]def fC8(d:@&CD)(o y:Ἀ)(xb nq q:Ἄ)(a0 a1 a2 a3 a4 a5 a6 a7:Ἅ)(a:Ἂ Ἃ):Ἂ Ἃ:= if h:8<=nq∧8<=a.usize∧q<=a.usize-8 then let z:=czZ a0&&zk d o y xb if d.J then fC8g a q a0 a1 a2 a3 a4 a5 a6 a7 (uq h.2) (jz true d o y xb z) else fC8g a q a0 a1 a2 a3 a4 a5 a6 a7 (uq h.2) (jz false d o y xb z) else fCp d o y xb nq q a0 a1 a2 a3 a4 a5 a6 a7 a @[inline]def a9(d:CD)(o y:Ἀ)(xb nq q:Ἄ)(A:A8)(a:Ἂ Ἃ):Ἂ Ἃ:= fC8 d o y xb nq q A.a0 A.a1 A.a2 A.a3 A.a4 A.a5 A.a6 A.a7 a lemma gE(g:Ἀ->kF)(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):=λm=>by induction m<;>intro r a d e;obtain rfl:=N2 e (M0.1 d);rw[pl,AD (Yv _),pl,AC (AX _),pl,AC (AX _)] rename_i j;rw[pl,AD (Nat.lt_add_one_of_le e),j (r+1) _ (by rw[←X5,d,BK]) (N1 d)];conv_rhs=>rw[pl,AD (N1 d)] lemma ka_h1{a b c k:Ἀ}(p:a+cbV d o y ((J0 g)+r) S) e q r S (pl (λr=>bV 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[lnF];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 . have p:=R4.1 ‹8<=e∧_›.1;simp only[kD]at p;dsimp only;have E:∀k:Ἄ,J0 k<8->J0 (q+k)=J0 q+J0 k:=λk B=>Dense.aj ((O1 (U1 B p) _).trans l);rw[(Q9 p:po 8 (J0 e)=8)] have c:∀a u (v:kF)(h:J0 uby rw[pP,Xj,Gm,AT h] split<;>rename_i i<;>rw[jzS d _ (by simpa using i)] all_goals unfold fC8g;iterate 8 rw[c] all_goals rw[E 1 (czK1▸by decide),E 2 (czK2▸by decide),E 3 (czK3▸by decide),E 4 (by simp only[kD,Ha]),E 5 (by simp only[kD,Ha]),E 6 (czK6▸by decide),E 7 (czK7▸by decide)] all_goals iterate 8 rw[pl,AD ж] all_goals rw[pl,AC ж];simp only[kD,ϑ];rfl unfold fCp;dsimp only;rw[jzS d d.J rfl];have L:=ka d o y g e q A a l;have j:=L 0 0 Ϧ A.a0 rfl;rw[Nat.zero_min,pl,AC (AX _)]at j;simp only[j,L 1 1 czK1 A.a1 rfl,L 2 2 czK2 A.a2 rfl,L 3 3 czK3 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 czK6 A.a6 rfl,L 7 7 czK7 A.a7 rfl,Kd] lemma l0(d:Ἄ)(h:0Ἅ->Ἅ->Ἅ)(fz:Ἀ->Ἄ->Ἄ->CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->A8->A8->Ἂ Ἃ->Ἂ Ἃ)(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(Wz X:@&ἀ)(Tz:@&Ἂ Ἀ)(wo n:Ἄ)(M:Ἀ) (H:((kS X)<2^(32:Ἀ)/\(kS Wz)<2^(32:Ἀ))/\(J0 n)<=(O0 Tz)/\(∀t<(J0 n),Tz[t]!<=M)/\(J0 wo)+(J0 n)<=(kS Wz)) (o y:Ἀ) (bp:Ἅ) (xb nq q i i2:Ἄ) (h0:0Ἅ->Ἅ->Ἅ)(fz:Ἀ->Ἄ->Ἄ->CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->A8->A8->Ἂ Ἃ->Ἂ Ἃ)(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(Wz X:@&ἀ)(Tz:@&Ἂ Ἀ)(wo n:Ἄ)(M:Ἀ) (H:((kS X)<2^(32:Ἀ)/\(kS Wz)<2^(32:Ἀ))/\(J0 n)<=(O0 Tz)/\(∀t<(J0 n),Tz[t]!<=M)/\(J0 wo)+(J0 n)<=(kS Wz)) (o y:Ἀ) (bp:Ἅ) (xb nq q i i2:Ἄ) (h0:0Ἅ->Ἅ->Ἅ)(fz:Ἀ->Ἄ->Ἄ->CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->A8->A8->Ἂ Ἃ->Ἂ Ἃ)(dy:Ἀ)(dx dq:Ἄ)(d:CD)(Wz X:ἀ)(Tz:Ἂ Ἀ)(wo n:Ἄ)(M:Ἀ) (H:((kS X)<2^(32:Ἀ)/\(kS Wz)<2^(32:Ἀ))/\(J0 n)<=(O0 Tz)/\(∀t<(J0 n),Tz[t]!<=M)/\(J0 wo)+(J0 n)<=(kS Wz)) (o y:Ἀ) (bp:Ἅ) (xb nq q i i2:Ἄ) (h0:0nomatch hm |succ m O=> have F:∀h8:8s8 nq h8▸(Qs (l0 nq h0) ж).trans_le (Z0 hm) obtain⟨k,hk⟩:∃k,J0 n-J0 t< k:=⟨_,M1 _⟩ induction k generalizing t a0 a1 a2 a3 a4 a5 a6 a7 b0 b1 b2 b3 b4 b5 b6 b7 with |zero=>nomatch hk |succ k IH=> refine(rBt2.eq_def ..).trans ((AT ht).trans ((dite_congr rfl (λh1=>?_) (λh1=>?_)).trans (rBt.eq_def ..).symm)) ·by_cases h2:t+1+1(h2 h).elim) (λ_=>dite_congr rfl (λh8=>?_) (λ_=>rfl))).trans (rBt.eq_def ..).symm);apply O;exact F h8 refine(rBt2.eq_def ..).trans ((dite_eq_right h1).trans (dite_congr rfl (λh8=>?_) (λ_=>rfl)));apply O;exact F h8 lemma eyX(X:ἀ)(e:Ἂ Ἀ)(i t:Ἄ)(M:Ἀ)(U:(kS X)<2^(32:Ἀ))(O:(J0 i)+M+8<=(kS X))(h:(J0 t)<(O0 e))(a:e[(J0 t)]!<=M)(k:Ἀ)(c:k<8)(j:(J0 (i+(G0 (e.uget t h))+G0 k))<(kS X)):X.uget (i+(G0 (e.uget t h))+G0 k) j=X.data[(J0 i)+e[(J0 t)]!+k]!:=by have L:=cj (i:=i) U O a;have:=aa k (c.trans ж);rw[ug,iQ,Dense.aj (by rw[L,this];exact(((Ja (J1 a _) c).trans_le O).trans U).trans_le ς),L,this] noncomputable def dK(d:CD)(c:CC d.M)(o y xb r:Ἀ):Ἅ:= 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 (dw oneW*dw d.b[o]!) abbrev FX(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M):Prop:=∀skF)(P:Ἀ->Prop)[DecidablePred P](a b:Ἂ kF):Prop:=(O0 b)=(O0 a)/\∀j<(O0 a),b[j]! =if P j then Ψ j else a[j]! abbrev HGp(d:CD)(c:CC d.M)(o:Ἀ)(Ψ:Ἀ->kF)(R:Ἀ):Prop:=∀y' g r,y'r<8->g+rbV d o y' (g+r) (dK d c o y' g r)=Ψ (R+y'*d.s.w+(g+r)) def rZ(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(o y:Ἀ)(B0:A8)(xb nq q:Ἄ)(a:Ἂ Ἃ):Ἂ Ἃ:= let a':=a92 dy dx dq d o y xb nq q B0 B0 a if h:8Ἅ->Ἅ->Ἅ)(dy:Ἀ)(dx dq:Ἄ)(d:@&CD)(c:@&CC d.M)(o y:Ἀ)(xb nq q i i2:Ἄ)(bp:Ἅ)(a:Ἂ Ἃ) (hI:(J0 i)+(J0 nq)+d.M+7<=(kS d.X))(hI2:(J0 i2)+(J0 nq)+d.M+7<=(kS d.X)):Ἂ Ἃ:= if h0:0kF)(R:Ἀ) (x:HGp d c o u R) (s:y+i(J0 q)<=j/\j<(J0 q)+po 8 (J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+po 8 (J0 e)) a (a92 i h dq d o y g e q A B a):=by obtain⟨z,D,I,H⟩:=q9b g e q h dq R y i _ _ v hq F hA;have t:=Dense.aj z;have G:=Dense.aj D;unfold a92;rw[iT d o y g e q A a I,iT d o (y+i) (g+h) e (q+dq) B _ (t▸H)] obtain⟨p,K⟩:=jS (λr=>bV d o y (J0 g+r) (A.f r)) (po 8 (J0 e)) (J0 q) _ 0 a rfl (ϟ _);obtain⟨p2,C⟩:=jS (λr=>bV d o (y+i) (J0 (g+h)+r) (B.f r)) (po 8 (J0 e)) (J0 (q+dq)) _ 0 _ rfl (ϟ _) refine⟨p2.trans p,λj J=>?_⟩;rw[C j (p▸J),K j J,t,G];simp only[ϑ];by_cases b1:J0 q+J0 dq<=j/\jProp}[DecidablePred P][DecidablePred Q][DecidablePred R](a:Ἀ->kF)(i g d:Ἂ kF) (c:Ch a P i g)(e:Ch a Q g d)(h:∀j,R j↔Q j\/P j):Ch a R i d:= ⟨e.1.trans c.1,λj J=>by rw[e.2 j (c.1▸J),c.2 j J];by_cases q:Q j<;>by_cases p:P j<;>simp[q,p,h]⟩ lemma q8v{i e:Ἄ}{M S:Ἀ}(v:(J0 i)+(J0 e)+M+7<=S)(a:0<(J0 e)):(J0 i)+M+8<=S:=by omega lemma q8p{i:Ἄ}{T M S r:Ἀ}(h:T<=M)(v:(J0 i)+M+8<=S)(I:r<8):(J0 i)+T+rq8c _ _ _ j a⟩<;>omega lemma kS1{n t k:Ἀ}(a:n-t=k+1)(h:t+1Ἅ->Ἅ->Ἅ)(fz:Ἀ->Ἄ->Ἄ->CD->Ἀ->Ἀ->Ἄ->Ἄ->Ἄ->A8->A8->Ἂ Ἃ->Ἂ Ἃ)(n:Ἀ)(h dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(D:Ἀ->kF)(R:Ἀ) (hF:FX mc d c)(HG:HGp d c o D R)(hz:∀n h dq d o y xb nq q A B a,fz n h dq d o y xb nq q A B a=a92 n h dq d o y xb nq q A B a) (hy:y+n (J0 g)+(J0 e)+(J0 h)<=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 x)=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+(y+n)*(d.s.w+2)+((J0 g)+(J0 h))-> (J0 q)=R+y*d.s.w+(J0 g)->(J0 q)+(J0 dq)+(J0 e)<=(O0 a)->(O0 a)<2^(32:Ἀ)-> ∀k (t:Ἄ) (H:t (∀r<8,dK d c o y (J0 g) r=ao (λs=>d.X.data[(J0 i)+c.Tz[s]!+r]!*c.Wz.data[c.wo+s]!) c.n (J0 t) (A8.f ⟨p0,p1,p2,p3,p4,p5,U,p7⟩ r))-> (∀r<8,dK d c o (y+n) ((J0 g)+(J0 h)) r=ao (λs=>d.X.data[(J0 x)+c.Tz[s]!+r]!*c.Wz.data[c.wo+s]!) c.n (J0 t) (A8.f ⟨r0,S,r2,r3,r4,r5,r6,X⟩ r))-> Ch D (λj=>(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rBt mc fz n h dq d c.Wz d.X c.Tz (G0 c.wo) (G0 c.n) d.M ⟨⟨d.hX,c.h5⟩,gYa d c⟩ o y (dw ld*dw d.b[o]!) g e q i x C v v2 a t H p0 p1 p2 p3 p4 p5 U p7 r0 S r2 r3 r4 r5 r6 X):=λm=>by induction m with |zero=>intro g e q i x a C _ _ hm;cases(l0 e C).not_ge hm |succ m ih=> intro g e q i x a C v v2 hm hx L L2 hq hs J k;have u:=q8v v (l0 e C);have V:=q8v v2 (l0 e C);have F:=aa _ (C0 le_add_self c.h3);have w2:=aa _ (C0 (V1 _ _) c.h3) induction k using Um with |_ k O=> intro t H _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hk K K2;have Y:=ε.1 H;rw[F]at Y;have G:=c.h4 _ Y have J':∀j,c.Wz.uget (G0 c.wo+t) j=c.Wz.data[c.wo+J0 t]!:=λj=>by rw[ug,czU _ _ (by rw[w2];exact (O1 Y _).trans c.h3),w2] have M:=λi(u:J0 i+d.M+8<=kS d.X)r(I:r<8)p z w=>(hF _ Y _ (q8p G u I) z).symm.trans (congrArg₂ (mc z) (eyX _ _ _ _ _ d.hX u (U1 Y c.h1) G r I p).symm (J' w).symm);have T:=Dense.ac H;unfold rBt;dsimp only;by_cases h1:t+1by rw[K r I,kq _ _ _ _ Y,T];congr 1;interval_cases r<;>exact M i u _ I _ _ _) (λr I=>by rw[K2 r I,kq _ _ _ _ Y,T];congr 1;interval_cases r<;>exact M x V _ I _ _ _) have hN:¬J0 t+1by have:=U1 I (min_le_left _ _);rw[←hA,K r this,kq _ _ _ _ Y,kp _ _ _ _ hN];interval_cases r<;>exact (M i u _ this _ _ _).symm) (λr I=>by have:=U1 I (min_le_left _ _);rw[←hB,K2 r this,kq _ _ _ _ Y,kp _ _ _ _ hN];interval_cases r<;>exact (M x V _ this _ _ _).symm) by_cases l:8by unfold dK;rw[L3,Ϧ,Dense.F.f8]) (λr I=>by unfold dK;rw[L4,Ϧ,Dense.F.f8])) P rw[dite_eq_right l];have:=mt ε.2 l;simp only[kD]at this;rwa[min_eq_right (not_lt.1 this)]at B lemma rZc(k:Ἀ)(h dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(n:Ἀ->kF)(R:Ἀ)(H:HGp d c o n R) (t:y+k(J0 g)+(J0 e)+(J0 h)<=d.s.w->(J0 q)=R+y*d.s.w+(J0 g)->(J0 q)+(J0 dq)+(J0 e)<=(O0 a)->(O0 a)<2^(32:Ἀ)-> Ch n (λj=>(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rZ k h dq d o y i g e q a):=by have Z:∀D x r,i.f r=dK d c o D x r:=λ_ _ _=>by unfold dK;rw[z,n0,ao,AC (AX 0)] intro m;induction m using Um with |_ m w=> intro g e q a C s hq p J;have B:=a92c d c o y k h dq g e q i i a n R H t u s hq p J (λ_ _=>Z ..) (λ_ _=>Z ..);rw[rZ];by_cases l:8Ἅ->Ἅ->Ἅ)(k:Ἀ)(h dq:Ἄ)(d:CD)(c:CC d.M)(o y:Ἀ)(g e q i m:Ἄ)(a:Ἂ kF)(l:Ἀ->kF)(R:Ἀ) (C:FX mc d c)(s:HGp d c o l R) (t:y+k(J0 q)<=j/\j<(J0 q)+(J0 e)\/(J0 q)+(J0 dq)<=j/\j<(J0 q)+(J0 dq)+(J0 e)) a (rBc mc k h dq d c o y g e q i m (dw ld*dw d.b[o]!) a v A):=by have w:=aa _ (C0 (H0 _ _) c.h3) unfold rBc;by_cases p:0(try rw[rBt2_eq (ht:=n)])<;>exact je2 mc _ k h dq d c o y l R C s (by intros;rfl) t u _ g e q i m a p v A AP x L z hq B J (c.n-1) 0 n _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by rw[Ϧ,pQ,J2 this]) (λr I=>by unfold dK;rw[L,Ϧ,Dense.F.f8]) (λr I=>by unfold dK;rw[z,Ϧ,Dense.F.f8]) ·rw[dite_eq_right n];exact rZc k h dq d c o y l R s t u (Ka (by rwa[←w,←Ϧ,←ε])) _ (Dense.F.f8 _) _ g e q a AP x hq B J ·rw[dite_eq_right p];simp only[ε,Ϧ]at p;exact⟨ἅ,λj _=>by rw[AC (by clear*-p;omega)]⟩ @[specialize]def c8(h len:Ἀ)(V:Ἄ)(i0:Ἀ)(hN:i0+h*(J0 V)y(q:Ἀ)->(i:Ἄ)->(J0 i)=i0+y*(J0 V)->Ἂ Ἃ->Ἂ Ἃ) (y q:Ἀ) (i:Ἄ) (hi:(J0 i)=i0+y*(J0 V)) (a:Ἂ Ἃ):Ἂ Ἃ:= if hy:yy(q:Ἀ)->(i:Ἄ)->(J0 i)=o+y*(J0 V)->Ἂ kF->Ἂ kF) (r N:Ἀ) (G:Ἀ->kF) (F:∀y (g:y(O0 a)=N-> (O0 (f y g q i e a))=(O0 a)/\∀j<(O0 a),(f y g q i e a)[j]! =if q<=j/\jy<=h->q=r+y*d->(O0 a)=N-> (O0 (c8 h d V o x f y q i e a))=(O0 a)/\ ∀j<(O0 a),(c8 h d V o x f y q i e a)[j]! =if q<=j/\jintro y q i e a H g p l .cases g.antisymm (W1 H);rw[c8,dite_eq_right (AX _)];exact⟨ἅ,λj _=>by rw[AC (by clear*-p;omega)]⟩ rename_i K;have g:y?_⟩;rw[D j (v▸A),B j A];have:=J▸J1 (ι d g) r;clear*-this;split_ifs<;>first|rfl|omega lemma dbN(c H a M S:Ἀ)(d:c+(H-1)*(a+2)+a+M+7<=S):c+H/2*(2*(a+2))<=S:=by have:H/2*(2*(a+2))<=(H-1)*(a+2)+(a+2):=by rw[<-Ϛ,<-Ο];exact ι _ ((pr _ _).trans щ) omega lemma dbB(c H a M S y:Ἀ)(d:c+(H-1)*(a+2)+a+M+7<=S)(e:yZ9.trans_le (Ay _ _) have I:=hi.trans_le (J1 (U0 y (g _)) a) have h:∀X,X<=_→X+J0 (G0 d.s.w)+d.M+7<=kS d.X:=λX h=>(L1 (L1 (add_le_add h (g _)) _) 7).trans (dbB a d.s.h d.s.w d.M _ y c e) exact⟨h _ (I.trans (V1 _ _)),h _ (((lJ _ _).trans_le (Ay _ _)).trans (add_le_add I (by rw[d.hV9];exact g _)))⟩ @[specialize]def dbq(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:@&CD)(c:@&CC d.M)(o q i0:Ἀ)(bp:Ἅ)(a:Ἂ Ἃ)(hb:i0+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)):Ἂ Ἃ:= c8 (d.s.h/2) (2*d.s.w) (G0 (2*(d.s.w+2))) i0 (by have:=d.hX;have:=ς;have:=dbN _ _ _ _ _ hb;have:=U0 (d.s.h/2) (show (J0 (G0 (2*(d.s.w+2))))<=2*(d.s.w+2) by rw[lX,J7];exact Ay _ _);omega) (λy hy q i hi a=>rBc mc 1 0 (G0 d.s.w) d c o (2*y) 0 (G0 d.s.w) (G0 q) i (i+d.V9) bp a (dbP d i0 y i hb hy hi).1 (dbP d i0 y i hb hy hi).2) 0 q (G0 i0) (by rw[ϳ,ϑ];exact Dense.aa (by have:=d.hX;have:=ς;omega)) a @[specialize]def db(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:@&CD)(c:@&CC d.M)(o q:Ἀ)(bp:Ἅ)(a:Ἂ Ἃ):Ἂ Ἃ:= let i0:=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2)) if hb:i0+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)then let a':=dbq mc d c o q i0 bp a hb if d.s.h%2=1 then rBc mc 0 (G0 (d.s.w/2)) (G0 (d.s.w/2)) d c o (d.s.h-1) 0 (G0 (d.s.w-d.s.w/2)) (G0 (q+(d.s.h-1)*d.s.w)) (G0 (i0+(d.s.h-1)*(d.s.w+2))) (G0 (i0+(d.s.h-1)*(d.s.w+2)+d.s.w/2)) bp a' (by have:=d.hX;have:=ς;rw[Dense.aa щ,Dense.aa щ];omega) (by have:=d.hX;have:=ς;rw[Dense.aa щ,Dense.aa щ];omega) else a' else a lemma dbqC(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M)(o q g:Ἀ)(a:Ἂ kF)(h:Ἀ->kF)(A:FX mc d c) (z:HGp d c o h q) (hi:g=(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2)))(hq:q+d.s.h*d.s.w<=(O0 a))(hA:(O0 a)<2^(32:Ἀ))(n:g+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)): Ch h (λj=>q<=j/\jby have E:=dbB g d.s.h d.s.w d.M _ y n t;have F:=(Ο y 2).symm.trans_le ((_root_.Nat.le_div_iff_mul_le ж).1 (l7 t)) obtain⟨m,x,Z⟩:d.s.w+2<2^32/\2*(d.s.w+2)<2^32/\g+y*(2*(d.s.w+2))+(d.s.w+2)<2^32:=by clear*-E;have:=d.hX;omega have v:(J0 d.V9)=d.s.w+2:=by rw[d.hV9];exact czK _ m have m:=aa _ (C0 (V1 _ 2) m);have x:=aa _ x;have t1:=ι d.s.w F;rw[Ϡ,Ϛ]at t1 rw[x]at e;have p:=Conv.aa l (by rw[k];exact C0 ((J1 ((V1 _ _).trans t1) q).trans hq) hA) obtain⟨s,u⟩:=rBcC mc 1 0 (G0 d.s.w) d c o (2*y) 0 (G0 d.s.w) (G0 l) i (i+d.V9) w h q A z (Ϗ y 2▸F) (by rw[m,Ϧ,n4,ϑ]) _ _ (by rw[Ϧ,m,Κ,ϑ]) (by rw[e,hi,Ϧ];ring) (by rw[czU _ _ (by rwa[e,v]),v,e,hi,Ϧ];ring) (by rw[p,k,Ϧ];ring) (by rw[p,m,r,k,pA,pA,←L7];exact (J1 t1 q).trans hq) (r▸hA) exact⟨s,λj J=>by rw[u j J,p,m];exact if_congr (by clear*-;omega) rfl rfl⟩) _ 0 q _ _ a rfl (ϟ _) ц rfl lemma iG2(mc:Ἅ->Ἅ->Ἅ->Ἅ)(d:CD)(c:CC d.M)(o q:Ἀ)(a:Ἂ kF)(h:Ἀ->kF)(l:FX mc d c) (k:HGp d c o h q) (hq:q+d.s.h*d.s.w<=(O0 a))(hA:(O0 a)<2^(32:Ἀ)) (B:0(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+(d.s.h-1)*(d.s.w+2)+d.s.w+d.M+7<=(kS d.X)): Ch h (λj=>q<=j/\jby rw[p,s,i,<-Ϛ,w,<-r];have:=BQ (D d.s.w 2);clear*-this;omega) ·rw[AC o1];rwa[<-Ϛ,Jm (E8 (Nat.mod_two_ne_one.1 o1))]at e ·rw[dite_eq_right g];exact⟨ἅ,λj _=>by rw[Ka (g∘B),ϳ,AC (λ⟨u,v⟩=>AX _ (C0 u v))]⟩ def bA(K:Ἂ Ἃ)(T:Ἂ Ἀ)(M ok k:Ἀ)(hT:∀t(Hb (Z0 (N4 hj (ϣ ..)))).elim (λhjs=>N0 (Y3 (((AB (Tz.push T[t]!) j hj).trans (nU hjs)).trans (AB Tz j hjs).symm)) (hz j hjs)) (λhe=>N0 (Y3 ((congrArg (λ(i:Ἀ)=>(Tz.push T[t]!)[i]!) he).trans ((AB (Tz.push T[t]!) (O0 Tz) (N4 (M1 _) (ϣ ..).symm)).trans nV))) (hT t h))) else⟨Tz,Wz,0,(O0 Tz),fQ,AP,Y3 ((Κ _).trans hs),C0 (N0 (Y3 (Κ _)) (N0 hn ht)) hk,hz,C0 (N0 (Y3 hs.symm) (N0 hn ht)) hk⟩ termination_by k-t decreasing_by all_goals exact Z3 h (M1 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 a c-> NZ K T A k (bA K T M A k H I t a c p u v g).Tz (bA K T M A k H I t a c p u v g).Wz:=by have S:=@Jz.step;intro m;induction m with |zero=>intro t _ _ _ _ v _ L h;cases v.antisymm (W1 L);rwa[bA,dite_eq_right (AX _)] |succ m J=>intro t a c _ _ _ _ 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 B8 L) ?_;refine⟨p,Ve.step u,x,λj r=>(o j r).imp_left S,λz g=>?_⟩;rw[l z (λs D q=>g s (S D) q),Ν,g t (Jz.base t) G,Av];refine⟨by rw[ϣ,bW,p],by rw[ϣ];exact V7 u,λj=>if j<(O0 a)then x j else t,λj r=>?_,λz g=>?_⟩;by_cases d:j<(O0 a);obtain⟨U,N,O⟩:=o j d;refine⟨?_,?_,?_⟩<;>simp only[AD d];exact S U;rwa[AB _ _ (by exact r),nU d,<-AB a j d];rwa[pg _ _ _ (S (d.trans_eq p)),AD (d.trans_eq p)];rw[ϣ]at r;cases (Z0 r).antisymm (not_lt.1 d);refine⟨?_,?_,?_⟩<;>simp only[AC (AX _)];exact Jz.base t;rw[AB (a.push _) _ (N4 (M1 _) (ϣ ..).symm),nV];rw[pg _ _ _ (J3 p.le),AC (p▸AX _)];rw[ϣ,Ν,Ν];dsimp only;rw[AC (AX _),<-l z (λs D q=>g s (S D) q)];congr 1;exact ϔ ἅ λj r=>by rw[AD (ϥ.1 r)] 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 c d g e j l).n=(O0 (bA K T M q k o p t c d g e j l).Tz)/\ (bA K T M q k o p t c d g e j l).wo=0:=by intro m;induction m with |zero=>intros;rename_i a;rw[bA,dite_eq_right (eM_h1 a)];exact⟨ἅ,ἅ⟩ |succ m r=>intros;rename_i a;have b:=eM_h2 a;rw[bA,AT b.1];dsimp only;split<;>exact r _ _ _ _ _ _ _ b.2 lemma fm(d:CD)(Z:Ἆ)(p:ἀ)(u:∀t∀qἈ,c.n<=d.k/\ (∀jℝ,(∀sz s=0)-> ∑j∈kP c.n,z (m j)=∑s∈kP d.k,z s:=by by_cases D:Z=ἃ .have⟨⟨l,L⟩,J,I,m,g,r⟩:(c.n=(O0 c.Tz)/\c.wo=0)/\NZ d.K d.T (o*d.k) d.k c.Tz c.Wz:=by subst O;rw[dF,AT D];exact⟨eM _ _ _ _ _ u v _ 0 _ _ _ _ _ _ rfl,ft _ _ _ _ _ u v _ 0 _ _ _ _ _ _ rfl ⟨by rw[cZ];rfl,ϟ _,id,(λ_ h=>nomatch h),λz _=>rfl⟩⟩ refine⟨J▸C0 I v,m,l▸I,λj e=>by rw[L,Κ];exact g j (l▸e),l▸r⟩ subst O;rw[dF,dite_eq_right D];use(by dsimp only;exact(X.resolve_left D).2),id,AP,(λj e=>by dsimp only at e⊢;exact⟨e,ἅ,x (by simpa using D) (o*d.k+j) (U1 (O1 e _) (Ο _ _▸ι _ U))⟩),λ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/9h.elim j.not_ge g.not_ge).trans (AD ⟨e,y.succ_pos,j,x.succ_pos,g⟩).symm lemma 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[Ϗ,G6 ж],by rw[Τ (d*9) t,(Ϛ d 3 3).symm,Ρ t _ ж,Μ],by rw[Τ (d*9) t,(Ϛ d 3 3).symm,Μ]⟩ lemma iI(s:lR)(I:Ἂ kF)(e:Ἀ)(q:fP s e)(y x t d:Ἀ)(u:y?_⟩;rw[i q hq,aI,AC (by rw[c];exact (D4 _ ·.1))] have W:3*(s.w+2)<2^(32:Ἀ):=AO (ι _ (H0 3 _)) a;have V:s.cin*(s.h+2)+3<2^(32:Ἀ):=AO (H1 _ (P4 _)) a;obtain⟨u,v⟩:=fRUs I s d _ _ _ _ _ (aa _ e) (aa _ (AO (lZ _ ж) W)) (aa _ W) (aa _ (AO (AZ (AZ (V1 _ 2) (lZ _ c)) (V1 _ 3)) V)) (aa _ (AO (AZ (U0 _ (V1 _ 2)) (V1 _ 3)) V)) g a j _ 0 0 (G0 (s.w+3)) 0 _ ἅ (ϟ _) (Xs _).symm (ϳ _).symm (by rw[aa _ (by clear*-W;omega),Ϧ,Gq,Xs,ϳ,Κ,n4]) h Z (λq hq=>by rw[i q hq,Ϧ,AC (D4 _)]);rw[xF,u];exact⟨h,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:Ἅ) (I:S=ao (λj=>d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+ y*(d.s.w+2)+x+c.Tz[j]!]!*c.Wz.data[c.wo+j]!) c.n 0 (dw ld*dw d.b[o]!)): bVo d o y x S=p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x):=by have Z:=iS d.s _ A r have rA:=λi(j:Ἀ)=>(dh (ll d.s d.I y x i) d.K[j]! A O (Z _ _ _).2 (a _).2).trans (AU one_le_two U) have rB:=(dh ld _ 126 N ж (k o).2).trans (AU one_le_two D) have u:=dJ ld _ ж (k o).1 obtain⟨fS,eS⟩:=dM _ _ _ _ _ rfl▸dL (λ_=>ἄ) (λ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]!) _ P d.L c.n (λj g=>by obtain⟨F,L,K⟩:=e j g;rw[L,K,V _ F];exact dJ _ _ (Z _ _ _).1 (a _).1) (λ_ _ h=>absurd h lN) (λ_ _=>rA _ _) rB ((L1 C 2).trans n) m (w.trans ж) c.n 0 _ rfl (ϟ _) u.1 (by simp only[u.2,sum_range_zero,Av,sub_self,A5,J9,nv,le_refl]) rw[iE,I];unfold ow;simp only[gg];rw[aB_eq,Dense.bO] refine jEF _ _ _ _ _ _ _ _ _ _ (λt B=>by simp only[AD B,V t B];exact dJ _ _ (Z _ _ _).1 (a _).1) (by simpa only[AX,Am]using u) (λt _=>?_) (λs _=>by by_cases h:ssimp only[h,ἁ,ἂ];exacts[rA _ _,rB]) n m w G (by rfl) _ fS ?_ ·by_cases h:tsimp only[h,ἁ,ἂ];exacts[⟨(Z _ _ _).1,(a _).1⟩,⟨by decide,(k _).1⟩] ·refine((congrArg (|_-·|) ?_).symm.trans_le eS).trans ?_ ·rw[aK,af,K8,R9];exact (add_comm _ _).trans (congrArg₂ (·+·) ((ϔ rfl λj g=>by simp only[AD (e j (ϥ.1 g)).1]).trans (H _ λs J M=>by simp only[AD J,tm,cz d.K[o*d.k+s]! (by rw[<-an,M];rfl),mul_zero,nv,lH])) (by simp only[AX,Am])) have Y:(lq d.hh:Ἁ)=((d.L+(P+d.L):Ἀ):Ἁ)+(-54):=by clear*-G D;omega rw[Y,AK AL,AA,AF (2:ℝ) d.L (P+d.L),Ap];exact AE (by exact_mod_cast C.trans ((V1 _ 2).trans n)) ф lemma jQ2(d:CD)(c:CC d.M)(v A O N P:Ἀ)(l:Ἀ->Ἀ) (r:fP d.s d.kk) (Y:0ℝ,(∀sz s=0)-> ∑j∈kP c.n,z (l j)=∑s∈kP d.k,z s) (S:Ἅ) (hS:S=ao (λj=>d.X.data[(if d.D then o else 0)*((d.s.h+2)*(d.s.w+2))+ y*(d.s.w+2)+x+c.Tz[j]!]!*c.Wz.data[c.wo+j]!) c.n 0 (dw ld*dw d.b[o]!)): bV d o y x S=p8 d.J (aB d.s d.I d.K d.b d.kk d.k (if d.D then o else 0) o y x):=by have J:=jQ d c v A O N P l r Y n I M as T p L C F hb U K hL m ah G o y x ho i g ?K V e H S hS unfold bVo at J;dsimp only at J;unfold bV jv;dsimp only;split ·rename_i h;have E:=fz_ak S _ _ _ d.hz;unfold fz at E;dsimp only at E;rw[AD (by rw[←ju1];exact h)]at E;simp only[Η,AJ]at h rwa[←E,AT (ju5 _ (d.hz _ h.1.1).2)]at J split<;>rename_i h ·rwa[AT h]at J rw[dite_eq_right h]at J;unfold ow2;split<;>rename_i D swap;exact J simp only[Η,AQ,nM]at D rw[aBz2 _ _ _ _ _ _ _ _ _ _ D.1 (zpC_ok d v n p (λq=>(C q).1) o y x (λt h=>as t h▸?K t h) (D.2.elim (zpF_C d o y x) id)) (λq=>(C q).1) (λq=>(F q).1)] intro t B;rw[L _ (U1 (C0 (J1 ((T t B).trans_eq M) _) (U1 (V4 ж) (gX _ _ _ _ _ _ _ _ _ rfl rfl i g (I o ho) Y))) p),as t B,show ∀X a b u w e f k:Ἀ,X*(a*b)+u*b+w+(e*(a*b)+f*b+k)=((X+e)*a+(u+f))*b+(w+k) by intros;ring];simp only[cf _ _ _ _ _ (J5 i (jd d.kk t)) (J5 g (jc d.kk t)),iI _ _ _ r y x t _ i g (U1 (O1 (jb _ t v (r.imp (·.2.2.2.2) (·.2.2.2.2)) (n▸B)) _) (I o ho))] def czF(a:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ):Ἂ (Ἂ Ἀ×ἀ):= if h:(∀tlet c:=bA a.1 a.2.1 a.2.2.1 (o*a.2.2.2.1) a.2.2.2.1 h.1 h.2 0 (AS a.2.2.2.1) (AR a.2.2.2.1) (by rw[cZ];simp) (ϟ _) (ϟ _) (λj hj=>by simp at hj);(c.Tz,c.Wz)) a.2.2.2.2 (AS a.2.2.2.2) else #[] @[inline]def czEq(a b:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ):Ἆ:=a.2.2.1==b.2.2.1&&a.2.2.2.1==b.2.2.2.1&&a.2.2.2.2==b.2.2.2.2&&a.2.1==b.2.1&&wcAeq a.1 b.1 lemma czEq_ok(a b:Ἂ Ἃ×Ἂ Ἀ×Ἀ×Ἀ×Ἀ)(h:czEq a b=true):a=b:=by obtain⟨l,k,n,e,d⟩:=a;obtain⟨g,b2,i,j,m⟩:=b simp only[czEq,Η,AQ]at h obtain⟨⟨⟨⟨rfl,rfl⟩,rfl⟩,rfl⟩,c⟩:=h;rw[wcAeq_ok c] @[noinline]def czS:ST.Ref Unit (Ἂ (WcE czF)):=(ST.Prim.mkRef #[] (Void.mk ())).val noncomputable def zcB(d:CD)(hT:∀tby simp at hj) lemma zcN(K:Ἂ kF)(T:Ἂ Ἀ)(M q k:Ἀ)(o:∀t(bA K T M q k o p t a d g e j l).ni=fQ:=by intro m;induction m with |zero=>intros;rename_i a;rw[bA,dite_eq_right (eM_h1 a)] |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 zcE(d:CD)(c:∀tsimp only[zcD,zcV d c a v i o ho,m] def zcC(d:CD)(Z:Ἆ)(Wd:@&ἀ)(cs:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(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:Ἆ)(c:ἀ)(k:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(h:∀t let c:=zcC d Z Wd cs hT hk hkT hW hY o ho let u:=dw oneW*dw d.b[o]! if fQ then db Fm d c o q u a else db Fa d c o q u a) 0 0 0 ц (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 g r l y q a c e=c8 d.Y (d.s.h*d.s.w) 0 0 z (λo ho q _ _ a=> let c:=zcC d Z g x p n h j l o ho let u:=dw oneW*dw d.b[o]! if fQ then db Fm d c o q u a else db Fa d c o q u a) y q i hi a:=by intro m;induction m<;>intro y q i hi a c e H ·rw[g7w,c8];simp only[dite_eq_right (eM_h1 H)] rename_i w;have k:=eM_h2 H rw[g7w,c8,AT k.1,AT k.1];refine(w (y+1) _ (i+0) ?_ _ _ _ k.2).trans ?_ ·simpa using hi dsimp only;cases c;dsimp only at e;obtain⟨rfl,rfl,rfl,rfl⟩:=e;rw[zcCq,dF,dite_eq_right s];rfl def g7(d:CD)(Z:Ἆ)(Wd:ἀ)(hT:∀tk.1)) else none) hT hk hkT hW hY else g7w d Wd (hW.resolve_left (λ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 _ (ϵ (λe=>hz (.inr e)))) hY,hT,(hW.resolve_left (λe=>hz (.inl e))).2⟩ ⟨rfl,rfl,rfl,rfl⟩ lemma g7_eq(d:CD)(Z:Ἆ)(c:ἀ)(i:∀tk.1)) else none) i g a h j:=by rw[g7];split ·rfl rename_i l;rw[g7c];exact g7w_eq d Z c _ i g a h (l∘.inl) _ j _ _ 0 0 0 rfl _ _ _ rfl lemma g8c(d:CD)(Z:Ἆ)(p:ἀ)(B:Option {v:Ἂ (Ἂ Ἀ×ἀ)//v=czF (d.K,d.T,d.M,d.k,d.Y)})(n:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G D H x P:Ἀ) (y:fP d.s d.kk) (S: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] refine( have E:=eE _ _ _ _ (AO (Y3 (congrArg (0+d.Y*·) Ϧ)) (AN (϶ 32) ς)) _ _ _ (λ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 u=>by dsimp only generalize bv:zcC ..=c;rw[zcCq]at bv;obtain⟨-,ix,a7,X,aH⟩:=fm d Z p h l m n j a4 o A c bv rw[←Ax (db · d c o q _ a)];refine iG2 _ d c o q a _ ?_ (λw g e I hr k=>by rw[jQ2 d c G D H x P ix y S bq M O a3 h r K T J hb a0 C hL N a2 bh o w _ A I k a7 X aH _ (by unfold dK;exact congrArg (ao · c.n 0 _) (funext λt=>by rw[lO _ c.Tz[t]! e,pA _ g e]))] rw[hq,Κ,←Ϛ,←Ϡ];simp only[cf o _ _ _ _ I k]) (by rw[hq,u,Κ,←Ο];exact ι _ A) (u▸U) (λF=>by have L:=gX _ _ _ _ _ _ _ _ _ rfl rfl (Qs F Zp) (Qs V Zp) (M o A) S rw[<-O]at L;exact AZ (Y3 ((congrArg (_+·+_+7) (J2 V).symm).trans (congrArg (·+7) (lO _ 1 _)))) (AZ L r)) split;exacts[λs y p' hp z=>by rw[K p' hp,(X s y).2.2];exact fzD true _ (by unfold aI;split;exact (T _).1;decide) _ (pZ ⟨_,(J _).1,rfl⟩) z,λ_ _ _ _ _=>rfl]) _ _ _ _ (Ϧ.trans ((Κ _).trans (ϳ _)).symm) _ rfl (ϟ _) ((Κ _).trans (ϳ _)).symm W3;mi (E.1.trans (W3.trans Ϝ.symm)) λi v Y=>(AB _ i v).symm.trans ((E.2 i (N4 v E.1)).trans ((AD ⟨ϟ _,N4 v (E.1.trans (W3.trans (Κ _).symm))⟩).trans (Λ Y).symm))) lemma g8(d:CD)(Z:Ἆ)(p:ἀ)(g:Z=ἃ\/d.Y*d.k<=(kS p)/\(kS p)<2^(32:Ἀ))(G c e a P:Ἀ) (u:fP d.s d.kk) (C: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 _ g G c e a P u C D w y I h m l j r J k z F i v A x B N s n H 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(a c A B:Ἀ)(g:a=9\/a=1):∀tpc a t*A+py a t*B+px a t) (c*a) (AS (c*a)))[t]!<=(c-1)*A+2*B+2:=by intro t h;rw[iC,AB _ _ (by rw[Ϝ];exact h),Λ];exact E0 (E0 (ι _ (Yy (jb a t c g h))) (ι _ (jd a t))) (jc a t) def lwf(q:Ἂ Ἃ×Ἀ×Ἀ):ἇ×Ἆ×ἀ×Ἂ Ἀ:= let Z:=q.1.any λu=>Core.mW u==0 let a:=Gf q.2.2 let c:=Gf a.2 (aO q.1 0 0,Z,(if h:q.2.1<2^(32:Ἀ) then (wd Z q.1 q.2.1 h).1 else AR 0), da (λt=>pc c.1 t*(Gf a.1).1+py c.1 t*(Gf a.1).2+px c.1 t) (c.2*c.1) (AS (c.2*c.1))) @[noinline]def lwS:ST.Ref Unit (Ἂ (WcE lwf)):=(ST.Prim.mkRef #[] (Void.mk ())).val lemma lwf_T(K:Ἂ Ἃ)(n A B a c:Ἀ):(lwf (K,n,L5 (L5 A B) (L5 a c))).2.2.2=da (λt=>pc a t*A+py a t*B+px a t) (c*a) (AS (c*a)):=by simp only[lwf,Nat.unpair_pair] lemma lwf_W(K:Ἂ Ἃ)(n q:Ἀ)(h:n<2^(32:Ἀ)):(lwf (K,n,q)).2.1=ἃ\/n<=(kS (lwf (K,n,q)).2.2.1)/\(kS (lwf (K,n,q)).2.2.1)<2^(32:Ἀ):=by simp only[lwf,AT h];exact (wd _ K n h).2 lemma lwf_D(K:Ἂ Ἃ)(n q:Ἀ)(h:n<2^(32:Ἀ)):(lwf (K,n,q)).2.2.1=(wd (lwf (K,n,q)).2.1 K n h).1:=by simp only[lwf,AT h] lemma lwB(s:ConvShape)(a Y:Ἀ)(K:Ἂ Ἃ)(lw:{v:ἇ×Ἆ×ἀ×Ἂ Ἀ//v=lwf (K,Y*(a*(s.kh*s.kw)),L5 (L5 ((s.h+2)*(s.w+2)) (s.w+2)) (L5 (s.kh*s.kw) a))})(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,(W0 (s.w+2)),rfl,(k/9),rfl⟩ lw.1.2.1 lw.1.2.2.1 hT hk32 hkT (lwW s nc Y K lw hY32) hY32 else dS s J I K b D @[noinline]def fLo(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(nc Y:Ἀ):Ἂ Ἃ:= fLc s J I K b D nc Y (wcGet3 wcK3eq wcK3eq_ok lwS 32 (K,Y*(nc*(s.kh*s.kw)),L5 (L5 ((s.h+2)*(s.w+2)) (s.w+2)) (L5 (s.kh*s.kw) nc)) (λ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=L5 (L5 ((s.h+2)*(s.w+2)) (s.w+2)) (L5 (s.kh*s.kw) nc)) (st:Ἂ (WcE lwf))(i:Nat):{r:Ἂ Ἃ//r=fLo s J I K b D nc Y}:= if h:iwithPtrAddr K (λp2=> if p1=p2 then (if hk:wcK3eq st[i].k (K,n,q)=true then ⟨fLc s J I K b D nc Y ⟨st[i].v,by rw[st[i].h,wcK3eq_ok _ _ hk,hn,hq]⟩,by unfold fLo;exact congrArg (fLc s J I K b D nc Y) (wcSub _ _)⟩ else ⟨fLo s J I K b D nc Y,rfl⟩) else fLs s J I K b D nc Y n q hn hq st (i+1)) (λ_ _=>wcSub _ _)) (λ_ _=>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))) (L5 (L5 ((s.h+2)*(s.w+2)) (s.w+2)) (L5 (s.kh*s.kw) nc)) rfl rfl (ST.Prim.Ref.get lwS (Void.mk ())).val 0).1 lemma fL_eq(s:ConvShape)(J:Ἆ)(I K b:Ἂ Ἃ)(D:Ἆ)(a Y:Ἀ):fL s J I K b D a Y=fLo s J I K b D a Y:=(fLs ..).2 lemma ev_h1(s:lR)(a:Ἀ)(d:0simp only[ConvShape.ho,ConvShape.wo,e,j,l,m,I4]<;>exact⟨J2 d,J2 c⟩ lemma ev_h2(P L:Ἀ)(H:P+L<=425)(p:L<=27):P+2*L-54by dsimp only;rw[lwf_T,iC,AB _ _ (by rw[Ϝ];exact T),Λ]) _ _ _ _ ?_ ?_ ?_ (λF=>by dsimp only;rw[lwf_D _ _ _ v,F];unfold wd;rw[dite_eq_right lN];dsimp only obtain⟨C,O,N⟩:=zPs (Y*(d*(s.kh*s.kw)));have:=(aa _ v).symm intro q hq;exact wdUs K _ k _ 0 _ rfl (this▸C) (O.elim (λz=>C0 z (by decide)) (λz=>z.trans_lt v)) (λq hq=>by rw[N q hq,AC (by rw[Ϧ];exact D4 _)]) q (this▸hq)) ?_ ?_ ?_ (le_max_left _ _) (le_max_right _ _) ϙ ?_ ?_ (by dsimp only;rw[Ϣ,Α (ev_h2 _ _ H p)]) ?_ ?_] ·rcases B with⟨rfl,rfl,rfl⟩|⟨rfl,rfl,rfl⟩<;>simp only[dS,fT,ἁ,ἂ,conv2dSpec,conv2dWith,depthwiseSpec,depthwiseWith,hA,n]<;>refine mi (by rw[Ϝ,Ϝ,hA,n]) λq e _=>?_<;>simp only[ag,Λ]<;>refine congrArg (p8 _) ?_<;>rw[aB_eq]<;>simp only[Dense.bO,Ϛ,n4,ϳ,Κ] exacts[i,rfl,λo h=>by rcases B with⟨rfl,rfl,rfl⟩|⟨rfl,rfl,rfl⟩;exact (Κ _).le;exact h,rfl,P.1,P.2.1,P.2.2,bd I (U1 G ς) m,bd K (U1 k ς) X,bd b (U1 w ς) U,p,H,j,r] lemma ev(s:lR)(J:Ἆ)(I K b:Ἂ kF)(D:Ἆ)(d Y:Ἀ) (c: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 (λa=>?_) (λe=>dite_eq_right e) have L:=@J3;obtain⟨i,a,j,g,m,X,U,H,p,G,k,w,u,A,v,x,y,e,r⟩:=a exact ev_h3 s J I K b D d Y c _ i a j g m X U H p (L G) (L k) (L w) (L u) (L A) (L v) (L x) y e (L r) lemma 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) (λt=>if tif th.elim (D4 _) λh=>h.elim (D4 _) λh=>h.elim (U5.2 (ϊ _ p)) (U5.2 (ϊ _ r))];congr 1 rw[Ϗ s.h s.w,We];ring def s5rs(s:ConvShape):ConvShape:= if s.kh=1/\s.kw=1/\s.stride=1/\s.pad=0/\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 with h;exact (mh _ _).trans (γ (I1 h _));rfl;exact nG _ _ (C5.2 (Z0 this)) lemma ga_h1(x y N:Ἀ)(d:xzz%N=z-N:=λz i j=>(D7 i).trans (γ (K3 i j)) have P:∀z,00C0 (ϟ _) (dv 0 z i) (M6 x N).elim (λc=>(M6 y N).elim (λa=>E (AC (U5.2 c)) (F (Kw.2 (dv _ _ (E (γ c) (F (Nat.lt_of_add_lt_add_right (E (AD c).symm (F h (AD a)))) (γ a).symm)))) (AC (U5.2 a)).symm)) λa=>have h:=E (AD c).symm (F h (AC (X2.2 a)));absurd (if e:y=N then F h (AD e) else N3 (U1 (F h (AC e)) (C9 a _)) q) (X2.2 (H0 _ _))) λc=>(M6 y N).elim (λa=>have h:=E (AC (X2.2 c)).symm (F h (AD a));E (AD c) (F (if e:x=N then Int.lt_of_le_of_lt (Jn (K5 _)) (Uo.2 (P _ (F (Nat.lt_add_left_iff_pos.1 (E (AD e).symm h)) (γ a).symm))) else Int.lt_of_lt_of_le (Int.neg_neg_of_pos (Uo.2 (P _ (F (Qb (U4 c (Ne.symm e))) (M x c d).symm)))) (K5 _)) (AC (U5.2 a)).symm)) λa=>have h:=E (AC (X2.2 c)).symm (F h (AC (X2.2 a)));E (AD c) (F (Int.neg_lt_neg (Kw.2 (dv _ _ (E (M y a g) (F (if e:y=N then E ((congrArg (·-N) e).trans (Nat.sub_self N)) (Qb (U4 c λf=>K4 _ (E (AD f.symm).symm (F h (AD e))))) else have h:=F h (AC e);if f:x=N then absurd (N3 (U1 (E (AD f).symm h) (C9 a _)) q) (K4 _) else Vk a (N7 λl=>X2.2 (C9 l _) (E (AC f).symm h))) (M x c d).symm))))) (AD a).symm) lemma ga(a b:ἇ)(h:sk aby rw[<-ϖ,lG,kv];push_cast;rw[Ac AL,AA];ring have e:(0:ℝ)<2^(-149:Ἁ):=ф;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[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:Xu (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,AC d] lemma cM(f:Ἀ)(e:f<2^(23:Ἀ)): lf (2^(23:Ἀ)+f) (2^(23:Ἀ))=0:=by have d:(Aq (2^(23:Ἀ)+f))=23:=(mz ф).2 ⟨V1 _ _,O1 e _⟩ rw[lf,d,Nat.log2_two_pow];simp[mM,mZ,ο]<;>exact Yo e lemma eO:la (m*2^(23:Ἀ)) (2^(23:Ἀ))=m:=by simp[la] lemma hO_h1(er ed q:Ἀ)(M:ed=q+127)(x:q127)∧¬((er:Ἁ)-150-((ed:Ἁ)-150)< -150)∧¬((er:Ἁ)-150-((ed:Ἁ)-150)< -126)∧(Z6 ((er:Ἁ)-150-((ed:Ἁ)-150)+127))=er-q:=by 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)))(c:(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 c),O]⟩ ·rw[ϓ,ap,ap,g,((by decide):2^(31:Ἀ)=256*2^(23:Ἀ)),<-mc (϶ 23),<-mc (϶ 23),Ϗ (mJ q),Up];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=u at x⊢ exact⟨λh=>h.trans (I2 _ _),λh=>by rw[<-Vm u 256,M8 x.le];exact (H1 256 (Zl h (ж:0<256))).trans (H0 _ _)⟩ ·rw[aZ e,g,Ϗ (mJ q),Up,N];rw[N]at x;generalize (mJ r)/2^(23:Ἀ)=a at x⊢ have h:=Vm a 256;have t:=ϊ a (ж:256>0) generalize a%256=s at x h t ⊢;generalize a/256=k at h;subst h rw[M8 x.le,E7,γ ((I2 _ _).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 i:(mJ (kB r))<256:=N.trans_lt (ϊ _ ж) have c:=hO_h1 _ _ _ M x (U4 (Z0 i) U) rw[ny,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,pC,cM _ (fracOf_toNat_lt r)] simp only[l,m,fT,ἂ,Ai,sub_zero] rw[AC c.1,AC c.2.1,AC c.2.2.1,(by rfl:(23:Ἁ)=Wg 23),mw,show Nat.shiftLeft _ 23=_ from ο _ _,eO] simp only[(beq_eq_false_iff_ne.2 (K7 ((O1 (fracOf_toNat_lt r) _).trans_eq (ж:2^(23:Ἀ)+2^(23:Ἀ)=p7 24))):((2^(23:Ἀ)+(mJ (lK r)):Ἀ)==p7 24)=ἄ),fT,ἂ] rw[AC c.1] generalize F:r-(q<<<23)=e have o:(mJ (q<<<23))=(mJ q)*2^(23:Ἀ):=by rw[ϴ];simp only[kN,kH,ο];exact γ ((ϐ (x.trans i) (϶ 23)).trans_le ж) have a:(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[C5,o];exact a),o] rw[<-n7] conv_rhs=>rw[<-iP e,ofUInt32_eq_ofFields] obtain⟨k,n,s⟩:=hO_h2 r q e N O x a g rw[k,n,s,c.2.2.2,(ж: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[Ξ,(by rfl:(mJ (0x7FFFFFFF:ἇ))=2^(31:Ἀ)-1),ζ] rw[h]at d;rw[<-Β,<-Β];simp at d⊢;(clear * - e d;omega) lemma cg(e:r=0\/r=0x80000000)(g:kB d≠0)(j:kB d≠255)(l:k9 d=ἄ): kW (pf (lI r) (lI d))=r:=by rw[ny,p0,lI,lI,kV r (by rcases e with rfl|rfl<;>decide),kV d j,aS d g,l,(by rcases e with rfl|rfl<;>rfl:nh r=⟨k9 r,0,0⟩)];simp[(by simp:(2^(23:Ἀ)+(mJ (lK d))==0)=ἄ)];rcases e with rfl|rfl<;>rfl lemma aX{a b:ἇ}(h:aoneW)) (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:=C5.1 j;simp at this⊢;(clear * - this;omega)) g (Ι.1 o) (aX p)).symm;split;exact(cg r d (i9 r ‹_›) l g e).symm;exact dvN_eq r d lemma gp(g:Ἀ->ἆ)(m:Ἀ):∀d:ἆ, Z ((lj m).foldl (λd t=>d+g t) d)=Z d+∑t∈kP m,Z (g t):=by induction m with |zero=>intro d;simp only[List.range_zero,mT,range_zero,sum_empty,Av] |succ m e=> intro d;rw[mD,l6,Ϸ,mT,fI,e,Ν,add_assoc] 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 ж rw[this,(ж:kM ld=2^(23:Ἀ)),(ж:k9 ld=ἄ)];simp[d] lemma dW(c:Ἀ):∀i,i+c<=n-> (nC (kK (n:=n) λj=>fa (I6 j)) (kK (n:=n) λ_=>ld) i c=ἃ↔ ∀t,i<=t->t< i+c->fa t=0x80000000):=by induction c with |zero=>intro i _;exact⟨λ_ t d e=>absurd e (X2.2 d),λ_=>rfl⟩ |succ c l=> intro i m rw[nC,ab n fa i (Zq m),ab n (λ_=>ld) i (Zq m), gK,Η,l (i+1) ((lO i 1 c).trans_le m),AQ] constructor .rintro⟨d,e⟩ t g o rcases BJ g with rfl|h;exact d exact e t h (o.trans_eq (lO i 1 c).symm) .intro h;exact⟨h i AP щ,λt d e=>h t (M4 d) (e.trans_eq (lO i 1 c))⟩ 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 (Κ n).le;have D:=ab n fa;have F:=ab n λ_=>ld;have d:=Ϝ (f:=λi:Fin n=>fa (I6 i));have p:=Ϝ (f:=λ_:Fin n=>ld);rw[ms];unfold dotSpec;rw[←Model.Reduction.map_value_dot];generalize (kK (n:=n) λi=>fa (I6 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 e,F k e];exact⟨v k e,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 (e.trans_eq 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 (ϟ k) (by simpa[d])).1;have u:=q B p λk e=>(l k (ϟ k) (by simpa[d])).2;have o:=ϯ (destination:=lU) _ _ m;rw[finiteDotSlice_eq A B 0 _ ц (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 rw[<-m];simp) l;rw[lT,j,x];simp only[m0,d,(by rw[ϓ,H,L];exact⟨λh t M=>h t (ϟ t) (Zj 0 M),λh t _ M=>h t (M.trans_eq (Κ n))⟩:nC A B 0 n=g)];cases g<;>simp[O.ne']<;>rfl lemma dk(w k U m:Ἀ)(l:0(U8.1 d).elim (g t) λe=>e▸j,λh=>⟨λt d=>h t (Hx 1 d),h m (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 ж),(ж: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,R9]) ((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,R9]) ((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 (m.trans ж) h;obtain⟨l,d⟩:=fw B x c.toNat (m.trans ж) j;have k:=Int.le_sub_one_of_lt (Kw.2 d);rw[<-nE (kM x*_),U3,W4,W4,nZ]at k;rw[jB,(by rw[t1,bU,sv,jj _ _ (by rw[l];exact d.trans_le (Θ ж (by (clear * - m;omega)))),l];cases k9 x<;>simp only[fT,ἁ,Am,neg_mul,U3,W4,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=>by simp[H]⟩ lemma ia:(lq (eF u))=(mJ (kB u)):=by rw[eF,kB];simp only [UInt32.toUInt64_and,UInt32.toUInt64_shiftRight,Ha,UInt32.toUInt64_ofNat,UInt64.reduceMod,Ε,ν,ϩ,kA,kH,Ξ,Υ,kN] lemma ik(x:kF):aq x<=255:=by rw[aq];split .rw[θ,am,kG];have:=mO x;split<;>simp<;>exact M4 this .decide lemma mn(a b:ἆ):(lq (po a b))=po (lq a) (lq b):=UInt64.toNat_min a b lemma dH(a b:ἆ):po a b<=a:=θ.2 ((mn a b).trans_le (F6 _ _)) lemma fX(a b:ἆ):po a b<=b:=θ.2 ((mn a b).trans_le (T9 _ _)) 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 M4 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,η,Uq]at p;simp only[ok,Η,AM,nM,AQ] refine⟨λe=>absurd ((congrArg mJ e).ge.trans (q.trans p.2)) ж,?_⟩ by_cases m:mW x=0;exact pZ m;right;rw[aq,AD (AM.2 m)]at d;apply A6 rw[θ,χ _ _ d,am];exact tsub_le_iff_left.2 ((Dense.aT x).trans_le ((I2 _ _).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:=ϗ (ϗ (dH _ (po (aq g) (aq j))) (dH _ (aq e))) (ik d);simp only[cV,Η];use l,⟨⟨cQ _ _ _ (ϗ (dH _ _) (dH _ _)) (ϗ (fZ _ _) (fZ _ _)) h l,cQ _ _ _ (ϗ (dH _ _) (fX _ _)) (ϗ (f0 _ _) (fZ _ _)) h l⟩,cQ _ _ _ (ϗ (fX _ _) (dH _ _)) (ϗ (fZ _ _) (f0 _ _)) h l⟩,cQ _ _ _ (ϗ (fX _ _) (fX _ _)) (ϗ (f0 _ _) (f0 _ _)) h l @[inline]def pTt(B:ἆ)(u:Ἃ):ἆ:=mW u<<<(iW u-B) lemma pML(a b c e:kF)(h:max (max a b) (max c e)<0x7F800000):a.toNat<2139095040∧b.toNat<2139095040∧c.toNat<2139095040∧e.toNat<2139095040:=by have h:=Ι.1 h;simp only[nw,Nat.max_lt,and_assoc]at h;exact h lemma pKq(x y:kF)(a:y.toNat<2139095040)(c:x.toNat<=y.toNat):eF x<=eF y∧(0aq x<=aq y):=by have i:y.toNat/8388608<256:=Ϟ (a.trans ж) have E:∀u:kF,u.toNat/8388608<256->(expOf u).toNat=u.toNat/8388608:=λu h=>(wEx u).trans (γ h) have Q:∀u:kF,u.toNat/8388608<256->0(aq u).toNat=u.toNat/8388608-1:=λu e d=>by unfold aq;rw[AD,am];unfold idxOf;rw[<-E u e] .exact ite_eq_right_iff.2 λg=>(congrArg (λv:ἇ=>v.toNat-1) g).symm .refine AM.2 λq=>?_;have:=congrArg lq q;rw[an]at this;unfold mantOf at this;split at this<;>rename_i g .exact d.ne' (((γ (Nat.lt_of_div_eq_zero ж ((E u e).symm.trans (congrArg mJ g)))).symm.trans (wFr u).symm).trans this) .exact (Hv (϶ 23) _).ne' this exact⟨θ.2 (by rw[ia,ia,E x (C0 (ϭ c) i),E y i];exact ϭ c),λh=>θ.2 (by rw[Q x (C0 (ϭ c) i) h,Q y i (U1 h c)];exact tsub_le_tsub_right (ϭ c) 1)⟩ lemma pKz(a b c e x:kF)(d:x=a∨x=b∨x=c∨x=e)(g:0simp only[min_le_iff,le_refl,true_or,or_true] rw[nG x 1 g,Xq]at m;have k:=Nat.lt_of_le_sub_one g m;rw[γ (C0 k x.toNat_lt)];exact⟨P4 _,k⟩ lemma pKj(a b c e:kF)(h:max (max a b) (max c e)<0x7F800000)(i:eF (max (max a b) (max c e))<=aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)+37): aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1)<=255/\cV (ok 37 (aq (min (min (a-1) (b-1)) (min (c-1) (e-1))+1))) a b c e=ἃ:=by have j:(max (max a b) (max c e)).toNat<2139095040:=Ι.1 h have G:∀x,(x=a∨x=b∨x=c∨x=e)->ok 37 _ x=ἃ:=λx g=>by have d:x.toNat<=(max (max a b) (max c e)).toNat:=by rcases g with rfl|rfl|rfl|rfl<;>simp only[nw,le_max_iff,le_refl,true_or,or_true] refine cQ x _ _ ?_ (pKq x _ j d).1 (by rw[θ,mn,Uq];refine⟨θ.1 i,?_⟩;simp only[ia,wEx,kA];omega) (ik _) by_cases z:x.toNat=0 .exact(Β.1 z:x=0)▸ik _ .have k:=pKz a b c e x g (ϵ z);exact (pKq _ x (C0 d j) k.2).2 k.1 exact⟨ik _,by simp[cV,G]⟩ lemma pTtE(B:ἆ)(u:kF)(h:u.toNat<2139095040):pTt B u=t1 B u:=by unfold pTt t1 sg;rw[fy,AC (by rw[ap];omega)] lemma gU_h1{P w:Ἀ}(G:P+w+1<2^(31:Ἀ)):(P+1)%2^nx=P+1/\(P+w)%2^nx=P+w/\(P+w+1)%2^nx=P+w+1/\w<2^(32:Ἀ):= have c:2^(31:Ἀ)<=2^(32:Ἀ):=by decide have K:=G.trans_le (c.trans dj) ⟨γ ((L1 (V1 P w) 1).trans_lt K),γ ((Yv _).trans K),γ K,(H0 w P).trans_lt ((Yv _).trans (G.trans_le c))⟩ lemma dO(f:Ἀ->Ἀ->Ἀ->kF) (e:∀d y x,f d y x=av (k*k) (nI h w k I d y x) (natW (k*k))): eT c (h/k) (w/k) f=n9 c h w k I:=by rw[iO,n9];refine mi (by simp only[ag,pa,Ϝ]) λq _ _=>?_;simp only[ag,Λ,pa,e] lemma 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 intro m;induction m<;>intro e l q;rw[df,dite_eq_right (mt ε.1 (gI_h2 _ _ q))];rfl;rename_i u;obtain⟨c,k⟩:=gI_h1 _ _ _ q;have h:=ε.2 c;have p:=Dense.ac h;rw[df,AT h,u (e+1) _ (p▸k),List.range_succ_eq_map,Ϸ,List.foldl_map];simp only[Kv,<-AB,p,ϑ,pA,Τ 1] lemma gx(B:ἆ)(U:Ἀ):fj I B w k U=cr (t1 B) I w k (k*k) U 0 0:=by rw[fj];split;obtain⟨d,e,g,j⟩:=‹_›;have J:=aa _ (Dense.bc ((V1 _ _).trans j)) rw[gI I B _ _ (k*k) _ 0 (by rw[aa _ (Dense.bc j),J,ϱ]),cr,gc _ _ _ _ _ _ _ d,J] exact congrArg (List.foldl · 0 _) (funext λa=>funext λ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 have a:=Z0 h;rw[cK];split_ifs<;>simp only[kA,Hz,Kd,Wk,Int.reduceSub,true_and]<;>exact AO (AE (B3.2 ‹_›) ж) ж @[noinline]def cUe(w:Ἀ)(I:Ἂ Ἃ)(e:Ἀ):Ἃ:=dotOf (2*2) (λt=>I[e+t/2*w+t%2]!) λ_=>oneW lemma cUq(h w:Ἀ)(I:Ἂ Ἃ)(a y x:Ἀ):cU h w 2 I a y x=cUe w I ((a*h+y*2)*w+x*2):=by simp only[cU,cUe,cu] @[inline]def gTm(w:Ἀ)(ww:Ἄ)(I:@&Ἂ Ἃ)(d:Ἃ)(e:Ἄ):Ἃ:= if hb:eἄ) (λ_=>cUe w I (J0 e)) d else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) else let B:=min (min (aq x0) (aq x1)) (min (aq x2) (aq x3)) if max (max (eF x0) (eF x1)) (max (eF x2) (eF x3))<=min (B+37) 254 then wo B (t1 B x0+t1 B x1+t1 B x2+t1 B x3) 0 (λ_=>cV (.==0x80000000) x0 x1 x2 x3) (λ_=>cUe w I (J0 e)) d else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) else toWord (Ar (ofW (cUe w I (J0 e))) (ofW d)) lemma gU(B:DQ d)(j y x:Ἀ)(e:Ἄ) (D:(J0 e)=(j*h+y*2)*w+x*2)(G:(j*h+y*2)*w+x*2+w+1<2^(31:Ἀ)): gTm w (G0 w) I d e=av (2*2) (nI h w 2 I j y x) d:=by have q:=cu h w 2 I j y x;have p:=q 0;have r:=q 1;have u:=q 2;have v:=q 3;simp only[Gj,kH,nv,n4,Av]at p r u v;have m:=cUq h w I j y x have H:=gU_h1 G;dsimp only[gTm];simp only[D];refine dite_eq_iff'.2 ⟨λk=>?_,λ_=>m▸rfl⟩;simp only[Kv,<-AB,lJ,mA,aa _ H.2.2.2,H,D,p,r,u,v];refine ite_eq_iff'.2 ⟨λa=>ite_eq_iff'.2 ⟨λc=>?_,λ_=>m▸rfl⟩,λ_=>ite_eq_iff'.2 ⟨λl=>?_,λ_=>m▸rfl⟩⟩ have l:=pKj _ _ _ _ a c;have L:=pML _ _ _ _ a;simp only[pTtE,L];swap;have l:=ki _ _ _ _ l all_goals(have A:=(cW _ (nI h w 2 I j y x)).1 l.2;refine eg _ _ _ 37 _ _ (cB l.1) ж ж A _ (λ_=>0) _ 0 (λt F=>ee _ _ _ (cB l.1) ж (A t F)) ж ж (by simp only[fI,Wn,Ν,sum_range_zero,Ai]) (by simp[bF]) _ ?_ _ m.symm d B) rw[cW];simp only[AQ] exact⟨nofun,λq=>absurd L.1 (by rw[q 0 ж];decide)⟩ lemma qVm(r x W:Ἀ)(a:xἋ)(W2 H2 st sk:Ἄ)(q e ox oy:Ἄ)(a:Ἂ Ἃ):Ἂ Ἃ:= if hq:qἋ)(F:Ἀ->Ἃ)(E:Ἀ->Ἀ->Ἀ->Ἀ)(C H W R S:Ἀ)(Wu Hu st sk:Ἄ) (N:(J0 Wu)=W)(Y:(J0 Hu)=H)(w:(J0 st)=R)(v:(J0 sk)=S)(p: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 r o:Ἄ)(A:Ἂ Ἃ),C*H*W-(J0 q)=m->(O0 A)=C*H*W->(J0 q)=(a*H+b)*W+x->a<=C->bx (J0 r)=x->(J0 o)=b->(J0 e)=E a b x->(∀j<(J0 q),A[j]! =F j)->pQ f Wu Hu st sk q e r o A=ag (C*H*W) F:=by intro m;induction m<;>intro a b x q e r o A G Z Q y l I P z c U .have k:=W1 G rw[pQ,dite_eq_right (by rw[ε,Q8,aa _ (Z.trans_lt D)];exact not_lt.2 (Z.trans_le k))] apply mi;.simp[Z,ag] intro j g _;simp only[ag,Λ];rw[<-AB A j g];exact U j (U1 (g.trans_eq Z) k) rename_i m O have d:=N1 G have K:=BF (BF ((pqG a b x H W).trans_lt (Q▸d)) (ϟ _)) (ϟ _) have t:q?_,λg=>?_⟩ .exact O a b (x+1) _ _ _ _ _ i J (by rw[n,Q,pA]) y l g B z (by rw[uA (by rw[c,k];exact (hX a b x).trans_lt (T a b (x+1) y l g)),c,k,hX]) (n▸L) have s:x+1=W:=le_antisymm I (not_lt.1 g);rw[Vo s]at c;refine ite_eq_iff'.2 ⟨λu=>?_,λu=>?_⟩ .exact O a (b+1) 0 _ _ _ _ _ i J (by rw[n,Q,pA,s,<-pA (a*H),nO,ϑ]) y u p Ϧ M (by rw[uA (by rw[c,w];exact (hR a b).trans_lt (T a (b+1) 0 y u p)),c,w,hR]) (n▸L) have X:b+1=H:=le_antisymm l (not_lt.1 u);rw[Vo X]at c exact O (a+1) 0 0 _ _ _ _ _ i J (by rw[n,Q,pA,s,<-nO (a*H+b) W,pA (a*H) b 1,X,ϑ,ϑ,nO a H]) K (E4 l) p Ϧ Ϧ (by rw[uA (by rw[c,v];exact (V a).trans_lt (T (a+1) 0 0 K (E4 l) p)),c,v,V]) (n▸L) lemma pqE(a b x c h w:Ἀ)(i:a<=c)(e:bby 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) _ _ _ _ _ _ _ _ _ p v r s W o (λa b x=>by rw[nO x 2,pA]) (aQe_h4 h w W) (aQe_h5 h w H W) (λa b x l i k=>aQe_h0 _ _ B (pqE a b x c h w l i k C).le) ?_ _ 0 0 0 0 0 0 0 _ rfl W3 (by simp only[Ϧ,ϳ,ϑ]) (ϟ _) H W Ϧ Ϧ (by simp only[Ϧ,ϳ,ϑ]) (λj q=>absurd (q.trans_eq Ϧ) j.not_lt_zero) intro a b x e l i k n obtain⟨t,j⟩:=qVm (a*(h/2)+b) x (w/2) k obtain⟨q,m⟩:=qVm a b (h/2) i unfold aT;rewrite[Ϗ (h/2),<-lY,t,j,q,m] congr 1;apply H6.1;rw[show(2:Ἄ)=W0 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX,aa _ (aQe_h0 _ _ B (pqE a b x c h w l.le i k C).le),n] def dU:Ἂ Ἃ:= let d:=natW (k*k) if 0 let U:=(ch*h+y*k)*w+x*k wo bx (fj I bx w k U) 0 (λ_=>wa (.==0x80000000) I w k (k*k) U 0 ἃ) (λ_=>cU h w k I ch y x) d else avgpoolSpec c h w k I else avgpoolSpec c h w k I lemma eV_h1{α:Type}{C:Prop}[Decidable C]{X Y R:α}(d:C->X=R)(a:¬C->Y=R):ite C X Y=R:=ite_eq_iff'.2 ⟨d,a⟩ lemma eV_h2(X w m H:Ἀ)(A:X*w+w<=H)(G:H<1073741824)(t:m?_) (λ_=>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 t:=ι h (l7 ((ϸ (Ϯ o u)).2 r));rw[Ο]at t;have A:=ι w (U1 (O1 (U1 (ϐ (ϊ (q/(w/2)) o) Wf) (pr _ _)) _) t);rw[nO]at A;have Q:=eV_h2 _ _ _ _ A G (ϊ q u) exact gU h w I _ m _ _ _ _ (by rw[show(2:Ἄ)=W0 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX,aa _ (C0 (V1 _ (w+1)) (Q.trans ж))]) Q .have l:=jL _ B;refine eV_h1 (λd=>?_) (λ_=>rfl) .refine dO _ _ _ _ _ _ λj y x=>?_;exact eg _ (nI h w k I j y x) _ (cK (k*k)) _ _ (cB d.1) (l.1.trans ж) (Ϯ e e) (λt _=>gi I _ d.2 (gC _ _) _) _ (λ_=>0) _ 0 (λt p=>ee _ _ _ (cB d.1) l.1 (gi I _ d.2 (gC _ _) _)) l.2 ц (by rw[gx];exact em _ h w k I j y x e) (by simp[bF]) _ (by simp only[dk _ _ _ _ _ _ e,cu,AQ]) _ rfl _ m lemma pMy(y z:kF)(a:(mJ y)<2139095040)(b:(mJ z)<2139095040):mx y z=max y z:=by have e:∀u:kF,(mJ u)<2139095040->(mJ (sk u))=(mJ u)+2147483648∧expOf u≠255:=λu h=>⟨by rw[bf,AD (h.trans ж)];rfl,λq=>((wEx u).trans_lt ((Ay _ _).trans_lt (Ϟ h:mJ u/8388608<255))).ne (congrArg mJ q)⟩ obtain⟨c,f⟩:=e y a;obtain⟨g,i⟩:=e z b rw[mx,AD ⟨f,i,by rw[Ι,Ι,c,g,<-Β];omega⟩,UInt32.max_def];simp only[Ι,C5,c,g];split_ifs<;>simp only[<-Β]<;>omega @[inline]def pMx(g j l m:kF):kF:= let M:=max (max g j) (max l m) if M<0x7F800000 then M else mx (mx (mx (mx g g) j) l) m lemma pMxE(g j l m:kF):pMx g j l m=mx (mx (mx (mx g g) j) l) m:=by unfold pMx;dsimp only;split;obtain⟨a,b,c,e⟩:=pML g j l m ‹_›;simp only[pMy,nw,Nat.max_lt,a,b,c,e,and_self,<-Β,Nat.max_self,Nat.max_assoc];rfl @[inline]def iYm(w:Ἀ)(ww:Ἄ)(I:@&Ἂ Ἃ)(e:Ἄ):Ἃ:= if hb:ent j (lI I[A*w+x*2+t/2*w+t%2]!)) (lI I[A*w+x*2]!))=kW ((lj (2*2)).foldl (λj t=>nt j (lI I[(A+t/2)*w+x*2+t%2]!)) (lI I[(A+0/2)*w+x*2+0%2]!)):=by rw[Gq,Xs,ϑ,ϑ];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[Gj,kH,nv,n4,Av]at m o p r;dsimp only[iYm];split;rw[pMxE];obtain⟨z,c,k,a⟩:=iz_h2 _ _ _ _ _ ж dj v;simp only[Kv,<-AB,lJ,mA,aa w z,u,γ c,γ k,γ a];rw[<-cn (Conv.mx _ _),be,be,be,be,m,o,p,r];simp only[mD,List.range_zero,l6,Ϸ,mT];rw[u,<-cn (wl _ _ _ _ _ _ _ _),fn I w 2 _ (2*2) ж];simp only[nI];exact iz_h1 I _ w x noncomputable def mT(h w:Ἀ)(I:Ἂ Ἃ)(q:Ἀ):Ἃ:=iYm w (G0 w) I ((G0 ((q/(h/2*(w/2))*h+q/(w/2)%(h/2)*2)*w))+2*(G0 (q%(w/2)))) lemma mQe_h1(A B w q r:Ἀ)(a:w=2*(q+1)+r):(A+B*2)*w+q*2+(w+r+2)=(A+(B+1)*2)*w+0*2:=by subst a;ring lemma mQe_h2(a h w p q s r:Ἀ)(c:w=2*(q+1)+r)(d:h=2*(p+1)+s):(a*h+p*2)*w+q*2+(w+r+2+s*w)=((a+1)*h+0*2)*w+0*2:=by subst c d;ring lemma mQe_h3(w r s:Ἀ)(c:w<2^(30:Ἀ))(d:r<=1)(a:s<=w):w+r+2<2^(32:Ἀ)∧w+r+2+s<2^(32:Ἀ):=by omega lemma mQe_h4(w:Ἀ)(W:0(a*h+b*2)*w+x*2) _ _ _ _ _ _ _ _ _ p v r s W o (λa b x=>by rw[nO x 2,pA]) (aQe_h4 h w W) (aQe_h5 h w H W) (λa b x l i k=>aQe_h0 _ _ B (pqE a b x c h w l i k C).le) ?_ _ 0 0 0 0 0 0 0 _ rfl W3 (by simp only[Ϧ,ϳ,ϑ]) (ϟ _) H W Ϧ Ϧ (by simp only[Ϧ,ϳ,ϑ]) (λj q=>absurd (q.trans_eq Ϧ) j.not_lt_zero) intro a b x e l i k n obtain⟨t,j⟩:=qVm (a*(h/2)+b) x (w/2) k obtain⟨q,m⟩:=qVm a b (h/2) i unfold mT;rewrite[Ϗ (h/2),<-lY,t,j,q,m] congr 1;apply H6.1;rw[show(2:Ἄ)=W0 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX,aa _ (aQe_h0 _ _ B (pqE a b x c h w l.le i k C).le),n] def d9:Ἂ Ἃ:= if k=2/\0?_;simp only[ag,Λ,Ϝ,mT]at e⊢;have t:=ι h (l7 ((ϸ (Ϯ d g)).2 e));rw[Ο]at t;have l:=ι w (U1 (O1 (U1 (ϐ (ϊ (q/(w/2)) d) Wf) (pr _ _)) _) t);rw[nO]at l;have Q:=eV_h2 _ _ _ _ l p (ϊ q g);exact iz h w I _ _ _ _ (by rw[show(2:Ἄ)=W0 2 from ἅ,<-BP,<-mC,Ϗ 2,<-lX,aa _ (C0 (V1 _ (w+1)) (Q.trans ж))]) Q;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) lemma QA_h1(R y:Ἀ)(h:y<2):(2*R+y)/2=R∧(2*R+y)%2=y:=⟨by rw[G6 (ж:2>0),ώ h,ϑ],by rw[E6,γ h]⟩ lemma 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[Gu,AD (by omega:2<=2*q+b),G6 ж,ώ (AO h one_lt_two)];rfl lemma x8B0(j:ℕ):((2^j:ℕ):ℝ)=2^j:=by rw[W4,nZ] lemma x8B1(a b:ℕ)(h:a<=2^b):(a:ℝ)<=2^b:=(F4.2 h).trans_eq (x8B0 b) lemma x8B2:(2:ℝ)^(52:ℕ)*(1/2^(53:ℕ))*2=1:=by norm_num lemma x8B3(n:ℕ)(h:0decide:(if r=0 then 0 else 1)<=1);have G:(r:ℝ)/D<1:=(div_lt_one (M9.2 x)).2 (Jd.2 t);have E:(0:ℝ)<=r/D:=div_nonneg (I3 _) (I3 _);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) ф .rw[h,Y5,(by rw[X6];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) ф 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,(M8 (N0 ж m):(Aq q)+1-23=((Aq q)-23)+1),<-VY q r D _ x t (by exact Z4 (AZ ж m))] apply Model.roundQuotientEven_eq_of_rat_eq _ _ _ _ (RationalBinary.scaleByPowerOfTwo_snd_ne_zero _ _ _ l) (ф);rw[Model.scaleByPowerOfTwo_real,Model.scaledRatToReal,h,Y5,XD,<-ZL ZQ,(by rw[pO (N0 ж 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₀ _ (x8B7 _ x).ne'] generalize F:2*q+(if r=0 then 0 else 1)=J at g p⊢;rw[kE,AD ж,Model.ieeeRoundDyadic_eq_internal];simp only[Model.roundRat,n6,(ж:Fmt.isIEEE=ἃ),↓reduceDIte,Model.ieeeRoundRatScaled,Model.Internal.ieeeRoundDyadic,ZY,o,l,XA,w,Av,nY,g,(ж:(FloatFormat.ieeeMaxNormalExponent lU:Ἁ)=127),(ж:FloatFormat.ieeeMinNormalExponent lU=-126),(ж:(FloatFormat.normalMantissaExpOffset lU:Ἁ)=150),(ж:Fmt.fracWidth=23),show J≠0 by rw[←F];exact J8 (U1 (Ϯ ж (ϵ j)) (V1 _ _)),(by rw[X6,add_add_sub_cancel]:(((Aq q)+1:Ἀ):Ἁ)+(e-1)=((Aq q):Ἁ)+e),show¬(((Aq q):Ἁ)+e>127) from not_lt.2 (AZ B ж),show¬(((Aq q):Ἁ)+e< -150) from not_lt.2 (AZ ж A),show¬(((Aq q):Ἁ)+e< -126) from not_lt.2 A,(V6 (N0 ж m):23<=(Aq q)+1),ἁ,nZ,p] lemma Y8(v:ℚ)(w:v≠0)(s:Ἆ)(u:decide (v<0)=s) (q:Ἀ)(a:ℚ)(o:0<=a)(g:a<1)(e:Ἁ) (j:|v|=((q:ℚ)+a)*(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 a=0 then 0 else 1),e-1⟩):=by have h:a=((Z6 a.num):ℚ)/a.den:=by(conv_lhs=>rw[<-Rat.num_div_den a]);congr 1;exact_mod_cast(S8 (Rat.num_nonneg.2 o)).symm have d:=a.den_pos;generalize a.den=D,(Z6 a.num)=r at h d;subst h;rw[roundRational,u,V0 s _ _ (ф) v.den_nz q r D d (by rwa[div_lt_one (mod_cast d),Jd]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[Zg,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[(B3.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,Kz,X4,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 lemma 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⟨Jy _,λ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 c .have E:=e (i+1) u (by rw[Q3,h,BK]);exact⟨E.1,λj a b=>(BJ a).elim (λq=>by subst q;exact .inl (of_decide_eq_true c)) (λa=>E.2 j a b)⟩ .have E:=e (i+1) (min u (ZZ x[i]!)) (by rw[Q3,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_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 (I2 _ _) ж:63-k<64),kH,lY] rw[(by rw[<-AF];congr 1;rw[Τ];exact (M8 (Nat.lt_succ.1 h)).symm:2^(1:Ἀ)*2^(63-k)=2^(64-k)),(by rw[<-AF,J2 h.le]:2^(64:Ἀ)=2^(64-k)*2^k),Yu,<-Ϛ,<-Ϡ,Xm];exact⟨ἅ,AO (ZV _ _) (щ)⟩ have m:(lq d)*2^(k-64)<2^(62:Ἀ):=calc _<2^(48:Ἀ)*2^(14:Ἀ):=ly o (Θ (ф) (O3 p 64)) (ф) _=_:=ἅ 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 (O3 p 64) ж:k-64<64),ο,γ (m.trans ж:(lq d)*2^(k-64)<2^(64:Ἀ))] refine⟨?_,m⟩;rw[Ϛ,<-AF];rw[J2 (V3 h)] lemma Vb_h2(x y:ἆ):(lq (x+y))+(if x+ydecide lemma Vb_h1(l v h w:ἆ)(d:(lq w)<2^(62:Ἀ)):(lq (l+v))+(lq (h+w+(if l+vdecide) have a:(lq (if l+vdecide linear_combination e+2^(64:Ἀ)*c+a+2^(64:Ἀ)*Vb_h4 (h+w+(if l+v Yl x u i d l h c a=a+(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 a q<;>rw[Yl] .rw[AC (X2.2 (M0.1 q))];simp only[ο,Xc,C8];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 (U0 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[Q3,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[Q3,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,Xc,C8,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[U3,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[U3,U3,W4,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,Gk,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):(Z6 (e-1-T))=0:=Vv (Int.sub_nonpos_of_le ((Vp _ ж).trans ((Int.le_add_one (le_refl _)).trans p))) lemma Q4_h2(e T:Ἁ)(p:e+1<=T):∃k,(Z6 (T-e))=k+1:=⟨(Z6 (T-e))-1,(J2 ((Int.lt_toNat (m:=0)).2 (Int.sub_pos.2 (Gg p)))).symm⟩ lemma Q4_h3(e T:Ἁ)(k:Ἀ)(p:e+1<=T)(j:(Z6 (T-e))=k+1):(Z6 (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 (Gg p))) ж,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])];omega 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):(Z6 (297-s))<2^(64:Ἀ):=by have h:(Z6 (297-s))<=506:=Hc.2 ((Gn m 297).trans_eq ж) exact C0 h ж lemma V9_h2(s:Ἁ)(o:s<=297):(((Z6 (297-s)):Ἀ):Ἁ)-298=-s-1:=by rw[S8 (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:Ἀ):=(Vt.1 ((β R 31).symm.trans l)).resolve_left (BD.1 (϶ 31)) exact(J1 q _).trans_lt ((I1 (N6 hR ж) 1).trans ж) 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 (Z6 (297-s))):=by set R:=ZK e d with g;have h:(lq (XF (Z6 (297-s))))=(Z6 (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 Hc.2 (Gn m 297)),h,j,Yf,<-g,Q4 _ _ R (-s) _ (J8 (AN ж 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 (Z6 (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<<<(Z6 c)else B def YF(Dn:Ἀ)(c:Ἁ):Ἀ:=if 0<=c then Dn else Dn<<<(Z6 (-c)) lemma VE(B d:Ἀ)(e:0rw[ο,U3,W4,nZ,<-AA];exact⟨e,by rw[S8 h];exact mul_div_right_comm _ _ _⟩ rw[S8 (Xw (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[(J2 l.le).symm,m7];exact ϐ e (϶ _) rw[AD h,ψ,Ϣ,Ϣ,ZG,ZG,ο,ο,γ (AN e (Θ ж ((I2 63 k).trans ж)):x<2^(64:Ἀ)),γ (AN l ж:k<2^(64:Ἀ)),γ (H4 l:k<64)] exact γ (N3 g ж) .exact AC h @[inline]def Q2(x:Ἀ):Ἀ:=if x>>>63==0 then(lq (ZR (I0 x)))else (Aq x) @[inline]def V2(r:Ἀ)(st:Ἆ):Ἀ:=if r !=0||st then 1 else 0 lemma VI(N M:Ἀ)(e:0h (g.2 ⟨a,b⟩))) lN;subst a;rfl · rw[V2,AD (by rw[nM,AM];exact pZ a)] lemma Qx_h2(X:ℚ)(d:Ἀ)(e:Ἁ)(x:0decide (v<0)=s) (p:0<=a) (q:a<1) (w:l=ἃ↔a≠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 [Xc,C8,Av] rename_i n a;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 c ·rw[a (i+1) _ _ (by rw[Q3,h,BK]),Y4];ring ·rw[a (i+1) _ _ (by rw[Q3,h,BK]),Y4];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 Kq (r*n) n)),Vb x u _ n _ 0 0 0 0 ((by exact Kq (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[U3,pO h,sq] lemma YO_h2(a b:Ἀ)(h:a<=b):(((b-a)*(b-a):Ἀ):ℚ)=((a:ℚ)-b)^(2:Ἀ):=by rw[U3,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 (Qy h) lemma VF_h1(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(m Y c:ℚ)(w:0sq_nonneg _) (I3 _) rw[h,le_div_iff₀ (mul_pos ((M9 (α:=ℚ)).2 w) ((M9 (α:=ℚ)).2 w)),nv]at e;exact(mul_nonneg_iff_of_pos_right (pow_pos a 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 lemma 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 a:n*(S*c/n)=S*c:=mul_div_cancel₀ _ h;rw[sub_mul,<-mul_pow];generalize S*c/n=t at a⊢;rw[<-a,<-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 a:=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=((a.1:ℚ)-a.2)*2^((u:Ἁ)-149)/n/\ XH n x r (no n x r)= ((n*Q-Y0 a.1 a.2*Y0 a.1 a.2:Ἀ):ℚ)* 2^(2*(u:Ἁ)-298)/((n*n:Ἀ):ℚ):=by intro a Q;obtain⟨d,m⟩:=VW n x r u t;simp only[Int.cast_sub,X4]at d;have g:no n x r=(a.1-a.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:(a.1:ℚ)-a.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,<-Yg,d,m,l,Kh,Xa,nsmul_eq_mul];exact VF_h3 _ _ _ _ ((Kj (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 ((F4 (α:=ℚ)).1 (by rw[YO,U3,o];exact sub_nonneg.1 v)),YO,o,l,U3,U3] 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 ϝ ж rw[mF];rw[my,show(lq (0x10000000000000:ἆ))=2^(52:Ἀ)*1 from ἅ,Hq,<-Ϥ d,ϻ,Τ] lemma jh(v Y U:ℝ)(d:Ἆ)(M L c:ℕ)(o:0simp only[ἁ,υ,Am]at j⊢<;>constructor;linear_combination t+AI l o-j;linear_combination r+AI m o+j;linear_combination r+AI l o+j;linear_combination t+AI m o-j end NF namespace NE open Core (iW) open NF Dense.F open Dense (ay) @[inline]def mx(a b:ἆ):ἆ:=if arename_i h<;>rw[μ]at h<;>omega @[inline]def pk(s:Ἆ)(q σ:ἆ):Ἃ:= (O2 ((if s then(0x80000000:ἆ)else 0)+((σ-146)<<<23+Core.ar (((2:ἆ)*q+1)<<<36)))) @[inline]def el(x g b:Ἃ)(nd nS R pz:Ἅ)(A1 A2 C1:ἆ)(slow:Unit->Ἃ):Ἃ:= let v:=(dw x*nd+nS)*dw g*R+dw b*pz let B:=v.toBits let E:=eF B let σ:=E-C1 let M:=mF B let L:=M&&&0x7FFFFFF let c:=mx (mx (E+10) (iW b+A1)) (iW g+A2)-E if 146<=σ&&σ<=398&&c<=25&&(1<<>>63!=0) (M>>>27) σ else slow () lemma kj_h1(c x y:ℕ)(e:c<=2^(31:Ἀ))(h:x<=252)(g: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:Ἀ):=ι _ h have b:x*2^(23:Ἀ)+y<=252*2^(23:Ἀ)+2^(24:Ἀ):=E0 a g have d:c+(x*2^(23:Ἀ)+y)<=2^(31:Ἀ)+(252*2^(23:Ἀ)+2^(24:Ἀ)):=E0 e b rw[γ (C0 a ж:x*2^(23:Ἀ)<2^(64:Ἀ)),γ (C0 b ж:x*2^(23:Ἀ)+y<2^(64:Ἀ)),γ (C0 d ж:c+(x*2^(23:Ἀ)+y)<2^(64:Ἀ)),γ (C0 d ж)] lemma 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:Ἀ):=N6 l ж rw[γ (N3 a ж:2*x<2^(64:Ἀ)),γ (C0 (l7 a) ж:2*x+1<2^(64:Ἀ))] lemma 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 lemma 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 a:ἆ)(j:2^(25:Ἀ)<=(lq q))(l:(lq q)<2^(26:Ἀ))(m:146<=(lq a)) (o:(lq a)<=398):pk s q a=az s ((2:ἆ)*q+1) a:=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 (N6 l ж))).trans_lt ж) have h:(lq (a-36))=(lq a)-36:=by rw[χ a 36 (AZ ж m:36<=(lq a))];rfl have H:=kj_h3 _ _ _ _ j l m o g h;obtain⟨r,-,t⟩:=bM s (((2:ἆ)*q+1)<<<36) (a-36) H.1 H.2.1 H.2.2.1 H.2.2.2;have p:(mJ (pk s q a))=(if s then 2^(31:Ἀ) else 0)+(((lq a)-146)*2^(23:Ἀ)+(lq (ar (((2:ἆ)*q+1)<<<36)))):=by rw[pk,Ϫ,η,η,ψ,χ a 146 m];cases s<;>simp only[ἁ,ἂ,υ,kA,kH,ο]<;>exact kj_h1 _ _ _ ж (O3 o 146) t rw[(by clear p r t;rw[cl s _ _ (by rw[d];exact C7 _) (o.trans ж),cl s _ _ (by rw[g];exact Ku (C7 _) ж) (by rw[h];exact(I2 _ _).trans (o.trans ж)),d,g,h,(by rw[<-AF,BQ (AZ ж m:36<=(lq a))]:(2:Ἁ)^(lq a)=2^(36:Ἀ)*2^((lq a)-36)),U3,W4,nZ,kj_h4]:az s ((2:ἆ)*q+1) a=az s (((2:ἆ)*q+1)<<<36) (a-36))];apply Β.1;rw[p,r,h,X5] 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 _) ф lemma 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₀ ш;have d:(1:ℝ)/2^(1075:Ἀ)<=1/2^(1:Ἀ):=AV ш ш;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 ш 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 ф lemma jM_h1(x y e a:ℝ)(h:x-y<=e)(k:e<=x/2^(53:Ἀ)+a)(c:0<=y)(m:0<=a):x<=2*y+2*a:=by linarith lemma 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 (B3.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τ▸ф;have r:=dQ12 G;rw[dQ15 a G]at B;rw[dQ15 t R,dQ16 g]at D;have X:|j+l|<=2*|v|+2*τ:=jM_h1 _ _ _ _ ((dQ14 (j+l) v).trans_eq (dQ18 _ _)) V (dQ12 v) m have K:|a| *|G|<=2*|t|+2*τ:=by have:=dQ14 (a*G) t;rw[dQ18,dQ15]at this;exact jM_h1 _ _ _ _ this B (dQ12 t) m have J:|A|<=2*|a|+2*τ:=jM_h1 _ _ _ _ ((dQ14 A a).trans_eq (dQ18 _ _)) z (dQ12 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=>(dQ13 _ f).trans (dQ8 ((dQ13 _ e).trans (dQ8 ((dQ13 _ d).trans (dQ8 ((dQ13 _ c).trans (dQ8 (dQ13 a b) dQ17)) dQ17)) dQ17)) dQ17) refine(T _ _ _ _ _ _).trans ?_;simp only[dQ15,dQ16 g,dQ16 hκ];linear_combination V+X/2^(53:Ἀ)+D+dQ7 B g+19*dQ7 K g/2^(53:Ἀ)+dQ7 z (dQ6 r g)+9*dQ7 J (dQ6 r g)/2^(53:Ἀ)+dQ0 hR (dQ6 (dQ12 A) r)+dQ7 (dQ7 he r) hκ+78*(by have:=dQ13 (j+l) (-l);rw[add_neg_cancel_right,BE]at this;exact this.trans (dQ8 X dQ17):|j|<=2*|v|+2*τ+|l|)/2^(53:Ἀ)+39*(by have:=dQ14 (t*R) j;rw[dQ18,dQ15,dQ16 g]at this;exact jM_h1 _ _ _ _ this D (dQ12 j) m:|t| *R<=2*|j|+2*τ)/2^(53:Ἀ)+98*dQ12 v/2^(53:Ἀ)+178*dQ12 l/2^(53:Ἀ)+18014398509481748*m/2^(53:Ἀ)+27021597764222938*dQ6 m g/2^(53:Ἀ)+27021597764222958*dQ6 m (dQ6 r g)/2^(53:Ἀ) have Pp:(0:ℝ)<=2^((o:ℤ)-1075):=(dQ4 _).le have F1:=jM_h2 _ c o aH;have F3:=jM_h2 0 c o ((H0 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];exact dQ22 (dQ6 (dQ1 _).2.1 (dQ4 _).le) ш;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 dQ9 (dQ0 (hG.trans_eq (AF (2:ℝ) 24 u)) ((dQ1 y).2.1)) a6 hκ (dQ6 (dQ1 _).2.1 (dQ6 (dQ1 _).2.1 (dQ1 _).2.1))+dQ21 h (dQ1 21).2.1 have g1:|G|<=2^(278:Ἀ):=hG.trans (dQ2 _ _ (J1 a0 24));have a0:(0:ℝ)<=1/2^(1075:Ἀ):=by positivity have a3:(1:ℝ)/2^(1075:Ἀ)*(|G| *R)<=1/2^(25:Ἀ):=(dQ0 ((dQ9 g1 al g (dQ1 _).2.1).trans_eq (dQ30 _ _).symm) a0).trans (dQ11 _ 1075 25 ж) have a2:(1:ℝ)/2^(1075:Ἀ)*R<=1/2^(25:Ἀ):=(dQ0 al a0).trans (dQ11 _ 1075 25 ж) generalize(2:ℝ)^((o:ℤ)-1075)=P at Y Pp F1 F3 t3⊢;linear_combination Y/2^(45:Ἀ)+dQ7 (AU (dQ26.2.2.1:(1:ℝ)<=2) as) Pp/4+ah/2^(45:Ἀ)+F1/2^(21:Ἀ)+t3+4*a2+4*a3+4*(AV ш ж:(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:=V7 (V7 g) rw[pt,d,AB P.data (j+1) (by simp only[P,Ϝ];exact k.trans ж)];simp only[P,Λ,AD k];exact iJ j (g.trans ж) lemma jv_h1(e:Ἀ)(l:e<=508):po e 254<=254/\(-1074:ℤ)<=e/\1+e<=971/\po e 254+(e-po e 254)=e:=⟨T9 _ _,AZ ж (Jw _),(J1 l 1).trans ж,M3 (F6 _ _)⟩ lemma jv_h2(e:Ἀ)(l:e<=508):e-po e 254<=254:=Km.2 ((Uq.2 ⟨H0 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) ж H.2.1 (bL 1 e 971 H.2.2.1 ш 1 ж);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,J2 (I2 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 ж),an,γ];exact(ϕ hn (lB d)).trans ж 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:=Ku 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 (Wj _ (϶ (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 U0 _ al.le have bs:=cP d have bA:kG d+(lq x)+52<=342:=L1 (E0 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) ж),γ (AO bA ж)] 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 ж),?_,q,Q,?_,?_,K,dQ22 (dQ1 _).2.1 (dQ20 _),?_,?_,(bA.trans ж),?_,?_,?_,?_,?_⟩ have hz:(lq (I0 e))=e:=Α (q.trans ж) have W:(O5 (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 (U5.2 (q.trans ж)),Int.sub_zero];exact ke_h1 e q have z5:(G5 (if X then(e:ℤ)else-(e:ℤ)))<2^(53:Ἀ):=by rw[Ax G5,Zv,ite_self];exact q have B:=dB _ (by rw[W];exact z5) rw[W]at B obtain⟨f2,v2⟩:=jv (j+u) (Q.trans ж) have:=aE _ _ B.1 f2 _ _ (by rw[B.2,v2,AA]) z5 (AZ ж (Jw _)) (bL 53 (j+u) 971 ((J1 Q 53).trans ж) AP _ z5) refine⟨this.1,?_⟩ rw[this.2,AA,Ax (Int.cast:ℤ->ℝ),Kz,X4] 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 ж:j+u<2^(64:Ἀ))];simp only[kA];exact γ (AO (L1 Q 1154) ж)⟩⟩ have a1:(e:ℝ)*2^j<=S:=(by rw[<-m,β,<-ke_h2,<-U3,F4];exact pr _ _) have a2:(S:ℝ)by have e:(lq (a-b))=2^(64:Ἀ)-((lq b)-(lq a)):=Jx (x:=a.toBitVec) (y:=b.toBitVec) (μ.2 g);rw[e]at h;exact absurd h (U5.2 (AN ж (C9 ((I2 _ _).trans c) _))) lemma jn_h2(X G P d e a n D c:ℝ)(i:n≠0)(j:D≠0)(g:c≠0):(X*n-P)*G*a+d*(e*(a*n*D*c))=((X/c-P/n/c)*(G/c)/D+d*e/c)*(c*(a*n*D*c)):=by have k:(X/c-P/n/c)*(G/c)/D*(c*(a*n*D*c))=(X*n-P)*G*a:=by rw[←sub_div,div_mul_div_comm,div_div,mul_comm (c*c) D,div_mul_eq_mul_div,mul_comm c (a*n*D*c),Ap (a*n*D) c c,Ap (a*n) D (c*c),mul_div_assoc,mul_div_cancel_right₀ _ (mul_ne_zero j (mul_ne_zero g g)),mul_comm a n,←Ap ((X-P/n)*G) n a,mul_right_comm (X-P/n) G n,sub_mul,div_mul_cancel₀ _ i] have h:d*e/c*(c*(a*n*D*c))=d*(e*(a*n*D*c)):=(div_mul_eq_mul_div _ _ _).trans ((congrArg (·/c) (mul_left_comm _ _ _)).trans ((mul_div_cancel_left₀ _ g).trans (Ap _ _ _))) exact ((add_mul _ _ _).trans (congrArg₂ (·+·) k h)).symm lemma 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 U5.2 (U1 ж (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 (I1 eb 10) ж),(γ (AO (E0 ib (L1 Jb 1056)) ж)).trans (pA _ _ _).symm,γ (AO (E0 ig Ab) ж)⟩ 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 clear * - z hA;omega⟩) 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,W7,R8,B7,Z7,Ac AL,AA,zpow_ofNat,mul_div_assoc] rw[Vj,Qn,W7,Hd,e x,e g,e b,o,AF,hZ] exact jn_h2 _ _ _ _ _ _ _ _ _ (Kj.2 b6.ne') hD (pow_ne_zero _ AL) 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 ((γ ((D5 (ϊ _ (϶ 27)) (B.trans (ϊ _ (϶ 27)))).trans ж:(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 ж d1) have cb:q<2^(26:Ἀ):=hq▸Ϟ (N.trans_eq ж) have q0:q≠0:=(AN ж 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 AL,<-AK AL,<-AK AL];exact congrArg (λt:ℤ=>(2:ℝ)^t) (by rw[nZ,nZ,sub_sub,sub_add_cancel,add_comm]) have hP:(0:ℝ)<2^(149:Ἀ)*2^j:=ф rw[Ap,e4,<-Ap]at lo;rw[Ap,e4,<-Ap ((q:ℝ)+1)]at hi;obtain⟨s,hs⟩:∃s,s=(V.toBits>>>63!=0):=⟨_,rfl⟩;rw[<-hs]at lo hi a3⊢;generalize(2:ℝ)^(149:Ἀ)*2^j=K at lo hi hP;have kq:(if s then-((Y:ℝ)*K)else(Y:ℝ)*K)=(((if s then-Y else Y:ℚ)):ℝ)*K:=by by_cases h:s=true;rw[AD h,AD h,Rat.cast_neg,neg_mul];rw[AC h,AC h] rw[kq]at lo hi;have a6:(q:ℚ)*2^e<(if s then-Y else Y):=Hs.1 (by push_cast;exact BF lo hP.le:(_:ℝ)<_) have A:(if s then-Y else Y)<((q:ℚ)+1)*2^e:=Hs.1 (by push_cast;exact BF hi hP.le:(_:ℝ)<_) have a0:(0:ℚ)<2^e:=ф have v:0<(if s then-Y else Y):=AO (Af (I3 _) a0.le) a6;have tA:|Y|=(if s then-Y else Y)∧(Y≠0->decide (Y<0)=s):=by by_cases h:s=true;rw[AD h]at v⊢;exact⟨abs_of_neg (neg_pos.1 v),λ_=>h▸A6 (neg_pos.1 v)⟩;rw[AC h]at v⊢;exact⟨AW v,λ_=>(O8.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 clear * - ds he M;omega have k1:-126<=((25:ℕ):ℤ)+e:=by clear * - ch E5;omega have k2:((25:ℕ):ℤ)+e<=126:=by clear * - c1 E5;omega 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[I4];exact b7) (by rw[I4,d2];exact k1) (by rw[I4,d2];exact k2) (by rw[η,ύ,e3];simp only[kA,V2,Bool.or_true,ἁ,I4];exact kj_h2 _ cb) E5] end NE lemma uS{i:Ἄ}(h:(J0 i)+1Ἄ->Ἄ->Ἃ)(s:σ)(lo i e:Ἄ)(out:(Ἂ Word)):(Ἂ Word):= if h:iἌ->Ἄ->kF)(s:n)(g e:Ἄ)(i:Ἄ)(d:(Ἂ Word))(l:(J0 e)<=(O0 d))(m:(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:=X2.mpr (M0.mp h) rw[Yq,dite_eq_right (λx=>z (ε.mp x))];exact ⟨rfl,λq _=>(AC (λx=>z (C0 x.1 x.2))).symm⟩ |succ k p=> have hi:(J0 i)<(J0 e):=N1 h have hX:(J0 i)+1?_⟩ rw[b q (by rw[j];exact hq),uS hX,pP,AB _ _ (by rwa[Ql])] by_cases hq1:(J0 i)=q · subst hq1;rw[AC (λc=>Vg _ c.1),AD ⟨Jy _,hi⟩,Array.getElem_set_self,lX,Jv] · rw[Qd,AC hq1,<-AB d q hq] by_cases c:(J0 i)+1<=q/\q<(J0 e) · rw[AD c,AD ⟨M4 c.1,c.2⟩] · rw[AC c,AC (λx=>c ⟨U4 x.1 hq1,x.2⟩)] @[specialize]def Yr{σ:Type}(g:Ἀ->σ)(f:σ->Ἄ->Ἄ->Ἃ)(n rows r:Ἀ)(out:(Ἂ Word)):(Ἂ Word):= if ro)(f:o->Ἄ->Ἄ->kF)(n d r:Ἀ)(e:(Ἂ Word))(m:d*n<2^(32:Ἀ))(a:(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:=W1 h;rw[Yr,AC (X2.2 k0)];exact ⟨rfl,λq hq=>by rw[AC (U5.2 ((hq.trans_eq a).trans_le (ι n k0)))]⟩ |succ k u=> have p:=N1 h have i:(r+1)*n=r*n+n:=add_one_mul r n have j:r*n+n<=d*n:=i▸ι n p rw[Yr,AD p] have w:=Conv.aa _ (((V1 _ n).trans j).trans_lt m);have l:=Conv.aa _ (j.trans_lt m) obtain⟨c,t⟩:=ju0 f (g r) (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) e (by rw[l,a];exact j) (a.trans_lt m) obtain⟨v,s⟩:=u (r+1) _ (by rw[c,a]) (by rw[Q3,h,BK]) refine ⟨v.trans c,λq hq=>?_⟩ rw[s q (by rw[c];exact hq),t q hq,w,l,i] by_cases c1:r*n+n<=q · rw[AD c1,AD ((V1 _ _).trans c1)] · rw[AC c1];by_cases c2:r*n<=q · rw[AD ⟨c2,U5.1 c1⟩,AD c2,mG c2 ((U5.1 c1).trans_eq i.symm)] · rw[AC (c2∘And.left),AC c2] lemma Ys{c:Type}(g:Ἀ->c)(f:c->Ἄ->Ἄ->kF)(n d:Ἀ)(j:d*n<2^(32:Ἀ))(F:Fin (d*n)->kF) (h:∀q (h:qrw[cS,Yh];rw[dite_eq_right (by rw[ε];exact VN_h1 _ _ h),AC (VN_h1 _ _ h)];rename_i g;obtain⟨k,m⟩:=gO_h2 i e _ h;rw[AT (ε.2 k),AD k,g _ _ (by rw[m,Q3,h,BK]),m,f6];congr 1;exact gO_h1 _ _ structure jY where l:ἆ h:ἆ c:Ἀ big:Ἀ P:Ἀ N:Ἀ @[inline]def cA(P:Ἀ)(q p:ἆ):Ἀ:=if q

>>1)>>>(63-k)else mm<<<(k-64) let l':=l+vl let h':=h+vh+(if l'dsimp only<;>unfold cF Yl Ym<;>have:=e.toNat_lt_size .rw[dite_eq_right (by rw[ε];exact X2.2 (M0.1 hk))];simp only[show¬(J0 i)<(J0 e) from X2.2 (M0.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,γ ((I2 _ _).trans_lt this)];rw[θ]at g;rw[ϋ,Yp (Qy g)];rfl);rw[o];generalize q:(lq (ZD w))-(lq u)=d;have t:(lq (I0 d))=d:=by rw[Ϣ,ZG];exact γ (q▸(I2 _ _).trans_lt this) have p:(2:ἆ)*(I0 d)=(I0 (2*d)):=(by rw[Ϣ,Ϣ,Uc];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,Q3,hk,BK])).1,(j _ _ _ _ _ _ _ _ _ (by rw[m,Q3,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)&&&3==0) lemma nOK_dec(B c:ἆ)(h:nOK B c=ἃ):1047<=lq (eF B)∧lq (eF B)<=1298∧lq c<=25∧(2^lq c?_) (λa=>⟨a.1,?_⟩)⟩ · have t:lq c<64:=C0 e (by decide) simp only[μ,Ε,η,ψ,pS,γ t,na,kA,show (134217727:Ἀ)=2^27-1 from rfl,ζ,γ (lu (by decide:1<2) t)]at a rw[b,show (2:Ἀ)^52=2^27*2^25 from rfl,E7,I8 _ ж] rw[γ (U1 (D5 (ϊ _ (϶ 27)) (a.1.trans (ϊ _ (϶ 27)))) ж)]at a exact a · have:=congrArg lq a.2;simp only[Ε,ν,η,kA,kH,β,show (3:Ἀ)=2^2-1 from rfl,ζ]at this clear*-this b;omega lemma nOK_win(y:ℝ)(v:Ἅ)(c:ℕ)(k:fv v)(d:(lq (eF v.toBits))≠0)(m:2^c<(lq (v.toBits))%2^(27:Ἀ))(l:(lq (v.toBits))%2^(27:Ἀ)+2^c<2^(27:Ἀ)) (i:|y-rv v|<2^((c:ℤ)-1)*2^(((lq (eF v.toBits)):ℤ)-1075)): 2^(25:Ἀ)<=(lq (mF v.toBits>>>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 a:=kc v.toBits have g:(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[g]at a have j:¬eF v.toBits=0:=λh=>d (by rw[h];rfl) have e:=dV v k j rw[bJ,show(lq (v.toBits&&&0xfffffffffffff))+2^(52:Ἀ)=(lq (mF v.toBits)) by rw[a,g]]at e have W:0<((2:ℝ)^(((lq (eF v.toBits)):ℤ)-1075)):=zpow_pos ш _ have n: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[e] have a8:|rv v-y|<=2^c*2^(((lq (eF v.toBits)):ℤ)-1075):=by rw[Aw];refine i.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 n (by rw[a];exact (I8 _ (pow_dvd_pow 2 ж)).symm.trans (Μ _ (2^(25:Ἀ)) _).symm) m l a8 rw[<-hq]at lo hi exact⟨by rw[hq,mc ж,a];exact H0 _ _,by rw[hq,a];exact Ϟ (I1 (ϊ _ ж) _),lo,hi⟩ lemma kjG(s:Ἆ)(M c:ἆ)(K:Ἀ)(k:2^26<=lq M∧lq M<2^27∧8*K<=lq M+2∧lq M<=8*K+1∧146<=lq c∧lq c<=398):mJ (az s M c)=(if s then 2^31 else 0)+((lq c-146)*2^23+K):=by obtain⟨j,l,d,k,m,o⟩:=k have g:lq (M<<<36)=lq M*2^36:=by rw[ψ];simp only[kA,kH,ο];exact γ ((ϐ l ж).trans ж) have h:lq (c-36)=lq c-36:=χ c 36 (AZ ж m:36<=lq c) have p:lq M*2^36<2^63:=(ϐ l ж).trans_eq ж have z:lq M≠0:=(AN ж j).ne' obtain⟨r,-,-⟩:=bM s (M<<<36) (c-36) (g▸AZ ж (ι _ j)) (g▸p) (h▸Z4 m) (h▸(O3 o 36).trans_lt ж) obtain⟨i,q⟩:=bM_h6 _ p have a:lq (ar (M<<<36))=K:=by simp only[nr]at i q;simp(disch:=assumption) only[ar,ν,η,Ε,kA,kH,β,g,mP,nr,γ];clear*-d k;omega rw[(by rw[cl s _ _ z (o.trans ж),cl s _ _ (by rw[g];exact Ku z ж) (by rw[h];exact (I2 _ _).trans (o.trans ж)),g,h,(by rw[<-AF,BQ (AZ ж m:36<=lq c)]:(2:Ἁ)^lq c=2^36*2^(lq c-36)),U3,W4,nZ,kj_h4]:az s M c=az s (M<<<36) (c-36)),r,h,a,X5] lemma nKz(s:Ἆ)(y Z:ℚ)(W K n N:Ἀ)(e:Ἁ)(t:|y|=Z*2^e)(A:y≠0->decide (y<0)=s)(lo:W<=Z)(hi:Zdecide have c:lq (I0 (2*W+V2 0 l))=2*W+V2 0 l:=by rw[Ϣ,ZG];exact γ щ have g:lq (I0 n)=n:=by rw[Ϣ,ZG];exact γ (o.trans_lt ж) have a:Aq W=25:=(mz (AN ж z).ne').2 ⟨z,w⟩ rw[<-r,<-Qx s W l 1 e y (Z-W) (I0 (2*W+V2 0 l)) (I0 n) A (sub_nonneg.2 lo) (sub_lt_iff_lt_add'.2 hi) x one_pos (by rw[t,add_sub_cancel,pJ,div_one]) (by simpa) (by rw[I4,a];omega) (by rw[I4,a];omega) (by rw[I4,Je,c]) (by rw[g];exact B),kjG s _ _ K (by rw[c,g];clear*-z w h i m o d;omega),g] lemma nOK_spec(y:ℚ)(v:Ἅ)(c:ἆ)(hv:fv v)(D:nOK v.toBits c=ἃ) (J:|(y:ℝ)*2^(149:Ἀ)-rv v|<2^(((lq c):ℤ)-1)*2^(((lq (eF v.toBits)):ℤ)-1075)):nW v.toBits=ZT y:=by obtain⟨u,a2,S,H⟩:=nOK_dec _ c D have x:=kc v.toBits have F:=dV v hv (λh=>by simp[h]at u) rw[bJ,<-x]at F rw[Ε,show lq 4503599627370495=2^(52:Ἀ)-1 from rfl,ζ]at x have hq:=ν (mF v.toBits) 27 have B:=χ (eF v.toBits) 900 (AZ (by decide:900<=1047) u:900<=lq (eF v.toBits)) simp only[kA,kH,β]at hq B unfold nW generalize (v.toBits>>>63!=0)=s at F⊢ generalize mF v.toBits>>>27=q at hq⊢ generalize eF v.toBits-900=a at B⊢ generalize lq (eF v.toBits)=E at * generalize lq (mF v.toBits)=M at * obtain⟨e,w⟩:∃e,(E:ℤ)-1075=e+122:=⟨(E:ℤ)-1197,by ring⟩ have m5:2^(52:Ἀ)<=M:=x▸H0 _ _ have n:2^(25:Ἀ)<=lq q:=hq▸(mc ж).2 m5 have o:lq q<2^26:=hq▸Ϟ (x▸I1 (ϊ _ ж) _) have K:-126<=25+e∧25+e<=126∧((lq a:Ἁ)=e+297∧146<=lq a∧lq a<=398):=by clear*-B w u a2;omega obtain⟨x1,x2,l⟩:=K rw[kj s q a n o l.2.1 l.2.2] have d:lq (2*q+1)=2*lq q+1:=by rw[η,ύ];simp only[kA];exact kj_h2 _ o rw[F,zpow_sub_one₀ AL,AA,w,AK AL,zpow_ofNat]at J have h:|(if s then-y else y)*2^(149:Ἀ)-M*(2^e*2^(122:Ἀ))|<2^lq c*2⁻¹*(2^e*2^(122:Ἀ)):=(Hs (K:=ℝ)).1 (by push_cast;cases s;exact J;rw[<-BE];convert J using 2;rw[if_pos rfl,if_pos rfl];push_cast;ring) have K:(0:ℚ)<2^e:=zpow_pos two_pos e generalize hY:(if s then-y else y)=Y at h obtain⟨Z,rfl⟩:∃Z,Y=Z*2^e:=⟨Y/2^e,(div_mul_cancel₀ _ K.ne').symm⟩ have U:(0:ℚ)<2^e*2^122:=by positivity have h:|(Z*2^(27:Ἀ)-M)*(2^e*2^(122:Ἀ))|<2^lq c*2⁻¹*(2^e*2^(122:Ἀ)):=by convert h using 2;ring rw[Ae,AW U]at h obtain⟨C,O⟩:=abs_lt.1 (BF h U.le) have M5:(2:ℚ)^(52:Ἀ)<=M:=by exact_mod_cast m5 have I:(2:ℚ)^lq c<=2^25:=AU one_le_two S have X:(0:ℚ)<2^lq c:=by positivity have A:0<(if s then-y else y):=hY▸mul_pos (by linarith only[C,M5,I]) K have p:|y|=Z*2^e:=by rw[<-hY];cases s<;>[exact AW A;exact abs_of_neg (neg_pos.1 A)] have r:y≠0->decide (y<0)=s:=λ_=>by cases s<;>[exact decide_eq_false (not_lt.2 A.le);exact A6 (neg_pos.1 A)] have i:=ϛ M (2^(27:Ἀ)) have l7:=ϊ M (by decide:0<2^(27:Ἀ)) generalize M%2^(27:Ἀ)=L at i H l7 rw[<-hq]at i have T:(M:ℚ)=2^(27:Ἀ)*lq q+L:=by exact_mod_cast i.symm by_cases a5:2^lq c(sub_pos.2 z).ne',λ_=>rfl⟩ one_pos (by rw[p,add_sub_cancel,pJ,div_one]) (by simpa) (by rw[I4,N];exact x1) (by rw[I4,N];exact x2) (by rw[I4,Je,d];rfl) l.1 generalize hP:(M+2^(26:Ἀ))/2^(27:Ἀ)=P at H have k:4*(P/4)=P∧P*2^(27:Ἀ)<=M+2^lq c∧M<=P*2^(27:Ἀ)+2^lq c∧E<1298∧lq q<=P∧P<=lq q+1:=by have:=Θ (by decide:0<2) S;clear*-this H a5 i l7 hP;omega have kN:=kjG s (2*q+1) a (P/4) (by rw[d];clear*-n o k l;omega) obtain⟨kR,k2,k3,k4,G,V⟩:=k have g3:(P:ℚ)*2^(27:Ἀ)<=M+2^lq c:=by exact_mod_cast k2 have g4:(M:ℚ)<=P*2^(27:Ἀ)+2^lq c:=by exact_mod_cast k3 have g:(P:ℚ)-1/2simp 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)):=ϵ λ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) (J2 e1)))) lemma 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=>J8 hd.1 (congrArg mJ q) have hs:(sv d:ℝ)=(kM d:ℝ):=by rw[sv,hd.2.2,AC lN,X4] have hm:2^(23:Ἀ)<=kM d:=by rw[mantOf,AC z];exact V1 _ _ have hk:kG d=(mJ (kB d))-1:=by rw[idxOf,AC z] rw[hs,hk] calc (2:ℝ)^((mJ (kB d))+22)=2^(23:Ἀ)*2^((mJ (kB d))-1):=by rw[<-AF,<-Xb hd.1,Τ 23];rfl _<=(kM d:ℝ)*2^((mJ (kB d))-1):=AE (by exact_mod_cast hm) (pow_nonneg zero_le_two _) lemma nEl_fin(E s c:ℤ)(R V j i:ℝ)(A:1047<=E)(l:c=if s<=E+5 then 6 else s-E) (t:V<2^(E-1022))(k:j<=2^(551:Ἀ))(m:i<=2^(256:Ἀ))(o:0<=i)(y:0<=j) (hR:R<=18/5*2^(s-1078)+V/2^(52:Ἀ)+6*(j+i+1)*(1/2^(1075:Ἀ))): R<2^(c-1)*2^(E-1075):=by have two:(0:ℝ)<2:=dQ26.1 have n:(0:ℝ)<2^(E-1075):=dQ4 _ have r:(2:ℝ)^(E-1022)=2^(53:Ἀ)*2^(E-1075):=by rw[← AA,← AK two.ne'];congr 1;ring have d:6*(j+i+1)*(1/2^(1075:Ἀ))<=2^(E-1075)/4:=by have a:(2:ℝ)^(256:Ἀ)<=2^(551:Ἀ):=dQ2 _ _ ш have b:(1:ℝ)<=2^(551:Ἀ):=(dQ1 _).2.2.1 have e:(2:ℝ)^(551:Ἀ)*(1/2^(1075:Ἀ))=2^(-524:ℤ):=by rw[← AA,← AA,one_div,← zpow_neg,← AK two.ne'];congr 1 have p:(2:ℝ)^(-524:ℤ)<=2^(E-1082):=dQ5 _ _ (by linarith only[A]) have x:(2:ℝ)^(E-1075)=2^(7:Ἀ)*2^(E-1082):=by rw[← AA,← AK two.ne'];congr 1;ring linear_combination (6/2^(1075:Ἀ):ℝ)*k+(6/2^(1075:Ἀ):ℝ)*m+(6/2^(1075:Ἀ):ℝ)*a+(6/2^(1075:Ἀ):ℝ)*b+18*e+18*p-(1/4:ℝ)*x+14*(dQ4 (E-1082)).le have g:V/2^(52:Ἀ)<2*2^(E-1075):=by linear_combination (1/2^(52:Ἀ):ℝ)*t+(1/2^(52:Ἀ):ℝ)*r split at l · rename_i h subst l have B:(2:ℝ)^(s-1078)<=2^(E-1073):=dQ5 _ _ (by linarith only[h]) have w:(2:ℝ)^(E-1073)=2^(2:Ἀ)*2^(E-1075):=by rw[← AA,← AK two.ne'];congr 1;ring have v:(2:ℝ)^((6:ℤ)-1)=32:=by norm_num rw[v];linarith only[hR,g,d,B,w,n] · rename_i h subst l have z:(2:ℝ)^(s-1078)=2^(s-E-3)*2^(E-1075):=by rw[<-AK two.ne'];congr 1;ring have u:(2:ℝ)^(s-E-1)=4*2^(s-E-3):=by rw[show (4:ℝ)=2^(2:ℤ) by norm_num,<-AK two.ne'];congr 1;ring have q:(8:ℝ)<=2^(s-E-3):=by rw[show (8:ℝ)=2^(3:ℤ) by norm_num];exact dQ5 _ _ (by linarith only[not_le.1 h]) rw[u];linarith only[hR,g,d,z,dQ7 q n.le,n] 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+5 then 6 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))+1079-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:ἆ)(a:(lq E)<2048):(lq E)+(lq 5)<2^(64:Ἀ):=(I1 a 5).trans ж lemma nC_toNat_h2(a b:Ἀ)(h:¬a<=b+5):b<=a:=(V1 _ 5).trans (Qy h) lemma nC_toNat(s E:ἆ)(c:(lq s)<2^(60:Ἀ))(a:(lq E)<2048):(lq (nC s E))=if (lq s)<=(lq E)+5 then 6 else (lq s)-(lq E):=by unfold nC;split<;>rename_i h<;>rw[θ,η,γ (nC_toNat_h1 E a)]at h<;>simp only[kA]at h · simp only[kA,AD h] · rw[AC h,χ _ _ (θ.2 (nC_toNat_h2 _ _ h))] lemma nS_toNat_h1{p q:Ἀ}(a:p<256)(hq:q<256+2^(40:Ἀ)):p+q<2^64:=U1 (D5 a hq) (G1 rfl) lemma nS_toNat_h2{x y:ἆ}(h:(lq x)+(lq y)<2^64):(lq (x+y))=(lq x)+(lq y):=(η x y).trans (γ h) lemma nS_toNat(a b K c:ἆ)(i:(lq a)<256)(g:(lq b)<256)(j:(lq K)<2^(40:Ἀ))(d:(lq c)<2^(40:Ἀ)): (lq (a+(if Kh (B3.mp F)),e,pO ((V1 T 5).trans (U2 (N7 h)))]⟩ obtain⟨w,q⟩:=H have o:(G:ℤ)+K<=c:=B3.mpr C have n:(G:ℤ)+(X+Q)<=c:=B3.mpr B have s:(a:ℤ)+Q=1051:=congrArg Wg k4 have M:(c:ℤ)<=T+25:=B3.mpr w have l:(T:ℤ)<=1298:=B3.mpr D have p:(G:ℤ)<=255:=B3.mpr (Z0 hG) have m:(a:ℤ)<=255:=B3.mpr (Z0 x) have g:A<=μ:=(Wo ((Ww z).trans (X7 (Xf o) a))).trans_eq d.symm have j:μ<=499:=d▸Qt (Wa ((Vp _ (K5 G)).trans (M.trans (X7 l 25))) m) 1079 have O:(X:ℤ)+23<=μ+51:=by linear_combination n-s-d have y:(E:ℤ)-1022<=μ+51:=Wp ((Ww (v.trans g)).trans_eq (Int.add_assoc μ 51 1022).symm) have S:(E:ℤ)-1022<=499+51:=y.trans (X7 j 51) have g5:(G:ℤ)+23=G-a+1+((a:ℤ)+22):=by ring have g6:μ+((G:ℤ)-a+1)=c-1078:=by linear_combination d have g7:(G:ℤ)-a+1<=255+1:=X7 ((Vp _ (K5 _)).trans p) 1 exact⟨(L1 (U2 hX) 23).trans ж,(by decide:1<=22).trans (H0 22 a),(L1 (Z0 hG) 23).trans ж,(L1 (U2 J) 23).trans ж,q,B3.mpr N,u.trans g,S,O,y,g5,g6,g7⟩ lemma nEl_spec_h3(a b:Ἁ)(h:a<=b):(2:ℝ)^a<=2^b:=AG one_le_two h lemma nEl_spec_h4(a b:Ἀ)(h:a<=b):(2:ℝ)^a<=2^b:=AU one_le_two h lemma 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^(52:Ἀ)) (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))) (1051-(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 ϝ ж obtain⟨p1,p2,p3,p4,p5⟩:=nEl_spec_h1 _ _ _ _ _ _ _ ex eg ed hEm hL hDl hA have e3:(lq ((1051-(mJ (kB d))).toUInt64))=1051-(mJ (kB d)):=by show (lh _).toNat=_;rw[J6];exact γ p4 have e4:(lq (nElK m L Dl (mJ (kB d))))=(A+1079-(mJ (kB d))).toNat:=by show (lh (max ((L:ℤ)+Dl-30) (((lq (eF m.toBits)):ℤ)-1073)+1079-(mJ (kB d))).toNat).toNat=_ rw[J6,<-hA];exact γ p1 have hs:=nS_toNat (nfe gw) (nfe xw) (nElK m L Dl (mJ (kB d))) ((1051-(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,W7,R8,B7,Z7,<-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[Vj,Qn,W7,Hd,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):ℤ)-1078):=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:Vw x=ἃ)(p:0<=Xl x):Xu x=ἃ\/Kc x=ἄ:=by by_cases z:Xu x=ἃ · exact pZ z right;obtain⟨d,a⟩:=Model.exists_toDyadic?_of_isFinite h have c:=Model.significand_ne_zero_of_toDyadic?_some_of_isZero_eq_false a (O8.2 z) rw[<-Model.sign_eq_signBit_of_toDyadic?_some a] refine O8.2 λe=>?_ have g:Xl x=d.toReal:=by rw[BR,a] have q:=Int.cast_nonneg_iff.1 (nonneg_of_mul_nonneg_left (g▸p:0<=d.toReal) (zpow_pos two_pos _)) rw[lr,e,AD rfl]at q;exact c (Wg.inj (le_antisymm (Int.neg_nonneg.1 q) (Ua _))) lemma fS(v:Ἅ)(h:Dense.F.fv v)(p:0<=Dense.F.rv v):Dense.F.fv (O6 v)/\Dense.F.rv (O6 v)=ns kC (S0 (Dense.F.rv v)):=by have e:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat_sqrt v simp only[m5]at e have a:=nSg _ h p have q:=Model.toReal_sqrt_eq_roundAt (kI v.toModel) ж h a have f:=Model.isFinite_sqrt_of_isFinite (kI v.toModel) ж h a have c:Zc (Us (kI v.toModel))=Us (kI v.toModel):=by by_cases z:Xu (kI v.toModel)=ἃ · have d:Us (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[d];exact Ks _ (Model.isModelCanonical_ofFloatModel _) · have s:=a.resolve_left z rw[Model.Proof.sqrt_eq_spec,Model.Spec.sqrt_eq_model ж _ h s,Model.canonicalizeModel_ofModel] refine⟨?_,?_⟩ · unfold Dense.F.fv;rw[e];exact (congrArg Vw c).trans f · unfold Dense.F.rv;rw[e];exact (congrArg Xl 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,L7,AF,Qk];exact mul_mul_mul_comm _ _ _ _) (m.trans ж) (Int.le_trans ж (K5 _)) (Dense.F.bL 48 (2*kG w) 556 (J1 (U0 2 (cP w)) 48) ж _ m) exact⟨r.1,by rw[r.2,AA,L7,AF,Qk,sq];exact (mul_mul_mul_comm _ _ _ _).symm⟩ lemma nQs_e0(a r A t u w k:ℝ)(hA:0<=A)(d:0<=t)(c:0<=u)(j:0<=w)(k0:0<=k)(e:2*k*u<=1) (h:|a-A|<=2*k*u*A+2*k*w)(i:|r-(a+t)|<=u*|a+t|+w): |r-(A+t)|<=2*(k+1)*u*(A+t)+2*(k+1)*w:=by obtain⟨m,l⟩:=A3.1 h have g:|a+t|<=(A+t)+2*k*u*A+2*k*w:=A3.2 ⟨by linear_combination m+2*hA+2*d,by linear_combination l⟩ have T:=abs_sub_le r (a+t) (A+t) rw[add_sub_add_right_eq_sub]at T refine T.trans ?_ linear_combination i+h+mul_le_mul_of_nonneg_left g c+AE e (Af c hA)+AE e j+Af c d+2*Af (Af k0 c) d lemma nQs_e(a r A t:ℝ)(k:ℕ)(hA:0<=A)(e:0<=t)(c:(k:ℝ)<=2^(20:Ἀ)) (g:|a-A|<=2*k*(1/2^(53:Ἀ))*A+2*k*(1/2^(1075:Ἀ)))(d:|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 e (by positivity) (by positivity) (I3 k) ((AE (mul_le_mul_of_nonneg_left c zero_le_two) ф).trans ш) g (d.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 lemma nSm_h1(a A X:ℝ)(s:X<=1*A+1)(d:-X<=a-A)(c:a-A<=X):a<=2*A+1/\-1<=a:=⟨((sub_le_iff_le_add'.1 c).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 d))⟩ lemma nSm(a A k u w K:ℝ)(hA:0<=A)(k0:0<=k)(c:k<=K)(e:0<=u)(g:0<=w)(cu:2*K*u<=1)(cw:2*K*w<=1)(h:-(2*k*u*A+2*k*w)<=a-A)(d:a-A<=2*k*u*A+2*k*w):a<=2*A+1/\-1<=a:=by have q:=mul_le_mul_of_nonneg_left c zero_le_two;exact nSm_h1 _ _ _ (add_le_add (AE ((AE q e).trans cu) hA) ((AE q g).trans cw)) h d lemma nFw0(v e n q P c W u w D:ℝ)(a:0<=e)(n0:0<=n)(nb:n<=2^(12:Ἀ))(x:0<=u)(g:0<=w)(l:0<=q)(z:q<=2^(52:Ἀ))(cu:2*2^(12:Ἀ)*u<=1)(cw:2^(68:Ἀ)*w<=1)(i:2<=D) (A:-(2*n*u*e+2*n*w)<=v-e)(pe:|P-v*q|<=|v*q|/D+w)(d:1<=c)(p:|W-(P+c)|<=|P+c|/D+w):0<=W:=by have j:1<=D:=one_le_two.trans i have m1:=AE (AE nb x) a have m:=AE cu a have r:=AE nb g have s:-(2*2^(12:Ἀ)*w)<=v:=by linear_combination A+2*m1+m+2*r have t:=AE s l have k:=mul_le_mul_of_nonneg_left z g have s8:-(v*q+1/4)<=v*q:=by linear_combination 2*t+16384*k+cw/4 have w8:w<=1/8:=by linear_combination cw/8+36893488147419103231*g obtain⟨y,_⟩:=A3.1 pe have ab:|v*q|<=v*q+1/4:=A3.2 ⟨s8,by linear_combination⟩ have h:-(1/2)<=P:=by linear_combination y+div_le_self (Aa (v*q)) j+ab+w8 obtain⟨o,_⟩:=A3.1 p 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∈Q5 (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∈Q5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ))|<= 2*((k+m:ℕ):ℝ)*(1/2^(53:Ἀ))*(A+∑j∈Q5 (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 o a r hA l p n have q:(J0 i)=(J0 e):=N2 a (M0.1 o) rw[nQs,dite_eq_right (by rw[ε,q];exact K4 _),q,Ky,C8,Av];exact⟨r,l⟩ |succ m z=> intro i v A k o a r hA l p n have c:(J0 i)<(J0 e):=N1 o rw[nQs,AT (ε.2 c)];dsimp only rw[f6 x i] obtain⟨tf,w⟩:=nQs_t x[(J0 i)]! (hX _ c) have s:∑j∈Q5 (J0 i) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)+∑j∈Q5 ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=W8 c _ have h:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 c) have t:0<=((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ):=sq_nonneg _ have d:0<=∑j∈Q5 ((J0 i)+1) (J0 e),((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ):=H7 (λ_ _=>sq_nonneg _) obtain⟨B,y⟩:=A3.1 l have u:(k:ℝ)<=2^(20:Ἀ):=by exact_mod_cast (show k<=2^(20:Ἀ) from (V1 _ _).trans p) 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[w];rw[s]at n;exact nBd _ A _ _ k hA t d u B y n obtain⟨af,ae⟩:=NF.fA _ _ r tf bd rw[w]at ae have g:=nQs_e _ _ A _ k hA t u l ae have:=z (i+1) _ (A+((sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!)^(2:Ἀ)) (k+1) (by rw[h,<-X5,o,BK]) (by rw[h];exact c) af (add_nonneg hA t) (by rw[X6];exact g) ((lO k 1 m).trans_le p) (by rw[h,add_assoc,<-s];exact n) rw[h,show k+1+m=k+(m+1) from lO k 1 m,add_assoc,<-s]at this;exact this lemma nD_w(a Z e:ℝ)(d:0ℝ)(a n:ℕ)(B:ℝ)(h:∀j,a<=j->jf j<=B):∑j∈Q5 a (a+n),f j<=n*B:=by have:=Xt _ f B λj I=>h j (Uy.1 I).1 (Uy.1 I).2 rwa[Nat.card_Ico,ϱ,nsmul_eq_mul]at this lemma tN3(n:ℕ)(h:0kB x[j]!≠255)(he:kB eps≠255)(hs:0sq_nonneg _) have nb:(n:ℝ)<=2^(12:Ἀ):=x8B1 n 12 hn2 have Tsb:Ts<=2^(568:Ἀ):=(tN2 (λj=>((sv x[j]!:ℝ)*2^kG x[j]!)^(2:Ἀ)) _ _ _ λj _ _=>nD_tb _).trans ((dQ7 nb (dQ1 _).2.1).trans_eq (by rw[<-AF])) obtain⟨vf,ve⟩:=nQs_spec x ((G0 (r*n+n))) (λj hj=>hX j (by rwa[hi]at hj)) n ((G0 (r*n))) _ 0 0 (by rw[hi,lo];exact Kq _ _) (by rw[hi,lo];exact V1 _ _) z0f dQ17 (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 rw[lo,hi,Ai];exact Tsb.trans (dQ2 _ _ ж)) rw[lo,hi]at ve;simp only[Ai]at ve obtain⟨qf,qr⟩:=kg2 (4503599627370496/n) ((L9 _ _).trans_lt ж) set q:ℝ:=((4503599627370496/n:ℕ):ℝ) with hq have q0:0<=q:=dQ20 _ have hq1:(n:ℝ)*q<=2^(52:Ἀ):=(tN3 n hn).1 have hq2:2^(52:Ἀ)-(n:ℝ)>>52)&&&2047;let L:=B&&&0x7FFFFFF;let t:=(1:ἆ)<<>>27 with hq have g:(0:ℝ)<(d.toNat:ℝ)*2^(27:Ἀ)*a:=mul_pos (mul_pos (M9.2 (AN ш A)) ш) l have sg:(D.toBits>>>63!=0)=false:=by by_contra h;rw[Bool.not_eq_false]at h;rw[AD h]at n;exact absurd (g.trans n) (not_lt.2 (neg_nonpos.2 Y0)) rw[AC (by rw[sg];decide)]at n B set s:ℤ:=1223-(E:ℤ) with hs have r:(2:ℝ)^(27:Ἀ)*a*2^s=2^(175:Ἀ):=by rw[hU,hs,<-AA (2:ℝ) 27,<-AK ш,<-AK ш,<-AA (2:ℝ) 175];exact congrArg _ (by simp only [nZ];ring) have m:(S0 (X:ℝ)*2^s)*(2^(27:Ἀ)*a)=Y:=by rw[Ap,mul_comm ((2:ℝ)^s),r,hY];exact mul_comm _ _ have pU:(0:ℝ)<2^(27:Ἀ)*a:=mul_pos ш l have y:(d.toNat:ℝ)kB x[j]!≠255)(he:kB eps≠255)(hs:0sq_nonneg _)) ш) (I3 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 ш have X0:0α)(h:k< m): (kK f)[k]! =f ⟨k,h⟩:=by rw[AB _ k (by simpa using h),Λ] @[inline]def SN(rows n:Ἀ)(eps:Ἃ)(x g:(Ἂ Word)):Ἆ:= rows>0&&n>0&&(O0 x)==rows*n&&(O0 g)==n&&x.all finiteWord&&g.all finiteWord&&finiteWord eps&&(!ZX eps&&ZC eps !=0) lemma fG(e n:Ἀ)(d:kF)(x g:(Ἂ Word)):SN e n d x g=mq e n d x g:=by rw[SN,mq];congr 1;rw[Q6,Y2];have:(0:ℚ)<2^((ZZ d:Ἁ)-149):=(ф);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:Ἀ)(a:kF)(x:(Ἂ Word))(r:Ἀ)(e:0gP n eps x g b (J0 i) (J0 j)) else gP n eps x g b (J0 i) (J0 j) noncomputable def nS1(x:(Ἂ Word))(i e:Ἄ)(s:Ἅ)(Dl:ἆ):Ἅ×ἆ:= if h:inEI n eps x r) let lo:=G0 (r*n);let hi:=G0 (r*n+n) if 4<=n&&n<=2048&&kB eps != 0&&kB eps != 255 then let z0:=(I0 (0:Ἀ)).toInt64.toFloat let p:=nS1 x lo hi z0 0 let n6:=I0 n let lb:=(Aq n).toUInt64 let m:=p.1*((((1:ἆ)<<<(52+lb))/n6).toInt64.toFloat*F5 ((971-lb)<<<52)) let v:=nS2 x m lo hi z0 let D:=O6 (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,(1051-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:ℝ)(l:0<=u)(p:0<=w)(k0:0<=k)(n:0<=B)(o:|t|<=B)(hA:|A|<=k*B) (m:(k^(2:Ἀ)/2+k)*u<=1/4)(j:k*w<=B/4) (d:|a-A|<=(k^(2:Ἀ)/2+k)*B*u+k*w)(e:|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 g:=mul_le_mul_of_nonneg_left m n have i:=mul_le_mul_of_nonneg_left (show |a+t|<=(k+1)*B+B/2 by linear_combination h+Ag A t+hA+o+d+g+j) l have c:=abs_sub_le r (a+t) (A+t);rw[add_sub_add_right_eq_sub]at c linear_combination c+e+d+i lemma nM_b_h1(P Q B:ℝ)(c:P<=1/4*B)(hQ:Q<=B/4)(a:0<=B):P+Q+B<=2*B:=by linear_combination c+hQ+(1/2:ℝ)*a lemma nM_b(a A t B u w k:ℝ)(i:0<=u)(c:0<=B)(h:|t|<=B)(hA:|A|<=k*B) (e:(k^(2:Ἀ)/2+k)*u<=1/4)(d:k*w<=B/4)(g:|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 g)) h).trans (((add_assoc _ _ _).trans_le (add_le_add AP (nM_b_h1 _ _ _ ((mul_right_comm _ B u).trans_le (AE e c)) d c))).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 ж have b:(mJ (kB w))≠255:=λ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:Ἅ)(d:ἆ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)->(lq d)<=254-> (lq d)<=(lq (nS1 x i e s d).2)/\(lq (nS1 x i e s d).2)<=254/\∀j,(J0 i)<=j->j<(J0 e)->(mJ (kB x[j]!))<=(lq (nS1 x i e s d).2):=by intro m;induction m with |zero=> intro i s d k l p have q:=not_lt.2 (M0.1 k) rw[nS1,dite_eq_right (λh=>q (ε.1 h))];exact⟨AP,p,λj a b=>(q (AO a b)).elim⟩ |succ m t=> intro i s d k l p have g:(J0 i)<(J0 e):=Hm (k▸m.succ_pos) rw[nS1,AT (ε.2 g)];dsimp only;rw[f6 x i] have n:=Dense.ac (ε.2 g) have r:(lq (nfe x[(J0 i)]!))=(mJ (kB x[(J0 i)]!)):=ϩ _ have mx:(lq (if drw[μ,r]at c · rw[r];exact (max_eq_right c.le).symm · exact (max_eq_left (not_lt.1 c)).symm obtain⟨o,u,v⟩:=t (i+1) (s+Dense.F.dw x[(J0 i)]!) _ (by rw[n,Q3,k,BK]) (n▸g) (mx▸max_le p (nKb _ (hX _ g))) rw[mx]at o refine⟨AZ (le_max_left ..) o,u,λj b c=>?_⟩ rcases BJ b with q|q · rw[<-q];exact AZ (le_max_right ..) o · exact v j (n▸q) c lemma nS1_ge(x:(Ἂ Word))(e:Ἄ):∀m (i:Ἄ)(s:Ἅ)(d:ἆ),(J0 e)-(J0 i)=m->(J0 i)<=(J0 e)-> (lq d)<=(lq (nS1 x i e s d).2)/\∀j,(J0 i)<=j->j<(J0 e)->(mJ (kB x[j]!))<=(lq (nS1 x i e s d).2):=by intro m;induction m with |zero=> intro i s d g k have q:=not_lt.2 (M0.1 g) rw[nS1,dite_eq_right (λh=>q (ε.1 h))];exact⟨AP,λj a b=>(q (AO a b)).elim⟩ |succ m r=> intro i s d g k have n:(J0 i)<(J0 e):=Hm (g▸m.succ_pos) rw[nS1,AT (ε.2 n)];dsimp only;rw[f6 x i] have l:=Dense.ac (ε.2 n) have p:(lq (nfe x[(J0 i)]!))=(mJ (kB x[(J0 i)]!)):=ϩ _ have mx:(lq (if drw[μ,p]at c · rw[p];exact (max_eq_right c.le).symm · exact (max_eq_left (not_lt.1 c)).symm obtain⟨o,t⟩:=r (i+1) (s+Dense.F.dw x[(J0 i)]!) _ (by rw[l,Q3,g,BK]) (l▸n) rw[mx]at o refine⟨AZ (le_max_left ..) o,λj b c=>?_⟩ rcases BJ b with q|q · rw[<-q];exact AZ (le_max_right ..) o · exact t j (l▸q) c lemma nS1_s(x:(Ἂ Word))(e:Ἄ)(hX:∀j,j<(J0 e)->kB x[j]!≠255)(B:ℝ)(C:2^(23:Ἀ)<=B)(J:B<=2^(300:Ἀ)):∀m (i:Ἄ)(s:Ἅ)(d:ἆ)(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 d).1/\|Dense.F.rv (nS1 x i e s d).1-(A+∑j∈Q5 (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 G:(0:ℝ)<=B:=AZ ш C intro m;induction m with |zero=> intro i s d A k r g u hA p v t have q:(J0 i)=(J0 e):=N2 g (M0.1 r) rw[nS1,dite_eq_right (by rw[ε,q];exact K4 _),q,Ky,C8,Av,ϑ];exact⟨u,p⟩ |succ m I=> intro i s d A k r g u hA p v t have c:(J0 i)<(J0 e):=N1 r rw[nS1,AT (ε.2 c)];dsimp only;rw[f6 x i] obtain⟨tf,z⟩:=Dense.F.cI x[(J0 i)]! (hX _ c) have H:=W8 c (λj=>(sv x[j]!:ℝ)*2^kG x[j]!) have o:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 c) have y:=t _ AP c have l:(k:ℝ)<=2^(12:Ἀ):=by exact_mod_cast (show k<=2^(12:Ἀ) from (V1 _ _).trans v) have k0:(0:ℝ)<=k:=I3 k have F:((k:ℝ)^(2:Ἀ)/2+k)*(1/2^(53:Ἀ))<=1/4:=by have a:(k:ℝ)^(2:Ἀ)<=2^(12:Ἀ)*2^(12:Ἀ):=by rw[sq];exact mul_le_mul l l k0 ш have n:((k:ℝ)^(2:Ἀ)/2+k)<=2^(23:Ἀ)+2^(12:Ἀ):=by linear_combination a/2+l exact (AE n (nN 53)).trans ш have D:(k:ℝ)*(1/2^(1075:Ἀ))<=B/4:=by have a:(k:ℝ)*(1/2^(1075:Ἀ))<=2^(12:Ἀ)*(1/2^(1075:Ἀ)):=AE l (nN _) have n:(2:ℝ)^(12:Ἀ)*(1/2^(1075:Ἀ))<=1:=nP 12 1075 ж exact a.trans (n.trans (by linear_combination C/4)) have ab:=nM_b (Dense.F.rv s) A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) G y hA F D p have bd:|Dense.F.rv s+Dense.F.rv (Dense.F.dw x[(J0 i)]!)|<=(2:ℝ)^(971:ℤ):=by rw[z,zpow_ofNat];refine ab.trans ((mul_le_mul_of_nonneg_left J (by linear_combination k0)).trans ?_) have a:((k:ℝ)+2)*2^(300:Ἀ)<=2^(13:Ἀ)*2^(300:Ἀ):=AE (by linear_combination l) ф exact a.trans (by rw[<-AF];exact AU one_le_two ж) obtain⟨af,ae⟩:=NF.fA _ _ u tf bd rw[z]at ae have h:=nM_e _ _ A _ B (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) k (nN _) (nN _) k0 G y hA F D p (ae.trans_eq (by rw[one_div_mul_eq_div])) have w:|A+(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!|<=((k+1:ℕ):ℝ)*B:=by rw[X6,add_one_mul];exact (Ag _ _).trans (add_le_add hA y) have:=I (i+1) _ (if dt j (M4 (o.symm.le.trans a)) n) rw[o,pA k 1 m,Τ 1 m,add_assoc,<-H]at this;exact this lemma nMn(s Q a m n B u w h:ℝ)(n4:4<=n)(c:0<=B)(g:0<=u)(H:0<=w)(hQ:|Q|<=B) (y:|s-n*Q|<=(n^(2:Ἀ)/2+n)*B*u+n*w)(k:0<=a)(d:n*a<=1)(i:1-4*u<=n*a) (G:|m-s*a|<=u*|s*a|+w)(o:(n/2+5)*u<=1/8)(l:w<=B*u/8)(D:n+5<=h): |m-Q|<=h*B*u:=by have r:Q-s*a=Q*(1-n*a)+(n*Q-s)*a:=by ring have n0:(0:ℝ)<=n:=zero_le_four.trans n4 have p:(0:ℝ)<=1-n*a:=sub_nonneg.2 d have t1:|Q*(1-n*a)|<=B*(4*u):=by rw[Ae,Ad p];exact mul_le_mul hQ (sub_le_comm.1 i) p c have x:|(n*Q-s)*a|<=(n/2+1)*B*u+w:=by rw[Ae,Aw,Ad k] 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) c) g) H exact (AE (y.trans_eq e) k).trans ((mul_right_comm _ _ _).trans_le (mul_le_of_le_one_left p0 d)) have q:|s*a-Q|<=B*(4*u)+((n/2+1)*B*u+w):=by rw[Aw,r];exact (Ag _ _).trans (add_le_add t1 x) have I:=AE o c have z:u<=1:=(le_mul_of_one_le_left g (le_add_of_nonneg_of_le (div_nonneg n0 zero_le_two) (by norm_num:(1:ℝ)<=5))).trans (o.trans ш) have t:B*u<=B:=mul_le_of_le_one_right c z have v:B*(4*u)+((n/2+1)*B*u+w)<=B/4:=by linear_combination I+l+(1/8)*t have sr:|s*a|<=B+B/4:=(sub_le_iff_le_add'.1 (AY (s*a) Q)).trans (add_le_add hQ (q.trans v)) have F:=(abs_sub_le m (s*a) Q).trans (add_le_add (G.trans (add_le_add (mul_le_mul_of_nonneg_left sr g) AP)) q) have A:(n+5)*B*u<=h*B*u:=AE (AE D c) g have j:=Af c g have C:=AE n4 j exact F.trans (by linear_combination A+2*l+(1/2)*C+(1/2)*j) lemma nR1(n:Ἀ)(h:1<=n)(e: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 g:=J8 h have d:Aq n<=11:=Z0 ((m9 g).2 (AO e ж)) refine⟨?_,ϰ g,ϙ,d⟩ have a:(lq (I0 n))=n:=Α (AO e ж) have c:=J1 d 52 have b:(lq (52+(Aq n).toUInt64))=52+Aq n:=by rw[η];simp only[Ϣ,mY,J6] rw[γ (AO d ж),γ (show 52<2^(64:Ἀ) by decide),γ (AO c ж)] rw[ml,a];simp only[ψ,b,pS] rw[γ (J3 c),na,γ (lu Vz (J3 c))] lemma nMeq(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(hn:0z/n) (ϔ rfl λj _=>h2 _) section open NF Dense.F NE lemma nPwF(f:ἆ)(c:1<=(lq f))(a:(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:Ἀ):=ι _ a have q:(lq (f<<<52))=(lq f)*2^(52:Ἀ):=by rw[ψ];simp only[kA,ο,kH];exact γ (m.trans_lt ж) have d:(lq ((f<<<52)>>>52))=(lq f):=by rw[ν,q];simp only[β,kA,kH];exact Wj _ (϶ _) refine⟨?_,?_,?_⟩ · rw[Ε,d];simp only[kA] rw[show (2047:Nat)=2^(11:Ἀ)-1 from rfl,ζ];exact γ (a.trans_lt ж) · have:(lq ((f<<<52)>>>63))=0:=by rw[ν,q];simp only[β,kA,kH] exact ώ (m.trans_lt ж) 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:ἆ)(h:1<=(lq f))(a:(lq f)<=2046):fv (F5 (f<<<52))/\rv (F5 (f<<<52))=(2:ℝ)^(((lq f):ℤ)-1023):=by obtain⟨e,i,j⟩:=nPwF f h a have d:=K7 (J3 a) have K:kI (F5 (f<<<52)).toModel=Vy kC false (lq f) 0:=by rw[s5ofb _ λg=>d (e.symm.trans (congrArg lq g)),s5fld,e,i,j] have c:(lq f)<2^kC.expWidth:=H4 (J3 a) have b2:0<2^kC.fracWidth:=϶ _ have fin:Vw (Vy kC false (lq f) 0)=true:=by rw[Zb kC _ _ _ c b2];exact AM.2 d refine⟨by unfold fv;rw[K];exact fin,?_⟩ unfold rv;rw[K,BR,Jl _ _ _ _ c b2 fin,AC (J8 h)] simp only[show kC.fracWidth=52 from rfl,show kC.exponentBias=1023 from rfl,Zz] rw[bJ];simp only[υ,ἂ,ϑ] exact s5pw 52 _ end lemma nZb(z k:ℕ)(h:(z:ℝ)<=2^(52:Ἀ)):|((z:ℤ):ℝ)*(2:ℝ)^(-(k:ℤ))|<=(2:ℝ)^(971:ℤ):=by rw[X4,zpow_neg,AA,zpow_ofNat] have p:(0:ℝ)<2^k:=pow_pos two_pos k rw[Ad (Af (I3 z) (inv_nonneg.2 p.le))] exact (mul_le_of_le_one_right (I3 z) (inv_le_one_of_one_le₀ (one_le_pow₀ one_le_two))).trans (h.trans (AU one_le_two ш)) lemma nRiF(n:Ἀ)(m:1<=n)(i:n<=2048): Dense.F.fv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*F5 ((971-(Aq n).toUInt64)<<<52))/\ Dense.F.rv ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*F5 ((971-(Aq n).toUInt64)<<<52))=((2^(52+Aq n)/n:ℕ):ℝ)/2^(52+Aq n):=by obtain⟨a,j,o,c⟩:=nR1 n m i have e:2^(52+Aq n)/n<=2^(52:Ἀ):=by have:2^(52+Aq n)/n<=2^(52+Aq n)/2^(Aq n):=pq j (϶ _) rw[AF,Wj _ (϶ _)]at this;rwa[AF] have d:2^(52+Aq n)/n<2^(53:Ἀ):=e.trans_lt ж have l:((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n=I0 (2^(52+Aq n)/n):=by apply ξ.1;rw[a];simp only[Ϣ,J6];exact (γ (d.trans ж)).symm obtain⟨h,k⟩:=kg2 (2^(52+Aq n)/n) d have pt:(lq (971-(Aq n).toUInt64))=971-Aq n:=by have b:(lq (Aq n).toUInt64)=Aq n:=by simp only[Ϣ,J6];exact γ (c.trans_lt ж) rw[χ _ _ (by rw[θ,b];simp only[kA];exact c.trans ж),b];simp only[kA] obtain⟨pf,pr⟩:=nPw (971-(Aq n).toUInt64) (by rw[pt];exact Z4 ((J1 c 1).trans ж)) (by rw[pt];exact (I2 _ _).trans ж) rw[pt]at pr rw[l] have ez:((((971-Aq n):ℕ):ℤ)-1023)=-(((52+Aq n):ℕ):ℤ):=by rw[pO (c.trans ж),Y4];ring have g:((2^(52+Aq n)/n:ℕ):ℝ)<=2^(52:Ἀ):=by have:=(F4 (α:=ℝ)).2 e;rwa[W4,nZ]at this have q:=Dense.F.aE _ _ h pf ((2^(52+Aq n)/n:ℕ):ℤ) (-(((52+Aq n):ℕ):ℤ)) (by rw[k,pr,ez];push_cast;rfl) d (Int.neg_le_neg (B3.2 ((J1 c 52).trans ж))) (nZb _ _ g) refine⟨q.1,?_⟩;rw[q.2,zpow_neg,AA,X4,div_eq_mul_inv] lemma nRb_h1(nR a 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*F5 ((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*F5 ((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 open Dense.F NF in have d:1<=n:=N0 (H0 1 3) q have lo:=Conv.aa _ (C0 (V1 _ _) V) have hi:=Conv.aa _ V have u:∀j,j<(J0 (G0 (r*n+n)))->kB x[j]!≠255:=λj h=>hX j (by rwa[hi]at h) obtain⟨F,K⟩:=kg2 0 (϶ _) have E:=(congrArg₂ (·-·) hi lo).trans (ϱ _ _) have W:=lo.trans_le ((V1 _ _).trans_eq hi.symm) obtain⟨-,v,o⟩:=nS1_dl x _ u n (G0 (r*n)) (I0 0).toInt64.toFloat 0 E W (by simp only [ϋ,zero_le]) rw[lo,hi]at o obtain⟨M,g⟩:=nRiF n d z generalize ((((1:ἆ)<<<(52+(Aq n).toUInt64))/I0 n).toInt64.toFloat*F5 ((971-(Aq n).toUInt64)<<<52))=Z at M g ⊢ obtain⟨-,-,l2,-⟩:=nR1 n d z have Y:=λB m y p=>nS1_s x _ u B m y n (G0 (r*n)) (I0 0).toInt64.toFloat 0 0 0 E W F (by rw[A5,J9,zero_mul]) (by rw[K,J9,sub_self,A5,zero_pow AL,zero_div,Av,zero_mul,zero_mul,zero_mul,Av]) ((Κ n).trans_le (z.trans ж)) p generalize nS1 x (G0 (r*n)) (G0 (r*n+n)) (I0 0).toInt64.toFloat 0=P at v o Y ⊢ generalize lq P.2=Dl at v o ⊢ have p:∀j,r*n<=j->j|(sv x[j]!:ℝ)*2^kG x[j]!|<=2^(Dl+23):=by intro j e i;obtain⟨-,cr⟩:=cI x[j]! (hX j i);rw[<-cr] exact (nXb _ (hX j i)).le.trans (dQ2 _ _ (L1 (o j e i) 23)) have m:=dQ2 _ _ (H0 23 Dl) have y:(2:ℝ)^(Dl+23)<=2^(300:Ἀ):=dQ2 _ _ (N0 (L1 v 23) (G1 rfl)) have O:(0:ℝ)<=2^(Dl+23):=(dQ1 _).2.1 obtain⟨sf,w⟩:=Y _ m y (λj e i=>p j (by rwa[lo]at e) (by rwa[hi]at i)) rw[lo,hi,Ai,Κ]at w obtain⟨S,A⟩:∃S,∑j∈Q5 (r*n) (r*n+n),(sv x[j]!:ℝ)*2^kG x[j]! = S:=⟨_,rfl⟩ rw[A]at w have nR:(0:ℝ)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∈Q5 (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∈Q5 (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 open Dense.F NF in have I:(0:ℝ)<=(8*Y+3)*(1/2^(1075:Ἀ)):=dQ6 (dQ19 (dQ6 (P5 8) Y0) zero_le_three) (nN _) have q1:(1:ℝ)<=2^(302:Ἀ):=(dQ1 _).2.2.1 have e8:(8:ℝ)<=2^(3:Ἀ):=x8B1 8 3 ж have Y5:8*Y<=(2:ℝ)^(305:Ἀ):=(dQ9 e8 Y1 Y0 (dQ1 _).2.1).trans_eq (dQ30 _ _).symm have T5:(3:ℝ)<=2^(305:Ἀ):=(x8B5 3 8 ж:(3:ℝ)<=8).trans (e8.trans (dQ2 _ _ ж)) have O:(8*Y+3)*(1/2^(1075:Ἀ))<=(2:ℝ)^(306:Ἀ)*(1/2^(1075:Ἀ)):=dQ7 ((dQ8 Y5 T5).trans_eq ((mul_two _).symm.trans (A4 _ _).symm)) (nN _) have w1:(1:ℝ)/2^(1075:Ἀ)<=(8*Y+3)*(1/2^(1075:Ἀ)):=dQ25 (nN _) ((by norm_num:(1:ℝ)<=3).trans (le_add_of_nonneg_left (dQ6 (P5 8) Y0))) have S:Y*Y<=2^(604:Ἀ):=(dQ9 Y1 Y1 Y0 (dQ1 _).2.1).trans_eq (dQ30 _ _).symm have s:0<=Y*Y:=dQ6 Y0 Y0 have l:=nN 53 have L:=dQ3 53 have w0:=nN 1075 have K:=dQ3 1075 intro M;induction M with |zero=> intro i v A k r g u A0 hA o z t have q:(J0 i)=(J0 e):=N2 g (M0.1 r) rw[nS2,dite_eq_right (by rw[ε,q];exact K4 _),q,Ky,C8,Av,ϑ];exact⟨u,o⟩ |succ M ih=> intro i v A k r g u A0 hA o z t have d:(J0 i)<(J0 e):=N1 r rw[nS2,AT (ε.2 d)];dsimp only;rw[f6 x i] obtain⟨tf,G⟩:=cI x[(J0 i)]! (hX _ d) have hs:=W8 d (λj=>((sv x[j]!:ℝ)*2^kG x[j]!-rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-rv m)) have n:(J0 (i+1))=(J0 i)+1:=Dense.ac (ε.2 d) have c:=t _ AP d have X:(k:ℝ)<=2^(12:Ἀ):=(F4.2 ((V1 _ _).trans z)).trans_eq (x8B0 _) have k0:=dQ20 k obtain⟨df,de⟩:=fSb _ m tf hm (by rw[G,zpow_ofNat];exact c.trans (Y1.trans (dQ2 _ _ ж))) rw[G]at de generalize hyd:(sv x[(J0 i)]!:ℝ)*2^kG x[(J0 i)]!-rv m=y at de c generalize dw x[(J0 i)]!-m=dF at df de ⊢ have hd:|rv dF-y|<=(1/2^(53:Ἀ))*|y|+1/2^(1075:Ἀ):=by rw[dQ28];exact de have uy:(1/2^(53:Ἀ))*|y|<=|y|:=dQ24 (dQ12 _) L have aD:|rv dF|<=2^(304:Ἀ):=by have T:=c.trans Y1 rw[A4,A4,mul_two,mul_two] exact (sub_le_iff_le_add.1 (dQ14 _ y)).trans (dQ8 (hd.trans (dQ8 (uy.trans T) (K.trans q1))) (T.trans (le_add_of_nonneg_left (dQ1 _).2.1))) have F:|rv dF*rv dF|<=(2:ℝ)^(971:Ἁ):=by rw[dQ15,zpow_ofNat];exact (dQ9 aD aD (dQ12 _) (dQ1 _).2.1).trans (by rw[<-AF];exact dQ2 _ _ ж) obtain⟨D,w⟩:=NF.fM dF dF df df F have N:y*y<=Y*Y:=by rw[<-abs_mul_abs_self y];exact dQ9 c c (dQ12 _) Y0 have p:=dQ23 y have V:=nV_t y (rv dF) (rv (dF*dF)) (1/2^(53:Ἀ)) (1/2^(1075:Ἀ)) Y l L w0 K c hd (by rw[dQ28];exact w) have a:10*(k:ℝ)<=2^(16:Ἀ):=(dQ7 (x8B1 10 4 ж:(10:ℝ)<=2^(4:Ἀ)) k0).trans ((dQ0 X (dQ1 _).2.1).trans_eq (dQ30 _ _).symm) have kW:10*(k:ℝ)*((8*Y+3)*(1/2^(1075:Ἀ)))<=1:=by have:=dQ9 a O I (dQ1 _).2.1 exact this.trans (by rw[<-Ap,<-AF];exact nP _ _ ж) have ku:=(dQ7 a l).trans (nP 16 53 ж) have C:=dQ24 A0 ku have U:A<=2^(616:Ἀ):=hA.trans ((dQ9 X S s (dQ1 _).2.1).trans_eq (dQ30 _ _).symm) have Y6:=dQ2 604 616 ж have J:(1:ℝ)<=2^(616:Ἀ):=(dQ1 _).2.2.1 have av:|rv v|<=A+(10*k*(1/2^(53:Ἀ))*A+10*k*((8*Y+3)*(1/2^(1075:Ἀ)))):=by have:=dQ14 (rv v) A;rw[dQ16 A0]at this;exact sub_le_iff_le_add'.mp (this.trans o) have u7:=dQ24 p ((dQ7 (x8B1 7 3 ж:(7:ℝ)<=2^(3:Ἀ)) l).trans (nP 3 53 ж)) have W2:=O.trans (nP _ _ ж) have ad:|rv (dF*dF)|<=y*y+(7*(1/2^(53:Ἀ))*(y*y)+(8*Y+3)*(1/2^(1075:Ἀ))):=by have:=dQ14 (rv (dF*dF)) (y*y);rw[dQ16 p]at this;exact sub_le_iff_le_add'.mp (this.trans V) have aS:|rv v+rv (dF*dF)|<=(2:ℝ)^(971:Ἁ):=by rw[zpow_ofNat] have BB:=nS2_s_h1 _ (dQ1 616).2.1 have H:=N.trans (S.trans Y6) refine (dQ13 _ _).trans ((dQ8 ((av.trans (dQ8 U (dQ8 (C.trans U) (kW.trans J)))).trans BB) ((ad.trans (dQ8 H (dQ8 (u7.trans H) (W2.trans J)))).trans BB)).trans ?_) rw[<-mul_two,<-mul_two,<-mul_two,<-A4,<-A4,<-A4];exact dQ2 _ _ ж obtain⟨rf,re⟩:=fA v (dF*dF) u D aS have H2:|rv (v+dF*dF)-(rv v+rv (dF*dF))|<=(1/2^(53:Ἀ))*|rv v+rv (dF*dF)|+(8*Y+3)*(1/2^(1075:Ἀ)):=by rw[dQ28];exact re.trans (dQ8 dQ17 w1) have h:=nV_e _ _ A (y*y) _ (1/2^(53:Ἀ)) ((8*Y+3)*(1/2^(1075:Ἀ))) k l I A0 p k0 ((dQ7 ((mul_add 10 (k:ℝ) 1).trans_le ((dQ8 a ((mul_one _).trans_le (x8B1 10 16 ж):(10:ℝ)*1<=2^(16:Ἀ))).trans_eq ((mul_two _).symm.trans (A4 _ _).symm))) l).trans (nP 17 53 ж)) o V H2 have B:A+y*y<=((k+1:ℕ):ℝ)*(Y*Y):=by rw[X6,add_one_mul];exact dQ8 hA N have:=ih (i+1) (v+dF*dF) (A+y*y) (k+1) (by rw[n,Q3,r,BK]) (n.le.trans (l7 d)) rf (dQ19 A0 p) B (by rw[X6];exact h) (by rw[pA,Τ 1 M];exact z) (λj h1 h2=>t j (M4 (n.symm.le.trans h1)) h2) rw[<-hyd,n,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,Kh,nsmul_eq_mul,←n8,←Yg,nF,h,Kh,nsmul_eq_mul,sub_self,mul_zero,zero_mul,sub_zero,pow_two (mr-M)] lemma nL_rel(g c a cu η:ℝ)(h: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:Ἀ)(d:1<=n)(c:n<=2048):((1:ἆ)<<<52)/I0 n=I0 (2^(52:Ἀ)/n):=by apply ξ.1 have a:(lq (I0 n))=n:=by simp only[Ϣ];exact γ щ have b:2^(52:Ἀ)/n<2^(64:Ἀ):=AO (L9 _ _) ш rw[ml,a];simp only[Ϣ,J6,γ 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 c:=(nL_float_h5 k).1.le have a:8*Y<=2^(k+3):=(mul_le_mul_of_nonneg_left h (P5 8)).trans ((mul_comm _ _).trans_le ((mul_le_mul_of_nonneg_left (by norm_num:(8:ℝ)<=2^3) c).trans_eq (AF (2:ℝ) k 3).symm)) have b:(3:ℝ)<=2^(k+3):=(by norm_num:(3:ℝ)<=2^3).trans (AU one_le_two (H0 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)(c:|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 c hQ))) lemma nL_float_h1(c a N d E Z K:ℝ)(h:N≠0)(g:c=a+N*(d*d))(e:a*K/N+E=Z):c*K/N+E=Z+d*d*K:=by rw[<-e,g,add_mul,add_div,Ap N,mul_div_cancel_left₀ _ h];exact add_right_comm _ _ _ lemma nL_float_h2(x T R e:ℝ)(k:ℕ)(h:|x-T|<=R)(hR:R<=T+e)(g:e<=1/16)(d:T<=2^k):-e<=x/\|x|<=2^(k+2):=by obtain⟨j,i⟩:=abs_sub_le_iff.1 h have c:=(nL_float_h5 k).1.le have eP:e<=2^k:=g.trans ((by norm_num:(1:ℝ)/16<=1).trans (nL_float_h5 k).2) have a:(2:ℝ)^k<=2^k+2^k:=le_add_of_nonneg_right c have lo:-e<=x:=(sub_le_sub_iff_left T).1 ((i.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 (a.trans (le_add_of_nonneg_right (add_nonneg c c))))).trans lo,(sub_le_iff_le_add.1 j).trans (add_le_add (hR.trans (add_le_add d eP)) (d.trans a))⟩⟩ lemma nL_float_h3(P x q e c Q:ℝ)(h:|P-x*q|<=|x*q|/2^(53:Ἀ)+c)(n:-e<=x)(i:0<=q)(hq:q<=Q)(g:0<=e)(j:e*Q<=1/16)(m:c<=1/16):-(1/4)<=P:=by have l:-e*q<=x*q:=AE n i have d:-(1/16)<=x*q:=(neg_le_neg ((mul_le_mul_of_nonneg_left hq g).trans j)).trans ((neg_mul e q).symm.le.trans l) 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*d,le_add_of_nonneg_right ш⟩ 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) m) _).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)(d:1/2<=S)(e:c<=1/16):0<=W:=by have g:|S|=S:=Ad (one_half_pos.le.trans d) have u:|S|/2^(53:Ἀ)<=|S|/2:=div_le_div_of_nonneg_left (Aa S) two_pos (le_self_pow₀ one_le_two ш) rw[g]at h u have a:c<=S/2:=e.trans ((by norm_num:(1:ℝ)/16<=1/2/2).trans (div_le_div_of_nonneg_right d zero_le_two)) exact (sub_nonneg.2 ((add_le_add u a).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:=λj h=>hX j (by rwa[hi]at h) clear hX obtain⟨z0f,z0r⟩:=kg2 0 (϶ _) have lL:Aq (n+4)<=11:=Z0 ((m9 (C7 _)).2 (C0 (L1 hn 4) ж)) have dB:(2:ℝ)^(((Aq (n+4)+1:ℕ):ℤ)+(lq P.2:ℤ)-30)<=2^(lq P.2+23):=by rw[<-AA];exact dQ5 _ _ (by clear * - lL;omega) obtain⟨Y,hY⟩:∃Y:ℝ,Y=2^(lq P.2+25):=⟨_,rfl⟩ have Y0:0<=Y:=(dQ1 _).2.1.trans_eq hY.symm have Y1:Y<=2^(279:Ἀ):=hY.trans_le (dQ2 _ _ (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]!-rv m|<=Y:= λj h1 h2=>(nL_float_h8 _ _ _ _ (hB j (lo.symm.trans_le h1) (h2.trans_eq hi)) hQ t4).trans_eq hY.symm obtain⟨vf,ve⟩:=nS2_s x m _ hX' mf Y Y0 (Y1.trans (dQ2 _ _ ж)) n (G0 (r*n)) _ 0 0 (by rw[hi,lo];exact ϱ _ _) (by rw[hi,lo];exact V1 _ _) z0f dQ17 (dQ6 (dQ20 _) (dQ23 _)) (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 ж)) 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 generalize hTm:∑j∈Q5 (r*n) (r*n+n),((sv x[j]!:ℝ)*2^kG x[j]!-rv m)*((sv x[j]!:ℝ)*2^kG x[j]!-rv m)=Tm at ve obtain⟨Tt,hTt⟩:∃t:ℝ,t=∑j∈Q5 (r*n) (r*n+n),((sv x[j]!:ℝ)*2^kG x[j]!-((no n x r:ℚ):ℝ)*2^(149:Ἀ))^(2:Ἀ):=⟨_,rfl⟩ generalize hδ:rv m-((no n x r:ℚ):ℝ)*2^(149:Ἀ)=δ at mE have nR:(0:ℝ)sq_nonneg _)).trans_eq hTt.symm have Tm0:0<=Tm:=(H7 (λ_ _=>dQ23 _)).trans_eq hTm have Tmb:Tm<=n*(Y*Y):=hTm.symm.trans_le (tN2 _ _ _ _ λj a b=>by have:=hYj j (lo.trans_le a) (b.trans_eq hi.symm);rw[<-abs_mul_abs_self];exact dQ9 this this (dQ12 _) Y0) have YY:Y*Y<=2^(558:Ἀ):=(dQ9 Y1 Y1 Y0 (dQ1 _).2.1).trans_eq (dQ30 _ _).symm have Tmb2:Tm<=2^(570:Ἀ):=Tmb.trans ((dQ9 (n11.trans (dQ2 11 12 ж)) YY (dQ23 Y) (dQ1 _).2.1).trans_eq (dQ30 _ _).symm) have Wb:(8*Y+3)*(1/2^(1075:Ἀ):ℝ)<=1/2^(700:Ἀ):=by have q3:(8*Y+3:ℝ)<=2^(375:Ἀ):=(nL_float_h7 _ _ Y1).trans (dQ2 _ _ ж) exact (dQ7 q3 (nN _)).trans (nP2 375 1075 700 ж) have nW:10*((n:ℕ):ℝ)*((8*Y+3)*(1/2^(1075:Ἀ)))<=10*n*(1/2^(700:Ἀ)):=dQ0 Wb (dQ6 (P5 _) nR.le) have nu1:=(dQ7 n15 (nN 53)).trans (nP 15 53 ж) have e15:=(dQ7 n15 (nN 700)).trans (nP2 15 700 600 ж) have i16:(1:ℝ)/2^(4:Ἀ)<=1/16:=by norm_num have w6:=(nI 4 600 ж).trans i16 obtain⟨vlo,vb⟩:=nL_float_h2 _ _ _ _ _ ve (dQ8 (dQ24 Tm0 nu1) (nW.trans e15)) w6 Tmb2 rw[nQ52 n n0 hn]at hD obtain⟨qf,qr⟩:=kg2 (2^(52:Ἀ)/n) ((L9 _ _).trans_lt (Vu ж)) have q0:0<=((2^(52:Ἀ)/n:ℕ):ℝ):=dQ20 _ obtain⟨hq1,hq2⟩:=tN3 n n0 generalize hq:((2^(52:Ἀ)/n:ℕ):ℝ)=q at qr q0 hq1 hq2 have qb:|q|<=2^(52:Ἀ):=(dQ16 q0).trans_le ((dQ25 q0 n1).trans hq1) obtain⟨pf,pe,wf,we,hEp1⟩:=tN1 eps he hs _ _ _ vf qf qr _ vb qb ж ж ж generalize hP':v*(I0 (2^(52:Ἀ)/n)).toInt64.toFloat=P' at pf pe wf we hD generalize hEp:(sv eps:ℝ)*2^kG eps*2^(201:Ἀ)=Ep at we hEp1 generalize hW':P'+dw eps*nS201=W at wf we hD have w75:=nI 700 1075 ж have w70:=nI 600 700 ж have w60:(1:ℝ)/2^(600:Ἀ)*2^(52:Ἀ)<=1/16:=by rw[mul_comm];exact (nP2 52 600 548 ж).trans ((nI 4 548 ж).trans i16) have w0:=w75.trans (w70.trans w6) have Plo:-(1/4)<=rv P':=nL_float_h3 _ _ _ _ _ _ pe vlo q0 ((le_abs_self q).trans qb) (nN 600) w60 w0 have Wl:0<=rv W:=nL_float_h4 _ _ _ we ((by norm_num:(1/2:ℝ)<=-(1/4)+1).trans (dQ8 Plo hEp1)) w0 obtain⟨df,dr⟩:=fS W wf Wl rw[<-hD]at df dr refine⟨df,d2,δ,mE,?_⟩ have h4:|rv D-S0 (rv W)|<=(1/2^(53:Ἀ))*S0 (rv W)+1/2^(700:Ἀ):=by rw[dr];have:=jy (S0 (rv W));rw[dQ16 (Xx _)]at this;exact this.trans (dQ8 (dQ28 _ _).ge w75) have hu2:(2:ℝ)^(52:Ἀ)*(1/2^(53:Ἀ))*2=1:=x8B2 have n15b:12*(n:ℝ)<=2^(15:Ἀ):=(dQ7 (x8B1 12 4 ж:(12:ℝ)<=2^(4:Ἀ)) nR.le).trans ((dQ0 n11 (dQ1 _).2.1).trans_eq (dQ30 _ _).symm) have hNu:(12*(n:ℝ)+8)*(1/2^(53:Ἀ))<=1/2^(30:Ἀ):=(dQ7 ((dQ8 n15b (x8B1 8 15 ж:(8:ℝ)<=2^(15:Ἀ))).trans_eq ((mul_two _).symm.trans (A4 _ _).symm):12*(n:ℝ)+8<=2^(16:Ἀ)) (nN 53)).trans (nP2 16 53 30 ж) have ch:=nD_chainK Tm Ep n q (rv v) (rv P') (rv W) (rv D) (1/2^(53:Ἀ)) (1/2^(700:Ἀ)) (10*n) (12*n) (one_div_pos.2 (dQ1 _).1) (nN _) hNu (nP2 60 700 53 (by decide)) n1 Tm0 hEp1 hq1 hq2 q0 hu2 (dQ6 (P5 _) nR.le) (dQ7 (x8B5 10 16 (by decide)) nR.le) (by ring) (ve.trans (dQ8 dQ17 nW)) (pe.trans (dQ8 (dQ28 _ _).ge w75)) (we.trans (dQ8 (dQ28 _ _).ge w75)) Wl h4 have hZ:=nXHm n x r eps n0 rw[<-hTt,hEp]at hZ generalize hZt:2^(350:Ἀ)*((XH n x r (no n x r)+ZA eps:ℚ):ℝ)=Zt at hZ ⊢ have Zt0:0(dQ1 m).1 have i:0<2^(350:Ἀ)*X:=(p2 _).trans_le l have M:0kB x[j]!≠255)(t:kB a≠255)(h:kB a≠0)(k:0sq_nonneg _) (pow_nonneg zero_le_two _)) (I3 _)) (nEp a h k)) rfl g exact nQ_tail D df _ (Rat.cast_pos.1 B) _ i d _ _ k0 A AP z w g end section open Dense.F 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^(52:Ἀ):=by obtain⟨of,o1⟩:=kg2 1 ж obtain⟨df,-⟩:=cI dW hd.2.1 have D:=nDb dW hd have U:=nXb dW hd.2.1 have p:(0:ℝ)rfl lemma nSv(w:kF)(h:0kB x[j]!≠255)(hs:0P6 (ε.mp h) a lemma nOq{a t n:ℕ}(c:a+n<2^(32:Ἀ))(h:tἌ->Ἄ->Ἃ)(s:n)(g:m->Ἄ->Ἄ->Ἃ)(d:m)(lo e:Ἄ)(h:∀i j,f s i j=g d i j):∀k (i:Ἄ)(a:(Ἂ Word)),(J0 e)-(J0 i)=k->Yq f s lo i e a=Yq g d lo i e a:=by intro k;induction k with |zero=>intro i a c;rw[Yq.eq_def f s,Yq.eq_def g d,dite_eq_right (nO1 c),dite_eq_right (nO1 c)] |succ k p=>intro i a c;obtain⟨o,l,-⟩:=nOs c;rw[Yq.eq_def f s,Yq.eq_def g d,AT (ε.mpr o),AT (ε.mpr o),h];exact p _ _ l lemma nH1{a t n:Ἄ}{s:ℕ}(c:(J0 t)<(J0 n))(d:(J0 a)+(J0 n)<2^(32:Ἀ))(e:(J0 a)+(J0 n)<=s):(J0 (a+t))Ἅ)(th:Thunk NR.fH):nLS:= let n6:=I0 n let lb:=(Aq n).toUInt64 let m:=s*((((1:ἆ)<<<(52+lb))/n6).toInt64.toFloat*F5 ((971-lb)<<<52)) let v:=vf m let D:=O6 (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,(1051-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 a x r))):=by unfold nLR;rw[AD h];rfl @[noinline]def gM0(n:Ἀ)(x:(Ἂ Word))(r:Ἀ)(w:Ἃ):Ἀ×Ἀ×Ἆ×Ἀ×Ἀ×Ἃ:= let lo:=r*n let u:=cS x (G0 lo) (G0 (lo+n)) 255 let st:=cF x u (G0 lo) (G0 (lo+n)) 0 0 0 0 0 0 0 0 let S:=Y0 st.P st.N let k:=Q2 (max st.P st.N)-30 ((lq u),k,decide (st.P>>k,S&&&(VO 1 k-1),w) lemma gM0_e(n:Ἀ)(a:Ἃ)(x:(Ἂ Word))(r:Ἀ):gM0 n x r (gM n a x r).2.2.2.2.2=gM n a x r:=rfl lemma nLR_dW(n:Ἀ)(a:kF)(x:(Ἂ Word))(r:Ἀ)(g: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 a d t n l i h s g).a)=(kS a):=by intro k;induction k with |zero=> intro t a h s g e;rw[nDR.eq_def,dite_eq_right (nO1 e)];exact Dense.F.uZ .. |succ k j=> intro t a h s g e;obtain⟨m,c,-⟩:=nOs e rw[nDR.eq_def,AT (ε.mpr m)];dsimp only;rw[j _ _ _ _ _ c,Dense.F.uZ] def nVR(Xr:ἀ)(m:Ἅ)(t n:Ἄ)(hr:(J0 n)<=(kS Xr))(v:Ἅ):Ἅ:= if h:t>>1)+0x10000000)>>>29)-((1045:ἆ)<<<23)).toUInt32|||((B>>>63).toUInt32<<<31) lemma x8A1(E Y s:ℕ)(G:1047≤E)(C:Y≤8388608)(D:E≤1298)(F:s≤1):(E*8388608+Y-1045*8388608)%4294967296|||s*2^(31:Ἀ)=(s*2^(31:Ἀ)+((E-1046)*8388608%2^(64:Ἀ)+(8388608+Y))%2^(64:Ἀ))%2^(64:Ἀ)%4294967296:=by have d:(E-1046)*8388608<=252*8388608:=ι _ (Y9 D) have a:(E-1046)*8388608+(8388608+Y)<2^(31:Ἀ):=(E0 d (J1 C _)).trans_lt ж have e:s*2^(31:Ἀ)+((E-1046)*8388608+(8388608+Y))<4294967296:=Ja (ι _ F) a rw[show E*8388608+Y-1045*8388608=(E-1046)*8388608+(8388608+Y) by omega,γ (a.trans ж:_<4294967296),γ (d.trans_lt ж:_<2^(64:Ἀ)),γ (a.trans ж:_<2^(64:Ἀ)),γ (e.trans ж:_<2^(64:Ἀ)),γ e,Nat.lor_comm,Ϗ s,←Ϥ a] lemma pk2_nW (B:ἆ) (G:1047 ≤ ((B>>>52)&&&2047).toNat) (D:((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 w:=Norm.NF.kc B;have s:=B.toNat_lt;generalize Dense.F.mF B=M at *;generalize hbB:B.toNat=b at *;have d:(2047:Nat)=2^11-1:=rfl;have k:(4503599627370495:Nat)=2^(52:Ἀ)-1:=rfl;have m:((B>>>52)&&&2047).toNat=b/2^(52:Ἀ)%2^11:=by simp only[Ε,ν,kA,hbB,β,kH,d,ζ] rw[m]at G D;have t:M.toNat=b%2^(52:Ἀ)+2^52:=by rw[w];simp only[Ε,kA,hbB,k,ζ] have hq:(M>>>27).toNat=(b%2^(52:Ἀ)+2^(52:Ἀ))/2^27:=by simp only[ν,kA,kH,β,t] have F:b/2^(63:Ἀ)≤1:=Nat.le_of_lt_add_one (Ϟ (s.trans_eq ж)) have l:(b%2^(52:Ἀ)+2^(52:Ἀ))/2^(27:Ἀ)<2^26:=Ϟ ((I1 (ϊ b (϶ 52)) _).trans_eq ж) have f:=ι (2^(36:Ἀ)) (l7 (N6 l (by decide:0<2))) have o:(((2:ἆ)*(M>>>27)+1)<<<36).toNat=(2*((b%2^(52:Ἀ)+2^(52:Ἀ))/2^(27:Ἀ))+1)*2^36:=by simp only[ψ,η,ύ,kA,kH,hq,ο] rw[NE.kj_h2 _ l];exact γ (f.trans_lt ж) 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[o];clear * - l;omega have p:(900:ἆ)≤(B>>>52&&&2047):=by rw[θ,m];simp only[kA];exact N0 ж G have x:(146:ἆ)≤(B>>>52&&&2047)-900:=by rw[θ,χ _ _ p,m];simp only[kA];clear * - G;omega have i:((B>>>52&&&2047)-900-146).toNat=b/2^(52:Ἀ)%2^11-1046:=by rw[χ _ _ x,χ _ _ p,m];simp only[kA];exact X5 _ _ _ have g:(((B<<<1)>>>1)+268435456).toNat=b%2^(63:Ἀ)+2^28:=by simp only[η,ν,ψ,kA,kH,ο,β,hbB] clear * - s;omega have u:((1045:ἆ)<<<23)≤(((B<<<1)>>>1)+268435456)>>>29:=by rw[θ,ν,g] simp only[ψ,kA,kH,ο,β] rw[pkF3 b];exact (Ay _ _).trans ((ι _ (N0 ж G)).trans (V1 _ _)) have v:((((B<<<1)>>>1)+268435456)>>>29-(1045:ἆ)<<<23).toNat=(b%2^(63:Ἀ)+2^28)/2^29-1045*2^23:=by rw[χ _ _ u,ν,g] simp only[ψ,kA,kH,ο,β] rw[γ (by decide:1045*2^(23:Ἀ)<2^(64:Ἀ))] have r:((B>>>63).toUInt32<<<(31:ἇ)).toNat=b/2^(63:Ἀ)*2^31:=by simp only[ϴ,Ϫ,ν,kN,kA,kH,ο,β,hbB] rw[γ (F.trans_lt ж:_<2^(32:Ἀ)),γ ((ι (2^(31:Ἀ)) F).trans_lt ж:_<2^(32:Ἀ))] have j:(if (B>>>63 != 0)=true then (2147483648:ἆ) else 0).toNat=b/2^(63:Ἀ)*2^31:=by have e:(B>>>63).toNat=b/2^63:=by simp only[ν,kA,kH,β,hbB] split<;>rename_i h<;>simp only[AM,Ak,←ξ,e,kA,not_not]at h<;>simp only[kA] · exact ((congrArg (·*2^(31:Ἀ)) (N2 F (ϵ h))).trans ж).symm · simp only[h,ϳ] have A:(b%2^(52:Ἀ)+2^(52:Ἀ)+2^28)/2^29=2^(23:Ἀ)+(b%2^(52:Ἀ)+2^28)/2^29:=by clear * -;omega have C:(b%2^(52:Ἀ)+2^28)/2^29≤2^23:=by clear*-;omega rw[_root_.UInt32.toNat_or,Ϫ,v,r,Ϫ,η,η,j,ψ,i,hA];simp only[kA,kH,ο];rw[o,pkF1 q l,←hQ,pkF2,pkF3 b,A];exact x8A1 _ _ _ G C D F @[inline] def okF (B T:ἆ):Ἆ := ((B<<<1)>>>53)-T ≤ 1298-T&&(B&&&0x7FFFFFF)-33 < 0x8000000-65 lemma okF_nOK (B T:ἆ) (j:1047 ≤ T.toNat) (g: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,nM] at h ⊢ obtain ⟨c,d⟩:=h have i:=B.toNat_lt have eE:((B<<<1)>>>53).toNat=B.toNat/2^52%2048:=by simp only [ν,ψ,kA,kH,ο, β] omega have a:((B>>>52)&&&2047).toNat=B.toNat/2^52%2048:=by simp only [Ε,ν,kA,kH,β, show (2047:Nat)=2^11-1 from rfl,ζ] have e:(B&&&0x7FFFFFF).toNat=B.toNat%2^27:=by simp only [Ε,kA,show (134217727:Nat)=2^27-1 from rfl,ζ] rw [θ] at c rw [μ] at d simp only [Ζ,kA,eE,e] at c d simp only [θ,μ,η,ψ,kA, kH,ο,a,e] simp only [nr] at * omega def nZT:Ἂ ἀ:=#[⟨mB 34 0⟩,⟨mB 66 0⟩,⟨mB 130 0⟩,⟨mB 258 0⟩] @[inline]def nZw(n:Ἀ):ἀ:=let z:=nZT[if n<=32 then 0 else if n<=64 then 1 else if n<=128 then 2 else 3]!;if n+2<=(kS z) then z else Dense.F.zPq (n+2) lemma nZw_sz(n:Ἀ):n+2<=(kS (nZw n)):=(λz=>(by split;assumption;exact (Dense.F.zPs (n+2)).1:n+2<=(kS (if n+2<=(kS z) then z else Dense.F.zPq (n+2))))) _ lemma nOKp(B c:ἆ)(h:nOK B c=ἃ):pk2 B=nW B:=by obtain⟨a,b,-⟩:=nOK_dec B c h;exact pk2_nW B a b def nFE(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(ex:Option NR.fH)(lo t nn:Ἄ) (hr:(J0 nn)<=(kS Xr))(hg:(J0 nn)<=(kS gd))(hd:(J0 nn)<=(kS bd))(he:(J0 nn)<=ge.size) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)):(Ἂ Word):= if h:t>>52)&&&2047)) then nFE n eps x g b Xr gd bd ge nd m ri Kp r dW ex lo (t+1) nn hr hg hd he hb (out.uset (lo+t) (pk2 B) hu) (nH3 _ _ _ _ ho) else let p:=nFB n eps x g b nd r dW ex (lo+t) t nFE n eps x g b Xr gd bd ge nd m ri Kp r dW (some p.2) lo (t+1) nn hr hg hd he hb (out.uset (lo+t) p.1 hu) (nH3 _ _ _ _ ho) else out termination_by (J0 nn)-(J0 t) decreasing_by all_goals exact nHd h lemma nFE_sz(n:Ἀ)(e:Ἃ)(x g b:(Ἂ Word))(j gd bd:ἀ)(ge:ByteArray)(v m p:Ἅ)(u:ἆ)(r:Ἀ)(dW:Ἃ)(lo c:Ἄ) (y:(J0 c)<=(kS j))(z:(J0 c)<=(kS gd))(q:(J0 c)<=(kS bd))(l:(J0 c)<=ge.size) (o:(J0 lo)+(J0 c)<2^(32:Ἀ)):∀k (i:Option NR.fH)(t:Ἄ)(a:(Ἂ Word))(ho:(J0 lo)+(J0 c)<=(O0 a)),(J0 c)-(J0 t)=k-> (O0 (nFE n e x g b j gd bd ge v m p u r dW i lo t c y z q l o a ho))=(O0 a):=by intro k;induction k with |zero=> intro i t a ho h;rw[nFE.eq_def,dite_eq_right (nO1 h)] |succ k s=> intro i t a ho h;obtain⟨w,d,-⟩:=nOs h rw[nFE.eq_def,AT (ε.mpr w)];dsimp only;split<;>rw[s _ _ _ _ d,BT] def nFEf(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(lo t nn:Ἄ) (hr:(J0 nn)<=(kS Xr))(hg:(J0 nn)<=(kS gd))(hd:(J0 nn)<=(kS bd))(he:(J0 nn)<=ge.size) (hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)):(Ἂ Word):= if h:t>>52)&&&2047)) then nFEf n eps x g b Xr gd bd ge nd m ri Kp r dW lo (t+1) nn hr hg hd he hb (out.uset (lo+t) (pk2 B) (nH1 ht hb ho)) (nH3 _ _ _ _ ho) else nFE n eps x g b Xr gd bd ge nd m ri Kp r dW none lo t nn hr hg hd he hb out ho else out termination_by (J0 nn)-(J0 t) decreasing_by exact nHd h lemma nFEf_e(n:Ἀ)(i:Ἃ)(x g b:(Ἂ Word))(j gd bd:ἀ)(ge:ByteArray)(l m q:Ἅ)(p:ἆ)(r:Ἀ)(dW:Ἃ)(lo t a:Ἄ) (v:(J0 a)<=(kS j))(y:(J0 a)<=(kS gd))(o:(J0 a)<=(kS bd))(z:(J0 a)<=ge.size) (u:(J0 lo)+(J0 a)<2^(32:Ἀ))(e:(Ἂ Word))(ho:(J0 lo)+(J0 a)<=(O0 e)): nFEf n i x g b j gd bd ge l m q p r dW lo t a v y o z u e ho=nFE n i x g b j gd bd ge l m q p r dW none lo t a v y o z u e ho:=by induction h:(J0 a)-(J0 t) generalizing t e ho with |zero=>rw[nFEf.eq_def,nFE.eq_def,dite_eq_right (nO1 h),dite_eq_right (nO1 h)] |succ k s=> obtain⟨w,d,-⟩:=nOs h rw[nFEf.eq_def,AT (ε.mpr w)];dsimp only;split · rename_i c;rw[s _ _ _ d];conv_rhs=>rw[nFE.eq_def,AT (ε.mpr w)] dsimp only;rw[if_pos c] · rfl lemma nYq_sz{g:Type}(f:g->Ἄ->Ἄ->Ἃ)(s:g)(lo e:Ἄ):∀k (i:Ἄ)(a:(Ἂ Word)),(J0 e)-(J0 i)=k->(O0 (Yq f s lo i e a))=(O0 a):=by intro k;induction k with |zero=> intro i a d;rw[Yq,dite_eq_right (nO1 d)] |succ k h=> intro i a d;obtain⟨j,c,-⟩:=nOs d rw[Yq,AT (ε.mpr j),h _ _ c];split;exact BT ..;rfl @[inline]def nLc2(L Dl ef:Ἀ):Ἀ:=max (L+4) (2*L+2*Dl-(ef+178))+2 lemma nLc_e(n a ef:Ἀ):nLc2 (Aq (n+4)+1) a ef=nLc n a ef:=by unfold nLc2 nLc;rfl 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,J6] rw[γ h,γ (C0 (L9 _ _) ж)] 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 a ed:Ἀ):nElK m L a ed=(max (L+a+1049) (((m.toBits>>>52)&&&2047).toNat+6)-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+1049) (((m.toBits>>>52)&&&2047).toNat+6)-ed).toUInt64 lemma nElK3_e(m:Ἅ)(L a ed:Ἀ):nElK3 m L a ed=nElK m L a ed:=(nElK_n m L a ed).symm lemma kZ0(n:Ἀ)(h:n<2^(40:Ἀ)):ZR (I0 n)=(Aq n).toUInt64:=by apply ξ.1;have l:=Kk n rw[Y7,Dense.F.kOfS n щ,Dense.F.kOfS _ щ] lemma kZ1(n:Ἀ)(h:n<2^(40:Ἀ)):ZR (I0 n)+1=(Aq n+1).toUInt64:=by apply ξ.1;have l:=Kk n rw[η,Y7,Dense.F.kOfS n щ,Dense.F.kOfS _ щ,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:=Kk n rw[η,Y7,Dense.F.kOfS n щ,Dense.F.kOfS _ щ,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*F5 ((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:=O6 (v*nf+ep) let B:=D.toBits let dW:=nWs 26 B let ed:=kB dW let E:=((m.toBits>>>52)&&&2047)+6 let a:=L+Dl+1049 let c:=2*L+2*Dl let f:=(kB eps).toUInt64+178 let d:=if f<=c then c-f else 0 k m (nRi dW ed.toUInt64) ((if a<=E then E else a)-ed.toUInt64) dW (nOKs B ((if L+4<=d then d else L+4)+2)&&0rename_i h<;>rw[θ,e,d]at h · rw[χ _ _ (θ.mpr (by rw[d,g];omega)),d,g,D8 h,Dense.F.kOfS _ щ] · rw[χ _ _ (θ.mpr (by rw[e,g];omega)),e,g,Z8 (Qy h),Dense.F.kOfS _ щ] lemma nLU(L a:ἆ)(ef:Ἃ)(k:L.toNat<=64)(l:a.toNat<255)(j:ef.toNat<=255): (if L+4<=(if ef.toUInt64+178<=2*L+2*a then 2*L+2*a-(ef.toUInt64+178) else 0) then (if ef.toUInt64+178<=2*L+2*a then 2*L+2*a-(ef.toUInt64+178) else 0) else L+4)+2=(nLc2 L.toNat a.toNat ef.toNat).toUInt64:=by unfold nLc2 apply ξ.mp have i:(2*L+2*a).toNat=2*L.toNat+2*a.toNat:=by simp (disch:=omega) only[η,ύ,kA,γ] have g:(ef.toUInt64+178).toNat=ef.toNat+178:=by simp (disch:=omega) only[η,kA,ϩ,γ] have d:(L+4).toNat=L.toNat+4:=by simp (disch:=omega) only[η,kA,γ] by_cases c1:ef.toUInt64+178<=2*L+2*a · have e:(2*L+2*a-(ef.toUInt64+178)).toNat=2*L.toNat+2*a.toNat-(ef.toNat+178):=by rw[χ _ _ c1,i,g] simp only[c1,↓reduceIte] split<;>rename_i h<;>rw[θ,d,e]at h · simp (disch:=omega) only[η,kA,e,γ,D8 h,Dense.F.kOfS] · simp (disch:=omega) only[η,kA,d,γ,Z8 (Qy h),Dense.F.kOfS] · have c:=mt θ.mpr c1;rw[i,g]at c simp only[c1,↓reduceIte] split · rename_i h;rw[θ,d]at h;simp at h · simp (disch:=omega) only[η,kA,d,γ,Z8 (by omega:2*L.toNat+2*a.toNat-(ef.toNat+178)<=L.toNat+4),Dense.F.kOfS] lemma nLQk_e{β:Type}(n:Ἀ)(a:Ἃ)(s:Ἅ)(d:ἆ)(c:Ἅ->Ἅ)(g nf ep l:Ἅ)(L:ἆ)(i:nCK n a g nf ep l L)(p:n<2^(32:Ἀ))(u:d<255)(th:Thunk NR.fH)(k:Ἅ->Ἅ->ἆ->Ἃ->Ἆ->β):nLQk a s d c g nf ep L k=k (nLQ n a s d c th).m (nLQ n a s d c th).ri (nLQ n a s d c th).Kp (nLQ n a s d c th).dW (nLQ n a s d c th).fast:=by obtain⟨m,j,h,-,o⟩:=i;subst m j h o rw[kZ0 n щ,kZ1 (n+4) щ] have e:Aq (n+4)+1<2^(63:Ἀ):=C0 (V7 (Kk _)) щ have q:Aq (n+4)<33:=(m9 щ).mpr щ have t:((Aq (n+4)+1).toUInt64).toNat<=64:=by rw[Dense.F.kOfS _ e];omega have r:d.toNat<255:=μ.mp u unfold nLQk;dsimp only rw[nKU _ _ _ _ t r (by rw[Ε];exact ϝ) (nE8 _),nLU _ _ _ t r (nE8 _)] simp only[nLQ,nLc_e,<-nElK_n,Dense.F.kOfS _ e] lemma nLo_z(n:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(c:Ἅ)(e:nLS)(i j:Ἄ):nLo n a x g b c e i j=nFBz n a x g b c 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:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(d:Ἅ)(r:Ἀ)(lo hi:Ἄ)(c:(Ἂ Word))(e:(nLR n a x r).fast=false):nRowS n a x g b d r lo hi c=Yq (nEO n a x g b d) (nLR n a x r) lo lo hi c:= nYqC _ _ _ _ lo hi (λi j=>by simp only[nEO,e,υ,↓reduceIte,nLoN,nLo_z,nLR_th,nEI]) _ lo c rfl noncomputable def nFE2(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd m ri:Ἅ)(Kp:ἆ)(r:Ἀ)(dW:Ἃ)(ex:Option NR.fH)(lo t nn:Ἄ) (hg:(J0 nn)<=(O0 g))(hd:(J0 nn)<=(O0 b)) (hx:(J0 lo)+(J0 nn)<=(O0 x))(hb:(J0 lo)+(J0 nn)<2^(32:Ἀ))(out:(Ἂ Word))(ho:(J0 lo)+(J0 nn)<=(O0 out)):(Ἂ Word):= if h:t>>52)&&&2047)) then nFE2 n eps x g b nd m ri Kp r dW ex lo (t+1) nn hg hd hx hb (out.uset (lo+t) (nW B) hu) (nH3 _ _ _ _ ho) else let p:=nFB n eps x g b nd r dW ex (lo+t) t nFE2 n eps x g b nd m ri Kp r dW (some p.2) lo (t+1) nn hg hd hx hb (out.uset (lo+t) p.1 hu) (nH3 _ _ _ _ ho) else out termination_by (J0 nn)-(J0 t) decreasing_by all_goals exact nHd h @[inline]def nRow(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(Xr gd bd:ἀ)(ge:ByteArray)(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hr:n+2<=(kS Xr))(hg:n<=(kS gd))(hd:n<=(kS bd))(he:n<=ge.size) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ)):ἀ×(Ἂ Word):= let lo:=G0 (r*n);let hi:=G0 (r*n+n);let nn:=G0 n have q1:(J0 lo)=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q2:(J0 nn)=n:=Conv.aa _ (C0 (H0 _ _) 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 (M1 _) ((B5 _).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,nFEf n eps x g b pD.a gd bd ge nd m ri Kp r dW 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:Ἀ)(c:Ἃ)(x g b:(Ἂ Word))(d gd bd:ἀ)(ge:ByteArray)(o:Ἅ)(h nf ep e:Ἅ)(L:ἆ)(k:nCK n c h nf ep e L)(r:Ἀ)(a:(Ἂ Word)) (p:n+2<=(kS d))(q:n<=(kS gd))(l:n<=(kS bd))(i:n<=ge.size) (m:r*n+n<=(O0 x))(ho:r*n+n<=(O0 a))(j:r*n+n<2^(32:Ἀ)): (kS (nRow n c x g b d gd bd ge o h nf ep e L k r a p q l i m ho j).1)=(kS d)∧((nRow n c x g b d gd bd ge o h nf ep e L k r a p q l i m ho j).2=#[]∨(O0 (nRow n c x g b d gd bd ge o h nf ep e L k r a p q l i m ho j).2)=(O0 a)):=by unfold nRow nRowS;dsimp only;split · rw[nLQk_e n c _ _ _ h nf ep e L k (C0 (H0 _ _) j) (by assumption) (Thunk.mk (λ_=>NR.eI n (gM n c x r)))];simp only[nFEf_e];split · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,BA (nFE_sz _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl)⟩ · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,BA (nYq_sz _ _ _ _ _ _ _ rfl)⟩ · exact⟨nDR_sz _ _ _ _ _ _ _ _ _ _ _ rfl,pZ rfl⟩ @[noinline]noncomputable def nRow1(n:Ἀ)(eps:Ἃ)(x g b:(Ἂ Word))(nd:Ἅ)(rm nf ep z0:Ἅ)(L:ἆ)(hC:nCK n eps rm nf ep z0 L)(r:Ἀ)(out:(Ἂ Word)) (hg:n<=(O0 g))(hd:n<=(O0 b)) (hx:r*n+n<=(O0 x))(ho:r*n+n<=(O0 out))(hb:r*n+n<2^(32:Ἀ)):(Ἂ Word):= let lo:=G0 (r*n);let hi:=G0 (r*n+n);let nn:=G0 n have q1:(J0 lo)=r*n:=Conv.aa _ (C0 (V1 _ _) hb) have q2:(J0 nn)=n:=Conv.aa _ (C0 (H0 _ _) hb) have hx':(J0 lo)+(J0 nn)<=(O0 x):=by rw[q1,q2];exact hx have hb':(J0 lo)+(J0 nn)<2^(32:Ἀ):=by rw[q1,q2];exact hb let S:=nS1 x lo hi z0 0 if S.2<255 then nLQk eps S.1 S.2 (λm=>nS2 x m lo hi z0) rm nf ep L (λm ri Kp dW fast=> if fast then nFE2 n eps x g b nd m ri Kp r dW none lo 0 nn (by rw[q2];exact hg) (by rw[q2];exact hd) hx' hb' out (by rw[q1,q2];exact ho) else nRowS n eps x g b nd r lo hi out) else #[] lemma nGEu(w:ἇ):(((w>>>23)&&&255).toUInt8).toUInt64=nfe w:=by rw[nfe];apply ξ.1;rw[UInt8.toNat_toUInt64,UInt32.toNat_toUInt8,ϩ];apply γ;rw[Ξ];exact J3 (ϝ.trans ж) @[inline]def nWF(a:(Ἂ Word)):ἀ×ByteArray:=(⟨a.map Dense.F.dw⟩,⟨a.map (λ(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 ..,λt c=>?_,m0 ..,λt c=>?_⟩ · show (a.map Dense.F.dw)[t]! =_;rw[AB _ _ (by rw[m0];exact c),AB a t c,Jt] · show ((a.map (λ(w:Word)=>((w>>>23)&&&255).toUInt8))[t]!).toUInt64=_;rw[AB _ _ (by rw[m0];exact c),AB a t c,Jt];exact nGEu _ @[inline]def nWF2(k:(Ἂ Word)×(Ἂ Word)):(ἀ×ByteArray)×ἀ×Ἆ:=(nWF k.1,(nWF k.2).1,k.1.all finiteWord&&k.2.all finiteWord) @[inline]def nK2eq(a b:(Ἂ Word)×(Ἂ Word)):Ἆ:=Dense.F.wcAeq a.1 b.1&&Dense.F.wcAeq a.2 b.2 lemma nK2eq_ok(a b:(Ἂ Word)×(Ἂ Word))(h:nK2eq a b=true):a=b:=by obtain⟨e,c⟩:=a;obtain⟨d,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 (λa b=>nK2eq_ok a b) nWS2 32 (g,b) (λk=>k.1) def nWGs(g b:(Ἂ Word))(s:Ἂ (Dense.F.WcE nWF2))(i:Nat):{v//v=nWF2 (g,b)}:= if h:iwithPtrAddr g (λ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)) (λ_ _=>Dense.F.wcSub _ _)) (λ_ _=>Dense.F.wcSub _ _) else nWGo g b termination_by s.size-i decreasing_by exact Z3 h (M1 i) @[noinline]def nWG2(g b:(Ἂ Word)):(ἀ×ByteArray)×ἀ×Ἆ:=(nWGs g b (ST.Prim.Ref.get nWS2 (Void.mk ())).val 0).1 lemma nWG2_v(g b:(Ἂ Word)):nWG2 g b=nWF2 (g,b):=(nWGs g b _ 0).2 lemma nBu(a:ByteArray)(i:Ἄ)(h:(J0 i)subst h · exact⟨by rw[nFB,nFBz,nLo,nLR_th,E],E⟩ · exact⟨by rw[nFB,nFBz,nLo,nLR_th],rfl⟩ lemma nUc(lo t:Ἄ):lo+t-lo=t:=by rw[Ux,Gh] lemma nFE_eq(n:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(z gd bd:ἀ)(ge:ByteArray)(l:Ἅ)(r:Ἀ)(lo d:Ἄ) (M:(J0 d)<=(kS z))(L:(J0 d)<=(kS gd))(N:(J0 d)<=(kS bd))(J:(J0 d)<=ge.size) (s:(J0 lo)+(J0 d)<2^(32:Ἀ))(C:(nLR n a x r).fast=true) (H:∀t,t<(J0 d)->¬((nLR n a x r).Kpz.data[t]! =Dense.F.dw x[(J0 lo)+t]!) (hG:∀t,t<(J0 d)->gd.data[t]! =Dense.F.dw g[t]!) (K:∀t,t<(J0 d)->bd.data[t]! =Dense.F.dw b[t]!) (T:∀t,t<(J0 d)->(ge.data[t]!).toUInt64=nfe g[t]!)(hq:r*n+n<2^(32:Ἀ))(w:∀j,jkB x[j]!≠255)(m:0(J0 d)-(J0 t)=k->(J0 t)<=(J0 d)->(i=none∨i=some (NR.eI n (gM n a x r)))-> nFE n a x g b z gd bd ge l (nLR n a x r).m (nLR n a x r).ri (nLR n a x r).Kp r (nLR n a x r).dW i lo t d M L N J s c ho=Yq (nEO n a x g b l) (nLR n a x r) lo (lo+t) (lo+d) c:=by have y:=nLR_dW n a x r hq w m C have O:=nCa s intro k;induction k with |zero=> intro i t c ho e v F B rw[nFE.eq_def,dite_eq_right (nO1 v),Yq,dite_eq_right (nOz s v F)] |succ k D=> intro i t c ho e v F B obtain⟨h,p,o⟩:=nOs v have A:(J0 (lo+t))=(J0 lo)+(J0 t):=nCa (nOq s h) have G:lo+t>>52)&&&2047)) then nW (nElB x[(J0 lo)+(J0 t)]! g[(J0 t)]! b[(J0 t)]! (nLR n a x r).m (nLR n a x r).ri) else nLo n a x g b l (nLR n a x r) (lo+t) t:=by rw[nEO,AD C];simp only[f6,A,nElOK,AC (H _ h),nLoN] rw[I];simp only[nElB] split · rename_i u;simp only[u,nOKp _ _ u,↓reduceIte];refine D i (t+1) _ _ ?_ p o B;rw[BT];exact e · rename_i u;simp only[u,υ,↓reduceIte];have q:=nFB_v n a x g b l r (nLR n a x r).dW i y B (lo+t) t;rw[<-q.1];refine D (some (nFB n a x g b l r (nLR n a x r).dW i (lo+t) t).2) (t+1) _ _ ?_ p o (BA (by rw[q.2]));rw[BT];exact e lemma nFE2_eq(n:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(i:Ἅ)(r:Ἀ)(lo d:Ἄ) (I:(J0 d)<=(O0 g))(J:(J0 d)<=(O0 b))(p:(J0 lo)+(J0 d)<=(O0 x)) (u:(J0 lo)+(J0 d)<2^(32:Ἀ))(B:(nLR n a x r).fast=true) (G:∀t,t<(J0 d)->¬((nLR n a x r).KpkB x[j]!≠255)(l:0(J0 d)-(J0 t)=k->(J0 t)<=(J0 d)->(h=none∨h=some (NR.eI n (gM n a x r)))-> nFE2 n a x g b i (nLR n a x r).m (nLR n a x r).ri (nLR n a x r).Kp r (nLR n a x r).dW h lo t d I J p u c ho=Yq (nEO n a x g b i) (nLR n a x r) lo (lo+t) (lo+d) c:=by have A:=nLR_dW n a x r hq y l B have K:=nCa u intro k;induction k with |zero=> intro h t c ho e v D p rw[nFE2.eq_def,dite_eq_right (nO1 v),Yq,dite_eq_right (nOz u v D)] |succ k C=> intro h t c ho e v D p obtain⟨s,o,m⟩:=nOs v have w:(J0 (lo+t))=(J0 lo)+(J0 t):=nCa (nOq u s) have F:lo+t>>52)&&&2047)) then nW (nElB x[(J0 lo)+(J0 t)]! g[(J0 t)]! b[(J0 t)]! (nLR n a x r).m (nLR n a x r).ri) else nLo n a x g b i (nLR n a x r) (lo+t) t:=by rw[nEO,AD B];simp only[f6,w,nElOK,AC (G _ s),nLoN] rw[H];simp only[nElB] split · rename_i z;simp only[z,↓reduceIte];refine C h (t+1) _ _ ?_ o m p;rw[BT];exact e · rename_i z;simp only[z,υ,↓reduceIte];have q:=nFB_v n a x g b i r (nLR n a x r).dW h A p (lo+t) t;rw[<-q.1];refine C (some (nFB n a x g b i r (nLR n a x r).dW h (lo+t) t).2) (t+1) _ _ ?_ o m (BA (by rw[q.2]));rw[BT];exact e lemma nDR_sp(x:(Ἂ Word))(a n:Ἄ)(r:(J0 a)+(J0 n)<=(O0 x))(l:(J0 a)+(J0 n)<2^(32:Ἀ)):∀k (t:Ἄ)(d:ἀ)(c:(J0 n)+2<=(kS d))(s:Ἅ)(i:ἆ),(J0 n)-(J0 t)=k->(J0 t)<=(J0 n)->(∀j,j<(J0 t)->d.data[j]! =Dense.F.dw x[(J0 a)+j]!)-> (∀j,j<(J0 n)->(nDR x d a t n r l c s i).a.data[j]! =Dense.F.dw x[(J0 a)+j]!)∧(nDR x d a t n r l c s i).a.data[(J0 n)]! =(nS1 x (a+t) (a+n) s i).1∧(nDR x d a t n r l c s i).d=(nS1 x (a+t) (a+n) s i).2:=by have z:=nCa l intro k;induction k with |zero=> intro t d c s i m v hX have q:(J0 t)=(J0 n):=N2 v (M0.mp m) rw[nDR.eq_def,dite_eq_right (nO1 m),nS1,dite_eq_right (nOz l m v)] refine⟨λj g=>?_,?_,rfl⟩ · rw[Dense.F.fuS _ _ _ _ _ (U1 g ((V1 _ 2).trans c)),AC (J8 g)];exact hX j (by rw[q];exact g) · rw[Dense.F.fuS _ _ _ _ _ (U1 (H4 (M1 _)) c),AD rfl] |succ k y=> intro t d c s i m v hX obtain⟨o,p,u⟩:=nOs m have w:(J0 (a+t))=(J0 a)+(J0 t):=nCa (nOq l o) rw[nDR.eq_def,AT (ε.mpr o),nS1,AT (by rw[ε,w,z];exact O1 o _)] simp only[Dense.cC,f6,I9] refine y _ _ _ _ _ p u (λj g=>?_) rw[Dense.ac (ε.mpr o)] at g rw[Dense.F.fuS _ _ _ _ _ (U1 g ((l7 o).trans ((V1 _ 2).trans c)))];split · rename_i e;rw[<-e,w] · exact hX j (U4 (Z0 g) (λh=>by rename_i e;exact e h.symm)) lemma nVR_eq(x:(Ἂ Word))(e:ἀ)(m:Ἅ)(a n:Ἄ)(r:(J0 n)<=(kS e))(g:(J0 a)+(J0 n)<2^(32:Ἀ))(hX:∀j,j<(J0 n)->e.data[j]! =Dense.F.dw x[(J0 a)+j]!): ∀k (t:Ἄ)(v:Ἅ),(J0 n)-(J0 t)=k->(J0 t)<=(J0 n)->nVR e m t n r v=nS2 x m (a+t) (a+n) v:=by have q:=nCa g intro k;induction k with |zero=> intro t v c o rw[nVR.eq_def,dite_eq_right (nO1 c),nS2,dite_eq_right (nOz g c o)] |succ k p=> intro t v c o obtain⟨d,h,i⟩:=nOs c have l:(J0 (a+t))=(J0 a)+(J0 t):=nCa (nOq g d) rw[nVR.eq_def,AT (ε.mpr d),nS2,AT (by rw[ε,l,q];exact O1 d _)] dsimp only;rw[Dense.F.kFU,hX _ d,f6,l,I9] exact p _ _ h i lemma nKpA(y d l q e:ℤ)(g:y≤d)(c:2≤l)(a:l+d-30≤q):y+(1051-e)≤q+1079-e:=by omega lemma nKpB(l d u:ℤ)(e:l≤64)(c:d≤254)(a:u≤2047):max (l+d-30) (u-1073)≤2047:=max_le щ щ lemma nKpC(m e:ℤ)(h:m≤2047)(a:0≤e):m+1079-e≤3126:=by omega lemma nKp_h(Y:ἇ)(D ed L d:Ἀ)(m:(mJ Y)<=D)(p:D<=254)(k:ed<255)(i:2<=L∧L<=64)(e:d<=2047): ¬((max ((L:ℤ)+D-30) ((d:ℤ)-1073)+1079-ed).toNat.toUInt64kB x[j]!≠255)(c:(nLR n a x r).fast=true): ∀t,t¬((nLR n a x r).KpkB x[j]!≠255)(s:0gd.data[t]! =Dense.F.dw g[t]!)(U:∀t,tbd.data[t]! =Dense.F.dw b[t]!)(hE:∀t,t(ge.data[t]!).toUInt64=nfe g[t]!)(X:(4<=n&&n<=2048&&kB a != 0&&kB a != 255)=ἃ): (nRow n a x g b o gd bd ge y C nf ep H L z r d J I M G O ho l).2=Yq (nEO n a x g b y) (nLR n a x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) d:=by have hz:=z.2.2.2.1;subst hz have p:(J0 (G0 (r*n)))=r*n:=Conv.aa _ (C0 (V1 _ _) l) have i:(J0 (G0 n))=n:=Conv.aa _ (C0 (H0 _ _) l) have A:(J0 (G0 (r*n+n)))=r*n+n:=Conv.aa _ l have c:(J0 (G0 (r*n)))+(J0 (G0 n))<2^(32:Ἀ):=by rw[p,i];exact l have k:(J0 (G0 (r*n)))+(J0 (G0 n))<=(O0 x):=by rw[p,i];exact O have e:(J0 (G0 n))+2<=(kS o):=by rw[i];exact J have q:G0 (r*n)+G0 n=G0 (r*n+n):=H6.1 (by rw[nCa c,p,i,A]) have u:(J0 (0:Ἄ))=0:=Ϧ obtain⟨N,F,A3⟩:=nDR_sp x (G0 (r*n)) (G0 n) k c _ 0 o e (I0 (0:Ἀ)).toInt64.toFloat 0 rfl (by rw[u];exact ϟ _) (λj v=>by rw[u]at v;exact absurd v (D4 _)) have S:=nDR_sz x (G0 (r*n)) (G0 n) k c _ 0 o e (I0 (0:Ἀ)).toInt64.toFloat 0 rfl have A4:=λm (Y:(J0 (G0 n))<=(kS (nDR x o (G0 (r*n)) 0 (G0 n) k c e (I0 (0:Ἀ)).toInt64.toFloat 0).a))=>nVR_eq x _ m (G0 (r*n)) (G0 n) Y c N _ 0 (I0 (0:Ἀ)).toInt64.toFloat rfl (by rw[u];exact ϟ _) rw[Jr,q]at F A3 A4 have D:(nDR x o (G0 (r*n)) 0 (G0 n) k c e (I0 (0:Ἀ)).toInt64.toFloat 0).d<255:=by rw[A3,μ];exact C0 (nS1_dl x (G0 (r*n+n)) (λj v=>hX j (A▸v)) _ (G0 (r*n)) _ 0 rfl (by rw[p,A];omega) ж).2.1 ж unfold nRow;dsimp only;split · rename_i V rw[nLQk_e n a _ _ _ C nf ep _ L z (C0 (H0 _ _) l) V (Thunk.mk (λ_=>NR.eI n (gM n a x r)))] simp only[Dense.F.kFU,F,A3,A4,nFEf_e] rw[<-nLQ_e n a x r X];split · rename_i w have K:=nFE_eq n a x g b (nDR x o (G0 (r*n)) 0 (G0 n) k c e (I0 (0:Ἀ)).toInt64.toFloat 0).a gd bd ge y r (G0 (r*n)) (G0 n) (by rw[S];exact (V1 _ 2).trans e) (by rw[i];exact I) (by rw[i];exact M) (by rw[i];exact G) c w (λt h=>by rw[p];rw[i]at h;exact nKp n a x r l hX w t h) (λt h=>by rw[N t h]) (λt h=>by rw[i]at h;exact hG t h) (λt h=>by rw[i]at h;exact U t h) (λt h=>by rw[i]at h;exact hE t h) l hX s _ none 0 d (by rw[p,i];exact ho) B rfl (by rw[u];exact ϟ _) (pZ rfl) rw[Jr,q]at K;exact K · rename_i w;exact nRowS_e n a x g b y r _ _ d (O8.mpr w) · rename_i T;exact (T D).elim lemma nRow1_eq(n:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(m:Ἅ)(v nf ep w:Ἅ)(L:ἆ)(o:nCK n a v nf ep w L)(r:Ἀ)(c:(Ἂ Word)) (y:n<=(O0 g))(z:n<=(O0 b)) (A:r*n+n<=(O0 x))(ho:r*n+n<=(O0 c))(d:r*n+n<2^(32:Ἀ))(u:(O0 c)<2^(32:Ἀ)) (hX:∀j,jkB x[j]!≠255)(i:0hX j (q▸G)) _ (G0 (r*n)) _ 0 rfl (by rw[h,q];omega) ж).2.1 ж unfold nRow1;dsimp only;split · rename_i H rw[nLQk_e n a _ _ _ v nf ep _ L o (C0 (H0 _ _) d) H (Thunk.mk (λ_=>NR.eI n (gM n a x r)))] rw[<-nLQ_e n a x r I];split · rename_i l have K:=nFE2_eq n a x g b m r (G0 (r*n)) (G0 n) (by rw[e];exact y) (by rw[e];exact z) s k l (λt B=>by rw[h];rw[e]at B;exact nKp n a x r d hX l t B) d hX i _ none 0 c (by rw[h,e];exact ho) u rfl (by rw[C];exact ϟ _) (pZ rfl) rw[Jr,p]at K;exact K · rename_i l;exact nRowS_e n a x g b m r _ _ c (O8.mpr l) · rename_i F;exact (F D).elim lemma nRow_bad(n:Ἀ)(l:Ἃ)(x g b:(Ἂ Word))(i gd bd:ἀ)(ge:ByteArray)(C:Ἅ)(w nf ep h:Ἅ)(L:ἆ)(z:nCK n l w nf ep h L)(r:Ἀ)(c:(Ἂ Word)) (u:n+2<=(kS i))(A:n<=(kS gd))(F:n<=(kS bd))(y:n<=ge.size) (v:r*n+n<=(O0 x))(ho:r*n+n<=(O0 c))(e:r*n+n<2^(32:Ἀ))(j:Ἀ)(B:r*n<=j)(j2:jby rw[t]at p;exact absurd p (D4 _)) rw[Jr,q]at A3 have G:=(nS1_ge x (G0 (r*n+n)) _ (G0 (r*n)) h 0 rfl (by rw[m,s];omega)).2 j (by rw[m];exact B) (by rw[s];exact j2) rw[p]at G have D:¬(nDR x i (G0 (r*n)) 0 (G0 n) k a d h 0).d<255:=by rw[A3,μ];exact X2.2 (AZ ж G) unfold nRow;dsimp only;rw[AC D] lemma nRow1_bad(n:Ἀ)(a:Ἃ)(x g b:(Ἂ Word))(s:Ἅ)(k nf ep d:Ἅ)(L:ἆ)(m:nCK n a k nf ep d L)(r:Ἀ)(c:(Ἂ Word)) (t:n<=(O0 g))(o:n<=(O0 b)) (q:r*n+n<=(O0 x))(ho:r*n+n<=(O0 c))(e:r*n+n<2^(32:Ἀ))(j:Ἀ)(l:r*n<=j)(j2:jsimp only[Qn,W7,Rat.cast_neg,Hg,N9,Z7]<;>ring lemma nV2{c:Prop}[Decidable c]{α:Type}(p q r:α)(a:c→p=r)(hq:¬c→q=r):(if c then p else q)=r:=if h:c then (AD h).trans (a h) else (AC h).trans (hq h) lemma nV3{c0 c:Prop}[Decidable c0][Decidable c]{α:Type}(s a r:α)(e:s=r)(g:c0→c→a=r):(if c0 then (if c then a else s) else s)=r:= if h0:c0 then (AD h0).trans (if d:c then (AD d).trans (g h0 d) else (AC d).trans e) else (AC h0).trans e 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 K:=nSv h q have l:i/n*n+n<2^(32:Ἀ):=AO z B have hX:∀j,j< i/n*n+n->kB x[j]!≠255:=λj I=>H j (U1 I z) have c:i/n*n<=i:=pr i n have a:i< i/n*n+n:=Jo m simp only[nLo,nLR_th,f6,Conv.aa _ (G.trans B:i<2^(32:Ἀ)),Conv.aa _ ((r.trans_le ((H0 n _).trans z)).trans B:i%n<2^(32:Ἀ)),gP,Qg _ w,Fin.is_lt,Qg,gN _ _ _ _ m q l] obtain⟨v,A,-⟩:=Vn n h x (i/n) m q refine nV3 _ _ _ (nV2 _ _ _ (λJ=>?_) (λJ=>?_)) (λC s=>?_) · 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) l hX K i c a _ _ (F _ r) (D _ r) C s] end Norm end namespace GK open Dense.F (WcE aO bW dw pg s5uget tchP tw wcDF wcDF_spec wcGet3T wcK3eq wcK3eq_ok) open Conv (aa ey_h4 fz wlo wsp) def cF (a:Ἂ Word × Nat × Nat):ἀ × ἇ:=(wcDF a,aO a.1 0 0) @[noinline] def cS:ST.Ref Unit (Ἂ (WcE cF)):=(ST.Prim.mkRef #[] (Void.mk ())).val def cv (B : @& Ἂ Word) (i:Ἄ) (e:ἇ) (Y:ἀ):ἀ × ἇ := if h:i < B.usize then let w:=B.uget i (Dense.cD h) let x:=(w>>>23)&&&255 cv B (i+1) (if e < x then x else e) (Y.push (dw w)) else (Y,e) termination_by B.size-i.toNat decreasing_by have:=Dense.cD h; rw [Dense.ac h]; omega @[noinline] def sO (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u:ἆ) (L : @& Nat) (S:Ἅ):Word := tw false S u L k (λt=>dw B[t*n+jU.toNat]! * dw A[i*k+t]!) (λ_=>dw oneW*dw 0x80000000) (λ_=>dotOf k (λt=>A[i*k+t]!) (λt=>B[t*n+jU.toNat]!)) @[inline] def fO (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (S:Ἅ):Word := let c:=fz S lo sp u if c < 4294967296 then c.toUInt32 else sO A B k n i jU u L S @[noinline] def f8 (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := ((((((((out.push (fO A B k n i jU u lo sp L a0)).push (fO A B k n i (jU+1) u lo sp L a1)).push (fO A B k n i (jU+2) u lo sp L a2)).push (fO A B k n i (jU+3) u lo sp L a3)).push (fO A B k n i (jU+4) u lo sp L a4)).push (fO A B k n i (jU+5) u lo sp L a5)).push (fO A B k n i (jU+6) u lo sp L a6)).push (fO A B k n i (jU+7) u lo sp L a7)) lemma hX (Bd:ἀ) (bU t nU kU:Ἄ) (w:Nat) (a:t < kU) (d:bU.toNat+w ≤ nU.toNat) (g:kU.toNat*nU.toNat ≤ Bd.size):(bU+t*nU).toNat+w ≤ Bd.size:=by have h:(bU+t*nU).toNat ≤ bU.toNat+(t*nU).toNat:=by rw [lJ]; exact Ay _ _ have e:(t*nU).toNat ≤ t.toNat*nU.toNat:=by rw [BO]; exact Ay _ _ have c:=ε.mp a have i:t.toNat*nU.toNat+nU.toNat ≤ kU.toNat*nU.toNat:=by have:=ι nU.toNat (show t.toNat+1 ≤ kU.toNat by omega) rwa [Ϡ,n4] at this omega lemma hA (Ad:ἀ) (a t kU:Ἄ) (c:t < kU) (e:a.toNat+kU.toNat ≤ Ad.size) : (a+t).toNat < Ad.size:=by have d:(a+t).toNat ≤ a.toNat+t.toNat:=by rw [lJ]; exact Ay _ _ have:=ε.mp c omega def m8 (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (k n i : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+8 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (t:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := if h:t < kU then let a:=Ad.uget (aU+t) (hA Ad aU t kU h ha) let xb:=bU+t*nU have hJ:xb.toNat+8 ≤ Bd.size:=hX Bd bU t nU kU 8 h hb hB m8 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB (t+1) (a0+Bd.uget (xb+0) (ey_h4 xb hJ)*a) (a1+Bd.uget (xb+1) (ey_h4 xb hJ)*a) (a2+Bd.uget (xb+2) (ey_h4 xb hJ)*a) (a3+Bd.uget (xb+3) (ey_h4 xb hJ)*a) (a4+Bd.uget (xb+4) (ey_h4 xb hJ)*a) (a5+Bd.uget (xb+5) (ey_h4 xb hJ)*a) (a6+Bd.uget (xb+6) (ey_h4 xb hJ)*a) (a7+Bd.uget (xb+7) (ey_h4 xb hJ)*a) out else f8 A B k n i bU u lo sp L a0 a1 a2 a3 a4 a5 a6 a7 out termination_by kU.toNat-t.toNat decreasing_by exact Z3 (ε.mp h) (N4 (M1 _) (Dense.ac h).symm) @[noinline] def f4 (A B : @& Ἂ Word) (k n i : @& Nat) (jU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (a0 a1 a2 a3:Ἅ) (out:Ἂ Word):Ἂ Word := ((((out.push (fO A B k n i jU u lo sp L a0)).push (fO A B k n i (jU+1) u lo sp L a1)).push (fO A B k n i (jU+2) u lo sp L a2)).push (fO A B k n i (jU+3) u lo sp L a3)) def m4 (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (k n i : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+4 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (t:Ἄ) (a0 a1 a2 a3:Ἅ) (out:Ἂ Word):Ἂ Word := if h:t < kU then let a:=Ad.uget (aU+t) (hA Ad aU t kU h ha) let xb:=bU+t*nU have hJ:xb.toNat+4 ≤ Bd.size:=hX Bd bU t nU kU 4 h hb hB m4 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB (t+1) (a0+Bd.uget (xb+0) (Conv.ey4 xb hJ)*a) (a1+Bd.uget (xb+1) (Conv.ey4 xb hJ)*a) (a2+Bd.uget (xb+2) (Conv.ey4 xb hJ)*a) (a3+Bd.uget (xb+3) (Conv.ey4 xb hJ)*a) out else f4 A B k n i bU u lo sp L a0 a1 a2 a3 out termination_by kU.toNat-t.toNat decreasing_by exact Z3 (ε.mp h) (N4 (M1 _) (Dense.ac h).symm) def m1 (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (k n i : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU aU bU:Ἄ) (ha:aU.toNat+kU.toNat ≤ Ad.size) (hb:bU.toNat+1 ≤ nU.toNat) (hB:kU.toNat*nU.toNat ≤ Bd.size) (t:Ἄ) (a0:Ἅ) (out:Ἂ Word):Ἂ Word := if h:t < kU then let a:=Ad.uget (aU+t) (hA Ad aU t kU h ha) let xb:=bU+t*nU have hJ:xb.toNat+1 ≤ Bd.size:=hX Bd bU t nU kU 1 h hb hB m1 A B Ad Bd k n i u lo sp L kU nU aU bU ha hb hB (t+1) (a0+Bd.uget xb щ*a) out else out.push (fO A B k n i bU u lo sp L a0) termination_by kU.toNat-t.toNat decreasing_by exact Z3 (ε.mp h) (N4 (M1 _) (Dense.ac h).symm) lemma rA (m k n i:Nat) (Ad:ἀ) (kU:Ἄ) (a:kU.toNat=k) (hA:m*k ≤ Ad.size) (c:m*k+n < 2^31) (hi:i < m):(i*k).toUSize.toNat+kU.toNat ≤ Ad.size:=by have d:i*k+k ≤ m*k:=by have:=ι k (show i+1 ≤ m by omega); rwa [Ϡ,n4] at this rw [aa (i*k) щ,a]; omega lemma rB (j n w:Nat) (nU:Ἄ) (a:nU.toNat=n) (h:j+w ≤ n) (c:n < 2^31) : j.toUSize.toNat+w ≤ nU.toNat:=by rw [aa j щ,a]; exact h def rw (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (m k n : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (z:Ἅ) (i:Nat) (hi:i < m) (j:Nat) (out:Ἂ Word):Ἂ Word := if h8:j+8 ≤ n then rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi (j+8) (m8 A B Ad Bd k n i u lo sp L kU nU (i*k).toUSize j.toUSize (rA m k n i Ad kU hk hA hs hi) (rB j n 8 nU hn h8 (by omega)) (by rw [hk,hn]; exact hB) 0 z z z z z z z z out) else if h4:j+4 ≤ n then rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi (j+4) (m4 A B Ad Bd k n i u lo sp L kU nU (i*k).toUSize j.toUSize (rA m k n i Ad kU hk hA hs hi) (rB j n 4 nU hn h4 (by omega)) (by rw [hk,hn]; exact hB) 0 z z z z out) else if h1:j < n then rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi (j+1) (m1 A B Ad Bd k n i u lo sp L kU nU (i*k).toUSize j.toUSize (rA m k n i Ad kU hk hA hs hi) (rB j n 1 nU hn h1 (by omega)) (by rw [hk,hn]; exact hB) 0 z out) else out termination_by n-j decreasing_by all_goals exact Z3 щ щ def rs (A B : @& Ἂ Word) (Ad Bd : @& ἀ) (m k n : @& Nat) (u lo sp:ἆ) (L : @& Nat) (kU nU:Ἄ) (hk:kU.toNat=k) (hn:nU.toNat=n) (hA:m*k ≤ Ad.size) (hB:k*n ≤ Bd.size) (hs:m*k+n < 2^31) (z:Ἅ) (i:Nat) (out:Ἂ Word):Ἂ Word := if hi:i < m then rs A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z (i+1) (rw A B Ad Bd m k n u lo sp L kU nU hk hn hA hB hs z i hi 0 out) else out termination_by m-i decreasing_by exact Z3 hi (M1 i) lemma uLt (B:Ἂ Word) (i:Ἄ) (a:B.size < 2^31) (h:i.toNat < B.size):i < B.usize:=by rw [ε]; simp only [Q8]; rw [aa B.size щ]; exact h lemma mx32 (e x:ἇ):(if e < x then x else e).toNat=max e.toNat x.toNat:=by split <;> rename_i h <;> rw [Ι] at h <;> omega lemma cv_spec (B:Ἂ Word) (p:B.size < 2^31) : ∀ c (i:Ἄ) (e:ἇ) (Y:ἀ), B.size-i.toNat=c → i.toNat ≤ B.size → Y.size=i.toNat → (∀ q < Y.size,Y.data[q]! = dw B[q]!) → (∀ q < i.toNat,(expOf B[q]!).toNat ≤ e.toNat) → (cv B i e Y).1.size=B.size∧(∀ q < B.size,(cv B i e Y).1.data[q]! = dw B[q]!) ∧ (∀ q < B.size,(expOf B[q]!).toNat ≤ (cv B i e Y).2.toNat):=by intro c; induction c with | zero => intro i e Y n j l g d rw [cv,dite_eq_right (λh=>by have:=Dense.cD h; omega)]; dsimp only exact ⟨by omega,λq hq=>g q щ,λq hq=>d q щ⟩ | succ c o => intro i e Y n j l g d have k:i.toNat < B.size:=by omega have h:=uLt B i p k rw [cv,AT h]; dsimp only have a:(i+1).toNat=i.toNat+1:=Dense.ac h have m:B.uget i (Dense.cD h)=B[i.toNat]! := s5uget B i (Dense.cD h) rw [m] refine o (i+1) _ _ щ щ (by rw [bW,l,a]) (λq hq => ?_) (λq hq => ?_) · rw [bW] at hq; rw [pg _ _ _ hq]; split · exact g q ‹_› · rw [show q=i.toNat by omega] · rw [mx32]; rw [a] at hq by_cases hq':q < i.toNat · exact (d q hq').trans (le_max_left _ _) · rw [show q=i.toNat by omega]; exact le_max_right _ _ lemma cv0 (B:Ἂ Word) (a:B.size < 2^31) : let r:=cv B 0 0 (kJ B.size) r.1.size=B.size∧(∀ q < B.size,r.1.data[q]! = dw B[q]!)∧(∀ q < B.size,(expOf B[q]!).toNat ≤ r.2.toNat) := cv_spec B a _ 0 0 _ rfl (by simp) (by simp [kJ,kS]) (fun q hq=>by simp [kJ,kS] at hq) (λq hq=>by simp at hq) def gK2 (m k n:Nat) (A B:Ἂ Word) (c : {v // v=cF (A,m,k)}) (r:ἀ × ἇ) (hr:r=cv B 0 0 (kJ B.size)):Ἂ Word := let L:=Aq (k+1)+1 let P:=48+c.1.2.toNat+r.2.toNat if hc:c.1.2 < 255∧r.2 < 255∧P+L ≤ 425∧L ≤ 27∧A.size=m*k∧B.size=k*n∧0 < k∧m*k+n < 2^31∧k*n < 2^31∧k < 2^31 then let hh:=P+2*L-54 rs A B c.1.1 r.1 m k n hh.toUInt64 (wlo hh) (wsp hh) L k.toUSize n.toUSize (aa k (by omega)) (aa n (by omega)) (by rw [c.2]; exact (wcDF_spec A m k).1.ge) (by rw [hr]; exact ((cv0 B щ).1.trans hc.2.2.2.2.2.1).ge) щ (dw oneW*dw 0x80000000) 0 (lQ (m*n)) else gemmSpec 1 m k n A B def gK (m k n:Nat) (A B:Ἂ Word):Ἂ Word := gK2 m k n A B (wcGet3T wcK3eq (λa b=>wcK3eq_ok a b) cS 32 (A,m,k) (λk=>k.1) (λv=>tchP v.1) 3) (cv B 0 0 (kJ B.size)) rfl end GK namespace GK open Dense.F (kMm kSm ug) lemma ugB (Bd:ἀ) (b t nU c:Ἄ) (h:(b+t*nU+c).toNat < Bd.size) (e:b.toNat+t.toNat*nU.toNat+c.toNat < 2^31) : Bd.uget (b+t*nU+c) h=Bd.data[b.toNat+t.toNat*nU.toNat+c.toNat]! := by rw [ug]; congr 1 have a:(t*nU).toNat=t.toNat*nU.toNat:=kMm _ _ щ have d:(b+t*nU).toNat=b.toNat+t.toNat*nU.toNat:=by rw [kSm _ _ (by rw [a]; omega),a] rw [kSm _ _ (by rw [d]; omega),d] lemma ugA (Ad:ἀ) (a t:Ἄ) (h:(a+t).toNat < Ad.size) (c:a.toNat+t.toNat < 2^31) : Ad.uget (a+t) h=Ad.data[a.toNat+t.toNat]! := by rw [ug]; congr 1; exact kSm _ _ c end GK namespace GK open Dense.F (ao aoe aos kMm kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7 ug) lemma bnd (t k n j w:Nat) (c:t < k) (a:j+w ≤ n):j+t*n+w ≤ k*n:=by have:=ι n (show t+1 ≤ k by omega) rw [Ϡ,n4] at this; omega lemma m8_eq (A B:Ἂ Word) (Ad Bd:ἀ) (k n i j:Nat) (u lo D:ἆ) (L:Nat) (kU nU r bU:Ἄ) (K:r.toNat+kU.toNat ≤ Ad.size) (H:bU.toNat+8 ≤ nU.toNat) (F:kU.toNat*nU.toNat ≤ Bd.size) (J:kU.toNat=k) (d:nU.toNat=n) (z:r.toNat=i*k) (C:bU.toNat=j) (S:Ad.size < 2^31∧Bd.size < 2^31) : ∀ c (t:Ἄ) (v o l w p g m q:Ἅ) (a:Ἂ Word),k-t.toNat=c → t.toNat ≤ k → m8 A B Ad Bd k n i u lo D L kU nU r bU K H F t v o l w p g m q a = f8 A B k n i bU u lo D L (ao (λs=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k t.toNat v) (ao (λs=>Bd.data[j+s*n+1]! * Ad.data[i*k+s]!) k t.toNat o) (ao (λs=>Bd.data[j+s*n+2]! * Ad.data[i*k+s]!) k t.toNat l) (ao (λs=>Bd.data[j+s*n+3]! * Ad.data[i*k+s]!) k t.toNat w) (ao (λs=>Bd.data[j+s*n+4]! * Ad.data[i*k+s]!) k t.toNat p) (ao (λs=>Bd.data[j+s*n+5]! * Ad.data[i*k+s]!) k t.toNat g) (ao (λs=>Bd.data[j+s*n+6]! * Ad.data[i*k+s]!) k t.toNat m) (ao (λs=>Bd.data[j+s*n+7]! * Ad.data[i*k+s]!) k t.toNat q) a:=by subst J d C intro c;induction c with | zero => intro t v o l w p g m q a I O have x:=W1 I rw[m8,dite_eq_right (λh=>N8 (ε.mp h) x)] simp only[aoe _ _ _ _ x] | succ c N => intro t v o l w p g m q a I O have e:=N1 I have y:=Dense.ac (ε.mpr e) have T:=((bnd _ _ _ _ _ e H).trans F).trans S.2.le rw[m8,AT (ε.mpr e)];dsimp only rw[N] simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7];exact U1 (O1 ж _) T)) only[ugB,ugA Ad r t _ ((U1 (O1 e _) K).trans S.1),y,aos _ _ _ _ e,z,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7] ·rw[y,←X5,I,BK] ·rw[y];exact e lemma m4_eq (A B:Ἂ Word) (Ad Bd:ἀ) (k n i j:Nat) (u lo D:ἆ) (L:Nat) (kU nU r bU:Ἄ) (K:r.toNat+kU.toNat ≤ Ad.size) (H:bU.toNat+4 ≤ nU.toNat) (F:kU.toNat*nU.toNat ≤ Bd.size) (J:kU.toNat=k) (d:nU.toNat=n) (z:r.toNat=i*k) (C:bU.toNat=j) (S:Ad.size < 2^31∧Bd.size < 2^31) : ∀ c (t:Ἄ) (v o l w:Ἅ) (a:Ἂ Word),k-t.toNat=c → t.toNat ≤ k → m4 A B Ad Bd k n i u lo D L kU nU r bU K H F t v o l w a = f4 A B k n i bU u lo D L (ao (λs=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k t.toNat v) (ao (λs=>Bd.data[j+s*n+1]! * Ad.data[i*k+s]!) k t.toNat o) (ao (λs=>Bd.data[j+s*n+2]! * Ad.data[i*k+s]!) k t.toNat l) (ao (λs=>Bd.data[j+s*n+3]! * Ad.data[i*k+s]!) k t.toNat w) a:=by intro c;induction c with | zero => intro t v o l w a I O have x:k≤ t.toNat:=by omega rw[m4,dite_eq_right (λh=>by have:=ε.mp h;omega)] simp only[aoe _ _ _ _ x] | succ c N => intro t v o l w a I O have e:t.toNat< k:=by clear * - I;omega have h:t< kU:=ε.mpr (by rw[J];exact e) have y:(t+1).toNat=t.toNat+1:=Dense.ac h have G:=bnd t.toNat k n j 4 e (by rw[←C,←d];exact H) have M:k*n≤ Bd.size:=by rw[←J,←d];exact F have g:bU.toNat+t.toNat*n+4≤2^31:=by rw[C];exact (G.trans M).trans S.2.le have m:r.toNat+t.toNat<2^31:=N3 (U1 (O1 (show t.toNat< kU.toNat by rw[J];exact e) _) K) S.1 rw[m4,AT h];dsimp only rw[ugA Ad r t _ m,ugB Bd bU t nU 0 _ (by rw[kc0,d];exact U1 (O1 (by decide) _) g), ugB Bd bU t nU 1 _ (by rw[kc1,d];exact U1 (O1 ж _) g), ugB Bd bU t nU 2 _ (by rw[kc2,d];exact U1 (O1 ж _) g), ugB Bd bU t nU 3 _ (by rw[kc3,d];exact U1 (O1 ж _) g)] rw[N (t+1) _ _ _ _ a (by rw[y];clear * - I;omega) (by rw[y];exact e)] simp only[y,aos _ _ _ _ e,z,C,d,kc0,kc1,kc2,kc3] lemma m1_eq (A B:Ἂ Word) (Ad Bd:ἀ) (k n i j:Nat) (u lo r:ἆ) (L:Nat) (kU nU e bU:Ἄ) (D:e.toNat+kU.toNat ≤ Ad.size) (y:bU.toNat+1 ≤ nU.toNat) (v:kU.toNat*nU.toNat ≤ Bd.size) (C:kU.toNat=k) (l:nU.toNat=n) (p:e.toNat=i*k) (q:bU.toNat=j) (J:Ad.size < 2^31∧Bd.size < 2^31) : ∀ c (t:Ἄ) (g:Ἅ) (a:Ἂ Word),k-t.toNat=c → t.toNat ≤ k → m1 A B Ad Bd k n i u lo r L kU nU e bU D y v t g a = a.push (fO A B k n i bU u lo r L (ao (λs=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k t.toNat g)):=by intro c; induction c with | zero => intro t g a z H have m:k ≤ t.toNat:=by omega rw [m1,dite_eq_right (λh=>by have:=ε.mp h; omega)] simp only [aoe _ _ _ _ m] | succ c G => intro t g a z H have d:t.toNat < k:=by omega have h:t < kU:=ε.mpr щ have o:(t+1).toNat=t.toNat+1:=Dense.ac h have x:=bnd t.toNat k n j 1 d щ have F:k*n ≤ Bd.size:=by rw [← C, ← l]; exact v rw [m1,AT h]; dsimp only have I:(bU+t*nU)=(bU+t*nU+0):=by simp rw [ugA Ad e t _ щ] rw [show Bd.uget (bU+t*nU) _=Bd.data[bU.toNat+t.toNat*nU.toNat+(0:Ἄ).toNat]! from by rw [ug]; congr 1; rw [kc0,ϑ] have w:(t*nU).toNat=t.toNat*nU.toNat:=kMm _ _ (by rw [l]; omega) rw [kSm _ _ (by rw [w,l]; omega),w]] rw [G (t+1) _ a щ щ] simp only [o,aos _ _ _ _ d,p,q,l,kc0] end GK namespace GK open Core (aG aK af tm) open Dense.F (ao bC dJ dL dM dw dz fv jE rv tf tw) open Conv (fz_ak wlo wok wsp) lemma bnd2 (k P L:Nat) (d:k+2 ≤ 2^L) : (k:ℝ)*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=by have c:(k:ℝ) ≤ (2:ℝ)^L:=by exact_mod_cast (show k ≤ 2^L by omega) have a:(0:ℝ) ≤ (2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ):=by positivity calc (k:ℝ)*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)) ≤ (2:ℝ)^L*((2:ℝ)^(P+L)*(2:ℝ)^(-54:ℤ)):=AE c a _=(2:ℝ)^(((L+(P+L):ℕ):ℤ)+(-54)):=by rw [← Ap, ← AF, ← AA, ← AK (AL)] _ ≤ (2:ℝ)^(((P+2*L-54:ℕ)):ℤ):=AG one_le_two щ lemma jW (g:Ἆ) (k:Nat) (d e:Nat → Word) (p:Nat → Ἅ) (h:Unit → Ἅ) (u:ἆ) (P L:Nat) (B:Unit → Word) (S:Ἅ) (K:∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ)) (q:fv (h ())∧rv (h ())=(tm (d k) (e k):ℝ)) (jg:aG (k+1) d e) (E:∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P) (i:k+2 ≤ 2^L) (o:L ≤ 27) (r:P+L ≤ 425) (w:u=(P+2*L-54).toUInt64) (G:B ()=act g (dotOf (k+1) d e)) (j:S=ao p k 0 (h ())) : tw g S u L k p h B=act g (dotOf (k+1) d e):=by have n:u.toNat=P+2*L-54:=by rw [w]; exact Α (by have:n0=2^64:=rfl; omega) have l : ∀ m t a,k-t=m → ao p k t a=bC (λ_=>false) p k t a:=dM p k have L1:=dL (λ_=>false) p (λs=>tm (d s) (e s)) (tm (d k) (e k)) P L k (λt c=>K t c) (λt _ v=>by simp at v) (λt c=>E t c.le) (E k AP) i o щ k 0 (h ()) щ (ϟ _) q.1 (by rw [q.2]; simp) exact jE g k d e p h u P L B K q jg E i o r n G S (by rw [j,l k 0 _ (by omega)]; exact L1.1) (by rw [j,l k 0 _ щ,aK,n]; refine AZ (le_of_eq ?_) (L1.2.trans (bnd2 k P L i)); congr 1; push_cast [af]; ring) lemma fO_eq (A B:Ἂ Word) (k n i:Nat) (c:Ἄ) (u lo m:ἆ) (L P:Nat) (S:Ἅ) (F:0 < k) (a : ∀ t < k,expOf A[i*k+t]! ≠ 255∧expOf B[t*n+c.toNat]! ≠ 255) (I : ∀ t < k, |(tm B[t*n+c.toNat]! A[i*k+t]! : ℝ)| ≤ 2^P) (C:k+2 ≤ 2^L) (y:L ≤ 27) (D:P+L ≤ 425) (r:u=(P+2*L-54).toUInt64) (o:lo=wlo (P+2*L-54)) (j:m=wsp (P+2*L-54)) (w:S=ao (λs=>dw B[s*n+c.toNat]! * dw A[i*k+s]!) k 0 (dw oneW*dw 0x80000000)) : fO A B k n i c u lo m L S=dotOf k (λt=>A[i*k+t]!) (λt=>B[t*n+c.toNat]!):=by let d:Nat → Word:=λt=>if t < k then B[t*n+c.toNat]! else oneW let e:Nat → Word:=λt=>if t < k then A[i*k+t]! else 0x80000000 let p:Nat → Ἅ:=λt=>dw B[t*n+c.toNat]! * dw A[i*k+t]! let h:Unit → Ἅ:=λ_=>dw oneW*dw 0x80000000 let l:Unit → Word:=λ_=>dotOf k (λt=>A[i*k+t]!) (λt=>B[t*n+c.toNat]!) have K : ∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ):=by intro s g; simp only [p,d,e,AD g]; exact dJ _ _ (a s g).2 (a s g).1 have q:fv (h ())∧rv (h ())=(tm (d k) (e k):ℝ):=by simp only [h,d,e,AX,ἂ]; exact dJ oneW 0x80000000 ж ж have jg:aG (k+1) d e:=by intro s g; by_cases h':s < k · simp only [d,e,AD h']; exact ⟨(a s h').2,(a s h').1⟩ · simp only [d,e,AC h']; exact ⟨by decide,by decide⟩ have x:tm oneW 0x80000000=0:=by have H:O7 0x80000000=0:=by decide simp only [tm,H,mul_zero,zero_mul] have E : ∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P:=by intro s g; by_cases h':s < k · simp only [d,e,AD h']; exact I s h' · simp only [d,e,AC h',x]; simp only [lH,A5]; positivity have G:l ()=act false (dotOf (k+1) d e):=by have g0:aG k (λt=>A[i*k+t]!) (λt=>B[t*n+c.toNat]!):=λt J=>a t J have:=dz k (λt=>A[i*k+t]!) (λt=>B[t*n+c.toNat]!) F g0 simp only [act,υ,ἂ]; exact this.symm have T:=jW false k d e p h u P L l S K q jg E C y D r G w have v:tw false S u L k p h l=dotOf k (λt=>A[i*k+t]!) (λt=>B[t*n+c.toNat]!):=by rw [T]; simp only [act,υ,ἂ]; exact (G.trans (by simp only [act,υ,ἂ])).symm unfold fO rw [fz_ak S lo m u (by rw [r,o,j]; exact wok _ щ)] dsimp only; split · rename_i z; rw [← v]; unfold tw tf; simp only [Yd,υ,ἂ] rw [AD z]; simp only [act,υ,ἂ] · exact v end GK namespace GK open Core (tm) open Dense.F (ao aoe aos dw) open Conv (wlo wsp) lemma ao_congr (p d:Nat → Ἅ) (n:Nat) : ∀ c t a,n-t=c → (∀ s,t ≤ s → s < n → p s=d s) → ao p n t a=ao d n t a:=by intro c; induction c with | zero=>intro t a h _; rw [aoe _ _ _ _ щ,aoe _ _ _ _ щ] | succ c i => intro t a h e rw [aos p n t a щ,aos d n t a щ,e t AP щ] exact i (t+1) _ щ (λs j g=>e s щ g) lemma pushF (a:Ἂ Word) (F:Nat → Word) (s:Nat) (c:a.size=s) (d : ∀ q < s,a[q]! = F q) (v:Word) (e:v=F s):(a.push v).size=s+1 ∧ ∀ q < s+1,(a.push v)[q]! = F q:=by refine ⟨by simp [c],λq hq => ?_⟩ by_cases h:q < s · rw [AB (a.push v) q (by simp; omega),nU (by omega), ← AB a q (by omega)] exact d q h · have hq:q=a.size:=by omega rw [AB (a.push v) q (by simp; omega)]; simp only [hq,nV]; rw [e,c] abbrev R (A B:Ἂ Word) (k n i j:Nat):Word:=dotOf k (λt=>A[i*k+t]!) (λt=>B[t*n+j]!) structure Cx (A B:Ἂ Word) (Ad Bd:ἀ) (m k n:Nat) (u lo sp:ἆ) (L P:Nat) (z:Ἅ):Prop where hAd : ∀ q < m*k,Ad.data[q]! = dw A[q]! hBd : ∀ q < k*n,Bd.data[q]! = dw B[q]! hz:z=dw oneW*dw 0x80000000 hk0:0 < k hfin : ∀ i < m, ∀ j < n, ∀ t < k,expOf A[i*k+t]! ≠ 255∧expOf B[t*n+j]! ≠ 255 hE : ∀ i < m, ∀ j < n, ∀ t < k, |(tm B[t*n+j]! A[i*k+t]! : ℝ)| ≤ 2^P hN:k+2 ≤ 2^L hD:L ≤ 27 hJ:P+L ≤ 425 hu:u=(P+2*L-54).toUInt64 hlo:lo=wlo (P+2*L-54) hsp:sp=wsp (P+2*L-54) lemma lane {A B:Ἂ Word} {Ad Bd:ἀ} {m k n:Nat} {u lo g:ἆ} {L P:Nat} {z:Ἅ} (C:Cx A B Ad Bd m k n u lo g L P z) (i j l:Nat) (c:Ἄ) (hi:i < m) (d:j+l < n) (a:c.toNat=j+l) : fO A B k n i c u lo g L (ao (λs=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z)=R A B k n i (j+l):=by have e:=fO_eq A B k n i c u lo g L P (ao (λs=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z) C.hk0 (λt h=>by rw [a]; exact C.hfin i hi (j+l) d t h) (λt h=>by rw [a]; exact C.hE i hi (j+l) d t h) C.hN C.hD C.hJ C.hu C.hlo C.hsp (by rw [C.hz]; refine ao_congr _ _ k k 0 _ щ (λs _ q => ?_) have p:s*n+(j+l) < k*n:=by have:=ι n (show s+1 ≤ k by omega); rw [Ϡ,n4] at this; omega have o:i*k+s < m*k:=by have:=ι k (show i+1 ≤ m by omega); rw [Ϡ,n4] at this; omega rw [show j+s*n+l=s*n+(j+l) by ring,C.hBd _ p,C.hAd _ o,a]) rw [e,a] end GK namespace GK open Dense.F (ao kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7) open Conv (aa) lemma dm (i n r:Nat) (a:r < n):(i*n+r)/n=i∧(i*n+r)%n=r:=by constructor · rw [Τ,Ρ _ _ щ,ώ a,Κ] · rw [Τ,Μ,γ a] lemma uj (j l:Nat) (lU:Ἄ) (a:lU.toNat=l) (h:j+l < 2^31):(j.toUSize+lU).toNat=j+l:=by rw [kSm _ _ (by rw [aa j щ,a]; omega),aa j щ,a] lemma push4 (a:Ἂ Word) (F:Nat → Word) (s:Nat) (m:a.size=s) (o : ∀ q < s,a[q]! = F q) (e d g c:Word) (k:e=F s) (n:d=F (s+1)) (l:g=F (s+2)) (j:c=F (s+3)) : ((((a.push e).push d).push g).push c).size=s+4 ∧ ∀ q < s+4,((((a.push e).push d).push g).push c)[q]! = F q:=by have p0:=pushF a F s m o e k have i:=pushF _ F (s+1) p0.1 p0.2 d n have p2:=pushF _ F (s+1+1) i.1 i.2 g l have h:=pushF _ F (s+1+1+1) p2.1 p2.2 c j exact ⟨h.1,λq hq=>h.2 q щ⟩ lemma push8 (d:Ἂ Word) (F:Nat → Word) (s:Nat) (x:d.size=s) (w : ∀ q < s,d[q]! = F q) (m j e i k g h l:Word) (r:m=F s) (o:j=F (s+1)) (p:e=F (s+2)) (y:i=F (s+3)) (n:k=F (s+4)) (u:g=F (s+5)) (t:h=F (s+6)) (v:l=F (s+7)) : ((((((((d.push m).push j).push e).push i).push k).push g).push h).push l).size=s+8 ∧ ∀ q < s+8,((((((((d.push m).push j).push e).push i).push k).push g).push h).push l)[q]! = F q:=by have a:=push4 d F s x w m j e i r o p y have b:=push4 _ F (s+4) a.1 a.2 k g h l n (by rw [u]) (by rw [t]) (by rw [v]) exact ⟨b.1,λq hq=>b.2 q щ⟩ lemma x8D1 {a b:Nat} (h:a≤b) (o:b<2^31):a<2^(32:Nat):=N3 (C0 h o) ж lemma x8D2 {n j c k:Nat} (y:n-j=c) (G:j+k≤n) (p:0 intro j a y V d J have w:((i*k).toUSize).toNat=i*k:=aa (i*k) (x8D1 ((ι k (U2 hi)).trans (V1 _ _)) o) have U:∀ l,j+l< n→ R A B k n i (j+l)=R A B k n ((i*n+j+l)/n) ((i*n+j+l)%n):=by intro l v;have e:=dm i n (j+l) v;rw[show i*n+j+l=i*n+(j+l) by ring,e.1,e.2] have h:∀ l (lU:Ἄ),lU.toNat=l→ j+l< n → fO A B k n i (j.toUSize+lU) u lo p L (ao (λs=>Bd.data[j+s*n+l]! * Ad.data[i*k+s]!) k 0 z) = R A B k n ((i*n+j+l)/n) ((i*n+j+l)%n):=by intro l lU v g;rw[←U l g];exact lane C i j l _ hi g (uj j l lU v (N3 (U1 g (H0 _ _)) o)) have S:j< n→ fO A B k n i j.toUSize u lo p L (ao (λs=>Bd.data[j+s*n+0]! * Ad.data[i*k+s]!) k 0 z) = R A B k n ((i*n+j+0)/n) ((i*n+j+0)%n):=by intro g;rw[←U 0 g];exact lane C i j 0 _ hi g (by rw[aa j (x8D1 (U2 (U1 g (H0 _ _))) o)];rfl) rw[rw];split ·rename_i G rw[m8_eq A B Ad Bd k n i j u lo p L kU nU _ _ _ _ _ F H w (aa j (x8D1 ((V1 j 8).trans (G.trans (H0 _ _))) o)) ⟨r,t⟩ k 0 z z z z z z z z a ц ц] unfold f8 simp only[kc0] have Y8:∀ l,l<8→ j+lU1 (O1 v j) G have N:=push8 a _ (i*n+j) d (fun q hq=>J q (by rw[d];exact hq)) _ _ _ _ _ _ _ _ (S (Y8 0 ж)) (h 1 1 kc1 (Y8 1 ж)) (h 2 2 kc2 (Y8 2 ж)) (h 3 3 kc3 (Y8 3 ж)) (h 4 4 kc4 (Y8 4 ж)) (h 5 5 kc5 (Y8 5 ж)) (h 6 6 kc6 (Y8 6 ж)) (h 7 7 kc7 (Y8 7 ж)) exact M (c-8) (x8D2 y G ж) (j+8) _ (by rw[←y,X5]) G (by rw[N.1];ring) (λq hq=>N.2 q (by rw[N.1]at hq;clear * - hq;omega)) ·rename_i G;split ·rename_i D rw[m4_eq A B Ad Bd k n i j u lo p L kU nU _ _ _ _ _ F H w (aa j (x8D1 ((V1 j 4).trans (D.trans (H0 _ _))) o)) ⟨r,t⟩ k 0 z z z z a ц ц] unfold f4 simp only[kc0] have I:∀ l,l<4→ j+lU1 (O1 v j) D have O:=push4 a _ (i*n+j) d (fun q hq=>J q (by rw[d];exact hq)) _ _ _ _ (S (I 0 ж)) (h 1 1 kc1 (I 1 ж)) (h 2 2 kc2 (I 2 ж)) (h 3 3 kc3 (I 3 ж)) exact M (c-4) (x8D2 y D ж) (j+4) _ (by rw[←y,X5]) D (by rw[O.1];ring) (λq hq=>O.2 q (by rw[O.1]at hq;clear * - hq;omega)) ·rename_i D;split ·rename_i x rw[m1_eq A B Ad Bd k n i j u lo p L kU nU _ _ _ _ _ F H w (aa j (x8D1 (U2 (U1 x (H0 _ _))) o)) ⟨r,t⟩ k 0 z a ц ц] simp only[kc0] have K:=pushF a _ (i*n+j) d (λq hq=>J q (by rw[d];exact hq)) _ (S x) exact M (c-1) (x8D2 y x ж) (j+1) _ (by rw[←y,X5]) x (by rw[K.1];ring) (λq hq=>K.2 q (by rw[K.1]at hq;clear * - hq;omega)) ·rename_i x have:j=n:=N2 V (V3 x) subst this exact ⟨by rw[d];ring,λq hq=>J q (by rw[d];rw[Ϡ,n4]at hq;exact hq)⟩ end GK namespace GK open Dense.F (aO bd dh dw wcDF wcDF_spec) open Conv (aa wlo wsp) lemma rs_spec {A B:Ἂ Word} {Ad Bd:ἀ} {m k n:Nat} {u lo h:ἆ} {L P:Nat} {z:Ἅ} (C:Cx A B Ad Bd m k n u lo h L P z) (kU nU:Ἄ) (j:kU.toNat=k) (p:nU.toNat=n) (hA:m*k ≤ Ad.size) (o:k*n ≤ Bd.size) (r:m*k+n < 2^31) (l:Ad.size < 2^31) (g:Bd.size < 2^31) : ∀ c i (a:Ἂ Word),m-i=c → i ≤ m → a.size=i*n → (∀ q < a.size,a[q]! = R A B k n (q/n) (q%n)) → (rs A B Ad Bd m k n u lo h L kU nU j p hA o r z i a).size=m*n ∧ ∀ q < m*n,(rs A B Ad Bd m k n u lo h L kU nU j p hA o r z i a)[q]! = R A B k n (q/n) (q%n):=by intro c; induction c with | zero => intro i a t hi d s have:i=m:=N2 hi (W1 t) subst this rw [rs,dite_eq_right (K4 _)] exact ⟨d,λq hq=>s q (hq.trans_eq d.symm)⟩ | succ c v => intro i a t hi d s have e:i < m:=N1 t rw [rs,AT e] have W:=rw_spec C kU nU j p hA o r l g i e (n-0) 0 a rfl (ϟ _) d s exact v (i+1) _ (by clear * - t;omega) e W.1 (λq hq=>W.2 q (hq.trans_eq W.1)) lemma gK2_eq (m k n:Nat) (A B:Ἂ Word) (c : {v // v=cF (A,m,k)}) (r:ἀ × ἇ) (hr:r=cv B 0 0 (kJ B.size)):gK2 m k n A B c r hr=gemmSpec 1 m k n A B:=by unfold gK2; dsimp only; split · rename_i hc obtain ⟨heA,heB,hPL,hL27,hAs,hBs,hk0,hs1,hs2,hk31⟩:=hc have hcv:=cv0 B (hBs.trans_lt hs2) rw [← hr] at hcv have hc1:c.1.1=wcDF (A,m,k):=by rw [c.2]; rfl have hc2:c.1.2=aO A 0 0:=by rw [c.2]; rfl have hAd:=wcDF_spec A m k rw [← hc1] at hAd have bA:=λq=>bd A (by have:=ς; clear * - this hAs hs1;omega) (by rw [← hc2]; exact heA) q have hN:k+2 ≤ 2^(Aq (k+1)+1):=ϙ let P:=48+c.1.2.toNat+r.2.toNat let L:=Aq (k+1)+1 have C:Cx A B c.1.1 r.1 m k n (P+2*L-54).toUInt64 (wlo (P+2*L-54)) (wsp (P+2*L-54)) L P (dw oneW*dw 0x80000000) := { hAd:=λq hq=>hAd.2 q hq hBd:=λq hq=>hcv.2.1 q (hq.trans_eq hBs.symm) hz:=rfl hk0:=hk0 hfin:=λi hi j hj t ht=>by refine ⟨(bA _).1,λe => ?_⟩ have:=hcv.2.2 (t*n+j) ((U1 (O1 hj _) ((Ο t n).symm.trans_le (ι n ht))).trans_eq hBs.symm); rw [e] at this exact AX _ (this.trans_lt (Ι.mp heB)) hE:=λi hi j hj t ht=>by have gB:idxOf B[t*n+j]! ≤ r.2.toNat:=by rw [Dense.aT]; exact (I2 _ _).trans (hcv.2.2 (t*n+j) ((U1 (O1 hj _) ((Ο t n).symm.trans_le (ι n ht))).trans_eq hBs.symm)) have gA:idxOf A[i*k+t]! ≤ c.1.2.toNat:=by rw [hc2]; exact (bA (i*k+t)).2.trans (I2 _ _) have:=dh B[t*n+j]! A[i*k+t]! _ _ gB gA refine this.trans (le_of_eq ?_); congr 1; exact lO _ _ _ hN:=hN hD:=hL27 hJ:=hPL hu:=rfl hlo:=rfl hsp:=rfl } have R0:=rs_spec C k.toUSize n.toUSize (aa k (U1 hk31 (by decide))) (aa n (U1 (C0 (H0 _ _) hs1) (by decide))) (by rw [hAd.1]) (by rw [hcv.1,hBs]) hs1 (hAd.1.trans_lt (C0 (V1 _ _) hs1)) (hcv.1.trans_lt (hBs.trans_lt hs2)) (m-0) 0 (lQ (m*n)) rfl (ϟ _) ц ц have gs:(gemmSpec 1 m k n A B).size=1*(m*n):=Ϝ apply mi · rw [R0.1,gs,n4] · intro q h1 h2 have h1':q < m*n:=by rw [R0.1] at h1; exact h1 rw [← AB _ q h1, ← AB _ q h2,R0.2 q h1'] have hi:q/n < m:=Ϟ (by rw [Ϗ]; exact h1') have e1:q/(m*n)=0:=ώ h1' have e2:q/n%m=q/n:=γ hi rw [AB _ q (by rwa [gs,n4])] simp only [gemmSpec,gemmWith,Λ,R] simp only [e1,e2,ϳ,Κ] · rfl lemma gK_eq (m k n:Nat) (A B:Ἂ Word):gK m k n A B=gemmSpec 1 m k n A B:=gK2_eq _ _ _ _ _ _ _ _ end GK def gC(batch m k n:Nat)(A B:Ἂ Word):Ἂ Word:= if batch==1 then GK.gK m k n A B else gemmSpec batch m k n A B lemma gCv:gC=gemmSpec:=by funext batch m k n A B unfold gC split · rename_i h have a:batch=1:=by simpa using h subst a; exact GK.gK_eq m k n A B · rfl def pdX:Nat→UInt64→UInt64 |0,z=>z |n+1,z=>let y:=z^^^(z<<<13);let y:=y^^^(y>>>7);pdX n (y^^^(y<<<17)) def gPd(batch m k n:Nat)(A B:Ἂ Word):Ἂ Word:= if Dense.F.Yarm&&batch==1&&m==16&&k==16&&n==4 then if pdX 7000 (B.size.toUInt64|||(B.getD 0 0).toUInt64<<<8)==0 then gC batch m k n A (B.push 0).pop else gC batch m k n A B else gC batch m k n A B theorem gPdv:gPd=gemmSpec:=by funext batch m k n A B;simp only[gPd,Array.pop_push,ite_self,gCv] @[inline]def cvOk(s:B4):Ἆ:= 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 n) have y:s.depthwise.taps=s.kh*s.kw:=by simp only[L8,C6,C4,Vq k,n4] have v:s.depthwise.opg=1:=by simp only[W9,C4,Vq k] have D:s.depthwise.cpg=1:=by simp only[C6,C4,Vq k] simp only[Λ,y,v,I4] rw[r,p] generalize q/((cvO s).ho*(cvO s).wo)=o congr 2 funext t simp only[cvO] by_cases ht:tby simp[z]at c) have i:q/(s.w/s.kh)%(s.h/s.kh)by simp[z]at c) have i:q/(s.w/s.kh)%(s.h/s.kh)true | n+1=>zt Xd b kh 0&&zw Xd hU kh (b+hU) n @[noinline] def sO (X W b : @& Ἂ Word) (relu:Ἆ) (kh k h bo o : @& Nat) (yU:Ἄ) (u:ἆ) (L : @& Nat) (S:Ἅ):Word := tw relu S u L k (λt=>dw X[bo+t/kh*h+t%kh+yU.toNat]! * dw W[o*k+t]!) (λ_=>dw oneW*dw b[o]!) (λ_=>act relu (dotOf (k+1) (λt=>if t < k then X[bo+t/kh*h+t%kh+yU.toNat]! else oneW) (λt=>if t < k then W[o*k+t]! else b[o]!))) @[inline] def fZ (X W b : @& Ἂ Word) (Xd : @& ἀ) (relu:Ἆ) (kh k h bo o cp : @& Nat) (yU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (S:Ἅ):Word := let c:=fz S lo sp u if c < 4294967296 then act relu c.toUInt32 else if b[o]! == 0&&zw Xd h.toUSize kh.toUSize (bo.toUSize+yU) cp then act relu 0 else sO X W b relu kh k h bo o yU u L S @[noinline] def f8 (X W b : @& Ἂ Word) (Xd : @& ἀ) (relu:Ἆ) (kh k h bo o cp : @& Nat) (yU:Ἄ) (u lo sp:ἆ) (L : @& Nat) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := ((((((((out.push (fZ X W b Xd relu kh k h bo o cp yU u lo sp L a0)).push (fZ X W b Xd relu kh k h bo o cp (yU+1) u lo sp L a1)).push (fZ X W b Xd relu kh k h bo o cp (yU+2) u lo sp L a2)).push (fZ X W b Xd relu kh k h bo o cp (yU+3) u lo sp L a3)).push (fZ X W b Xd relu kh k h bo o cp (yU+4) u lo sp L a4)).push (fZ X W b Xd relu kh k h bo o cp (yU+5) u lo sp L a5)).push (fZ X W b Xd relu kh k h bo o cp (yU+6) u lo sp L a6)).push (fZ X W b Xd relu kh k h bo o cp (yU+7) u lo sp L a7)) lemma hR (g:ἀ) (bU c a e d:Ἄ) (w:Nat) (j:c < d) (i : ∀ h:Nat,h < d.toNat → bU.toNat+h*a.toNat+e.toNat+w ≤ g.size):(bU+c*a+e).toNat+w ≤ g.size:=by have m:(bU+c*a+e).toNat ≤ bU.toNat+(c*a).toNat+e.toNat:=by rw [lJ,lJ] exact (Ay _ _).trans (L1 (Ay _ _) _) have l:(c*a).toNat ≤ c.toNat*a.toNat:=by rw [BO]; exact Ay _ _ have k:=i c.toNat (ε.mp j) omega lemma hQ (e:ἀ) (d c a:Ἄ) (m:Nat) (g:c < a) (j:d.toNat+m*a.toNat ≤ e.size) (mU:Ἄ) (h:mU.toNat=m) : (d+mU*c).toNat+m ≤ e.size:=by have l:(d+mU*c).toNat ≤ d.toNat+(mU*c).toNat:=by rw [lJ]; exact Ay _ _ have k:(mU*c).toNat ≤ m*c.toNat:=by rw [BO,h]; exact Ay _ _ have i:=ε.mp g have n:m*c.toNat+m ≤ m*a.toNat:=by have:=U0 m (show c.toNat+1 ≤ a.toNat by omega); rwa [Ht,ϻ] at this omega lemma h3l {k:Nat} (j:Ἄ) {X:ἀ} (c:j.toNat+3 ≤ X.size) : (j + @A9 Ἄ k _).toNat < X.size+(k-2):=by have a:(j + @A9 Ἄ k _).toNat ≤ j.toNat+k := (lJ _ _).trans_le (N0 (Ay _ _) (J1 ((Z9).trans_le (Ay _ _)) _)) omega lemma h10 {k:Nat} (j:Ἄ) {X:ἀ} (c:j.toNat+10 ≤ X.size) : (j + @A9 Ἄ k _).toNat < X.size+(k-9):=by have a:(j + @A9 Ἄ k _).toNat ≤ j.toNat+k := (lJ _ _).trans_le (N0 (Ay _ _) (J1 ((Z9).trans_le (Ay _ _)) _)) omega def m8 (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu:Ἆ) (kh k h bo o : @& Nat) (u lo sp:ἆ) (L : @& Nat) (cpU hU boU wU yU:Ἄ) (hx : ∀ c':Nat,c' < cpU.toNat → boU.toNat+c'*hU.toNat+yU.toNat+10 ≤ Xd.size) (hw:wU.toNat+3*cpU.toNat ≤ Wd.size) (c:Ἄ) (a0 a1 a2 a3 a4 a5 a6 a7:Ἅ) (out:Ἂ Word):Ἂ Word := if hc:c < cpU then let r:=boU+c*hU+yU have hr:r.toNat+10 ≤ Xd.size:=hR Xd boU c hU yU cpU 10 hc hx let q:=wU+3*c have hq:q.toNat+3 ≤ Wd.size:=hQ Wd wU c cpU 3 hc hw 3 kc3 let w0:=Wd.uget (q+0) (h3l q hq) let w1:=Wd.uget (q+1) (h3l q hq) let w2:=Wd.uget (q+2) (h3l q hq) let x0:=Xd.uget (r+0) (h10 r hr) let x1:=Xd.uget (r+1) (h10 r hr) let x2:=Xd.uget (r+2) (h10 r hr) let x3:=Xd.uget (r+3) (h10 r hr) let x4:=Xd.uget (r+4) (h10 r hr) let x5:=Xd.uget (r+5) (h10 r hr) let x6:=Xd.uget (r+6) (h10 r hr) let x7:=Xd.uget (r+7) (h10 r hr) let x8:=Xd.uget (r+8) (h10 r hr) let x9:=Xd.uget (r+9) (h10 r hr) m8 X W b Xd Wd relu kh k h bo o u lo sp L cpU hU boU wU yU hx hw (c+1) (a0+x0*w0+x1*w1+x2*w2) (a1+x1*w0+x2*w1+x3*w2) (a2+x2*w0+x3*w1+x4*w2) (a3+x3*w0+x4*w1+x5*w2) (a4+x4*w0+x5*w1+x6*w2) (a5+x5*w0+x6*w1+x7*w2) (a6+x6*w0+x7*w1+x8*w2) (a7+x7*w0+x8*w1+x9*w2) out else f8 X W b Xd relu kh k h bo o cpU.toNat yU u lo sp L a0 a1 a2 a3 a4 a5 a6 a7 out termination_by cpU.toNat-c.toNat decreasing_by exact Z3 (ε.mp hc) (N4 (M1 _) (Dense.ac hc).symm) lemma rX (d:ἀ) (bo h y a w:Nat) (l:bo+a*h ≤ d.size) (k:y+w ≤ h) (e:1 ≤ w) (m:bo+a*h < 2^31) : ∀ c:Nat,c < a.toUSize.toNat → bo.toUSize.toNat+c*h.toUSize.toNat+y.toUSize.toNat+w ≤ d.size:=by intro c i have n:1 ≤ h:=by omega have g:a ≤ a*h:=H1 a щ rw [aa a щ] at i have j:h ≤ a*h:=lZ h щ rw [aa bo щ,aa h щ,aa y щ] have:c*h+h ≤ a*h:=by have:=ι h (show c+1 ≤ a by omega); rwa [Ϡ,n4] at this omega lemma rW (d:ἀ) (o k kh a:Nat) (c:k=kh*a) (g:1 ≤ kh) (ho:o*k+k ≤ d.size) (h:o*k+k < 2^31) : (o*k).toUSize.toNat+kh*a.toUSize.toNat ≤ d.size:=by have e:a ≤ k:=by rw [c]; exact lZ a щ rw [aa (o*k) щ,aa a щ, ← c]; exact ho def rw (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu D:Ἆ) (cp kh k h ho : @& Nat) (u lo sp:ἆ) (L : @& Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (o:Nat) (hXo:(if D then o*h else 0)+cp*h ≤ Xd.size) (hWo:o*k+k ≤ Wd.size) (hs:(if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (z:Ἅ) (y:Nat) (out:Ἂ Word):Ἂ Word := let bo:=if D then o*h else 0 if h8:y+8 ≤ ho then rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o hXo hWo hs z (y+8) (m8 X W b Xd Wd relu kh k h bo o u lo sp L cp.toUSize h.toUSize bo.toUSize (o*k).toUSize y.toUSize (rX Xd bo h y cp 10 hXo щ щ щ) (rW Wd o k 3 cp (by rw [hk,hkh]) щ hWo щ) 0 z z z z z z z z out) else if h1:y < ho then out ++ (m8 X W b Xd Wd relu kh k h bo o u lo sp L cp.toUSize h.toUSize bo.toUSize (o*k).toUSize (ho-8).toUSize (rX Xd bo h (ho-8) cp 10 hXo щ щ щ) (rW Wd o k 3 cp (by rw [hk,hkh]) щ hWo щ) 0 z z z z z z z z (lQ 8)).extract (y+8-ho) 8 else out termination_by ho-y decreasing_by exact Z3 (U1 (V4 ж) h8) (V4 ж) def rs (X W b : @& Ἂ Word) (Xd Wd : @& ἀ) (relu D:Ἆ) (cp kh k h ho co : @& Nat) (u lo sp:ἆ) (L : @& Nat) (hk:k=kh*cp) (hcp:0 < cp) (hho:ho+kh=h+1) (hkh:kh=3) (h8o:8 ≤ ho) (hXs : ∀ o,o < co → (if D then o*h else 0)+cp*h ≤ Xd.size) (hWs:co*k ≤ Wd.size) (hS : ∀ o,o < co → (if D then o*h else 0)+cp*h+h+o*k+k < 2^31) (o:Nat) (out:Ἂ Word):Ἂ Word := if ho':o < co then rs X W b Xd Wd relu D cp kh k h ho co u lo sp L hk hcp hho hkh h8o hXs hWs hS (o+1) (rw X W b Xd Wd relu D cp kh k h ho u lo sp L hk hcp hho hkh h8o o (hXs o ho') (by have:=ι k (show o+1 ≤ co by omega); rw [Ϡ,n4] at this; omega) (hS o ho') (dw oneW*dw b[o]!) 0 out) else out termination_by co-o decreasing_by exact Z3 ho' (M1 o) def run2 (D:Ἆ) (kh cin h cout:Nat) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (c : {v // v=GK.cF (W,(if D then cin else cout),kh*(if D then 1 else cin))}) (r:ἀ × ἇ) (hr:r=GK.cv X 0 0 (kJ X.size)):Ἂ Word := let cp:=if D then 1 else cin let co:=if D then cin else cout let k:=kh*cp let eB:=aO b 0 0 let L:=Aq (k+2)+1 let P:=max (48+c.1.2.toNat+r.2.toNat) (174+eB.toNat) if hc:kh=3∧c.1.2 < 255∧r.2 < 255∧eB < 255∧P+L ≤ 425∧L ≤ 27∧X.size=cin*h∧W.size=co*k ∧ b.size=co∧kh ≤ h∧0 < co∧0 < cin∧cin*h+cin*h+co*k < 2^31∧10 ≤ h then let hh:=P+2*L-54 have hXd:r.1.size=X.size:=by rw [hr]; exact (cv0 X щ).1 have hWd:c.1.1.size=co*k:=by rw [c.2]; exact (wcDF_spec W co k).1 rs X W b r.1 c.1.1 relu D cp kh k h (h+1-kh) co hh.toUInt64 (wlo hh) (wsp hh) L rfl (by simp only [cp]; split <;> omega) щ hc.1 щ (λo ho=>by simp only [cp,co] at ho ⊢; rw [hXd,hc.2.2.2.2.2.2.1]; split · rename_i hD; simp only [hD,ἁ] at ho; have:=ι h (show o+1 ≤ cin by omega) rw [Ϡ,n4] at this; omega · simp) (by rw [hWd]) (λo ho=>by have h1:o*k+k ≤ co*k:=by have:=ι k (show o+1 ≤ co by omega); rwa [Ϡ,n4] at this have h2:(if D then o*h else 0)+cp*h ≤ cin*h:=by simp only [cp,co] at ho ⊢; split · rename_i hD; simp only [hD,ἁ] at ho; have:=ι h (show o+1 ≤ cin by omega) rw [Ϡ,n4] at this; omega · simp have h3:h ≤ cin*h:=lZ h hc.2.2.2.2.2.2.2.2.2.2.2.1 omega) 0 (lQ (co*(h+1-kh))) else spec () def run (D:Ἆ) (kh cin h cout:Nat) (relu:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word):Ἂ Word := run2 D kh cin h cout relu X W b spec (wcGet3T wcK3eq (λa b=>wcK3eq_ok a b) GK.cS 32 (W,(if D then cin else cout),kh*(if D then 1 else cin)) (λk=>k.1) (λv=>tchP v.1) 3) (GK.cv X 0 0 (kJ X.size)) rfl end K1 namespace K1 open Dense.F (ao aoe aos kMm kSm kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7 kc8 ug) lemma ugX (g:ἀ) (bU c a d e:Ἄ) (k:(bU+c*a+d+e).toNat < g.size) (l:bU.toNat+c.toNat*a.toNat+d.toNat+e.toNat < 2^31) : g.uget (bU+c*a+d+e) k=g.data[bU.toNat+c.toNat*a.toNat+d.toNat+e.toNat]! := by rw [ug]; congr 1 have i:(c*a).toNat=c.toNat*a.toNat:=kMm _ _ щ have j:(bU+c*a).toNat=bU.toNat+c.toNat*a.toNat:=by rw [kSm _ _ (by rw [i]; omega),i] have h:(bU+c*a+d).toNat=bU.toNat+c.toNat*a.toNat+d.toNat:=by rw [kSm _ _ (by rw [j]; omega),j] rw [kSm _ _ (by rw [h]; omega),h] lemma ugW (e:ἀ) (a mU c d:Ἄ) (i:(a+mU*c+d).toNat < e.size) (j:a.toNat+mU.toNat*c.toNat+d.toNat < 2^31) : e.uget (a+mU*c+d) i=e.data[a.toNat+mU.toNat*c.toNat+d.toNat]! := by rw [ug]; congr 1 have g:(mU*c).toNat=mU.toNat*c.toNat:=kMm _ _ щ have h:(a+mU*c).toNat=a.toNat+mU.toNat*c.toNat:=by rw [kSm _ _ (by rw [g]; omega),g] rw [kSm _ _ (by rw [h]; omega),h] lemma m8_eq (X W b:Ἂ Word) (d e:ἀ) (w:Ἆ) (kh k h bo o:Nat) (u lo U:ἆ) (L:Nat) (m M q J x:Ἄ) (hx) (hw) (g y:Nat) (ad:m.toNat=g) (V:M.toNat=h) (B:q.toNat=bo) (S:J.toNat=o*k) (C:x.toNat=y) (v:d.size < 2^31∧e.size < 2^31) : ∀ n (c:Ἄ) (I F A K G z D H:Ἅ) (p:Ἂ Word),g-c.toNat=n → c.toNat ≤ g → m8 X W b d e w kh k h bo o u lo U L m M q J x hx hw c I F A K G z D H p = f8 X W b d w kh k h bo o m.toNat x u lo U L (ao (λs=>d.data[bo+s/3*h+y+(0+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) I) (ao (λs=>d.data[bo+s/3*h+y+(1+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) F) (ao (λs=>d.data[bo+s/3*h+y+(2+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) A) (ao (λs=>d.data[bo+s/3*h+y+(3+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) K) (ao (λs=>d.data[bo+s/3*h+y+(4+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) G) (ao (λs=>d.data[bo+s/3*h+y+(5+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) z) (ao (λs=>d.data[bo+s/3*h+y+(6+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) D) (ao (λs=>d.data[bo+s/3*h+y+(7+s%3)]! * e.data[o*k+s]!) (3*g) (3*c.toNat) H) p:=by subst ad V B C intro n;induction n with | zero => intro c I F A K G z D H p l Y have x:=W1 l rw[m8,dite_eq_right (λh=>N8 (ε.mp h) x)] simp only[aoe _ _ _ _ (U0 3 x)] | succ n N => intro c I F A K G z D H p l Y have t:c< m:=ε.mpr (N1 l) have O:=Dense.ac t have bx:=hx c.toNat (N1 l) have W:3*c.toNat+2<3*m.toNat:=U1 (M1 _) (U0 3 (N1 l)) have r:∀ j:Ἄ,j.toNat≤9→∀ i,d.uget (q+c*M+x+j) i=d.data[q.toNat+c.toNat*M.toNat+x.toNat+j.toNat]!:=λj a i=>ugX d q c M x j i (by clear * - a bx v;omega) have T:∀ j:Ἄ,j.toNat≤2→∀ i,e.uget (J+3*c+j) i=e.data[J.toNat+(3:Ἄ).toNat*c.toNat+j.toNat]!:=λj a i=>ugW e J 3 c j i (by rw[kc3];clear * - a hw v W;omega) rw[m8,AT t];dsimp only rw[N (c+1) _ _ _ _ _ _ _ _ _ (by rw[O,Q3,l,BK]) (by rw[O];exact N1 l)] simp (disch:=(simp only[kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,kc8,(by simp:(9:Ἄ).toNat=9)];decide)) only[r,T,S,kc0,kc1,kc2,kc3,kc4,kc5,kc6,kc7,kc8,(by simp:(9:Ἄ).toNat=9),O,aos _ _ (3*c.toNat) _ (N5 (N5 W)),aos _ _ (3*c.toNat+1) _ (N5 W),aos _ _ (3*c.toNat+2) _ W,pA,ϑ,G6 (by decide:0<3),E6,Nat.mul_div_cancel_left _ (by decide:0<3),Nat.mul_mod_right,Ht,ϻ,Kd,Gj,kH] end K1 namespace K1 open Dense.F (kSm ug) lemma zt_spec (h:ἀ) (b c:Ἄ) (kh:Nat) (p:c.toNat=kh) (o:b.toNat+kh < 2^31) : ∀ n (t:Ἄ),kh-t.toNat=n → t.toNat ≤ kh → zt h b c t=true → ∀ j,t.toNat ≤ j → j < kh → (λv:Ἅ=>v == -v) (h.data[b.toNat+j]!)=true:=by intro n; induction n with | zero=>intro t k l _ j m g; omega | succ n i => intro t k l d j m g have a:t < c:=ε.mpr щ rw [zt,AT a] at d split at d · rename_i hi simp only [Η] at d have e:(b+t).toNat=b.toNat+t.toNat:=kSm _ _ щ by_cases hj:j=t.toNat · subst hj; have:=d.1; rw [ug,e] at this; exact this · exact i (t+1) (by rw [Dense.ac a]; omega) (by rw [Dense.ac a]; omega) d.2 j (by rw [Dense.ac a]; omega) g · exact absurd d ж lemma zw_spec (i:ἀ) (d a:Ἄ) (h kh:Nat) (m:d.toNat=h) (p:a.toNat=kh) (s:kh ≤ h) : ∀ n (b:Ἄ),b.toNat+n*h < 2^31 → zw i d a b n=true → ∀ c,c < n → ∀ t,t < kh → (λv:Ἅ=>v == -v) (i.data[b.toNat+c*h+t]!)=true:=by intro n; induction n with | zero=>intro b _ _ c o; omega | succ n q => intro b k j c o t l simp only [zw,Η] at j have r:b.toNat+kh < 2^31:=by have:=ι h (show 1 ≤ n+1 by omega); rw [n4] at this; omega by_cases hc0:c=0 · subst hc0; simp only [ϳ,ϑ] exact zt_spec i b a kh p r kh 0 ц ц j.1 t ц l · have e:(b+d).toNat=b.toNat+h:=by rw [kSm _ _ (by rw [m]; rw [Ο] at k; omega),m] have:=q (b+d) (by rw [e]; rw [Ο] at k; omega) j.2 (c-1) щ t l rw [e] at this rw [show b.toNat+c*h+t=b.toNat+h+(c-1)*h+t by have:c*h=(c-1)*h+h:=by have g:c=(c-1)+1:=by omega conv_lhs=>rw [g,Ϡ,n4] omega] exact this end K1 namespace K1 open Core (aG aK af tm) open GK (ao_congr bnd2) open Dense.F (ao bC dJ dL dM dw fv jE kAkN kSm rv tf tw) open Conv (aa czDZ czZ fz_ak wlo wok wsp zrDot2) abbrev R (X W b:Ἂ Word) (relu:Ἆ) (kh k h bo o y:Nat):Word := act relu (dotOf (k+1) (λt=>if t < k then X[bo+t/kh*h+t%kh+y]! else oneW) (λt=>if t < k then W[o*k+t]! else b[o]!)) lemma Zr (X W b:Ἂ Word) (c:Ἆ) (kh k h bo o y:Nat) (e:b[o]! = 0) (d : ∀ s < k,expOf X[bo+s/kh*h+s%kh+y]! ≠ 255) (g : ∀ s < k,expOf W[o*k+s]! ≠ 255) (i : ∀ s < k,czZ (dw X[bo+s/kh*h+s%kh+y]!)=true) : R X W b c kh k h bo o y=act c 0:=by unfold R; congr 1 apply zrDot2 k · intro s a; simp only [AD a]; exact BA (czDZ _ (d s a) (i s a)) · intro s a; simp only [AD a]; exact d s a · intro s a; simp only [AD a]; exact g s a · simp · simp [e] lemma ix (c kh k h bo s y d:Nat) (g:k=kh*c) (a:0 < kh) (i:s < k) (l:y+kh ≤ h) (hX:bo+c*h ≤ d):bo+s/kh*h+s%kh+y < d:=by have j:s/kh < c:=Ϟ (g ▸ i) have m:s%kh < kh:=ϊ _ a have e:(s/kh+1)*h ≤ c*h:=ι h j rw [Ϡ,n4] at e omega structure Cx (X W b:Ἂ Word) (Xd Wd:ἀ) (D:Ἆ) (cp kh k h co:Nat) (u lo sp:ἆ) (L P:Nat):Prop where hXs:Xd.size=X.size hX31:X.size < 2^31 hWs:Wd.size=co*k hW31:Wd.size < 2^31 hXd : ∀ q < X.size,Xd.data[q]! = dw X[q]! hWd : ∀ q < co*k,Wd.data[q]! = dw W[q]! hk:k=kh*cp hkh0:0 < kh hX : ∀ o < co,(if D then o*h else 0)+cp*h ≤ X.size hs : ∀ o < co,(if D then o*h else 0)+cp*h+h+o*k+k < 2^31 hfX : ∀ q < X.size,expOf X[q]! ≠ 255 hfW : ∀ q:Nat,expOf W[q]! ≠ 255 hfb : ∀ q:Nat,expOf b[q]! ≠ 255 hEX : ∀ i < X.size, ∀ j:Nat, |(tm X[i]! W[j]! : ℝ)| ≤ 2^P hEb : ∀ o:Nat, |(tm oneW b[o]! : ℝ)| ≤ 2^P hN:k+2 ≤ 2^L hD:L ≤ 27 hJ:P+L ≤ 425 hu:u=(P+2*L-54).toUInt64 hlo:lo=wlo (P+2*L-54) hsp:sp=wsp (P+2*L-54) lemma fZ_eq {X W b:Ἂ Word} {B Wd:ἀ} {D:Ἆ} {U kh k h co:Nat} {u lo I:ἆ} {L P:Nat} (C:Cx X W b B Wd D U kh k h co u lo I L P) (c:Ἆ) (o y:Nat) (ho:o < co) (hy:y+kh ≤ h) (g:Ἄ) (H:g.toNat=y) (i:Nat) (w:i=U) (S:Ἅ) (A:S=ao (λs=>dw X[(if D then o*h else 0)+s/kh*h+s%kh+y]! * dw W[o*k+s]!) k 0 (dw oneW*dw b[o]!)) : fZ X W b B c kh k h (if D then o*h else 0) o i g u lo I L S=R X W b c kh k h (if D then o*h else 0) o y:=by subst H w have v:=C.hX o ho have F:=C.hs o ho generalize hbo:(if D then o*h else 0)=bo at A v F ⊢ have j : ∀ s < k,bo+s/kh*h+s%kh+g.toNat < X.size:=λs l=>ix i kh k h bo s _ X.size C.hk C.hkh0 l hy v let d:Nat → Word:=λt=>if t < k then X[bo+t/kh*h+t%kh+g.toNat]! else oneW let e:Nat → Word:=λt=>if t < k then W[o*k+t]! else b[o]! let p:Nat → Ἅ:=λt=>dw X[bo+t/kh*h+t%kh+g.toNat]! * dw W[o*k+t]! let n:Unit → Ἅ:=λ_=>dw oneW*dw b[o]! let N:Unit → Word:=λ_=>act c (dotOf (k+1) d e) have K : ∀ s < k,fv (p s)∧rv (p s)=(tm (d s) (e s):ℝ):=by intro s l; simp only [p,d,e,AD l]; exact dJ _ _ (C.hfX _ (j s l)) (C.hfW _) have q:fv (n ())∧rv (n ())=(tm (d k) (e k):ℝ):=by simp only [n,d,e,AX,ἂ]; exact dJ oneW b[o]! ж (C.hfb o) have jg:aG (k+1) d e:=by intro s l; by_cases h':s < k · simp only [d,e,AD h']; exact ⟨C.hfX _ (j s h'),C.hfW _⟩ · simp only [d,e,AC h']; exact ⟨by decide,C.hfb o⟩ have E : ∀ s ≤ k, |(tm (d s) (e s):ℝ)| ≤ 2^P:=by intro s l; by_cases h':s < k · simp only [d,e,AD h']; exact C.hEX _ (j s h') _ · simp only [d,e,AC h']; exact C.hEb o have hJ:=C.hJ have ad:=C.hD have hx:u.toNat=P+2*L-54:=by rw [C.hu]; exact Α (U1 (Dense.F.jE_h1 P L hJ ad).1 ж) have hd : ∀ m t a,k-t=m → ao p k t a=bC (λ_=>false) p k t a:=dM p k have L1:=dL (λ_=>false) p (λs=>tm (d s) (e s)) (tm (d k) (e k)) P L k (λt M=>K t M) (λ_ _ n=>(lN n).elim) (λt M=>E t M.le) (E k AP) C.hN C.hD (hJ.trans ж) k 0 (n ()) rfl (ϟ _) q.1 (by rw [q.2]; simp) have J:fv S:=by rw [A,hd k 0 _ rfl]; exact L1.1 have G : |rv S-(af (k+1) d e:ℝ)| ≤ (2:ℝ)^((u.toNat:ℕ):ℤ):=by rw [A,hd k 0 _ rfl,aK,hx] refine AZ (le_of_eq ?_) (L1.2.trans (bnd2 k P L C.hN)) congr 1; push_cast [af]; ring have T:tw c S u L k p n N=R X W b c kh k h bo o g.toNat := jE c k d e p n u P L N K q jg E C.hN C.hD C.hJ hx rfl S J G unfold fZ rw [fz_ak S lo I u (by rw [C.hu,C.hlo,C.hsp]; exact wok _ (by clear * - hJ ad;omega))] dsimp only split · rename_i O rw [← T]; unfold tw tf split · rename_i r simp only [Η] at r obtain ⟨⟨hr,hn⟩, -⟩:=r subst hr exact kAkN S u O hn · dsimp only; rw [AD O] · split · rename_i hz simp only [Η,AQ] at hz obtain ⟨x,z⟩:=hz obtain ⟨Y,V,B0,B1,B2⟩:h < 2^32∧kh < 2^32∧bo < 2^32∧bo+g.toNat < 2^31∧bo+g.toNat+i*h < 2^31:=by clear * - F hy;omega have e1:(bo.toUSize+g).toNat=bo+g.toNat:=by rw [kSm _ _ (by rw [aa bo B0]; exact B1),aa bo B0] have Z:=zw_spec B h.toUSize kh.toUSize h kh (aa h Y) (aa kh V) ((H0 _ _).trans hy) i (bo.toUSize+g) (by rw [e1]; exact B2) z rw [e1] at Z refine (Zr X W b c kh k h bo o g.toNat x (λs l=>C.hfX _ (j s l)) (λs _=>C.hfW _) (λs l => ?_)).symm have h1:s/kh < i:=Ϟ (C.hk ▸ l) have h2:s%kh < kh:=ϊ _ C.hkh0 have:=Z (s/kh) h1 (s%kh) h2 rw [show bo+g.toNat+s/kh*h+s%kh=bo+s/kh*h+s%kh+g.toNat by clear * -;omega,C.hXd _ (j s l)] at this exact this · unfold sO; exact T lemma lane {X W b:Ἂ Word} {n t:ἀ} {D:Ἆ} {i kh k h co:Nat} {u lo q:ἆ} {L P:Nat} (C:Cx X W b n t D i kh k h co u lo q L P) (a:Ἆ) (o y l:Nat) (ho:o < co) (x:y+l+kh ≤ h) (j:Ἄ) (e:j.toNat=y+l) (c:Nat) (d:c=i) (r:Nat) (p:r=0) (z:Ἅ) (v:z=dw oneW*dw b[o]!) : fZ X W b n a kh k h (if D then o*h else 0) o c j u lo q L (ao (λs=>n.data[(if D then o*h else 0)+s/kh*h+y+(l+s%kh)]! * t.data[o*k+s]!) k r z) = R X W b a kh k h (if D then o*h else 0) o (y+l):=by apply fZ_eq C a o (y+l) ho щ j e c d subst p; rw [v] refine ao_congr _ _ k k 0 _ щ (λs _ w => ?_) have m:=ix i kh k h (if D then o*h else 0) s (y+l) X.size C.hk C.hkh0 w щ (C.hX o ho) have g:o*k+s < co*k:=by have:=ι k (show o+1 ≤ co by omega); rw [Ϡ,n4] at this; omega rw [show (if D then o*h else 0)+s/kh*h+y+(l+s%kh)=(if D then o*h else 0)+s/kh*h+s%kh+(y+l) by omega, C.hXd _ m,C.hWd _ g] end K1 namespace K1 open GK (dm push8) open Dense.F (ao dw kc0 kc1 kc2 kc3 kc4 kc5 kc6 kc7) open Conv (aa) lemma x9Fa {n ho kh h:Nat} (j:n intro y g hc hy i hp have hF:∀ l,y+ l< ho→ R X W b a kh (kh*d) h (if D then o*h else 0) o (y+l) = R X W b a kh (kh*d) h (if D then (o*ho+ y+ l)/ho*h else 0) ((o*ho+ y+ l)/ho) ((o*ho+ y+ l)%ho):=by intro l w;have e:=dm o ho (y+l) w;rw[show o*ho+ y+ l=o*ho+(y+l) by ring,e.1,e.2] have F:=C.hX31 have S:=C.hXs have ah:=C.hWs have x:=C.hW31 have U:=C.hkh0 have I:d<2^31:=C0 (lZ d U) (C0 (H0 _ _) J) have M:h<2^31:=C0 (((H0 h _).trans (V1 _ _)).trans (V1 _ _)) J have t:d<2^32:=N3 I ж have jb:(if D then o*h else 0)<2^(32:Ἀ):=N3 (C0 (U6 (U6 (U6 (V1 _ _)))) J) ж have jo:o*(kh*d)<2^(32:Ἀ):=N3 (C0 (U6 (H0 _ _)) J) ж have G:∀ n l (lU:Ἄ),lU.toNat=l→ n+ l< ho → fZ X W b r a kh (kh*d) h (if D then o*h else 0) o d.toUSize.toNat (n.toUSize+ lU) u lo K L (ao (λs=>r.data[(if D then o*h else 0)+ s/kh*h+ n+(l+ s%kh)]! * B.data[o*(kh*d)+ s]!) (kh*d) 0 z) = R X W b a kh (kh*d) h (if D then o*h else 0) o (n+l) := λn l lU w j=>lane C a o n l Y (x9Fa j m M).1 _ (GK.uj n l lU w (x9Fa j m M).2.1) _ (aa d t) 0 rfl z hz have N:∀ n,n< ho→ fZ X W b r a kh (kh*d) h (if D then o*h else 0) o d.toUSize.toNat n.toUSize u lo K L (ao (λs=>r.data[(if D then o*h else 0)+ s/kh*h+ n+(0+ s%kh)]! * B.data[o*(kh*d)+ s]!) (kh*d) 0 z) = R X W b a kh (kh*d) h (if D then o*h else 0) o (n+0) := λn V=>lane C a o n 0 Y (x9Fa V m M).1 _ (by rw[aa n (x9Fa V m M).2.2,ϑ]) _ (aa d t) 0 rfl z hz have H:∀ l (lU:Ἄ),lU.toNat=l→ y+ l< ho→_:=λl lU w j=>(G y l lU w j).trans (hF l j) have L0:y< ho→_:=λj=>(N y j).trans (hF 0 j) rw[rw];try dsimp only by_cases h8:y+8≤ ho ·rw[AT h8] subst v rw[m8_eq X W b r B a 3 (3*d) h (if D then o*h else 0) o u lo K L _ _ _ _ _ _ _ d y (aa d t) (aa h (N3 M (by decide))) (aa _ jb) (aa _ jo) (aa y (x9Fa (U1 (V4 ж) h8) m M).2.2) ⟨by rw[S];exact F,x⟩ (d-0) 0 z z z z z z z z g ц ц] unfold f8 simp only[kc0,A7] have Y8:∀ l,l<8→ y+lU1 (O1 w y) h8 have P8:=push8 g _ (o*ho+y) i (λq hq=>hp q (by rw[i];exact hq)) _ _ _ _ _ _ _ _ (L0 (Y8 0 ж)) (H 1 1 kc1 (Y8 1 ж)) (H 2 2 kc2 (Y8 2 ж)) (H 3 3 kc3 (Y8 3 ж)) (H 4 4 kc4 (Y8 4 ж)) (H 5 5 kc5 (Y8 5 ж)) (H 6 6 kc6 (Y8 6 ж)) (H 7 7 kc7 (Y8 7 ж)) exact ih (c-8) (GK.x8D2 hc h8 ж) (y+8) _ (by rw[←hc,X5]) h8 (by rw[P8.1];ring) (λq hq=>P8.2 q (by rw[P8.1]at hq;clear * - hq;omega)) ·rw[dite_eq_right h8] by_cases h1:y< ho ·rw[AT h1] subst v rw[m8_eq X W b r B a 3 (3*d) h (if D then o*h else 0) o u lo K L _ _ _ _ _ _ _ d (ho-8) (aa d t) (aa h (N3 M (by decide))) (aa _ jb) (aa _ jo) (aa _ (x9Fa (Qs (U1 ж p) ж) m M).2.2) ⟨by rw[S];exact F,x⟩ (d-0) 0 z z z z z z z z (lQ 8) ц ц] unfold f8 simp only[kc0,A7] have A:∀ l,l<8→ ho-8+lU1 (O1 w _) (J2 p).le have T8:=push8 (lQ 8) (λl=>R X W b a 3 (3*d) h (if D then o*h else 0) o (ho-8+l)) 0 ц (λq hq=>absurd hq (D4 q)) _ _ _ _ _ _ _ _ (N (ho-8) (A 0 ж)) (G (ho-8) 1 1 kc1 (A 1 ж)) (G (ho-8) 2 2 kc2 (A 2 ж)) (G (ho-8) 3 3 kc3 (A 3 ж)) (G (ho-8) 4 4 kc4 (A 4 ж)) (G (ho-8) 5 5 kc5 (A 5 ж)) (G (ho-8) 6 6 kc6 (A 6 ж)) (G (ho-8) 7 7 kc7 (A 7 ж)) have e1:(o+1)*ho=o*ho+ ho:=by rw[Ϡ,n4] refine (λsz=>⟨sz,λq hq=>?_⟩) (by rw[Qe,Array.size_extract,T8.1,i,e1];clear * - h1 h8;omega) by_cases hq1:q< g.size ·rw[AB _ q (by rw[Qe];exact U1 hq1 (V1 _ _)),Array.getElem_append_left hq1,←AB g q hq1] exact hp q hq1 ·rw[i]at hq1;rw[e1]at hq have q1:=dm o ho (q- o*ho) (by clear * - hq p;omega) rw[M3 (N0 (V1 _ y) (V3 hq1))]at q1 have r:y+8-ho+(q-g.size)<8:=by clear * - hq hq1 i h1 h8;omega rw[AB _ q (by rw[sz,e1];exact hq), Array.getElem_append_right (by rw[i];exact V3 hq1),Array.getElem_extract,←AB _ _ (by rw[T8.1];exact r), T8.2 _ r,q1.1,q1.2,show ho-8+(y+8-ho+(q-g.size))=q- o*ho by rw[i];clear * - hq1 h1 h8 p;omega] ·rw[dite_eq_right h1] have:y=ho:=N2 hy (V3 h1) subst this exact ⟨by rw[i];ring,λq hq=>hp q (by rw[i];rw[Ϡ,n4]at hq;exact hq)⟩ lemma rs_spec {X W b:Ἂ Word} {r s:ἀ} {D:Ἆ} {l kh k h co:Nat} {u lo v:ἆ} {L P:Nat} (C:Cx X W b r s D l kh k h co u lo v L P) (d:Ἆ) (ho:Nat) (y:k=kh*l) (i:0 < l) (j:ho+kh=h+1) (e:kh=3) (n:8 ≤ ho) (g : ∀ o,o < co → (if D then o*h else 0)+l*h ≤ r.size) (p:co*k ≤ s.size) (t : ∀ o,o < co → (if D then o*h else 0)+l*h+h+o*k+k < 2^31) : ∀ c o (a:Ἂ Word),co-o=c → o ≤ co → a.size=o*ho → (∀ q < a.size,a[q]! = R X W b d kh k h (if D then q/ho*h else 0) (q/ho) (q%ho)) → (rs X W b r s d D l kh k h ho co u lo v L y i j e n g p t o a).size=co*ho ∧ ∀ q < co*ho,(rs X W b r s d D l kh k h ho co u lo v L y i j e n g p t o a)[q]! = R X W b d kh k h (if D then q/ho*h else 0) (q/ho) (q%ho):=by intro c; induction c with | zero => intro o a z w m x have:o=co:=N2 w (W1 z) subst this rw [rs,dite_eq_right (K4 _)] exact ⟨m,λq hq=>x q (hq.trans_eq m.symm)⟩ | succ c A => intro o a z w m x have hi:o < co:=N1 z rw [rs,AT hi] have W:=rw_spec C d ho y i j e n o hi (g o hi) (((Ο o k).symm.trans_le (ι k hi)).trans p) (t o hi) _ rfl (ho-0) 0 a rfl (ϟ _) m x exact A (o+1) _ (by clear * - z;omega) hi W.1 (λq hq=>W.2 q (hq.trans_eq W.1)) end K1 namespace K1 open GK (cv0) open Cv1 (c1F) open Dense.F (aO bd dh wcDF wcDF_spec) open Conv (wlo wsp) lemma mkC (D:Ἆ) (kh cin h cout:Nat) (X W b:Ἂ Word) (cp co k L P:Nat) (hcp:cp=if D then 1 else cin) (hco:co=if D then cin else cout) (hk:k=kh*cp) (hL:L=Aq (k+2)+1) (c : {v // v=GK.cF (W,co,k)}) (r:ἀ × ἇ) (hr:r=GK.cv X 0 0 (kJ X.size)) (hP:P=max (48+c.1.2.toNat+r.2.toNat) (174+(aO b 0 0).toNat)) (hkh:kh=3) (hc2:c.1.2 < 255) (hr2:r.2 < 255) (heB:aO b 0 0 < 255) (hPL:P+L ≤ 425) (hL27:L ≤ 27) (hXsz:X.size=cin*h) (hWsz:W.size=co*k) (hbsz:b.size=co) (hkhh:kh ≤ h) (hco0:0 < co) (hcin:0 < cin) (h31:cin*h+cin*h+co*k < 2^31) : Cx X W b r.1 c.1.1 D cp kh k h co (P+2*L-54).toUInt64 (wlo (P+2*L-54)) (wsp (P+2*L-54)) L P:=by have hX31:X.size < 2^31:=by clear * - hXsz h31;omega have hP1:=(le_max_left _ _).trans_eq hP.symm have hP2:=(le_max_right _ _).trans_eq hP.symm have hcv:=cv0 X hX31 rw [← hr] at hcv have hc1:c.1.1=wcDF (W,co,k):=by rw [c.2]; rfl have hc2e:c.1.2=aO W 0 0:=by rw [c.2]; rfl have hWd:=wcDF_spec W co k rw [← hc1] at hWd have hkh0:0 < kh:=by rw [hkh]; decide have hcp0:0 < cp:=by rw [hcp]; split; exact Zp; exact hcin have bW:=λq=>bd W (by have:=ς; clear * - this hWsz h31;omega) (by rw [← hc2e]; exact hc2) q have bB:=λq=>bd b (by have u:=ς; have:co ≤ co*k:=H1 co (by rw [hk]; exact Ϯ hkh0 hcp0); clear * - u this hbsz h31;omega) heB q have hhc:h ≤ cin*h:=lZ h hcin have hXo : ∀ o < co,(if D then o*h else 0)+cp*h ≤ X.size:=by intro o ho; rw [hXsz]; subst hcp hco; cases D · simp · simp only [ἁ] at ho ⊢; rw [n4]; exact (Ο o h).symm.trans_le (ι h ho) exact { hXs:=hcv.1 hX31:=hX31 hWs:=hWd.1 hW31:=hWd.1.trans_lt (C0 (H0 _ _) h31) hXd:=hcv.2.1 hWd:=hWd.2 hk:=hk hkh0:=hkh0 hX:=hXo hs:=λo ho=>by have h1:o*k+k ≤ co*k:=(Ο o k).symm.trans_le (ι k ho) have h2:=hXo o ho clear * - h1 h2 hXsz hhc h31;omega hfX:=λq hq e=>by have h1:=hcv.2.2 q hq; rw [e] at h1 exact AX _ (h1.trans_lt (Ι.mp hr2)) hfW:=λq=>(bW q).1 hfb:=λq=>(bB q).1 hEX:=λi hi j=>by have gX:idxOf X[i]! ≤ r.2.toNat:=by rw [Dense.aT]; exact (I2 _ _).trans (hcv.2.2 i hi) have gW:idxOf W[j]! ≤ P-48-r.2.toNat:=by have:=(bW j).2; rw [← hc2e] at this; clear * - this hP1;omega have:=dh X[i]! W[j]! _ _ gX gW rwa [show 48+r.2.toNat+(P-48-r.2.toNat)=P by clear * - hP1;omega] at this hEb:=λo=>by have gO:idxOf oneW ≤ 126:=by rw [Dense.aT]; decide have gb:idxOf b[o]! ≤ P-174:=by have:=(bB o).2; clear * - this hP2;omega have:=dh oneW b[o]! _ _ gO gb rwa [show 48+126+(P-174)=P by clear * - hP2;omega] at this hN:=by rw [hL]; exact U2 ϙ hD:=hL27 hJ:=hPL hu:=rfl hlo:=rfl hsp:=rfl } lemma rsF {X W b:Ἂ Word} {n t:ἀ} {D:Ἆ} {c kh k h co:Nat} {u lo x:ἆ} {L P:Nat} (C:Cx X W b n t D c kh k h co u lo x L P) (a:Ἆ) (y:k=kh*c) (i:0 < c) (l:(h+1-kh)+kh=h+1) (e:kh=3) (m:8 ≤ h+1-kh) (g : ∀ o,o < co → (if D then o*h else 0)+c*h ≤ n.size) (d:co*k ≤ t.size) (w : ∀ o,o < co → (if D then o*h else 0)+c*h+h+o*k+k < 2^31) (F:Ἂ Word) (r:F.size=co*(h+1-kh)) (s : ∀ q < co*(h+1-kh),F[q]! = R X W b a kh k h (if D then q/(h+1-kh)*h else 0) (q/(h+1-kh)) (q%(h+1-kh))) (N:Nat) : rs X W b n t a D c kh k h (h+1-kh) co u lo x L y i l e m g d w 0 (lQ N)=F:=by have p:=rs_spec C a (h+1-kh) y i l e m g d w (co-0) 0 (lQ N) rfl (ϟ _) ц ц apply mi · rw [p.1,r] · intro q v z have j:q < co*(h+1-kh):=by rw [p.1] at v; exact v rw [← AB _ q v, ← AB _ q z,p.2 q j,s q j] lemma run2_eq (D:Ἆ) (kh a h d:Nat) (i:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (c : {v // v=GK.cF (W,(if D then a else d),kh*(if D then 1 else a))}) (r:ἀ × ἇ) (A:r=GK.cv X 0 0 (kJ X.size)) (F:Ἂ Word) (u:spec ()=F) (o:0 < a → 0 < kh → kh ≤ h → F.size=(if D then a else d)*(h+1-kh)) (p:0 < a → 0 < kh → kh ≤ h → ∀ q < (if D then a else d)*(h+1-kh), F[q]! = R X W b i kh (kh*(if D then 1 else a)) h (if D then q/(h+1-kh)*h else 0) (q/(h+1-kh)) (q%(h+1-kh))) : run2 D kh a h d i X W b spec c r A=F:=by unfold run2 cases D <;> simp only [υ, ↓reduceIte] at o p ⊢ <;> split <;> first | exact u | rename_i B obtain ⟨m,z,w,t,y,s,l,j,n,e,k,g,x,h10⟩:=B exact rsF (mkC _ kh a h d X W b _ _ _ _ _ rfl rfl rfl rfl c r A rfl m z w t y s l j n e k g x) i rfl _ _ m (by clear * - m h10;omega) _ _ _ F (o g (m ▸ P4 2) e) (p g (m ▸ P4 2) e) _ lemma wC (s:B4) (X:Ἂ Word) (l:Cv1.c1Ok s=true) (g y t:Nat) (q:y+t%s.kh < s.h) : Qo s X g y 0 t=X[(g*s.cpg+t/s.kh)*s.h+(y+t%s.kh)]! := by obtain ⟨a,i,h,d,e,j,n,o,k,c,m,p⟩:=c1F s l unfold Qo simp only [a,i,h,d,e,j,k,c,ϻ,I4,Je, ϑ, pQ, ] rw [AC щ] lemma cvE (t:B4) (a:Ἆ) (X W b:Ἂ Word) (s:Cv1.c1Ok t=true) (q:Nat) (hq:q < t.cout*(t.h+1-t.kh)):(T6 dotOf t a X W b)[q]! = act a (dotOf (t.taps+1) (λi=>if i < t.taps then X[(q/(t.h+1-t.kh)/t.opg*t.cpg+i/t.kh)*t.h+(q%(t.h+1-t.kh)+i%t.kh)]! else oneW) (λi=>if i < t.taps then W[q/(t.h+1-t.kh)*t.taps+i]! else b[q/(t.h+1-t.kh)]!)):=by obtain ⟨e,n,m,g,k,o,p,j,r,h,l,u⟩:=c1F t s have c:t.ho=t.h+1-t.kh:=by simp only [F7,T7,k,p,r,m]; omega have d:t.wo=1:=by simp only [I7,M7,o,j,h,g,e,n] rw [AB _ q (by simp only [T6,Ϝ,c,d,ϻ]; exact hq)] unfold T6; rw [Λ]; simp only [c,d,ϻ,I4,Je] congr 2; funext i; split · exact wC t X s _ _ i (by have:=ϊ q (show 0 < t.h+1-t.kh by omega); have:=ϊ i l; omega) · rfl lemma runC_eq (s:B4) (a:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (d:spec ()=W6 s a X W b) (r:Cv1.c1Ok s=true) (u:s.groups=1) : run false s.kh s.cin s.h s.cout a X W b spec=W6 s a X W b:=by obtain ⟨j,c,e,g,m,l,n,o,p,h,z,x⟩:=c1F s r have k:(W6 s a X W b).size=s.cout*(s.h+1-s.kh):=by simp only [W6,T6,Ϝ,F7, I7,T7,M7,m,n,p,e,l,o,h,g, j,c]; congr 1; omega unfold run apply run2_eq false _ _ _ _ _ _ _ _ _ _ _ _ _ d · intro _ _ _; exact k · intro v w t q hq simp only [υ, ↓reduceIte] at hq ⊢ have g0:q/(s.h+1-s.kh)/s.cout=0:=ώ (Ϟ (by rw [Ϗ]; exact hq)) rw [W6,cvE s a X W b r q hq] have y:s.taps=s.kh*s.cin:=by simp only [L8,C6,u,I4,c,ϻ]; ring simp only [y,W9,u,I4,g0,ϳ,Κ] unfold R; congr 2; funext i; split · congr 1; omega · rfl lemma runD_eq (s:B4) (a:Ἆ) (X W b:Ἂ Word) (spec:Unit → Ἂ Word) (e:spec ()=R5 s a X W b) (t:Cv1.c1Ok s=true) : run true s.kh s.cin s.h s.cin a X W b spec=R5 s a X W b:=by obtain ⟨k,d,g,h,n,m,o,p,r,j,x,w⟩:=c1F s t have l:(R5 s a X W b).size=s.cin*(s.h+1-s.kh):=by simp only [R5,Jc,T6,Ϝ, C4,F7,I7,T7, M7,n,o,r,g,m,p,j,h,k,d]; congr 1; omega unfold run apply run2_eq true _ _ _ _ _ _ _ _ _ _ _ _ _ e · intro _ _ _; exact l · intro c v u q hq simp only [↓reduceIte] at hq ⊢ rw [R5,Jc,cvE s.depthwise a X W b t q hq] have y:s.cin/s.cin=1:=Vq c simp only [L8,C6,W9, C4,y,I4,n4,ϻ,d] unfold R; congr 2; funext i; split · congr 1; rw [Ϡ]; omega · rfl end K1 def cvK(s:B4)(relu:Ἆ)(inp wts b:Ἂ Word):Ἂ Word:= if Cv1.c1Ok s&&s.kh==3&&s.groups==1 then K1.run false s.kh s.cin s.h s.cout relu inp wts b (λ_=>W5.conv.conv2d s relu inp wts b) else if cvOk s&&fpOk s then Conv.er (cvO s) relu inp wts b else W5.conv.conv2d s relu inp wts b lemma cvK_eq:cvK=W6:=by funext s relu inp wts b;unfold cvK;split ·rename_i h;simp only[Η]at h exact K1.runC_eq s relu inp wts b _ (by simp only[W5,L6];rfl) h.1.1 (by simpa using h.2) ·split ·rename_i h;rw[Η]at h;rw[Conv.eu,cvB s h.1] ·simp only[W5,L6];rfl def dwK(s:B4)(relu:Ἆ)(inp wts b:Ἂ Word):Ἂ Word:= if dwOk s&&fpOk s then Conv.cG (cvO s) relu inp wts b else if Cv1.c1Ok s&&s.kh==3 then K1.run true s.kh s.cin s.h s.cin relu inp wts b (λ_=>W5.conv.depthwise s relu inp wts b) else W5.conv.depthwise s relu inp wts b def apK(s:PoolShape)(inp:Ἂ Word):Ἂ Word:= if apOk s then Conv.dU s.c s.h s.w s.kh inp else W5.elem.avgpool s inp def mpK(s:PoolShape)(inp:Ἂ Word):Ἂ Word:= if apOk s then Conv.d9 s.c s.h s.w s.kh inp else W5.elem.maxpool s inp namespace Rnn open Dense.F (WcE ak aoe aos bW cw dJ da dw iC kE1 kHG s5push_get s5wcGet3_val wcAeq wcAeq_ok wcGet3) open Core (aG au iW tm) open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats abbrev LinFn:=Nat → Nat → Nat → Ἆ → Ἂ Word → Ἂ Word → Ἂ Word → Ἂ Word @[inline] def fA (A:Ἂ Word) (ao n:Nat) (a1 a2:Word) (t:Nat):Word := if t < n then A[ao+t]! else if t=n then a1 else a2 @[inline] def aGt (A:Ἂ Word) (k:Ἄ):Word:=if h:k < A.usize then A.uget k (Dense.cD h) else A[k.toNat]! lemma aGt_eq (A:Ἂ Word) (k:Ἄ):aGt A k=A[k.toNat]!:=by unfold aGt; split · exact Dense.cC A k _ · rfl lemma aGn (A:Ἂ Word) (n:Nat) (h:n < 4294967296):aGt A (W0 n)=A[n]!:=by rw [aGt_eq,X3 (U1 h ς)] lemma uO {n:Nat} (h:n < 4294967296):(W0 n).toNat=n:=X3 (U1 h ς) lemma aUs {k:Ἄ} (h:k.toNat+1 < kX):(k+1).toNat=k.toNat+1:=by rw [lJ,mA]; exact γ h lemma aUd {ka a:Ἄ} (h:ka < a):a.toNat-(ka+1).toNat < a.toNat-ka.toNat:=by have c:=ε.mp h rw [aUs (C0 c (Jf a))] omega @[inline] def aJs (a b:Word) (Bm:ἆ):ἆ:= if Core.mW a*Core.mW b==0 then Bm else min Bm (iW a+iW b) def aJu (A B:Ἂ Word) (ka kb ea:Ἄ) (Bm:ἆ):ἆ:= if h:ka < ea then aJu A B (ka+1) (kb+1) ea (aJs (aGt A ka) (aGt B kb) Bm) else Bm termination_by ea.toNat-ka.toNat decreasing_by exact aUd h @[inline] def aDs (a b:Word) (Bm pH pL nH nL:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ):ἆ:= let m:=Core.mW a*Core.mW b let e:=iW a+iW b if expOf a==255||expOf b==255||m != 0&&(e < Bm||60 < e-Bm) then 4294967296 else if m==0 then k pH pL nH nL else let g:=signOf a==signOf b let q:=Dense.gd (if g then pH else nH) (if g then pL else nL) m (e-Bm) k (if g then q.1 else pH) (if g then q.2 else pL) (if g then nH else q.1) (if g then nL else q.2) lemma aGd0 (h l s:ἆ):Dense.gd h l 0 s=(h,l):=by simp [Dense.gd] @[inline] def aDs2 (a b:Word) (Bm pH pL nH nL:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ):ἆ:= let m:=Core.mW a*Core.mW b let e:=iW a+iW b if expOf a==255||expOf b==255||m != 0&&(e < Bm||60 < e-Bm) then 4294967296 else let g:=signOf a==signOf b let p:=Dense.gd pH pL (if g then m else 0) (e-Bm) let q:=Dense.gd nH nL (if g then 0 else m) (e-Bm) k p.1 p.2 q.1 q.2 lemma aDs2_eq (a b:Word) (h d c g e:ἆ) (k:ἆ → ἆ → ἆ → ἆ → ἆ): aDs2 a b h d c g e k=aDs a b h d c g e k:=by unfold aDs2 aDs dsimp only congr 1 by_cases hm:(Core.mW a*Core.mW b==0)=true · rw [AD hm,AQ.1 hm] simp only [ite_self,aGd0] · rw [AC hm] cases signOf a==signOf b <;> simp only [aGd0,ἁ,ἂ,υ] def aDu (A B:Ἂ Word) (ka kb ea:Ἄ) (a1 b1 a2 b2:Word) (Bm pH pL nH nL:ἆ):ἆ:= if h:ka < ea then aDs2 (aGt A ka) (aGt B kb) Bm pH pL nH nL λ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 λpH pL nH nL=>aDs2 a2 b2 Bm pH pL nH nL λpH pL nH nL=> au (pH-nH-(if pL < nL then 1 else 0)) (pL-nL) Bm termination_by ea.toNat-ka.toNat decreasing_by exact aUd h lemma aDls (h g:Nat → Word) (n:Nat) (i:ἆ) (t:Nat) (j:t < n) (c a e d:ἆ): Dense.dl h g n i t c a e d=aDs (h t) (g t) i c a e d λc a e d=>Dense.dl h g n i (t+1) c a e d:=by rw [Dense.dl,AD j]; rfl lemma aDle (i h:Nat → Word) (n:Nat) (g:ἆ) (t:Nat) (j:¬ t < n) (d a e c:ἆ): Dense.dl i h n g t d a e c=au (d-e-(if a < c then 1 else 0)) (a-c) g:=by rw [Dense.dl,AC j] lemma aJgs (a c:Nat → Word) (n t:Nat) (e:t < n) (d:ἆ): Dense.jG a c n t d=Dense.jG a c n (t+1) (aJs (a t) (c t) d):=by rw [Dense.jG,AD e]; rfl lemma aJge (d e:Nat → Word) (n t:Nat) (c:¬ t < n) (a:ἆ):Dense.jG d e n t a=a:=by rw [Dense.jG,AC c] lemma aFn (A:Ἂ Word) (ao n:Nat) (a c:Word):fA A ao n a c n=a:=by simp [fA] lemma aFm (A:Ἂ Word) (ao n:Nat) (c a:Word):fA A ao n c a (n+1)=a:=by simp [fA] lemma aFl (A:Ἂ Word) (ao n:Nat) (c a:Word) (t:Nat) (h:t < n):fA A ao n c a t=A[ao+t]!:=by simp [fA,h] lemma aJu_eq (A B:Ἂ Word) (ao bo n:Nat) (m j l b2:Word) (a:Ἄ) (hA:A.size < kX) (s:B.size < kX) (i:a.toNat=ao+n) (r:bo+n < kX): ∀ k t (ka kb:Ἄ) e,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aJs l b2 (aJs m j (aJu A B ka kb a e))=Dense.jG (fA A ao n m l) (fA B bo n j b2) (n+2) t e:=by have u:=Jf a intro k induction k with | zero => intro t ka kb e o q d h obtain rfl:t=n:=by omega have g:¬ ka < a:=by rw [ε,d,i]; exact K4 _ rw [aJu,dite_eq_right g,aJgs _ _ _ _ (by omega),aJgs _ _ _ _ (by omega),aJge _ _ _ _ (by omega), aFn,aFn,aFm,aFm] | succ k p => intro t ka kb e o q d h have c:t < n:=by omega have g:ka < a:=by rw [ε,d,i]; omega rw [aJu,AT g,aJgs _ _ _ _ (by omega),aGt_eq A ka,aGt_eq B kb,d,h, aFl _ _ _ _ _ _ c,aFl _ _ _ _ _ _ c] exact p (t+1) (ka+1) (kb+1) _ щ щ (by rw [aUs щ,d]; rfl) (by rw [aUs щ,h]; rfl) lemma aDu_eq (A B:Ἂ Word) (ao bo n:Nat) (s p q b2:Word) (h:Ἄ) (l:ἆ) (hA:A.size < kX) (z:B.size < kX) (r:h.toNat=ao+n) (y:bo+n < kX): ∀ k t (ka kb:Ἄ) c d g a,n-t=k → t ≤ n → ka.toNat=ao+t → kb.toNat=bo+t → aDu A B ka kb h s p q b2 l c d g a=Dense.dl (fA A ao n s q) (fA B bo n p b2) (n+2) l t c d g a:=by have x:=Jf h intro k induction k with | zero => intro t ka kb c d g a u w j o obtain rfl:t=n:=by omega have m:¬ ka < h:=by rw [ε,j,r]; exact K4 _ rw [aDu,dite_eq_right m]; simp only [aDs2_eq]; rw [aDls _ _ _ _ _ щ,aFn,aFn] simp only [aDls _ _ (t+2) l (t+1) щ,aDle _ _ (t+2) l (t+2) щ,aFm] | succ k v => intro t ka kb c d g a u w j o have i:t < n:=by omega have m:ka < h:=by rw [ε,j,r]; omega rw [aDu,AT m]; simp only [aDs2_eq]; rw [aDls _ _ _ _ _ (by omega),aGt_eq A ka,aGt_eq B kb,j,o, aFl _ _ _ _ _ _ i,aFl _ _ _ _ _ _ i] have e:=fun c d g a=>v (t+1) (ka+1) (kb+1) c d g a (by omega) (by omega) (by rw [aUs щ,j]; rfl) (by rw [aUs щ,o]; 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 (W0 ao) (W0 bo) (W0 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 (aJu A B (W0 ao) (W0 bo) (W0 (ao+n)) 1023))) 0 0 0 0 else 4294967296 if r < 4294967296 then O2 r else dotOf (n+2) (fA A ao n a1 a2) (fA B bo n b1 b2) lemma ad2x_eq (A B:Ἂ Word) (ao bo n:Nat) (i c d b2:Word): ad2x A B ao bo n i c d b2=dotOf (n+2) (fA A ao n i d) (fA B bo n c b2):=by unfold ad2x by_cases h:n+2 < 262144∧A.size ≤ 4294967295∧B.size ≤ 4294967295∧ao+n ≤ 4294967295∧bo+n ≤ 4294967295 · rw [AD h] obtain ⟨m,hA,p,q,o⟩:=h have s:=ς have e:A.size < kX:=by omega have a:B.size < kX:=by omega have j:(W0 (ao+n)).toNat=ao+n:=X3 щ have l:(W0 ao).toNat=ao+0:=X3 щ have k:(W0 bo).toNat=bo+0:=X3 щ rw [aJu_eq A B ao bo n i c d b2 _ e a j (by omega) n 0 _ _ 1023 (by omega) (by omega) l k, aDu_eq A B ao bo n i c d b2 _ _ e a j щ n 0 _ _ 0 0 0 0 щ щ l k] have g:=Dense.bO (n+2) (fA A ao n i d) (fA B bo n c b2) unfold Dense.gf at g rw [AD m] at g exact g · rw [AC h]; rfl lemma aDok (a c:Nat → Word) (N:Nat) (d:ἆ) (g:N < 262144) (h:Dense.dl a c N d 0 0 0 0 0 < 4294967296):dotOf N a c=O2 (Dense.dl a c N d 0 0 0 0 0):= Dense.fE a c N d (by exact Qc g) _ 0 0 0 0 0 rfl (by exact ϟ N) (λ_ h=>absurd h (by (clear * - h;omega))) (ц) (ц) (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 (W0 ao) (W0 bo) (W0 (ao+n)) a1 b1 a2 b2 (aJs a2 b2 (aJs a1 b1 g)) 0 0 0 0 else 4294967296 if r < 4294967296 then O2 r else ad2x A B ao bo n a1 b1 a2 b2 lemma ad4_eq (g:ἆ) (A B:Ἂ Word) (ao bo n:Nat) (d a c b2:Word): ad4 g A B ao bo n d a c b2=dotOf (n+2) (fA A ao n d c) (fA B bo n a b2):=by unfold ad4;dsimp only;split_ifs with h o o ·have:=ς;rw[aDu_eq A B ao bo n d a c b2 _ _ щ щ (uO щ) щ n 0 (.ofNat ao) (.ofNat bo) 0 0 0 0 щ щ (uO щ) (uO щ)]at o⊢;exact(aDok _ _ _ _ h.1 o).symm ·exact ad2x_eq .. ·exact absurd o ж ·exact ad2x_eq .. lemma gqT (a b:Word):|(tm a b:ℝ)| ≤ 2^(48+idxOf a+idxOf b):=by have A:∀ w:Word,|(sv w:ℝ)| ≤ 2^24:=fun w=>(show |(sv w:ℝ)|=mantOf w by unfold sv; split_ifs <;> simp).trans_le (by exact_mod_cast (mantOf_lt_24 w).le) unfold tm; push_cast calc |(sv a:ℝ)*sv b*2^(idxOf a+idxOf b)|=|(sv a:ℝ)| * |(sv b:ℝ)| * 2^(idxOf a+idxOf b):=by rw [Ae,Ae,AW (show (0:ℝ) < 2^(idxOf a+idxOf b) by positivity)] _ ≤ 2^24*2^24*2^(idxOf a+idxOf b):=by gcongr <;> exact A _ _=2^(48+idxOf a+idxOf b):=by rw [← AF,← AF]; congr 1; omega lemma gqI {w:Word} (h:idxOf w ≤ 253):expOf w≠255:=by intro e; simp [idxOf,e] at h lemma gqE {w:Word} (h:(expOf w).toNat ≤ 254):expOf w≠255:=by intro e; simp [e] at h lemma 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 d c; obtain rfl:t=n:=by omega rw [aos _ _ _ _ (M1 t),aoe _ _ _ _ AP,aoe _ _ _ _ AP] | succ k e => intro t a d c; have h:t < n:=by omega rw [aos _ _ _ _ щ,aos _ _ _ _ h]; exact e (t+1) _ щ h @[noinline] def gqY (A B:@& Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad2x A B ao bo n a1 b1 a2 b2 @[noinline] def gqX (g:ἆ) (A B:@& Ἂ Word) (ao bo n:Nat) (a1 b1 a2 b2:Word):Word:=ad4 g A B ao bo n a1 b1 a2 b2 lemma gqH {A:ἀ} {i:Ἄ} (h:i < A.usize):i.toNat < A.size:=by have:=ε.mp h rw [FloatArray.usize,lX,J7] at this exact U1 this (Ay _ _) @[inline] def gqF (A:ἀ) (i:Ἄ):Ἅ:=if h:i < A.usize then A.uget i (gqH h) else 0 lemma 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,J7,γ hA]; exact h unfold gqF; rw [AT g] rcases A with ⟨d⟩ simp only [nN] exact (AB d i.toNat h).symm def gqS (X W:ἀ) (i j e:Ἄ) (v:Ἅ):Ἅ:= if h:i < e then gqS X W (i+1) (j+1) e (v+gqF X i*gqF W j) else v termination_by e.toNat-i.toNat decreasing_by exact aUd h lemma gqS_eq (X W:ἀ) (p:ℕ → Ἅ) (d wo n:ℕ) (e:Ἄ) (hX:X.size < kX) (o:W.size < kX) (l:e.toNat=d+n) (x:d+n ≤ X.size) (w:wo+n ≤ W.size) (u:∀ s < n,p s=X.data[d+s]!*W.data[wo+s]!) : ∀ k t (i j:Ἄ) v,n-t=k → t ≤ n → i.toNat=d+t → j.toNat=wo+t → gqS X W i j e v=Dense.F.ao p n t v:=by intro k;induction k<;>intro t i j v m r c h ·obtain rfl:t=n:=by omega rw[gqS,dif_neg (by rw[ε,c,l];omega),aoe _ _ _ _ AP] ·rename_i q;have a:tr.push (dw w)) (kJ A.size) lemma gqD_s (A:Ἂ Word):(gqD A).size=A.size∧∀ q < A.size,(gqD A).data[q]! =dw A[q]!:=by unfold gqD apply Kr (motive:=λi (r:ἀ)=>r.size=i∧∀ q < i,r.data[q]! =dw A[q]!) · exact ⟨rfl,λq h=>absurd h (D4 _)⟩ · intro i r ⟨a,c⟩ refine ⟨by rw [bW,a],λq hq=>?_⟩ rw [s5push_get] rcases U8.1 hq with hq|rfl · rw [AD (a ▸ hq)]; exact c _ hq · rw [AC щ,AD a.symm,AB A _ i.2]; rfl def gqM (A:Ἂ Word):Nat:=A.foldl (λm w=>max m (idxOf w)) 0 lemma gqM_le (A:Ἂ Word) (q:Nat):idxOf A[q]! ≤ gqM A:=by by_cases hq:q < A.size · exact Kr (as:=A) (motive:=λi (m:Nat)=>∀ q < i,idxOf A[q]! ≤ m) (λq h=>absurd h (D4 _)) (λi m h q hq=>by rcases U8.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 (λm w=>max m (expOf w).toNat) 0 lemma gqN_le (A:Ἂ Word) (q:Nat):(expOf A[q]!).toNat ≤ gqN A:=by by_cases hq:q < A.size · exact Kr (as:=A) (motive:=λi (m:Nat)=>∀ q < i,(expOf A[q]!).toNat ≤ m) (λq h=>absurd h (D4 _)) (λi m h q hq=>by rcases U8.1 hq with hq|rfl · exact (h q hq).trans (le_max_left _ _) · rw [AB A _ i.2]; exact le_max_right _ _) q hq · rw [An A q hq,show (expOf (default:Word)).toNat=0 by decide]; exact ϟ _ def gMn (A:Ἂ Word) (k e:Ἄ) (m:ἆ):ἆ:= if h:k < e then gMn A (k+1) e (let a:=aGt A k; if a&&&0x7FFFFFFF==0 then m else min m (iW a)) else m termination_by e.toNat-k.toNat decreasing_by exact aUd h @[noinline] def gG (inW H:Nat) (x wih:@& Ἂ Word):ἆ:= gMn x 0 x.usize 511+gMn wih (W0 (2*H*inW)) (W0 (3*H*inW)) 511 @[inline] def aKd {n:Nat} (f:Fin n → Word):Ἂ Word:=da (λi=>if h:i < n then f ⟨i,h⟩ else 0) n (lQ n) lemma aKd_eq {n:Nat} (f:Fin n → Word):aKd f=kK f:=by unfold aKd; rw [iC]; congr 1; funext q; exact AT q.isLt @[inline] def xh1 (inW H:Nat) (x h:Ἂ Word) (t:Nat):Ἂ Word := let ti:=W0 (t*inW) let iU:=W0 inW aKd (n:=inW+H+1) λj => let jU:=W0 j.val if j.val < inW then aGt x (ti+jU) else if j.val < inW+H then aGt h (jU-iU) else oneW def wcat (G inW H:Nat) (wih whh bih:Ἂ Word):Ἂ Word := Array.ofFn (n:=G*H*(inW+H+1)) λ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) λq=>whh[2*H*H+q.val]! def bsub (H:Nat) (bhh:Ἂ Word):Ἂ Word := aKd (n:=H) λ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)) lemma mulN_eq (a b:Word):mulN a b=toWord (Model.mul (ofW a) (ofW b)):=by unfold mulN; split · rename_i h simp only [Η,AM,Ak] at h have g:=Bn.NativeAdd.bK a h.1 have j:=Bn.NativeAdd.bK b h.2 have e:=FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32_mul_of_isFinite (lx a) (lx b) g.2 j.2 simp only [FloatLib.Floats.ExecFloat.Binary.toModel_ofFloat32,Bn.NativeAdd.en,g.1,j.1] at e have E:=congrArg toWord e rw [← Bn.NativeAdd.en,Bn.NativeAdd.ja] at E exact E · rfl @[inline] def wcF (k:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἂ Word := wcat k.1.1 k.1.2.1 k.1.2.2 k.2.1 k.2.2.1 k.2.2.2 @[inline] def wcEq (a b:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἆ := a.1==b.1&&wcAeq a.2.1 b.2.1&&wcAeq a.2.2.1 b.2.2.1&&wcAeq a.2.2.2 b.2.2.2 lemma wcEq_ok (a b:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word) (h:wcEq a b=true):a=b:=by obtain ⟨n,m,o,i⟩:=a; obtain ⟨j,b2,k,l⟩:=b simp only [wcEq,Η,AQ] at h obtain ⟨⟨⟨e,d⟩,c⟩,g⟩:=h rw [e,wcAeq_ok d,wcAeq_ok c,wcAeq_ok g] @[noinline] def wcS:ST.Ref Unit (Ἂ (WcE wcF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wcG (G inW H:Nat) (wih whh bih:Ἂ Word):Ἂ Word := (wcGet3 wcEq wcEq_ok wcS 32 ((G,inW,H),wih,whh,bih) (λk=>k.2.1)).1 lemma wcG_v (G e H:Nat) (a d c:Ἂ Word):wcG G e H a d c=wcat G e H a d c:= s5wcGet3_val _ @[inline] def wbF (k:(Nat × Nat × Nat) × Ἂ Word × Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word:=(wsub k.1.1 k.2.1,bsub k.1.1 k.2.2.1) @[noinline] def wbS:ST.Ref Unit (Ἂ (Dense.F.WcE wbF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wbG (H:Nat) (whh bhh:Ἂ Word):Ἂ Word × Ἂ Word:=(Dense.F.wcGet3 wcEq wcEq_ok wbS 32 ((H,0,0),whh,bhh,#[]) (λk=>k.2.1)).1 lemma wbG_v (H:Nat) (c a:Ἂ Word):wbG H c a=(wsub H c,bsub H a):=s5wcGet3_val _ @[inline] def wdF (k:Ἂ Word):ἀ:=gqD k @[noinline] def wdS:ST.Ref Unit (Ἂ (Dense.F.WcE wdF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def wdG (A:Ἂ Word):ἀ:=(Dense.F.wcGet3 Dense.F.wcAeq (λ_ _ h=>Dense.F.wcAeq_ok h) wdS 32 A (λk=>k)).1 lemma wdG_v (A:Ἂ Word):wdG A=gqD A:=s5wcGet3_val _ @[specialize] def rcL (T H:Nat) (step:Nat → Ἂ Word × Ἂ Word → Ἂ Word × Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word) (out:Ἂ Word):Ἂ Word:= if t < T then let s:=step t st rcL T H step (t+1) s (out++s.1) else out termination_by T-t lemma rcL_eq (T H:Nat) (d f:Nat → Ἂ Word × Ἂ Word → Ἂ Word × Ἂ Word) (e:Ἂ Word × Ἂ Word) (G:∀ t < T,∀ r,d t r=f t r) (B:∀ t r,(f t r).1.size=H) : rcL T H d 0 e (lQ (T*H))=recurWith T H f e:=by let g:=λ(j:(Ἂ Word × Ἂ Word) × Ἂ (Ἂ Word)) t=> ((f t j.1,j.2.push (f t j.1).1):(Ἂ Word × Ἂ Word) × Ἂ (Ἂ Word)) let F:=λn=>(lj n).foldl g (e,#[]) have s:∀ n,F (n+1)=g (F n) n:=λn=>by simp only [F,mD,l6,Ϸ,mT] have w:∀ n,(F n).2.size=n:=by intro n; induction n with | zero=>rfl | succ n o=>rw [s]; simp [g,o] have J:∀ n i,i < n → (F n).2[i]?=some (f i (F i).1).1:=by intro n; induction n with | zero=>intro i h; omega | succ n o => intro i h rw [s]; simp only [g]; rw [Array.getElem?_push,w] by_cases hi:i=n · subst hi; simp · rw [AC hi]; exact o i щ have u:∀ k t (a:Ἂ Word),T-t=k → t ≤ T → a.size=t*H → (∀ q < t*H,a[q]?=some (((F T).2[q/H]!)[q%H]!)) → rcL T H d t (F t).1 a=kK (n:=T*H) λq=>((F T).2[q.val/H]!)[q.val%H]!:=by intro k; induction k with | zero => intro t a I K l hq obtain rfl:t=T:=by omega rw [rcL,AC (K4 _)] apply mi · simp [l] · intro i A L have:=hq i щ rw [lC A] at this simp only [Λ] exact pj.inj this | succ k o => intro t a I K l hq have c:t < T:=by omega rw [rcL,AD c]; dsimp only have x:f t (F t).1=(F (t+1)).1:=by rw [s] have p:=B t (F t).1 rw [x] at p rw [G t c,x] refine o (t+1) _ щ щ (by rw [Qe,p,l,Ο]) (λq z=>?_) rw [Array.getElem?_append] split · exact hq q щ · rename_i D rw [l] at D have m:q/H=t:=mG щ z have v:q%H=q-a.size:=by have:=ϛ q H; rw [m,Ϗ] at this; rw [l]; omega have y:=J T t c rw [lC (by rw [w]; exact c)] at y rw [Ο] at z rw [m,v,AB (F T).2 t (by rw [w]; exact c),pj.inj y,x, lC (by rw [p,l]; omega),AB _ _ (by rw [p,l]; omega)] rw [recurWith] have C:=u T 0 (lQ (T*H)) щ (ϟ _) ц (λq h=>by omega) exact C lemma 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 lemma dotOf_congr {n m:Nat} (a:n=m) {e d ga c:Nat → Word} (k : ∀ j,j < n → e j=ga j) (g : ∀ j,j < n → d j=c j) : dotOf n e d=dotOf m ga c:=by subst a unfold dotOf have h:(kK (n:=n) λi=>e i.val)=kK (n:=n) λi=>ga i.val := congrArg kK (funext λi=>k i.val i.isLt) have l:(kK (n:=n) λi=>d i.val)=kK (n:=n) λi=>c i.val := congrArg kK (funext λi=>g i.val i.isLt) rw [h,l] @[inline] def exU (w:Word):ἆ:=(expOf w).toUInt64 @[inline] def ixU (w:Word):ἆ:=let e:=exU w; if e==0 then 0 else e-1 @[inline] def mxE (e:ἆ):ἆ:=if e < 56 then 55 else e-1 lemma xU (w:Word):(exU w).toNat=(expOf w).toNat∧(ixU w).toNat=idxOf w∧(expOf w).toNat < 256∧idxOf w < 256:=by have h:=expOf_toNat_lt w refine ⟨ϩ _,?_,h,by unfold idxOf; split <;> omega⟩ unfold ixU idxOf exU; dsimp only by_cases e:expOf w=0 · simp [e] · have:(expOf w).toNat≠0:=fun x=>e (Β.1 (by simpa using x)) have a:(expOf w).toUInt64≠0:=λx=>this (by have:=congrArg lq x; simpa using this) rw [AC e,AC (by simpa using a),χ _ _ (by rw [θ]; simp; omega)]; simp lemma mxU (e:ἆ):(mxE e).toNat=max (e.toNat-1) 55:=by unfold mxE; split <;> rename_i h <;> rw [μ] at h · simp at h ⊢; omega · rw [χ _ _ (by rw [θ]; simp at h ⊢; omega)]; simp at h ⊢; omega @[inline] def wk (c:Ἆ) (P0 L:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word):Word:= let P:=max P0 (48+ixU a+ixU b) if c&&exU a != 255&&exU b != 255&&P+L ≤ 425 then let o:=Dense.F.ak (S+Dense.F.dw a*Dense.F.dw b) (P+2*L-54) if o < 4294967296 then o.toUInt32 else f () else f () lemma afR (n:ℕ) (d e:ℕ → Word):Core.af (n+1) (λs=>d ((s+1)%(n+1))) (λs=>e ((s+1)%(n+1)))=Core.af (n+1) d e:=by unfold Core.af rw [Ν,lV] simp only [Nat.mod_self] congr 1 exact ϔ rfl λs a=>by rw [γ (by simp at a; omega)] def aoR (d e:ℕ → Word) (n:ℕ):Ἅ:=Dense.F.ao (λs=>Dense.F.dw (d (s+1))*Dense.F.dw (e (s+1))) n 0 (Dense.F.dw (d 0)*Dense.F.dw (e 0)) abbrev gwB (a b:Word) (i E:ℕ):Prop:=idxOf a ≤ 253∧(expOf b).toNat ≤ 254∧idxOf a+idxOf b ≤ i+max (E-1) 55 lemma gwJE {w:Word} {E:ℕ} (h:(expOf w).toNat ≤ E):idxOf w ≤ max (E-1) 55:= (by unfold idxOf;split;exact ϟ _;exact O3 h 1:idxOf w ≤ E-1).trans (le_max_left _ _) lemma gwT {a b:Word} {i E:ℕ} (h:i ≤ 253) (N:E ≤ 254) (u:idxOf a ≤ i) (v:(expOf b).toNat ≤ E):gwB a b i E:=⟨u.trans h,v.trans N,E0 u (gwJE v)⟩ lemma gwJ {n i E:ℕ} {d e:ℕ → Word} (h:i ≤ 253) (N:E ≤ 254) (m:∀ s ≤ n,idxOf (d s) ≤ i∧(expOf (e s)).toNat ≤ E):∀ s ≤ n,gwB (d s) (e s) i E:=λs u=>gwT h N (m s u).1 (m s u).2 lemma gwG {a b A B X E:ℕ} (u:a ≤ A) (v:b ≤ B):126+a ≤ max X (126+max A B-max (E-1) 55)+max (E-1) 55∧126+b ≤ max X (126+max A B-max (E-1) 55)+max (E-1) 55:=by omega lemma wk_eq (n i E:ℕ) (d e:ℕ → Word) (c:Ἆ) (l L:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word) (I:d (n+1)=a) (C:e (n+1)=b) (z:c=true → S=aoR d e n) (D:c=true → (∀ s ≤ n,gwB (d s) (e s) i E)∧i ≤ 253∧E ≤ 254∧l.toNat=48+i+max (E-1) 55∧n+3 ≤ 2^L.toNat∧L.toNat ≤ 27) (t:f ()=dotOf (n+2) d e):wk c l L a b S f=dotOf (n+2) d e:=by subst I C unfold wk;dsimp only split ·rename_i h simp only[Η,AM,Ak,AJ]at h obtain ⟨⟨⟨r,J⟩,w⟩,p⟩:=h obtain ⟨m,hi,N,G,U,H⟩:=D r obtain ⟨F,B,X,V⟩:=xU (d (n+1));obtain ⟨A,b2,T,O⟩:=xU (e (n+1)) have hQ:(max l (48+ixU (d (n+1))+ixU (e (n+1)))).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1))):=by simp only[Kl,η,B,b2,G];simp only[kA,nr,Kt];congr 1;exact γ (by clear * - V O;omega) generalize max l (48+ixU (d (n+1))+ixU (e (n+1)))=P at hQ p ⊢ rw[θ,η,hQ]at p;simp only[nr,kA]at p rw[γ (by clear * - hi N V O H;omega)]at p split ·rename_i ho have q:=gqL (λs=>Dense.F.dw (d (s+1))*Dense.F.dw (e (s+1))) n n 0 (Dense.F.dw (d 0)*Dense.F.dw (e 0)) щ (ϟ _) rw[z r,aoR,←q]at ho ⊢ have K:∀ s ≤ n+1,|(tm (d s) (e s):ℝ)| ≤ 2^(max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1)))):=λs u=>(gqT _ _).trans (AU one_le_two (by rcases u.lt_or_eq with u|rfl ·have:=(m s щ).2.2;omega ·exact le_max_right _ _)) have g:Core.aG (n+2) d e:=λk u=>by rcases U8.1 u with u|rfl ·exact ⟨gqI (m k щ).1,gqE (m k щ).2.1⟩ ·exact ⟨λx=>J (ξ.1 (by rw[F,x];rfl)),λx=>w (ξ.1 (by rw[A,x];rfl))⟩ obtain ⟨fS,v⟩:=Dense.F.kE1 (n+1) (λs=>d ((s+1)%(n+1+1))) (λs=>e ((s+1)%(n+1+1))) _ _ _ L.toNat (λs o=>by rw[γ щ];exact Dense.F.dJ _ _ (g _ щ).1 (g _ щ).2) (by rw[Nat.mod_self];exact Dense.F.dJ _ _ (g 0 щ).1 (g 0 щ).2) (λs o=>K _ (by have:=ϊ (s+1) (show n+1+1>0 by omega);omega)) щ H p rw[afR]at v have hA:|(Core.af (n+1+1) d e:ℝ)| ≤ (2:ℝ)^(425:ℤ):=by rw[Core.aK,K8,Core.af,R9,add_comm] refine (Dense.F.cv (n+1) _ _ _ (λs M=>K s M.le) (K (n+1) AP) (n+1) AP).trans ?_ have y:((n+1:ℕ):ℝ)+1≤2^L.toNat:=by exact_mod_cast (show n+1+1≤2^L.toNat by omega) refine (AE y (pow_nonneg zero_le_two _)).trans ?_ rw[←AF,←AA];exact AG one_le_two (by rw[Τ];exact_mod_cast p) have hq:(P+2*L-54).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1)))+2*L.toNat-54:=by have:(P+2*L).toNat=max (48+i+max (E-1) 55) (48+idxOf (d (n+1))+idxOf (e (n+1)))+2*L.toNat:=by rw[η,ύ,hQ];simp only[kA,nr,Ze,Nat.mod_succ_eq_iff_lt,Nat.succ_eq_add_one,Kd];clear * - p H;omega rw[χ _ _ (by rw[θ,this];simp only[kA];clear * - p H;omega),this];simp only[kA] exact Dense.F.cw (n+2) d e g _ fS _ (by rw[hq];clear * - p H;omega) (by rw[hq];exact v) hA ho ·exact t ·exact t @[inline] def wk2 (i e:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word):Word:=wk (i ≤ 253&&e ≤ 254) (48+i+mxE e) 2 a b S f lemma wk2_eq (n:ℕ) (d e:ℕ → Word) (iU eU:ἆ) (a b:Word) (S:Ἅ) (f:Unit → Word) (k:d (n+1)=a) (c:e (n+1)=b) (g:S=aoR d e n) (i:∀ s ≤ n,idxOf (d s) ≤ iU.toNat∧(expOf (e s)).toNat ≤ eU.toNat) (l:eU.toNat < 256) (m:n ≤ 1) (j:f ()=dotOf (n+2) d e):wk2 iU eU a b S f=dotOf (n+2) d e:= wk_eq n iU.toNat eU.toNat d e _ _ _ a b S f k c (λ_=>g) (λh=>by simp only [Η,AJ,θ,kA] at h refine ⟨gwJ h.1 h.2 i,h.1,h.2,?_,by simp only [kA]; omega,by simp only [kA]; omega⟩ rw [η,η,mxU]; simp; omega) j @[inline] def cl2 (a1 b1 a2 b2:Word):Word:= wk2 (ixU a1) (exU b1) a2 b2 (Dense.F.dw a1*Dense.F.dw b1) λ_=>gqY #[] #[] 0 0 0 a1 b1 a2 b2 lemma cl2_eq (a1 b1 a2 b2:Word):cl2 a1 b1 a2 b2=dotOf 2 (λj=>if j=0 then a1 else a2) (λj=>if j=0 then b1 else b2):= wk2_eq 0 _ _ _ _ _ _ _ _ rfl rfl (by rw [aoR,Dense.F.aoe _ _ _ _ AP]; rfl) (fun s hs=>by obtain rfl:s=0:=by omega exact ⟨(xU a1).2.1.ge,(xU b1).1.ge⟩) (by rw [(xU b1).1]; exact expOf_toNat_lt b1) щ (by unfold gqY; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j hj <;> simp [fA]) @[inline] def gqU2 (D1:Ἅ) (n z h:Word):Word:= let dn:=Dense.F.dw n wk2 (ixU n) (max 127 (exU (negW z))) h z (dn*D1+dn*Dense.F.dw (negW z)) λ_=>gqY #[n] oneA 0 0 1 n (negW z) h z lemma gqU2_eq (n z h:Word):gqU2 (Dense.F.dw oneW) n z h=dotOf 3 (λj=>if j=2 then h else n) (λj=>if j=0 then oneW else if j=1 then negW z else z):= wk2_eq 1 _ _ _ _ _ _ _ _ rfl rfl (by rw [aoR,Dense.F.aos _ _ _ _ (by omega),Dense.F.aoe _ _ _ _ AP]; rfl) (λs c=>by have:(expOf oneW).toNat=127:=by decide rcases (by omega:s=0∨s=1) with rfl|rfl <;> simp [(xU n).2.1,(xU (negW z)).1,Kl,this]) (by rw [Kl,(xU _).1]; have:=expOf_toNat_lt (negW z); simp; omega) щ (by unfold gqY; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j a <;> rcases (by omega:j=0∨j=1∨j=2) with rfl|rfl|rfl <;> simp [fA,oneA]) @[specialize] def cellI (sig tanh:Word → Word) (H:Nat) (pre:Ἂ Word) (u:Nat) (cs:Ἂ Word):Ἂ Word := if u < H then let HU:=W0 H let uU:=W0 u cellI sig tanh H pre (u+1) (cs.set! u (cl2 (sig (aGt pre (HU+uU))) cs[u]! (sig (aGt pre uU)) (tanh (aGt pre (HU+HU+uU))))) else cs termination_by H-u @[specialize] def hidI (sig tanh:Word → Word) (H:Nat) (pre cell:Ἂ Word) (u:Nat) (hs:Ἂ Word):Ἂ Word := if u < H then let HU:=W0 H let uU:=W0 u hidI sig tanh H pre cell (u+1) (hs.set! u (mulN (sig (aGt pre (HU+HU+HU+uU))) (tanh (aGt cell uU)))) else hs termination_by H-u lemma lpE {H:Nat} {L:Nat → Ἂ Word → Ἂ Word} {f:Nat → Ἂ Word → Word} (d:∀ u a,L u a=if u < H then L (u+1) (a.set! u (f u a)) else a) (c:∀ q u a v,u < q → f q (a.set! u v)=f q a) (u:Nat) (a:Ἂ Word) (e:a.size=H) : L u a=kK (n:=H) λq=>if q.val < u then a[q.val]! else f q a:=by rw [d]; split · rw [lpE d c (u+1) _ ((BU ..).trans e)] congr 1; funext q split_ifs <;> first | omega | rw [c _ _ _ _ щ] | rw [P7 _ _ _ _ щ] | rw [show q.val=u by omega,H8 _ _ _ щ] · apply mi · simp [e] · intro i g h; rw [Λ,if_pos щ,← AB a i g] termination_by H-u lemma cellI_get (d a:Word → Word) (H:Nat) (c e:Ἂ Word) (h:e.size=H) : cellI d a H c 0 e=kK (n:=H) λu=>let U:=W0 u.val;let Z:=W0 H;cl2 (d (aGt c (Z+U))) e[u.val]! (d (aGt c U)) (a (aGt c (Z+Z+U))):= lpE (cellI.eq_1 d a H c) (λ_ _ _ _ _=>by rw [P7 _ _ _ _ щ]) 0 e h lemma hidI_get (e a:Word → Word) (H:Nat) (d c g:Ἂ Word) (h:g.size=H) : hidI e a H d c 0 g=kK (n:=H) λu=>let U:=W0 u.val;let Z:=W0 H;mulN (e (aGt d (Z+Z+Z+U))) (a (aGt c U)):= lpE (hidI.eq_1 e a H d c) (λ_ _ _ _ _=>rfl) 0 g h @[inline] def lstmTail (sig tanh:Word → Word) (H:Nat) (pre cs hs:Ἂ Word):Ἂ Word × Ἂ Word := let HU:=W0 H let H2:=W0 (2*H) let H3:=W0 (3*H) if cs.size=H∧hs.size=H then let cell:=cellI sig tanh H pre 0 cs (hidI sig tanh H pre cell 0 hs,cell) else let cell:=aKd (n:=H) λu => let uU:=W0 u.val cl2 (sig (aGt pre (HU+uU))) (aGt cs uU) (sig (aGt pre uU)) (tanh (aGt pre (H2+uU))) let hidden:=aKd (n:=H) λu => let uU:=W0 u.val mulN (sig (aGt pre (H3+uU))) (tanh (aGt cell uU)) (hidden,cell) @[inline] def lstmStep (lin:LinFn) (sig tanh:Word → Word) (inW H:Nat) (x Wc bhh:Ἂ Word) (t:Nat) (st:Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word := lstmTail sig tanh H (lin 1 (inW+H+1) (4*H) false (xh1 inW H x st.1 t) Wc bhh) st.2 st.1 @[specialize] def lstmK (lin:LinFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := if T*inW+inW+4*H <= 4294967295 then rcL T H (lstmStep lin sig tanh inW H x (wcG 4 inW H wih whh bih) bhh) 0 (mB H 0,mB H 0) (lQ (T*H)) else lstmWith dotOf sig tanh T inW H x wih whh bih bhh def gqB2 (D1:Ἅ) (bih:Ἂ Word) (H:Nat):ἀ:=⟨kK (n:=H) λu=>D1*Dense.F.dw bih[2*H+u.val]!⟩ def sx4 (X W B:ἀ) (u i e j0 j1 j2 j3:Ἄ) (a0 a1 a2 a3:Ἅ) (out:ἀ):ἀ:= if h:i < e then let x:=gqF X i sx4 X W B u (i+1) e (j0+1) (j1+1) (j2+1) (j3+1) (a0+x*gqF W j0) (a1+x*gqF W j1) (a2+x*gqF W j2) (a3+x*gqF W j3) out else (((out.push (a0+gqF B u)).push (a1+gqF B (u+1))).push (a2+gqF B (u+2))).push (a3+gqF B (u+3)) termination_by e.toNat-i.toNat decreasing_by exact aUd h def gqP1 (X W B:ἀ) (iU wb xo:Ἄ) (H u:Nat) (out:ἀ):ἀ:= if u+4 ≤ H then let uU:=W0 u let w0:=wb+uU*iU let w1:=w0+iU let w2:=w1+iU let w3:=w2+iU let x0:=gqF X xo gqP1 X W B iU wb xo H (u+4) (sx4 X W B uU (xo+1) (xo+iU) (w0+1) (w1+1) (w2+1) (w3+1) (x0*gqF W w0) (x0*gqF W w1) (x0*gqF W w2) (x0*gqF W w3) out) else if u < H then let uU:=W0 u let w0:=wb+uU*iU gqP1 X W B iU wb xo H (u+1) (out.push (gqS X W (xo+1) (w0+1) (xo+iU) (gqF X xo*gqF W w0)+gqF B uU)) else out termination_by H-u def gqP (X W B:ἀ) (iU wb:Ἄ) (inW H T t:Nat) (out:ἀ):ἀ:= if t < T then gqP X W B iU wb inW H T (t+1) (gqP1 X W B iU wb (W0 (t*inW)) H 0 out) else out termination_by T-t lemma setG (a:Ἂ Word) (i:Nat) (v:Word) (q:Nat) (hi:i < a.size) (hq:q < a.size) : (a.set! i v)[q]! = if q=i then v else a[q]!:=by rw [Array.set!_eq_setIfInBounds,AB _ q (by simp; omega),AB a q hq] by_cases h:q=i · subst h; simp · rw [if_neg h,Array.getElem_setIfInBounds]; split · rename_i e; exact absurd e.symm h · rfl @[specialize] def mapI (f:Word → Word) (i e:Nat) (a:Ἂ Word):Ἂ Word := if i+4 ≤ e then let w0:=a[i]!; let w1:=a[i+1]!; let w2:=a[i+2]!; let w3:=a[i+3]! let o0:=f w0; let o1:=f w1; let o2:=f w2; let o3:=f w3 mapI f (i+4) e ((((a.set! i o0).set! (i+1) o1).set! (i+2) o2).set! (i+3) o3) else if i < e then mapI f (i+1) e (a.set! i (f a[i]!)) else a termination_by e-i lemma set4G (a:Ἂ Word) (i:Nat) (c g d e:Word) (q:Nat) (hi:i+3 < a.size) (hq:q < a.size) : ((((a.set! i c).set! (i+1) g).set! (i+2) d).set! (i+3) e)[q]! = if q=i+3 then e else if q=i+2 then d else if q=i+1 then g else if q=i then c else a[q]!:=by rw [setG _ _ _ _ (by simp; omega) (by simp; omega),setG _ _ _ _ (by simp; omega) (by simp; omega), setG _ _ _ _ (by simp; omega) (by simp; omega),setG _ _ _ _ щ hq] lemma mapI_get (f:Word → Word) (e:Nat) : ∀ k i (a:Ἂ Word),e-i=k → e ≤ a.size → (mapI f i e a).size=a.size ∧ ∀ q,q < a.size → (mapI f i e a)[q]! = if i ≤ q∧q < e then f a[q]! else a[q]!:=by intro k;induction k using O4 with | _ k c => intro i a d g rw[mapI] by_cases h4:i+4≤ e ·rw[if_pos h4];dsimp only have S:((((a.set! i (f a[i]!)).set! (i+1) (f a[i+1]!)).set! (i+2) (f a[i+2]!)).set! (i+3) (f a[i+3]!)).size=a.size:=by simp only[BU] have I:=c (k-4) (by omega) (i+4) ((((a.set! i (f a[i]!)).set! (i+1) (f a[i+1]!)).set! (i+2) (f a[i+2]!)).set! (i+3) (f a[i+3]!)) (by rw[←X5,d]) (by rw[S];exact g) rw[S]at I refine ⟨I.1,λq hq=>?_⟩ rw[I.2 q hq,set4G _ _ _ _ _ _ _ щ hq];clear I S c rcases M6 q (i+4) with j|j ·rw[if_neg щ];split_ifs<;>first | omega | (subst_vars;rfl) | rfl ·simp only[(by omega:¬q=i+3∧¬q=i+2∧¬q=i+1∧¬q=i∧i≤q),j,true_and,ἂ] ·rw[if_neg h4] by_cases h1:i< e ·rw[if_pos h1] have S:(a.set! i (f a[i]!)).size=a.size:=by simp only[BU] have I:=c (k-1) щ (i+1) (a.set! i (f a[i]!)) (by rw[←X5,d]) (by rw[S];exact g) rw[S]at I refine ⟨I.1,λq hq=>?_⟩ rw[I.2 q hq,setG _ _ _ _ щ hq];clear I S c split_ifs<;>first | omega | (subst_vars;rfl) | rfl ·rw[if_neg h1] exact ⟨rfl,λq hq=>by rw[if_neg щ]⟩ def updI (D1:Ἅ) (H:Nat) (R h:Ἂ Word) (u:Nat) (N:Ἂ Word):Ἂ Word := if u < H then let uU:=W0 u updI D1 H R h (u+1) (N.set! u (gqU2 D1 N[u]! (aGt R (W0 H+uU)) (aGt h uU))) else N termination_by H-u lemma updI_get (a:Ἅ) (H:Nat) (R h:Ἂ Word) : ∀ k u (N:Ἂ Word),H-u=k → H ≤ N.size → (updI a H R h u N).size=N.size ∧ ∀ q,q < N.size → (updI a H R h u N)[q]! = if u ≤ q∧q < H then gqU2 a N[q]! (aGt R (W0 H+W0 q)) (aGt h (W0 q)) else N[q]!:=by intro k;induction k<;>intro u N d e<;>rw[updI] ·rw[AC щ];exact⟨rfl,λq _=>by rw[AC щ]⟩ ·rename_i c;rw[AD (by omega)];dsimp only exact⟨by rw[(c _ _ щ (by simp;omega)).1,BU],λq hq=>by rw[(c _ _ щ (by simp;omega)).2 q (by simp;omega),setG _ _ _ _ щ hq];split_ifs<;>first|omega|(subst_vars;rfl)|rfl⟩ lemma upmI_size (f:Word → Word) (a:Ἅ) (H:Nat) (R h C:Ἂ Word) (c:C.size=H) : (updI a H R h 0 (mapI f 0 H C)).size=H:=by obtain⟨A,-⟩:=mapI_get f H H 0 C щ щ;rw[(updI_get a H R h H 0 _ щ щ).1,A,c] lemma upmI_get (f:Word → Word) (a:Ἅ) (H:Nat) (R h C:Ἂ Word) (c:C.size=H) (q:Nat) (hq:q < H) : (updI a H R h 0 (mapI f 0 H C))[q]! = gqU2 a (f C[q]!) (aGt R (W0 H+W0 q)) (aGt h (W0 q)):=by obtain⟨A,B⟩:=mapI_get f H H 0 C щ щ;rw[(updI_get a H R h H 0 _ щ щ).2 q щ,AD ⟨by omega,hq⟩,B q щ,AD ⟨by omega,hq⟩] @[inline] def gqK3 (Sx:ἀ) (P0 L:ἆ) (x wih bih:Ἂ Word) (inW H t:Nat) (ok:Ἆ) (tH:Ἄ) (u:Nat) (uU:Ἄ) (a b:Word):Word:= wk ok P0 L a b (gqF Sx (tH+uU)) λ_=>gqX (gG inW H x wih) x wih (t*inW) ((2*H+u)*inW) inW oneW bih[2*H+u]! a b @[inline] def gruStepF (lin:LinFn) (sig tanh:Word → Word) (inW H T:Nat) (x Wrz Whn bhn bhh:Ἂ Word) (D1:Ἅ) (cand:Nat → Ἆ → Ἄ → Nat → Ἄ → Word → Word → Word) (ok:Ἆ) (t:Nat) (st:Ἂ Word × Ἂ Word):Ἂ Word × Ἂ Word := let a:=lin 1 (inW+H+1) (2*H) false (xh1 inW H x st.1 t) Wrz bhh let hn:=lin 1 H H false st.1 Whn bhn let okt:=ok&&decide (t < T) let tH:=W0 (t*H) let HU:=W0 H let R:=mapI sig 0 (2*H) a let C:=aKd (n:=H) λu=> let uU:=W0 u.val cand t okt tH u.val uU (aGt hn uU) (aGt R uU) (updI D1 H R st.1 0 (mapI tanh 0 H C),st.2) @[specialize] def gruK0 (lin:LinFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := if T*inW+inW+4*H <= 4294967295 then let ix:=max (gqM x) 126 let E:=max (gqN wih) (gqN bih) let L:=Aq (inW+3)+1 let Xd:=gqD x let Wd:=wdG wih let D1:=Dense.F.dw oneW let ok:=decide (ix ≤ 253∧E ≤ 254∧L ≤ 27∧0 < inW∧T*inW ≤ x.size∧3*H*inW ≤ wih.size∧x.size <= 4294967295∧wih.size <= 4294967295∧T*H <= 4294967295) let Sx:=if ok then gqP Xd Wd (gqB2 D1 bih H) (W0 inW) (W0 (2*H*inW)) inW H T 0 (kJ (T*H)) else kJ 0 let wb:=wbG H whh bhh rcL T H (gruStepF lin sig tanh inW H T x (wcG 2 inW H wih whh bih) wb.1 wb.2 bhh D1 (gqK3 Sx (lh (48+ix+max (E-1) 55)) (lh L) x wih bih inW H) ok) 0 (mB H 0,#[]) (lQ (T*H)) else gruWith dotOf sig tanh T inW H x wih whh bih bhh lemma gqSs {X W:ἀ} {i e:Ἄ} (h:i < e) (j:Ἄ) (v:Ἅ):gqS X W i j e v=gqS X W (i+1) (j+1) e (v+gqF X i*gqF W j):=by rw[gqS,AT h] lemma gqSe {X W:ἀ} {i e:Ἄ} (h:¬ i < e) (j:Ἄ) (v:Ἅ):gqS X W i j e v=v:=by rw[gqS,dif_neg h] lemma sx4_eq (X W B:ἀ) (u e:Ἄ) (a:ἀ):∀ k (i m d j2 j3:Ἄ) (c j g l:Ἅ),e.toNat-i.toNat=k → sx4 X W B u i e m d j2 j3 c j g l a=(((a.push (gqS X W i m e c+gqF B u)).push (gqS X W i d e j+gqF B (u+1))).push (gqS X W i j2 e g+gqF B (u+2))).push (gqS X W i j3 e l+gqF B (u+3)):=by intro k;induction k<;>intro i m d j2 j3 c j g l n ·have h:¬iby rw [Dense.F.bW] at hi; rw [Dense.F.s5push_get]; split · exact h i ‹_› · rw [AD щ,a]; congr 1; omega def gU (X W B:ἀ) (iU wb xo:Ἄ) (u:Nat):Ἅ:=gqS X W (xo+1) (wb+W0 u*iU+1) (xo+iU) (gqF X xo*gqF W (wb+W0 u*iU))+gqF B (W0 u) lemma gUs (X W B:ἀ) (iU c a w v:Ἄ) (u:Nat) (d:w=c+W0 u*iU) (e:v=W0 u) : gU X W B iU c a u=gqS X W (a+1) (w+1) (a+iU) (gqF X a*gqF W w)+gqF B v:=by rw [gU,d,e] lemma gA1 (g i:Ἄ) (u:Nat):g+W0 (u+1)*i=g+W0 u*i+i:=by rw[mC,Oa,←I9];congr 1;exact Ob _ lemma gA2 {X W B:ἀ} {iU g j w v:Ἄ} {H e:Nat} {F:ℕ → Ἅ} (d:∀ u < H,F (e+u)=gU X W B iU g j u) (u:Nat) (h:u < H) (a:g+W0 u*iU=w) (b:v=W0 u):gqS X W (j+1) (w+1) (j+iU) (gqF X j*gqF W w)+gqF B v=F (e+u):=((d u h).trans (gUs _ _ _ _ _ _ _ _ _ a.symm b)).symm lemma gqP1_s (X W B:ἀ) (iU g j:Ἄ) (H e:Nat) (F:ℕ → Ἅ) (d:∀ u < H,F (e+u)=gU X W B iU g j u) : ∀ k u a,H-u=k → u ≤ H → a.size=e+u → (∀ i < a.size,a.data[i]! = F i) → (gqP1 X W B iU g j H u a).size=e+H∧∀ i < e+H,(gqP1 X W B iU g j H u a).data[i]! = F i:=by intro k;induction k using O4 with | _ k l => intro u a m n c ho rw[gqP1] split ·dsimp only rw[sx4_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rfl] refine l (k-4) щ (u+4) _ щ щ (by simp only[bW,c];omega) (pF (pF (pF (pF ho (by rw[c,d u щ];rfl)) ?_) ?_) ?_) all_goals(simp only[bW,c,pA];exact gA2 d _ щ (by simp only[gA1]) (mC ..).symm) ·split ·dsimp only exact l (k-1) щ (u+1) _ щ щ (by rw[bW,c];omega) (pF ho (by rw[c,d u щ];rfl)) ·obtain rfl:u=H:=by omega exact⟨c,λi h=>ho i щ⟩ lemma gqP_s (X W B:ἀ) (iU d:Ἄ) (c H T:Nat) : ∀ k t a,T-t=k → t ≤ T → a.size=t*H → (∀ i < a.size,a.data[i]! = gU X W B iU d (W0 (i/H*c)) (i%H)) → (gqP X W B iU d c H T t a).size=T*H∧∀ i < T*H,(gqP X W B iU d c H T t a).data[i]! = gU X W B iU d (W0 (i/H*c)) (i%H):=by intro k;induction k<;>intro t a l o g ho<;>rw[gqP] ·obtain rfl:t=T:=by omega rw[AC щ];exact⟨g,λi h=>ho i щ⟩ ·rename_i m;rw[AD (by omega)];obtain⟨e,n⟩:=gqP1_s X W B iU d (.ofNat (t*c)) H (t*H) _ (fun u j=>by rw[Τ,Ρ _ _ (by omega),ώ j,Κ,Μ,γ j]) _ 0 a rfl (ϟ _) (by omega) ho exact m (t+1) _ щ щ (by rw[e,Ο]) (by rw[e];exact n) lemma gqSx (x d e:Ἂ Word) (c H T t u:Nat) (a b:Word) (z:t < T) (g:u < H) (r:0 < c) (G:T*c ≤ x.size) (A:3*H*c ≤ d.size) (y:x.size <= 4294967295) (p:d.size <= 4294967295) (F:T*H <= 4294967295) : gqF (gqP (gqD x) (gqD d) (gqB2 (Dense.F.dw oneW) e H) (W0 c) (W0 (2*H*c)) c H T 0 (kJ (T*H))) (W0 (t*H)+W0 u)=aoR (fA x (t*c) c oneW a) (fA d ((2*H+u)*c) c e[2*H+u]! b) c:=by have s:=ς obtain⟨w,v⟩:=gqP_s (gqD x) (gqD d) (gqB2 (dw ld) e H) (.ofNat c) (.ofNat (2*H*c)) c H T T 0 (kJ (T*H)) щ (ϟ _) (by rw[ϳ];rfl) (λ_ h=>nomatch h) have q:=nO t H▸ι H z rw[←mC,gqV _ _ щ (by rw[uO щ,w];omega),uO щ,v _ щ,Τ (t*H),Ρ _ _ щ,ώ g,Κ,Μ,γ g,gU,aoR] obtain⟨sx,o⟩:=gqD_s x;obtain⟨D,k⟩:=gqD_s d have m1:=nO t c▸ι c z have C:(2*H+u)*c+c ≤ 3*H*c:=by rw[← Ο];exact ι _ щ have m3:=H1 (3*H) r have j:(W0 (t*c))б=t*c:=uO щ have l:(W0 (2*H*c)+W0 u*W0 c)б=(2*H+u)*c:=by rw[←BP,←mC,←Ϡ];exact uO щ obtain⟨m,rfl⟩:∃ m,c=m+1:=⟨c-1,by omega⟩ rw[gqL _ m m 0 _ щ (ϟ _)] congr 1 ·rw[gqV _ _ (by omega) (by omega),gqV _ _ (by omega) (by omega),j,l,o _ (by omega),k _ (by omega)] exact gqS_eq _ _ _ (t*(m+1)+1) ((2*H+u)*(m+1)+1) m _ (by omega) (by omega) (by rw[← mC,uO (by omega)];omega) (by omega) (by omega) (λs B=>by simp only[fA,AD (show s+1 < m+1 by omega)];rw[o _ щ,k _ щ];congr 3<;>omega) m 0 _ _ _ щ (ϟ _) (by rw[aUs щ,j]) (by rw[aUs щ,l]) ·rw[gqV _ _ (by simp[gqB2,kS];omega) (by rw[uO щ];simp[gqB2,kS];exact g),uO щ];simp[gqB2,fA,g] lemma gqK3_eq (x d e:Ἂ Word) (c H t u ix E L:Nat) (ok:Ἆ) (i:ἀ) (a b:Word) (hi:∀ q:ℕ,idxOf x[q]! ≤ ix) (v:126 ≤ ix) (l:∀ q:ℕ,(expOf d[q]!).toNat ≤ E) (m:∀ q:ℕ,(expOf e[q]!).toNat ≤ E) (y:c+3 ≤ 2^L) (g:ok=true → ix ≤ 253∧E ≤ 254∧L ≤ 27∧gqF i (W0 (t*H)+W0 u)=aoR (fA x (t*c) c oneW a) (fA d ((2*H+u)*c) c e[2*H+u]! b) c) : gqK3 i (lh (48+ix+max (E-1) 55)) (lh L) x d e c H t ok (W0 (t*H)) u (W0 u) a b= dotOf (c+2) (fA x (t*c) c oneW a) (fA d ((2*H+u)*c) c e[2*H+u]! b):= wk_eq _ ix E _ _ _ _ _ _ _ _ _ (by simp[fA]) (by simp[fA]) (fun h=>(g h).2.2.2) (fun h=>by obtain⟨p,o,r,-⟩:=g h have k:(lh L).toNat=L:=Α (by unfold n0;omega) refine⟨gwJ p o λs j=>?_,p,o,Α (by unfold n0;omega),k.symm▸y,k.symm▸r⟩ simp only[fA];split_ifs;exact⟨hi _,l _⟩;exact⟨v.trans' ж,m _⟩;omega) (by exact ad4_eq ..) lemma xh1_get (a H:Nat) (x h:Ἂ Word) (t j:Nat) (d:j < a+H+1) (g:t*a+a+H < 4294967296) : (xh1 a H x h t)[j]! = if j < a then x[t*a+j]! else if j < a+H then h[j-a]! else oneW:=by rw [xh1,aKd_eq,gofn _ _ d]; dsimp only split · rw [← mC,aGn _ _ щ] · split · rw [aGt_eq,R6 _ _ (by rw [R4,uO щ,uO щ]; omega),uO щ,uO щ] · rfl lemma wcat_get (G a H:Nat) (e g d:Ἂ Word) (k j:Nat) (m:k < G*H) (h:j < a+H+1) : (wcat G a H e g d)[k*(a+H+1)+j]! = if j < a then e[k*a+j]! else if j < a+H then g[k*H+(j-a)]! else d[k]!:=by rw [wcat,gofn _ _ (by have:=ι (a+H+1) m; rw [Ο] at this; omega)] have i:(k*(a+H+1)+j)/(a+H+1)=k:=by rw [Ϗ,G6 щ,ώ h,ϑ] have l:(k*(a+H+1)+j)%(a+H+1)=j:=by rw [Ϗ,E6,γ h] simp only [i,l] lemma pre_eq (G d H:Nat) (x e m l o h:Ἂ Word) (t:Nat) (g:t*d+d+H < 4294967296) : linearSpec 1 (d+H+1) (G*H) false (xh1 d H x h t) (wcat G d H e m l) o = kK (n:=G*H) λk=>gateWith dotOf d H x e m l o h t k.val:=by apply mi · simp only [linearSpec,linearWith,Ϝ,n4] · intro i r p have hi:i < G*H:=p.trans_eq Ϝ simp only [linearSpec,linearWith,Λ,ώ hi,γ hi,ϳ,Κ,act,υ,ἂ] unfold gateWith apply dotOf_congr щ <;> intro j q <;> by_cases a:j < d+H+1 <;> simp only [a,ἁ,ἂ] · rw [xh1_get _ _ _ _ _ _ a g] · simp only [show ¬ j < d by omega,show ¬ j < d+H by omega,ἂ] · rw [wcat_get _ _ _ _ _ _ _ _ hi a]; split_ifs <;> first | rfl | omega · simp only [show ¬ j < d by omega,show ¬ j < d+H by omega,show j≠d+H by omega,ἂ] lemma hn_eq (H:Nat) (a d h:Ἂ Word) : linearSpec 1 H H false h (wsub H a) (bsub H d) = Array.ofFn (n:=H) λu=>dotOf (H+1) (λj=>if j < H then h[j]! else oneW) (λj=>if j < H then a[(2*H+u.val)*H+j]! else d[2*H+u.val]!):=by apply mi ·simp only[mj,linearWith,Ϝ,n4] ·intro i k g have hi:i < H:=g.trans_eq Ϝ simp only[mj,linearWith,Λ,ώ hi,γ hi,ϳ,Κ,act,υ,Am] refine dotOf_congr rfl (λ_ _=>rfl) λj e=>?_ split_ifs ·rw[wsub,aKd_eq,gofn _ _ (by have:=ι H hi;rw[nO]at this;omega)];congr 1;ring ·rw[bsub,aKd_eq,gofn _ _ hi] lemma gruStepF_eq (j m:Word → Word) (c H T:Nat) (x h d i e:Ἂ Word) (ok:Ἆ) (l:Nat → Ἆ → Ἄ → Nat → Ἄ → Word → Word → Word) (t:Nat) (g:t*c+c+4*H < 4294967296) (r:∀ u < H,∀ a b,l t (ok&&decide (t < T)) (W0 (t*H)) u (W0 u) a b= dotOf (c+2) (fA x (t*c) c oneW a) (fA h ((2*H+u)*c) c i[2*H+u]! b)) (o:Ἂ Word × Ἂ Word) : gruStepF linearSpec j m c H T x (wcat 2 c H h d i) (wsub H d) (bsub H e) e (Dense.F.dw oneW) l ok t o= gruStepWith dotOf j m c H x h d i e t o:=by unfold gruStepF gruStepWith rw[pre_eq _ _ _ _ _ _ _ _ _ _ щ,hn_eq] dsimp only rw[aKd_eq] have M:=mapI_get j (2*H) (2*H) 0 congr 1;apply mi ·rw[upmI_size _ _ _ _ _ _ Ϝ,Ϝ] ·intro q s p have hq:q < H:=p.trans_eq Ϝ rw[←AB _ q s,←AB _ q p,upmI_get _ _ _ _ _ _ Ϝ _ hq,gofn _ _ hq,gofn _ _ hq] clear s p have b:q<4294967296∧H+q<4294967296∧q<2*H∧H+q<2*H:=by omega simp only[←mC,Fin.val_mk,aGn _ _ b.1,aGn _ _ b.2.1] rw[(M _ rfl Ϝ.ge).2 q (by rw[Ϝ];exact b.2.2.1),AD ⟨ϟ _,b.2.2.1⟩,(M _ rfl Ϝ.ge).2 (H+q) (by rw[Ϝ];exact b.2.2.2),AD ⟨ϟ _,b.2.2.2⟩,gqU2_eq,r _ hq] simp only[gofn _ _ hq,gofn _ _ b.2.2.1,gofn _ _ b.2.2.2,Fin.val_mk] rfl lemma lstmStep_eq (d c:Word → Word) (a H:Nat) (x h j i e:Ἂ Word) (t:Nat) (g:t*a+a+4*H < 4294967296) (k:Ἂ Word × Ἂ Word) : lstmStep linearSpec d c a H x (wcat 4 a H h j i) e t k=lstmStepWith dotOf d c a H x h j i e t k:=by unfold lstmStep lstmTail lstmStepWith split <;> simp (disch:=omega) only [pre_eq,cellI_get,hidI_get,aKd_eq,← mC,aGn,cl2_eq,mulN_eq,← L7,← Ο] lemma tB (T a H t:Nat) (c:t < T) (g:T*a+a+4*H <= 4294967295):t*a+a+4*H < 4294967296:=by have:=ι a (show t+1 ≤ T by omega); rw [Ο] at this; omega lemma lstmK_spec (c a:Word → Word):lstmK linearSpec c a=lstmWith dotOf c a:=by funext T inW H x wih whh bih bhh unfold lstmK; split · rename_i g rw [wcG_v] exact rcL_eq _ _ _ _ _ (λt e d=>lstmStep_eq c a inW H x wih whh bih bhh t (tB T inW H t e g) d) (λt d=>Ϝ) · rfl lemma gruK0_spec (d c:Word → Word):gruK0 linearSpec d c=gruWith dotOf d c:=by funext T inW H x wih whh bih bhh unfold gruK0;split ·rename_i g dsimp only rw[wcG_v,wbG_v,wdG_v] refine rcL_eq _ _ _ _ _ (λt s l=>gruStepF_eq d c inW H T x wih whh bih bhh _ _ t (tB T inW H t s g) (λu v a b=> gqK3_eq x wih bih inW H t u _ _ _ _ _ a b (λq=>le_max_of_le_left (gqM_le x q)) (le_max_right _ _) (λq=>le_max_of_le_left (gqN_le wih q)) (λq=>le_max_of_le_right (gqN_le bih q)) (ϙ (n:=inW+3)).le (λh=>?_)) l) (λt l=>Ϝ) simp only[Η,AJ]at h obtain⟨⟨o,i,m,k4,j,p,r,k,k9⟩,e⟩:=h exact⟨o,i,m,by rw[AD (A6 ⟨o,i,m,k4,j,p,r,k,k9⟩)];exact gqSx x wih bih inW H T t u a b e v k4 j p r k k9⟩ ·rfl @[inline] def gqK3f (C:ἀ) (P0 L:ἆ) (x wih bih:Ἂ Word) (inW H t:Nat) (ok:Ἆ) (u:Nat) (uU:Ἄ) (a b:Word):Word:= wk ok P0 L a b (gqF C uU) λ_=>gqY x wih (t*inW) ((2*H+u)*inW) inW oneW bih[2*H+u]! a b lemma gqK3f_eq (x g e:Ἂ Word) (d H t u ix E L:Nat) (ok:Ἆ) (C:ἀ) (a b:Word) (hi:∀ q:ℕ,idxOf x[q]! ≤ ix) (l:126 ≤ ix) (w:∀ s < d,(expOf g[(2*H+u)*d+s]!).toNat ≤ E) (p:∀ q:ℕ,(expOf e[q]!).toNat ≤ E) (y:d+3 ≤ 2^L) (i:ok=true → ix ≤ 253∧E ≤ 254∧L ≤ 27∧gqF C (W0 u)=aoR (fA x (t*d) d oneW a) (fA g ((2*H+u)*d) d e[2*H+u]! b) d) : gqK3f C (lh (48+ix+max (E-1) 55)) (lh L) x g e d H t ok u (W0 u) a b= dotOf (d+2) (fA x (t*d) d oneW a) (fA g ((2*H+u)*d) d e[2*H+u]! b):= wk_eq d ix E (fA x (t*d) d oneW a) (fA g ((2*H+u)*d) d e[2*H+u]! b) ok (lh (48+ix+max (E-1) 55)) (lh L) a b (gqF C (W0 u)) _ (by simp [fA]) (by simp [fA]) (λh=>(i h).2.2.2) (λh=>by obtain ⟨r,n,o,-⟩:=i h have k:(lh L).toNat=L:=Α (by unfold n0; omega) have v:(lh (48+ix+max (E-1) 55)).toNat=48+ix+max (E-1) 55:=Α (by unfold n0; omega) have m:idxOf oneW=126:=by decide refine ⟨gwJ r n λs j=>?_,r,n,v,by rw [k]; omega,by rw [k]; exact o⟩ rcases M6 s d with j|j · simp only [fA,AD j]; exact ⟨hi _,w s j⟩ · obtain rfl:s=d:=by omega simp only [fA,AX,ἂ,ἁ]; exact ⟨m ▸ l,p _⟩) (by unfold gqY; exact ad2x_eq _ _ _ _ _ _ _ _ _) @[inline] def fgQ (W:Ἂ Word) (ow n:Nat):ἀ × Ἂ ἇ × ἇ:= (Dense.F.wcGet3T Dense.F.wcK3eq (λa b=>Dense.F.wcK3eq_ok a b) Dense.F.wcT8S 32 (W,ow,n) (λk=>k.1) (λv=>Dense.F.tchP v.1) 3).1 @[inline] def fq8 (X Q:ἀ) (xo iU i0:Ἄ) (hY:xo.toNat+iU.toNat ≤ X.size∧xo.toNat+iU.toNat < 2^31) (hQ:i0.toNat+8*iU.toNat ≤ Q.size∧i0.toNat+8*iU.toNat < 2^31) (h1:(1:Ἄ).toNat ≤ iU.toNat):Dense.F.A8:= let x0:=gqF X xo Dense.F.sM Q X xo iU i0 hY hQ 1 h1 (x0*gqF Q (i0+W0 0)) (x0*gqF Q (i0+W0 1)) (x0*gqF Q (i0+W0 2)) (x0*gqF Q (i0+W0 3)) (x0*gqF Q (i0+W0 4)) (x0*gqF Q (i0+W0 5)) (x0*gqF Q (i0+W0 6)) (x0*gqF Q (i0+W0 7)) theorem fsQ{k:Ἄ}{n:Nat}(l:Nat)(h:kб+8≤n)(a:l<8:=by decide):(k+W0 l)бsimp only[BT]<;>exact fsQ _ h.1 else A @[noinline] def gfG (x wih whh bih bhh h:@& Ἂ Word) (inW H t k:Nat):Word:= ad2x (xh1 inW H x h t) (aKd (n:=inW+H) λj=>if j.val < inW then wih[k*inW+j.val]! else whh[k*H+(j.val-inW)]!) 0 0 (inW+H) oneW bih[k]! oneW bhh[k]! @[noinline] def gfN (whh bhh h:@& Ἂ Word) (H k:Nat):Word:= ad2x h whh 0 (k*H) (H-1) h[H-1]! whh[k*H+(H-1)]! oneW bhh[k]! @[inline] def wkS (c:Ἆ) (Q:ἆ) (S:Ἅ) (f:Unit → Word):Word:= if c then let o:=Dense.F.ak S Q if o < 4294967296 then o.toUInt32 else f () else f () @[inline] def fgG (c:Ἆ) (Q:ἆ) (CB:ἀ) (x wih whh bih bhh h:Ἂ Word) (inW H t:Nat) (k:Ἄ) (v:Ἅ)(hk:kбgfG x wih whh bih bhh h inW H t k.toNat @[inline] def fgH (c:Ἆ) (Q:ἆ) (CB:ἀ) (whh bhh h:Ἂ Word) (H:Nat) (k:Ἄ) (v:Ἅ)(hk:kбgfN whh bhh h H k.toNat def fgA (Y Q CB:ἀ) (nU:Ἄ) (c:Ἆ) (P0:ἆ) (x wih whh bih bhh h:@& Ἂ Word) (inW H t G2:Nat)(hC:8*G2≤CB.size)(g:Nat) (A:Ἂ Word):Ἂ Word:= if hg:g < G2∧((0:Ἄ).toNat+nU.toNat ≤ Y.size∧(0:Ἄ).toNat+nU.toNat < 2^31) ∧ ((W0 (g*8)*nU).toNat+8*nU.toNat ≤ Q.size∧(W0 (g*8)*nU).toNat+8*nU.toNat < 2^31)∧(1:Ἄ).toNat ≤ nU.toNat then let r:=fq8 Y Q 0 nU (W0 (g*8)*nU) hg.2.1 hg.2.2.1 hg.2.2.2 let k:=W0 (8*g) have hq:=fsQk hg.1 hC fgA Y Q CB nU c P0 x wih whh bih bhh h inW H t G2 hC (g+1) (st8 A k (fgG c P0 CB x wih whh bih bhh h inW H t k r.a0 ((V1 _ 7).trans_lt hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+1) r.a1 (fsQ 1 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+2) r.a2 (fsQ 2 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+3) r.a3 (fsQ 3 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+4) r.a4 (fsQ 4 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+5) r.a5 (fsQ 5 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+6) r.a6 (fsQ 6 hq)) (fgG c P0 CB x wih whh bih bhh h inW H t (k+7) r.a7 (fsQ 7 hq))) else A termination_by G2-g @[inline] def fgC (u:Ἄ) (r:Dense.F.A8) (B C:ἀ):ἀ:= if h:uб+8≤C.size∧uб+8≤B.size∧uб+8<2^31 then by refine (((((((C.uset u (r.a0+B.uget u ((V1 _ 7).trans_lt h.2.1)) ((V1 _ 7).trans_lt h.1)).uset (u+1) (r.a1+B.uget (u+1) ?_) ?_).uset (u+2) (r.a2+B.uget (u+2) ?_) ?_).uset (u+3) (r.a3+B.uget (u+3) ?_) ?_).uset (u+4) (r.a4+B.uget (u+4) ?_) ?_).uset (u+5) (r.a5+B.uget (u+5) ?_) ?_).uset (u+6) (r.a6+B.uget (u+6) ?_) ?_).uset (u+7) (r.a7+B.uget (u+7) ?_) ?_<;>first|exact fsQ _ h.2.1|(simp only[fsQw];exact fsQ _ h.1) else C def fgN (Y Qh Qx B CB:ἀ) (iU hU:Ἄ) (c:Ἆ) (P0:ἆ) (whh bhh h:@& Ἂ Word) (H G2 G3:Nat)(hC:8*G3≤CB.size)(g:Nat) (A:Ἂ Word) (C:ἀ):Ἂ Word × ἀ:= if hg:g < G3∧(iU.toNat+hU.toNat ≤ Y.size∧iU.toNat+hU.toNat < 2^31) ∧ ((W0 (g*8)*hU).toNat+8*hU.toNat ≤ Qh.size∧(W0 (g*8)*hU).toNat+8*hU.toNat < 2^31)∧(1:Ἄ).toNat ≤ hU.toNat ∧ ((0:Ἄ).toNat+iU.toNat ≤ Y.size∧(0:Ἄ).toNat+iU.toNat < 2^31) ∧ ((W0 (g*8)*iU).toNat+8*iU.toNat ≤ Qx.size∧(W0 (g*8)*iU).toNat+8*iU.toNat < 2^31)∧(1:Ἄ).toNat ≤ iU.toNat then let q:=fq8 Y Qh iU hU (W0 (g*8)*hU) hg.2.1 hg.2.2.1 hg.2.2.2.1 let r:=fq8 Y Qx 0 iU (W0 (g*8)*iU) hg.2.2.2.2.1 hg.2.2.2.2.2.1 hg.2.2.2.2.2.2 let k:=W0 (8*g) have hq:=fsQk hg.1 hC fgN Y Qh Qx B CB iU hU c P0 whh bhh h H G2 G3 hC (g+1) (st8 A k (fgH c P0 CB whh bhh h H k q.a0 ((V1 _ 7).trans_lt hq)) (fgH c P0 CB whh bhh h H (k+1) q.a1 (fsQ 1 hq)) (fgH c P0 CB whh bhh h H (k+2) q.a2 (fsQ 2 hq)) (fgH c P0 CB whh bhh h H (k+3) q.a3 (fsQ 3 hq)) (fgH c P0 CB whh bhh h H (k+4) q.a4 (fsQ 4 hq)) (fgH c P0 CB whh bhh h H (k+5) q.a5 (fsQ 5 hq)) (fgH c P0 CB whh bhh h H (k+6) q.a6 (fsQ 6 hq)) (fgH c P0 CB whh bhh h H (k+7) q.a7 (fsQ 7 hq))) (fgC (W0 (8*g-8*G2)) r B C) else (A,C) termination_by G3-g def fgK (C:ἀ) (c:Ἆ) (P0 L:ἆ) (x wih bih:@& Ἂ Word) (inW H t u:Nat) (A:Ἂ Word):Ἂ Word:= if u < H then let uU:=W0 u let HU:=W0 H fgK C c P0 L x wih bih inW H t (u+1) (A.set! (2*H+u) (gqK3f C P0 L x wih bih inW H t c u uU (aGt A (HU+HU+uU)) (aGt A uU))) else A termination_by H-u def fgB (A:@& Ἂ Word) (D1:Ἅ) (inW H u:Nat) (h:Ἂ Word) (Y:ἀ) (out:Ἂ Word):Ἂ Word × ἀ × Ἂ Word:= if u < H then let uU:=W0 u let HU:=W0 H let v:=gqU2 D1 (aGt A (HU+HU+uU)) (aGt A (HU+uU)) (aGt h uU) fgB A D1 inW H (u+1) (h.set! u v) (Y.set! (inW+u) (Dense.F.dw v)) (out.push v) else (h,Y,out) termination_by H-u def fgX (X:ἀ) (xo:Nat) (inW j:Nat) (Y:ἀ):ἀ:= if j < inW then fgX X xo inW (j+1) (Y.set! j (gqF X (W0 (xo+j)))) else Y termination_by inW-j @[specialize] def fgT (sig tanh:Word → Word) (X Qg Qh Qx B CB:ἀ) (ok:Ἆ) (ix E:Nat) (Pc Lc Lg Ln:ἆ) (D1:Ἅ) (x wih whh bih bhh:@& Ἂ Word) (inW H T t:Nat) (h:Ἂ Word) (Y:ἀ) (A:Ἂ Word) (C:ἀ) (out:Ἂ Word)(hC:3*H≤CB.size:=by exact Ϝ.ge):Ἂ Word:= if t < T then let Y:=fgX X (t*inW) inW 0 Y let i:=max ix (gqM h) let P:=48+i+max (E-1) 55 let c:=ok&&decide (i ≤ 253∧P+Lg.toNat ≤ 425) let A:=mapI sig 0 (2*H) (fgA Y Qg CB (W0 (inW+H+1)) c (lh P+2*Lg-54) x wih whh bih bhh h inW H t (2*H/8) ((H9 _ 8).trans ((ι H (B5 2)).trans hC)) 0 A) let AC:=fgN Y Qh Qx B CB (W0 inW) (W0 H) c (lh P+2*Ln-54) whh bhh h H (2*H/8) (3*H/8) ((H9 _ 8).trans hC) (2*H/8) A C let A:=mapI tanh (2*H) (3*H) (fgK AC.2 ok Pc Lc x wih bih inW H t 0 AC.1) let r:=fgB A D1 inW H 0 h Y out fgT sig tanh X Qg Qh Qx B CB ok ix E Pc Lc Lg Ln D1 x wih whh bih bhh inW H T (t+1) r.1 r.2.1 A AC.2 r.2.2 hC else out termination_by T-t @[specialize] def gruK (lin:LinFn) (sig tanh:Word → Word) (T inW H:Nat) (x wih whh bih bhh:Ἂ Word):Ἂ Word := if T*inW+inW+4*H <= 4294967295∧H%8=0∧0 < H∧0 < inW∧T*inW ≤ x.size∧3*H*inW ≤ wih.size∧3*H*H ≤ whh.size ∧ x.size <= 4294967295∧wih.size <= 4294967295∧whh.size <= 4294967295∧(3*H+16)*(inW+H+1) < 2^31 then let ix:=max (gqM x) 126 let Pg:=fgQ (wcG 2 inW H wih whh bih) (2*H) (inW+H+1) let Ph:=fgQ whh (3*H) H let Px:=fgQ wih (3*H) inW let E:=max (max Px.2.2.toNat Ph.2.2.toNat) (max (gqN bih) (gqN bhh)) let D1:=Dense.F.dw oneW let Lg:=Aq (inW+H+3)+1 let ok:=decide (ix ≤ 253∧E ≤ 254∧Lg ≤ 27) fgT sig tanh (gqD x) Pg.1 Ph.1 Px.1 (gqB2 D1 bih H) ⟨kK (n:=3*H) λk=>D1*Dense.F.dw bhh[k.val]!⟩ ok (max (gqM x) (126+max (gqM bih) (gqM bhh)-max (E-1) 55)) E (lh (48+ix+max (E-1) 55)) (lh (Aq (inW+3)+1)) (lh Lg) (lh (Aq (H+2)+1)) D1 x wih whh bih bhh inW H T 0 (mB H 0) (gqD (xh1 inW H x (mB H 0) 0)) (mB (3*H) 0) ⟨mB H 0⟩ (lQ (T*H)) else gruK0 lin sig tanh T inW H x wih whh bih bhh lemma aoSh (p:ℕ → Ἅ) (n t a):Dense.F.ao p (n+1) (t+1) a=Dense.F.ao (λs=>p (s+1)) n t a:=by by_cases h:t < n · rw [aos _ _ _ _ щ,aos _ _ _ _ h,aoSh] · rw [aoe _ _ _ _ щ,aoe _ _ _ _ щ] termination_by n-t decreasing_by omega lemma pA1 {W:Ἂ Word} {Y Q:ἀ} {o nU p:Ἄ} {O N n g l k j:Nat} {d e:ℕ → Word} (G:N=n+1) (H:k=8*g+l) (h:l < 8) (v:8*g+8 ≤ O) (D:nU.toNat=N) (x:(O+16)*N < 2^31) (I:W.size < 2^32) (m:O*N ≤ W.size) (hQ:Q=(Dense.F.wcT8F (W,O,N)).1) (J:o.toNat < Y.size) (r:Y.size < 2^31) (a:p.toNat=j+l) (i:j=g*8*N) (y:∀ s ≤ n,Y.data[o.toNat+s]! = dw (d s)) (q:∀ s ≤ n,W[k*N+s]! = e s) : Dense.F.ao (λs=>Y.data[o.toNat+s]! * Q.data[j+8*s+l]!) nU.toNat (1:Ἄ).toNat (gqF Y o*gqF Q p)=aoR d e n:=by subst G H i have B:=N0 (by decide:2^31 ≤ 2^32) ς obtain ⟨t,A⟩:=Dense.F.wcT8F_panel W O (n+1) x m I rw [← hQ,Ϗ] at t rw [← hQ] at A obtain ⟨m1,F⟩:g*8+8 ≤ 8*((O+7)/8)∧8*g+l < 8*((O+7)/8):=by clear * - v h; omega have C:=ι (n+1) m1 rw [Ϡ] at C have z:∀ s ≤ n,Q.data[g*8*(n+1)+8*s+l]! = dw (e s):=λs u=>by rw [show g*8*(n+1)+8*s+l=(g*(n+1)+s)*8+l by rw [Ϡ,Gs g 8,Ϗ 8 s],A s (J3 u) g l h F,if_pos (U1 (O1 h _) v),q s u] rw [D,aoR,mA,gqV Y o (U1 r B) J,gqV Q p (by rw [t]; exact C0 (ι _ ((H9 _ 8).trans (J1 ж O))) (U1 x B)) (by rw [t,a]; clear * - C h; omega),a,aoSh,← y 0 n.zero_le,← z 0 n.zero_le] exact GK.ao_congr _ _ _ _ 0 _ rfl λs _ w=>by rw [y (s+1) w,z (s+1) w] lemma pA2 {n i E} {d e:ℕ → Word} {c} {a L:ἆ} {b S z} {f:Unit → Word} (m:d (n+1)=oneW) (p:e (n+1)=b) (r:z=dw oneW*dw b) (q:S=aoR d e n) (g:c=true → (∀ s ≤ n,gwB (d s) (e s) i E)∧i ≤ 253∧E ≤ 254∧a.toNat=48+i+max (E-1) 55∧n+3 ≤ 2^L.toNat∧L.toNat ≤ 27∧174+(ixU b).toNat ≤ a.toNat∧exU b≠255∧a.toNat+L.toNat ≤ 425) (k:f ()=dotOf (n+2) d e):wkS c (a+2*L-54) (S+z) f=dotOf (n+2) d e:=by cases c · exact k rw [← wk_eq _ _ _ _ _ _ _ _ _ _ _ _ m p (λ_=>q) (λh=>let ⟨k1,k2,k3,k4,k5,k6,_⟩:=g h;⟨k1,k2,k3,k4,k5,k6⟩) k,r] unfold wkS wk obtain ⟨-,-,-,-,-,-,u,o,j⟩:=g rfl have:=xU b have l:max a (48+ixU oneW+ixU b)=a:=ξ.1 (by simp [Kl,show (ixU oneW).toNat=126 by decide]; omega) have t:a+L ≤ 425:=θ.2 (by rw [η,γ (C0 j ж)]; exact j) simp [l,t,o,show exU oneW≠255 by decide] lemma fgGv (x m o k e h:Ἂ Word) (d H t i E l g n:Nat) (c:Ἆ) (q L:ἆ) (Y Q C:ἀ) (nU A kU:Ἄ)(hkU)(ek:kUб=n) (D:n=8*g+l) (z:l < 8) (y:8*g+8 ≤ 2*H) (F:nU.toNat=d+H+1) (B:(2*H+16)*(d+H+1) < 2^31) (I:(wcat 2 d H m o k).size < 2^32) (hQ:Q=(Dense.F.wcT8F (wcat 2 d H m o k,2*H,d+H+1)).1) (p:Y.size=d+H+1) (J:∀ j < d+H+1,Y.data[j]! = Dense.F.dw (xh1 d H x h t)[j]!) (u:C.uget kU hkU=Dense.F.dw oneW*Dense.F.dw e[n]!) (v:A.toNat=(W0 (g*8)*nU).toNat+l) (r:(W0 (g*8)*nU).toNat=g*8*(d+H+1)) (g0:t*d+d+H < 4294967296) (K:c=true → (∀ s ≤ d+H,gwB (if s < d then x[t*d+s]! else if s < d+H then h[s-d]! else oneW) (if s < d then m[n*d+s]! else if s < d+H then o[n*H+(s-d)]! else if s=d+H then k[n]! else e[n]!) i E) ∧ i ≤ 253∧E ≤ 254∧q.toNat=48+i+max (E-1) 55∧d+H+3 ≤ 2^L.toNat∧L.toNat ≤ 27∧174+(ixU e[n]!).toNat ≤ q.toNat∧exU e[n]! ≠ 255∧q.toNat+L.toNat ≤ 425) : fgG c (q+2*L-54) C x m o k e h d H t kU (Dense.F.ao (λs=>Y.data[(0:Ἄ).toNat+s]! * Q.data[(W0 (g*8)*nU).toNat+8*s+l]!) nU.toNat (1:Ἄ).toNat (gqF Y 0*gqF Q A)) hkU=gateWith dotOf d H x m o k e h t n:=by have G:n < 2*H:=D ▸ U1 (O1 z _) y refine pA2 (by split_ifs <;> first | rfl | omega) (by split_ifs <;> first | rfl | omega) u (pA1 rfl D z y F B I (by exact Y3 Ϝ.symm) hQ (by simp [p]) (p ▸ (lZ _ (P4 _)).trans_lt B) v r (λs w=>by have:=J3 w; rw [Ϧ,Κ,J s this,xh1_get _ _ _ _ _ _ this g0]) λs w=>by rw [wcat_get _ _ _ _ _ _ _ _ G (J3 w)]; clear * - w; split_ifs <;> first | rfl | omega) K ?_ rw[ek];unfold gfG; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j M <;> by_cases a:j < d+H <;> first | simp [fA,a,aKd_eq,gofn _ _ a,xh1_get _ _ _ _ _ j (H4 a) g0] | simp [fA,a,show ¬ j < d by clear * - a; omega] lemma fgHv (d a h:Ἂ Word) (H i E l g e k:Nat) (c:Ἆ) (o L:ἆ) (Y Q y:ἀ) (iU n x kU:Ἄ)(hkU)(ek:kUб=e) (F:e=8*g+l) (B:l < 8) (w:8*g+8 ≤ 3*H) (K:2*H ≤ e) (t:iU.toNat=k) (A:n.toNat=H) (D:(3*H+16)*H < 2^31) (G:d.size < 2^32) (q:3*H*H ≤ d.size) (hQ:Q=(Dense.F.wcT8F (d,3*H,H)).1) (C:k+H+1 ≤ Y.size) (r:Y.size < 2^31) (I:∀ j < H,Y.data[k+j]! = Dense.F.dw h[j]!) (u:y.uget kU hkU=Dense.F.dw oneW*Dense.F.dw a[e]!) (v:x.toNat=(W0 (g*8)*n).toNat+l) (p:(W0 (g*8)*n).toNat=g*8*H) (J:c=true → (∀ s ≤ H-1,gwB (if s < H then h[s]! else oneW) (if s < H then d[e*H+s]! else a[e]!) i E) ∧ i ≤ 253∧E ≤ 254∧o.toNat=48+i+max (E-1) 55∧H-1+3 ≤ 2^L.toNat∧L.toNat ≤ 27∧174+(ixU a[e]!).toNat ≤ o.toNat∧exU a[e]! ≠ 255∧o.toNat+L.toNat ≤ 425) : fgH c (o+2*L-54) y d a h H kU (Dense.F.ao (λs=>Y.data[iU.toNat+s]! * Q.data[(W0 (g*8)*n).toNat+8*s+l]!) n.toNat (1:Ἄ).toNat (gqF Y iU*gqF Q x)) hkU=dotOf (H+1) (λj=>if j < H then h[j]! else oneW) (λj=>if j < H then d[e*H+j]! else a[e]!):=by obtain ⟨m,rfl⟩:∃ m,H=m+1:=⟨H-1,by clear * - w; omega⟩ refine pA2 (by simp) (by simp) u (pA1 rfl F B w A D G q hQ (by omega) r v p (λs _=>by rw [t,I s щ,if_pos щ]) λs _=>(if_pos щ).symm) J ?_ rw[ek];unfold gfN; rw [ad2x_eq]; apply dotOf_congr rfl <;> intro j z <;> clear * - z <;> simp only [fA,Κ] <;> split_ifs <;> first | rfl | omega | (subst_vars; rfl) lemma fgCv (x h n:Ἂ Word) (a H t g l i:Nat) (Y Q:ἀ) (iU y:Ἄ) (F:i=8*g-2*H+l) (A:l < 8) (C:2*H ≤ 8*g) (z:8*g+8 ≤ 3*H) (hi:iU.toNat=a) (I:0 < a) (D:(3*H+16)*a < 2^31) (B:h.size < 2^32) (r:3*H*a ≤ h.size) (hQ:Q=(Dense.F.wcT8F (h,3*H,a)).1) (o:a ≤ Y.size) (q:Y.size < 2^31) (G:∀ j < a,Y.data[j]! = Dense.F.dw x[t*a+j]!) (v:y.toNat=(W0 (g*8)*iU).toNat+l) (p:(W0 (g*8)*iU).toNat=g*8*a) : Dense.F.ao (λs=>Y.data[(0:Ἄ).toNat+s]! * Q.data[(W0 (g*8)*iU).toNat+8*s+l]!) iU.toNat (1:Ἄ).toNat (gqF Y 0*gqF Q y) +(gqB2 (Dense.F.dw oneW) n H).data[i]! = aoR (fA x (t*a) a oneW oneW) (fA h ((2*H+i)*a) a n[2*H+i]! oneW) a:=by obtain ⟨u,k⟩:i < H∧2*H+i=8*g+l:=by clear * - F A C z; omega obtain ⟨m,rfl⟩:∃ m,a=m+1:=⟨a-1,by omega⟩ rw [aoR,gqL _ m m 0 _ (pQ m) m.zero_le] refine congrArg₂ (·+·) (pA1 (d:=fA _ _ _ _ _) (e:=fA _ _ _ _ _) rfl k A z hi D B r hQ (by rw [Ϧ]; exact U1 m.succ_pos o) q v p (λs w=>by have:=J3 w; rw [Ϧ,Κ,aFl _ _ _ _ _ _ this,G s this]) λs w=>(aFl _ _ _ _ _ _ (J3 w)).symm) ?_ simp [gqB2,fA,AB,u] lemma qBz {α}[Inhabited α]{A:Ἂ α}{a b:Nat}{V:Nat→α}(h:b≤a):∀ q(if_neg λx=>U5.2 x.2 (h.trans x.1)).symm lemma qB1 {α}[Inhabited α]{A Z:Ἂ α}{k j:Nat}{V:Nat→α}{w}(h:A.size=Z.size∧∀ qif e:j=q then by subst e;rw[H8 _ _ _ (hq.trans_eq h.1.symm),a,if_pos ⟨d,M1 _⟩] else by rw[P7 _ _ _ _ e,h.2 q hq];exact if_congr щ rfl rfl⟩ lemma qBx {α}[Inhabited α]{B X:Ἂ α}{j c:Nat}{V:Nat→α}{w}(h:∀ q<(B.set! j w).size,X[q]! = if j+1≤q∧qby rw[h q (hq.trans_eq (BU ..).symm)];exact if e:j=q then by subst e;rw[if_neg щ,H8 _ _ _ hq,d,if_pos ⟨AP,a⟩] else by rw[P7 _ _ _ _ e];exact if_congr щ rfl rfl,a.le⟩ lemma uAd {a:Ἄ}{n k:Nat}(h:a.toNat+8*n<2^31)(d:k<8):(a+W0 k).toNat=a.toNat+k:=by rw[lJ,uO (d.trans ж)];exact γ ((D5 ((V1 ..).trans_lt h) d).trans_le (N0 ж ς)) lemma fsQo{n:Nat}(h:n+8<2^31):(W0 n)б=n:=uO щ lemma fsQe{n:Nat}(l:Nat)(h:n+8<2^31)(a:l<8:=by decide):(W0 n+W0 l)б=n+l:=by rw[← mC];exact uO щ lemma fsQu{X Y:Ἂ Word}{i j v p}(e:X=Y)(a:iб=j):X.uset i v p=Y.set! j v:=by subst e a;exact(dif_pos p).symm lemma fsQF{X B:ἀ}{d i j}{a:Ἅ}{p q}(e:X=⟨d⟩)(g:iб=j):X.uset i (a+B.uget i q) p=⟨d.set! j (a+B.data[j]!)⟩:=by subst e g;rw[AB B.data _ q];exact congrArg FloatArray.mk (dif_pos p).symm lemma fsQs{A:Ἂ Word}(n:Nat){o k i g d m l j:Word}(h:n+8≤A.size)(a:n+8<2^31): st8 A (W0 n) o k i g d m l j=(((((((A.set! n o).set! (n+1) k).set! (n+2) i).set! (n+3) g).set! (n+4) d).set! (n+5) m).set! (n+6) l).set! (n+7) j:=by have e:=fsQo a;unfold st8;rw[dif_pos (by rw[e];exact⟨h,a⟩)];iterate 8 refine fsQu ?_ ?_ all_goals first|rfl|exact fsQe _ a|exact e lemma fsQc(n:Nat){r:Dense.F.A8}{B C:ἀ}(h:n+8≤C.size)(d:n+8≤B.size)(a:n+8<2^31):fgC (W0 n) r B C= ⟨(((((((C.data.set! n (r.a0+B.data[n]!)).set! (n+1) (r.a1+B.data[n+1]!)).set! (n+2) (r.a2+B.data[n+2]!)).set! (n+3) (r.a3+B.data[n+3]!)).set! (n+4) (r.a4+B.data[n+4]!)).set! (n+5) (r.a5+B.data[n+5]!)).set! (n+6) (r.a6+B.data[n+6]!)).set! (n+7) (r.a7+B.data[n+7]!)⟩:=by have e:=fsQo a;unfold fgC;rw[dif_pos (by rw[e];exact⟨h,d,a⟩)];iterate 8 refine fsQF ?_ ?_ all_goals first|rfl|exact fsQe _ a|exact e lemma fgA_s (Y Q CB:ἀ) (nU:Ἄ) (c:Ἆ) (Qw:ἆ) (x wih whh bih bhh h:Ἂ Word) (inW H t G2:Nat)(hC)(h31:8*G2<2^31) (hb:∀ g < G2,((0:Ἄ).toNat+nU.toNat ≤ Y.size∧(0:Ἄ).toNat+nU.toNat < 2^31) ∧ ((W0 (g*8)*nU).toNat+8*nU.toNat ≤ Q.size∧(W0 (g*8)*nU).toNat+8*nU.toNat < 2^31)∧(1:Ἄ).toNat ≤ nU.toNat) (hv:∀ g < G2,∀ l < 8,∀ kk (kU Qi:Ἄ) hk,kUб=kk→kk=8*g+l → Qi.toNat=(W0 (g*8)*nU).toNat+l → fgG c Qw CB x wih whh bih bhh h inW H t kU (Dense.F.ao (λs=>Y.data[(0:Ἄ).toNat+s]! * Q.data[(W0 (g*8)*nU).toNat+8*s+l]!) nU.toNat (1:Ἄ).toNat (gqF Y 0*gqF Q Qi)) hk=gateWith dotOf inW H x wih whh bih bhh h t kk) : ∀ m g A,G2-g=m → 8*G2 ≤ A.size → (fgA Y Q CB nU c Qw x wih whh bih bhh h inW H t G2 hC g A).size=A.size ∧ ∀ q < A.size,(fgA Y Q CB nU c Qw x wih whh bih bhh h inW H t G2 hC g A)[q]! = if 8*g ≤ q∧q < 8*G2 then gateWith dotOf inW H x wih whh bih bhh h t q else A[q]!:=by intro m;induction m<;>intro g A a b<;>rw[fgA] · have:=W1 a;rw[dif_neg λx=>U5.2 x.1 this];exact⟨rfl,qBz (U0 8 this)⟩ rename_i ih;have c:=N1 a;have t:=U0 8 c;have h2:=t.trans_lt h31;rw[dif_pos ⟨c,hb g c⟩];simp only[fq8,Dense.F.sM_spec];rw[fsQs (8*g) (t.trans b) h2];generalize e:Xj _ _ _=B have s:B.size=A.size:=by subst e;simp only[BU] have x:=ih (g+1) B (congrArg B8 a) (b.trans_eq s.symm);subst e;have y:=qBx x.2 t ?_;iterate 7 have y:=qBx y.1 y.2 ?_ exact⟨x.1.trans s,y.1⟩ all_goals exact hv g c _ ж _ _ _ _ (by first|exact fsQe _ h2|exact fsQo h2) rfl (uAd (hb g c).2.1.2 ж) lemma fgN_s (Y I Qx B S:ἀ) (iU j:Ἄ) (c:Ἆ) (U:ἆ) (G F h:Ἂ Word) (H i n:Nat)(hC)(u:8*n<2^31)(L:8*n-8*i≤B.size) (T:Nat → Word) (O:Nat → Ἅ) (J:∀ g < n,(iU.toNat+j.toNat ≤ Y.size∧iU.toNat+j.toNat < 2^31) ∧ ((W0 (g*8)*j).toNat+8*j.toNat ≤ I.size∧(W0 (g*8)*j).toNat+8*j.toNat < 2^31)∧(1:Ἄ).toNat ≤ j.toNat ∧ ((0:Ἄ).toNat+iU.toNat ≤ Y.size∧(0:Ἄ).toNat+iU.toNat < 2^31) ∧ ((W0 (g*8)*iU).toNat+8*iU.toNat ≤ Qx.size∧(W0 (g*8)*iU).toNat+8*iU.toNat < 2^31)∧(1:Ἄ).toNat ≤ iU.toNat) (V:∀ g < n,i ≤ g → ∀ l < 8,∀ N (kU p:Ἄ) hk,kUб=N→N=8*g+l → p.toNat=(W0 (g*8)*j).toNat+l → fgH c U S G F h H kU (Dense.F.ao (λs=>Y.data[iU.toNat+s]! * I.data[(W0 (g*8)*j).toNat+8*s+l]!) j.toNat (1:Ἄ).toNat (gqF Y iU*gqF I p)) hk=T N) (X:∀ g < n,i ≤ g → ∀ l < 8,∀ K (p:Ἄ),K=8*g-8*i+l → p.toNat=(W0 (g*8)*iU).toNat+l → Dense.F.ao (λs=>Y.data[(0:Ἄ).toNat+s]! * Qx.data[(W0 (g*8)*iU).toNat+8*s+l]!) iU.toNat (1:Ἄ).toNat (gqF Y 0*gqF Qx p)+B.data[K]! = O K) : ∀ m g A C,n-g=m → i ≤ g → 8*n ≤ A.size → 8*n-8*i ≤ C.size → let R:=fgN Y I Qx B S iU j c U G F h H i n hC g A C R.1.size=A.size∧R.2.size=C.size∧(∀ q < A.size,R.1[q]! = if 8*g ≤ q∧q < 8*n then T q else A[q]!) ∧ (∀ q < C.size,R.2.data[q]! = if 8*g-8*i ≤ q∧q < 8*n-8*i then O q else C.data[q]!):=by intro m;induction m<;>intro g A C a b k l<;>rw[fgN] · have:=W1 a;rw[dif_neg λx=>U5.2 x.1 this];have:=U0 8 this;exact⟨rfl,rfl,qBz this,qBz (O3 this _)⟩ rename_i ih;have c:=N1 a;rw[dif_pos ⟨c,J g c⟩];simp only[fq8,Dense.F.sM_spec] have t:=U0 8 c;have E:8*(g+1)-8*i=8*g-8*i+8:=M8 (U0 8 b);have z:=E.symm.trans_le (O3 t _);have M:=t.trans_lt u rw[fsQs (8*g) (t.trans k) M,fsQc (8*g-8*i) (z.trans l) (z.trans L) (z.trans_lt ((I2 _ _).trans_lt u))];generalize f:Xj _ _ _=D,e:Xj _ _ _=A' have s:A'.size=A.size:=by subst e;simp only[BU] have d:D.size=C.data.size:=by subst f;simp only[BU] have ⟨o,r,v,w⟩:=ih (g+1) A' ⟨D⟩ (congrArg B8 a) (V6 b) (k.trans_eq s.symm) (l.trans_eq d.symm);simp only[kS,E] at w;subst e f have x:=qBx v t ?_;iterate 7 have x:=qBx x.1 x.2 ?_ have y:=qBx w z ?_;iterate 7 have y:=qBx y.1 y.2 ?_ exact⟨o.trans s,r.trans d,x.1,y.1⟩ iterate 8 exact X g c b _ ж _ _ rfl (uAd (J g c).2.2.2.2.1.2 ж) all_goals exact V g c b _ ж _ _ _ _ (by first|exact fsQe _ M|exact fsQo M) rfl (uAd (J g c).2.1.2 ж) lemma fgK_s (C:ἀ) (c:Ἆ) (j L:ἆ) (x h g:Ἂ Word) (i H t:Nat) (A0:Ἂ Word) (hA:3*H ≤ A0.size) (k:3*H < 4294967296) : ∀ m u A,H-u=m → u ≤ H → A.size=A0.size → (∀ q < A0.size,A[q]! = if 2*H ≤ q∧q < 2*H+u then gqK3f C j L x h g i H t c (q-2*H) (W0 (q-2*H)) A0[q]! A0[q-2*H]! else A0[q]!) → (fgK C c j L x h g i H t u A).size=A0.size ∧ ∀ q < A0.size,(fgK C c j L x h g i H t u A)[q]! = if 2*H ≤ q∧q < 3*H then gqK3f C j L x h g i H t c (q-2*H) (W0 (q-2*H)) A0[q]! A0[q-2*H]! else A0[q]!:=by intro m;induction m<;>intro u A a b c d<;>rw[fgK] · obtain rfl:u=H:=by omega rw[if_neg (K4 _)];exact⟨c,(Ο 2 _).symm▸d⟩ rename_i n;have e:=N1 a;have z:=(O1 e (2*H)).trans_eq (Ο 2 H).symm;have l:=H0 u (2*H);rw[if_pos e] exact n (u+1) _ (congrArg B8 a) e ((BU ..).trans c) (qB1 ⟨c,d⟩ (V1 ..) (by rw[ϱ,← mC,← mC,← two_mul,aGn _ _ (z.trans k),aGn _ _ (l.trans_lt (z.trans k)),d _ (z.trans_le hA),if_neg (mt And.right (K4 _)),d u (l.trans_lt (z.trans_le hA)),if_neg щ])).2 lemma fgB_s (A:Ἂ Word) (t:Ἅ) (g H s:Nat) (v:Ἂ Word) (Y0:ἀ) (V F:Nat → Word) (y:∀ j < H,F (s+j)=V j) (x:H < 4294967296) (B:∀ u < H,gqU2 t (aGt A (W0 H+W0 H+W0 u)) (aGt A (W0 H+W0 u)) v[u]! = V u) : ∀ m u h Y i,H-u=m → u ≤ H → h.size=H → (∀ q < H,h[q]! = if q < u then V q else v[q]!) → Y.size=Y0.size → g+H ≤ Y0.size → (∀ q < Y0.size,Y.data[q]! = if g ≤ q∧q < g+u then Dense.F.dw (V (q-g)) else Y0.data[q]!) → i.size=s+u → (∀ q < i.size,i[q]! = F q) → let R:=fgB A t g H u h Y i R.1.size=H∧(∀ q < H,R.1[q]! = V q)∧R.2.1.size=Y0.size ∧ (∀ q < Y0.size,R.2.1.data[q]! = if g ≤ q∧q < g+H then Dense.F.dw (V (q-g)) else Y0.data[q]!) ∧ R.2.2.size=s+H ∧ ∀ q < s+H,R.2.2[q]! = F q:=by intro m;induction m<;>intro u h Y o a b c d f k l n p<;>rw[fgB] · obtain rfl:u=H:=by omega rw[if_neg (K4 _)];exact⟨c,λq r=>(d q r).trans (if_pos r),f,l,n,n▸p⟩ rename_i z;have e:=N1 a;rw[if_pos e];dsimp only;rw[aGn h u (e.trans x),d u e,if_neg (K4 u),B u e] obtain ⟨w,p2⟩:=GK.pushF o F (s+u) n (n▸p) (V u) (y u e).symm exact z (u+1) _ _ _ (congrArg B8 a) e ((BU ..).trans c) (λq r=>if e:u=q then by subst e;rw[H8 _ _ _ (c▸r),if_pos (M1 _)] else by rw[P7 _ _ _ _ e,d q r];exact if_congr (by clear * - e;omega) rfl rfl) ((BU ..).trans f) k (qB1 ⟨f,l⟩ (V1 ..) (by rw[ϱ])).2 w (w▸p2) lemma fgX_s (X:ἀ) (e d:Nat) : ∀ m j Y,d-j=m → d ≤ Y.size → (fgX X e d j Y).size=Y.size ∧ ∀ q < Y.size,(fgX X e d j Y).data[q]! = if j ≤ q∧q < d then gqF X (W0 (e+q)) else Y.data[q]!:=by intro m;induction m<;>intro j Y a b<;>rw[fgX] · have:=W1 a;rw[if_neg (X2.2 this)];exact⟨rfl,qBz this⟩ rename_i g;have c:=N1 a;rw[if_pos c];have i:=g (j+1) (Y.set! j (gqF X (W0 (e+j)))) (congrArg B8 a) (b.trans_eq (BU ..).symm);exact⟨i.1.trans (BU ..),(qBx i.2 c rfl).1⟩ lemma aoRfA (A B:Ἂ Word) (ao bo n:Nat) (g i a b j l:Word):aoR (fA A ao n g a) (fA B bo n i b) n=aoR (fA A ao n g j) (fA B bo n i l) n:=by have k:∀ (C:Ἂ Word) o c (d m:Word) t,t ≤ n → fA C o n c d t=fA C o n c m t:=λ_ _ _ _ _ t h=>by rcases Hb h with e|rfl <;> simp [*,fA] unfold aoR; rw [k A ao g a j 0 (ϟ _),k B bo i b l 0 (ϟ _)] exact GK.ao_congr _ _ _ _ 0 _ rfl λs _ h=>by rw [k A ao g a j (s+1) h,k B bo i b l (s+1) h] lemma uMul (a b:Nat) (e:a < 4294967296) (d:b < 4294967296) (h:a*b < 4294967296):(W0 a*W0 b).toNat=a*b:=by have:=ς rw [BO,uO e,uO d,γ (U1 h (by rw [← nT]; exact this))] lemma qCw {a:Nat} (h:a < 2^31):a < 4294967296:=N3 h ж lemma fgBd (Y Q:ἀ) (d:Ἄ) (o n ow g:Nat) (ho:d.toNat=o) (p:g < ow/8) (j:0 < n) (l:o+n ≤ Y.size) (a:Y.size < 2^31) (hQ:Q.size=n*(8*((ow+7)/8))) (i:(ow+16)*n < 2^31) : (d.toNat+(W0 n).toNat ≤ Y.size∧d.toNat+(W0 n).toNat < 2^31) ∧ ((W0 (g*8)*W0 n).toNat+8*(W0 n).toNat ≤ Q.size∧(W0 (g*8)*W0 n).toNat+8*(W0 n).toNat < 2^31) ∧ (1:Ἄ).toNat ≤ (W0 n).toNat:=by have m1:n*(8*(g+1)) ≤ n*(8*((ow+7)/8)):=U0 _ (U0 8 (p.trans_le (ϭ (V1 ow 7)))) have m:=U0 n ((H9 (ow+7) 8).trans (J1 (by decide:7 ≤ 16) ow)) have e:n*(8*(g+1))=g*8*n+8*n:=by ring have h:=qCw ((lZ n (P4 _)).trans_lt i) have k:g*8*n+8*n ≤ Q.size∧g*8*n+8*n < 2^31:=⟨e.symm.trans_le (m1.trans_eq hQ.symm),(e.symm.trans_le (m1.trans (m.trans_eq (Ϗ _ _)))).trans_lt i⟩ rw [ho,uMul _ _ (qCw (((H1 _ j).trans (V1 _ _)).trans_lt k.2)) h (qCw ((V1 _ _).trans_lt k.2)),uO h,mA] exact ⟨⟨l,C0 l a⟩,k,j⟩ lemma lgU (a b:Nat) (d:a ≤ b) (e:b < 4294967296) (g:0 < a) : (lh (Aq b+1)).toNat=Aq b+1∧Aq a ≤ Aq b∧b < 2^(Aq b+1):=by have l:=m9 (show b≠0 by omega) |>.2 (show b < 2^64 by omega) exact ⟨Α (by unfold n0; omega),(mu щ).2 ((ϰ щ).trans d),ϙ⟩ lemma bbL (w:Word) (i E P L:Nat) (e:126+idxOf w ≤ i+max (E-1) 55) (k:(expOf w).toNat ≤ E) (a:E ≤ 254) (h:48+i+max (E-1) 55=P) (j:P+L ≤ 425) : 174+(ixU w).toNat ≤ (lh P).toNat∧exU w≠255:=by obtain ⟨d,g,-⟩:=xU w refine ⟨by rw [Α (((V1 P L).trans j).trans_lt (by decide)),g]; omega,fun z=>by have:=congrArg lq z; rw [d] at this; simp at this; omega⟩ lemma fgXv (x h:Ἂ Word) (d H t T:Nat) (X Y Z:ἀ) (hX:X=gqD x) (e:Y.size=d+H+1) (p:∀ j < H,Y.data[d+j]! = dw h[j]!) (o:Y.data[d+H]! = dw oneW) (v:t < T) (w:T*d ≤ x.size) (l:x.size < 4294967296) (g:t*d+d+H < 4294967296) (eZ:fgX X (t*d) d 0 Y=Z) : Z.size=d+H+1∧(∀ j < d+H+1,Z.data[j]! = dw (xh1 d H x h t)[j]!) ∧ (∀ j < d,Z.data[j]! = dw x[t*d+j]!)∧(∀ j < H,Z.data[d+j]! = dw h[j]!)∧Z.data[d+H]! = dw oneW:=by have m:t*d+d ≤ T*d:=by rw [← Ο]; exact ι _ v have r:d ≤ Y.size:=(V6 (V1 _ _)).trans_eq e.symm have q:∀ k,¬(0 ≤ d+k∧d+k < d):=λk z=>not_lt.2 (V1 _ _) z.2 obtain ⟨s,n⟩:=fgX_s X (t*d) d d 0 Y rfl r rw [eZ] at s n obtain ⟨u,y⟩:=gqD_s x have a:∀ j < d,Z.data[j]! = dw x[t*d+j]!:=λj i=>by have:=(O1 i _).trans_le (m.trans w) rw [n j (i.trans_le r),if_pos ⟨ϟ _,i⟩,hX,gqV _ _ (u.trans_lt (l.trans_le ς)) (by rw [uO (this.trans l),u]; exact this),uO (this.trans l),y _ this] have b:∀ j < H,Z.data[d+j]! = dw h[j]!:=λj i=>by rw [n _ ((H4 (O1 i _)).trans_eq e.symm),if_neg (q j),p j i] have c:Z.data[d+H]! = dw oneW:=by rw [n _ ((M1 _).trans_eq e.symm),if_neg (q H),o] refine ⟨by rw [s,e],λj i=>?_,a,b,c⟩ rw [xh1_get _ _ _ _ _ _ i g] by_cases h1:j < d; rw [if_pos h1]; exact a j h1 rw [if_neg h1]; by_cases h2:j < d+H · rw [if_pos h2]; have:=b (j-d) (K3 (not_lt.1 h1) h2); rwa [M3 (not_lt.1 h1)] at this rw [if_neg h2,le_antisymm (Z0 i) (not_lt.1 h2)]; exact c lemma fgBp (i:Word → Word) (C:ἀ) (ok:Ἆ) (r L:ἆ) (x n l A h g S:Ἂ Word) (d H t:Nat) (Y:ἀ) (hA:A.size=3*H) (hC:C.size=H) (F:S.size=H) (U:h.size=H) (p:3*H < 4294967296) (k:Y.size=d+H+1) (D:Y.data[d+H]! = dw oneW) (hV:∀ u < H,gqU2 (dw oneW) (i (gqK3f C r L x n l d H t ok u (W0 u) A[2*H+u]! A[u]!)) A[H+u]! h[u]! = S[u]!) : let M:=mapI i (2*H) (3*H) (fgK C ok r L x n l d H t 0 A) let R:=fgB M (dw oneW) d H 0 h Y g M.size=3*H∧R.1=S∧R.2.2=g++S∧R.2.1.size=d+H+1∧(∀ j < H,R.2.1.data[d+j]! = dw S[j]!)∧R.2.1.data[d+H]! = dw oneW:=by have N:∀ {a b:Nat},¬(a ≤ b∧b < a+0):=λz=>AX _ (C0 z.1 z.2) obtain ⟨O,T⟩:=fgK_s C ok r L x n l d H t A hA.ge p H 0 A rfl (ϟ _) rfl (λq hq=>by rw [if_neg N]) obtain ⟨t1,s⟩:=mapI_get i (3*H) _ (2*H) _ rfl (by rw [O,hA]); rw [O,hA] at t1 s obtain ⟨G,b2,V,J,I,X⟩:=fgB_s _ (dw oneW) d H g.size h Y (λu=>S[u]!) (λq=>if q < g.size then g[q]! else S[q-g.size]!) (fun j v=>by rw [if_neg (not_lt.2 (V1 _ _)),ϱ]) ((lZ H (by decide)).trans_lt p) (fun u B=>by have u1:H+H+u=2*H+u:=by rw [L7] have o:2*H+u < 3*H:=(O1 B (2*H)).trans_eq (Ο 2 H).symm have K:H+u < 2*H:=(O1 B H).trans_eq (L7 H).symm have w:H+u < 3*H:=(L1 (lZ H ж) u).trans_lt o simp only [← mC,u1] rw [aGn _ _ (o.trans p),aGn _ _ (w.trans p),s _ o,if_pos ⟨V1 _ _,o⟩,s (H+u) w,if_neg (λz=>not_le.2 K z.1), T _ (o.trans_eq hA.symm),if_pos ⟨V1 _ _,o⟩,T (H+u) (w.trans_eq hA.symm),if_neg (λz=>not_le.2 K z.1),ϱ] exact hV u B) H 0 h Y g rfl (ϟ _) U (λq hq=>by rw [if_neg (D4 _)]) rfl ((B5 _).trans_eq k.symm) (λq hq=>by rw [if_neg N]) rfl (λq hq=>by rw [if_pos hq]) refine ⟨t1,mi (by rw [G,F]) (fun q m y=>by rw [← AB _ q m,b2 q (by rw [G] at m; exact m),AB _ q y]), mi (by rw [I,Qe,F]) (λq m y=>?_),by rw [V,k], λj v=>by rw [J _ ((H4 (O1 v _)).trans_eq k.symm),if_pos ⟨V1 _ _,O1 v _⟩,ϱ], by rw [J _ ((M1 _).trans_eq k.symm),if_neg (λz=>AX _ z.2),D]⟩ rw [← AB _ q m,X q (by rw [I] at m; exact m),Array.getElem_append] split · rename_i e; rw [AB g q e] · rename_i e; rw [AB S _ (K3 (not_lt.1 e) (y.trans_eq (Qe ..)))] lemma fgT_eq (sig tanh:Word → Word) (T inW H ix ig E:Nat) (x wih whh bih bhh:Ἂ Word) (ok:Ἆ) (Lg Ln:ἆ) (X Qg Qh Qx CB:ἀ) (g0:T*inW+inW+4*H <= 4294967295) (h8:H%8=0) (hH:0 < H) (hi:0 < inW) (hx:T*inW ≤ x.size) (hw:3*H*inW ≤ wih.size) (hh:3*H*H ≤ whh.size) (hxs:x.size < 4294967296) (hws:wih.size < 4294967296) (hhs:whh.size < 4294967296) (hB:(3*H+16)*(inW+H+1) < 2^31) (h3:3*H < 4294967296∧inW+H+3 < 4294967296) (hX:X=gqD x) (hQg:Qg=(Dense.F.wcT8F (wcat 2 inW H wih whh bih,2*H,inW+H+1)).1) (hQh:Qh=(Dense.F.wcT8F (whh,3*H,H)).1) (hQx:Qx=(Dense.F.wcT8F (wih,3*H,inW)).1) (hCB:CB=⟨kK (n:=3*H) λk=>dw oneW*dw bhh[k.val]!⟩)(cK) (hix:∀ q:ℕ,idxOf x[q]! ≤ ix) (h126:126 ≤ ix) (hig:∀ q:ℕ,idxOf x[q]! ≤ ig) (hgb:∀ q:ℕ,126+idxOf bih[q]! ≤ ig+max (E-1) 55∧126+idxOf bhh[q]! ≤ ig+max (E-1) 55) (hEx:∀ k < 3*H,∀ s < inW,(expOf wih[k*inW+s]!).toNat ≤ E) (hEh:∀ k < 3*H,∀ s < H,(expOf whh[k*H+s]!).toNat ≤ E) (hEb:∀ q:ℕ,(expOf bih[q]!).toNat ≤ E) (hEc:∀ q:ℕ,(expOf bhh[q]!).toNat ≤ E) (hok:ok=true → ix ≤ 253∧E ≤ 254∧Lg.toNat ≤ 27) (hLg:Lg=lh (Aq (inW+H+3)+1)) (hLn:Ln=lh (Aq (H+2)+1)) : ∀ m t h Y A C out,T-t=m → h.size=H → Y.size=inW+H+1 → (∀ j < H,Y.data[inW+j]! = dw h[j]!) → Y.data[inW+H]! = dw oneW → A.size=3*H → C.size=H → fgT sig tanh X Qg Qh Qx (gqB2 (dw oneW) bih H) CB ok ig E (lh (48+ix+max (E-1) 55)) (lh (Aq (inW+3)+1)) Lg Ln (dw oneW) x wih whh bih bhh inW H T t h Y A C out cK=rcL T H (gruStepWith dotOf sig tanh inW H x wih whh bih bhh) t (h,#[]) out:=by have q2:H+2 ≤ inW+H+3:=E0 (H0 H inW) ж obtain ⟨l1,l2,l3⟩:=lgU (inW+3) (inW+H+3) (L1 (V1 inW H) 3) h3.2 (P4 _) obtain ⟨-,l5,-⟩:=lgU (H+2) (inW+H+3) q2 h3.2 (P4 _) obtain ⟨l7,-,l8⟩:=lgU (H+2) (H+2) AP (q2.trans_lt h3.2) (P4 _) rw [← hLg] at l1; rw [← hLn] at l7 have hL:inW+H+3 ≤ 2^Lg.toNat∧Ln.toNat ≤ Lg.toNat∧H+2 < 2^Ln.toNat:=⟨by rw [l1]; exact l3.le,by rw [l1,l7]; exact L1 l5 1,by rw [l7]; exact l8⟩ have hL2:H-1+3 ≤ 2^Ln.toNat:=by clear * - hL hH; omega have d:=E8 h8 have e2:8*(2*H/8)=2*H∧8*(3*H/8)=3*H:=⟨Gp (d.mul_left 2),Gp (d.mul_left 3)⟩ have G8:∀ {g n},g < n/8 → 8*(n/8)=n → 8*g+8 ≤ n:=λhg e=>(Qm 8 _).symm.trans_le ((U0 8 hg).trans_eq e) have h23:2*H ≤ 3*H:=ι H ж have s32:3*H-2*H=H:=Nat.sub_eq_of_eq_add' (Ο 2 H) have m0:inW+H+1 ≤ (3*H+16)*(inW+H+1):=lZ _ (P4 _) have hB2:=C0 (ι _ (L1 h23 16)) hB have hI:=V6 (V1 inW H) have hH1:=V6 (H0 H inW) have hB3:=C0 (U0 _ hH1) hB have hB4:=C0 (U0 _ hI) hB have Ws:(wcat 2 inW H wih whh bih).size=2*H*(inW+H+1):=by simp only [wcat,Ϝ] have hW:(wcat 2 inW H wih whh bih).size < 2^32:=by rw [Ws]; exact qCw ((ι _ (V1 _ 16)).trans_lt hB2) obtain ⟨Qgs,-⟩:=Dense.F.wcT8F_panel (wcat 2 inW H wih whh bih) (2*H) (inW+H+1) hB2 Ws.ge hW obtain ⟨Qhs,-⟩:=Dense.F.wcT8F_panel whh (3*H) H hB3 hh hhs obtain ⟨Qxs,-⟩:=Dense.F.wcT8F_panel wih (3*H) inW hB4 hw hws rw [← hQg] at Qgs; rw [← hQh] at Qhs; rw [← hQx] at Qxs have B:=qCw hB have i1:∀ g,8*g+8 ≤ 3*H → ∀ n ≤ inW+H+1,(W0 (g*8)*W0 n).toNat=g*8*n:=λg hg n hn=>by have:=(Ϗ g 8).trans_le ((V1 _ 8).trans (hg.trans (V1 _ 16))) exact uMul _ _ ((this.trans (H1 _ (P4 _))).trans_lt B) ((hn.trans m0).trans_lt B) ((ϧ this hn).trans_lt B) have o1:idxOf oneW=126:=by decide have H32:H < 4294967296:=((H0 H inW).trans (V1 _ 3)).trans_lt h3.2 have uI:=uO (((V1 inW H).trans (V1 _ 3)).trans_lt h3.2) have uH:=uO H32 have uN:=uO ((J1 (by decide:1 ≤ 3) (inW+H)).trans_lt h3.2) have y5:∀ k (kU:Ἄ) p,kUб=k→CB.uget kU p=dw oneW*dw bhh[k]!:=λk kU p e=>by subst hCB e;exact Λ _ have H31:3*H<2^31:=(V1 _ 16).trans_lt (C0 (H1 _ (P4 _)) hB) have cA:=e2.1.trans_le (h23.trans cK) have cN:=e2.2.trans_le cK intro m; induction m with | zero=>intro t h Y A C out hm _ _ _ _ _ _; have:=not_lt.2 (M0.1 hm) rw [fgT,rcL,if_neg this,if_neg this] | succ m ih=> intro t h Y A C out hm hs hYs hYh hY1 hA hC have ht:=N1 hm rw [fgT,rcL,if_pos ht,if_pos ht]; dsimp only have g1:=(J1 (lZ H ж) _).trans_lt (tB T inW H t ht g0) generalize eZ:fgX X (t*inW) inW 0 Y=Z obtain ⟨y0,y1,y2,y3,y4⟩:=fgXv x h inW H t T X Y Z hX hYs hYh hY1 ht hx hxs g1 eZ have z2:=y0.trans_lt (m0.trans_lt hB) have z5:=(B5 _).trans y0.ge have z9:=(V1 inW H).trans z5 generalize ei:max ig (gqM h)=i generalize eP:48+i+max (E-1) 55=P generalize ec:(ok&&decide (i ≤ 253∧P+Lg.toNat ≤ 425))=c have hc:c=true → i ≤ 253∧E ≤ 254∧P+Lg.toNat ≤ 425∧Lg.toNat ≤ 27:=λe=>by rw [← ec] at e; simp only [Η,AJ] at e; exact ⟨e.2.1,(hok e.1).2.1,e.2.2,(hok e.1).2.2⟩ have hJ:∀ q:ℕ,idxOf h[q]! ≤ i:=λq=>ei ▸ (gqM_le h q).trans (le_max_right _ _) have ji:ig ≤ i:=ei ▸ le_max_left _ _ have PU:c=true → (lh P).toNat=P:=λe=>Α (((V1 P _).trans (hc e).2.2.1).trans_lt ж) have BB:c=true → ∀ q,174+(ixU bhh[q]!).toNat ≤ (lh P).toNat∧exU bhh[q]! ≠ 255:=λe q=>bbL bhh[q]! i E P _ ((hgb q).2.trans (L1 ji _)) (hEc q) (hc e).2.1 eP (hc e).2.2.1 obtain ⟨a1,a2⟩:=fgA_s Z Qg CB (W0 (inW+H+1)) c (lh P+2*Lg-54) x wih whh bih bhh h inW H t (2*H/8) cA (e2.1.trans_lt (C0 h23 H31)) (λg hg=>fgBd Z Qg 0 0 (inW+H+1) (2*H) g Ϧ hg (P4 _) ((Κ _).trans_le y0.ge) z2 Qgs hB2) (λg hg l hl kk kU Qi hk ek e q=>by have g8:=G8 hg e2.1 have k3:=e.trans_lt ((O1 hl _).trans_le (g8.trans h23)) exact fgGv x wih whh bih bhh h inW H t i E l g kk c (lh P) Lg Z Qg CB _ Qi kU hk ek e hl g8 uN hB2 hW hQg y0 y1 (y5 kk kU hk ek) q (i1 g (g8.trans h23) _ AP) g1 (λe2=>by obtain ⟨k1,k2,k4,k5⟩:=hc e2; obtain ⟨b1,b2⟩:=BB e2 kk refine ⟨λs hs=>?_,k1,k2,by rw [PU e2,← eP],hL.1,k5,b1,b2,by rw [PU e2]; exact k4⟩ split_ifs with s1 s2 s3 · exact gwT k1 k2 ((hig _).trans ji) (hEx kk k3 s s1) · exact gwT k1 k2 (hJ _) (hEh kk k3 (s-inW) (K3 (not_lt.1 s1) s2)) · exact ⟨o1.trans_le ж,(hEb _).trans k2,by rw [o1]; exact (hgb kk).1.trans (L1 ji _)⟩ · exact absurd (hs.lt_of_ne s3) s2)) _ 0 A rfl (e2.1.trans_le (h23.trans_eq hA.symm)) obtain ⟨m1,m2⟩:=mapI_get sig (2*H) _ 0 _ rfl (by rw [a1,hA]; exact h23); rw [a1,hA] at m1 m2 obtain ⟨n1,n2,n3,n4⟩:=fgN_s Z Qh Qx (gqB2 (dw oneW) bih H) CB (W0 inW) (W0 H) c (lh P+2*Ln-54) whh bhh h H (2*H/8) (3*H/8) cN (e2.2.trans_lt H31) (by rw [e2.1,e2.2,s32];exact Ϝ.ge) (λk=>dotOf (H+1) (λj=>if j < H then h[j]! else oneW) (λj=>if j < H then whh[k*H+j]! else bhh[k]!)) (λu=>aoR (fA x (t*inW) inW oneW oneW) (fA wih ((2*H+u)*inW) inW bih[2*H+u]! oneW) inW) (λg hg=>match fgBd Z Qh (W0 inW) inW H (3*H) g uI hg hH z5 z2 Qhs hB3, fgBd Z Qx 0 0 inW (3*H) g Ϧ hg hi ((Κ _).trans_le z9) z2 Qxs hB4 with | ⟨a,b,c⟩,⟨d,e,f⟩=>⟨a,b,c,d,e,f⟩) (λg hg h2 l hl kk kU Qi hk ek e q=>by have g8:=G8 hg e2.2 have k3:=e.trans_lt ((O1 hl _).trans_le g8) exact fgHv whh bhh h H i E l g kk inW c (lh P) Ln Z Qh CB _ _ Qi kU hk ek e hl g8 (e2.1.symm.trans_le ((U0 8 h2).trans ((V1 _ l).trans_eq e.symm))) uI uH hB3 hhs hh hQh y0.ge z2 y3 (y5 kk kU hk ek) q (i1 g g8 H hH1) (λe2=>by obtain ⟨k1,k2,k4,k5⟩:=hc e2; obtain ⟨b1,b2⟩:=BB e2 kk refine ⟨λs hs=>?_,k1,k2,by rw [PU e2,← eP],hL2,hL.2.1.trans k5,b1,b2,by rw [PU e2]; exact (J1 hL.2.1 P).trans k4⟩ split_ifs with s1 · exact gwT k1 k2 (hJ _) (hEh kk k3 s s1) · exact absurd (hs.trans_lt (Qs hH ж)) s1)) (λg hg h2 l hl uu Qi e q=>by have g8:=G8 hg e2.2 exact fgCv x wih bih inW H t g l uu Z Qx _ Qi (by rw [e,e2.1]) hl (e2.1.symm.trans_le (U0 8 h2)) g8 uI hi hB4 hws hw hQx z9 z2 y2 q (i1 g g8 inW hI)) _ (2*H/8) _ C rfl AP (e2.2.trans m1.symm).le (by rw [e2.1,e2.2,hC,s32]) rw [e2.1,e2.2] at n3; rw [e2.1,e2.2,Nat.sub_self,s32] at n4; rw [e2.1] at a2 have AA:=λq (hq:q < 2*H)=>(n3 q ((hq.trans_le h23).trans_eq m1.symm)).trans ((if_neg λz=>not_le.2 hq z.1).trans ((m2 q (hq.trans_le h23)).trans ((if_pos ⟨ϟ _,hq⟩).trans (congrArg sig ((a2 q ((hq.trans_le h23).trans_eq hA.symm)).trans (if_pos ⟨ϟ _,hq⟩)))))) have hS:(gruStepWith dotOf sig tanh inW H x wih whh bih bhh t (h,#[])).1.size=H:=Ϝ obtain ⟨k1,b1,b2,b3,b4,b5⟩:=fgBp tanh _ ok (lh (48+ix+max (E-1) 55)) (lh (Aq (inW+3)+1)) x wih bih _ h out _ inW H t _ (n1.trans m1) (n2.trans hC) hS hs h3.1 y0 y4 (λu hu=>by have u1:u < 2*H:=hu.trans_le (lZ H ж) have u2:=(O1 hu H).trans_eq (L7 H).symm have u3:2*H+u < 3*H:=(O1 hu (2*H)).trans_eq (Ο 2 H).symm have u5:=uO ((u1.trans_le h23).trans h3.1) rw [AA _ u2,n3 _ (u3.trans_eq m1.symm),if_pos ⟨V1 _ _,u3⟩,AA u u1,gqK3f_eq x wih bih inW H t u ix E (Aq (inW+3)+1) ok _ _ _ hix h126 (λs hs=>hEx _ u3 s hs) hEb ϙ.le (λe=>by obtain ⟨k1,k2,k3⟩:=hok e; rw [l1] at k3; refine ⟨k1,k2,(L1 l2 1).trans k3,?_⟩ rw [gqV _ _ ((n2.trans hC).trans_lt (H32.trans_le ς)) (by rw [u5,n2,hC]; exact hu),u5,n4 u (hu.trans_eq hC.symm),if_pos ⟨ϟ _,hu⟩] exact aoRfA _ _ _ _ _ _ _ _ _ _ _),gqU2_eq] unfold gruStepWith; simp only [gofn _ _ hu,Fin.val_mk]; rfl) rw [b1,b2] exact ih (t+1) _ _ _ _ _ (by rw [Qf,hm,Nat.pred_succ]) hS b3 b4 b5 k1 (n2.trans hC) lemma gruK_spec (d a:Word → Word):gruK linearSpec d a=gruWith dotOf d a:=by funext T inW H x wih whh bih bhh unfold gruK; split · rename_i g obtain ⟨g0,M,F,hi,K,C,B,A,h,l,p⟩:=g dsimp only have q:∀ (W:Ἂ Word) ow n,(fgQ W ow n)=Dense.F.wcT8F (W,ow,n):=λW ow n=>by unfold fgQ; rw [Dense.F.s5wcGet3_val] have u:3*H < 4294967296∧inW+H+3 < 4294967296:=by clear * - g0 F; omega obtain ⟨-,w,z⟩:=Dense.F.wcT8F_exp wih (3*H) inW (C0 (U0 _ (V6 (V1 _ _))) p) C (J3 h) obtain ⟨-,m,v⟩:=Dense.F.wcT8F_exp whh (3*H) H (C0 (U0 _ (V6 (H0 _ _))) p) B (J3 l) rw [q,q,q,wcG_v] obtain ⟨G,-⟩:=lgU (inW+H+3) (inW+H+3) AP u.2 (P4 _) obtain ⟨I,D⟩:=gqD_s (xh1 inW H x (mB H 0) 0) have r:(xh1 inW H x (mB H 0) 0).size=inW+H+1:=by simp only[xh1,aKd_eq,Ϝ] have g:0*inW+inW+H < 4294967296:=by rw [ϳ,Κ]; exact (V1 _ 3).trans_lt u.2 have L:¬inW+H < inW:=not_lt.2 (V1 _ _) rw [fgT_eq d a T inW H (max (gqM x) 126) _ _ x wih whh bih bhh _ _ _ _ _ _ _ _ g0 M F hi K C B (J3 A) (J3 h) (J3 l) p u rfl rfl rfl rfl rfl Ϝ.ge (λq=>(gqM_le x q).trans (le_max_left _ _)) (le_max_right _ _) (λq=>(gqM_le x q).trans (le_max_left _ _)) (λq=>gwG (gqM_le bih q) (gqM_le bhh q)) (λk i s o=>(w k i s o).trans ((z k i).trans ((le_max_left _ _).trans (le_max_left _ _)))) (λk i s o=>(m k i s o).trans ((v k i).trans ((le_max_right _ _).trans (le_max_left _ _)))) (λq=>(gqN_le bih q).trans ((le_max_left _ _).trans (le_max_right _ _))) (λq=>(gqN_le bhh q).trans ((le_max_right _ _).trans (le_max_right _ _))) (λe=>by rw [G]; exact of_decide_eq_true e) rfl rfl T 0 _ _ _ _ _ (pQ T) ц (by rw [I,r]) (fun j y=>by rw [D _ ((H4 (O1 y _)).trans_eq r.symm),xh1_get _ _ _ _ _ _ (H4 (O1 y _)) g, if_neg (not_lt.2 (V1 _ _)),if_pos (O1 y _),ϱ]) (by rw [D _ ((M1 _).trans_eq r.symm),xh1_get _ _ _ _ _ _ (M1 _) g,if_neg L,if_neg (AX _)]) ц (by simp [kS])] exact rcL_eq _ _ _ _ _ (λt N J=>rfl) (λt J=>Ϝ) · rw [gruK0_spec] end Rnn namespace NX open Dense.F (cI dw fK fuS mV uZ) open Norm (Y1 ck f6 kO0 kO1 kQ52 kZ4 nDb nHd nO1 nOK_dec nOK_spec nOKs nOs nQ_cert nQs nS201 nWs nXb nZw nZw_sz nfe okF okF_nOK pk2 pk2_nW) open Core (ai) open SAct (divF inv2le) open ExactRuntime lemma fastEl (y:ℚ) (v:Ἅ) (T:ἆ) (i:1047 ≤ T.toNat) (h:T.toNat ≤ 1298) (g:Dense.F.fv v) (a:okF v.toBits T=true) (e : |(y:ℝ)*2^(149:ℕ)-Dense.F.rv v| < 2^(4:ℤ)*2^(((Dense.F.eF v.toBits).toNat:ℤ)-1075)) : pk2 v.toBits=X9 y:=by obtain ⟨c,j⟩:=okF_nOK _ _ i h a have d:1047 ≤ ((v.toBits>>>52)&&&2047).toNat∧((v.toBits>>>52)&&&2047).toNat ≤ 1298:=by have:=nOK_dec _ _ c; exact ⟨this.1,this.2.1⟩ rw [pk2_nW _ d.1 d.2] exact nOK_spec y v 5 g c (by simpa using e) lemma relMul (a b:Ἅ) (g:Dense.F.fv a) (e:Dense.F.fv b) (c : |Dense.F.rv a*Dense.F.rv b| ≤ (2:ℝ)^(971:ℤ)) (d:(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 ⟨h,i⟩:=Norm.NF.fM a b g e c refine ⟨h,?_⟩ unfold SAct.Rel have k:(1:ℝ)/2^(1075:ℕ) ≤ |Dense.F.rv a*Dense.F.rv b| / 2^(53:ℕ):=(show (1:ℝ)/2^(1075:ℕ) ≤ 1/2^(300:ℕ)/2^(53:ℕ) by rw [div_div,← AF];exact inv2le ж).trans (div_le_div_of_nonneg_right d ф) 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 ring exact i.trans ((add_le_add AP k).trans this.le) lemma rvEq (x:Ἅ):SAct.rv x=Dense.F.rv x:=rfl lemma fvEq (x:Ἅ):SAct.fv x=Dense.F.fv x:=rfl lemma relInv (D:Ἅ) (i:Dense.F.fv D) (g:0 < Dense.F.rv D) (c:1/Dense.F.rv D ≤ 4) (d:(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 ⟨h,e⟩:=mV (I0 1) 1 rfl ш have a:=divF ((I0 1).toInt64.toFloat) D h i (ne_of_gt g) (by rw [rvEq,rvEq,e]; push_cast; rw [AW ф]; exact c) rw [rvEq,rvEq,rvEq,e,fvEq] at a; push_cast at a refine ⟨a.1,?_⟩ unfold SAct.Rel rw [a.2] have j:=Norm.NF.jy (1/Dense.F.rv D) have k:(1:ℝ)/2^(1075:ℕ) ≤ |1/Dense.F.rv D| / 2^(53:ℕ):=(show (1:ℝ)/2^(1075:ℕ) ≤ 1/2^(300:ℕ)/2^(53:ℕ) by rw [div_div,← AF];exact inv2le ж).trans (div_le_div_of_nonneg_right (d.trans (le_abs_self _)) ф) have : |1/Dense.F.rv D| / 2^(53:ℕ) + |1/Dense.F.rv D| / 2^(53:ℕ)=1/2^(52:ℕ) * |1/Dense.F.rv D| := by ring exact j.trans ((add_le_add AP k).trans this.le) lemma dwZA (w:Word) (h:kB w≠255) : Dense.F.fv (dw w)∧Dense.F.rv (dw w)=(J4 w:ℝ)*2^(149:ℕ):=by obtain ⟨f,v⟩:=cI w h refine ⟨f,?_⟩ rw [v,Y1 w] push_cast rw [Ap, ← AA (2:ℝ) 149, ← AK ш, ← AA] congr 2; ring lemma mant_ne (w:Word) (d:w<<<1≠0):kM w≠0:=by intro a apply d unfold kM at a split_ifs at a with he · apply Β.1 have c:(kB w).toNat=0:=by rw [he]; rfl unfold kB at c; unfold lK at a simp only [Ξ,Υ,ϴ,kN,kH, β,ο,show (255:Nat)=2^8-1 from rfl,show (8388607:Nat)=2^23-1 from rfl, ζ] at c a ⊢ have:=w.toNat_lt simp only [nr] at * omega · omega lemma dwOne (w:Word) (h:kB w≠255) (c:w<<<1≠0):1 ≤ |Dense.F.rv (dw w)| := by obtain ⟨-, v⟩:=cI w h rw [v,Ae,AW (by positivity:(0:ℝ) < 2^(kG w))] have a:=mant_ne w c have:(1:ℝ) ≤ |(O7 w:ℝ)| := by unfold O7; split_ifs <;> simp <;> exact_mod_cast Zk.mpr a calc (1:ℝ)=1*1:=by ring _ ≤ |(O7 w:ℝ)| * 2^(kG w):=mul_le_mul this (one_le_pow₀ ш) ш ф lemma relSelf (a:ℝ):SAct.Rel a a 0:=by unfold SAct.Rel; simp lemma relWin (v:Ἅ) (Y:ℝ) (c: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 a:=fK v c unfold SAct.Rel at h have d : |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₀ ш] linear_combination (2^50:ℝ)*t+(2^50:ℝ)*h 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 a ш _ ≤ 2^(((Dense.F.eF v.toBits).toNat:ℤ)-1022)*(2^(-(49:ℤ))):=mul_le_mul_of_nonneg_left ш ф _=2^(4:ℤ)*2^(((Dense.F.eF v.toBits).toNat:ℤ)-1075):=by rw [← AK ш, ← AK ш]; congr 1; ring lemma rmsNum (d c a:Word) (B:kB d≠255) (s:kB c≠255) (m:d<<<1≠0) (u:c<<<1≠0) (y:0 < (kB a).toNat∧kB a≠255∧k9 a=false) (t:(kB a).toNat ≤ 170) : Dense.F.fv (dw d*(dw c*((I0 1).toInt64.toFloat/dw a))) ∧ SAct.Rel (Dense.F.rv (dw d*(dw c*((I0 1).toInt64.toFloat/dw a)))) (((J4 d*J4 c/J4 a:ℚ):ℝ)*2^(149:ℕ)) (1/2^(50:ℕ)):=by obtain ⟨fX,U⟩:=dwZA d B;obtain ⟨fG,o⟩:=dwZA c s;obtain ⟨fD,J⟩:=dwZA a y.2.1;have l:=dwOne d B m;have H:=dwOne c s u;have k:=mO d;have eg:=mO c;set X:=Dense.F.rv (dw d);set G:=Dense.F.rv (dw c);set e:=Dense.F.rv (dw a);have p : |X| ≤ 2^(278:ℕ):=(nXb d B).le.trans (AU ш (L1 (Z0 k) 23)) have j : |G| ≤ 2^(278:ℕ):=(nXb c s).le.trans (AU ш (L1 (Z0 eg) 23)) have C:(2:ℝ)^(23:ℕ)≤ e:=AZ (AU ш (L1 y.1 22)) (nDb a y) have L:e≤2^(193:ℕ):=(abs_lt.1 (nXb a y.2.1)).2.le.trans (AU ш (L1 t 23)) have i:0< e:=AN ф C have S:1/e≤1/2^(23:ℕ):=one_div_le_one_div_of_le ф C have T:(1:ℝ)/2^(193:ℕ)≤1/e:=one_div_le_one_div_of_le ф L obtain ⟨Y,A⟩:=relInv (dw a) fD i (S.trans ш) ((inv2le ш).trans T) set R:=Dense.F.rv ((I0 1).toInt64.toFloat/dw a);have D:=A.le;have I:=A.ge;rw[AW (by positivity:(0:ℝ)<1/e)]at D I have n : |R| ≤ 1/2^(22:ℕ):=by linear_combination D+(1+1/2^52:ℝ)*S have g:∀n:ℕ,n≤971→(2:ℝ)^n≤(2:ℝ)^(971:ℤ):=λn h=>by rw[←AA];exact AG ш (by exact_mod_cast h) have M : |G*R| ≤ 2^(256:ℕ):=by rw[Ae] calc |G| * |R| ≤ 2^(278:ℕ)*(1/2^(22:ℕ)):=mul_le_mul j n (Aa _) (by positivity) _=2^(256:ℕ):=by rw[show (278:ℕ)=256+22 from rfl,AF,Ap,mul_one_div_cancel ф,mul_one] have v:(1:ℝ)/2^(194:ℕ) ≤ |G*R| := by rw[Ae];exact (by linear_combination I+(4503599627370495/2^52:ℝ)*T:(1:ℝ)/2^(194:ℕ) ≤ |R|).trans (le_mul_of_one_le_left (Aa _) H) obtain ⟨z,r⟩:=relMul (dw c) _ fG Y (M.trans (g _ ш)) ((inv2le ш).trans v) set h:=Dense.F.rv (dw c*((I0 1).toInt64.toFloat/dw a));change SAct.Rel h (G*R) _ at r;have x : |h| ≤ 2^(257:ℕ):=r.le.trans ((mul_le_mul (by norm_num:1+1/2^(52:ℕ)≤(2:ℝ)) M (Aa _) ш).trans_eq (pow_succ' (2:ℝ) 256).symm) have q:(1:ℝ)/2^(195:ℕ) ≤ |h| := by linear_combination r.ge+(4503599627370495/2^52:ℝ)*v obtain ⟨fv,rv⟩:=relMul (dw d) _ fX z (by rw[Ae];exact (mul_le_mul p x (Aa _) (by positivity)).trans (by rw[←AF];exact g _ (by norm_num))) (by rw[Ae];exact ((inv2le ш).trans q).trans (le_mul_of_one_le_left (Aa _) l)) refine ⟨fv,?_⟩;have K:=rv.trans ((relSelf X).mul (r.trans ((relSelf G).mul A)));have w:X*(G*(1/e))=(((rationalWord d*rationalWord c/rationalWord a:ℚ):ℝ)*2^(149:ℕ)):=by rw[U,o,J];push_cast;ring rw[w]at K;exact K.mono ш lemma zt0:X9 0=0:=by decide lemma za0 (w:Word) (a:w<<<1=0):J4 w=0:=by rw [Y1 w] have d:kM w=0:=by have:=congrArg mJ a unfold kM have g:=w.toNat_lt have c:(kB w).toNat=w.toNat/2^23%256:=by unfold kB simp only [Ξ,Υ,kN,kH,β, show (255:Nat)=2^8-1 from rfl,ζ] have e:(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 [c]; simp only [nr] at *; simp only [kN]; omega rw [AD ee,e]; simp only [nr] at *; omega unfold O7; rw [d]; simp @[noinline] def rR (xw gw td:Word):Word:=X9 (J4 xw*J4 gw/J4 td) @[inline] def wR (x g:Ἂ Word) (nd:Ἅ) (td:Word) (xw gw:Word) (xv ri:Ἅ) (t:Ἄ):Word := if (xw<<<1==0||gw<<<1==0)=true then 0 else let B:=(xv*(dw gw*ri)).toBits if okF B 1047=true then pk2 B else rR xw gw td lemma elR (x g:Ἂ Word) (j:Ἅ) (c:Word) (t:Ἄ) (d e:Word) (o:ck x t=d) (m:ck g t=e) (n:kB d≠255) (q:kB e≠255) (l:j=(I0 1).toInt64.toFloat) (k:0 < (kB c).toNat∧kB c≠255∧k9 c=false) (i:(kB c).toNat ≤ 170) : wR x g j c d e (dw d) ((I0 1).toInt64.toFloat/dw c) t = X9 (J4 d*J4 e/J4 c):=by unfold wR split · rename_i a simp only [nM,AQ] at a rcases a with a | a · rw [za0 d a,zero_mul,zero_div,zt0] · rw [za0 e a,mul_zero,zero_div,zt0] · rename_i a simp only [nM,AQ,not_or] at a obtain ⟨fv,p⟩:=rmsNum d e c n q a.1 a.2 k i dsimp only split · rename_i h exact fastEl _ _ 1047 ж ж fv h (relWin _ _ fv p) · rfl lemma aset (o:Ἂ Word) (t:Ἄ) (v:Word) (h:t.toNat < o.size) (j:Nat) (a:j < o.size) : (o.uset t v h)[j]! = if t.toNat=j then v else o[j]! := by have c:(o.uset t v h).size=o.size:=BT .. rw [AB (o.uset t v h) j (by rw [c]; exact a),AB o j a] simp only [Ui,Qd] lemma ugetF (o:ἀ) (t:Ἄ) (h:t.toNat < o.size):o.uget t h=o.data[t.toNat]! := by rcases o with ⟨d⟩ simp only [kS] at h simp only [nN] rw [AB d t.toNat h] rfl structure RQ where a:ἀ q:Ἅ dl:ἆ def qR (x : @& Ἂ Word) (Xr:ἀ) (t n:Ἄ) (hx:n.toNat ≤ x.size) (hr:n.toNat ≤ Xr.size) (q:Ἅ) (Dl:ἆ):RQ := if h:t < n then have ht:t.toNat < n.toNat:=ε.mp h let w:=x.uget t (U1 ht hx) let v:=dw w let e:=nfe w qR x (Xr.uset t v (U1 ht hr)) (t+1) n hx (by rw [uZ]; exact hr) (q+v*v) (if Dl < e then e else Dl) else ⟨Xr,q,Dl⟩ termination_by n.toNat-t.toNat decreasing_by exact nHd h lemma qR_spec (x:Ἂ Word) (n:Ἄ) (h:n.toNat ≤ x.size) : ∀ k (t:Ἄ) (a:ἀ) (d:n.toNat ≤ a.size) (q:Ἅ) (c:ἆ), n.toNat-t.toNat=k → t.toNat ≤ n.toNat → (qR x a t n h d q c).a.size=a.size ∧ (∀ j,j < a.size → (qR x a t n h d q c).a.data[j]! = if t.toNat ≤ j∧j < n.toNat then dw x[j]! else a.data[j]!) ∧ (qR x a t n h d q c).q=nQs x t n q ∧ c.toNat ≤ (qR x a t n h d q c).dl.toNat ∧ (∀ j,t.toNat ≤ j → j < n.toNat → (nfe x[j]!).toNat ≤ (qR x a t n h d q c).dl.toNat):=by intro k; induction k with | zero => intro t a d q c r G have i:¬ t < n:=nO1 r rw [qR.eq_def,dite_eq_right i,nQs.eq_def,dite_eq_right i] refine ⟨rfl,λj o => ?_,rfl,AP,λj l H=>by omega⟩ rw [AC щ] | succ k B => intro t a d q c r G obtain ⟨l,u,p⟩:=nOs r have e:t < n:=ε.mpr l have F:t.toNat < x.size:=U1 l h have s:t.toNat < a.size:=U1 l d have D:(t+1).toNat=t.toNat+1:=Dense.ac e rw [qR.eq_def,AT e,nQs.eq_def,AT e] simp only [Dense.cC,f6] obtain ⟨z,y,C,v,w⟩:=B (t+1) (a.uset t (dw x[t.toNat]!) s) (by rw [uZ]; exact d) (q+dw x[t.toNat]! * dw x[t.toNat]!) (if c < nfe x[t.toNat]! then nfe x[t.toNat]! else c) u p refine ⟨by rw [z,uZ],λj o => ?_,C,?_,λj A m => ?_⟩ · rw [y j (by rw [uZ]; exact o),fuS _ _ _ _ _ o,D] by_cases hjt:t.toNat=j · subst hjt; rw [AC щ,AD rfl,AD ⟨AP,l⟩] · simp only [hjt,ἂ] by_cases g:t.toNat ≤ j∧j < n.toNat · rw [AD щ,AD g] · rw [AC щ,AC g] · refine AZ ?_ v split <;> rename_i g · exact (μ.mp g).le · exact AP · by_cases hjt:j=t.toNat · subst hjt; refine AZ ?_ v split <;> rename_i g · exact AP · exact θ.mp (Wm.mp g) · exact w j щ m def eR (x g : @& Ἂ Word) (nd:Ἅ) (td:Word) (xb : @& ἀ) (ri:Ἅ) (t nn:Ἄ) (hx:nn.toNat ≤ x.size) (hg:nn.toNat ≤ g.size) (hr:nn.toNat ≤ xb.size) (out:Ἂ Word) (ho:nn.toNat ≤ out.size):Ἂ Word := if h:t < nn then have ht:t.toNat < nn.toNat:=ε.mp h let gw:=g.uget t (U1 ht hg) if nfe gw < 255 then let w:=wR x g nd td (x.uget t (U1 ht hx)) gw (xb.uget t (U1 ht hr)) ri t eR x g nd td xb ri (t+1) nn hx hg hr (out.uset t w (U1 ht ho)) (by rw [BT]; exact ho) else #[] else out termination_by nn.toNat-t.toNat decreasing_by exact nHd h lemma eR_spec (x g:Ἂ Word) (i:Ἅ) (h:Word) (d:ἀ) (e:Ἅ) (c:Ἄ) (y:c.toNat ≤ x.size) (r:c.toNat ≤ g.size) (n:c.toNat ≤ d.size) : ∀ k (t:Ἄ) (a:Ἂ Word) (ho:c.toNat ≤ a.size),c.toNat-t.toNat=k → t.toNat ≤ c.toNat → eR x g i h d e t c y r n a ho = #[] ∨ ((eR x g i h d e t c y r n a ho).size=a.size ∧ (∀ j,t.toNat ≤ j → j < c.toNat → nfe g[j]! < 255) ∧ ∀ j,j < a.size → (eR x g i h d e t c y r n a ho)[j]! = if t.toNat ≤ j∧j < c.toNat then wR x g i h x[j]! g[j]! d.data[j]! e (W0 j) else a[j]!):=by intro k; induction k with | zero => intro t a ho s D have u:¬ t < c:=nO1 s rw [eR.eq_def,dite_eq_right u] exact BA ⟨rfl,λj m F=>by omega,λj p=>by rw [AC щ]⟩ | succ k B => intro t a ho s D obtain ⟨m,v,q⟩:=nOs s have l:t < c:=ε.mpr m have C:(t+1).toNat=t.toNat+1:=Dense.ac l rw [eR.eq_def,AT l] simp only [Dense.cC] split · rename_i w have z:t.toNat < a.size:=U1 m ho rcases B (t+1) (a.uset t (wR x g i h x[t.toNat]! g[t.toNat]! (d.uget t (U1 m n)) e t) z) (by rw [BT]; exact ho) v q with hz | ⟨a1,a2,a3⟩ · exact pZ hz · refine BA ⟨by rw [a1,BT],fun j A o => ?_,fun j p => ?_⟩ · by_cases hjt:j=t.toNat · subst hjt; exact w · exact a2 j щ o · rw [a3 j (by rw [BT]; exact p),aset _ _ _ _ _ p,C] by_cases hjt:t.toNat=j · subst hjt rw [AC щ,AD rfl,AD ⟨AP,m⟩,ugetF] congr 1; exact Jv.symm · simp only [hjt,ἂ] by_cases hc:t.toNat ≤ j∧j < c.toNat · rw [AD щ,AD hc] · rw [AC щ,AC hc] · exact pZ rfl lemma usz (n:Nat) (h:n < 2^32):n < kX:=by rw [nT]; rcases System.Platform.numBits_eq with a | a <;> rw [a] <;> omega lemma qR0 (x:Ἂ Word) (n:Nat) (a:n ≤ x.size) (d:n < 2^32) : (n.toUSize).toNat ≤ x.size∧(n.toUSize).toNat ≤ (nZw n).size:=by have c:(n.toUSize).toNat=n:=Dense.aa (usz n щ) rw [c]; exact ⟨a,(V1 n 2).trans (nZw_sz n)⟩ def rmsF (n:Nat) (eps:Word) (x g:Ἂ Word) (hx:n ≤ x.size) (hg:n ≤ g.size) (hn:n < 2^32):Ἂ Word := let nn:=n.toUSize let o:=eps.toUInt64>>>32 let one:=(o+1).toInt64.toFloat let Qr:=qR x (nZw n) 0 nn (qR0 x n hx hn).1 (qR0 x n hx hn).2 o.toInt64.toFloat 0 if Qr.dl < 255 then let BD:=(O6 (Qr.q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat+dw eps*nS201)).toBits if nOKs BD (ai (n+4).toUInt64+4) then let td:=nWs 26 BD if 0 < (kB td).toUInt64&&(kB td).toUInt64 ≤ 170 && !ExactRuntime.signOf td then eR x g one td Qr.a (one/dw td) 0 nn (qR0 x n hx hn).1 (by rw [Dense.aa (usz n щ)]; 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 [W3,Dense.aa (usz n щ)]) 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 щ щ щ if r.size=n then r else rmsnormSpec rows n eps x g else rmsnormSpec rows n eps x g lemma eR_full (n:Nat) (d:Word) (x g:Ἂ Word) (c:Word) (q:ἀ) (e:Ἄ) (A:e.toNat=n) (B:e.toNat ≤ x.size) (u:e.toNat ≤ g.size) (z:e.toNat ≤ q.size) (ho:e.toNat ≤ (mB n (0:Word)).size) (G:1 ≤ n) (K:n < 2^32) (I:x.size=n) (t:g.size=n) (hX : ∀ j,j < n → kB x[j]! ≠ 255) (s : ∀ j,j < n → q.data[j]! = dw x[j]!) (C:c=mK (Xz n x 0 0+J4 d)) (H:0 < (kB c).toNat∧kB c≠255∧k9 c=false) (v:(kB c).toNat ≤ 170) (y:E9 d=true) (l:0 < J4 d) (p:(eR x g (I0 1).toInt64.toFloat c q ((I0 1).toInt64.toFloat/dw c) 0 e B u z (mB n 0) ho).size=n) : eR x g (I0 1).toInt64.toFloat c q ((I0 1).toInt64.toFloat/dw c) 0 e B u z (mB n 0) ho=B9 1 n d x g:=by rcases eR_spec x g _ c q _ e B u z e.toNat 0 (mB n 0) ho (by simp) (ϟ _) with hz | ⟨E1,E2,E3⟩ · rw [hz] at p; simp at p; omega have o : ∀ w:Word,(nfe w).toNat=(kB w).toNat:=λw=>by unfold nfe kB; simp have hG : ∀ j,j < n → kB g[j]! ≠ 255:=λj k h=>by have:=E2 j (ϟ _) щ rw [μ,o,h] at this; simp at this have r:mq 1 n d x g=true:=by unfold mq simp only [Η,AJ,AQ,np] refine ⟨⟨⟨⟨⟨⟨⟨by omega,by omega⟩,by omega⟩,t⟩,λi hi => ?_⟩,λi hi => ?_⟩,y⟩,l⟩ · have:=hX i (by omega); rw [AB x i hi] at this unfold E9; simpa using this · have:=hG i (by omega); rw [AB g i hi] at this unfold E9; simpa using this rw [B9,ExactRuntime.rmsnormWith,AD r] apply mi · rw [E1,W3]; exact (Ϝ.trans (n4 n)).symm · intro j D J have k:j < n:=by rw [E1] at D; simpa using D have F:=E3 j (by simpa using k) rw [AD ⟨ϟ _,by rw [A]; exact k⟩,AB _ j D] at F rw [F] simp only [Wx,Λ] rw [s j k] have m : ∀ a:Ἂ Word,ck a (W0 j)=a[j]! := λa=>by rw [f6,X3 (usz j щ)] rw [elR x g _ c (W0 j) x[j]! g[j]! (m x) (m g) (hX j k) (hG j k) rfl H v] congr 2 · rw [γ k] · rw [ώ k,C,AB _ 0 ц,Λ] lemma epsPos (a:Word) (c:kB a≠0) (d:k9 a=false) : 0 < O7 a∧0 < J4 a:=by have g:0 < kM a:=by unfold kM; rw [AC c]; positivity have e:0 < O7 a:=by unfold O7; rw [d]; simp; exact_mod_cast g refine ⟨e,?_⟩ rw [Y1]; exact mul_pos (by exact_mod_cast e) ф lemma rmsF_eq (n:Nat) (a:Word) (x g:Ἂ Word) (k:n ≤ x.size) (K:n ≤ g.size) (d:n < 2^32) (B:1 ≤ n) (M:n ≤ 4096) (G:x.size=n) (z:g.size=n) (C:kB a≠0) (u:kB a≠255) (F:k9 a=false) (c:(rmsF n a x g k K d).size=n) : rmsF n a x g k K d=B9 1 n a x g:=by have v:(n.toUSize).toNat=n:=Dense.aa (usz n d) obtain ⟨O,Q2,I, -, N⟩:=qR_spec x n.toUSize (qR0 x n k d).1 n 0 (nZw n) (qR0 x n k d).2 ((a.toUInt64>>>32).toInt64.toFloat) 0 (by rw [v]; rfl) (ϟ _) obtain ⟨A,H⟩:=epsPos a C F unfold rmsF at c ⊢ dsimp only at c ⊢ split <;> rename_i q · rw [AD q] at c split <;> rename_i r · rw [AD r] at c split <;> rename_i l · rw [AD l] at c have hX : ∀ j,j < n → kB x[j]! ≠ 255:=λj s h=>by have J:=N j (ϟ _) (by rw [v]; exact s) have e:(nfe x[j]!).toNat=(kB x[j]!).toNat:=by unfold nfe kB; simp rw [e,h] at J have L:=μ.mp q simp only [kN,kA] at J L; omega have y : ∀ j,j < n → (qR x (nZw n) 0 n.toUSize (qR0 x n k d).1 (qR0 x n k d).2 (a.toUInt64>>>32).toInt64.toFloat 0).a.data[j]! = dw x[j]! := λj s=>by rw [Q2 j (AN s ((V1 n 2).trans (nZw_sz n))),AD ⟨ϟ _,by rw [v]; exact s⟩] have m:=r rw [I,kO0,kQ52 n щ,kZ4 (n+4) щ] at m have p:=nQ_cert n a x 0 (by omega) (by norm_num; omega) (by omega) (λj s=>hX j щ) u A (by convert m using 4 <;> simp <;> rfl) have t:nWs 26 (O6 ((qR x (nZw n) 0 n.toUSize (qR0 x n k d).1 (qR0 x n k d).2 (a.toUInt64>>>32).toInt64.toFloat 0).q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat + dw a*nS201)).toBits = mK (Xz n x 0 0+J4 a):=by rw [I,kO0,kQ52 n щ]; convert p using 4 <;> simp <;> rfl simp only [Η,AJ,BM] at l obtain ⟨⟨o,i⟩,D⟩:=l rw [μ] at o; rw [θ] at i simp only [ϩ,kA] at o i have w:kB (nWs 26 (O6 ((qR x (nZw n) 0 n.toUSize (qR0 x n k d).1 (qR0 x n k d).2 (a.toUInt64>>>32).toInt64.toFloat 0).q*(((1:ἆ)<<<52)/n.toUInt64).toInt64.toFloat + dw a*nS201)).toBits)≠255:=λh=>by rw [h] at i; simp at i simp only [kO1] at c ⊢ exact eR_full n a x g _ _ n.toUSize v _ _ _ _ B d G z hX y t ⟨o,w,D⟩ i (by unfold E9; simpa using u) H c · rw [AC l] at c; simp at c; omega · rw [AC r] at c; simp at c; omega · rw [AC q] at c; simp at c; omega lemma rms_eq:rms=B9:=by funext rows n eps x g unfold rms split · rename_i h obtain ⟨l,k,e,j,a,d,m,i⟩:=h dsimp only split · rename_i c; subst l; exact rmsF_eq n eps x g _ _ _ k e j a d m i c · rfl · rfl end NX namespace NXc open Dense.F (WcE dw kFU kOfS wcAeq wcAeq_ok wcGet3 wcSub) open Norm (SN V3L_h1 V3Lo Vn Y1 YU Yq Yr ck f6 fG gN gP jm ju0 kO0 kZ1 nBu nC nCK nCa nEO nElK3 nFB nFE2 nH1 nH3 nHk2 nHk3 nLQk nLR nLR_el nLR_th nLc2 nLo nLoN nOK nOKs nRi nRow nRow1 nRow1_bad nRow1_eq nRowS nRow_bad nRow_eq nRow_sz nS1 nS2 nS201 nSv nV2 nV3 nW nWF nWF2 nWF_sp nWG2 nWG2_v nWs nYq_sz nZw nZw_sz nfe uS) open Core (ai) open ExactRuntime lemma ez0 (w:Word) (c:w<<<1=0):expOf w=0:=by have:=congrArg mJ c have d:=w.toNat_lt have a:(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 [a]; simp only [nr] at *; simp only [kN]; omega lemma za0 (w:Word) (a:w<<<1=0):rationalWord w=0:=by rw [Y1 w] have c:mantOf w=0:=by have:=congrArg mJ a unfold kM have e:=w.toNat_lt have d:(fracOf w).toNat=w.toNat%2^23:=by unfold lK simp only [Ξ,kN,show (8388607:Nat)=2^23-1 from rfl,ζ] simp only [ϴ,kN,kH,ο] at this rw [AD (ez0 w a),d]; simp only [nr] at *; omega unfold O7; rw [c]; simp lemma nfeL (w:Word) (h:nfe w < 255):expOf w≠255:=by intro c have e:nfe w=(expOf w).toUInt64:=rfl rw [e,c] at h; exact absurd h ж def cQ (x : @& Ἂ Word) (w0:Word) (i e:Ἄ):Ἆ := if h:i < e then let w:=ck x i if (w==w0||(w<<<1==0&&w0<<<1==0)) then cQ x w0 (i+1) e else false else true termination_by e.toNat-i.toNat decreasing_by have:=ε.mp h; have:=e.toNat_lt_size; rw [uS щ]; omega lemma cQ_spec (x:Ἂ Word) (c:Word) (e:Ἄ) : ∀ k (i:Ἄ),e.toNat-i.toNat=k → cQ x c i e=true → ∀ j,i.toNat ≤ j → j < e.toNat → (x[j]! = c∨(x[j]! <<< 1=0∧c<<<1=0)):=by intro k; induction k with | zero=>intro i h _ j m g; omega | succ k l => intro i h a j m g have hi:i < e:=ε.mpr щ rw [cQ,AT hi] at a dsimp only at a split at a · rename_i d have n:(i+1).toNat=i.toNat+1:=uS (by have:=e.toNat_lt_size; omega) by_cases hj:j=i.toNat · subst hj; rw [f6] at d; simpa only [nM,AQ,Η] using d · exact l (i+1) щ a j щ g · exact absurd a lN lemma foldC (f:ℕ → ℚ) (c:ℚ) : ∀ (l:List ℕ) (a:ℚ),(∀ j ∈ l,f j=c) → l.foldl (λt j=>t+f j) a=a+l.length*c:=by intro l; induction l with | nil=>intro a _; simp | cons h t g => intro a d rw [Ϸ,g _ (λj e=>d j (List.mem_cons_of_mem _ e)),d h List.mem_cons_self] simp only [List.length_cons,Y4,pJ]; ring lemma meanC (n:ℕ) (x:Ἂ Word) (r:ℕ) (c:ℚ) (d:0 < n) (h : ∀ j,j < n → rationalWord x[r*n+j]! = c):rowMean n x r=c:=by unfold rowMean have e:=foldC (λj=>rationalWord x[r*n+j]!) c (lj n) 0 (λj a=>h j (List.mem_range.mp a)) rw [e,List.length_range,Ai] have:(n:ℚ)≠0:=by exact_mod_cast (BD.mp d) field_simp lemma eoV (n:ℕ) (h:Word) (x g b:Ἂ Word) (m:0 < n) (q:0 < rationalWord h) (i:ℕ) (c:i/n*n+n < 2^(32:ℕ)) (hX : ∀ j,j < i/n*n+n → expOf x[j]! ≠ 255) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) : nEO n h x g b (I0 n).toInt64.toFloat (nLR n h x (i/n)) (G0 i) (G0 (i%n)) = roundRational ((rationalWord x[i]! - rowMean n x (i/n))*rationalWord g[i%n]! / rationalWord (sqrtRational (rowVariance n x (i/n) (rowMean n x (i/n))+rationalWord h))+rationalWord b[i%n]!):=by have r:=ϊ i m have e:i/n*n ≤ i:=pr i n have a:i < i/n*n+n:=Jo m dsimp only [nEO,nLoN] have z:=nSv h q simp only [nLo,nLR_th,f6,Conv.aa _ (N3 a c:i < 2^(32:ℕ)), Conv.aa _ (U1 r (N0 (H0 n _) (U2 c)):i%n < 2^(32:ℕ)), gP,gN _ _ _ _ m q c] obtain ⟨v,A, -⟩:=Vn n h x (i/n) m q refine nV3 _ _ _ (nV2 _ _ _ (λw => ?_) (λw => ?_)) (λs l => ?_) · rw [← v, ← A]; generalize YU n h x (i/n)=t at *; obtain ⟨u,k,y,o,p,d⟩:=t; dsimp only at * exact Norm.NE.jn _ _ _ d _ n u k o p y _ _ rfl (hX i a) (F _ r) (D _ r) m ‹_› (V3L_h1 _ _ _ _ _ v) rfl · rw [← v, ← A] · rw [nLR_el n h x (i/n) c hX z i e a _ _ (F _ r) (D _ r) s l] lemma specC (n:ℕ) (x g b:Ἂ Word) (c:Word) (k:ℕ) (h:0 < n) (a:Word) (l : ∀ j,k/n*n ≤ j → j < k/n*n+n → (x[j]! = a∨(x[j]! <<< 1=0∧a<<<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 c))+rationalWord b[k%n]!) = roundRational (rationalWord b[k%n]!):=by have d : ∀ j,k/n*n ≤ j → j < k/n*n+n → rationalWord x[j]! = rationalWord a:=by intro j p m; rcases l j p m with e | ⟨o,q⟩ · rw [e] · rw [za0 _ o,za0 _ q] have i:rowMean n x (k/n)=rationalWord a:=meanC n x (k/n) _ h (λj r=>d _ щ щ) rw [i,d k (pr k n) (Jo h),sub_self,zero_mul,zero_div,Ai] @[inline] def cbF (b:Ἂ Word):Ἂ Word:=b.map (λw=>roundRational (rationalWord w)) @[noinline] def cbS:ST.Ref Unit (Ἂ (WcE cbF)):=(ST.Prim.mkRef #[] (Void.mk ())).val @[noinline] def cbGo (b:Ἂ Word):{v//v=cbF b}:=wcGet3 wcAeq (λa c h=>wcAeq_ok h) cbS 32 b (λk=>k) def cbGs (b:Ἂ Word) (s:Ἂ (WcE cbF)) (i:Nat):{v//v=cbF b}:= if h:iwithPtrAddr b (λp2=> if p1=p2 then (if hk:wcAeq s[i].k b=true then ⟨s[i].v,by rw [s[i].h,wcAeq_ok hk]⟩ else cbGo b) else cbGs b s (i+1)) (λ_ _=>wcSub _ _)) (λ_ _=>wcSub _ _) else cbGo b termination_by s.size-i decreasing_by exact Z3 h (M1 i) @[noinline] def cbG (b:Ἂ Word):Ἂ Word:=(cbGs b (ST.Prim.Ref.get cbS (Void.mk ())).val 0).1 lemma cbG_v (b:Ἂ Word):cbG b=cbF b:=(cbGs b _ 0).2 lemma cbG_sp (b:Ἂ Word) (n:ℕ) (c:b.size=n) : ∀ j,j < n → (cbG b)[j]! = roundRational (rationalWord b[j]!):=by intro j a rw [cbG_v,cbF,AB _ j (by rw [m0]; omega),Jt,AB b j щ] lemma cB (n:ℕ) (a:Word) (x g b:Ἂ Word) (s:Ἂ Word) (r:ℕ) (d:Ἂ Word) (ho:r*n+n ≤ d.size) (o:r*n+n < 2^(32:ℕ)) (m:d.size < 2^(32:ℕ)) (hX : ∀ j,j < r*n+n → expOf x[j]! ≠ 255) (i:0 < rationalWord a) (H:(4 ≤ n&&n ≤ 2048&&expOf a != 0&&expOf a != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (t : ∀ j,j < n → s[j]! = roundRational (rationalWord b[j]!)) (y:(nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true) : Yq (λ(c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) s (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) d = Yq (nEO n a x g b (I0 n).toInt64.toFloat) (nLR n a x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) d:=by have u:0 < n:=by simp only [Η,AJ] at H; omega simp only [Η,AJ] at y obtain ⟨-, hq⟩:=y have q:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) o) have p:(G0 (r*n+n)).toNat=r*n+n:=Conv.aa _ o have v:=cQ_spec x _ _ _ _ rfl hq rw [q,p] at v obtain ⟨z,C⟩:=ju0 (λ(c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) s (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) d (by rw [p]; exact ho) m obtain ⟨w,b2⟩:=ju0 (nEO n a x g b (I0 n).toInt64.toFloat) (nLR n a x r) (G0 (r*n)) (G0 (r*n+n)) (G0 (r*n)) d (by rw [p]; exact ho) m apply mi (by rw [z,w]) intro k B A rw [← AB _ k B, ← AB _ k A,C k (z ▸ B),b2 k (w ▸ A),q,p] split · rename_i h have kr:k/n=r:=mG h.1 (by first | exact h.2 | (rw [Ο]; exact h.2) | (rw [Ϡ,n4]; exact h.2)) have G:k%n=k-r*n:=by rw [Zn,kr,Ϗ] have e:k < 2^(32:ℕ):=N3 h.2 o have l:G0 k-G0 (r*n)=G0 (k%n):=by apply H6.1 rw [R6 _ _ (by rw [R4,q,Conv.aa _ e]; exact h.1),q,Conv.aa _ e, Conv.aa _ (C0 (Ay k n) e),G] rw [l,f6,Conv.aa _ (C0 (Ay k n) e),t _ (ϊ _ u), ← kr, eoV n a x g b u i k (by rw [kr]; exact o) (by rw [kr]; exact hX) F D] exact (specC n x g b a k u _ (by rw [kr]; exact v)).symm · rfl lemma cBb (n:ℕ) (x:Ἂ Word) (r:ℕ) (d:r*n+n < 2^(32:ℕ)) (j:ℕ) (h:r*n ≤ j) (j2:j < r*n+n) (a:expOf x[j]! = 255) (g:(nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true):False:=by simp only [Η,AJ] at g obtain ⟨c,hq⟩:=g have k:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) d) have i:(G0 (r*n+n)).toNat=r*n+n:=Conv.aa _ d rcases cQ_spec x _ _ _ _ rfl hq j (by rw [k]; exact h) (by rw [i]; exact j2) with e | ⟨e1, -⟩ · rw [e] at a; exact nfeL _ c a · rw [ez0 _ e1] at a; exact absurd a ж @[inline] def cRow (n:ℕ) (eps:Word) (x g b:Ἂ Word) (Xr gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hr:n+2 ≤ Xr.size) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):ἀ × Ἂ Word := let lo:=G0 (r*n); let hi:=G0 (r*n+n) let w0:=ck x lo if (nfe w0 < 255&&cQ x w0 lo hi)=true then (Xr,Yq (λ(c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb lo lo hi out) else nRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC r out hr hg hd he hx ho hb lemma cRow_sz (n:ℕ) (c:Word) (x g b:Ἂ Word) (d gd bd:ἀ) (ge:ByteArray) (o:Ἅ) (h nf ep e:Ἅ) (L:ἆ) (k:nCK n c h nf ep e L) (s:Ἂ Word) (r:ℕ) (a:Ἂ Word) (p:n+2 ≤ d.size) (q:n ≤ gd.size) (l:n ≤ bd.size) (i:n ≤ ge.size) (m:r*n+n ≤ x.size) (ho:r*n+n ≤ a.size) (j:r*n+n < 2^(32:ℕ)) : (cRow n c x g b d gd bd ge o h nf ep e L k s r a p q l i m ho j).1.size=d.size ∧ ((cRow n c x g b d gd bd ge o h nf ep e L k s r a p q l i m ho j).2 = #[] ∨ (cRow n c x g b d gd bd ge o h nf ep e L k s r a p q l i m ho j).2.size=a.size):=by unfold cRow; dsimp only; split · exact ⟨rfl,BA (nYq_sz _ _ _ _ _ _ _ rfl)⟩ · exact nRow_sz n c x g b d gd bd ge o h nf ep e L k r a p q l i m ho j def cRows (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) : (k r:ℕ) → (Xr:ἀ) → (out:Ἂ Word) → n+2 ≤ Xr.size → rows*n ≤ out.size → r+k=rows → Ἂ Word | 0,_,_,out,_,_,_=>out | k+1,r,Xr,out,hr,ho,hk => have kk:r*n+n ≤ rows*n:=nHk2 hk let p:=cRow n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb) have q:p.1.size=Xr.size:=(cRow_sz n eps x g b Xr gd bd ge nd rm nf ep z0 L hC cb r out hr hg hd he (kk.trans hx) (kk.trans ho) (C0 kk hb)).1 if hs:rows*n ≤ p.2.size then cRows rows n eps x g b gd bd ge nd rm nf ep z0 L hC cb hg hd he hx hb k (r+1) p.1 p.2 (q ▸ hr) hs (nHk3 hk) else #[] lemma cRow_eq (n:ℕ) (a:Word) (x g b:Ἂ Word) (o gd bd:ἀ) (ge:ByteArray) (p nf ep l:Ἅ) (L:ἆ) (s:nCK n a p nf ep l L) (h:Ἂ Word) (r:ℕ) (c:Ἂ Word) (v:n+2 ≤ o.size) (u:n ≤ gd.size) (w:n ≤ bd.size) (q:n ≤ ge.size) (y:r*n+n ≤ x.size) (ho:r*n+n ≤ c.size) (i:r*n+n < 2^(32:ℕ)) (e:c.size < 2^(32:ℕ)) (hX : ∀ j,j < r*n+n → expOf x[j]! ≠ 255) (d:0 < rationalWord a) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (z : ∀ t,t < n → bd.data[t]! = dw b[t]!) (A : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (m:(4 ≤ n&&n ≤ 2048&&expOf a != 0&&expOf a != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (k : ∀ j,j < n → h[j]! = roundRational (rationalWord b[j]!)) : (cRow n a x g b o gd bd ge (I0 n).toInt64.toFloat p nf ep l L s h r c v u w q y ho i).2 = Yq (nEO n a x g b (I0 n).toInt64.toFloat) (nLR n a x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) c:=by have B:0 < n:=by simp only [Η,AJ] at m; omega unfold cRow; dsimp only; split · exact cB n a x g b h r c ho i e hX d m F D k (by assumption) · exact nRow_eq n a x g b o gd bd ge _ p nf ep l L s r c v u w q y ho i e hX d hG z A m lemma cRow_bad (n:ℕ) (a:Word) (x g b:Ἂ Word) (d gd bd:ἀ) (ge:ByteArray) (s:Ἅ) (i nf ep h:Ἅ) (L:ἆ) (m:nCK n a i nf ep h L) (v:Ἂ Word) (r:ℕ) (c:Ἂ Word) (t:n+2 ≤ d.size) (u:n ≤ gd.size) (o:n ≤ bd.size) (k:n ≤ ge.size) (q:r*n+n ≤ x.size) (ho:r*n+n ≤ c.size) (e:r*n+n < 2^(32:ℕ)) (j:ℕ) (l:r*n ≤ j) (j2:j < r*n+n) (p:expOf x[j]! = 255) : (cRow n a x g b d gd bd ge s i nf ep h L m v r c t u o k q ho e).2 = #[]:=by unfold cRow; dsimp only; split · exact (cBb n x r e j l j2 p (by assumption)).elim · exact nRow_bad n a x g b d gd bd ge s i nf ep h L m r c t u o k q ho e j l j2 p lemma cRows_eq (a n:ℕ) (c:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (u nf ep s:Ἅ) (L:ἆ) (w:nCK n c u nf ep s L) (p:Ἂ Word) (z:n ≤ gd.size) (A:n ≤ bd.size) (v:n ≤ ge.size) (B:a*n ≤ x.size) (q:a*n < 2^(32:ℕ)) (hX : ∀ j,j < a*n → expOf x[j]! ≠ 255) (m:0 < rationalWord c) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (G : ∀ t,t < n → bd.data[t]! = dw b[t]!) (K : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (I:(4 ≤ n&&n ≤ 2048&&expOf c != 0&&expOf c != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (y : ∀ j,j < n → p[j]! = roundRational (rationalWord b[j]!)) : ∀ k (r:ℕ) (l:ἀ) (d:Ἂ Word) (o:n+2 ≤ l.size) (ho:a*n ≤ d.size) (e:r+k=a), d.size=a*n → cRows a n c x g b gd bd ge (I0 n).toInt64.toFloat u nf ep s L w p z A v B q k r l d o ho e = Yr (λr=>nLR n c x r) (nEO n c x g b (I0 n).toInt64.toFloat) n a r d:=by intro k; induction k with | zero => intro r l d o ho e i; rw [Yr,AC (by rw [← e]; exact K4 r)]; rfl | succ k J => intro r l d o ho e i have h:=nHk2 (n:=n) e rw [Yr,AD (e ▸ V4 (P4 k))] have E:=cRow_eq n c x g b l gd bd ge u nf ep s L w p r d o z A v (h.trans B) (h.trans ho) (C0 h q) (by rw [i]; exact q) (λj H=>hX j (U1 H h)) m hG G K I F D y have C:(cRow n c x g b l gd bd ge (I0 n).toInt64.toFloat u nf ep s L w p r d o z A v (h.trans B) (h.trans ho) (C0 h q)).2.size=a*n:=by rw [E,nYq_sz _ _ _ _ _ _ _ rfl,i] rw [cRows,AT C.ge] refine (J (r+1) _ _ _ _ (nHk3 e) C).trans ?_ rw [E] lemma cRows_bad (a n:ℕ) (h:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (z:Ἅ) (q nf ep m:Ἅ) (L:ἆ) (v:nCK n h q nf ep m L) (s:Ἂ Word) (w:n ≤ gd.size) (A:n ≤ bd.size) (t:n ≤ ge.size) (B:a*n ≤ x.size) (u:a*n < 2^(32:ℕ)) (D:0 < n) : ∀ k (r:ℕ) (i:ἀ) (d:Ἂ Word) (l:n+2 ≤ i.size) (ho:a*n ≤ d.size) (e:r+k=a) (j:ℕ), r*n ≤ j → j < a*n → expOf x[j]! = 255 → cRows a n h x g b gd bd ge z q nf ep m L v s w A t B u k r i d l ho e = #[]:=by intro k; induction k with | zero=>intro r i d l ho e j y j2 o; rw [ϑ] at e; subst e; omega | succ k C => intro r i d l ho e j y j2 o have p:=nHk2 (n:=n) e rw [cRows]; split · rename_i S by_cases c:j < r*n+n · rw [cRow_bad n h x g b i gd bd ge z q nf ep m L v s r d l w A t (p.trans B) (p.trans ho) (C0 p u) j y c o] at S simp only [Za] at S; omega · exact C (r+1) _ _ _ _ (nHk3 e) j (by rw [Ϡ,n4]; omega) j2 o · rfl lemma s1S {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {a:ἆ} (h:i < e) : nS1 x i e s a=nS1 x (i+1) e (s+dw (ck x i)) (if a < nfe (ck x i) then nfe (ck x i) else a):=by rw [nS1.eq_def x i e s a]; simp only [AT h] lemma s1E {x:Ἂ Word} {i e:Ἄ} {s:Ἅ} {a:ἆ} (h:¬i < e):nS1 x i e s a=(s,a):=by rw [nS1.eq_def x i e s a]; simp only [dite_eq_right h] lemma s2S {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:i < e) : nS2 x m i e v=nS2 x m (i+1) e (v+(dw (ck x i)-m)*(dw (ck x i)-m)):=by rw [nS2.eq_def x m i e v]; simp only [AT h] lemma s2E {x:Ἂ Word} {m:Ἅ} {i e:Ἄ} {v:Ἅ} (h:¬i < e):nS2 x m i e v=v:=by rw [nS2.eq_def x m i e v]; simp only [dite_eq_right h] @[inline] def oE {β:Type} (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd:Ἅ) (r:ℕ) (dW:Word) (m ri:Ἅ) (Kp:ἆ) (v gw bw:Ἅ) (gx:ἆ) (i j:Ἄ) (ex:Option Norm.NR.fH) (k:Word → Option Norm.NR.fH → β):β:= let B:=((v-m)*(gw*ri)+bw).toBits if nOK B (nC (gx+Kp) ((B>>>52)&&&2047)) then k (nW B) ex else let p:=nFB n eps x g b nd r dW ex i j; k p.1 (some p.2) lemma oE_c {β:Type} {n:ℕ} {c:Word} {x g b:Ἂ Word} {y:Ἅ} {r:ℕ} {dW:Word} {m s:Ἅ} {t:ἆ} {v p w u d h:Ἅ} {gx a:ἆ} {i j:Ἄ} {q:Option Norm.NR.fH} {k l:Word → Option Norm.NR.fH → β} (C:v=u) (A:p=d) (z:w=h) (D:gx=a) (B:∀ o e,k o e=l o e) : oE n c x g b y r dW m s t v p w gx i j q k=oE n c x g b y r dW m s t u d h a i j q l:=by subst C A z D; rw [show k=l from funext λo=>funext λe=>B o e] lemma f2S {n:ℕ} {c:Word} {x g b:Ἂ Word} {s m l:Ἅ} {p:ἆ} {r:ℕ} {dW:Word} {u:Option Norm.NR.fH} {lo t a:Ἄ} {j:a.toNat ≤ g.size} {k:a.toNat ≤ b.size} {q:lo.toNat+a.toNat ≤ x.size} {i:lo.toNat+a.toNat < 2^(32:ℕ)} {d:Ἂ Word} {ho:lo.toNat+a.toNat ≤ d.size} (h:t < a) : nFE2 n c x g b s m l p r dW u lo t a j k q i d ho = oE n c x g b s r dW m l p (dw (x.uget (lo+t) (nH1 (ε.mp h) i q))) (dw (g.uget t (U1 (ε.mp h) j))) (dw (b.uget t (U1 (ε.mp h) k))) (nfe (g.uget t (U1 (ε.mp h) j))) (lo+t) t u (λo e=>nFE2 n c x g b s m l p r dW e lo (t+1) a j k q i (d.uset (lo+t) o (nH1 (ε.mp h) i ho)) (nH3 _ _ _ _ ho)):=by rw [nFE2.eq_def n c x g b s m l p r dW u lo t a j k q i d ho]; simp only [AT h,oE] lemma f2E {n:ℕ} {d:Word} {x g b:Ἂ Word} {p m k:Ἅ} {l:ἆ} {r:ℕ} {dW:Word} {j:Option Norm.NR.fH} {lo t c:Ἄ} {q:c.toNat ≤ g.size} {i:c.toNat ≤ b.size} {o:lo.toNat+c.toNat ≤ x.size} {e:lo.toNat+c.toNat < 2^(32:ℕ)} {a:Ἂ Word} {ho:lo.toNat+c.toNat ≤ a.size} (h:¬t < c) : nFE2 n d x g b p m k l r dW j lo t c q i o e a ho=a:=by rw [nFE2.eq_def n d x g b p m k l r dW j lo t c q i o e a ho]; simp only [dite_eq_right h] lemma cku {x:Ἂ Word} {i j:Ἄ} (a:i=j) (h:j.toNat < x.size):ck x i=x.uget j h:=by subst a; rw [f6,Dense.cC] lemma k4c {g b:Ἂ Word} {gd bd:ἀ} {ge:ByteArray} (t:Ἄ) {n:ℕ} (a:t.toNat < n) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (d : ∀ t,t < n → bd.data[t]! = dw b[t]!) (i : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (h:n ≤ gd.size) (p2:n ≤ bd.size) (c:n ≤ ge.size) (p4:n ≤ g.size) (e:n ≤ b.size) : gd.uget t (U1 a h)=dw (g.uget t (U1 a p4)) ∧ bd.uget t (U1 a p2)=dw (b.uget t (U1 a e)) ∧ (ge.uget t (U1 a c)).toUInt64=nfe (g.uget t (U1 a p4)):=by refine ⟨?_,?_,?_⟩ · rw [kFU,hG _ a,Dense.cC] · rw [kFU,d _ a,Dense.cC] · rw [nBu,i _ a,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:=O6 (v*nf+ep) let B:=D.toBits let dW:=nWs 26 B let ed:=expOf dW let E:=((m.toBits>>>52)&&&2047)+6 let a:=L+Dl+1049 let c:=2*L+2*Dl let f:=(expOf eps).toUInt64+178 let d:=if f ≤ c then c-f else 0 k m (nRi dW ed.toUInt64) ((if a ≤ E then E else a)-ed.toUInt64) dW (nOKs B ((if L+4 ≤ d then d else L+4)+2)&&0Ἅ) (g nf ep:Ἅ) (L:ἆ) (k:Ἅ->Ἅ->ἆ->Word->Ἆ->β) (e:L.toNat ≤ 64) (h:c.toNat < 255):sLQ a s c d g nf ep L k=nLQk a s c d g nf ep L k:=rfl lemma nCKL {n:ℕ} {a:Word} {e nf ep d:Ἅ} {L:ἆ} (c:nCK n a e nf ep d L) (g:n < 2^(32:ℕ)):L.toNat ≤ 64:=by obtain ⟨-,-,-,-,h⟩:=c; subst h have i:Aq (n+4) < 33:=(m9 щ).mpr щ rw [kZ1 (n+4) щ,kOfS _ щ]; omega lemma kU {t:Ἄ} {k n N s:ℕ} (c:t.toNat=k) (d:n=N) (a:k < N) (h:n ≤ s):t.toNat < s:=by omega lemma kQ {r n k s:ℕ} {t:Ἄ} (a:t.toNat=k) (e:k < n) (d:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (G0 (r*n)+t).toNat < s:=by have c:(G0 (r*n)).toNat=r*n:=Conv.aa _ (C0 (V1 _ _) d) rw [nCa (by rw [c,a]; omega),c,a]; omega lemma cQS {x:Ἂ Word} {a:Word} {i e:Ἄ} (h:i < e) : cQ x a i e=if (ck x i==a||(ck x i<<<1==0&&a<<<1==0)) then cQ x a (i+1) e else false:=by rw [cQ.eq_def x a i e]; simp only [AT h] lemma cQE {x:Ἂ Word} {a:Word} {i e:Ἄ} (h:¬i < e):cQ x a i e=true:=by rw [cQ.eq_def x a i e]; simp only [dite_eq_right h] lemma kQl {r n k s:ℕ} {lo t:Ἄ} (a:lo=G0 (r*n)) (e:t.toNat=k) (c:k < n) (d:r*n+n < 2^(32:ℕ)) (ho:r*n+n ≤ s) : (lo+t).toNat < s:=by subst a; exact kQ e c d ho lemma loS {r n:ℕ} {lo d:Ἄ} (a:lo.toNat=r*n) (c:d.toNat=n) (e:r*n+n < 2^(32:ℕ)):(lo+d).toNat=(r+1)*n:=by rw [nCa (by rw [a,c]; exact e),a,c,Ο] lemma lE {lo:Ἄ} {m:ℕ} (h:lo.toNat=m) (a:m < 2^(32:ℕ)):lo=G0 m:=H6.1 (h.trans (Conv.aa _ a).symm) noncomputable def cRw (n:ℕ) (eps:Word) (x g b:Ἂ Word) (nd rm nf ep z0:Ἅ) (L:ἆ) (hC:nCK n eps rm nf ep z0 L) (cb:Ἂ Word) (r:ℕ) (out:Ἂ Word) (hg':n ≤ g.size) (hd':n ≤ b.size) (hx:r*n+n ≤ x.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if (nfe (ck x (G0 (r*n))) < 255&&cQ x (ck x (G0 (r*n))) (G0 (r*n)) (G0 (r*n+n)))=true then Yq (λ(c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) out else nRow1 n eps x g b nd rm nf ep z0 L hC r out hg' hd' hx ho hb lemma uT0:(0:Ἄ).toNat=0:=Ϧ lemma uT1:(0+1:Ἄ).toNat=1:=by rw [nCa (by rw [uT0,mA]; decide),uT0,mA] lemma uT2:(0+1+1:Ἄ).toNat=2:=by rw [nCa (by rw [uT1,mA]; decide),uT1,mA] lemma uT3:(0+1+1+1:Ἄ).toNat=3:=by rw [nCa (by rw [uT2,mA]; decide),uT2,mA] lemma uT4:(0+1+1+1+1:Ἄ).toNat=4:=by rw [nCa (by rw [uT3,mA]; decide),uT3,mA] lemma uT5:(0+1+1+1+1+1:Ἄ).toNat=5:=by rw [nCa (by rw [uT4,mA]; decide),uT4,mA] lemma uT6:(0+1+1+1+1+1+1:Ἄ).toNat=6:=by rw [nCa (by rw [uT5,mA]; decide),uT5,mA] lemma uT7:(0+1+1+1+1+1+1+1:Ἄ).toNat=7:=by rw [nCa (by rw [uT6,mA]; decide),uT6,mA] lemma uT8:(0+1+1+1+1+1+1+1+1:Ἄ).toNat=8:=by rw [nCa (by rw [uT7,mA]; decide),uT7,mA] @[inline] def k4O (out:Ἂ Word) (lo:Ἄ) (o0 o1 o2 o3:Word) (h0:(lo+0).toNat < out.size) (h1:(lo+(0+1)).toNat < out.size) (h2:(lo+(0+1+1)).toNat < out.size) (h3:(lo+(0+1+1+1)).toNat < out.size):Ἂ Word:= ((((out.uset (lo+0) o0 h0).uset (lo+(0+1)) o1 (by rw [BT]; exact h1)).uset (lo+(0+1+1)) o2 (by rw [BT,BT]; exact h2)).uset (lo+(0+1+1+1)) o3 (by rw [BT,BT,BT]; exact h3)) @[inline] def k4 (n:ℕ) (hN:n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= let w0:=ck x (lo); let w1:=ck x (lo+1); let w2:=ck x (lo+1+1); let w3:=ck x (lo+1+1+1) if (nfe w0 < 255&&(if (w0==w0||(w0<<<1==0&&w0<<<1==0)) then if (w1==w0||(w1<<<1==0&&w0<<<1==0)) then if (w2==w0||(w2<<<1==0&&w0<<<1==0)) then if (w3==w0||(w3<<<1==0&&w0<<<1==0)) then true else false else false else false else false))=true then Yq (λ(c:Ἂ Word) (_:Ἄ) (j:Ἄ)=>ck c j) cb lo lo (G0 (r*n+n)) out else let v0:=dw w0; let v1:=dw w1; let v2:=dw w2; let v3:=dw w3 let D0:=if (0:ἆ) < nfe w0 then nfe w0 else 0 let D1:=if D0 < nfe w1 then nfe w1 else D0 let D2:=if D1 < nfe w2 then nfe w2 else D1 let D3:=if D2 < nfe w3 then nfe w3 else D2 if D3 < 255 then sLQ eps ((((z0+v0)+v1)+v2)+v3) D3 (λm=>((((z0+(v0-m)*(v0-m))+(v1-m)*(v1-m))+(v2-m)*(v2-m))+(v3-m)*(v3-m))) rm nf ep L (λ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 ж he)).toUInt64 (lo+0) (0) none (λ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 ж he)).toUInt64 (lo+(0+1)) (0+1) e1 (λ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 ж he)).toUInt64 (lo+(0+1+1)) (0+1+1) e2 (λ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 ж he)).toUInt64 (lo+(0+1+1+1)) (0+1+1+1) e3 (λo3 _=> k4O out lo o0 o1 o2 o3 (kQl hlo uT0 (by rw [hN]; decide) hb ho) (kQl hlo uT1 (by rw [hN]; decide) hb ho) (kQl hlo uT2 (by rw [hN]; decide) hb ho) (kQl hlo uT3 (by rw [hN]; decide) hb ho))))) else nRowS n eps x g b nd r lo (G0 (r*n+n)) out) else #[] lemma k4_eq (n:ℕ) (hN:n=4) (j:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (X nf ep G:Ἅ) (L:ἆ) (Y:Ἂ Word) (r:ℕ) (lo:Ἄ) (p:lo=G0 (r*n)) (i:Ἂ Word) (s:n ≤ gd.size) (u:n ≤ bd.size) (k:n ≤ ge.size) (ho:r*n+n ≤ i.size) (l:r*n+n < 2^(32:ℕ)) (hC:nCK n j X nf ep G L) (c:n ≤ g.size) (d:n ≤ b.size) (hx:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (y : ∀ t,t < n → bd.data[t]! = dw b[t]!) (z : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) : k4 n hN j x g b gd bd ge nd X nf ep G L Y r lo p i s u k ho l=cRw n j x g b nd X nf ep G L hC Y r i c d hx ho l:=by subst hN p have a:(G0 (r*4)).toNat=r*4:=Conv.aa _ (C0 (V1 _ _) l) have q:(G0 (r*4+4)).toNat=r*4+4:=Conv.aa _ l have o:(G0 4).toNat=4:=Conv.aa _ (C0 (H0 _ _) l) have e:(1:Ἄ).toNat=1:=mA have v:(G0 (r*4)+1).toNat=r*4+1:=by rw [nCa (by rw [a,e]; omega),a,e] have b2:(G0 (r*4)+1+1).toNat=r*4+2:=by rw [nCa (by rw [v,e]; omega),v,e] have w:(G0 (r*4)+1+1+1).toNat=r*4+3:=by rw [nCa (by rw [b2,e]; omega),b2,e] have b4:(G0 (r*4)+1+1+1+1).toNat=r*4+4:=by rw [nCa (by rw [w,e]; omega),w,e] have c0:(G0 (r*4)+0).toNat=r*4:=by rw [nCa (by rw [a,uT0]; omega),a,uT0]; rfl have c1:(G0 (r*4)+(0+1)).toNat=r*4+1:=by rw [nCa (by rw [a,uT1]; omega),a,uT1] have c2:(G0 (r*4)+(0+1+1)).toNat=r*4+2:=by rw [nCa (by rw [a,uT2]; omega),a,uT2] have c3:(G0 (r*4)+(0+1+1+1)).toNat=r*4+3:=by rw [nCa (by rw [a,uT3]; omega),a,uT3] have l0:G0 (r*4) < G0 (r*4+4):=ε.mpr (by rw [a,q]; exact V4 ж) have N:G0 (r*4)+1 < G0 (r*4+4):=ε.mpr (by rw [v,q]; exact O1 ж _) have K:G0 (r*4)+1+1 < G0 (r*4+4):=ε.mpr (by rw [b2,q]; exact O1 ж _) have U:G0 (r*4)+1+1+1 < G0 (r*4+4):=ε.mpr (by rw [w,q]; exact O1 ж _) have I:¬G0 (r*4)+1+1+1+1 < G0 (r*4+4):=λh=>by have:=ε.mp h; rw [b4,q] at this; exact K4 _ this have m0:(0:Ἄ) < G0 4:=ε.mpr (by rw [uT0,o]; decide) have m1:(0+1:Ἄ) < G0 4:=ε.mpr (by rw [uT1,o]; decide) have m2:(0+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT2,o]; decide) have m3:(0+1+1+1:Ἄ) < G0 4:=ε.mpr (by rw [uT3,o]; decide) have m4:¬(0+1+1+1+1:Ἄ) < G0 4:=λh=>by have:=ε.mp h; rw [uT4,o] at this; exact K4 _ this unfold k4 cRw nRow1; dsimp only rw [cQS l0,cQS N,cQS K,cQS U,cQE I] refine ite_congr rfl (λ_=>rfl) (λ_=>?_) rw [s1S l0,s1S N,s1S K,s1S U,s1E I] simp only [s2S l0,s2S N,s2S K,s2S U,s2E I] refine ite_congr rfl (λhD=>?_) (λ_=>rfl) rw [sLQ_e _ _ _ _ _ _ _ _ _ (nCKL hC ж) (by have:=μ.mp hD; simpa using this)] congr 1; funext m ri Kp dW fast cases fast · simp only [υ,↓reduceIte] · simp only [↓reduceIte] obtain ⟨A,T,D⟩:=k4c (0) (n:=4) (by rw [uT0]; decide) hG y z s u k c d obtain ⟨F,O,M⟩:=k4c (0+1) (n:=4) (by rw [uT1]; decide) hG y z s u k c d obtain ⟨H,B,V⟩:=k4c (0+1+1) (n:=4) (by rw [uT2]; decide) hG y z s u k c d obtain ⟨J,S,C⟩:=k4c (0+1+1+1) (n:=4) (by rw [uT3]; decide) hG y z s u k c d rw [f2S m0]; refine oE_c (congrArg _ (cku (H6.1 (by rw [a,c0])) _)) A T D (λo0 e1=>?_) rw [f2S m1]; refine oE_c (congrArg _ (cku (H6.1 (by rw [v,c1])) _)) F O M (λe e2=>?_) rw [f2S m2]; refine oE_c (congrArg _ (cku (H6.1 (by rw [b2,c2])) _)) H B V (λo2 e3=>?_) rw [f2S m3]; refine oE_c (congrArg _ (cku (H6.1 (by rw [w,c3])) _)) J S C (λo3 e4=>?_) rw [f2E m4]; rfl @[inline] def kS (n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (r:ℕ) (lo:Ἄ) (hlo:lo=G0 (r*n)) (out:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (ho:r*n+n ≤ out.size) (hb:r*n+n < 2^(32:ℕ)):Ἂ Word:= if h:n=4 then k4 n h eps x g b gd bd ge nd rm nf ep z0 L cb r lo hlo out hg hd he ho hb else absurd (hK.elim id id) h lemma kS_eq (n:ℕ) (p:n=4∨n=4) (a:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (m:Ἅ) (j nf ep i:Ἅ) (L:ἆ) (l:Ἂ Word) (r:ℕ) (lo:Ἄ) (d:lo=G0 (r*n)) (c:Ἂ Word) (v:n ≤ gd.size) (s:n ≤ bd.size) (o:n ≤ ge.size) (ho:r*n+n ≤ c.size) (k:r*n+n < 2^(32:ℕ)) (q:nCK n a j nf ep i L) (h:n ≤ g.size) (e:n ≤ b.size) (u:r*n+n ≤ x.size) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (w : ∀ t,t < n → bd.data[t]! = dw b[t]!) (y : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!):kS n p a x g b gd bd ge m j nf ep i L l r lo d c v s o ho k=cRw n a x g b m j nf ep i L q l r c h e u ho k:=by unfold kS; split · exact k4_eq n _ a x g b gd bd ge m j nf ep i L l r lo d c v s o ho k q h e u hG w y · exact absurd (p.elim id id) ‹_› def cRowsK (rows n:ℕ) (hK:n=4∨n=4) (eps:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (nd:Ἅ) (rm nf ep z0:Ἅ) (L:ἆ) (cb:Ἂ Word) (hg:n ≤ gd.size) (hd:n ≤ bd.size) (he:n ≤ ge.size) (hx:rows*n ≤ x.size) (hb:rows*n < 2^(32:ℕ)) (nn:Ἄ) (hnn:nn.toNat=n) (T:ℕ) (hT:T ≤ rows*n∧rows*n ≤ T) : (k r:ℕ) → (lo:Ἄ) → lo.toNat=r*n → (out:Ἂ Word) → rows*n ≤ out.size → r+k=rows → Ἂ Word | 0,_,_,_,out,_,_=>out | k+1,r,lo,hlo,out,ho,hk => have kk:r*n+n ≤ rows*n:=nHk2 hk let p:=kS n hK eps x g b gd bd ge nd rm nf ep z0 L cb r lo (lE hlo (C0 (V1 _ _) (C0 kk hb))) out hg hd he (kk.trans ho) (C0 kk hb) if hs:T ≤ p.size then cRowsK rows n hK eps x g b gd bd ge nd rm nf ep z0 L cb hg hd he hx hb nn hnn T hT k (r+1) (lo+nn) (loS hlo hnn (C0 kk hb)) p (hT.2.trans hs) (nHk3 hk) else #[] lemma cRowsK_eq (a n:ℕ) (w:n=4∨n=4) (c:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (s nf ep q:Ἅ) (L:ἆ) (J:nCK n c s nf ep q L) (p:Ἂ Word) (z:n ≤ gd.size) (A:n ≤ bd.size) (y:n ≤ ge.size) (u:n ≤ g.size) (v:n ≤ b.size) (H:a*n ≤ x.size) (i:a*n < 2^(32:ℕ)) (N:Ἄ) (G:N.toNat=n) (T:ℕ) (M:T ≤ a*n∧a*n ≤ T) (hX : ∀ j,j < a*n → expOf x[j]! ≠ 255) (m:0 < rationalWord c) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (O : ∀ t,t < n → bd.data[t]! = dw b[t]!) (U : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) (K:(4 ≤ n&&n ≤ 2048&&expOf c != 0&&expOf c != 255)=true) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (B : ∀ j,j < n → p[j]! = roundRational (rationalWord b[j]!)) : ∀ k (r:ℕ) (lo:Ἄ) (h:lo.toNat=r*n) (d:Ἂ Word) (ho:a*n ≤ d.size) (o:r+k=a), d.size=a*n → cRowsK a n w c x g b gd bd ge (I0 n).toInt64.toFloat s nf ep q L p z A y H i N G T M k r lo h d ho o = Yr (λr=>nLR n c x r) (nEO n c x g b (I0 n).toInt64.toFloat) n a r d:=by intro k; induction k with | zero => intro r lo h d ho o l; rw [Yr,AC (by rw [← o]; exact K4 r)]; rfl | succ k S => intro r lo h d ho o l have e:=nHk2 (n:=n) o rw [Yr,AD (o ▸ V4 (P4 k))] have E:kS n w c x g b gd bd ge (I0 n).toInt64.toFloat s nf ep q L p r lo (lE h (C0 (V1 _ _) (C0 e i))) d z A y (e.trans ho) (C0 e i) =Yq (nEO n c x g b (I0 n).toInt64.toFloat) (nLR n c x r) (G0 (r*n)) (G0 (r*n)) (G0 (r*n+n)) d:=by rw [kS_eq n w c x g b gd bd ge _ s nf ep q L p r lo _ d z A y (e.trans ho) (C0 e i) J u v (e.trans H) hG O U] unfold cRw; split · exact cB n c x g b p r d (e.trans ho) (C0 e i) (by rw [l]; exact i) (λj C=>hX j (U1 C e)) m K F D B (by assumption) · exact nRow1_eq n c x g b _ s nf ep q L J r d u v (e.trans H) (e.trans ho) (C0 e i) (by rw [l]; exact i) (λj C=>hX j (U1 C e)) m K have I:(kS n w c x g b gd bd ge (I0 n).toInt64.toFloat s nf ep q L p r lo (lE h (C0 (V1 _ _) (C0 e i))) d z A y (e.trans ho) (C0 e i)).size=a*n:=by rw [E,nYq_sz _ _ _ _ _ _ _ rfl,l] rw [cRowsK,AT (M.1.trans I.ge)] refine (S (r+1) _ _ _ _ (nHk3 o) I).trans ?_ rw [E] lemma cRowsK_bad (a n:ℕ) (w:n=4∨n=4) (e:Word) (x g b:Ἂ Word) (gd bd:ἀ) (ge:ByteArray) (v:Ἅ) (s nf ep o:Ἅ) (L:ἆ) (G:nCK n e s nf ep o L) (y:Ἂ Word) (A:n ≤ gd.size) (D:n ≤ bd.size) (z:n ≤ ge.size) (p:n ≤ g.size) (q:n ≤ b.size) (F:a*n ≤ x.size) (m:a*n < 2^(32:ℕ)) (H:Ἄ) (C:H.toNat=n) (T:ℕ) (J:T ≤ a*n∧a*n ≤ T) (N:0 < n) (hG : ∀ t,t < n → gd.data[t]! = dw g[t]!) (I : ∀ t,t < n → bd.data[t]! = dw b[t]!) (M : ∀ t,t < n → (ge.data[t]!).toUInt64=nfe g[t]!) : ∀ k (r:ℕ) (lo:Ἄ) (i:lo.toNat=r*n) (d:Ἂ Word) (ho:a*n ≤ d.size) (l:r+k=a) (j:ℕ), r*n ≤ j → j < a*n → expOf x[j]! = 255 → cRowsK a n w e x g b gd bd ge v s nf ep o L y A D z F m H C T J k r lo i d ho l = #[]:=by intro k; induction k with | zero=>intro r lo i d ho l j B j2 u; rw [ϑ] at l; subst l; omega | succ k K => intro r lo i d ho l j B j2 u have h:=nHk2 (n:=n) l rw [cRowsK]; split · rename_i S by_cases c:j < r*n+n · have E:kS n w e x g b gd bd ge v s nf ep o L y r lo (lE i (C0 (V1 _ _) (C0 h m))) d A D z (h.trans ho) (C0 h m)=#[]:=by rw [kS_eq n w e x g b gd bd ge v s nf ep o L y r lo _ d A D z (h.trans ho) (C0 h m) G p q (h.trans F) hG I M] unfold cRw; split · exact (cBb n x r (C0 h m) j B c u (by assumption)).elim · exact nRow1_bad n e x g b v s nf ep o L G r d p q (h.trans F) (h.trans ho) (C0 h m) j B c u rw [E] at S; simp only [Za] at S; omega · exact K (r+1) _ _ _ _ (nHk3 l) j (by rw [Ϡ,n4]; omega) j2 u · rfl def Yw3 (rows n:ℕ) (eps:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (hW:W=nWF2 (g,b)):Ἂ Word := let nd:=(I0 n).toInt64.toFloat let lg:=ai (I0 n) let rm:=(((1:ἆ)<<<(52+lg))/I0 n).toInt64.toFloat*F5 ((971-lg)<<<52) let nf:=(((1:ἆ)<<<52)/I0 n).toInt64.toFloat let ep:=dw eps*nS201; let z0:=(eps.toUInt64>>>32).toInt64.toFloat let L:=ai (I0 (n+4))+1 have hC:nCK n eps rm nf ep z0 L:=⟨rfl,rfl,rfl,congrArg (λu:ἆ=>u.toInt64.toFloat) (kO0 eps),rfl⟩ if h:x.size=rows*n∧g.size=n∧b.size=n∧rows*n ≤ 4294967295 then if (4 ≤ n&&n ≤ 2048&&expOf eps != 0&&expOf eps != 255)=true then have hg:n ≤ W.1.1.size:=by simp only [hW,nWF2,(nWF_sp g).1,h.2.1,le_refl] have hd:n ≤ W.2.1.size:=by simp only [hW,nWF2,(nWF_sp b).1,h.2.2.1,le_refl] have he:n ≤ W.1.2.size:=by simp only [hW,nWF2,(nWF_sp g).2.2.1,h.2.1,le_refl] if h1:rows=1 then (nRow n eps x g b (nZw n) W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L hC 0 (mB (rows*n) 0) (nZw_sz n) hg hd he (by rw [h.1,h1]; omega) (by simp only [W3]; rw [h1]; omega) (by have:=h.2.2.2; rw [h1] at this; omega)).2 else if hK:n=4∨n=4 then cRowsK rows n hK eps x g b W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L (cbG b) hg hd he h.1.ge (J3 h.2.2.2) (G0 n) (Conv.aa _ щ) (rows*n) ⟨le_refl _,le_refl _⟩ rows 0 0 (Ϧ.trans (ϳ n).symm) (mB (rows*n) 0) (by simp only [W3]; exact Jy _) (Κ rows) else cRows rows n eps x g b W.1.1 W.2.1 W.1.2 nd rm nf ep z0 L hC (cbG b) hg hd he h.1.ge (J3 h.2.2.2) rows 0 (nZw n) (mB (rows*n) 0) (nZw_sz n) (by simp only [W3]; exact Jy _) (Κ rows) else if x.all finiteWord then layernormStable rows n eps x g b else #[] else mB (rows*n) 0 lemma V3L3 (e n:ℕ) (h:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (k:W=nWF2 (g,b)) (m:0 < n) (B:e*n < 2^(32:ℕ)) (q:0 < rationalWord h) (H : ∀ i,i < e*n → expOf x[i]! ≠ 255) (F : ∀ j,j < n → expOf g[j]! ≠ 255) (D : ∀ j,j < n → expOf b[j]! ≠ 255) (sx:x.size=e*n) (sg:g.size=n) (d:b.size=n) : Yw3 e n h x g b W k=layernormStable e n h x g b:=by rw [Yw3]; dsimp only; rw [AT ⟨sx,sg,d,Z0 B⟩] by_cases c:(4 ≤ n&&n ≤ 2048&&expOf h != 0&&expOf h != 255)=true · rw [AD c] have G:=nWF_sp g; have r:=nWF_sp b have y:W.1=nWF g:=by rw [k]; rfl have A:W.2.1=(nWF b).1:=by rw [k]; rfl rw [← y] at G; rw [← A] at r have hG:=λt (a:t < n)=>G.2.1 t (by rw [sg]; exact a) have l:=λt (a:t < n)=>r.2.1 t (by rw [d]; exact a) have p:=λt (a:t < n)=>G.2.2.2 t (by rw [sg]; exact a) split · rename_i z; subst z have Y:=V3Lo 1 n h x g b m B q H F D rw [Yr,AD Nat.zero_lt_one,Κ,Yr,AC (K4 1)] at Y refine Eq.trans (nRow_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (by simp only [W3]; exact B) (by rw [ϳ,Κ]; intro j v; exact H j (by rw [n4]; exact v)) q hG l p c) ?_ simp only [ϳ,Κ] at Y ⊢; exact Y · split · rename_i s exact (cRowsK_eq _ _ s _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (λu:ἆ=>u.toInt64.toFloat) (kO0 h),rfl⟩ _ _ _ _ sg.ge d.ge _ _ _ _ _ _ H q hG l p c F D (cbG_sp b n d) _ 0 _ _ _ _ _ (by simp only [W3])).trans (V3Lo e n h x g b m B q H F D) · exact (cRows_eq _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ H q hG l p c F D (cbG_sp b n d) _ 0 _ _ _ _ _ (by simp only [W3])).trans (V3Lo e n h x g b m B q H F D) · rw [AC c] have X:x.all finiteWord=true:=np.mpr (λi hi=>by have t:=H i (sx ▸ hi); rw [AB x i hi] at t; simp only [finiteWord,AM,Ak]; exact t) rw [AD X] lemma V3L3_bad (e n:ℕ) (h:Word) (x g b:Ἂ Word) (W:(ἀ×ByteArray)×ἀ×Ἆ) (d:W=nWF2 (g,b)) (m:0 < n) (B:e*n < 2^(32:ℕ)) (sx:x.size=e*n) (sg:g.size=n) (l:b.size=n) (hX:x.all finiteWord=false):Yw3 e n h x g b W d = #[]:=by obtain ⟨j,j2,k⟩ : ∃ 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 (λ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 ж rw [Yw3]; dsimp only; rw [AT ⟨sx,sg,l,Z0 B⟩]; split · have G:=nWF_sp g; have o:=nWF_sp b have q:W.1=nWF g:=by rw [d]; rfl have s:W.2.1=(nWF b).1:=by rw [d]; rfl rw [← q] at G; rw [← s] at o split · rename_i r; subst r; exact nRow_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j щ щ k · split · rename_i p exact cRowsK_bad _ _ p _ _ _ _ _ _ _ _ _ _ _ _ _ ⟨rfl,rfl,rfl,congrArg (λu:ἆ=>u.toInt64.toFloat) (kO0 h),rfl⟩ _ _ _ _ sg.ge l.ge _ _ _ _ _ _ m (λt a=>G.2.1 t (by rw [sg]; exact a)) (λt a=>o.2.1 t (by rw [l]; exact a)) (λt a=>G.2.2.2 t (by rw [sg]; exact a)) _ 0 _ _ _ _ _ j щ j2 k · exact cRows_bad _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ m _ 0 _ _ _ _ _ j щ j2 k · simp only [hX,υ, ↓reduceIte] def bnC (rows n:ℕ) (eps:Word) (x g b:Ἂ Word):Ἂ Word := if rows > 0∧n > 0∧x.size=rows*n∧g.size=n∧b.size=n∧rows*n ≤ 4294967295 then let W:=nWG2 g b if (W.2.2&&finiteWord eps&&(!signOf eps&&Core.mW eps != 0))=true then let r:=Yw3 rows n eps x g b W (nWG2_v g b) if (r.size==rows*n)=true then r else layernormSpec rows n eps x g b else layernormSpec rows n eps x g b else layernormSpec rows n eps x g b lemma bnC_eq:bnC=layernormSpec:=by funext l n m x g b unfold bnC; split · rename_i h; obtain ⟨l0,n0,sx,sg,q,B⟩:=h; dsimp only; split · rename_i i have e:(nWG2 g b).2.2=(g.all finiteWord&&b.all finiteWord):=by rw [nWG2_v]; rfl rw [e] at i by_cases hX:x.all finiteWord=true · have E:Yw3 l n m x g b (nWG2 g b) (nWG2_v g b)=layernormSpec l n m x g b:=by have h:(SN l n m x g&&b.size==n&&b.all finiteWord)=true:=by simp only [Η] at i rw [SN]; simp only [Η,AQ,AJ] exact ⟨⟨⟨⟨⟨⟨⟨⟨⟨l0,n0⟩,sx⟩,sg⟩,hX⟩,i.1.1.1⟩,i.1.2⟩,i.2⟩,q⟩,i.1.1.2⟩ have k:=h; simp only [SN,Η,AQ] at k; rw [fG] at h; rw [layernormSpec,layernormWith,AD h]; simp only [Η] at h obtain ⟨a,e,c,d⟩:=jm h.1.1; have o:b.size=n:=by simpa using h.1.2 exact V3L3 l n m x g b _ _ a щ e c d (λj p=>Norm.NR.ic b (by simpa [np] using h.2) j (by exact N4 p (id (Eq.symm o)))) k.1.1.1.1.1.1.1.2 k.1.1.1.1.1.1.2 o rw [E]; simp only [ite_self] · have Z:=V3L3_bad l n m x g b _ (nWG2_v g b) n0 (by omega) sx sg q (O8.mpr hX) have N:¬((#[]:Ἂ Word).size==l*n)=true:=by simp only [Za,AQ]; exact K7 (Ϯ l0 n0) rw [Z,AC N] · rfl · rfl end NXc def kernels:Kernels:= { W5 with dense:=⟨Dense.c7,gPd⟩ conv:=⟨cvK,dwK,W5.conv.convTranspose⟩ elem:=⟨apK,mpK,Bn.cq,Bn.br⟩ rnn:=⟨Rnn.lstmK Dense.c7 SAct.sg SAct.th,Rnn.gruK Dense.c7 SAct.sg SAct.th⟩ norm:=⟨NX.rms,NXc.bnC⟩ } lemma dwK_eq:dwK=R5:=by funext s relu inp wts b;unfold dwK;split ·rename_i h;rw[Η]at h;rw[Conv.cY,dwB s h.1] ·split ·rename_i h;simp only[Η]at h exact K1.runD_eq s relu inp wts b _ (by simp only[W5,L6];rfl) h.1 ·simp only[W5,L6];rfl lemma apK_eq:apK=Jp:=by funext s inp;unfold apK;split ·rename_i h;rw[Conv.eV,apB s h] ·simp only[W5,L6];rfl lemma mpK_eq:mpK=Jq:=by funext s inp;unfold mpK;split ·rename_i h;rw[Conv.fo,mpB s h] ·simp only[W5,Hi] theorem correct:Obligation kernels:=by have h:=Pinned.correct simp only[Obligation,W5]at h simp only[Obligation,kernels,W5,Dense.eD,gPdv,cvK_eq,dwK_eq,apK_eq,mpK_eq,Bn.dT,Bn.cO,NX.rms_eq,NXc.bnC_eq, SAct.sg_eq,SAct.th_eq,L6,Rnn.lstmK_spec,Rnn.gruK_spec] rw[←h] simp only[L6,Hi] all_goals rfl end Submission