import ContractExact namespace Submission open ExactRuntime FloatLib.Floats.Formats.BinaryInterchange FloatLib.Floats open USize renaming lt_iff_toNat_lt→γ,le_size→ς,toNat_lt_size→Τ,size_eq_two_pow→Ϟ,toNat_zero→Ϥ,le_refl→Ϭ open Nat renaming and_two_pow_sub_one_eq_mod→θ,shiftRight_eq_div_pow→ι,mod_eq_of_lt→ξ,pow_le_pow_right→Ε,mul_le_mul_right→Ζ,shiftLeft_eq→Μ,succ_mul→ϋ,two_pow_add_eq_or_of_lt→ϓ,add_comm→ϔ,and_le_right→ϙ,toUSize_eq→ϛ,div_eq_of_lt→ϣ,add_sub_cancel_left→ϥ,le_log2→Ϧ,mul_comm→ϩ,add_zero→Ϫ,one_shiftLeft→ϭ,mul_one→ϱ,div_lt_of_lt_mul→ϲ,mod_lt→ϳ,add_mul_mod_self_right→ϵ,lt_log2_self→Ϸ open UInt64 renaming le_iff_toNat_le→κ,toNat_add→μ,lt_iff_toNat_lt→ν,toNat_sub_of_le→χ,toNat_and→ψ,toNat_shiftRight→Α,toNat_inj→Β,toNat_shiftLeft→Ι,toNat_sub→Κ,toNat_ofNat_of_lt'→Ξ,toNat_mul→Ϛ,toNat_toUInt32→ϟ,toNat_zero→Ϯ open Bool renaming false_eq_true→ο,and_eq_true→υ,eq_iff_iff→ϻ open UInt32 renaming toNat_inj→Η,toNat_and→Λ,toNat_shiftRight→Ρ,toNat_toUInt64→Χ,lt_iff_toNat_lt→ϖ open Model renaming toModel_ofFloatModel→Θ,isFinite_roundDyadic_of_isIEEE_of_abs_toReal_le_posMaxFinite→Υ,toReal_eq_unpackedToReal_toModel→ό,toDyadic?_ofFields_of_isFinite→ϒ,toReal_roundDyadic_eq_roundAt→ϗ,toDyadic?_isSome_eq_isFinite→Ϝ,abs_signed_mul_bpow_le_toReal_posMaxFinite→Ϡ,ofFloatModel_pack→Ϣ,toDyadic?_ieee_eq_model→ϧ,roundDyadicGeneral_eq_roundDyadic→ϰ,roundedMantissa_shift_quotient→Ϻ open Finset renaming mem_range→Ν,sum_congr→Ο,sum_le_sum→Ϗ,sum_Ico_succ_top→ϐ,sum_range_succ→ϝ,sum_nonneg→ϡ,sum_add_distrib→ϫ,card_range→ϯ,sum_mul→϶,sum_le_sum_of_subset_of_nonneg→ϸ,abs_sum_le_sum_abs→Ϲ open Real renaming sqrt_nonneg→ϊ open Float.Model.UnpackedFloat renaming unpackExponent_packComponents→ύ,unpackMantissa_packComponents→ώ open Array renaming size_uset→ϑ,getElem_ofFn→Ϩ,size_replicate→ϴ open Int renaming cast_abs→ϕ open FloatLib.Numerics.Dyadic renaming cast_toRat→Ϙ local notation "А" => by omega local notation "Б" => by decide local notation "В" => by positivity local notation "Г" => by norm_num local notation "Д" => UInt64 local notation "Е" => UInt32 local postfix:max "а"=>UInt64.toNat local postfix:max "б"=>USize.toNat local postfix:max "в"=>Array.size local postfix:max "г"=>Nat.toUSize local postfix:max "д"=>FloatArray.size local postfix:max "е"=>UInt32.toNat local postfix:max "ж"=>Nat.toUInt64 local postfix:max "з"=>Nat.log2 local postfix:max "и"=>Fin.val local postfix:max "й"=>Int.toNat local postfix:max "к"=>UInt32.toUInt64 local postfix:max "л"=>UInt64.toUInt32 local postfix:max "м"=>Int.natAbs local postfix:max "н"=>Int64.toInt open UInt64 renaming reduceToNat→iZ,toNat→jI,size→jT,toNat_or→kp,toUInt32→kr,toNat_one→kW,toNat_toBitVec→ll,ofNat→lP open Finset renaming range→i0,Ico→jr,sum_range_succ'→jY,sum_sub_distrib→j9,sum_const→kg,sum_Ico_eq_sum_range→kz,mul_sum→kJ open FloatLib.Floats.Formats.BinaryInterchange.FloatFormat renaming binary64→i5 open FloatLib.Floats.Formats.BinaryInterchange.Model renaming ofFloatModel→i6,roundDyadic→i8,unpackedToReal→jp,toReal→jJ,toReal_eq→jK,roundDyadic_of_representable→jO,roundAt_mono→jP,unpackedToDyadic?→jU,isFinite→jW,unpackSign_packComponents→kb,roundAt→kh,toModel→ki,toReal_add_eq_roundAt→kx,posMaxFinite→kG,pow2_eq_two_pow→ln,ofUInt32→ls,ofFloat32Model→ly,add→lB,ofModel→lH,modelSignBit→lL open ExactRuntime renaming expOf→i7,Word→i9,idxOf→je,rowVariance→jg,stableNormDomain→ji,sqrtRational→jk,rowMean→jo,signOf→jw,mantOf→jF,toWord→jH,layernormStable→jN,finiteWord→jS,oneW→kf,rmsnormStable→kj,mantOf_lt_24→kw,dotOf→kB,finishWord→kC,isFinite_ofUInt32→kM,ofIntDyadic→kN,finishWord_of_ne→kV,Fmt→lr,layernormSpec→lJ,fracOf→lW open Real renaming sqrt→ja,sq_sqrt→lb,le_sqrt_of_sq_le→lq,sqrt_mul→lI,sqrt_sq→lU open Nat renaming reduceMod→jb,toUInt64_eq→jL,testBit_eq_decide_div_mod_eq→jZ,cast_ofNat→j0,zero_add→j6,add_mul_div_right→kc,le_div_iff_mul_le→kd,zero_le→km,add_mul→ko,cast_natAbs→ku,pos_of_ne_zero→kD,and_one_is_mod→kF,lt_of_lt_of_le→kH,cast_zero→kS,log2_self_le→kU,le_mul_of_pos_right→kX,cast_sub→k9,zero_mul→la,and_two_pow→lc,two_pow_pos→ld,cast_nonneg→lj,div_add_mod→lk,log2_lt→lu,pow_lt_pow_right→lz,log2_eq_log_two→lC,mod_le→lK,cast_one→lQ,abs_cast→lS,one_mul→l0 open Float.Model.UnpackedFloat renaming unpack→jc,abs→jm,isFinite→jn,mul→jq,pack→jA,packedInfinity→jG,accuracyOfFraction→jQ,roundWithAccuracy→kR,unpackExponent→lp,packedZero→lD,round→lG,Sign→lR open USize renaming reduceToNat→jd,size→ke,toNat_add→ks,toNat_one→lf,toNat_mul→li open FloatLib.Numerics renaming Dyadic→jf,binaryRadix→jh,shiftRightJam→jx,roundShiftRightEven_shiftRightJam→jV,roundQuotientEven→kQ open UInt32 renaming reduceToNat→jj,toNat_zero→j5 open Float.Model renaming totalExponent→jl,pack→kY,sqrt→lZ,add→l4,mul→l5,sub→l7 open FloatLib.Numerics.Dyadic renaming ofScaledInt→js,toReal→jz,signedSignificand→jC,cast_signedSignificand→kP,toRat_eq_zero_iff→kZ,ofScaledInt_toRat→k8,toRat→lX open Float.Model.Format renaming binary64→jt,binary32→ju open Array renaming ofFn→jv,replicate→jM,all_eq_true→j8,usize→kk,getElem?_eq_getElem→kL,size_set→lA,setIfInBounds→lE,getElem?_ofFn→lF,getElem?_set→lM,ext_getElem?→lN,uset_eq_set→lT,getElem_set→lV,set!→l8,uset→l9 open FloatLib.Numerics.FixedWord renaming roundShiftRightEven→jy open Float.Model.UnpackedFloat.ExtendedMantissa renaming shiftRightOne→jB open FloatArray renaming size→jD,emptyWithCapacity→jE,set!→kt,uget→lh,usize→lY,uset→l6 open FloatLib.Floats.Formats.Flocq renaming bpow→jR open FloatLib.Numerics.RationalBinary renaming scaleByPowerOfTwo→j7 open FloatLib.Floats.ExecFloat.Binary renaming toModel_ofFloat_int64ToFloat→ka open Int renaming ofNat_eq_natCast→kl,toNat_of_nonneg→kv,log→ky,lt_zpow_succ_log_self→kK,abs_eq_natAbs→kO,zpow_log_le_self→lv open FloatLib.Floats.Formats.BinaryInterchange.Model.Reduction.Semantics renaming finiteDot_toList_eq_slice→kA open BitVec renaming toInt_eq_toNat_cond→kE open Float32 renaming ofBits→kI open FloatLib.Floats.Formats.BinaryInterchange.Model.Reduction.Internal renaming dotState_exact_toRat→kT,dotState→lO open Bool renaming or_eq_true→lg open Max renaming max→lm open FloatLib.Floats.Formats.Flocq.bpow renaming pos→lx open Or renaming inr→ma local notation "о"=>Nat local notation "п"=>Int local notation "р"=>Float local notation "с"=>USize local notation "т"=>Word local notation "у"=>Array local notation "ф"=>Bool section open FloatLib.Numerics lemma aD (s:ф) (m:о) (e:п) (j:о) (h:j+25<= mз): i8 lr ⟨s,jx m j,e+j⟩=i8 lr ⟨s,m,e⟩:=by have g:m≠0:=by rintro rfl;simp at h have o:2^mз<= m:=kU g;have u:2^(j+1)<= m:=le_trans (Ε Г А) o;have d:(jx m j)з=mз-j:=log2_shiftRightJam m j have t:jx m j≠0:= shiftRightJam_ne_zero m j (le_trans (Ε Г А) u) rw[<- ϰ,<- ϰ];unfold Model.roundDyadicGeneral;simp only[t,g,beq_iff_eq,ite_false,d];have q:((mз-j:о):п)+(e+j)=(mз:п)+e:=А;rw[q];have r:Fmt.fracWidth=23:=rfl;have p:Fmt.minSubnormalExponent=-149:=rfl;have l:Fmt.minNormalExponent=-126:=rfl;rw[r,p,l];split_ifs with h1 h2 h3 h4<;>try omega .rfl .congr 1 obtain ⟨a,v⟩:∃a:о,e- -149=Int.negSucc a:=⟨(-(e+149)-1)й,by omega⟩ have w:e+j- -149=Int.negSucc (a-j):=А;rw[v,w];dsimp only;rw[show a-j+1=(a+1)-j by omega] exact jV m j (a+1) А .congr 1 rw[show mз-j-23=(mз-23)-j by omega] exact jV m j _ А end lemma ae (n:о) (f:о-> Е) (k:о) (d:kf iи)[k]! =f k:=by rw[getElem!_pos _ k (by simpa using d),Ϩ] namespace Core def tm (a b:т):п:=sv a*sv b*2^(idxOf a+idxOf b) def ah (n:о) (fa fb:о-> т):п:=∑k∈Finset.range n,tm (fa k) (fb k) def am (n:о) (fa fb:о-> т):Prop:=∀k,k expOf (fa k)≠255/\expOf (fb k)≠255 lemma aE (n:о) (d e:о-> i9): ah (n+1) d e=ah n d e+tm (d n) (e n):=ϝ _ _ lemma aU (n:о) (m o:о-> i9) (l:am n m o): kB n m o=kC (ah n m o) (-298) (decide (n≠0)&& dallNZ (jv (n:=n) λi=>m iи) (jv (n:=n) λi=>o iи) 0 n):=by unfold kB dotSpec;set A:=jv (n:=n) λi=>m iи set B:=jv (n:=n) λi=>o iи set L:=A.map (ls (fmt:=lr));set R:=B.map (ls (fmt:=lr));have j:Lв=Rв:=by simp[L,R,A,B] have e:∀k (h:kby simp[L,A,kM] at h⊢;exact (l k h).1 have g:∀k (h:kby simp[R,B,kM] at h⊢;exact (l k h).2 have p:∀k,0<= k-> k<0+Lв-> i7 A[k]!≠255/\i7 B[k]!≠255:=λk _ h=>by simp[L,A] at h;simp only[A,B,ae n _ k h];exact l k h have v:∀i c,dsum A B i c=∑k∈i0 c,tm A[i+k]! B[i+k]!:=λi c=>by induction c generalizing i with | zero=>simp[dsum] | succ c w=> rw[dsum,w (i+1),jY,add_comm];exact congrArg₂ _ (Ο rfl λk _=>by rw[show i+1+k=i+(k+1) by omega]) rfl have d:=(finiteDotSlice_eq A B 0 Lв (by simp[L]) (by simp[j,R]) p).trans (c:=(ah n m o:ℚ)*2^(-298:ℤ)) (by simp only[v,ah,L,A,B,Array.size_map,Array.size_ofFn];congr 2;exact Ο rfl λk p=>by simp at p;simp[ae n _ k p]) have r:=kT (destination:=lr) L R j rw[<- Model.Reduction.map_value_dot] by_cases q:ah n m o=0 .have hz0:(Model.Reduction.Internal.dotState L R j:Model.Reduction.Internal.State lr).exact.significand=0:=by rw[<- kZ,r,d,q];simp rw[Model.Reduction.dot_status_eq_zero_of_finite lr L R .nearest j e g hz0,q,finishWord_zero] unfold lO obtain ⟨t,u⟩:=dotStateLoop_flags A B {} 0 Lв (by simp[L]) (by simp[j,R]) p simp only[Except.map];rw[t,u];simp[L,A] .have hnz:Model.Reduction.Semantics.finiteDot L.toList R.toList≠.ok 0:=by rw[kA L R j];intro h;injection h with h;rw[d] at h;simp at h;exact q h rw[Model.Reduction.dot_status_eq_round_of_finite_nonzero lr L R .nearest j e g hnz] simp only[Except.map] exact (kV _ (ah n m o) (-298) _ q (by rw[r,d])).symm lemma a9 (n:о) (d e:о-> i9) (g:am n d e) (h:ah n d e≠0): kB n d e=kC (ah n d e) (-298) false:=by simp[aU n d e g,kC,h] @[inline] def dq (w:Е):Д:=if (w>>>23)&&&0xFF!=0 then 1 else 0 @[inline] def mW (w:Е):Д:=(w&&&0x7FFFFF)к ||| (dq w<<<23) @[inline] def iW (w:Е):Д:=((w>>>23)&&&0xFF)к-dq w def bi (x:Д):п:=x.toBitVec.toInt lemma aN (w:Е):(mW w)а=jF w:=by have e:(w&&&0x7FFFFF)е<2^23:=by rw[Λ];exact lt_of_le_of_lt ϙ Б unfold mW dq jF i7 lW;by_cases d:(w>>>23)&&&0xFF=0 .simp[d] .simp only[show ((w>>>23)&&&0xFF!=0)=true by simpa using d,d,ite_true,ite_false] rw[kp,Χ,show ((1:Д)<<<23)а=2^23*1 from rfl,Nat.or_comm, <- ϓ e,ϱ,ϔ] lemma bf (w:Е):(iW w)а=je w:=by unfold iW dq je i7;have g:=expOf_toNat_lt w;unfold i7 at g;by_cases e:(w>>>23)&&&0xFF=0 .simp[e] .have d:1<=((w>>>23)&&&0xFF)е:= Nat.one_le_iff_ne_zero.2 λh=>e (Η.mp (by simpa using h)) simp only[show ((w>>>23)&&&0xFF!=0)=true by simpa using e,e,ite_true,ite_false] rw[χ _ _ (κ.mpr (by rw[Χ];simpa using d)), Χ] rfl lemma aP (w:Е):jw w=true↔2^31<= wе:=by have:=w.toNat_lt rw[jw,bne_iff_ne,ne_eq,<- Η,Λ,show (0x80000000:Е)е=2^31 from rfl, lc,jZ] by_cases h:wе/2^31%2=1<;>simp[h]<;>omega @[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 an (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 @[inline] def cq (value shift:Д):Д:= let quotient:=value>>>shift let remainder:=value&&&((1<<half then 1 else 0) @[inline] def aJ (value shift:Д):Д:= if shift==0 then value else if shift<64 then cq value shift else if shift==64 then (if value>0x8000000000000000 then 1 else 0) else 0 @[inline] def cd (sign:ф) (e f:Е):Е:= (if sign then (0x80000000:Е) else 0) ||| ((e&&&0xff)<<<23) ||| (f&&&0x007fffff) @[inline] def cj (n:Д):Е:= (if n<0x800000 then 0 else n-0x800000)л @[inline] def aC (sign:ф) (product scale:Д):Е:= if product==0 then if sign then 0x80000000 else 0 else let leading:=an product let position:=leading+scale if position<172 then let fraction:= if scale<149 then aJ product (149-scale) else product<<<(scale-149) if fraction==0 then (if sign then 0x80000000 else 0) else if fraction==0x800000 then cd sign 1 0 else cd sign 0 fractionл else let roundedMantissa:= if leading<23 then product<<<(23-leading) else aJ product (leading-23) let carry:=roundedMantissa==0x1000000 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 0x800000 else roundedMantissa cd sign (normalizedPosition-171)л (cj normalizedMantissa) open Model.NativeBinary32 in lemma cn (n k:о) (h:n>>>k≠0):nз=k+(n>>>k)з:=by rw[ι] at* have:=(Ϧ (by rintro rfl;simp at h)).2 (Nat.div_pos_iff.1 (kD h)).2 rw[lC,lC,Nat.log_div_base_pow] at*;omega lemma bs (e r x k:Д) (o:kа<=32) (l:0simp[h,lu,e.toNat_lt] have g:kа%64=kа:=ξ А;unfold sx sr;by_cases j:x>>>k=0<;>simp[j,g,d] .simpa[g,ι,Nat.div_eq_zero_iff] using congrArg jI j have:=cn xа kа (by simpa[<- Β,g] using j) refine ⟨by omega,?_⟩ rw[ι];exact ϲ (by rwa[<- Nat.pow_add,show kа+kа=2*kа by omega]) lemma aG (x:Д):an x=x.log2:=by apply Β.mp;obtain ⟨o,e⟩:=bs x 0 x 32 Б Б (by simp) x.toNat_lt obtain ⟨p,g⟩:=bs x _ _ 16 Б Б o e;obtain ⟨q,h⟩:=bs x _ _ 8 Б Б p g;obtain ⟨r,j⟩:=bs x _ _ 4 Б Б q h;obtain ⟨t,l⟩:=bs x _ _ 2 Б Б r j;obtain ⟨d,m⟩:=bs x _ _ 1 Б Б t l;rw[Nat.log2_def (sx 1 _)а,if_neg (by simpa using m)] at d unfold an;exact d.symm lemma cF (e d:Д): aJ e d=jy e dа:=by unfold aJ jy;by_cases g:d=0 .subst g;rfl have:=d.toNat_lt;have h:dа≠0:=by simpa[<- Β] using g simp only[g,h,beq_iff_eq,UInt64.ofNat_toNat,ν,↓reduceIte, show lP (dа-1)=d-1 from Β.mp (by simp[Κ];omega), show d=64↔dа=64 by rw[<- Β];rfl] refine ite_congr rfl (λj=>?_) λ_=>rfl have:(e&&&((1<<simp[κ, ξ j,ϭ,ξ (by omega:2^d.toNat<18446744073709551616),Nat.one_le_two_pow] exact (ϳ _ (ld _)).trans_le l have:((e>>>d)&&&1)а<=1:=by simp[ψ];omega have:=(e>>>d).toNat_lt simp only[cq,gt_iff_lt,ν,μ,beq_iff_eq,<- Β, apply_ite jI,kW,iZ] generalize (e&&&((1<<>>d)&&&1)а=b at* split_ifs<;>omega lemma bQ (n:Д):cj n=UInt32.ofNat (nа-0x800000):=by unfold cj;split<;>simp_all[kr,Nat.toUInt32,ν,χ,κ,Nat.sub_eq_zero_of_le,le_of_lt] open Model.NativeBinary32 in lemma bH (w:Е):jH (ofUInt32 w)=w:=by conv_rhs=>rw[<- toUInt32_ofUInt32 w] exact Η.mp (ξ (BitVec.isLt _)) open Model.NativeBinary32 in lemma ax (e:ф) (m d:Д) (g:dа<=506): aC e m d=jH (i8 lr ⟨e,mа,(dа:п)-298⟩):=by erw[<- ofUInt32_roundDyadic,bH,<- roundProduct_eq_roundDyadic _ _ _ g];unfold aC roundProduct cd mkBits;simp only[aG,cF,bQ,kr,Nat.toUInt32,FloatLib.Numerics.FixedWord.log2Word_eq_log2];rfl def az (hi lo:Д):п:=bi hi*2^64+loа @[inline] def bK (hi lo:Д):Д:=if hi>>>63!=0 then (0:Д)-lo else lo @[inline] def bJ (hi lo:Д):Д:= if hi>>>63!=0 then (if lo==0 then (0:Д)-hi else ~~~hi) else hi lemma ce (d:Д):(d>>>63!=0)=decide (2^63<= dа):=by have:=d.toNat_lt;rw[ϻ];simp[<- Β,ι] lemma a8 (d e:Д): az d e=(dа*2^64+eа:п)-(if 2^63<= dа then 2^128 else 0):=by unfold az bi;rw[kE,ll];omega lemma cT (d e:Д): (az d e)м=(bJ d e)а*2^64+(bK d e)а /\ decide (az d e<0)=(d>>>63!=0):=by have:=d.toNat_lt;have:=e.toNat_lt;unfold bJ bK;rw[a8,ce];by_cases g:2^63<= dа<;>simp only[g,decide_true,decide_false,ite_true,ite_false,ο] .split<;>simp_all[jT,UInt64.toNat_not,<- Β]<;>omega .simp;omega @[inline] def bm (hi lo B:Д):Д:= if hi==0&&lo==0 then 0x100000000 else if B>442 then 0x100000000 else let neg:=hi>>>63!=0 let mlo:=bK hi lo let mhi:=bJ hi lo if mhi==0 then (aC neg mlo B)к else if mhi>>>32==0 then let q:=(mhi<<<32)+(mlo>>>32) (aC neg (if mlo&&&0xFFFFFFFF==0 then q else q ||| 1) (B+32))к else (aC neg (if mlo==0 then mhi else mhi ||| 1) (B+64))к lemma bl (n:о) (m o:о-> i9) (e g B:Д) (q:am n m o) (j:ah n m o=az e g*2^Bа) (h:bm e g B<0x100000000):kB n m o=(bm e g B)л:=by obtain ⟨r,t⟩:=cT e g;have:=g.toNat_lt;have:=e.toNat_lt;simp only[bm] at h⊢;have w:¬(e==0&&g==0)=true:=λc=>by simp[c] at h have u:¬B>442:=λc=>by simp[c] at h simp only[w,u,ο,↓reduceIte];clear h have v:ah n m o≠0:=by rw[j];refine mul_ne_zero (λp=>w ?_) В rw[a8] at p;simp only[υ,beq_iff_eq,<- Β,Ϯ];split at p<;>omega rw[a9 n m o q v,kV (kN (az e g) ((Bа:п)-298)) _ _ _ v (by rw[toRat_ofIntDyadic,j];push_cast;rw[zpow_sub₀ two_ne_zero,zpow_natCast];field_simp),kN,t,r] symm;simp only[apply_ite kr,UInt32.toUInt32_toUInt64];generalize bJ e g=l at* generalize bK e g=d at* have:=d.toNat_lt;simp only[ν,gt_iff_lt,iZ,not_lt] at u;split<;>rename_i p<;>simp only[beq_iff_eq,<- Β,Ϯ] at p .simp[p,ax _ _ B А] split<;>rename_i z<;>simp[<- Β,ι] at z .rw[ax _ _ _ (by simp[μ];omega),<- aD _ (lа*2^64+dа) _ 32 ((Ϧ А).2 А)] congr 3 swap;. simp[μ];omega have x:(lа*2^64+dа)/2^32=(l<<<32+d>>>32)а:=by simp[Μ,ι];omega have y:(lа*2^64+dа)%2^32=(d&&&4294967295)а:=by rw[ψ,show (4294967295:Д)а=2^32-1 from rfl,θ];omega simp only[jx,iZ,x,y,apply_ite jI,kp,beq_iff_eq, <- Β] .rw[ax _ _ _ (by simp[μ];omega),<- aD _ (lа*2^64+dа) _ 64 ((Ϧ А).2 А)] congr 3 swap;. simp[μ];omega simp only[jx,iZ,show (lа*2^64+dа)/2^64=lа by omega,show (lа*2^64+dа)%2^64=dа by omega,apply_ite jI,kp,beq_iff_eq, <- Β] @[inline] def aj (N:Д):Д:=(N+(0x3FFFFFFFFF:Д)+((N>>>39)&&&1))>>>39 lemma dL (n:ф) (e f:Е): (cd n e f)е=(if n then 2^31 else 0)+eе%2^8*2^23+fе%2^23:=by have d:=ϳ fе (ld 23);have:=ϳ eе (ld 8) have g:((e&&&0xff)<<<23 ||| (f&&&0x007fffff))е=2^23*(eе%2^8)+fе%2^23:=by rw[UInt32.toNat_or,UInt32.toNat_shiftLeft,Λ,Λ,show (0xff:Е)е=2^8-1 from rfl, show (0x007fffff:Е)е=2^23-1 from rfl,θ, θ,show (23:Е)е%32=23 from rfl,Μ,ϩ,ξ (by simp;omega), <- ϓ d] unfold cd;rw[UInt32.or_assoc];cases n<;>simp only[ο,↓reduceIte,UInt32.zero_or,UInt32.toNat_or,g] .omega .rw[show (0x80000000:Е)е=2^31*1 from rfl,<- ϓ А];omega lemma bT (n:ф) (N g:Д) (l:2^62<= Nа) (m:Nа<2^63) (t:110<= gа) (j:gа<363): (aC n N g)е=(if n then 2^31 else 0)+((gа-110)*2^23+(aj N)а) /\ 2^23<=(aj N)а/\(aj N)а<=2^24:=by have o:(N>>>39)а=Nа/2^39:=by simp[ι] have e:((N>>>39)&&&1)а=Nа/2^39%2:=by simp[o,kF] have r:(aj N)а=Nа/2^39+if 2^38omega have h:2^23<= Nа/2^39/\Nа/2^39<2^24:=by clear*-l m;omega have d:(aJ N (62-23))а=(aj N)а/\2^23<=(aj N)а/\(aj N)а<=2^24:=by have p:(N&&&0x7FFFFFFFFF)а=Nа%2^39:=by rw[ψ];exact θ _ 39 rw[r];show (cq N 39)а=_/\_;unfold cq simp only[show ((1:Д)<<<39)-1=0x7FFFFFFFFF from rfl,show (1:Д)<<<(39-1)=0x4000000000 from rfl,gt_iff_lt,ν,μ,p,e,o,apply_ite jI,iZ] clear*-h;split_ifs<;>omega refine ⟨?_,d.2⟩;unfold aC simp only[show an N=62 by rw[aG,<- Β];exact (Nat.log2_eq_iff (by omega:N.toNat≠0)).2 ⟨l,m⟩, show (N==0)=false by simp[<- Β];omega,show ¬62+g<172 by simp[ν];omega, show ¬(62:Д)<23 by decide,ite_false,ο] obtain ⟨d,e⟩:=d;generalize aJ N (62-23)=R at d⊢;rw[<- d] at e⊢;clear*-e t j;by_cases q:Rа=16777216<;>simp[q,<- Β,bQ,ν]<;>split<;>(try omega)<;>simp[dL,UInt32.toNat_sub,UInt32.toNat_add]<;>omega lemma cD (n:ф) (M σ:Д) (e:Mа≠0) (d:σа<=506): aC n M σ=kC ((if n then-(Mа:п) else Mа)*2^σа) (-298) false:=by rw[ax _ _ _ d];refine (kV _ _ _ _ (mul_ne_zero (by split<;>omega) В) ?_).symm cases n<;>simp[lX,jC,zpow_sub₀]<;>field_simp end Core open Core namespace Dense lemma al {k n:с} (h:ksplit<;>push_cast<;>omega @[inline] def aS (x:Е):Е:=x&&&0x7FFFFFFF lemma aR (x:Е):(aS x)е=xе%2^31:=by unfold aS;rw[Λ];exact θ _ 31 lemma be (x:Е):(i7 x)е=(aS x)е/2^23:=by have:(i7 x)е=xе/2^23%2^8:=by unfold i7;rw[Λ,Ρ];simp only[jj,jb,ι];exact θ _ 8 rw[this,aR,show 2^31=2^23*2^8 by norm_num,Nat.mod_mul_right_div_self] lemma cM (x:Е):i7 x=0↔(aS x)е<2^23:=by rw[<- Η,be];simp;try omega lemma gI (x:Е):je x=(aS x)е/2^23-1:=by have:=be x;unfold je;split<;>rename_i h .have:=(cM x).mp h;omega .have:=mt (cM x).mpr h;omega lemma br (x:Е):je x=(i7 x)е-1:=by rw[gI,be] lemma gT (w:Е):wе/2^23=(i7 w)е+256*(wе/2^31):=by rw[be,aR];have:=w.toNat_lt;omega lemma bO (x:Е):(i7 x)е<256:=by rw[be,aR];omega lemma gG (w:Е):(w&&&0x7FFFFF)е=wе%2^23:=by rw[Λ];exact θ _ 23 lemma bV (w:Е): |sv w| <2^24:=by have:=kw w;unfold sv;split<;>simp<;>omega lemma ay {k:с} {a:у Е} (h:k>>1>>>(63-s))+(if l'simp only[iZ]<;>omega @[specialize] def go (fa fb:о-> т) (n t:о) (B:Д):Д:= if t т) (n:о) (B:Д) (t:о) (pH pL nH nL:Д):Д:= if tsplit<;>push_cast<;>omega lemma cZ (d g:о-> i9) (n:о) (B:Д) (hn:n<2^18): ∀k t (v w r u:Д),n-t=k-> t<= n-> am t d g -> vа*2^64+wа<= t*2^108-> rа*2^64+uа<= t*2^108 -> ah t d g=(((vа*2^64+wа:о):п)-((rа*2^64+uа:о):п))* 2^Bа -> bX d g n B t v w r u<0x100000000-> kB n d g=(bX d g n B t v w r u)л:=by intro k;induction k<;>intro t v w r u hk ht Z K J M j .obtain rfl:t=n:=А rw[bX,if_neg А] at j⊢;exact bl _ _ _ _ _ _ Z (by rw[M,iY _ _ _ _ А А]) j rename_i k Y;have W:t(Nat.lt_succ_iff_lt_or_eq.mp E).elim (Z s) λe=>e ▸ ⟨G,I⟩ have o:jF (d t)*jF (g t)<2^48:= (Nat.mul_lt_mul'' (kw _) (kw _)).trans_eq Г have S:(mW (d t)*mW (g t))а=jF (d t)*jF (g t):=by rw[Ϛ,aN,aN,ξ (o.trans Г)] have D:=aE t d g;have m:=Ζ (2^108) t.le_succ;split at j .rename_i F rw[if_pos F];have N:jF (d t)*jF (g t)=0:=by rw[<- S,beq_iff_eq.mp F];rfl refine Y (t+1) v w r u y z x (K.trans m) (J.trans m) ?_ j;rw[D,M,add_eq_left];unfold tm sv;rcases Nat.mul_eq_zero.mp N with h | h<;>simp[h] rename_i F;rw[if_neg F];obtain ⟨hB,O⟩:=hw λh=>F (by simp[h]) have a0:=idxOf_le _ G;have a1:=idxOf_le _ I have Q:(iW (d t)+iW (g t))а=je (d t)+je (g t):=by rw[μ,bf,bf,ξ А] rw[Q] at hB have E:(iW (d t)+iW (g t)-B)а=je (d t)+je (g t)-Bа:=by rw[χ _ _ (by rw[κ,Q];omega),Q] rw[E] at O have V:(2:п)^(je (d t)+je (g t))=2^(je (d t)+je (g t)-Bа)*2^Bа:=by rw[<- pow_add];congr 1;omega generalize l:(jF (d t)*jF (g t))*2^(je (d t)+je (g t)-Bа)=T have p:T<=2^108:= l ▸ (Nat.mul_le_mul o.le (Ε Г (by omega:_<=60))).trans_eq Г have A:tm (d t) (g t)=(if jw (d t)==jw (g t) then (T:п) else-T)*2^Bа:=by rw[<- l];unfold tm sv;rw[V];cases jw (d t)<;>cases jw (g t)<;>simp<;>ring have U:=λH L (as:Hа*2^64+Lа<= t*2^108)=>cY H L _ _ (by rw[E];omega) (by rw[S,E,l];omega) rw[S,E,l] at U;cases hg:(jw (d t)==jw (g t))<;>simp only[hg,ite_true,ite_false,ο] at A j⊢ .have q:=U r u J refine Y (t+1) v w _ _ y z x (K.trans m) (by rw[q];exact ϋ t _ ▸ Nat.add_le_add J p) ?_ j rw[D,M,q,A];push_cast;ring .have q:=U v w K refine Y (t+1) _ _ r u y z x (by rw[q];exact ϋ t _ ▸ Nat.add_le_add K p) (J.trans m) ?_ j rw[D,M,q,A];push_cast;ring @[inline] def eW (n:о) (fa fb:о-> т):т:= let r:=if n<262144 then bX fa fb n (go fa fb n 0 1023) 0 0 0 0 0 else 0x100000000 if r<0x100000000 then rл else dotOf n fa fb lemma cJ (n:о) (d e:о-> i9):eW n d e=kB n d e:=by unfold eW;dsimp only;by_cases g:n<262144 .rw[if_pos g];split .exact (cZ d e n _ А _ 0 0 0 0 0 rfl А (λ_ h=>absurd h А) (by simp) (by simp) (by simp[ah]) ‹_›).symm .rfl .rw[if_neg g,if_neg Б] @[noinline] def ap (n:о) (relu:ф) (X W b:@& у т) (xo s j:о):т:= act relu (eW (n+1) (λt=>if tif trfl lemma dU (x y:р) (d:fv x) (e:fv y): i6 (x+y).toModel=lB (i6 x.toModel) (i6 y.toModel):=by change i6 (l4 x.toModel y.toModel)=_;rw[l4,Ϣ] have h:=Model.add_eq_ofModel_add_of_isFinite (fmt:=i5) Б (i6 x.toModel) (i6 y.toModel) (by rw[Θ];exact (bB x).1 d) (by rw[Θ];exact (bB y).1 e) rw[Θ,Θ] at h;exact h.symm lemma pm (E:п) (e:E<=971):(2:ℝ)^E<= jJ (kG i5):=by have d:FloatFormat.binary64.maxNormalExponent-Int.ofNat FloatFormat.binary64.fracWidth=971:=Б have h:=Ϡ i5 false 1 E Б (by rw[d];exact e) simp only[ο,ite_false,lQ,one_mul] at h;change |(2:ℝ)^E| <= _ at h simpa only[abs_of_pos (zpow_pos (by norm_num:(0:ℝ)<2) E)] using h open FloatLib.Floats.Formats.Flocq in lemma re (x:ℝ) (E:п) (g:-1021<= E) (e: |x| <(2:ℝ)^E): |Model.roundAt i5 x-x| <= (2:ℝ)^(E-53)/2:=by by_cases d:x=0 .subst x;rw[Model.roundAt_zero];simp only[sub_zero,abs_zero];positivity have h:magnitude jh x<= E:=magnitude_le_of_abs_lt_bpow _ x E d e;apply (Model.abs_roundAt_sub_le i5 x).trans;apply div_le_div_of_nonneg_right _ Г;change ulp jh (Model.fexpOf i5) x<=(2:ℝ)^(E-53);rw[ulp.of_ne_zero _ _ x d];change (2:ℝ)^(lm (magnitude jh x-53) (-1074))<=(2:ℝ)^(E-53);apply zpow_le_zpow_right₀ Г;omega lemma db (x y:р) (d:fv x) (e:fv y) (j: |rv x+rv y| <= jJ (kG i5)): fv (x+y)/\rv (x+y)=kh i5 (rv x+rv y):=by have h:=dU x y d e have g:=Model.isFinite_add_of_abs_toReal_add_le_posMaxFinite (i6 x.toModel) (i6 y.toModel) Б d e j refine ⟨by unfold fv;rw[h];exact g,?_⟩ unfold rv;rw[h];exact kx _ _ Б g lemma gF (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 obtain ⟨g,h⟩:=db x y l m (e.le.trans (pm E d));exact ⟨g,by rw[h];exact re _ E j e⟩ lemma rx (d:jf) (l:d.significand<2^53) (g:-1074<= d.exponent) (e: |d.toReal| <= (2:ℝ)^(971:п)): kh i5 d.toReal=d.toReal:=by obtain ⟨h,j⟩:=jO i5 Б d d.significand 0 (by simp) l g (e.trans (pm 971 le_rfl)) rw[<- ϗ _ Б d h,j] lemma gx (x y:р) (o:fv x) (p:fv y) (d:jf) (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 obtain ⟨h,j⟩:=db x y o p (by rw[<- g];exact e.trans (pm 971 le_rfl));exact ⟨h,by rw[j,<- g];exact rx d m l e⟩ lemma cy (i:Int64) (e:iнм<2^53):fv i.toFloat/\rv i.toFloat=iн:=by have g:i6 i.toFloat.toModel= i8 i5 (js iн 0):= ka i have d:(js iн 0).toReal=iн:=by rw[<- Ϙ,k8];simp obtain ⟨h,j⟩:=jO i5 Б (js iн 0) iнм 0 (ϱ _).symm e (by change _<=(0:ℤ);decide) (by rw[d,<- ϕ,kO];exact le_trans (by exact_mod_cast e.le) (pm 53 Г)) exact ⟨by unfold fv;rw[g];exact h,by unfold rv;rw[g,j,d]⟩ lemma gO (x y:р):i6 (x*y).toModel= lH i5 (jq jt x.toModel.unpack y.toModel.unpack):=by change i6 (l5 x.toModel y.toModel)=_;rw[l5,Ϣ] lemma eV (b:BitVec 64) (s:lR) (m:о) (e:п) (h:0< m) (d:jc jt b=.finite s m e h): 2^52<= m\/e=-1074:=by revert d;unfold jc;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 le_trans Б Nat.left_le_or lemma d4 (x y:р) (w:fv x) (z:fv y) (v: |rv x*rv y| <= (2:ℝ)^(971:п)): fv (x*y)/\rv (x*y)=kh i5 (rv x*rv y):=by simp only[bB] at w z;rw[cf x,cf y] at v⊢;unfold fv rv;rw[gO];generalize A:x.toModel.unpack=X at w v⊢;generalize B:y.toModel.unpack=Y at z v⊢;cases X<;>cases Y<;>simp only[jn,ο] at w z case finite.finite p j e t q l g u=> have D:=eV _ p j e t A;have E:=eV _ q l g u B have o:e+g<= Float.Model.Format.binary64.targetExponent (jl (j*l) (e+g)):=by change e+g<= lm ((Nat.log2 (j*l):п)+1+(e+g)-53) (-1074);have:=(Ϧ (n:=j*l) (k:=52) В).2;have:=kX j u;have:=Nat.le_mul_of_pos_left l t;omega let r:jf:=⟨xor (lL p) (lL q),j*l,e+g⟩ have h:lH i5 (jq jt (.finite p j e t) (.finite q l g u))=i8 i5 r:=by rw[jq,Model.roundWithAccuracy_exact_eq_round_of_le_targetExponent _ _ _ _ o];cases p<;>cases q<;>rfl have d:r.toReal=jp (.finite p j e t)*jp (.finite q l g u):= Model.Dyadic.toReal_mul ⟨_,j,e⟩ ⟨_,l,g⟩ have m:=Υ i5 Б r (by rw[d];exact v.trans (pm 971 le_rfl)) rw[h];exact ⟨m,by rw[ϗ _ Б r m,d]⟩ all_goals simp[jq,Model.isFinite_ofModel_zero i5 Б, Model.toReal_ofModel_zero i5 Б] lemma aw (s:ф) (m:о) (e:п): (⟨s,m,e⟩:jf).toReal=(if s then-(m:ℝ) else m)*(2:ℝ)^e:=by simp only[jz,kP];split<;>simp def pw:о-> р | 0=>(1:Int64).toFloat | k+1=>let p:=pw k;p+p lemma gh (k:о) (g:k<=900):fv (pw k)/\rv (pw k)=(2:ℝ)^k:=by induction k with | zero=>have:=cy 1 Б;simp only[pw];exact ⟨this.1,by rw[this.2];simp⟩ | succ k e=> obtain ⟨f,v⟩:=e А have d:(⟨false,1,((k+1:о):п)⟩:jf).toReal=(2:ℝ)^(k+1):=by rw[aw];simp only[ο,ite_false,lQ,one_mul];exact zpow_natCast 2 (k+1) have:=gx (pw k) (pw k) f f _ (by rw[d,v,pow_succ];ring) (show (1:о)<2^53 by norm_num) (show (-1074:п)<=((k+1:о):п) by omega) (by rw[d,abs_of_pos В,<- zpow_natCast];exact zpow_le_zpow_right₀ Г А) simp only[pw];exact ⟨this.1,by rw[this.2,v,pow_succ];ring⟩ def nm:р:=(-1:Int64).toFloat def P:FloatArray:=⟨Array.ofFn (n:=512) λi=>if iи<256 then pw (iи-1) else nm*pw (iи-256-1)⟩ lemma ag:Pд=512:=by simp[P,jD] lemma e8 (i:с) (h:iб>>23)е=wе/2^23:=by rw[Ρ];simp[ι] @[inline] def dw (w:Е):р:= (Core.mW w).toInt64.toFloat*P.uget (w>>>23).toUSize (by rw[ag,aH,cW];have:=w.toNat_lt;omega) lemma bn (z e:п):(kN z e).toReal=(z:ℝ)*(2:ℝ)^e:=by rw[<- Ϙ,toRat_ofIntDyadic];push_cast;rfl lemma cp (x y:р) (o:fv x) (p:fv y) (z e:п) (g:rv x*rv y=(z:ℝ)*(2:ℝ)^e) (m:zм<2^53) (l:-1074<= e) (d: |(z:ℝ)*(2:ℝ)^e| <= (2:ℝ)^(971:п)): fv (x*y)/\rv (x*y)=(z:ℝ)*(2:ℝ)^e:=by obtain ⟨h,j⟩:=d4 x y o p (by rw[g];exact d) have:=rx (kN z e) m l (by rw[bn];exact d) rw[bn] at this;exact ⟨h,by rw[j,g,this]⟩ lemma eT (w:Е):(sv w)м<2^24:=by have:=kw w;unfold sv;split<;>simp<;>omega lemma ez (a b c:о) (e:a+b<= c) (h:c<=971) (z:п) (g:zм<2^a): |(z:ℝ)*(2:ℝ)^(b:п)| <= (2:ℝ)^(971:п):=by rw[abs_mul,abs_of_pos (by positivity:(0:ℝ)<2^(b:п)),zpow_natCast] have d: |(z:ℝ)| <= 2^a:=by rw[<- ϕ,kO];exact_mod_cast g.le refine (mul_le_mul_of_nonneg_right d В).trans ?_;rw[<- pow_add,<- zpow_natCast];exact zpow_le_zpow_right₀ Г А lemma mV (u:Д) (n:о) (d:uа=n) (e:n<2^25): fv u.toInt64.toFloat/\rv u.toInt64.toFloat=(n:п):=by have:u.toInt64н=n:=by rw[show u.toInt64н=bi u from rfl,au,d];split<;>omega rw[<- this];exact cy _ (by rw[this];simp;omega) lemma qV (c:о) (A:FloatArray) (o:∀i h,A.uget i h=if iб<256 then pw (iб-c) else nm*pw (iб-256-c)) (w:Е) (h):fv (A.uget (w>>>23).toUSize h) /\ ∃σ:п, (∀v,jw v=jw w-> σ*jF v=sv v)/\σм=1 /\ rv (A.uget (w>>>23).toUSize h)=σ*2^((i7 w)е-c):=by have:=bO w;have:=w.toNat_lt;have d:=aP w;obtain ⟨j,l⟩:=gh ((i7 w)е-c) А;rw[o,aH,cW,gT];split .rw[show (i7 w)е+256*(wе/2^31)-c=(i7 w)е-c by omega] exact ⟨j,1,λv e=>by simp only[sv,e,d];split<;>omega,rfl,by rw[l];push_cast;ring⟩ .rw[show (i7 w)е+256*(wе/2^31)-256-c=(i7 w)е-c by omega] have g:=cy (-1) Б obtain ⟨m,p⟩:=cp _ _ g.1 j (-1) ((i7 w)е-c:ℕ) (by rw[g.2,l,zpow_natCast];rfl) Б А (ez 1 _ 971 А le_rfl _ Б) exact ⟨m,-1,λv e=>by simp only[sv,e,d];split<;>omega,rfl,by rw[<- zpow_natCast];exact p⟩ lemma dG (c q:о) (A:FloatArray) (o:∀i h,A.uget i h=if iб<256 then pw (iб-c) else nm*pw (iб-256-c)) (u:Д) (v w:Е) (h) (r:q<=2) (x:uа=q*jF v) (t:jw v=jw w) (p:(q:ℝ)*2^((i7 w)е-c)=2^je v): fv (u.toInt64.toFloat*A.uget (w>>>23).toUSize h) /\ rv (u.toInt64.toFloat*A.uget (w>>>23).toUSize h)=(sv v:ℝ)*2^je v:=by have:=kw v;have:=Ζ (jF v) r;have:=bO w;obtain ⟨g,j⟩:=mV u _ x А;obtain ⟨l,σ,d,m,y⟩:=qV c A o w h;have e:(((q*jF v:о):п)*σ)м<2^25:=by rw[Int.natAbs_mul,m];simp;omega have:=cp _ _ g l _ ((i7 w)е-c:о) (by rw[j,y,zpow_natCast];push_cast;ring) (e.trans Г) А (ez 25 _ 971 А le_rfl _ e) exact ⟨this.1,by rw[this.2,<- p,zpow_natCast,<- d v t];push_cast;ring⟩ lemma av (w:Е) (_:i7 w≠255):fv (dw w)/\rv (dw w)=(sv w:ℝ)*2^je w:= dG 1 1 P e8 _ w w _ А (by simp[aN]) rfl (by simp[br]) lemma ey (x w:Е) (j:i7 x≠255) (h:i7 w≠255): fv (dw x*dw w)/\rv (dw x*dw w)=(tm x w:ℝ):=by obtain ⟨e,l⟩:=av x j;obtain ⟨g,m⟩:=av w h have d:(sv x*sv w)м<2^48:=by rw[Int.natAbs_mul];exact (Nat.mul_lt_mul'' (eT x) (eT w)).trans_eq Г have:=cp _ _ e g (sv x*sv w) (je x+je w:о) (by rw[l,m,zpow_natCast,pow_add];push_cast;ring) (lt_trans d Г) А (ez 48 _ 971 (by rw[br,br];have:=bO x;have:=bO w;omega) le_rfl _ d) refine ⟨this.1,?_⟩;rw[this.2,tm,zpow_natCast];push_cast;ring @[inline] def eF (b:Д):Д:=(b>>>52)&&&2047 @[inline] def mF (b:Д):Д:=(b&&&0xfffffffffffff) ||| 0x10000000000000 lemma gP (u:Д):(u&&&0x8000000000000000!=0)=(u>>>63!=0):=by apply ϻ.mpr;simp only[bne_iff_ne,ne_eq,<- Β];rw[ψ,Α];change ¬uа&&&2^63=0↔¬uа>>>63=0;rw[lc,ι,jZ];have d:uа/2^63<2:=by have h:=UInt64.toNat_lt u;omega rw[ξ d];by_cases e:uа/2^63=1<;>simp<;>omega lemma dc (v:р):i6 v.toModel=Model.ofFields i5 (v.toBits>>>63!=0) (((v.toBits>>>52)&&&2047)а) ((v.toBits&&&0xfffffffffffff)а):=by rw[<- Model.ofFields_signBit_expField_fracField (i6 v.toModel)];congr 1;rw[<- gP];apply ϻ.mpr;simp only[Model.signBit,bne_iff_ne,ne_eq];rw[<- UInt64.toBitVec_inj];exact Iff.rfl lemma fq (v:р):((v.toBits>>>52)&&&2047)а<2^11/\(v.toBits&&&0xfffffffffffff)а<2^52:=by simp only[ψ];exact ⟨lt_of_le_of_lt ϙ Б,lt_of_le_of_lt ϙ Б⟩ lemma aK (v:р) (e:fv v) (g:¬eF v.toBits=0): rv v=(⟨v.toBits>>>63!=0,(v.toBits&&&0xfffffffffffff)а+2^52, ((eF v.toBits)а:п)-1075⟩:jf).toReal:=by unfold eF at g⊢;have j:=(fq v).1;have l:=(fq v).2;have d:((v.toBits>>>52)&&&2047)а≠0:=λh=>g (Β.mp (by simpa using h)) unfold fv at e;unfold rv;rw[dc] at e⊢;rw[jK,ϒ _ _ _ _ j l e,if_neg d] simp only[show FloatFormat.binary64.fracWidth=52 from rfl,show FloatFormat.binary64.exponentBias=1023 from rfl, ln] congr 2<;>(try simp only[kl,j0])<;>ring lemma bp (z:Model lr):ofW (jH z)=z:=by have h:z.toNatBits<2^32:=Model.toNatBits_lt_two_pow z;simp only[ofW,jH,ls,UInt32.toNat_ofNat',ξ h];exact Model.ofNatBits_toNatBits z lemma cs (w:i9) (d:i7 w≠255):jJ (ofW w)=(sv w:ℝ)*(2:ℝ)^((je w:п)-149):=by rw[ofW,jK,toDyadic_ofUInt32 w d];change (decodeD w).toReal=_;rw[<- Ϙ,decodeD_toRat];push_cast;rfl lemma ev (w:i9) (j:i7 w≠255) (m:w&&&0x7FFFFFFF≠0):jJ (ofW w)≠0:=by rw[cs w j];refine mul_ne_zero ?_ (zpow_ne_zero _ Г) have l:jF w≠0:=by unfold jF;split .rename_i d have e:=(cM w).mp d;rw[aR] at e;have g:(aS w)е≠0:=λh=>m (Η.mp (h.trans UInt32.toNat_zero.symm)) rw[aR] at g;unfold lW;rw[gG];omega .omega unfold sv;split<;>simp[l] lemma eM (d g h:jf) (m:d.toReal<= g.toReal) (o:g.toReal<= h.toReal) (w:jH (i8 lr d)=jH (i8 lr h)) (u:i7 (jH (i8 lr d))≠255) (x:jH (i8 lr d)&&&0x7FFFFFFF≠0) (v: |g.toReal| <= (2:ℝ)^(127:п)): jH (i8 lr g)=jH (i8 lr d):=by have e:=bp (i8 lr d);have j:jW (i8 lr d)=true:=by rw[<- e,ofW,kM];simpa using u have l:=Υ lr Б g (v.trans ((Ϡ lr false (2^23) 104 Б Б).trans' (by change _<= |(if false=true then (-1:ℝ) else 1)*((2^23:ℕ):ℝ)*(2:ℝ)^(104:ℤ)|;norm_num))) have t:i8 lr h=i8 lr d:=by rw[<- bp (i8 lr h),<- w,e] have r:=ϗ lr Б;have p:=jP lr m;have q:=jP lr o;rw[<- r d j,<- r g l] at p;rw[<- r g l,<- r h (by rw[t];exact j),t] at q rw[Model.eq_of_toReal_eq_of_nonzero (le_antisymm q p) (by rw[le_antisymm q p,<- e];exact ev _ u x)] lemma iF (x:о) (e:x<2^53) (d:x%2^29≠2^28): (aj (lP (x*2^10)))а=(x+2^28)/2^29:=by simp only[aj,Α,μ,ψ,iZ, Ξ (by simp only[jT];omega:x*2^10>>29 if d<=26&&E-1195<253&&u-(g+1)<0x1FFFFFFF-(g+g)&&r&&&0x7FFFFF!=0 then ((b>>>63)<<<31)+r-0x255000000 else 0x100000000 lemma rb (b:Д) (h:(((b&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29&&&0x7FFFFF!=0)=true): 2^28<=(b&&&0xfffffffffffff)а/\(b&&&0xfffffffffffff)а+2^28<2^52:=by simp only[bne_iff_ne,ne_eq,<- Β,ψ,Α,μ, iZ,jb,ι] at h⊢ rw[θ _ 63,θ _ 23] at h;rw[θ _ 52];omega lemma fJ (h E f:Д) (p:hа<2^63) (m:Eа<2048) (o:fа<2^52) (d:h+1075-E<=26) (g:E-1195<253) (e:((f+0x10000000)&&&0x1FFFFFFF)-(((1:Д)<<<(h+1075-E))+1)< 0x1FFFFFFF-(((1:Д)<<<(h+1075-E))+((1:Д)<<<(h+1075-E)))) (l:2^28<= fа/\fа+2^28<2^52): Eа<= hа+1075/\hа+1075-Eа<=26/\1195<= Eа/\Eа<=1447 /\ 2^(hа+1075-Eа)+1<=(fа+2^28)%2^29 /\ (fа+2^28)%2^29+2^(hа+1075-Eа)<2^29 /\ 2^(hа+1075-Eа)<= fа/\fа+2^(hа+1075-Eа)<2^52:=by simp only[κ,ν,Κ,μ,ψ, Ι,iZ,kW,ϭ] at d g e have j:(2^64-Eа+(hа+1075)%2^64)%2^64=hа+1075-Eа:=А;rw[j] at d e;have:=Ε (n:=2) Г d;rw[ξ (by omega:_<64),θ _ 29] at e omega lemma fK (b:Д) (d:1195<=(eF b)а): (((b>>>63)<<<31)+(((b&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29)-0x255000000)а= bа/2^63*2^31+(((eF b)а-1085-110)*2^23+ (2^23+((b&&&0xfffffffffffff)а+2^28)/2^29)):=by simp only[eF,Κ,μ,Ι,Α, ψ,iZ,jb,ι,Μ] at d⊢ rw[θ _ 11] at d⊢;rw[θ _ 63,θ _ 52];have:=b.toNat_lt;omega lemma ch (S:р) (hS:fv S) (h:Д) (hh:hа<2^63) (T:п) (x: |rv S-(T:ℝ)| <= (2:ℝ)^(hа:п)) (as: |(T:ℝ)| <= (2:ℝ)^(425:п)) (F:ai S h<0x100000000):T≠0/\(ai S h)л=kC T (-298) false:=by unfold ai at F⊢;dsimp only at F⊢ split;swap;. simp[*] at F rename_i u;simp only[υ,decide_eq_true_eq] at u;obtain ⟨⟨⟨X,Y⟩,Z⟩,c4⟩:=u have I:(if (S.toBits>>>63!=0)=true then 2^31 else 0)=S.toBitsа/2^63*2^31:=by simp only[ce,decide_eq_true_eq];have:=S.toBits.toNat_lt;split<;>omega obtain ⟨d1,d2,A,e2,u1,u2,f1,f2⟩:=fJ h (eF S.toBits) _ hh (fq S).1 (fq S).2 X Y Z (rb _ c4);have Q:=fK S.toBits A;have O:=aK S hS (λh0=>by rw[h0] at A;simp at A) rw[<- I] at Q have H:(eF S.toBits-1085)а=(eF S.toBits)а-1085:=by rw[Κ];simp only[iZ];omega generalize hW:kr _=W;generalize (S.toBits>>>63!=0)=y at* generalize (eF S.toBits)а=d at* generalize hG:2^(hа+1075-d)=G at* generalize (S.toBits&&&0xfffffffffffff)а=g at* have j:Wе=(if y then 2^31 else 0)+((d-1085-110)*2^23+(2^23+(g+2^28)/2^29)):=by rw[<- hW,ϟ,Q];split<;>omega have v:∀N,g+2^52<= N+G-> N<= g+2^52+G -> jH (i8 lr ⟨y,N*2^10,((d-1085:ℕ):ℤ)-298⟩)=W:=λN l r=>by have n:=Ξ (show N*2^10by have:=be W;simp only[J,aR,j,jj] at this;split at this<;>omega have V:W&&&0x7FFFFFFF≠0:=λJ=>by have:=aR W;simp only[aS,J,j,j5] at this;split at this<;>omega have o:=v (g+2^52-G) А А;have p:=v (g+2^52+G) А А;have D:Gby rw[Nat.cast_mul,mul_assoc,mul_assoc,Nat.cast_pow,j0,<- zpow_natCast (2:ℝ) 10,<- zpow_add₀ two_ne_zero, <- zpow_add₀ two_ne_zero,show ((10:ℕ):ℤ)+(((d-1085:ℕ):ℤ)-298)=(d:ℤ)-1075+-298 by omega] have hu:(0:ℝ)<(2:ℝ)^((d:п)-1075):=В;have e:(0:ℝ)<(2:ℝ)^(-298:п):=В have t: |(kN T (-298)).toReal| <= (2:ℝ)^(127:п):=by rw[bn,abs_mul,abs_of_pos e,show (127:ℤ)=425+-298 by norm_num,zpow_add₀ two_ne_zero];gcongr rw[hU,O] at x;generalize g+2^52=M at x o p D;have z:((M-G:ℕ):ℝ)=M-G:=k9 D.le;have E:(G:ℝ)simp only[ο,ite_false,ite_true] at x<;>obtain ⟨K,L⟩:=abs_le.mp x<;> have q:T≠0:=by rintro rfl;push_cast at K L;nlinarith only[K,L,E,hu] all_goals refine ⟨q,?_⟩;simp only[kC,q,↓reduceIte] on_goal 2=>refine ((eM _ _ _ ?_ ?_ (p.trans o.symm) (p ▸ U) (p ▸ V) t).trans p).symm refine ((eM _ _ _ ?_ ?_ (o.trans p.symm) (o ▸ U) (o ▸ V) t).trans o).symm;all_goals simp only[bn,aw,ο,ite_false,ite_true,neg_mul,B,z];push_cast;nlinarith only[K,L,e] @[specialize] def ac (p:о-> р) (n t:о) (a:р):р:= if t р | 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:kб<8) (h:iб+8<= S) (e:S<2^32): (i+k)бsimp[*,getElem!_pos] @[specialize] def bk (f:о-> р) (N:о) (Y:FloatArray):FloatArray:= if Yд р) (N:о):∀k (Y:FloatArray),N-Yд=k-> Yд<= N -> (bk f N Y)д=N/\(∀q q(bk f N Y).data[q]! =f q:=by intro k;induction k<;>intro Y r p .rw[bk,if_neg А];exact ⟨by omega,λq _=>rfl,λq h d=>by omega⟩ rename_i o;rw[bk,if_pos А];have t:=gf Y (f Yд);obtain ⟨l,g,m⟩:=o (Y.push (f Yд)) А А;refine ⟨l,λq j=>by rw[g q А,pg _ _ _ А,if_pos j],λq h d=>?_⟩ rcases eq_or_ne q Yд with rfl | e .rw[g _ А,pg _ _ _ А,if_neg (lt_irrefl _)] exact m q А d lemma f6 (v:р) (h:(eF v.toBits)а<2047):fv v:=by unfold fv;rw[dc];have e:=(fq v).1;have g:=(fq v).2;rw[Model.isFinite_ofFields _ _ _ _ e g];have d:FloatFormat.binary64.expAllOnesNat=2047:=Б;unfold eF at h;simp only[show FloatFormat.binary64.encoding=.ieee from rfl,d,bne_iff_ne,ne_eq];omega lemma bj (v:р) (g:fv v): |rv v| <(2:ℝ)^(((eF v.toBits)а:п)-1022):=by have d:∀(m k:ℕ) (e f:ℤ),m<2^k-> k+e<= f->(m:ℝ)*2^e<2^f:=λm k e f h j=> (mul_lt_mul_of_pos_right (by exact_mod_cast h:(m:ℝ)<2^k) (zpow_pos two_pos e)).trans_le (by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ Г j) unfold rv eF;unfold fv at g;rw[dc] at g⊢;rw[jK,ϒ _ _ _ _ (fq v).1 (fq v).2 g];have:=(fq v).2;split_ifs with l<;>simp only[Model.Dyadic.abs_toReal] .simp;positivity .exact d _ 52 _ _ this (by rw[l];decide) .exact d _ 53 _ _ (by simp only[i5,ln];omega) (by simp[i5];omega) lemma iL (x y:р) (l:fv x) (m:fv y) (r:fv (x+y)) (E:п) (e:-1074<= E) (g:E<=971) (h: |rv (x+y)| <(2:ℝ)^E): |rv x+rv y| <(2:ℝ)^E:=by have j:=dU x y l m;have q:=kx (i6 x.toModel) (i6 y.toModel) Б (j ▸ r);unfold rv at h⊢;rw[j,q,abs_lt] at h;have p:=rx ⟨false,1,E⟩ Г e (by simp[aw];exact zpow_le_zpow_right₀ Г g) have o:=rx ⟨true,1,E⟩ Г e (by simp[aw];exact zpow_le_zpow_right₀ Г g) simp only[aw,ο,ite_false,ite_true,lQ,one_mul,neg_mul] at p o exact abs_lt.2 ⟨lt_of_not_ge λd=>by linarith[jP i5 d], lt_of_not_ge λd=>by linarith[jP i5 d]⟩ @[specialize] def sT (p:о-> р) (n t:о) (a:р) (m:Д):р×Д:= if trename_i h<;>simp only[ν] at h<;>omega lemma fn (p:о-> р) (n:о):∀k t a m,n-t=k-> mа<=(sT p n t a m).2а:=by intro k;induction k with | zero=>intro t a m h;rw[sT,if_neg А] | succ k d=> intro t a m h;rw[sT,if_pos А];dsimp only;have:=d (t+1) (a+p t) (if m р) (z:о-> п) (q:п) (n K:о) (u:1<= K) (v:K<=1993) (x:∀t t<= n-> fv a -> |rv a-((q:ℝ)+∑s∈i0 t,(z s:ℝ))| <= t*(2:ℝ)^((K:п)-1076) -> (sT p n t a M).2а<= K -> fv (sT p n t a M).1 /\ |rv (sT p n t a M).1-((q:ℝ)+∑s∈i0 n,(z s:ℝ))| <= n*(2:ℝ)^((K:п)-1076):=by intro m;induction m<;>intro t a M B D h g j .obtain rfl:t=n:=А rw[sT,if_neg (lt_irrefl _)];exact ⟨h,g⟩ rename_i y;have d:tlinarith only[e.1,e.2,g.1,g.2,A] lemma cw (n:о) (d e:о-> i9) (g:am n d e) (S:р) (m:fv S) (h:Д) (q:hа<2^63) (o: |rv S-(ah n d e:ℝ)| <= (2:ℝ)^(hа:п)) (l: |(ah n d e:ℝ)| <= (2:ℝ)^(425:п)) (p:ai S h<0x100000000): (ai S h)л=kB n d e:=by obtain ⟨j,r⟩:=ch S m h q _ o l p;rw[r,a9 n d e g j] def aI (A:у т) (i:с) (m:Е):Е:= if h:i>>23)&&&255 aI A (i+1) (if m mе<=(aI A i m)е /\ ∀q,iб<= q-> q(i7 A[q]!)е<=(aI A i m)е:=by intro k;induction k<;>intro i m u .have h:¬iby have:=ay h;omega rw[aI,dif_neg h];exact ⟨le_rfl,λq g d=>by omega⟩ rename_i t;have h:iby split<;>rename_i j<;>simp only[ϖ] at j<;>omega obtain ⟨p,r⟩:=t (i+1) (if m<(A.uget i (ay h)>>>23)&&&255 then (A.uget i (ay h)>>>23)&&&255 else m) (by rw[al h];omega) rw[o] at p;refine ⟨by omega,λq g d=>?_⟩ rcases eq_or_ne q iб with rfl | e .rw[<- bt A i (ay h)];unfold i7;omega exact r q (by rw[al h];omega) d lemma da (A:у i9) (j:Aвby rw[e] at d;simp at d g;omega,by rw[br];omega⟩ @[inline] def s8 (Y:FloatArray) (o:с) (e0 e1 e2 e3 e4 e5 e6 e7:р):FloatArray:= (((((((Y.set! oб e0).set! (o+1)б e1).set! (o+2)б e2).set! (o+3)б e3).set! (o+4)б e4).set! (o+5)б e5).set! (o+6)б e6).set! (o+7)б e7 lemma dQ (Y:FloatArray) (o:с) (e:о-> р) (h:oб+8?_⟩ simp (disch:=(try simp only[bD,USize.reduceToNat]);omega) only[s8,sg,ab,jd] split_ifs<;>first | rfl | omega | (congr 1;omega) lemma gD (X:у i9) (k:о):X.getD k 0=X[k]!:=by unfold Array.getD;split<;>rename_i h .rw[getElem!_pos X k h];rfl .rw[getElem!_neg X k h];rfl @[inline] def xr (X:у т) (q st:с) (r:о):р:=dw (X.getD (q+rг*st)б 0) def bx (X:у т) (st s:с):о-> с-> с-> FloatArray-> FloatArray | 0,_,_,Y=>Y | k+1,q,o,Y=>bx X st s k (q+s) (o+8) (s8 Y o (xr X q st 0) (xr X q st 1) (xr X q st 2) (xr X q st 3) (xr X q st 4) (xr X q st 5) (xr X q st 6) (xr X q st 7)) lemma dD (X:у i9) (d s:с):∀k (q o:с) (Y:FloatArray), qб+k*sб+8*dб+oб+8*k oб+8*k<= Yд -> (bx X d s k q o Y)д=Yд/\(∀p r<8->(bx X d s k q o Y).data[oб+8*τ+r]! =dw X[qб+τ*sб+r*dб]!:=by intro k;induction k with | zero=>intro q o Y _ _;exact ⟨rfl,λ_ _=>rfl,λτ r h=>absurd h А⟩ | succ k y=> intro q o Y v A;rw[ϋ] at v;have:=ς;have:=Ϟ;obtain ⟨l,t⟩:=dQ Y o (xr X q d) А;have u:(q+s)б=qб+sб:=ab А;have g:(o+8)б=oб+8:=by rw[ab (by simp;omega)];simp obtain ⟨w,e,x⟩:=y (q+s) (o+8) _ А (by rw[l];omega) rw[g] at e;rw[u,g] at x;refine ⟨by rw[bx,w,l],λp B=>by rw[bx,e p А,t p А,if_neg А],λτ r z j=>?_⟩ rw[bx];rcases τ with _ | τ .have m:(rг*d)б=r*dб:=by rw[li,aa А,ξ (by have:=Ζ dб j.le;omega)] rw[e _ А,t _ А,if_pos А,show oб+8*0+r-oб=r by omega,xr, ab (by rw[m];have:=Ζ dб j.le;omega),m,gD];simp .grind def ZT:у FloatArray:=Array.ofFn (n:=10) λk=>⟨Array.replicate (2^(kи+7)) 0⟩ def zT (n:о):FloatArray:= let k:=Nat.log2 (8*n)+1-7 if k<10 then ZT[k]! else ⟨Array.replicate (8*n) 0⟩ lemma gu (n:о):8*n<=(zT n)д/\((zT n)д=8*n\/(zT n)д<=2^16):=by unfold zT;dsimp only;split .rw[getElem!_pos ZT _ (by simp[ZT];omega)] simp only[ZT,Ϩ,jD,ϴ] exact ⟨(Ϸ (n:=8*n)).le.trans (Ε Б А), .inr (Ε Б А)⟩ .simp[jD] @[inline] def rX (X:у т) (i:с):р:=if h:i р) (bpf:Unit-> р) (fbk:Unit-> т):т:= let r:=sT p n 0 (bpf ()) 0 let c:=if 1<= r.2а/\r.2а<=1993/\1076<= r.2а+L then ai r.1 (r.2а+L-1076)ж else 0x100000000 if c<0x100000000 then act relu cл else fbk () @[inline] def tf (relu:ф) (S:р) (hh:Д) (sl:Unit-> т):т:= let c:=ai S hh if c<0x100000000 then act relu cл else sl () lemma gg (X:FloatArray) (i:о):X.get! i=X.data[i]!:=by rcases X with ⟨d⟩;rfl lemma gk (z:ℝ): |Model.roundAt i5 z-z| <= (2:ℝ)^(-53:п)* |z| +2^(-1075:п):=by by_cases h: |z| <(2:ℝ)^(-1021:п) .refine (re z (-1021) le_rfl h).trans ?_ rw[div_eq_mul_inv,<- zpow_sub_one₀ two_ne_zero];norm_num .have j:0< |z| :=lt_of_lt_of_le В (not_lt.1 h) have d:=lv (b:=2) Г j;have e:=kK (b:=2) Г |z| simp only[j0] at d e have g:(-1021:п)<= ky 2 |z| +1:=by by_contra l;linarith[zpow_le_zpow_right₀ (by norm_num:(1:ℝ)<=2) (by omega:Int.log 2 |z| +1<=-1021)] refine (re z _ g e).trans ?_ rw[div_eq_mul_inv,<- zpow_sub_one₀ two_ne_zero,show ky 2 |z| +1-53-1=-53+ky 2 |z| by ring, zpow_add₀ two_ne_zero] linarith[mul_le_mul_of_nonneg_left d (by positivity:(0:ℝ)<=2^(-53:п)), show (0:ℝ)<=2^(-1075:п) by positivity] lemma iN (x y:р) (g:fv x) (h:fv y) (d: |rv x+rv y| <= (2:ℝ)^(970:п)): fv (x+y) /\ |rv (x+y)-(rv x+rv y)| <= (2:ℝ)^(-53:п)* |rv x+rv y| +2^(-1075:п):=by obtain ⟨f,e⟩:=db x y g h (d.trans ((zpow_le_zpow_right₀ Г Г).trans (pm 971 le_rfl)));exact ⟨f,by rw[e];exact gk _⟩ lemma iO (x y:р) (g:fv x) (h:fv y) (d: |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 obtain ⟨f,e⟩:=d4 x y g h d;exact ⟨f,by rw[e];exact gk _⟩ lemma fe (v:р) (d:fv v) (e:eF v.toBits=0): rv v=(⟨v.toBits>>>63!=0,(v.toBits&&&0xfffffffffffff)а,-1074⟩:jf).toReal:=by unfold eF at e;unfold fv at d;unfold rv;rw[dc] at d⊢;rw[jK,ϒ _ _ _ _ (fq v).1 (fq v).2 d,ite_eq_left (by rw[e];rfl)] split_ifs with g .dsimp only;rw[aw,aw,g];simp .rfl lemma bu (v:р) (e:fv v): |rv v| <(2:ℝ)^(((eF v.toBits)а:п)-1022):=by have g:=(fq v).2;by_cases d:eF v.toBits=0 .rw[fe v e d,aw,show (eF v.toBits)а=0 by rw[d];rfl, show (2:ℝ)^(((0:о):п)-1022)=2^52*2^(-1074:п) by rw[show (2:ℝ)^52=2^(52:п) by norm_num,<- zpow_add₀ two_ne_zero];norm_num] have:((v.toBits&&&0xfffffffffffff)а:ℝ)<2^52:=by exact_mod_cast g split<;>simp only[neg_mul,abs_neg,abs_mul,abs_zpow,abs_two,lS]<;> exact mul_lt_mul_of_pos_right this В .rw[aK v e d,aw,show (2:ℝ)^(((eF v.toBits)а:п)-1022)= 2^53*2^(((eF v.toBits)а:п)-1075) by rw[show (2:ℝ)^53=2^(53:п) by norm_num,<- zpow_add₀ two_ne_zero];congr 1;ring] have:(((v.toBits&&&0xfffffffffffff)а+2^52:о):ℝ)<2^53:=by exact_mod_cast (by omega:(v.toBits&&&0xfffffffffffff).toNat+2^52<2^53) split<;>simp only[neg_mul,abs_neg,abs_mul,abs_zpow,abs_two,lS]<;> exact mul_lt_mul_of_pos_right this В lemma gm (p:о-> р) (z:о-> ℝ) (d:ℝ) (n:о) (I:∀t t<= n-> fv a -> |rv a-(d+∑s∈i0 t,z s)| <= t*((2:ℝ)^(-53:п)*(1+2^(-20:п))*(|d| +∑s∈i0 t,|z s|)+2^(-1074:п)) -> fv (ac p n t a) /\ |rv (ac p n t a)-(d+∑s∈i0 n,z s)| <= n*((2:ℝ)^(-53:п)*(1+2^(-20:п))*(|d| +∑s∈i0 n,|z s|)+2^(-1074:п)):=by have j:(2:ℝ)^(970:п)=2^(968:п)*4:=by rw[show (970:п)=968+2 by norm_num,zpow_add₀ two_ne_zero];norm_num have K:(2:ℝ)^(-1075:п)=2^(-1074:п)/2:=by rw[show (-1074:п)=-1075+1 by norm_num,zpow_add_one₀ two_ne_zero];ring have r:(4294967296:ℝ)*2^(-1074:п)<=2^(968:п):=by rw[show (4294967296:ℝ)=2^(32:п) by norm_num,<- zpow_add₀ two_ne_zero] exact zpow_le_zpow_right₀ Г Г have l:(0:ℝ)<2^(-1074:п):=В;intro m;induction m with | zero=> intro t a G J o h;obtain rfl:t=n:=А;rw[ac,if_neg (lt_irrefl _)];exact ⟨o,h⟩ | succ m L=> intro t a G J o h;have g:tabs_nonneg (z i)) have w:=(abs_add_le d _).trans (add_le_add le_rfl (Ϲ z (i0 (t+1))));simp only[ϝ] at v w;have x:=abs_add_le (rv a-(d+∑s∈i0 t,z s)) (d+(∑s∈i0 t,z s+z t)) rw[show rv a-(d+∑s∈i0 t,z s)+(d+(∑s∈i0 t,z s+z t))=rv a+rv (p t) by rw[y];ring] at x have e:(t:ℝ)<=4294967296:=by exact_mod_cast (by omega:t<=2^32) have M:=mul_le_mul_of_nonneg_right e (abs_nonneg d);have N:=mul_le_mul_of_nonneg_right e (ϡ λi (_:i∈i0 t)=>abs_nonneg (z i)) have V:=mul_le_mul_of_nonneg_right e (abs_nonneg (z t));have O:=mul_le_mul_of_nonneg_right e l.le;have q:0<= ∑s∈i0 t,|z s| :=ϡ λi _=>abs_nonneg (z i) have W:=mul_nonneg (lj t:(0:ℝ)<= t) (abs_nonneg (z t));have Q:=abs_nonneg d;have S:=abs_nonneg (z t) have E: |rv a-(d+∑s∈i0 t,z s)| <= 1/9007199254740992*(1+1/1048576)*(t* |d|)+ 1/9007199254740992*(1+1/1048576)*(t*∑s∈i0 t,|z s|)+t*2^(-1074:п):=h.trans_eq (by ring) obtain ⟨B,A⟩:=iN a (p t) o D (by rw[j];generalize (2:ℝ)^(968:п)=H at*;generalize (2:ℝ)^(-1074:п)=η at* linarith only[x,E,w,v,F,M,N,O,r,q,Q,S,l]) refine L (t+1) (a+p t) А А B ?_;rw[K,show (2:ℝ)^(-53:п)=1/9007199254740992 by norm_num] at A have u:=abs_add_le (rv (a+p t)-(rv a+rv (p t))) (rv a-(d+∑s∈i0 t,z s)) rw[show rv (a+p t)-(rv a+rv (p t))+(rv a-(d+∑s∈i0 t,z s))= rv (a+p t)-(d+(∑s∈i0 t,z s+z t)) by rw[y];ring] at u simp only[ϝ];generalize (2:ℝ)^(-1074:п)=η at* calc _<=1/9007199254740992*(1+1/1048576)*(t* |d| +t*∑s∈i0 t,|z s| +t* |z t| + (|d| +(∑s∈i0 t,|z s| + |z t|)))+t*η+η:=by linarith _=_:=by push_cast;ring lemma fx (m:Float.Model):(kY m.unpack.abs).unpack=m.unpack.abs:=by have d:(kY m.unpack).unpack=m.unpack:=by have:=Model.toFloatModel_ofFloatModel m;conv_rhs=>rw[<- this] rfl generalize m.unpack=u at d⊢;simp only[kY,Float.Model.unpack,UInt64.toBitVec_ofBitVec] at d⊢;cases u with | notANumber=>exact d | finite s h e g=> simp only[jm,jA,jG] at d⊢;split_ifs at d⊢<;> simp only[jc,ύ, ώ,kb] at d⊢<;> split_ifs at d⊢<;>simp_all | _=> simp only[jm,jA,jG, lD,jc, ύ,ώ, kb] at d⊢ split_ifs at d⊢<;>simp_all lemma gE (v:р) (d:fv v):fv v.abs/\rv v.abs= |rv v| :=by have e:v.abs.toModel.unpack=v.toModel.unpack.abs:=fx v.toModel;rw[bB] at d⊢;rw[cf,cf,e];generalize v.toModel.unpack=u at d⊢;cases u with | notANumber | infinity _=>simp[jn] at d | zero _=>simp[jm,jn,jp,jU] | finite s j e h=> refine ⟨by simp[jm,jn],?_⟩ simp only[jm,Model.unpackedToReal_finite,abs_mul];have g:=lx jh e;split<;>split<;>simp_all[abs_of_pos g] lemma gX (S:р) (l:fv S) (h:Д) (B:hа<2^63) (T:ℝ) (A: |rv S-T| <= (2:ℝ)^(hа:п)) (d:ai S h<0x100000000): |T| <= (2:ℝ)^(425:п):=by unfold ai at d;dsimp only at d;split at d swap;. exact absurd d Б rename_i g;simp only[υ,decide_eq_true_eq] at g;obtain ⟨⟨⟨q,r⟩,t⟩,u⟩:=g;obtain ⟨v,w,j,x,-,-,-,m⟩:=fJ h (eF S.toBits) (S.toBits&&&0xfffffffffffff) B (fq S).1 (fq S).2 q r t (rb _ u);have e:=aK S l (λy=>by rw[y] at j;simp at j) rw[aw] at e;generalize (eF S.toBits)а=E at v w j x m e;generalize (S.toBits&&&0xfffffffffffff)а=f at m e;have p:(0:ℝ)<2^((E:п)-1075):=В have z:((f+2^52:о):ℝ)+((2^(hа+1075-E):о):ℝ)<=2^53:=by exact_mod_cast (by omega:f+2^52+2^(h.toNat+1075-E)<=2^53) have l: |rv S| =((f+2^52:о):ℝ)*2^((E:п)-1075):=by rw[e,abs_mul,abs_of_pos p];split<;>simp only[abs_neg,lS] have:=abs_sub (rv S) (rv S-T);rw[sub_sub_cancel,l] at this rw[show (2:ℝ)^(hа:п)=((2^(hа+1075-E):о):ℝ)*2^((E:п)-1075) by push_cast;rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];congr 1;omega] at A have o:(2:ℝ)^(53:о)*2^((E:п)-1075)<=2^(425:п):=by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ Г А linarith[mul_le_mul_of_nonneg_right z p.le] lemma fO (n:о) (e g:о-> i9) (d:am n e g) (S:р) (j:fv S) (h:Д) (o:hа<2^63) (l: |rv S-(ah n e g:ℝ)| <= (2:ℝ)^(hа:п)) (m:ai S h<0x100000000):(ai S h)л=kB n e g:= cw n e g d S j h o l (gX S j h o _ l m) m lemma dx (Y:FloatArray) (g:Yд<2^32) (i:с) (v:р):wF Y i v=Y.set! iб v:=by rcases Y with ⟨d⟩;unfold wF;split next h=>simp only[l6,kt,l9,l8,lE];rw[dite_eq_left (show iб simp only[kt,l8,lE] rw[dite_eq_right λe=>h (by rw[γ,lY,aa (lt_of_lt_of_le g ς)];exact e)] lemma dr (X:у i9) (e:Xв<2^32) (i:с):rX X i=dw X[iб]!:=by unfold rX;split .rw[bt] next h=> rw[getElem!_neg X _ λd=>h (by rw[γ,kk,aa (lt_of_lt_of_le e ς)];exact d)];rfl lemma b7 (p:о-> р) (n:о):∀m t a,n-t=m -> ac p (n+1) (t+1) a=ac (λτ=>p (τ+1)) n t a:=by intro m;induction m with | zero=>intro t a h;unfold ac;rw[if_neg А,if_neg А] | succ m d=>intro t a h;unfold ac;rw[if_pos А,if_pos А];exact d (t+1) _ А lemma gW (n:ℕ) (σ j E A C H M:ℝ) (u:0<= σ) (d:0omega obtain ⟨w,h⟩:=cy (9*(n+1))ж.toInt64 (by rw[e];simp;omega) rw[e] at h;push_cast at h have r:(2:ℝ)^(((eF ((9*(n+1))ж.toInt64.toFloat*a).toBits)а:п)-1022) <= 2^(((cE (9*(n+1))ж.toInt64.toFloat a)а:п)+56):=by apply zpow_le_zpow_right₀ Г;unfold cE;dsimp only;split .rw[χ _ _ (UInt64.le_of_lt ‹_›)];have:=ν.mp ‹_› simp only[iZ] at this⊢;omega .have:=κ.mp (UInt64.not_lt.mp ‹_›);simp only[iZ] at this⊢;omega have t:(n:ℝ)<=536870912:=by exact_mod_cast H.le have I:(2:ℝ)^(-1074:п)=2^(-1075:п)*2:=by rw[<- zpow_add_one₀ two_ne_zero];norm_num have V:(2:ℝ)^(-1075:п)*2^64<=2^(-900:п):=by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ Г Г have S:(2:ℝ)^40*2^(400:п)<=2^(971:п):=by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ Г Г have U:(1:ℝ)<=2^(400:п):=one_le_zpow₀ Г Г;have g:(0:ℝ)<2^(-1075:п):=В;have F:(2:ℝ)^(-900:п)<=1:=zpow_le_one_of_nonpos₀ Г Г rw[show (2:ℝ)^(-53:п)=1/9007199254740992 by norm_num,show (2:ℝ)^(-20:п)=1/1048576 by norm_num, I,mul_add,<- mul_assoc] at d have W:=mul_le_mul_of_nonneg_right t g.le;generalize G:(n:ℝ)*(1/9007199254740992*(1+1/1048576))=K at d;have m:K<=1/8388608:=by rw[<- G];nlinarith have X:=mul_le_mul_of_nonneg_right m u have z: |rv a| <= 3*2^(400:п):=by have:=abs_sub_abs_le_abs_sub (rv a) σ;rw[abs_of_nonneg u] at this;generalize (2:ℝ)^(-1075:п)=y at*;generalize (2:ℝ)^(-900:п)=ε at* generalize (2:ℝ)^(400:п)=Z at*;linarith have E: |rv (9*(n+1))ж.toInt64.toFloat*rv a| <= 2^(971:п):=by rw[h,abs_mul,abs_of_pos В];have:=mul_le_mul_of_nonneg_left z (by positivity:(0:ℝ)<=9*(n+1)) have:=mul_le_mul_of_nonneg_right t (by positivity:(0:ℝ)<=2^(400:п)) generalize (2:ℝ)^(400:п)=Z at*;generalize (2:ℝ)^(971:п)=L at*;linarith obtain ⟨o,j⟩:=iO _ a w D E;have O:=lt_of_le_of_lt' r (lt_of_le_of_lt (abs_nonneg _) (bu _ o));have M:=lt_of_lt_of_le (lt_of_le_of_lt (le_abs_self _) (bu _ o)) r;rw[h,show (2:ℝ)^(-53:п)=1/9007199254740992 by norm_num] at j rw[show (2:ℝ)^(-20:п)=1/1048576 by norm_num] generalize (2:ℝ)^(((cE (9*(n+1))ж.toInt64.toFloat a)а:п)+56)=Q at* generalize rv ((9*(n+1))ж.toInt64.toFloat*a)=P at* generalize rv a=A at* generalize (2:ℝ)^(-1075:п)=y at* generalize (2:ℝ)^(-900:п)=ε at* have l:(n:ℝ)*(y*2)<=1073741824*y:=by linarith generalize (n:ℝ)*(y*2)=v at d l;have q:(0:ℝ)<=9*(n+1):=В;have B:=mul_le_mul_of_nonneg_right (by linarith:9*((n:ℝ)+1)<=2^33) g.le generalize 9*((n:ℝ)+1)=N at* obtain ⟨x,-⟩:=abs_le.mp d;rcases le_or_gt 0 A with p | p .rw[abs_of_nonneg (mul_nonneg q p)] at j have:=mul_le_mul_of_nonneg_left x (by linarith:0<= N*(1-1/9007199254740992)) nlinarith[(abs_le.mp j).1] .have:=mul_le_mul_of_nonneg_left (by linarith:σ<=2*v) q nlinarith lemma fW (x:i9) (d:i7 x≠255): |rv (dw x)| <= 2^(277:п):=by rw[(av x d).2,abs_mul,abs_pow,abs_two];have:(i7 x)е≠255:=λh=>d (Η.mp (by simpa using h)) have:=bO x calc _<=(2:ℝ)^24*2^253:=mul_le_mul (by rw[<- ϕ];exact_mod_cast (bV x).le) (pow_le_pow_right₀ Г (by rw[br];omega)) В В _=2^(277:п):=by rw[<- pow_add,<- zpow_natCast];rfl lemma f0:fv (0:р)/\rv (0:р)=0:=by have e:(0:р).toModel.unpack=.zero .positive:=rfl;refine ⟨by rw[bB,e];rfl,by rw[cf,e];simp[jp,jU]⟩ lemma io (b s d τ r:о) (o:s<2^32) (g:d<2^32) (p:τ<2^32) (l:r<2^32) (h:b+τ*s+r*d<2^32): (bг+τг*sг+rг*dг)б=b+τ*s+r*d:=by have:=ς;have:=Ϟ have m:∀x y:о,x<2^32-> y<2^32-> x*y<2^32->(xг*yг)б=x*y:= λx y q t h=>by rw[li,aa А,aa А,ξ А] have e:=m τ s p o А;have j:=m r d l g А rw[ab (by rw[ab (by rw[aa А,e];omega),aa А,e,j];omega), ab (by rw[aa А,e];omega),aa А,e,j] lemma fw (b:i9) (d:о) (g:je b<= d): |(tm kf b:ℝ)| <= 2^(173+d):=by unfold tm rw[show sv kf=2^23 by decide,show je kf=126 by decide,Int.cast_mul,Int.cast_mul,abs_mul,abs_mul, Int.cast_pow,Int.cast_pow,Int.cast_ofNat,abs_pow,abs_pow,abs_two] have e: |(sv b:ℝ)| <= 2^24:=by rw[<- ϕ];exact_mod_cast (bV _).le calc (2:ℝ)^23* |(sv b:ℝ)| *2^(126+je b)<=2^23*2^24*2^(126+d):=by gcongr;norm_num _=2^(173+d):=by rw[<- pow_add,<- pow_add];congr 1;omega lemma fh (b:Д):(eF b)а<=2047:=by unfold eF;simp only[ψ,iZ];exact ϙ lemma ff (F a:р):(cE F a)а<=969:=by unfold cE;dsimp only;split .rename_i h;have:=fh (F*a).toBits;have d:=ν.mp h rw[χ _ _ (UInt64.le_of_lt h)];simp only[iZ] at d⊢;omega .simp abbrev Iv (F:о-> т) (a:у т) (P:о-> Prop) (A:у т):Prop:= Aв=aв /\ ∀q,(A[q]?=a[q]? \/ A[q]?=some (F q))/\(P q-> q A[q]?=some (F q)) lemma cz (F:о-> i9) (e g:у i9) (S U:о-> Prop) (j:∀q,U q-> S q) (h:Iv F e S g):Iv F e U g:= ⟨h.1,λq=>⟨(h.2 q).1,λd l=>(h.2 q).2 (j q d) l⟩⟩ def aV (A:у т) (e:с) (he:e<= A.usize) (i:с) (m:Е):Е:= if h:i>>23)&&&255)) else m termination_by eб-iб decreasing_by have:=γ.mp h;rw[al h];omega lemma cL (A:у i9) (e:с) (d:e<= A.usize):∀k (i:с) (m:Е),eб-iб=k -> mе<=(aV A e d i m)е /\ ∀q,iб<= q-> q(i7 A[q]!)е<=(aV A e d i m)е:=by intro k;induction k with | zero=> intro i m o;rw[aV,dif_neg λh=>by have:=γ.mp h;omega];exact ⟨le_rfl,λq v g=>by omega⟩ | succ k u=> intro i m o;have h:i>>23)&&&255)) (by rw[al h];omega) rw[UInt32.toNat_max] at r;refine ⟨by omega,λq l g=>?_⟩ by_cases p:q=iб .subst p;rw[<- bt A i (ay j)];unfold i7;omega .exact t q (by rw[al h];omega) g lemma dN (n:о) (e d:о-> i9):∀c i,i+c=n -> dallNZ (jv (n:=n+1) λt=>if tиif tиe tи) (jv (n:=n) λt=>d tи) i c:=by intro c;induction c with | zero=> intro i h;obtain rfl:i=n:=А simp only[dallNZ,ae (i+1) (λt=>if t< i then d t else kf) i А, ae (i+1) (λt=>if t< i then e t else 0x80000000) i А,lt_irrefl,if_false];rfl | succ c g=> intro i h rw[dallNZ,g (i+1) А,dallNZ,ae (n+1) (λt=>if tif t i9) (h:0if tif tby split;exacts [(g t ‹_›).symm,by decide],aU _ _ _ g,aE, dN n d e n 0 А] congr 1 .simp only[lt_irrefl,if_false,show tm kf 0x80000000=0 by decide,add_zero] exact Ο rfl λt j=>by simp only[if_pos (Ν.mp j)];unfold tm;rw[ϔ];ring .simp[h.ne'] end F lemma co {a:о} (h:a<=4294967295):a<2^32:=А end Dense namespace Bn namespace NativeAdd lemma cu (x:Float32):ly x.toModel=ofW x.toBits:= congrArg Model.mk (ofUInt32_bits x.toBits).symm lemma fk (x:Float32):jH (ly x.toModel)=x.toBits:= UInt32.ofNat_toNat lemma aZ (a:i9) (h:i7 a≠255): (kI a).toBits=a/\(kI a).isFinite=true:=by have g:lp (spec:=ju) a.toBitVec≠-1#8:=λd=> h (Η.mp ((show (i7 a)е=(a.toBitVec.extractLsb' 23 8).toNat by simp only[i7,Λ,Ρ,BitVec.extractLsb'_toNat];exact θ _ 8).trans (congrArg BitVec.toNat d:))) have e:(kI a).toBits=a:=by change UInt32.ofBitVec (jA ju (jc ju a.toBitVec))=a rw[Model.pack_unpack_eq,if_neg (g ·.1)] refine ⟨e,?_⟩;change (jc ju (kI a).toBits.toBitVec).isFinite=true;simp only[e,jc,g,ite_false];split_ifs<;>rfl @[noinline] def cN (relu:ф) (a b:т):т:= act relu (toWord (Model.add (ofW a) (ofW b))) @[inline] def cK (relu:ф) (w:т):т:= w&&&~~~((0:т)-((if relu then w>>>31 else 0)&&&(if w&&&0x7FFFFFFF<=0x7F800000 then 1 else 0))) lemma gQ (w:i9):(w&&&0x80000000!=0)=decide (2^31<= wе):=by have e:=w.toNat_lt rw[ϻ,bne_iff_ne,ne_eq,<- Η,Λ,decide_eq_true_iff, show (0x80000000:Е)е=2^31 from rfl,lc] simp only[j5,Nat.testBit,ι,Nat.one_and_eq_mod_two];constructor .intro h;by_contra d;apply h;rw[ϣ А];simp .intro h;rw[show wе/2^31=1 by omega];simp lemma dA (d:ф) (w:i9):cK d w=act d w:=by have v:=w.toNat_lt;have t:(w>>>31)е=wе/2^31:=by rw[Ρ];simp[ι] have m:=Dense.aR w;have q:=Dense.be w have r:(lW w)е=wе%2^23:=by unfold lW;rw[Λ];exact θ _ 23 unfold Dense.aS at m q have o:∀x:i9,x&&&~~~((0:i9)-0)=x:=λx=>by apply Η.mp;rw[Λ];rw[show (~~~((0:i9)-0))е=2^32-1 from rfl,θ,ξ x.toNat_lt] have u:∀x:i9,x&&&~~~((0:i9)-1)=0:=λx=>by apply Η.mp;rw[Λ];simp have j:w>>>31=if 2^31<= wе then 1 else 0:=by apply Η.mp;rw[t];split<;>simp<;>omega have p:(w&&&0x7FFFFFFF<=0x7F800000)↔wе%2^31<=0x7F800000:=by rw[UInt32.le_iff_toNat_le,m];rfl have l:(w&&&0x80000000!=0&&!(i7 w=255&&lW w !=0))=true↔ (2^31<= wе/\wе%2^31<=0x7F800000):=by rw[gQ] simp only[υ,decide_eq_true_eq,Bool.not_eq_true',Bool.and_eq_false_iff,decide_eq_false_iff_not, bne_eq_false_iff_eq,<- Η,q,r,m,jj,j5] omega unfold cK act;cases d .simp only[ο,ite_false,UInt32.zero_and,o] simp only[ite_true];unfold reluW;rw[j];by_cases e:2^31<= wе .rw[if_pos e] by_cases g:wе%2^31<=0x7F800000 .rw[if_pos (p.mpr g),show (1:i9)&&&1=1 from rfl,u,if_pos (l.mpr ⟨e,g⟩)] .rw[if_neg (mt p.mp g),show (1:i9)&&&0=0 from rfl,o,if_neg (λh=>g (l.mp h).2)] .rw[if_neg e,UInt32.zero_and,o,if_neg (λh=>e (l.mp h).1)] @[inline] def add (relu:ф) (a b:т):т:= if expOf a !=255&&expOf b !=255 then cK relu (Float32.ofBits a+Float32.ofBits b).toBits else cN relu a b lemma dV (d:ф) (a b:i9): add d a b=act d (jH (lB (ofW a) (ofW b))):=by unfold add;split .rename_i h rw[dA];simp only[υ,bne_iff_ne] at h;have e:=aZ a h.1;have g:=aZ b h.2;have j:=ExecFloat.Binary.toModel_ofFloat32_add_of_isFinite _ _ e.2 g.2;simp only[ExecFloat.Binary.toModel_ofFloat32,cu,e.1,g.1] at j;rw[show lB (ofW a) (ofW b)=ofW (Float32.ofBits a+Float32.ofBits b).toBits from j.symm,<- cu,fk] .rfl end NativeAdd @[inline] def ad (rb:Е) (a b:т) (_slow:Unit-> т):т:=NativeAdd.add (rb !=0) a b @[specialize] def bW (stop:с) (f:(i:с)-> iб т-> т) (i:с) (x:у т) (h:stopб<= xв):у т:= if hi:i iб i9-> i9) (F:о-> i9-> i9) (l:∀i e w,f i e w=F iб w) (i:с) (x:у i9) (h:dб<= xв): (bW d f i x h)в=xв /\ ∀j,(bW d f i x h)[j]?=if iб<= j/\j refine ⟨by rw[g.1,ϑ],λj=>?_⟩ rw[g.2,Dense.al e,lT,lM А];split_ifs<;>first | rfl | omega | (subst_vars;rw[kL А,Option.map_some,l];rfl) .next i x h e=>exact ⟨rfl,λj=>by rw[if_neg (by rw[γ] at e;omega)]⟩ lemma fd (d:ф) (a b:i9) (e:Unit-> i9) (g:e ()=act d (jH (lB (ofW a) (ofW b)))): ad (if d then 1 else 0) a b e=act d (jH (lB (ofW a) (ofW b))):=by cases d<;>simp[ad,NativeAdd.dV] @[noinline] def gH (relu:ф) (x y:т):т:=act relu (toWord (Model.add (ofW x) (ofW y))) def bq (relu:ф) (a b:у т):у т:= if h:aв<= bв/\aв let y:=b.uget i (by rw[Dense.aa h.2] at hi;omega) ad rb x y λ_=>gH relu x y) 0 a (by rw[Dense.aa h.2]) else addReluSpec relu a b lemma cg:bq=addReluSpec:=by funext d a b;unfold bq;dsimp only split;swap;. rfl rename_i h;have g:=Dense.aa h.2;refine lN λj=>?_ rw[(cI _ _ (λj x=>act d (jH (lB (ofW x) (ofW b[j]!)))) (λi l x=>?_) 0 a _).2 j, addReluSpec,lF] .by_cases e:j>>31)-1) else w lemma fc (d:ф) (w:i9) (m:i7 w≠255):aF d w=act d w:=by unfold aF act reluW;cases d .simp have l:=aP w have j:(w>>>31)е=wе/2^31:=by rw[Ρ];simp[ι] have o:=w.toNat_lt;by_cases h:2^31<= wе .have g:w>>>31=1:=Η.mp (by rw[j];simp only[UInt32.toNat_one];omega) have e:jw w=true:=l.mpr h;unfold jw at e;simp[g,e,m] .have g:w>>>31=0:=Η.mp (by rw[j];simp only[j5];omega) have e:jw w≠true:=λq=>h (l.mp q) unfold jw at e;simp only[Bool.not_eq_true] at e;simp[g,e] lemma fg (S:р) (h:Д) (e:ai S h<0x100000000):i7 (ai S h)л≠255:=by unfold ai at e⊢;dsimp only at e⊢;split at e swap;. exact absurd e Б rename_i d;rw[if_pos d];simp only[υ,decide_eq_true_eq] at d;obtain ⟨⟨⟨-,l⟩,-⟩,-⟩:=d have m:(eF S.toBits)а<2048:=by unfold eF;rw[ψ];exact lt_of_le_of_lt ϙ Б have o:(S.toBits&&&0xfffffffffffff)а<2^52:=by rw[ψ];exact lt_of_le_of_lt ϙ Б rw[ν,Κ] at l;simp only[iZ] at l;have p:1195<=(eF S.toBits)а:=А;have r:=fK S.toBits p;have q:S.toBitsа/2^63<2:=by have:=S.toBits.toNat_lt;omega rw[ν] at e;simp only[iZ] at e;intro g;have j:=congrArg UInt32.toNat g;rw[i7,Λ,Ρ,ϟ] at j;simp only[jj,jb,ι] at j;rw[θ _ 8,ξ e,r] at j;omega @[inline] def cH (relu:ф) (S:р) (hh:Д) (sl:Unit-> т):т:= let c:=ai S hh if c<0x100000000 then aF relu cл else sl () lemma eU (d:ф) (S:р) (e:Д) (g:Unit-> i9):cH d S e g=tf d S e g:=by unfold cH tf;dsimp only;split .rename_i h;rw[fc _ _ (fg _ _ h)] .rfl lemma gS (x w:i9) (e:о) (d:(i7 w)е<= e): |(tm x w:ℝ)| <= |(sv x:ℝ)*2^je x| *2^(lm e 56+23):=by unfold tm;push_cast rw[show (sv x:ℝ)*sv w*2^(je x+je w)=(sv x*2^je x)*(sv w*2^je w) by rw[pow_add];ring,abs_mul] gcongr;rw[abs_mul,abs_pow,abs_two] refine (mul_le_mul (b:=2^24) (by rw[<- ϕ];exact_mod_cast (bV _).le) (pow_le_pow_right₀ Г (by rw[br];omega:_<= max e 56-1)) В В).trans_eq ?_ rw[<- pow_add];congr 1;omega lemma iD (l:ф) (n:о) (j g:о-> i9) (d:i9) (p:о-> р) (F v L:о) (e:i9) (c r:Д) (S:р) (o u:Unit-> i9) (E:∀s fv (p s)/\rv (p s)=tm (j s) (g s)) (Z:S=ac p n 0 (dw kf*dw d)) (N:∀sif sif s u ()=act l (kB (n+1) (λs=>if sif sif sif s(2:ℝ)^a<=2^b:=pow_le_pow_right₀ Г;generalize Y:(if eк<56 then 56 else eк)+23+c=q have hq:qа=lm eе 56+23+cа:=by have:=UInt32.toNat_lt e rw[<- Y];split<;>rename_i h<;>simp only[ν,Χ,μ, iZ] at h⊢<;>omega split;swap;. exact B rename_i hg;simp only[υ,decide_eq_true_eq,ϖ,κ, jj,iZ] at hg generalize W:(if qrename_i h<;>simp only[ν] at h<;>omega have D:∀sby have:=N s m;simp[h] at this;omega have K:=ey kf d Б t.1;generalize y:(∑s∈i0 n,|rv (dw (j s))|)=z at w have I:0<= z:=y ▸ ϡ λ_ _=>abs_nonneg _ rw[zpow_add₀ two_ne_zero,zpow_natCast] at w;have Q:=fw d v t.2;have J:(n:ℝ)<=2^32:=by exact_mod_cast (show n<=2^32 by omega) have X:z<= n*2^277:= y ▸ (Ϗ λs (m:s∈i0 n)=>fW _ (E s (Ν.1 m))).trans_eq (by simp) have hZ:∑s∈i0 n,|(tm (j s) (g s):ℝ)| <= 2^(lm eе 56+23)*z:=by rw[<- y,kJ] exact Ϗ λs m=>by rw[(av _ (E s (Ν.1 m))).2];exact (gS _ _ _ (N s (Ν.1 m))).trans_eq (mul_comm _ _) have U: |(tm kf d:ℝ)| +∑s∈i0 n,|(tm (j s) (g s):ℝ)| <= 2^(968:п):=by rw[show (2:ℝ)^(968:п)=2^967+2^967 by rw[<- two_mul,<- pow_succ'];norm_num] refine add_le_add (Q.trans (P А)) (hZ.trans ((mul_le_mul (P (by omega:_<=400)) (X.trans (mul_le_mul_of_nonneg_right J В)) I В).trans ?_)) rw[<- pow_add,<- pow_add];exact P Г obtain ⟨H,G⟩:=gm p (λs=>(tm (j s) (g s):ℝ)) (tm kf d:ℝ) n (λs m=>hp s m (D s m)) А U n 0 _ А (km _) K.1 (by rw[K.2];simp) rw[<- Z] at H G have hT:(ah (n+1) (λs=>if sif sby simp[Ν.1 m] have V: |rv S-(ah (n+1) (λs=>if sif sif sif sby by_cases h:ksimp only[h,↓reduceIte];exacts [⟨E k h,D k h⟩,⟨by decide,t.1⟩] rw[fO _ _ _ hf S H A А V x] .exact hk D lemma fu (d:ф) (n:о) (g h:о-> i9) (p:о-> р) (e:Unit-> р) (L:о) (m:Unit-> i9) (z:∀s split next y=> obtain ⟨l,j⟩:=eK _ _ (tm (g n) (h n)) n r.2а t.1 t.2.1 z n 0 _ 0 rfl А o.1 (by simp[o.2]) (by rw[w]) rw[w] at j l have x:((r.2а+L-1076)ж)а=r.2а+L-1076:=by rw[jL,Ξ (by simp only[jT];omega)] refine congrArg _ (fO _ _ _ q _ l _ (by rw[x];omega) ?_ y) rw[aE,x];unfold ah;push_cast;rw[add_comm] exact j.trans ((mul_le_mul_of_nonneg_right (by exact_mod_cast (by omega:n<=2^L):(n:ℝ)<=2^L) В).trans_eq (by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact congrArg (2^·) А)) .exact v .rw[if_neg Б];exact v end F end Dense namespace Sr structure Ent {α:Type} (f:у т-> у т-> о-> α) where w:у т b:у т n:о v:α ok:v=f w b n a:с structure St {α:Type} (f:у т-> у т-> о-> α) where e:у (Ent f) x:ByteArray hd:о tl:о u:о structure Tab {α:Type} (f:у т-> у т-> о-> α) where r:ST.Ref Unit (St f) z:Ent f zx:ByteArray cap:о variable {α:Type} {f:у i9-> у i9-> о-> α} def Tab.gM (f:у т-> у т-> о-> α) (N cap:о):Tab f:= let z:Ent f:=⟨#[],#[],0,f #[] #[] 0,rfl,0⟩ let zx:ByteArray:=⟨Array.replicate (4*N) 0⟩ ⟨(ST.Prim.mkRef ⟨Array.replicate N z,zx,0,0,0⟩ (Void.mk ())).val,z,zx,cap⟩ @[inline] def Ent.dh (e:Ent f) (w b:у т) (n:о):ф:= e.n==n&&withPtrEq e.w w (λ_=>e.w==w) (λh=>by rw[h];simp)&& withPtrEq e.b b (λ_=>e.b==b) (λh=>by rw[h];simp) lemma Ent.cx {e:Ent f} {w b:у i9} {n:о} (h:e.dh w b n=true):e.v=f w b n:=by simp only[Ent.dh,withPtrEq,υ,beq_iff_eq] at h;obtain ⟨⟨d,g⟩,j⟩:=h;rw[e.ok,d,g,j] @[inline] def Ent.sz (e:Ent f):о:=e.wв+e.bв+64 @[inline] def hs (a:с):с:=(((a>>>4).toUInt64*0x9E3779B97F4A7C15)>>>48).toUSize lemma ul {β:Type} {a:у β} {i:с} (h:i с-> ByteArray | 0,_=>x | p+1,i=> let k:=i&&&m if h:k St f-> St f | 0,s=>s | p+1,s=>if s.u+sz<= t.cap then s else St.eH t sz p (s.dX t.z) @[noinline] def Tab.cU (t:Tab f) (w b:у т) (n:о) (a:с):{y // y=f w b n}:= let y:=f w b n let q:Ent f:=⟨w,b,n,y,rfl,a⟩ let sz:=q.sz if 4*sz<= t.cap then let s:=(ST.Prim.Ref.get t.r (Void.mk ())).val let s:=St.eH t sz s.eв s let s:=if (s.e.getD s.tl t.z).w.isEmpty then s else s.dX t.z let e:=s.e.setIfInBounds s.tl q let x:=eX e (t.zx.usize-1) 0 t.zx let o:=(ST.Prim.Ref.swap t.r ⟨e,x,s.hd,(s.tl+1)%eв,s.u+sz⟩ (Void.mk ())).val if o.u=0xFFFFFFFFFFFF then if h:(o.e.getD 0 t.z).dh w b n=true then ⟨_,Ent.cx h⟩ else ⟨y,rfl⟩ else ⟨y,rfl⟩ else ⟨y,rfl⟩ def St.cr (s:St f) (t:Tab f) (w b:у т) (n:о) (a m:с):о-> с-> {y // y=f w b n} | 0,_=>t.cU w b n a | p+1,i=> let k:=i&&&m if h:kSubtype.ext (p.2.trans q.2.symm)⟩ @[inline] def Tab.get (t:Tab f) (w b:у т) (n:о):{y // y=f w b n}:= withPtrAddr w (λa=> let s:=(ST.Prim.Ref.get t.r (Void.mk ())).val s.cr t w b n a (s.x.usize-1) s.x.size (hs a)) (λ_ _=>Subsingleton.elim _ _) end Sr open Sr namespace Dense namespace F namespace Pn def dR (X:у т) (st:с):о-> с-> с-> FloatArray-> р-> FloatArray | 0,_,o,Y,a=>wF Y o a | k+1,q,o,Y,a=>let v:=rX X q;dR X st k (q+st) (o+1) (wF Y o v) (a+v.abs) def dO (X:у т) (st s m:с) (n:о):о-> с-> с-> FloatArray-> FloatArray | 0,_,_,Y=>Y | k+1,q,o,Y=>dO X st s m n k (q+s) (o+m) (dR X st n q o Y 0) def qL (W:у т) (su m:с) (n:о):о-> с-> FloatArray-> FloatArray | 0,_,Y=>Y | k+1,q,Y=>qL W su m n k (q+m) (bx W su 1 n q (q+1) Y) lemma dv (q d:с) (τ:о):q+d+τг*d=q+(τ+1)г*d:=by rw[ϛ,ϛ,USize.ofNat_add,USize.add_mul,show USize.ofNat 1=1 from rfl,USize.one_mul, USize.add_assoc,USize.add_comm d] lemma uz (q d:с):q+(0:о)г*d=q:=by simp[ϛ,show USize.ofNat 0=0 from rfl] lemma dH (X:у i9) (d:с):∀k (q o:с) (Y:FloatArray) (a:р), Yд<2^32-> oб+k (dR X d k q o Y a)д=Yд /\ (∀i,i i(dR X d k q o Y a).data[i]! =Y.data[i]!) /\ (∀τ(rX X (q+τг*d)).abs) k 0 a:=by intro k;induction k with | zero=> intro q o Y a g l;rw[dR,dx Y g,ac,if_neg А];refine ⟨bD ..,λi e v=>?_,λτ h=>absurd h А,?_⟩ .rw[sg _ _ _ _ e,if_neg А] .rw[sg _ _ _ _ l,if_pos А] | succ k u=> intro q o Y a g l;have:=ς have e:(o+1)б=oб+1:=by rw[ab (by simp only[jd];omega)];simp only[jd] rw[dR,dx Y g] obtain ⟨m,p,r,t⟩:=u (q+d) (o+1) (Y.set! oб (rX X q)) (a+(rX X q).abs) (by rw[bD];exact g) (by rw[bD,e];omega) rw[bD] at m;refine ⟨m,λi j w=>?_,λτ h=>?_,?_⟩ .rw[p i (by rw[bD];exact j) А,sg _ _ _ _ j,if_neg А] .rcases τ with _ | τ .rw[p _ (by rw[bD];omega) А,sg _ _ _ _ А,if_pos А,uz] .have:=r τ А rw[e,show oб+1+τ=oб+(τ+1) by omega] at this rw[this,dv] .have:=t rw[e,show oб+1+k=oб+(k+1) by omega] at this rw[this];conv_rhs=>rw[ac,if_pos А,b7 _ k _ 0 _ rfl] simp only[dv,uz] lemma dF (X:у i9) (d s m:с) (n:о) (v:mб=n+1) (F:n+1<2^32): ∀k (q o:с) (Y:FloatArray),Yд<2^32-> oб+k*(n+1)<= Yд -> (dO X d s m n k q o Y)д=Yд /\ (∀i,i i(dO X d s m n k q o Y).data[i]! =Y.data[i]!) /\ (∀j(rX X (q+jг*s+τг*d)).abs) n 0 0):=by intro k;induction k with | zero=>intro q o Y _ _;exact ⟨rfl,λ_ _ _=>rfl,λj h=>absurd h А,λj h=>absurd h А⟩ | succ k z=> intro q o Y p w;rw[ϋ] at w;have:=ς;have g:(o+m)б=oб+(n+1):=by rw[ab А,v] obtain ⟨e,A,B,D⟩:=dH X d n q o Y 0 p А obtain ⟨u,l,x,y⟩:=z (q+s) (o+m) (dR X d n q o Y 0) (by rw[e];exact p) (by rw[e,g];omega) rw[e] at u;rw[dO];refine ⟨u,λi r E=>?_,λj h τ t=>?_,λj h=>?_⟩ .rw[l i (by rw[e];exact r) А,A i r А] .rcases j with _ | j .rw[la,Ϫ,l _ (by rw[e];omega) А,B τ t,uz] .have:=x j А τ t rw[g,show oб+(n+1)+j*(n+1)=oб+(j+1)*(n+1) by rw[ϋ];omega] at this rw[this,dv] .rcases j with _ | j .rw[la,Ϫ,l _ (by rw[e];omega) А,D] simp only[uz] .have:=y j А rw[g,show oб+(n+1)+j*(n+1)=oб+(j+1)*(n+1) by rw[ϋ];omega] at this rw[this];simp only[dv] lemma dP (W:у i9) (d m:с) (n:о) (A:mб=8*n) (B:dб=n): ∀k (q:с) (Y:FloatArray),2*(qб+k*(8*n))+32*n<2^32-> qб+k*(8*n)+1<= Yд -> (qL W d m n k q Y)д=Yд /\ (∀i,i(qL W d m n k q Y).data[i]! =Y.data[i]!) /\ ∀gintro q Y _ _;exact ⟨rfl,λ_ _=>rfl,λg h=>absurd h А⟩ | succ k E=> intro q Y x y;rw[ko,l0] at x y;have:=ς;have e:(q+m)б=qб+8*n:=by rw[ab А,A] have j:(q+1)б=qб+1:=by rw[ab (by simp only[jd];omega)];simp only[jd] obtain ⟨u,v,w⟩:=dD W d 1 n q (q+1) Y (by simp only[jd,j];omega) (by rw[j];omega) simp only[jd,ϱ,B,j] at v w;obtain ⟨p,t,D⟩:=E (q+m) (bx W d 1 n q (q+1) Y) (by rw[e];omega) (by rw[u,e];omega) rw[u] at p;rw[qL];refine ⟨p,λi z=>?_,λg h τ o r l=>?_⟩ .rw[t i А,v i z] .rcases g with _ | g .rw[la,Ϫ,t _ (by rw[e];omega),w τ r o l,Ϫ] .have:=D g А τ o r l rw[e,show qб+8*n+g*(8*n)=qб+(g+1)*(8*n) by rw[ko,l0];omega] at this exact this @[inline] def pp (V P:FloatArray) (vo xb r s:о):р:=V.get! (vo+s)*P.get! (xb+8*s+r) @[noinline] def sQ (n:о) (relu:ф) (X W b:@& у т) (V P:@& FloatArray) (vo xb r xo st j:о):т:= tS relu (Nat.log2 (n+1)+1) n (pp V P vo xb r) (λ_=>dw oneW*dw b[j]!) λ_=>ap n relu X W b xo st j @[inline] def pO (relu ok:ф) (hh:Д) (n:о) (X W b:у т) (xo st o r:о) (V P:FloatArray) (vo:с) (q:с) (on:ф) (acc:у т) (S:р):у т:= if h:on=true/\qsQ n relu X W b V P voб (o*n+1) r xo st (o+r)) else ap n relu X W b xo st (o+r)) (ay h.2) else acc @[noinline] def fP (relu ok:ф) (hh:Д) (n:о) (X W b:у т) (xo st o:о) (q0 so mu:с) (V P:FloatArray) (vo:с) (a0 a1 a2 a3 a4 a5 a6 a7:р) (acc:у т):у т:= pO relu ok hh n X W b xo st o 7 V P vo (q0+7*so) (decide (7< mu)) (pO relu ok hh n X W b xo st o 6 V P vo (q0+6*so) (decide (6< mu)) (pO relu ok hh n X W b xo st o 5 V P vo (q0+5*so) (decide (5< mu)) (pO relu ok hh n X W b xo st o 4 V P vo (q0+4*so) (decide (4< mu)) (pO relu ok hh n X W b xo st o 3 V P vo (q0+3*so) (decide (3< mu)) (pO relu ok hh n X W b xo st o 2 V P vo (q0+2*so) (decide (2< mu)) (pO relu ok hh n X W b xo st o 1 V P vo (q0+1*so) (decide (1< mu)) (pO relu ok hh n X W b xo st o 0 V P vo (q0+0*so) (decide (0< mu)) acc a0) a1) a2) a3) a4) a5) a6) a7 lemma dI (d Z:ф) (N:Д) (n:о) (X W b:у i9) (B A o:о) (r l p:с) (V P:FloatArray) (vo:с) (D E G H J K L M:р) (m:у i9) (F:о-> i9) (as:rб+8*lб<=4294967295) (hz:mв<=4294967295) (hv:∀k<8,k(if Z then cH d (A8.f ⟨D,E,G,H,J,K,L,M⟩ k) N (λ_=>sQ n d X W b V P voб (o*n+1) k B A (o+k)) else ap n d X W b B A (o+k))= F (rб+k*lб)): Iv F m (λq=>∃k,k<8/\k∃j,j k<8->(k USize.toNat z=I k)-> on=decide (k Q (k+1) (pO d Z N n X W b B A o k V P vo z on a (A8.f ⟨D,E,G,H,J,K,L,M⟩ k)):=by intro k a z on ⟨h1,y⟩ hk S x;unfold pO;split next v=> have w:k?_⟩ rw[lT,lM,hv k hk w];by_cases h:zб=q .subst h;simp[S w,I] .rw[if_neg h] exact ⟨(y q).1,λ⟨j,O,t,u⟩=>(y q).2 ⟨j,Nat.lt_of_le_of_ne (Nat.le_of_lt_succ O) λe=>by subst e;exact h ((S t).trans u.symm),t,u⟩⟩ next v=> refine ⟨h1,λq=>⟨(y q).1,λ⟨j,O,t,u⟩ U=>(y q).2 ⟨j,Nat.lt_of_le_of_ne (Nat.le_of_lt_succ O) λe=>v ⟨by simp[x];omega,?_⟩,t,u⟩ U⟩⟩ subst e;rw[γ,kk,aa А,S t,<- u];omega have Y:∀c:с,cб<8->(r+c*l)б=rб+cб*lб:=λc v=>by have m1:cб*lб<=8*lб:=Ζ _ v.le have e:(c*l)б=cб*lб:=by rw[li,<- Ϟ,ξ А] rw[ab А,e] unfold fP refine g 7 (g 6 (g 5 (g 4 (g 3 (g 2 (g 1 (g 0 ?_ ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_) ?_ ?_ ?_ all_goals first | decide | (intro _;rw[Y _ (by simp only[jd];omega)];simp only[jd,I]) | simp only[γ,jd] | simp[Q,Iv] def pk (V P:FloatArray) (vo nu:с) (hs:Vд<2^32/\Pд<2^32) (hV:voб+nuб<= Vд) (t i:с) (hi:iб+8*(nuб-tб)<= Pд) (a0 a1 a2 a3 a4 a5 a6 a7:р) (relu ok:ф) (hh:Д) (n:о) (X W b:у т) (xo st o:о) (q0 so mu:с) (acc:у т): у т:= if h:t iб=j+8*tб -> pk V P d g hs Y t i I v w x y z A B D l M H n X W b S Q o N O L u= fP l M H n X W b S Q o N O L V P d (ac (pp V P dб j 0) gб tб v) (ac (pp V P dб j 1) gб tб w) (ac (pp V P dб j 2) gб tб x) (ac (pp V P dб j 3) gб tб y) (ac (pp V P dб j 4) gб tб z) (ac (pp V P dб j 5) gб tб A) (ac (pp V P dб j 6) gб tб B) (ac (pp V P dб j 7) gб tб D) u:=by intro m;induction m<;>intro t i I v w x y z A B D hm K .rw[pk,dif_neg (by rw[γ];omega)] have e:∀p a,ac p gб tб a=a:=λp a=>by rw[ac,if_neg А] simp only[e] rename_i ih;have:=ς;have J:tбby rw[ac,if_pos J] have e:∀(c:с) (r:о) (G:cб=r) (Z:r<8) (E:(d+t)бby rw[ug,ug,pp,gg,gg,hw,ab А,K,G] rw[pk,dif_pos h] rw[ih (t+1) (i+8) _ _ _ _ _ _ _ _ _ (by rw[al h];omega) (by rw[al h,U,K];ring),al h, q 0 v,q 1 w,q 2 x,q 3 y,q 4 z,q 5 A,q 6 B,q 7 D] simp only[e 0 0 (by simp) А,e 1 1 (by simp) А,e 2 2 (by simp) А,e 3 3 (by simp) А, e 4 4 (by simp) А,e 5 5 (by simp) А,e 6 6 (by simp) А,e 7 7 (by simp) А] @[specialize] def l2 (U V:о) (f:о-> о-> у т-> у т) (u v:о) (a:у т):у т:= if u о-> у i9-> у i9) (F:о-> i9) (C:о-> о-> о-> Prop) (D:∀u v a,u v aв=N-> Iv F a (C u v) (f u v a)) (u v:о) (a:у i9): aв=N->(∀q,(∃d g,d q a[q]?=some (F q)) -> (l2 U V f u v a)в=aв /\ ∀q,(∃d g,d q(l2 U V f u v a)[q]?=some (F q):=by induction u,v,a using l2.induct U V f with | case1 u v a m x y=> intro w r;rw[l2,if_pos m,if_pos x];obtain ⟨E,z⟩:=D u v a m x w obtain ⟨G,H⟩:=y А λq ⟨d,g,o,p,A,l⟩ j=>by have t:qH q B А⟩ | case2 u v a m x y=> intro w r;rw[l2,if_pos m,if_neg x];exact y w λq ⟨d,g,o,p,A,l⟩ j=>r q ⟨d,g,o,p,by omega,l⟩ j | case3 u v a m=> intro w r;rw[l2,if_neg m];exact ⟨rfl,λq ⟨d,g,o,p,l⟩ j=>r q ⟨d,g,o,p,by omega,l⟩ j⟩ lemma d6 (U V N:о) (f:о-> о-> у i9-> у i9) (F:о-> i9) (C:о-> о-> о-> Prop) (l:∀u v a,u v aв=N-> Iv F a (C u v) (f u v a)) (j:∀q,q ∃u v,uF qи:=by obtain ⟨p,e⟩:=dJ U V N f F C l 0 0 (jM N 0) (by simp) λq ⟨r,t,_,_,h,_⟩ _=>А apply lN;intro q;by_cases d:qdw oneW*rX bw oг) (8*G) (FloatArray.emptyWithCapacity (8*G)),bw,aI W 0 0,aI bw 0 0⟩ def oF (t:ф) (R n ow:о) (relu:ф) (X W b:у т) (q:о):т:= act relu (dotOf (n+1) (λs=>if sif s о) (g:о-> р) (o:∀τ(g τ).abs) n 0 0))а:п)+56)+ 2^(-900:п):=by have m:0<= ∑τ∈i0 n,|rv (dw X[f τ]!)| :=ϡ λ_ _=>abs_nonneg _ have e:∑τ∈i0 n,|rv (dw X[f τ]!)| <= 2^(400:п):=by refine (Ϗ λτ _=>fW _ (j _)).trans ?_ have:(n:ℝ)<=2^29:=by exact_mod_cast h.le rw[kg,ϯ,nsmul_eq_mul] calc (n:ℝ)*2^(277:п)<=2^29*2^(277:п):=by gcongr _<=2^(400:п):=by rw[<- zpow_natCast,<- zpow_add₀ two_ne_zero];exact zpow_le_zpow_right₀ Г Г obtain ⟨l,d⟩:=gm (λτ=>(g τ).abs) (λτ=> |rv (dw X[f τ]!)|) 0 n (λτ p=>by rw[o τ p];exact gE _ (av _ (j _)).1) А (by simpa using e.trans (zpow_le_zpow_right₀ Г (by norm_num:(400:ℤ)<=968))) n 0 0 rfl (km _) f0.1 (by simp[f0.2]) simp only[abs_zero,zero_add,abs_abs] at d;exact dE n h _ _ l m e d lemma cX (t:ф) (R n d:о) (l:ф) (X W u:у i9) (Y Q B:FloatArray) (F:р) (hb e6:Д) (G:ф) (N:Yд<2^32/\Qд<2^32) (x:Bд<2^32) (e:i9) (S U L:о) (a1:L=Nat.log2 (n+1)+1) (a6:e6=if eк<56 then 56 else eк) (w:G=decide (e<255)) (hF:F=(9*(n+1))ж.toInt64.toFloat) (a7:hb=(S+L-50)ж) (hx:∀q:о,i7 X[q]!≠255) (A:∀q:о,i7 u[q]!≠255/\je u[q]! <= U) (ba:174+U<= S) (hL:n+2<=2^L) (z:L<=27) (H:S+L<=425) (hn:8*n<2^32) (he:∀q:о,(i7 W[q]!)е<= eе) (b1:R*(n+1)<= Yд) (a4:∀j∃k,k<8/\8*g+kby rw[ug,ab А,p,hc,as _ ho] have a3:∀h,Y.uget (r*(n+1)+n)г h=Y.data[r*(n+1)+n]!:=λh=>by rw[ug,ts h1.le N.1] have m1:8*g*R<= d*R:=Ζ R bz.le;have m2:r*d<= R*d:=Ζ d M.le;have cm:d*R=R*d:=ϩ _ _ have D:(if t then 8*g*R+r else r*d+8*g)гб=if t then 8*g*R+r else r*d+8*g:= aa (by cases t<;>simp only[ο,↓reduceIte]<;>omega) have E:(if t then R else 1)гб=if t then R else 1:= aa (by cases t<;>simp only[ο,↓reduceIte]<;>omega) have J:(min 8 (d-8*g))гб=min 8 (d-8*g):=aa А have hI:∀k,(if t then 8*g*R+r else r*d+8*g)+k*(if t then R else 1)= if t then (8*g+k)*R+r else r*d+(8*g+k):=λk=>by cases t<;>simp only[ο,↓reduceIte,ϱ,ko]<;>omega have dm:∀a c m:о,c< m->(a*m+c)/m=a/\(a*m+c)%m=c:=λa c m h=> ⟨by rw[ϔ,kc _ _ А,ϣ h,j6], by rw[ϔ,ϵ,ξ h]⟩ unfold eO;dsimp only;rw[dif_pos ⟨h1,h2,y⟩,fl _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (8*g*n+1) _ _ _ _ _ _ _ _ _ _ _ _ rfl (by rw[bv];simp)] simp only[a3,bo,O,Ϥ];refine cz _ _ _ _ _ (λq ⟨k,hk,w,hq⟩=>⟨k,hk,?_,?_⟩) (dI _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a _ ?_ А λk hk bd=>?_) .rw[D,E];cases t<;>simp only[ο,↓reduceIte]<;>omega rotate_left .rw[J];omega .rw[D,E,hI];exact hq rw[J] at bd;have w:8*g+k(simp only[A8.f];exact congrArg (ac _ n 0) (a0 _ _ (by simp only[jd]) А _ w)) rw[hA];simp only[O] have K:∀s fv (pp Y Q (r*(n+1)) (8*g*n+1) k s) /\ rv (pp Y Q (r*(n+1)) (8*g*n+1) k s)=tm X[(if t then r else r*n)+s*(if t then R else 1)]! W[(8*g+k)*n+s]!:= λs v h=>by rw[pp,gg,gg,a4 r M s v,hQ g hg s v k hk];exact ey _ _ (hx _) h have I:ap n l X W u (if t then r else r*n) (if t then R else 1) (8*g+k)= act l (kB (n+1) (λs=>if sif sX[(if t then r else r*n)+s*(if t then R else 1)]!) (λs=>W[(8*g+k)*n+s]!) u[8*g+k]! (pp Y Q (r*(n+1)) (8*g*n+1) k) S U _ e _ _ _ (λ_=>ap n l X W u (if t then r else r*n) (if t then R else 1) (8*g+k)) (λ_=>sQ n l X W u Y Q (r*(n+1)) (8*g*n+1) k (if t then r else r*n) (if t then R else 1) (8*g+k)) (λs _=>hx _) (A _) ba hL z H hn K rfl (λs _=>he _) (a5 r M) (Nat.le_trans (ff _ _) (by decide:969<=1000)) ?_ I (λhw=>?_)).trans ?_ .rw[jL,Ξ (by simp only[jT];omega)] .refine fu _ _ _ _ _ _ _ _ (λs v=>?_) ?_ (λs _=>?_) hL z I .simpa only[if_pos v] using K s v (hw s v) .simpa only[lt_irrefl,↓reduceIte] using ey kf u[8*g+k]! Б (A _).1 .by_cases h:ssimp only[h,↓reduceIte] exacts [⟨hx _,hw s h⟩,⟨by decide,(A _).1⟩] .unfold oF cases t .obtain ⟨V,Z⟩:=dm r (8*g+k) d w simp only[V,Z,ο,↓reduceIte,ϱ] .obtain ⟨V,Z⟩:=dm (8*g+k) r R M simp only[V,Z,↓reduceIte] @[inline] def eI (t:ф) (R n ow:о) (relu:ф) (X W:у т) (d:PD) (ex:т) (Y:FloatArray):у т:= let L:=Nat.log2 (n+1)+1 let ib:=174+(d.ebе-1) if h:ex<255/\d.eb<255/\ib+L<=425/\L<=27/\0 ap n relu X W d.bw (if t then qи%R else qи/ow*n) (if t then R else 1) (if t then qи/R else qи%ow) @[inline] def dt (t:ф) (R n ow:о) (relu:ф) (X W:у т) (d:PD) (ex:т):у т:= eI t R n ow relu X W d ex (dO X (if t then R else 1)г (if t then 1 else n)г (n+1)г n R (0:о)г 0 (zT ((R*(n+1)+7)/8))) lemma dM (W b:у i9) (n d:о) (w:0dw kf*rX (pd W b n).bw oг) (8*((O+7)/8)) _ (jE (8*((O+7)/8))) rfl (km _) have p:(pd W b n).Q=qL W nг (8*n)г n ((O+7)/8) (0:о)г (zT (n*((O+7)/8)+1)):=by simp only[pd,q];rfl have m:(pd W b n).B=bk (λo=>dw kf*rX (pd W b n).bw oг) (8*((O+7)/8)) (jE (8*((O+7)/8))):=by simp only[pd,q] refine ⟨λg v=>?_,λg v τ A r z=>?_,?_,λo y=>?_⟩ .have:=Ζ (8*n) (show g+1<=(O+7)/8 by omega) rw[ko,l0] at this;rw[p,B,show 8*g*n=g*(8*n) by ac_rfl];omega .have:=D g А τ A r z rw[h,j6] at this;rw[p,show 8*g*n=g*(8*n) by ac_rfl,this] congr 2;rw[ko,show 8*g*n=g*(8*n) by ac_rfl];omega .rw[m,e.1];omega .rw[m,e.2.2 o (km _) А] rw[dr _ l,aa А] lemma dp {c:Prop} [Decidable c] {α:Type} {a:c-> α} {b:¬c-> α} {y:α} (d:∀h:c,a h=y) (e:∀h,b h=y):dite c a b=y:=by by_cases h:c .rw[dif_pos h];exact d h .rw[dif_neg h];exact e h lemma cG (t:ф) (R n d:о) (e:ф) (X W b:у i9) (A:i9) (x:A=aI X 0 0): dt t R n d e X W (pd W b n) A=jv (n:=R*d) λq=>oF t R n d e X W (pd W b n).bw qи:=by have ul:=ς;unfold dt eI;dsimp only;refine dp (λh=>?_) λ_=>?_ swap .congr 1;funext q;unfold oF;cases t<;>simp only[ap,cJ,ϱ,↓reduceIte,ο] obtain ⟨L,U,V,Z,g5,g6,g7,g8,g9,u,v,M,N,O,Q,S⟩:=h;obtain ⟨G,H,I,J⟩:=dM W b n d g5 g8 g9 (co u);have D:=da X А (x ▸ L);have w:=da (pd W b n).bw А U have he:∀q:о,(i7 W[q]!)е<=(pd W b n).eе:=λq=>by by_cases m:qomega have z:(if t then 1 else n)<2^32:=by cases t<;>simp only[ο,↓reduceIte]<;>omega have y:(if t then R else 1)<2^32:=by cases t<;>simp only[ο,↓reduceIte]<;>omega have K:=dF X (if t then R else 1)г (if t then 1 else n)г (n+1)г n (aa А) А R (0:о)г 0 _ hZ (by simp only[Ϥ,j6];omega) simp only[Ϥ,j6] at K;obtain ⟨K1,-,E,F⟩:=K have p:∀jby have m1:=Ζ (if t then 1 else n) l.le;have m2:=Ζ (if t then R else 1) (show τ<= n+1 by omega) rw[dr X А,io 0 _ _ j τ z y А А А];cases t<;>simp only[ο,↓reduceIte,j6,ϱ] generalize dO X (if t then R else 1)г (if t then 1 else n)г (n+1)г n R (0:о)г 0 _=Y at* refine d6 _ _ _ _ _ (λg r q=>∃k,k<8/\8*g+kcX t R n d e X W _ Y _ _ _ _ _ _ _ _ (pd W b n).e _ ((pd W b n).ebе-1) _ rfl rfl rfl rfl rfl (λq=>(D q).1) w le_rfl hL Z V А he А (λj l τ o=>by rw[E j l τ o,p j l τ o]) (λj l=>by rw[F j l] exact cR X n А (λq=>(D q).1) (λτ=>(if t then j else j*n)+τ*(if t then R else 1)) _ (λτ o=>p j l τ o)) G H I J v g r hg hr a ha) λq m=>?_ have hw:0by subst h;simp at m have hR:0by subst h;simp at m cases t .have h1:=lk q d have B:=ϳ q hw;refine ⟨q%d/8,q/d,by omega,ϲ (by rwa[ϩ]),q%d%8,by omega,by omega,?_⟩ simp only[ο,↓reduceIte];rw[ϩ (q/d)];omega .have h1:=lk q R have B:=ϳ q hR;have h3:q/R?_ simp only[Array.size_ofFn] at e;have r:q/n< m:=ϲ e have w:(pd A #[] k).bw[q/n]! =0x80000000:=by rw[p,getElem!_pos _ _ (by rw[ϴ];omega),Array.getElem_replicate] simp only[Ϩ,oF,↓reduceIte,w,act,ϣ (show q< m*n by rwa[ϩ]), ξ r,la,j6,ο] exact (F.dz k (λt=>A[q/n*k+t]!) (λt=>B[q%n+t*n]!) j λt _=>⟨(u _).1,(v _).1⟩).trans (by simp only[ϔ (q%n)]) end Pn end F end Dense section open Float.Model.UnpackedFloat local notation "ZA" => rationalWord local notation "ZB" => Array Word local notation "ZC" => Core.mW local notation "ZD" => Core.iW local notation "ZE" => FloatFormat.toModel Fmt local notation "ZF" => zpow_natCast local notation "ZG" => UInt64.toNat_ofNat' local notation "ZH" => decide_eq_true_eq local notation "ZI" => Core.aN local notation "ZJ" => Nat.div_eq_zero_iff_lt local notation "ZK" => sqrtLower local notation "ZL" => zpow_add₀ local notation "ZM" => Finset.range local notation "ZO" => mantOf_lt_24 local notation "ZQ" => two_ne_zero local notation "ZR" => Core.an local notation "ZS" => Core.bf local notation "ZT" => roundRational local notation "ZU" => Nat.div_add_mod' local notation "ZV" => Nat.div_le_self local notation "ZW" => mantOf local notation "ZX" => signOf local notation "ZY" => beq_iff_eq local notation "ZZ" => idxOf local notation "XA" => ite_false local notation "XB" => zpow_sub₀ local notation "XC" => two_ne_zero' local notation "XD" => mul_assoc local notation "XE" => ExtendedMantissa.ofMantissaAndAccuracy local notation "XF" => UInt64.ofNat local notation "XG" => Bool.xor local notation "XH" => rowVariance local notation "XI" => (А) local notation "XJ" => (В) local notation "XK" => (by simp) 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 (R k:о) (d:Accuracy): XE (2*R+Ya d) .exact>>>(k+2)= XE R d>>>(k+1):=by show Nat.repeat jB (k+2) _= Nat.repeat jB (k+1) _ rw[Yc,Yc,Yc];congr 1;rcases d with _ | ⟨_ | _ | _⟩<;> simp[ExtendedMantissa.ofMantissaAndAccuracy,jB,Ya]<;>omega open FloatLib.Numerics in lemma VY (q r D t:о) (e:0rfl,<-h, show (q*D+r)/D=q by rw[ϔ,kc _ _ e,ϣ d,zero_add], show (q*D+r)%D=r by rw[ϔ,ϵ,ξ d]] lemma Y5 (e:п):Model.bpow e=(2:ℝ)^e:=by rfl lemma Vi (q b:о) (d:q≠0) (h:b<=1):(2*q+b)з=qз+1:=by have e:=kU d;have g:=Ϸ (n:=q);rw[Nat.log2_eq_iff XI];omega open FloatLib.Numerics in lemma V0 (s:ф) (P d:о) (o:P≠0) (l:d≠0) (q r D:о) (x:0omega have g:=Vi q _ j y;have G:(r:ℝ)/D<1:=by rw[div_lt_one XJ];exact_mod_cast t have E:(0:ℝ)<=r/D:=XJ;push_cast at u v;have w:RationalBinary.floorLog2 P d=(qз:п)+e:=by apply Model.floorLog2_eq_of_bounds P d _ .rw[h,Y5,ZL ZQ,ZF];gcongr;grind .rw[h,Y5,show (qз:п)+e+1=((qз+1:о):п)+e by push_cast;ring,ZL ZQ,ZF];gcongr;linarith have p:kQ (j7 P d (23-((qз:п)+e))).1 (j7 P d (23-((qз:п)+e))).2= roundShiftRightEven (2*q+if r=0 then 0 else 1) ((2*q+if r=0 then 0 else 1)з-23):=by rw[roundShiftRightEven_eq_roundQuotientEven,g,show qз+1-23=(qз-23)+1 by clear*-m g;omega,<-VY q r D _ x t XI] apply Model.roundQuotientEven_eq_of_rat_eq _ _ _ _ (RationalBinary.scaleByPowerOfTwo_snd_ne_zero _ _ _ l) XJ rw[Model.scaleByPowerOfTwo_real];unfold Model.scaledRatToReal;rw[h,Y5,XD,<-ZL ZQ, show e+(23-((qз:п)+e))=-((qз-23:о):п) by clear*-m g;omega, zpow_neg,ZF] push_cast;field_simp generalize F:2*q+(if r=0 then 0 else 1)=J at g p⊢;rw[i8,ite_eq_left Б,Model.ieeeRoundDyadic_eq_internal];simp only[Model.roundRat,Model.roundRatScaled,show Fmt.isIEEE=true by decide,↓reduceDIte, Model.ieeeRoundRatScaled,Model.Internal.ieeeRoundDyadic,ZY,o,l,XA,w, Int.add_zero,kl,g,show (FloatFormat.ieeeMaxNormalExponent lr:п)=127 by decide, show FloatFormat.ieeeMinNormalExponent lr=-126 by decide, show (FloatFormat.normalMantissaExpOffset lr:п)=150 by decide, show Fmt.fracWidth=23 by decide,show J≠0 by omega, show ((qз+1:о):п)+(e-1)=(qз:п)+e by push_cast;ring, show¬((qз:п)+e>127) by omega,show¬((qз:п)+e< -150) by omega, show¬((qз:п)+e< -126) by omega,show 23<=qз+1 by omega,ite_true, j0,p] lemma Y8 (v:ℚ) (w:v≠0) (s:ф) (u:decide (v<0)=s) (q:о) (ρ:ℚ) (o:0<=ρ) (g:ρ<1) (e:п) (j:|v|=((q:ℚ)+ρ)*(2:ℚ)^e) (p:2^25<=q) (l:-126<=(qз:п)+e) (m:(qз:п)+e<=126): ZT v= jH (i8 lr ⟨s,2*q+(if ρ=0 then 0 else 1),e-1⟩):=by have h:ρ=(ρ.numй:ℚ)/ρ.den:=by conv_lhs=>rw[<-Rat.num_div_den ρ] congr 1;exact_mod_cast (kv (Rat.num_nonneg.mpr o)).symm have d:=ρ.den_pos;generalize ρ.den=D,ρ.numй=r at h d;subst h;have t:r(z:ℝ)) j;rw[Rat.abs_def,Rat.divInt_eq_div] at this;push_cast at this;rwa[ku,ϕ] lemma Q7 (R:о) (s:п) (h:2^25<=R): -s+1<=(ZE).targetExponent (jl R (-s)):=by have:=(Ϧ XI).2 h;have:(ZE).mantissaBits<=25:=Б;unfold Float.Model.Format.targetExponent jl;omega lemma Vd (v:ℚ) (q:0simp lemma YN (w:i9):(sv w:ℚ)=0↔ZW w=0:=by unfold sv;split_ifs<;>simp lemma Vr (w:i9):(sv w:ℚ)=(if ZX w then-1 else 1)*ZW w:=by unfold sv;simp lemma Y7 (x:Д):(ZR x)а=xаз:=by rw[aG];rfl lemma YK (w:i9):(ZC w==0)=decide (ZW w=0):=by by_cases h:ZW w=0 .have:ZC w=0:=Β.mp (by rw[ZI,h];rfl);grind .have:ZC w≠0:=λd=>h (by rw[<-ZI,d];rfl) grind lemma Yk (n:о) (f:о->ℚ) (a:ℚ): (List.range n).foldl (λt j=>t+f j) a=a+∑j∈ZM n,f j:=by induction n generalizing a with | zero=>simp | succ n d=> rw[List.range_succ,List.foldl_append,d,ϝ];simp;ring def Yf (num den:о) (s:п):т:= toWord (Model.ofModel Fmt (roundWithAccuracy (ZE) .positive (ZK num den) (-s) (sqrtAccuracy num den))) open Float.Model in lemma Q4 (spec:Format) (g:lR) (R:о) (e:п) (d:Accuracy) (l:R≠0) (p:e+1<= spec.targetExponent (jl R e)): kR spec g R e d=lG spec g (2*R+Ya d) (e-1):=by have m:Ya d<=1:=by cases d<;>simp[Ya] have h:jl (2*R+Ya d) (e-1)=jl R e:=by unfold jl;rw[Vi R _ l m];omega unfold lG decreaseExponent;simp only[h];rw[show (e-1-spec.targetExponent (jl R e))й=0 by omega];simp;unfold kR shiftToTargetExponent shiftToExponent;rw[h];generalize o:spec.targetExponent (jl R e)=T at* obtain ⟨k,j⟩:∃k,(T-e)й=k+1:=⟨(T-e)й-1,XI⟩;dsimp only;rw[j,show (T-(e-1))й=k+2 by omega,QA,show e-1+((k+2:о):п)=e+((k+1:о):п) by push_cast;ring] 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 (e d:о) (s:п) (p:33554432<= ZK e d) (l:ZK e d>>>31=0) (m:-209<= s) (o:s<=297): Yf e d s=aC false (XF (2*ZK e d+ (if e=ZK e d*ZK e d*d then 0 else 1))) (XF (297-s)й):=by set R:=ZK e d with g have h:(XF (297-s)й)а=(297-s)й:=by rw[ZG,ξ XI] have q:(if e=R*R*d then 0 else 1)<=1:=by split_ifs<;>omega have j:(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,ξ XI] rw[ax _ _ _ XI,h,j];unfold Yf;rw[<-g,Q4 _ _ R (-s) _ XI (Q7 R s XI),Vh,<-g,sq, show (((297-s)й:о):п)-298=-s-1 by omega] rfl def V8 (B:о) (c:п):о:=if 0<=c then B<<rw[Μ] .refine ⟨e,?_⟩;push_cast;rw[<-ZF (2:ℚ) cй,show ((cй:о):п)=c by omega];ring .refine ⟨XJ,?_⟩;push_cast;rw[<-ZF (2:ℚ) (-c)й,show (((-c)й:о):п)=-c by omega];have:(2:ℚ)^(-c)≠0:=XJ;rw[zpow_neg];grind @[inline] def V2 (r:о) (st:ф):о:=if r !=0 || st then 1 else 0 lemma VI (N M:о) (e:0decide (v<0)=s) (p:0<=δ) (q:δ<1) (w:l=true↔δ≠0) (x:0simp only[ite_true,ο,ite_false] at j⊢<;>rw[w] at j<;> constructor<;>linarith only[j,r,t,p,q] end NF namespace NE open NF Dense.F open Dense (au) @[inline] def mx (a b:Д):Д:=if arename_i h<;>simp only[ν] at h<;>omega @[inline] def pk (s:ф) (q σ:Д):т:= ((if s then (0x80000000:Д) else 0)+((σ-146)<<<23+Core.aj (((2:Д)*q+1)<<<36)))л lemma gb (s:ф) (q σ:Д) (j:2^25<= qа) (l:qа<2^26) (m:146<= σа) (o:σа<=398):pk s q σ=aC s ((2:Д)*q+1) σ:=by have d:((2:Д)*q+1)а=2*qа+1:=by rw[μ,Ϛ];simp only[iZ];omega have g:(((2:Д)*q+1)<<<36)а=(2*qа+1)*2^36:=by rw[Ι,d];simp only[iZ,jb,Μ];omega have h:(σ-36)а=σа-36:=by rw[χ σ 36 (κ.2 (by simp only[iZ];omega))];rfl have e:aC s ((2:Д)*q+1) σ=aC s (((2:Д)*q+1)<<<36) (σ-36):=by rw[cD s ((2:Д)*q+1) σ А А, cD s (((2:Д)*q+1)<<<36) (σ-36) А А,d,g,h, show (2:п)^σа=2^36*2^(σа-36) by rw[<- pow_add,Nat.add_sub_cancel' (show 36<= σа by omega)]] cases s<;>simp only[ite_true,ite_false,ο]<;>push_cast<;>ring_nf have p:(pk s q σ)е=(if s then 2^31 else 0)+((σа-146)*2^23+ (aj (((2:Д)*q+1)<<<36))а):=by obtain ⟨-,-,t⟩:=bT s (((2:Д)*q+1)<<<36) (σ-36) А А А А;unfold pk rw[ϟ,μ,μ,Ι, χ σ 146 (κ.2 (by simp only[iZ];omega))] cases s<;>simp only[ite_true,ite_false,ο,iZ,jb,Μ]<;>omega obtain ⟨r,-,-⟩:=bT s (((2:Д)*q+1)<<<36) (σ-36) А А А А;rw[e];apply Η.mp;omega lemma mo (a:ℝ) (p q:ℕ) (h: |a| <= 2^p) (d:p<= q): |a| <= 2^q:= h.trans (pow_le_pow_right₀ Г d) lemma z9 (a:ℝ) (p:ℕ) (h: |a| <= 2^p) (d:p<=971): |a| <= (2:ℝ)^(971:ℤ):=by rw[show (971:ℤ)=((971:ℕ):ℤ) from rfl,zpow_natCast];exact mo a p 971 h d lemma wB (w:i9): |(sv w:ℝ)*2^je w| <= 2^(24+je w):=by rw[abs_mul,abs_of_pos (by positivity:(0:ℝ)<2^idxOf w),pow_add] have: |(sv w:ℝ)| <= 2^24:=by rw[<- ϕ,kO];exact_mod_cast (eT w).le exact mul_le_mul_of_nonneg_right this В end NE namespace NR open NF Dense.F open Dense (au) @[inline] def pt (j:о):р:=P.get! (j+1) lemma iC (j:о) (g:j<=254):fv (pt j)/\rv (pt j)=(2:ℝ)^j:=by have h:pt j=pw j:=by have d:P.get! (j+1)=P.data[j+1]!:=by rcases P with ⟨e⟩;rfl unfold pt;rw[d,getElem!_pos P.data (j+1) (by simp[P];omega)] simp only[P,Ϩ];rw[if_pos А];rfl rw[h];exact gh j А lemma iy (n:о) (g:n<2^29):fv nж.toInt64.toFloat/\rv nж.toInt64.toFloat=n:=by have d:nжа=n:=Ξ (show n<2^64 by omega) have e:nж.toInt64н=n:=by show bi nж=n;rw[au,d];split<;>omega have:=cy _ (by rw[e];simp;omega);rw[e] at this;omega lemma d0 (a:ZB) (h:∀i (d:iα) (h:k< m): (jv f)[k]! =f ⟨k,h⟩:=by rw[getElem!_pos _ k (by simpa using h),Ϩ] @[inline] def SN (rows n:о) (eps:т) (x g:ZB):ф:= rows>0&&n>0&&xв==rows*n&&gв==n&&x.all finiteWord&&g.all finiteWord&&finiteWord eps&&(!ZX eps&&ZC eps !=0) lemma e9 (e n:о) (d:i9) (x g:ZB):SN e n d x g=ji e n d x g:=by unfold SN ji;congr 1;rw[Q6,Y2];have:(0:ℚ)<2^((ZZ d:п)-149):=XJ;unfold sg;cases ZX d<;>simp[this,Nat.pos_iff_ne_zero] lemma fI {d n:о} {e:i9} {x g:ZB} (h:ji d n e x g=true): 0 i7 x[i]!≠255)/\∀j,j i7 g[j]!≠255:=by simp only[ji,υ,ZH,gt_iff_lt] at h;have p:xв=d*n:=by simpa using h.1.1.1.1.1.2 have l:gв=n:=by simpa using h.1.1.1.1.2 exact ⟨h.1.1.1.1.1.1.2,h.2,λi m=>NR.d0 x (by simpa[j8] using h.1.1.1.2) i А, λj o=>NR.d0 g (by simpa[j8] using h.1.1.2) j А⟩ namespace NF open Dense.F lemma gR (x y:р) (d:fv x) (e:fv y): i6 (x-y).toModel=Model.sub (i6 x.toModel) (i6 y.toModel):=by change i6 (l7 x.toModel y.toModel)=_;rw[l7,Ϣ] have h:=Model.sub_eq_ofModel_sub_of_isFinite (fmt:=i5) Б (i6 x.toModel) (i6 y.toModel) (by rw[Θ];exact (bB x).1 d) (by rw[Θ];exact (bB y).1 e) rw[Θ,Θ] at h;exact h.symm lemma il (x y:р) (d:fv x) (e:fv y) (j: |rv x-rv y| <= jJ (kG i5)): fv (x-y)/\rv (x-y)=kh i5 (rv x-rv y):=by have h:=gR x y d e have g:=Model.isFinite_sub_of_abs_toReal_sub_le_posMaxFinite (i6 x.toModel) (i6 y.toModel) Б d e j refine ⟨by unfold fv;rw[h];exact g,?_⟩ unfold rv;rw[h];exact Model.toReal_sub_eq_roundAt _ _ Б g lemma iT (x:р):ki (i6 x.sqrt.toModel)=ki (Model.sqrt (i6 x.toModel)):=by change ki (i6 (lZ x.toModel))=_;rw[lZ,Ϣ,show jt=FloatFormat.binary64.toModel from rfl];have h:=Model.canonicalizeModel_sqrt_eq_model (fmt:=i5) Б (i6 x.toModel);rw[Θ] at h;rw[<- h,Model.toModel_canonicalizeModel] lemma ir {y z:Model i5} (h:ki y=ki z):jW y=jW z/\jJ y=jJ z:=by constructor .rw[<- Ϝ,ϧ _ Б,<- Ϝ,ϧ _ Б,h] .rw[ό Б,ό Б,h] lemma iS (x:р) (l:fv x) (g:0rfl | true=> exfalso;rw[e] at g;simp only[jz,j] at g;have:(0:ℝ)<=(d.significand:ℝ)*(2:ℝ)^d.exponent:=В;simp only[jC,j] at g;rw[kl] at g;push_cast at g;linarith lemma ik (x:р) (e:fv x) (h:0norm_num rw[abs_sub_comm] at l;generalize (1:ℝ)/2^1075=τ at* refine ⟨g,?_⟩;rw[show rv r-1/rv y=(rv r*rv y-1)/rv y by field_simp,abs_div,abs_of_pos d];gcongr norm_num at*;linarith end NF open NF Dense.F @[inline] def pq (B:Д):т:=(((B>>>63)<<<31)+(((B&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29)-((1045:Д)<<<23))л lemma iM (q:Д) (h:qа<2^26):(aj ((2*q+1)<<<36))а=(qа+2)/4:=by have e:((2*q+1)<<<36)а=(2*qа+1)*2^36:=by simp only[Ι,μ,Ϛ,iZ,jb,Μ];omega unfold aj;simp only[Α,μ,ψ,e,iZ,jb,ι,kF];generalize qа=a at* obtain ⟨k,j,d,rfl⟩:∃k j,j<8/\a=8*k+j:=⟨a/8,a%8,ϳ _ Г,(lk a 8).symm⟩;interval_cases j<;>omega lemma g0 (B:Д):(eF B)а=Bа/2^52%2048:=by unfold eF;rw[ψ,Α];simp only[iZ,jb,ι];exact θ _ 11 lemma iu (B:Д):(mF B)а=Bа%2^52+2^52:=by rw[f8,ψ];congr 1;exact θ _ 52 lemma iA (B:Д) (d:146<=(eF B-900)а) (e:(eF B-900)а<=398):pq B=NE.pk (B>>>63!=0) (mF B>>>27) (eF B-900):=by have g:(eF B)а=Bа/2^52%2048:=by unfold eF;rw[ψ,Α];simp only[iZ,jb,ι];exact θ _ 11 have h:=f8 B;have q:(B&&&0xfffffffffffff)а=Bа%2^52:=by rw[ψ];exact θ _ 52 have j:(B>>>63)а=Bа/2^63:=by rw[Α];simp only[iZ,jb,ι] have p:(B&&&0x7FFFFFFFFFFFFFFF)а=Bа%2^63:=by rw[ψ];exact θ _ 63 have t:=B.toNat_lt;rw[q] at h;have l:(mF B>>>27)а=(Bа%2^52+2^52)/2^27:=by rw[Α,h];simp only[iZ,jb,ι] have o:(eF B-900)а=Bа/2^52%2048-900:=by rw[Κ,g];simp only[iZ] at d e⊢;rw[Κ,g] at d e;simp only[iZ] at d e;omega have m:=iM (mF B>>>27) (by rw[l];omega) rw[l] at m have r:(B>>>63!=0)=decide (Bа/2^63=1):=by rw[ϻ];simp only[bne_iff_ne,ne_eq,decide_eq_true_eq,<-Β,j,iZ];omega apply Η.mp;unfold pq NE.pk;rw[r] simp only[ϟ,μ,Κ,Ι,Α, j,p,o,m,iZ,jb,Μ,ι] rw[o] at d e;generalize Bа=N at* split<;>simp only[iZ,decide_eq_true_eq] at*<;>omega lemma gc (B:Д) (d:1046<=(eF B)а) (e:(eF B)а<=1298):pq B=NE.pk (B>>>63!=0) (mF B>>>27) (eF B-900):=by have:(eF B-900)а=(eF B)а-900:=χ _ _ (κ.2 (by simp only[iZ];omega)) exact iA B А А lemma tc (B c:Д) (l:c<=25) (h:(B&&&0x7FFFFFF)-((1:Д)<<0 by norm_num) omega lemma te (E:Д) (h:E-1046<=252):1046<=Eа/\Eа<=1298:=by have d:=κ.1 h;rw[Κ] at d;have:=E.toNat_lt;simp only[iZ] at d;omega lemma cl (V:р) (w:fv V) (c:ℕ) (Z:ℝ) (g:1046<=(eF V.toBits)а) (q:(eF V.toBits)а<=1298) (j:2^c>>27)а/\(mF V.toBits>>>27)а<2^26/\ ((mF V.toBits>>>27)а:ℝ)*2^(((eF V.toBits)а:п)-1048)<(if V.toBits>>>63!=0 then-Z else Z)/\ (if V.toBits>>>63!=0 then-Z else Z)<(((mF V.toBits>>>27)а:ℝ)+1)*2^(((eF V.toBits)а:п)-1048):=by have o:¬eF V.toBits=0:=λh=>by rw[h] at g;simp at g have d:=aK V w o;rw[aw] at d;have p:=iu V.toBits;have r:(V.toBits&&&0xfffffffffffff)а=V.toBitsа%2^52:=by rw[ψ];exact θ _ 52 rw[r,show V.toBitsа%2^52+2^52=(mF V.toBits)а by rw[p]] at d have t:V.toBitsа%2^27=(mF V.toBits)а%2^27:=by rw[p];omega rw[t] at j l;have m:=fo _ Z _ _ _ _ c В d rfl j l u;have v:(mF V.toBits>>>27)а=(mF V.toBits)а/2^27:=by rw[Α];simp only[iZ,jb,ι] have x:=V.toBits.toNat_lt have e:(2:ℝ)^27*2^(((eF V.toBits)а:п)-1075)=2^(((eF V.toBits)а:п)-1048):=by rw[<-zpow_natCast,<-zpow_add₀ Г];congr 1;push_cast;ring rw[v];refine ⟨by omega,by omega,?_,?_⟩ .rw[<-e,<-mul_assoc];exact m.1 .rw[<-e,<-mul_assoc];exact m.2 lemma eC (V:р) (K:fv V) (c:ℕ) (Y:ℚ) (l:1046<=(eF V.toBits)а) (m:(eF V.toBits)а<=1298) (r:2^c>>27)а with J;set s:=V.toBits>>>63!=0 with N;set E:=(eF V.toBits)а with M;set e:ℤ:=(E:ℤ)-1197 with u;have k:∀a:ℝ,a*2^((E:ℤ)-1048)=a*2^e*2^149:=λa=>by rw[mul_assoc,<-zpow_natCast (2:ℝ) 149,<-zpow_add₀ Г];congr 2;rw[u];push_cast;ring have F:(if s then-((Y:ℝ)*2^149) else (Y:ℝ)*2^149)=((if s then-Y else Y:ℚ):ℝ)*2^149:=by split<;>push_cast<;>ring rw[k,F] at G;rw[k,F] at D;have A:=lt_of_mul_lt_mul_right G В;have v:=lt_of_mul_lt_mul_right D В;have p:(q:ℚ)*2^e<(if s then-Y else Y):=by exact_mod_cast (by push_cast;ring:(((q:ℚ)*2^e:ℚ):ℝ)=(q:ℝ)*2^e).trans_lt A have w:(if s then-Y else Y)<((q:ℚ)+1)*2^e:=by exact_mod_cast v.trans_eq (by push_cast;ring:((q:ℝ)+1)*2^e=((((q:ℚ)+1)*2^e:ℚ):ℝ)) have o:(0:ℚ)<2^e:=В;have j:0<(if s then-Y else Y):=lt_of_le_of_lt В p;have d:|Y|=(if s then-Y else Y):=by grind set δ:ℚ:=(if s then-Y else Y)/2^e-q with x;have y:0<δ:=by rw[x,sub_pos,lt_div_iff₀ o];exact p have z:δ<1:=by rw[x,sub_lt_iff_lt_add,div_lt_iff₀ o];linarith only[w] have g:qз=25:=le_antisymm (Nat.lt_succ_iff.1 ((lu А).2 H)) ((Ϧ А).2 B) rw[<-Qx s q true 1 e Y δ ((2:Д)*(mF V.toBits>>>27)+1) (eF V.toBits-900) (by intro _;split at d<;>rename_i h<;>simp only[h,ite_true,ο,ite_false] at j⊢<;> simp only[decide_eq_true_eq,decide_eq_false_iff_not,not_lt]<;>linarith only[j]) y.le z (by grind) one_pos (by rw[d,x];field_simp;ring) (by simpa using B) (by simp[g];omega) (by simp[g];omega) (by rw[μ,Ϛ];simp[V2,<-J];omega) (by rw[L];omega)] lemma dC (t:р) (N:fv t) (w:ℕ) (v:ℚ) (p:0>>27)а with Y;set E:=(eF t.toBits)а with W;have X:0>>63!=0)=false:=by by_contra h;simp only[Bool.not_eq_false] at h;rw[if_pos h] at l;linarith[show (0:ℝ)<=(q:ℝ)*2^((E:ℤ)-1048) by positivity] rw[I] at l o;simp only[ο,ite_false] at l o;set s:ℤ:=1197-E with M;have k:(2:ℝ)^149=2^s*2^((E:ℤ)-1048):=by rw[<-zpow_natCast,<-zpow_add₀ two_ne_zero];congr 1;omega rw[k,<-mul_assoc] at l o;have O:=lt_of_mul_lt_mul_right l В;have Q:=lt_of_mul_lt_mul_right o В have j:(ja v*2^s)^2=(v:ℝ)*2^(2*s):=by rw[mul_pow,lb (by exact_mod_cast p.le),<-zpow_natCast,<-zpow_mul];ring_nf have B:(q:ℝ)^2<(v:ℝ)*2^(2*s):=by rw[<-j];exact pow_lt_pow_left₀ O В Г have D:(v:ℝ)*2^(2*s)<((q:ℝ)+1)^2:=by rw[<-j];exact pow_lt_pow_left₀ Q В Г have L:0(z:ℝ)) r;push_cast at this;exact this rw[<-G] at B D;have H:(0:ℝ)this ((aP w).1 d)) have q:(i7 w)е≠255:=by rw[g,h];omega refine ⟨λd=>q (by rw[d];rfl),o,?_⟩ have e:i7 w≠0:=λd=>by rw[d] at g;simp at g;omega unfold sv jF je;rw[o,if_neg e,if_neg e];simp only[ο,ite_false];rw[t,g,h];rcases Nat.lt_or_ge R (2^24) with r|r .have l:(K*2^23+R)/2^23%256=K+1:=А have m:(K*2^23+R)%2^23=R-2^23:=А;rw[l,m,show K+1-1=K by omega,Nat.cast_add,k9 p];push_cast;ring .have j:R=2^24:=А subst j;have l:(K*2^23+2^24)/2^23%256=K+2:=А;have m:(K*2^23+2^24)%2^23=0:=А;rw[l,m,show K+2-1=K+1 by omega];push_cast;ring lemma iB (B:Д) (r:1046<=(eF B)а) (t:(eF B)а<=1298) (h:Bа<2^63): (pq B)е=((eF B)а-1046)*2^23+(2^23+(Bа%2^52+2^28)/2^29):=by have q:=g0 B;have d:(eF B)а=Bа/2^52:=by rw[q];exact ξ А have j:((B>>>63)<<<31)а=0:=by rw[Ι,Α];simp only[iZ,jb,ι,Μ];rw[ϣ h] have l:(B&&&0x7FFFFFFFFFFFFFFF)а=Bа:=by rw[ψ];simp only[iZ];rw[show 9223372036854775807=2^63-1 by norm_num,θ];exact ξ h have m:(((B&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29)а=(Bа+2^28)/2^29:=by rw[Α,μ,l];simp only[iZ,jb,ι];rw[ξ А];norm_num have o:(Bа+2^28)/2^29=Bа/2^52*2^23+(Bа%2^52+2^28)/2^29:=А have e:(((B>>>63)<<<31)+(((B&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29))а=(Bа+2^28)/2^29:=by rw[μ,j,m,zero_add];exact ξ А have g:((1045:Д)<<<23)а=1045*2^23:=Б have p:(((B>>>63)<<<31)+(((B&&&0x7FFFFFFFFFFFFFFF)+0x10000000)>>>29)-((1045:Д)<<<23))а=(Bа+2^28)/2^29-1045*2^23:=by rw[χ _ _ (κ.2 (by rw[e,g];omega)),e,g] unfold pq;rw[ϟ,p,o,d];omega lemma bP (b:р) (g:fv b) (l:0>>63!=0)=false:=by by_contra d;simp only[Bool.not_eq_false] at d;rw[d,if_pos rfl] at h;have:(0:ℝ)<=((b.toBits&&&0xfffffffffffff)а+2^52:ℕ)*(2:ℝ)^(((eF b.toBits)а:п)-1075):=В;push_cast at this h;linarith rw[e] at h;simp only[ο,ite_false] at h;refine ⟨?_,?_⟩ .have:b.toBits>>>63=0:=by simpa using e have:=congrArg jI this;rw[Α] at this;simp only[iZ,jb,ι] at this;have:=UInt64.toNat_lt b.toBits;omega .rw[h];congr 2;rw[ψ];simp only[iZ];rw[show (4503599627370495:ℕ)=2^52-1 by norm_num,θ] lemma iz (b:р) (m:fv b) (j:0by rw[h] at d;simp at d) have q:=iB b.toBits d l o;obtain ⟨w,x,y⟩:=wV _ _ _ q А А А;refine ⟨w,x,?_⟩;rw[y,p];set E:=(eF b.toBits)а;set F:=b.toBitsа%2^52;set R:=2^23+(F+2^28)/2^29;have r:R*2^29<= F+2^52+2^28:=А;have t:F+2^52+2^28dw a[j]!) aв (FloatArray.emptyWithCapacity aв) lemma af (a:ZB):(aq a)д=aв/\∀j,j(aq a).data[j]! =dw a[j]!:=by have d:(jE aв)д=0:=rfl;obtain ⟨e,-,g⟩:=bM (λj=>dw a[j]!) aв aв _ (by rw[d];omega) (by rw[d];omega) exact ⟨e,λj h=>g j (by rw[d];omega) h⟩ lemma ao (X:FloatArray) (i:с) (h:iбр) (x:ZB) (e:с) (he:eб<= xв) (hb:eб+1<2^32) (i:с) (hi:iб<= eб) (s t:р):р:= have:=ς if h:i+1р) (x:ZB) (e:с) (O:eб<= xв) (N:eб+1<2^32) (d:о) (w:о->ℝ) (v:∀k,d<= k->kfv (f x[k]!)/\|rv (f x[k]!)|<= w k) (V:∑k∈jr d eб,w k<=2^960) (hn:eб<= d+2^29) (i:с) (W:iб<= eб) (s t:р) (c:о) (m q o r:ℝ) (hc:iб=d+2*c) (G:fv s) (H:fv t) (E:|rv s-m|<= c*((1/2^53+1/2^73)*o+1/2^1074)) (F:|rv t-q|<= c*((1/2^53+1/2^73)*r+1/2^1074)) (y:|m|<= o) (z:|q|<= r) (M:m+q=∑k∈jr d iб,rv (f x[k]!)) (l:o+r=∑k∈jr d iб,w k): fv (PP f x e O N i W s t)/\|rv (PP f x e O N i W s t)-∑k∈jr d eб,rv (f x[k]!)|<= (((eб-d:ℕ):ℝ)+3)/2*((1/2^53+1/2^73)*∑k∈jr d eб,w k)+(((eб-d:ℕ):ℝ)+1)*(1/2^1074):=by have S:∀k,d<= k->k0<= w k:=λk u L=>(abs_nonneg _).trans (v k u L).2 have Q:∀j≤eб,∑k∈jr d j,w k<=2^960:=λj hj=>(ϸ (Finset.Ico_subset_Ico_right hj) (λk hk _=>(Finset.mem_Ico.1 hk).elim (S k))).trans V have:=(abs_nonneg _).trans y;have:=(abs_nonneg _).trans z;have:=ς;rw[PP];dsimp only;split next h=> have u:=u1 (i:=i) А;have h0:=γ.mp h;have L:(i+1+1)б=iб+1+1:=by rw[u1 А,u] rw[ak x i А,ak x (i+1) А,u];obtain ⟨I,J⟩:=v iб А А;obtain ⟨g3,g4⟩:=v (iб+1) А А have U:∀g:ℕ->ℝ,∑k∈jr d (i+1+1)б,g k=∑k∈jr d iб,g k+g iб+g (iб+1):=λg=>by rw[L,ϐ А,ϐ А] have:=Q _ (by omega:(i+1+1).toNat<=_);rw[U,<-l] at this have:=S iб А А;have:=S (iб+1) А А;obtain ⟨A,B,D⟩:=ew s _ m o (w iб) c А G I E y J (by linarith) obtain ⟨X,Y,Z⟩:=ew t _ q r (w (iб+1)) c А H g3 F z g4 (by linarith) exact fy f x e O N d w v V hn (i+1+1) А _ _ (c+1) _ _ _ _ А A X B Y D Z (by rw[U,<-M];ring) (by rw[U,<-l];ring) next h=> split next K=> have h0:=γ.mp K;have u:=u1 (i:=i) А;have p:eб=iб+1:=by have:=mt γ.mpr h;omega rw[ak x i А];obtain ⟨I,J⟩:=v iб А А;have:=Q (iб+1) А;rw[ϐ А,<-l] at this;obtain ⟨A,B,D⟩:=ew s _ m o (w iб) c А G I E y J (by linarith) rw[p,ϐ А,ϐ А,<-M,<-l,add_right_comm m,add_right_comm o];exact ga _ t _ q _ r (c+1) c _ А А А А A H B F D z (by linarith) next K=> have p:eб=iб:=by have:=mt γ.mpr K;omega rw[p,<-M,<-l];exact ga s t m q o r c c _ А А А А G H E F y z (by rw[l];exact Q _ А) termination_by eб-iб decreasing_by all_goals omega lemma fz (f:i9->р) (x:ZB) (e:с) (h:eб<= xв) (g:eб+1<2^32) (d:с) (j:dб<= eб) (w:о->ℝ) (m:∀k,dб<= k->kfv (f x[k]!)/\|rv (f x[k]!)|<= w k) (l:∑k∈jr dб eб,w k<=2^960) (o:eб<= dб+2^29): fv (PP f x e h g d j 0 0)/\|rv (PP f x e h g d j 0 0)-∑k∈jr dб eб,rv (f x[k]!)|<= (((eб-dб:ℕ):ℝ)+3)/2*((1/2^53+1/2^73)*∑k∈jr dб eб,w k)+(((eб-dб:ℕ):ℝ)+1)*(1/2^1074):= fy f x e h g dб w m l o d j 0 0 0 0 0 0 0 А df.1 df.1 (by rw[df.2];simp) (by rw[df.2];simp) (by simp) (by simp) (by simp) (by simp) structure RS where ok:ф m:р ri:р d:т A:Д @[inline] def rq (y r:р):ф:=eF r.toBits<1100&&(r*y).toBits-0x3FEFFFFFFFFFFFFF<2 @[inline] def dn (V:р) (w:Д) (k:Д->ф):ф×т:= let B:=(Float.sqrt V).toBits let t:=(1:Д)<<ф) (Ep rn:р) (x:ZB) (lo hi:с) (h:hiб<= xв) (hb:hiб+1<2^32) (hl:loб<= hiб):RS:= let m:=PP dw x hi h hb lo hl 0 0*rn let V:=PP (λw=>let d:=dw w-m;d*d) x hi h hb lo hl 0 0*rn+Ep let t:=dn V Ln k let D:=dw t.2 let ri:=1/D let a:=eF m.toBits let b:=eF D.toBits let mD:=if b<= a then a-b+1 else 0 ⟨t.1&&Ln+mD<=25&&rq D ri,m,ri,t.2,Ln+mD+1047⟩ @[inline] def rR (Ln:Д) (k:Д->ф) (Ep rn:р) (x:ZB) (lo hi:с) (h:hiб<= xв) (hb:hiб+1<2^32) (hl:loб<= hiб):RS:= let V:=PP (λw=>let d:=dw w;d*d) x hi h hb lo hl 0 0*rn+Ep let t:=dn V Ln k let D:=dw t.2 let ri:=1/D ⟨t.1&&rq D ri,0,ri,t.2,0⟩ @[noinline] def sL (n:о) (x:ZB) (r:о) (xw gw bw d:т):т:=ZT ((ZA xw-rowMean n x r)*ZA gw/ZA d+ZA bw) def mL (x:ZB) (b:о):о->Д->Д | 0,u=>u | k+1,u=>let w:=x[b]!;let i:=Core.iW w;mL x (b+1) k (if Core.mW w==0||u< i then u else i) @[inline] def zS (w:т) (lo:Д):о:=let M:=Core.mW w;let h:=Core.iW w-lo;if h<=38 then (M<<о->о->о×о | 0,p,q=>(p,q) | k+1,p,q=>let w:=x[b]! if Core.mW w==0 then sS x lo (b+1) k p q else if ZX w then sS x lo (b+1) k p (q+zS w lo) else sS x lo (b+1) k (p+zS w lo) q @[noinline] def sI (n:о) (x:ZB) (r:о) (xw gw bw d:т):т:= let lo:=mL x (r*n) n 255 let S:=sS x lo (r*n) n 0 0 let X:=if Core.mW xw==0 then 0 else n*zS xw lo let T:=(if ZX xw then-(X:п) else X)-((S.1:п)-S.2) let s1:п:=(loа:п)+idxOf gw-idxOf d let s2:п:=idxOf bw let f:=min s1 s2 let md:=ZW d let P:=T*sv gw*((1<<<(s1-f)й:о):п)+sv bw*(n*md:о)*((1<<<(s2-f)й:о):п) let Q:=n*md let a:=Pм let k1:п:=26+(Qз:п)-(aз:п) let k:=if V8 a k1/YF Q k1<67108864 then k1 else k1-1 let W:=V8 a k let Dd:=YF Q k let q:=W/Dd let e:=f-149-k if 0(mL x b k u)а<= je x[b+j]!:=by intro k;induction k with | zero=>intro b u;exact ⟨le_rfl,λj h=>absurd h (Nat.not_lt_zero _)⟩ | succ k m=> intro b u;simp only[mL];generalize l:(if mW x[b]! ==0||u< iW x[b]! then u else iW x[b]!)=v have d:vа<= uа/\(ZW x[b]!≠0->vа<= je x[b]!):=by rw[<-l];have:=ZS x[b]!;split<;>rename_i h<;>simp only[lg,YK,decide_eq_true_eq,ν,not_or,not_lt] at h<;>omega obtain ⟨o,e⟩:=m (b+1) v;refine ⟨by omega,λj p g=>?_⟩ rcases j with _|j .have:=d.2 g;simp only[Ϫ] at*;omega .have:=e j А (by rwa[show b+1+j=b+(j+1) by omega]);rw[show b+1+j=b+(j+1) by omega] at this;exact this lemma eZ (w:i9) (d:Д) (h:dа<= je w):zS w d=ZW w*2^(je w-dа):=by have o:=ZS w;have j:=ZI w;have m:=ZO w;have g:(iW w-d)а=je w-dа:=by rw[χ _ _ (κ.2 А),o] unfold zS;dsimp only;split<;>rename_i l .have e:je w-dа<=38:=by have:=κ.1 l;rw[g] at this;simpa using this rw[Ι,j,g,ξ (show je w-dа<64 by omega),Μ] apply ξ;calc ZW w*2^(je w-dа)<2^24*2^38:=Nat.mul_lt_mul_of_lt_of_le m (Ε Г e) В _=2^62:=Г _<2^64:=Г .rw[Μ,j,g] lemma iR (x:ZB) (d:Д):∀k b p q,(∀jdа<= je x[b+j]!)-> ((sS x d b k p q).1:ℤ)-(sS x d b k p q).2=(p:ℤ)-q+∑j∈ZM k,sv x[b+j]!*2^(je x[b+j]!-dа):=by intro k;induction k with | zero=>intro b p q _;simp[sS] | succ k m=> intro b p q h;have e:∀jdа<= je x[b+1+j]!:=λj r=>by rw[show b+1+j=b+(j+1) by omega];exact h _ А rw[jY,Ο rfl (λt _=>by rw[show b+(t+1)=b+1+t by omega]),Ϫ] simp only[sS];split<;>rename_i l .rw[m _ _ _ e];have:ZW x[b]! =0:=by simpa[YK] using l simp[sv,this] .have g:=h 0 А (by simpa[YK] using l);simp only[Ϫ] at g split<;>rename_i o<;>rw[m _ _ _ e,eZ _ _ g]<;>simp[sv,o]<;>ring lemma c7 (w:i9) (d:ℕ) (h:ZW w=0\/d<= je w):((ZA w:ℚ))=(sv w*2^(je w-d):ℤ)*(2:ℚ)^((d:ℤ)-149):=by rw[Y1];rcases h with h|h .have:(sv w:ℚ)=0:=(YN w).2 h;rw[this];simp[show sv w=0 by exact_mod_cast this] .push_cast;rw[mul_assoc,<-zpow_natCast,<-zpow_add₀ Г];congr 2;push_cast[h];ring lemma gj (n:о) (x:ZB) (r:о):jo n x r=(((sS x (mL x (r*n) n 255) (r*n) n 0 0).1:ℤ)-(sS x (mL x (r*n) n 255) (r*n) n 0 0).2:ℤ)*(2:ℚ)^(((mL x (r*n) n 255)а:ℤ)-149)/n:=by obtain ⟨-,d⟩:=el x n (r*n) 255;generalize mL x (r*n) n 255=e at d⊢;have g:=iR x e n (r*n) 0 0 (λj l h=>d j l h) unfold jo;rw[Yk,zero_add];congr 1;rw[g];simp only[kS,sub_zero,zero_add];push_cast;rw[϶];refine Ο rfl λt m=>?_ rw[c7 _ eа (by by_cases h:ZW x[r*n+t]! =0;exact Or.inl h;exact ma (d t (Ν.1 m) h))];push_cast;ring lemma iP (n:о) (x:ZB) (r j:о) (z y d:i9) (O:jpush_cast<;>field_simp have J:=Y1 z;have F:=Y1 y;have G:=Y1 d;have K:(sv d:ℚ)=v:=by unfold sv;simp[hd,v] have l:(ZA x[r*n+j]!-jo n x r)*ZA z/ZA d+ZA y=(P:ℚ)*2^f/(Q*2^149)\/Q=0:=by by_cases o:Q=0;exact ma o;left;have as:(v:ℚ)≠0:=by intro h;apply o;simp only[Q];exact_mod_cast (show n*v=0 by rw[show v=0 by exact_mod_cast h];simp) rw[hX,t,J,F,G,K];have L:(2:ℚ)^(A-f)=2^A/2^f:=by rw[zpow_sub₀ Г] have M:(2:ℚ)^(B-f)=2^B/2^f:=by rw[zpow_sub₀ Г] have H:0<= A-f:=by simp only[f];omega have I:0<= B-f:=by simp only[f];omega simp only[P,Q,T,ϭ];push_cast;rw[<-zpow_natCast,<-zpow_natCast,kv H,kv I,L,M];simp only[A,B,zpow_sub₀ (show (2:ℚ)≠0 by norm_num),zpow_add₀ (show (2:ℚ)≠0 by norm_num)] field_simp split_ifs with D N .simp only[υ,decide_eq_true_eq,beq_iff_eq] at D obtain ⟨o,ha⟩:=D;rcases l with l|l .rw[l,show P=0 from Int.natAbs_eq_zero.1 ha];simp .omega .simp only[υ,decide_eq_true_eq] at N obtain ⟨⟨⟨⟨U,q2⟩,L⟩,M⟩,o⟩:=N;rcases l with l|l;swap;omega rw[l];have E:a≠0:=by intro h;apply D;simp[o,h] obtain ⟨Y,Z⟩:=VE a Q o k;have hP:(P:ℚ)≠0:=by intro h;apply E;simp only[a];exact_mod_cast Int.natAbs_eq_zero.2 (by exact_mod_cast h) have g:qз=25:=le_antisymm (Nat.lt_succ_iff.1 ((lu А).2 q2)) ((Ϧ А).2 U);refine Qx _ W false w e _ 0 _ _ ?_ le_rfl one_pos (by simp) Y ?_ U (by rw[g];omega) (by rw[g];omega) ?_ ?_ .intro _;congr 1;apply propext;constructor<;>intro h .by_contra V;push Not at V;have:(0:ℚ)<= P*2^f/(Q*2^149):=В linarith .apply div_neg_of_neg_of_pos (mul_neg_of_neg_of_pos (by exact_mod_cast h) В) В .rw[add_zero,abs_div,abs_mul,abs_of_pos (show (0:ℚ)<2^f by positivity),abs_of_pos (show (0:ℚ)omega exact ξ А .rw[jL,ZG,ξ А];omega .rfl lemma zQ (w:i9) (d:Д) (h:ZW w=0\/dа<= je w):(ZA w)^2=((zS w d:ℕ):ℚ)^2*((2:ℚ)^((dа:ℤ)-149))^2:=by rw[c7 _ _ h,mul_pow];congr 1;rcases h with h|h .have:mW w=0:=Β.mp (by rw[ZI,h];rfl) rw[show sv w=0 by exact_mod_cast (YN _).2 h];unfold zS;simp[this] .rw[eZ _ _ h];unfold sv;split<;>push_cast<;>ring def qZ (x:ZB) (lo:Д) (b:о):о->о->о | 0,a=>a | k+1,a=>let z:=zS x[b]! lo;qZ x lo (b+1) k (a+z*z) lemma iE (x:ZB) (d:Д):∀k b a,(qZ x d b k a:ℚ)=a+∑j∈ZM k,((zS x[b+j]! d:ℕ):ℚ)^2:=by intro k;induction k with | zero=>intro b a;simp[qZ] | succ k e=> intro b a;rw[jY,Ο rfl (λt _=>by rw[show b+(t+1)=b+1+t by omega]),Ϫ,qZ,e];push_cast;ring 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:п)-((Bз:п)-(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 Yf num den s else sqrtRational ((A:ℚ)*2^(2*(u:п)-298)/Dn+ZA eps) lemma YW (A e u:о) (d:i9) (t:0 (2:ℚ)^j=2^k*2^((g:п)-298):=by intro k j h;rw[h,<-ZF,<-ZL ZQ];ring_nf have:=congrArg (λz:ℚ=>(z:ℝ)) (w.trans (by rw[<-v,ZL ZQ,m (2*u-g) (2*(u:п)-298) XI, m (l+149-g) ((l:п)-149) XI,Μ,Μ] push_cast;field_simp: _=((A:ℚ)*2^(2*(u:п)-298)/e+E*2^((l:п)-149))*2^(2*s))) push_cast at this⊢;omega .rfl @[noinline] def xD (n:о) (x:ZB) (r:о) (eps:т) (c:ф) (B:Д):ф:= let lo:=mL x (r*n) n 255 let S:=sS x lo (r*n) n 0 0 let s:=if c then ((S.1:п)-S.2)м else 0 V5 (n*n*qZ x lo (r*n) n 0-n*s*s) (n*n*n) loа eps==pq B @[noinline] def sQ (xw gw d:т):т:=ZT (ZA xw*ZA gw/ZA d) @[inline] def eL (n:о) (x:ZB) (r:о) (e:RS) (xw gw bw:т) (gv bv:р):т:= let v:=(dw xw-e.m)*(gv*e.ri)+bv let B:=v.toBits let E:=eF B let c:=NE.mx (NE.mx (E+5) (Core.iW bw+1051)) (Core.iW gw+e.A)-E let t:=(1:Д)<<>>(63:Д) let m:Д:=z-1 if ((eF B-1046)&&&m:Д)<=252&&((B&&&0x7FFFFFF)|||(z<<<(8:Д)))-17<0x7FFFFDF then pq B&&&mл else if xw&&&0x7FFFFFFF==0 then 0 else sQ xw gw e.d lemma uB {r d n:о} (j:rjт) (hN:loб+Nб<2^32) (i:с) (out:ZB) (ho:loб+Nб<= outв):ZB:= if h:iji9) (g:eб+Nб<2^32) (i:с) (d:ZB) (h:eб+Nб<= dв): (QE e N f g i d h)в=dв:=by unfold QE;split .rw[bL];exact ϑ .. .rfl termination_by Nб-iб decreasing_by have:=γ.mp ‹_›;have:=Τ N;rw[uS А];omega lemma im (a:ZB) (i:о) (v:i9) (h:ifirst|rfl|omega lemma ct (e N:с) (f:(j:с)->ji9) (F:о->i9) (l:eб+Nб<2^32) (p:∀j h,f j h=F (eб+jб)) (i:с) (d:ZB) (o:eб+Nб<= dв): (QE e N f l i d o)в=dв/\∀q,(QE e N f l i d o)[q]! =if eб+iб<= q/\q?_⟩ rw[v q,m];simp only[l9];rw[im,g,p];split_ifs<;>first|rfl|omega|(subst_vars;rfl) .rename_i h have r:¬iбh (γ.mpr t) exact ⟨rfl,λq=>by rw[if_neg А]⟩ termination_by Nб-iб decreasing_by have:=ς;rw[uS А];omega @[noinline] def fL (n:о) (eps:т) (x g b:ZB) (r:о) (lo N:с) (hN:loб+Nб<2^32) (out:ZB) (ho:loб+Nб<= outв):ZB:= let M:=rowMean n x r let d:=sqrtRational (rowVariance n x r M+ZA eps) QE lo N (λj _=>ZT ((ZA x[r*n+jб]!-M)*ZA g[jб]!/ZA d+ZA b[jб]!)) hN 0 out ho @[noinline] def fR (n:о) (eps:т) (x g:ZB) (r:о) (lo N:с) (hN:loб+Nб<2^32) (out:ZB) (ho:loб+Nб<= outв):ZB:= let d:=sqrtRational (rowVariance n x r 0+ZA eps) QE lo N (λj _=>ZT (ZA x[r*n+jб]!*ZA g[jб]!/ZA d)) hN 0 out ho def RL (rows n:о) (Ln:Д) (Ep rn:р) (eps:т) (x g b:ZB) (gd bd:FloatArray) (hn:rows*n+1<2^32) (hx:rows*n<= xв) (hg:n<= gв) (hb:n<= bв) (hgd:n<= gdд) (hbd:n<= bdд) (r:о) (out:ZB) (ho:rows*n<= outв):ZB:= if hr:r have:=γ.mp hj eL n x r e (x.uget ((r*n)г+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget j А) (b.uget j А) (gd.uget j А) (bd.uget j А)) (by rw[h2,h3];omega) 0 out (by rw[h2,h3];omega) else fL n eps x g b r (r*n)г nг (by rw[h2,h3];omega) out (by rw[h2,h3];omega)) (by split<;>simp only[bL,fL]<;>exact ho) else out termination_by rows-r def RR (rows n:о) (Ln:Д) (Ep rn:р) (eps:т) (x g:ZB) (gd:FloatArray) (hn:rows*n+1<2^32) (hx:rows*n<= xв) (hg:n<= gв) (hgd:n<= gdд) (r:о) (out:ZB) (ho:rows*n<= outв):ZB:= if hr:r have:=γ.mp hj eR e (x.uget ((r*n)г+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget j А) (gd.uget j А)) (by rw[h2,h3];omega) 0 out (by rw[h2,h3];omega) else fR n eps x g r (r*n)г nг (by rw[h2,h3];omega) out (by rw[h2,h3];omega)) (by split<;>simp only[bL,fR]<;>exact ho) else out termination_by rows-r @[inline] def lw (n:о):Д:=Core.an (n+16)ж+1 @[inline] def aQ (rows n:о) (eps:т) (x g:ZB):ф:= SN rows n eps x g&&rows*n<=4294967294&&n<=1048576&&rq nж.toInt64.toFloat (1/nж.toInt64.toFloat) lemma dZ (w:i9) (g:i7 w≠255):fv (dw w)/\rv (dw w)=(ZA w:ℝ)*2^149:=by obtain ⟨d,e⟩:=av w g;refine ⟨d,?_⟩;rw[e,Y1];push_cast;rw[mul_assoc,<-zpow_natCast,<-zpow_natCast,<-zpow_add₀ Г];congr 2;push_cast;ring lemma d7 (n:о) (l:n<=2^20):(lw n)а<=21/\(n:ℝ)+17<=2^(lw n)а/\(32:ℝ)<=2^(lw n)а:=by have d:((n+16)ж)а=n+16:=Ξ (show n+16<2^64 by omega) have g:(an (n+16)ж)а=(n+16)з:=by rw[Y7,d] have h:(n+16)з<=20:=Nat.lt_succ_iff.1 ((lu А).2 А);have j:4<=(n+16)з:=(Ϧ А).2 А;have e:(lw n)а=(n+16)з+1:=by unfold lw;rw[μ,g];simp only[iZ];omega rw[e];refine ⟨by omega,?_,?_⟩ .have:=Ϸ (n:=n+16);have:(n+17:ℕ)<=2^((n+16)з+1):=А exact_mod_cast this .have:2^5<=2^((n+16)з+1):=Ε Г А exact_mod_cast this lemma eJ {e n:о} {d:i9} {x g:ZB} (h:ji e n d x g=true):i7 d≠255:=by simp only[ji,υ,ZH,gt_iff_lt] at h;have:=h.1.2;unfold jS at this;simpa using this lemma dY (d:i9) (h:i7 d≠255) (j:0rw[div_le_one В]<;>exact one_le_pow₀ Г lemma gn (V T ρ:ℝ) (d:0norm_num have l:ja T<=2^53*U*(1+1/2^30):=by linarith have:=mul_le_mul_of_nonneg_left l (by positivity:(0:ℝ)<=((n:ℝ)+32)/2^54) linarith[abs_sub_le e (ja V) (ja T),mul_le_mul_of_nonneg_right h d,mul_le_mul_of_nonneg_right j d,mul_le_mul_of_nonneg_right o d] lemma vP (n:ℕ) (q g h:р) (A S d j:ℝ) (y:1<= n) (Q:n<=2^20) (w:0<= A) (H:A<=2^700) (x:0<= j) (O:j<=1) (G:fv q) (v:fv g) (F:fv h) (hS:|S-A|<=4/2^53*A+j) (hq:|rv q-S|<=((n:ℝ)+3)/2*((1/2^53+1/2^73)*((1+4/2^53)*A+j))+((n:ℝ)+1)*(1/2^1074)) (B:|rv g-1/n|<=3/2^53/n) (L:|rv h-d|<= d/2^53+1/2^1075) (I:2^149<= d) (K:d<=2^700): fv (q*g+h)/\|rv (q*g+h)-(A/n+d)|<=((n:ℝ)+30)/2^54*(A/n+d):=by obtain ⟨t1,t2,t3,t4⟩:=tS;have o:(1:ℝ)<= n:=by exact_mod_cast y have p:(n:ℝ)<=2^20:=by exact_mod_cast Q have m:0>>63!=0 then-(((v.toBits&&&0xfffffffffffff)а+2^52:ℕ):ℝ) else ((v.toBits&&&0xfffffffffffff)а+2^52:ℕ))|= (((v.toBits&&&0xfffffffffffff)а+2^52:ℕ):ℝ):=by split<;>(try simp only[abs_neg])<;>exact abs_of_nonneg В rw[this] calc (2:ℝ)^(((eF v.toBits)а:п)-1023)=2^52*2^(((eF v.toBits)а:п)-1075):=by rw[<-zpow_natCast,<-zpow_add₀ Г];congr 1;push_cast;ring _<=_:=by gcongr;push_cast;linarith[show (0:ℝ)<=((v.toBits&&&0xfffffffffffff)а:ℝ) by positivity] lemma bU (v:р) (d:fv v):|rv v|<2^53*(2:ℝ)^(((eF v.toBits)а:п)-1075):=by have:=bj v d;rwa[show (2:ℝ)^(((eF v.toBits)а:п)-1022)=2^53*2^(((eF v.toBits)а:п)-1075) by rw[<-zpow_natCast,<-zpow_add₀ Г];congr 1;push_cast;ring] at this lemma dW (V:р) (o:Д) (k:Д->ф) (u:fv V) (m:0by rw[h] at j;simp at j have e:0ф) (v:ℚ) (ρ:ℝ) (j:n<=2^20) (u:fv V) (l:0pq B=jk v) (d:(dn V (lw n) k).1=true):(dn V (lw n) k).2=jk v:=by obtain ⟨K,G,H⟩:=d7 n j;have y:(0:ℝ)<(v:ℝ)*2^298:=mul_pos (by exact_mod_cast l) В have E:(n:ℝ)<=2^20:=by exact_mod_cast j have F:ρ<=1/2:=o.trans (by rw[div_le_div_iff₀ В В];nlinarith) have e:0р) (x:ZB) (m l:с) (h:lб<= xв) (r:lб+1<2^32) (v:mб<= lб) (n e:ℕ) (p:mб=e) (o:lб=e+n) (A:n<=2^20) (d:ℕ->ℝ) (t:∀jℝ,∑k∈jr mб lб,g k=∑j∈i0 n,g (e+j):=λg=>by rw[kz,p,o,ϥ] have z:∀a:ℝ,∑j∈i0 n,(a*d j^2+1/2^1000)=a*∑j∈i0 n,d j^2+n/2^1000:=λa=>by rw[ϫ,<-kJ];simp;ring have D:∑j∈i0 n,d j^2<= n*2^600:=by simpa using Finset.sum_le_card_nsmul _ _ _ λj u=>(t j (Ν.1 u)).2.2 have w:(n:ℝ)<=2^20:=by exact_mod_cast A have:(2:ℝ)^22*2^600<=2^960:=by rw[<-pow_add];exact pow_le_pow_right₀ Г Г have:=mul_le_mul_of_nonneg_right w (by positivity:(0:ℝ)<=2^600) have:(1:ℝ)<=2^600:=one_le_pow₀ Г;have:(n:ℝ)/2^1000<= n:=div_le_self В (one_le_pow₀ Г) obtain ⟨B,y⟩:=fz f x l h r m v (λk=>(1+4/2^53)*d (k-e)^2+1/2^1000) (λk E F=>by obtain ⟨j,rfl⟩:∃j,k=e+j:=⟨k-e,by omega⟩ obtain ⟨a,b,-⟩:=t j А;simp only[ϥ];refine ⟨a,?_⟩;have:=abs_sub_abs_le_abs_sub (rv (f x[e+j]!)) (d j^2);rw[abs_of_nonneg (sq_nonneg (d j))] at this;linarith) (by simp only[q,ϥ,z];generalize (2:ℝ)^600=T at*;generalize (2:ℝ)^960=U at*;linarith) А rw[q,q] at y;simp only[o,p,ϥ,z] at y;refine ⟨B,y,?_⟩;rw[<-j9,<-z];exact (Ϲ _ _).trans (Ϗ λj u=>(t j (Ν.1 u)).2.1) lemma dB (w:i9) (d:i7 w≠255):|rv (dw w)|<=2^278:=by rw[(av w d).2];exact (NE.wB w).trans (pow_le_pow_right₀ Г (by have:=aL w;omega)) lemma tR (w:i9) (h:i7 w≠255):fv (dw w*dw w)/\|rv (dw w*dw w)-rv (dw w)^2|<=4/2^53*rv (dw w)^2+1/2^1000/\rv (dw w)^2<=2^600:=by have g:=(av _ h).1;have d:=dB _ h have e:rv (dw w)^2<=2^556:=by have:=sq_le_sq' (abs_le.1 d).1 (abs_le.1 d).2;rw[<-pow_mul] at this;exact this have j:|rv (dw w)*rv (dw w)|<=(2:ℝ)^(971:п):=by rw[abs_mul_self,<-sq];exact e.trans (by rw[show (971:ℤ)=((971:ℕ):ℤ) from rfl,zpow_natCast];exact pow_le_pow_right₀ Г Г) obtain ⟨l,m⟩:=NF.fM _ _ g g j;refine ⟨l,?_,e.trans (pow_le_pow_right₀ Г Г)⟩;rw[abs_mul_self,<-sq] at m;have:(1:ℝ)/2^1075<=1/2^1000:=one_div_le_one_div_of_le В (pow_le_pow_right₀ Г Г);have:rv (dw w)^2/2^53<=4/2^53*rv (dw w)^2:=by have:=sq_nonneg (rv (dw w));rw[div_le_iff₀ В];nlinarith linarith lemma sA (n:ℕ) (g:n<=2^20) (d:ℕ->ℝ) (h:∀jh j (Ν.1 e) _=n*2^600:=by simp _<=2^20*2^600:=by gcongr;exact_mod_cast g _<=2^700:=by rw[<-pow_add];exact pow_le_pow_right₀ Г Г lemma fX (d:i9) (g:i7 d≠255):(ZA d:ℝ)*2^298<=2^700:=by have:=dB d g;rw[(dZ d g).2] at this;have e:(ZA d:ℝ)*2^298=(ZA d:ℝ)*2^149*2^149:=by rw[mul_assoc,<-pow_add] rw[e];calc (ZA d:ℝ)*2^149*2^149<=2^278*2^149:=by gcongr;exact le_trans (le_abs_self _) this _<=2^700:=by rw[<-pow_add];exact pow_le_pow_right₀ Г Г lemma nJ (n:ℕ) (e:n<=2^20):(n:ℝ)/2^1000<=1:=by have d:(n:ℝ)<=2^20:=by exact_mod_cast e rw[div_le_one В];exact d.trans (pow_le_pow_right₀ Г Г) lemma iK (n:о) (e:i9) (x:ZB) (r:о) (t g:с) (h:gб<= xв) (v:gб+1<2^32) (z:tб<= gб) (A:tб=r*n) (y:gб=r*n+n) (q:1<= n) (p:n<=2^20) (l:∀jlet d:=dw w;d*d) x g h v t z 0 0*(1/nж.toInt64.toFloat)+dw e*NR.pt 149)/\ |rv (PP (λw=>let d:=dw w;d*d) x g h v t z 0 0*(1/nж.toInt64.toFloat)+dw e*NR.pt 149)- ((jg n x r 0+ZA e:ℚ):ℝ)*2^298|<=((n:ℝ)+30)/2^54*(((jg n x r 0+ZA e:ℚ):ℝ)*2^298):=by obtain ⟨J,K⟩:=eG n q p B;obtain ⟨D,E,F⟩:=dY e m u;obtain ⟨G,H,I⟩:=pS (λw=>let d:=dw w;d*d) x t g h v z n (r*n) A y p (λj=>rv (dw x[r*n+j]!)) (λj o=>tR _ (l j o)) rw[show ((jg n x r 0+ZA e:ℚ):ℝ)*2^298=(∑j∈i0 n,rv (dw x[r*n+j]!)^2)/n+(ZA e:ℝ)*2^298 by unfold jg;rw[Yk];push_cast;rw[add_mul,div_mul_eq_mul_div,zero_add,϶];congr 2;refine Ο rfl λj o=>?_ rw[sub_zero,(dZ _ (l j (Ν.1 o))).2,mul_pow,show (2:ℝ)^298=(2^149)^2 by rw[<-pow_mul]]] exact vP n _ _ _ _ _ _ _ q p (ϡ λj _=>sq_nonneg _) (sA n p _ λj o=>(tR _ (l j o)).2.2) В (nJ n p) G J D I H K E F (fX e m) lemma fT (V:р) (d:Д) (k:Д->ф) (q:fv V) (j:0(zQ _ _ (by by_cases h:ZW x[r*n+j]! =0;exact Or.inl h;exact ma (m j (Ν.1 y) h))).symm] unfold jg;rw[Yk,zero_add];congr 1;simp only[sub_sq,ϫ,j9,<-϶,<-kJ,kg,ϯ,nsmul_eq_mul];cases c<;>simp only[ο,ite_false,ite_true,<-z,o,ku,ϕ,sq_abs,kS]<;>ring have e:((2:ℚ)^((dа:ℤ)-149))^2=2^(2*(dа:ℤ)-298):=by rw[<-zpow_natCast,<-zpow_mul];congr 1;push_cast;ring have t:(0:ℚ)<2^(2*(dа:ℤ)-298):=В;rw[v,e] at l⊢;generalize (2:ℚ)^(2*(dа:ℤ)-298)=K at t l⊢;generalize qZ x d (r*n) n 0=Q at l⊢;generalize (if c then ((S.1:ℤ)-S.2)м else 0)=s at l⊢;have u:((Q:ℚ)*K-n*(s:ℚ)^2*K/n^2)/n=(n*n*Q-n*s*s)*K/(n*n*n):=by field_simp rw[u] at l⊢;have:(0:ℚ)<=n*n*Q-n*s*s:=by by_contra q;push_neg at q;exact absurd l (not_le.2 (div_neg_of_neg_of_pos (mul_neg_of_neg_of_pos q t) В)) rw[k9 (by exact_mod_cast sub_nonneg.1 this)];push_cast;ring lemma iI (l:Д) (k:Д->ф) (j p:р) (x:ZB) (g e:с) (h:eб<= xв) (m:eб+1<2^32) (o:gб<= eб): rR l k j p x g e h m o=⟨(dn (PP (λw=>let d:=dw w;d*d) x e h m g o 0 0*p+j) l k).1&& rq (dw (dn (PP (λw=>let d:=dw w;d*d) x e h m g o 0 0*p+j) l k).2) (1/dw (dn (PP (λw=>let d:=dw w;d*d) x e h m g o 0 0*p+j) l k).2), 0,1/dw (dn (PP (λw=>let d:=dw w;d*d) x e h m g o 0 0*p+j) l k).2,(dn (PP (λw=>let d:=dw w;d*d) x e h m g o 0 0*p+j) l k).2,0⟩:=rfl lemma iG (n:ℕ) (V:р) (k:Д->ф) (v:ℚ) (d:n<=2^20) (g:fv V) (j:0pq B=jk v) (e:((dn V (lw n) k).1&&rq (dw (dn V (lw n) k).2) (1/dw (dn V (lw n) k).2))=true): (dn V (lw n) k).2=jk v/\i7 (dn V (lw n) k).2≠255/\jw (dn V (lw n) k).2=false/\1<= rv (dw (dn V (lw n) k).2)/\ fv (1/dw (dn V (lw n) k).2)/\|rv (1/dw (dn V (lw n) k).2)-1/rv (dw (dn V (lw n) k).2)|<=3/2^53/rv (dw (dn V (lw n) k).2):=by obtain ⟨p,-,-⟩:=d7 n d;have l:(0:ℝ)<(v:ℝ)*2^298:=mul_pos (by exact_mod_cast j) В simp only[υ] at e;have o:0rename_i h .rw[abs_of_nonneg h];field_simp .rw[abs_of_neg (by linarith)];field_simp;try ring have H:|G|/D<=2^278:=(div_le_self (abs_nonneg _) y).trans z rw[e,abs_mul,abs_mul,abs_of_nonneg (div_nonneg (abs_nonneg _) m.le)];have:|(if 0<= G then (1:ℝ) else-1)|=1:=by split<;>simp rw[this,mul_one] calc (|s-j|)*(|G|/D)<=(|j|/2^53+1/2^1075)*(|G|/D):=mul_le_mul_of_nonneg_right x (div_nonneg (abs_nonneg _) m.le) _=|j*G/D|/2^53+1/2^1075*(|G|/D):=by rw[abs_div,abs_mul,abs_of_pos m];ring _<=_:=by gcongr have I:(1:ℝ)/2^1075*2^278<=1/2^797:=by rw[div_mul_eq_mul_div,one_mul,div_le_div_iff₀ В В,one_mul,<-pow_add] have W:(1:ℝ)/2^1075<=1/2^797:=one_div_le_one_div_of_le В (pow_le_pow_right₀ Г Г) have X:(1:ℝ)/2^797*16<=1/2^700:=by rw[div_mul_eq_mul_div,one_mul,div_le_div_iff₀ В В,one_mul,show (16:ℝ)=2^4 by norm_num,<-pow_add] exact pow_le_pow_right₀ Г Г have Y:(1:ℝ)/2^700*2=1/2^699:=by rw[div_mul_eq_mul_div,one_mul,div_eq_div_iff В В,one_mul,<-pow_succ'] have Z:(0:ℝ)<=1/2^797:=В;have tτ:(0:ℝ)<=1/2^1075:=В;have J:=abs_sub_le v (q+l) (j*G/D+l) have E:|q+l-(j*G/D+l)|<=|q-s*G/D|+|s*G/D-j*G/D|:=by rw[show q+l-(j*G/D+l)=(q-s*G/D)+(s*G/D-j*G/D) by ring];exact abs_add_le _ _ have L:|q+l|<=|v|+|v-(q+l)|:=by have:=abs_sub_abs_le_abs_sub (q+l) v;rw[abs_sub_comm] at this;linarith have M:|q|<=|q+l|+|l|:=by have:=abs_sub_abs_le_abs_sub q (q+l);rw[show q-(q+l)=-l by ring,abs_neg] at this;linarith have N:|j*G/D|<=|q|+|q-s*G/D|+|s*G/D-j*G/D|:=by have:=abs_sub_abs_le_abs_sub (j*G/D) q have:|j*G/D-q|<=|q-s*G/D|+|s*G/D-j*G/D|:=by rw[abs_sub_comm,show q-j*G/D=(q-s*G/D)+(s*G/D-j*G/D) by ring];exact abs_add_le _ _ linarith clear r A z p o B x;generalize (2:ℝ)^278=P at F I;generalize (1:ℝ)/2^1075=τ at*;generalize (1:ℝ)/2^797=σ at*;generalize (1:ℝ)/2^700=K at*;generalize (1:ℝ)/2^699=O at* have S:=abs_nonneg v;have U:=abs_nonneg l;generalize |v-(j*G/D+l)|=w at*;generalize |q+l-(j*G/D+l)|=w2 at*;generalize |v-(q+l)|=a at* generalize |q-s*G/D|=b at*;generalize |s*G/D-j*G/D|=c at*;generalize |q+l|=d at*;generalize |q|=e at* generalize |j*G/D|=f at*;generalize |v|=g at*;generalize |l|=h at* linarith lemma zW (w:i9) (h:(w&&&0x7FFFFFFF==0)=true):ZA w=0:=by have d:(w&&&0x7FFFFFFF)е=0:=by simp only[beq_iff_eq] at h;rw[h];rfl rw[Λ] at d;simp only[jj] at d;rw[show (2147483647:ℕ)=2^31-1 by norm_num,θ] at d have e:=fY w;have g:=f5 w have j:ZW w=0:=by unfold jF;have:(i7 w)е=0:=by rw[e];omega have:i7 w=0:=Η.mp (by rw[this];rfl) rw[if_pos this,g];omega rw[Y1,show (sv w:ℚ)=0 from (YN w).2 j,zero_mul] lemma gB (j g d:i9) (l:р) (b:ф) (B:i7 j≠255) (A:i7 g≠255) (x:i7 d≠255) (o:1<= rv (dw d)) (t:fv l) (p:|rv l-1/rv (dw d)|<=3/2^53/rv (dw d)):c9 ⟨b,0,l,d,0⟩ j g (dw g)=ZT (ZA j*ZA g/ZA d):=by unfold c9;dsimp only;split .rename_i w simp only[υ,decide_eq_true_eq] at w;obtain ⟨M,N⟩:=dZ j B;obtain ⟨I,J,L⟩:=gp g l A t (eE _ _ o p);have y:=dB j B;obtain ⟨D,H⟩:=NF.fM _ _ M I (NE.z9 _ _ (pB _ _ 278 280 y L) Г);obtain ⟨q,F⟩:=te _ w.1 have z:16<(dw j*(dw g*l)).toBitsа%2^27/\(dw j*(dw g*l)).toBitsа%2^27+16<2^27:=by have:=ν.mp w.2;rw[Κ,ψ] at this;simp only[iZ] at this;rw[show (134217727:ℕ)=2^27-1 by norm_num,θ] at this have:=ϳ (dw j*(dw g*l)).toBitsа (show 0<2^27 by norm_num);omega apply eC _ D 4 _ q F (by simpa using z.1) (by simpa using z.2) have m:0by rw[h] at r;rw[r] at m;simp at m rw[show ((ZA j*ZA g/ZA d:ℚ):ℝ)*2^149=rv (dw j)*rv (dw g)/rv (dw d) by rw[N,(dZ g A).2,r];push_cast;field_simp] have e:=fZ _ _ _ _ _ _ o p J H (y.trans (pow_le_pow_right₀ Г Г));have u:=bU _ D;generalize dw j*(dw g*l)=v at e u q⊢;generalize (eF v.toBits)а=E at q u⊢;have:(1:ℝ)/2^700<=2^((E:п)-1075):=by rw[one_div,<-zpow_natCast,<-zpow_neg];exact zpow_le_zpow_right₀ Г А generalize (2:ℝ)^((E:п)-1075)=U at*;generalize (1:ℝ)/2^700=K at* have:=abs_nonneg (rv v);norm_num at e u⊢;nlinarith .split .rename_i _ G;rw[zW j G,zero_mul,zero_div];rfl .rfl lemma gz (e:RS) (d j:i9) (g:р) (h:(d&&&0x7FFFFFFF==0)=true):eR e d j g=0:=by have l:d&&&0x7FFFFFFF=0:=by simpa using h have m:((d&&&0x7FFFFFFF)к-1)>>>(63:Д)=1:=by rw[l];decide unfold eR;dsimp only;rw[m,show (1:Д)-1=0 from rfl];split .simp .rfl lemma gA (e:RS) (d j:i9) (g:р) (h:(d&&&0x7FFFFFFF==0)=false):eR e d j g=c9 e d j g:=by have l:(d&&&0x7FFFFFFF)≠0:=by simpa using h have m:(((d&&&0x7FFFFFFF)к-1)>>>(63:Д))=0:=by have p:0<(d&&&0x7FFFFFFF)е:=by rcases Nat.eq_zero_or_pos (d&&&0x7FFFFFFF)е with q|q .exact absurd (Η.mp (by rw[q];rfl)) l .exact q apply Β.mp;rw[Α,χ _ _ (κ.2 (by simp only[Χ,iZ];omega))] simp only[Χ,iZ,jb,ι];have:=(d&&&0x7FFFFFFF).toNat_lt;omega unfold eR c9;dsimp only;rw[m];simp lemma ij (e g d:i9) (h:р) (b:ф) (r:i7 e≠255) (q:i7 g≠255) (m:i7 d≠255) (l:1<= rv (dw d)) (j:fv h) (o:|rv h-1/rv (dw d)|<=3/2^53/rv (dw d)):eR ⟨b,0,h,d,0⟩ e g (dw g)=ZT (ZA e*ZA g/ZA d):=by cases p:e&&&0x7FFFFFFF==0 .rw[gA _ _ _ _ p];exact gB e g d h b r q m l j o .rw[gz _ _ _ _ p,zW e p,zero_mul,zero_div];rfl lemma gC (h n:о) (e:i9) (x g:ZB) (A:ji h n e x g=true) (I:h*n+1<2^32) (m:n<=2^20) (y:rq nж.toInt64.toFloat (1/nж.toInt64.toFloat)=true) (r:о) (J:rq _ А obtain ⟨D,z⟩:=iK n e x r _ _ h1 h2 h3 L M p m t u o y;have K:0let d:=dw w;d*d) x ((r*n)г+nг) h1 h2 (r*n)г h3 0 0*(1/nж.toInt64.toFloat)+dw e*NR.pt 149=V at D z l⊢ obtain ⟨c,E,N,F,G,H⟩:=iG n V _ _ m D K (by push_cast at z⊢;exact z) (gq n x r e false p o) l generalize (dn V (lw n) (xD n x r e false)).2=d at c E N F G H⊢;rw[<-c];exact ij _ _ d _ _ (q _ А) (v j B) E F G H lemma bu (b:Д):(eF b)а<=2047:=by unfold eF;rw[ψ];exact Nat.and_le_right.trans (by simp) lemma gl (a b:ℝ) (g:|a|<=2^278) (j:|b|<=2^279):|a-b|<=2^280:=by have h:=abs_sub_le a 0 b;rw[sub_zero,zero_sub,abs_neg] at h;have d:(2:ℝ)^279=2*2^278:=by rw[<-pow_succ'] have e:(2:ℝ)^280=2*2^279:=by rw[<-pow_succ'] rw[d] at j;rw[e,d];clear d e;generalize (2:ℝ)^278=T at*;have:0<= T:=le_trans (abs_nonneg _) g;linarith lemma cS (n:ℕ) (l:1<= n) (d:ℕ->ℝ):∑j∈i0 n,|d j|<= n*ja ((∑j∈i0 n,d j^2)/n):=by have g:(0:ℝ)|d j|) simp only[ϯ,sq_abs] at h;have e:(n:ℝ)*∑j∈i0 n,d j^2=(n:ℝ)^2*((∑j∈i0 n,d j^2)/n):=by field_simp calc _<= ja ((n:ℝ)*∑j∈i0 n,d j^2):=lq h _=_:=by rw[e,lI (sq_nonneg _),lU g.le] lemma mR (n:ℕ) (o:1<= n) (v:n<=2^20) (S g W d m:ℝ) (q:|g|<= W) (x:|S-g|<=((n:ℝ)+3)/2*((1/2^53+1/2^73)*W)+((n:ℝ)+1)*(1/2^1074)) (p:|d-1/n|<=3/2^53/n) (u:|m-S*d|<=|S*d|/2^53+1/2^1075): |m-g/n|<=((n:ℝ)+13)/2^54*(W/n)+1/2^1040:=by have l:(1:ℝ)<= n:=by exact_mod_cast o have h:(n:ℝ)<=2^20:=by exact_mod_cast v have j:(0:ℝ)norm_num have:(1:ℝ)/2^1074*2^25<=1/2^1040:=by rw[div_mul_eq_mul_div,one_mul,div_le_div_iff₀ В В,one_mul,<-pow_add];exact pow_le_pow_right₀ Г Г refine le_of_mul_le_mul_left (e.trans ?_) j;rw[show n*(((n:ℝ)+13)/2^54*(W/n)+1/2^1040)=((n:ℝ)+13)/2^54*W+1/2^1040*n by field_simp] linarith lemma mE (n:ℕ) (P Q D R d δ W:ℝ) (v:(n:ℝ)+17<= P) (j:P<=2^21) (w:1<= Q) (u:1<= D) (A:δ<=((n:ℝ)+13)/2^54*(W/n)+1/2^1040) (y:W/n<= R+|d|) (x:R<= D*(1+1/2^22)) (z:|d|<= Q*D):δ<= P*Q/2^53*D:=by have g:W/n<= D*(1+1/2^22+Q):=by linarith have l:(0:ℝ)<= n:=lj n;have q:((n:ℝ)+13)/2^54*(W/n)<=((n:ℝ)+13)/2^54*(D*(1+1/2^22+Q)):=mul_le_mul_of_nonneg_left g В have h:((n:ℝ)+13)*(1+1/2^22+Q)<=2*P*Q-15/2:=by have m:((n:ℝ)+13)*(1+1/2^22+Q)<=(P-4)*(1+1/2^22+Q):=mul_le_mul_of_nonneg_right (by linarith) (by linarith) have o:0<= P*(Q-1):=mul_nonneg (by linarith) (by linarith) nlinarith have r:((n:ℝ)+13)*(1+1/2^22+Q)*D<=(2*P*Q-15/2)*D:=mul_le_mul_of_nonneg_right h (by linarith) have t:(1:ℝ)/2^1040<=15/2*D/2^54:=by have a:(1:ℝ)/2^1040<=1/2^54:=one_div_le_one_div_of_le В (pow_le_pow_right₀ Г Г);have b:(1:ℝ)/2^54<=15/2*D/2^54:=by rw[div_le_div_iff_of_pos_right В];linarith linarith have e:((n:ℝ)+13)/2^54*(D*(1+1/2^22+Q))=((n:ℝ)+13)*(1+1/2^22+Q)*D/2^54:=by ring have p:(2*P*Q-15/2)*D/2^54=P*Q/2^53*D-15/2*D/2^54:=by ring have:((n:ℝ)+13)*(1+1/2^22+Q)*D/2^54<=(2*P*Q-15/2)*D/2^54:=by gcongr linarith lemma gY (n:ℕ) (v:n<=2^20) (V d g D:ℝ) (e:2^149<= d) (u:|V-d|<=((n:ℝ)+30)/2^54*d) (j:0nlinarith[ϊ V,ϊ d] lemma bI (n:ℕ) (r:n<=2^20) (V T δ D:ℝ) (x:0ℝ) (a:ℝ):∑j∈i0 n,(X j-a)^2= ∑j∈i0 n,(X j-(∑k∈i0 n,X k)/n)^2+n*((∑k∈i0 n,X k)/n-a)^2:=by have h:(n:ℝ)≠0:=Nat.cast_ne_zero.2 А;generalize g:(∑k∈i0 n,X k)/n=M have d:∑j∈i0 n,(X j-M)=0:=by rw[j9,kg,ϯ,nsmul_eq_mul,<-g];field_simp;ring have e:∀j,(X j-a)^2=(X j-M)^2+2*(M-a)*(X j-M)+(M-a)^2:=λj=>by ring simp only[e,ϫ,<-kJ,d,kg,ϯ,nsmul_eq_mul];ring lemma iU (d s p τ:ℝ) (e:0<=τ) (o:τ+2^58*τ^2<=1/2^1000) (m:|s-d|<=|d|/2^53+τ) (l:|p-s^2|<= s^2/2^53+τ): |p-d^2|<=4/2^53*d^2+1/2^1000:=by have g:=abs_add_le (2*d*(s-d)) ((s-d)^2);rw[show 2*d*(s-d)+(s-d)^2=s^2-d^2 by ring,abs_mul,abs_mul,abs_two,abs_pow] at g have j:=abs_nonneg (s-d);have h:=abs_nonneg d;have q:(|s-d|)^2<=2*(|d|/2^53)^2+2*τ^2:=by nlinarith[sq_nonneg (|d|/2^53-τ)] have r:2*(|d|)*(|s-d|)<=2*(|d|)*(|d|/2^53+τ):=by nlinarith have t:2*(|d|)*τ<=2^57*τ^2+(|d|)^2/2^57:=by nlinarith[sq_nonneg (2^57*τ-|d|)] have u:s^2<= d^2+|s^2-d^2|:=by have:=le_abs_self (s^2-d^2);linarith have v:=abs_sub_le p (s^2) (d^2);have w:=sq_abs d;generalize (1:ℝ)/2^1000=ζ at* nlinarith lemma tL (w:i9) (m:р) (g:i7 w≠255) (q:fv m) (r:|rv m|<=2^279): fv ((dw w-m)*(dw w-m))/\|rv ((dw w-m)*(dw w-m))-(rv (dw w)-rv m)^2|<=4/2^53*(rv (dw w)-rv m)^2+1/2^1000/\(rv (dw w)-rv m)^2<=2^600:=by have p:=(av _ g).1;have d:=gl _ _ (dB _ g) r;obtain ⟨l,o⟩:=NF.fS _ _ p q (NE.z9 _ 280 d Г);have h:|rv (dw w-m)|<=2^281:=rB _ _ 280 d o have e:=pB _ _ 281 281 h h;obtain ⟨t,j⟩:=NF.fM _ _ l l (NE.z9 _ _ e Г);rw[abs_mul_self,<-sq] at j;refine ⟨t,iU _ _ _ (1/2^1075) В ?_ o j,?_⟩ .have:(2:ℝ)^58*(1/2^1075)<=1:=by rw[mul_one_div,div_le_one В];exact pow_le_pow_right₀ Г Г have:(1:ℝ)/2^1075<=1/2^1000/2:=by rw[div_div,<-pow_succ];gcongr<;>norm_num have:(0:ℝ)<=1/2^1075:=В;generalize (1:ℝ)/2^1075=τ at*;nlinarith .have:=sq_le_sq' (abs_le.1 d).1 (abs_le.1 d).2;rw[<-pow_mul] at this exact this.trans (pow_le_pow_right₀ Г Г) lemma it (n:о) (x:ZB) (r o:с) (h:oб<= xв) (v:oб+1<2^32) (z:rб<= oб) (d:ℕ) (A:rб=d) (y:oб=d+n) (t:1<= n) (J:n<=2^20) (E:∀jℝ,∑k∈jr rб oб,g k=∑j∈i0 n,g (d+j):=by intro g;rw[kz,A,y,show d+n-d=n by omega] have m:∑j∈i0 n,|rv (dw x[d+j]!)|<= n*2^278:=by calc _<=∑j∈i0 n,(2:ℝ)^278:=Ϗ λj Z=>dB _ (E j (Ν.1 Z)) _=n*2^278:=by simp have G:∑j∈i0 n,|rv (dw x[d+j]!)|<=2^298:=m.trans (by calc (n:ℝ)*2^278<=2^20*2^278:=by gcongr _=2^298:=by rw[<-pow_add]) obtain ⟨U,u⟩:=fz dw x o h v r z (λk=>|rv (dw x[k]!)|) (λk Q S=>by obtain ⟨j,rfl⟩:∃j,k=d+j:=⟨k-d,by omega⟩ exact ⟨(av _ (E j А)).1,le_rfl⟩) (by rw[H];exact G.trans (pow_le_pow_right₀ Г Г)) А rw[H,H,y,A,show d+n-d=n by omega] at u have l:=Ϲ (λj=>rv (dw x[d+j]!)) (i0 n) generalize ∑j∈i0 n,|rv (dw x[d+j]!)|=W at G m u l⊢ generalize ∑j∈i0 n,rv (dw x[d+j]!)=F at u l⊢;generalize PP dw x o h v r z 0 0=q at U u⊢;have M:0<= W:=le_trans (abs_nonneg _) l;have D:=eE _ _ K V have O:|rv q|<=2^299:=by have X:((n:ℝ)+3)/2*((1/2^53+1/2^73)*W)<= W/2:=by have:((n:ℝ)+3)/2*(1/2^53+1/2^73)<=1/2:=by rw[div_mul_eq_mul_div,div_le_div_iff₀ Г Г];nlinarith nlinarith have Y:((n:ℝ)+1)*(1/2^1074)<=1:=by have:(1:ℝ)/2^1074<=1/2^21:=one_div_le_one_div_of_le В (pow_le_pow_right₀ Г Г);have:((n:ℝ)+1)*(1/2^1074)<=(2^20+1)*(1/2^21):=by gcongr linarith have:=abs_sub_abs_le_abs_sub (rv q) F;clear m;have e:(2:ℝ)^299=2*2^298:=by rw[<-pow_succ'] have I:(2:ℝ)<=2^298:=le_self_pow₀ Г Г;rw[e];clear e;generalize (2:ℝ)^298=T at*;generalize ((n:ℝ)+3)/2*((1/2^53+1/2^73)*W)=c at* generalize ((n:ℝ)+1)*(1/2^1074)=j at*;linarith only[this,u,X,Y,l,G,I] have B:=pB _ _ 299 1 O D;obtain ⟨m1,m2⟩:=NF.fM _ _ U r1 (NE.z9 _ _ B Г);have N:=mR n t J (rv q) F W _ _ l u V m2;refine ⟨m1,N,?_⟩ have Q:W/n<=2^278:=by rw[div_le_iff₀ p];calc W<= n*2^278:=m _=_:=mul_comm _ _ have S:|F/n|<=W/n:=by rw[abs_div,abs_of_pos p];exact div_le_div_of_nonneg_right l p.le have k3:((n:ℝ)+13)/2^54*(W/n)<= W/n/2:=by have:((n:ℝ)+13)/2^54<=1/2:=by rw[div_le_div_iff₀ В В];nlinarith have:=mul_le_mul_of_nonneg_right this (div_nonneg M p.le);linarith have k4:(1:ℝ)/2^1040<=1:=by rw[div_le_one В];exact one_le_pow₀ Г have:=abs_sub_abs_le_abs_sub (rv (q*(1/nж.toInt64.toFloat))) (F/n);have e:(2:ℝ)^279=2*2^278:=by rw[<-pow_succ'] have I:(2:ℝ)<=2^278:=le_self_pow₀ Г Г;clear G O B m;rw[e];clear e;generalize (2:ℝ)^278=T at*;generalize W/n=w at*;generalize (1:ℝ)/2^1040=ζ at* generalize ((n:ℝ)+13)/2^54*w=c at*;linarith only[this,N,Q,S,k3,k4,I] lemma iJ (n:о) (g:i9) (x:ZB) (t l:с) (h:lб<= xв) (y:lб+1<2^32) (B:tб<= lб) (e:ℕ) (D:tб=e) (z:lб=e+n) (q:1<= n) (p:n<=2^20) (r:∀jlet d:=dw w-m;d*d) x l h y t B 0 0*(1/nж.toInt64.toFloat)+dw g*NR.pt 149)/\ |rv (PP (λw=>let d:=dw w-m;d*d) x l h y t B 0 0*(1/nж.toInt64.toFloat)+dw g*NR.pt 149)- ((∑j∈i0 n,(rv (dw x[e+j]!)-rv m)^2)/n+(ZA g:ℝ)*2^298)|<= ((n:ℝ)+30)/2^54*((∑j∈i0 n,(rv (dw x[e+j]!)-rv m)^2)/n+(ZA g:ℝ)*2^298):=by obtain ⟨N,O⟩:=eG n q p E;obtain ⟨H,I,J⟩:=dY g o v obtain ⟨K,L,M⟩:=pS (λw=>let d:=dw w-m;d*d) x t l h y B n e D z p (λj=>rv (dw x[e+j]!)-rv m) (λj A=>tL _ m (r j A) F G) have u:0<=∑j∈i0 n,(rv (dw x[e+j]!)-rv m)^2:=ϡ λj _=>sq_nonneg _ exact vP n _ _ _ _ _ ((ZA g:ℝ)*2^298) _ q p u (sA n p _ λj A=>(tL _ m (r j A) F G).2.2) В (nJ n p) K N H M L O I J (fX g o) lemma iq (m D:р) (o:Д) (u:fv m) (p:fv D) (x:1<= rv D) (h:o=if eF D.toBits<=eF m.toBits then eF m.toBits-eF D.toBits+1 else 0): |rv m|<=2^oа*rv D/\oа<=2048:=by subst h;have r:=bj m u;have y:=bu m.toBits;have w:=bu D.toBits have l:¬eF D.toBits=0:=by intro v;have k:=bj D p;rw[v] at k;simp only[Ϯ,kS,zero_sub] at k;have:(2:ℝ)^(-1022:ℤ)<=1:=zpow_le_one_of_nonpos₀ Г Г;have:=le_abs_self (rv D);linarith have q:=c8 D p l;rw[abs_of_pos (by linarith)] at q split .rename_i d have g:=κ.1 d have e:(eF m.toBits-eF D.toBits+1)а=(eF m.toBits)а-(eF D.toBits)а+1:=by rw[μ,χ _ _ d];simp only[iZ];omega rw[e];refine ⟨?_,by omega⟩ calc |rv m|<=(2:ℝ)^(((eF m.toBits)а:п)-1022):=r.le _=2^((eF m.toBits)а-(eF D.toBits)а+1)*2^(((eF D.toBits)а:п)-1023):=by rw[<-zpow_natCast,<-zpow_add₀ Г];congr 1;rw[Nat.cast_add,k9 g];push_cast;ring _<=_:=by gcongr .rename_i j have t:(eF m.toBits)а<(eF D.toBits)а:=by have:=UInt64.le_iff_toNat_le.not.1 j;omega refine ⟨?_,by simp⟩ simp only[Ϯ,pow_zero,one_mul] calc |rv m|<=(2:ℝ)^(((eF m.toBits)а:п)-1022):=r.le _<=(2:ℝ)^(((eF D.toBits)а:п)-1023):=zpow_le_zpow_right₀ Г А _<=_:=q lemma gi (e:Д) (k:Д->ф) (r q:р) (x:ZB) (j g:с) (h:gб<= xв) (l:gб+1<2^32) (o:jб<= gб): ∃m V p,m=PP dw x g h l j o 0 0*q/\V=PP (λw=>let d:=dw w-m;d*d) x g h l j o 0 0*q+r/\ p=(if eF (dw (dn V e k).2).toBits<=eF m.toBits then eF m.toBits-eF (dw (dn V e k).2).toBits+1 else 0)/\ rL e k r q x j g h l o=⟨(dn V e k).1&&e+p<=25&&rq (dw (dn V e k).2) (1/dw (dn V e k).2),m,1/dw (dn V e k).2,(dn V e k).2,e+p+1047⟩:= ⟨_,_,_,rfl,rfl,rfl,rfl⟩ lemma f9 (n:о) (x:ZB) (r:о) (d:∀j?_ rw[(dZ _ (d j (Ν.1 e))).2] lemma iX (n:о) (x:ZB) (r:о) (d:i9) (e:∀j?_ rw[(dZ _ (e j (Ν.1 g))).2,show (2:ℝ)^298=(2^149)^2 by rw[<-pow_mul]] ring lemma cE (E d e A:Д) (k:ℕ) (q:Eа<=2047) (o:dа<=254) (p:eа<=254) (m:Aа=k+1047) (r:k<=25): (NE.mx (NE.mx (E+5) (d+1051)) (e+A)-E)а=lm (lm (Eа+5) (dа+1051)) (eа+k+1047)-Eа:=by have h:(E+5)а=Eа+5:=by rw[μ];simp only[iZ];omega have j:(d+1051)а=dа+1051:=by rw[μ];simp only[iZ];omega have l:(e+A)а=eа+k+1047:=by rw[μ,m];omega have g:(NE.mx (NE.mx (E+5) (d+1051)) (e+A))а=lm (lm (Eа+5) (dа+1051)) (eа+k+1047):=by rw[NE.aA,NE.aA,h,j,l] rw[χ _ _ (κ.2 (by rw[g];omega)),g] lemma ii (n:о) (x:ZB) (r j:о) (hj:jby rw[h] at G;rw[G] at o;simp at o rw[show (rv (dw y)-rv m)*rv (dw g)/rv (dw d)+rv (dw l)-(((ZA y-jo n x r)*ZA g/ZA d+ZA l:ℚ):ℝ)*2^149= (((jo n x r:ℚ):ℝ)*2^149-rv m)*(rv (dw g)/rv (dw d)) by rw[x2,(dZ g D).2,G,Z];push_cast;field_simp;ring, abs_mul,abs_sub_comm,abs_div,abs_of_pos o] calc _<=2^k/2^53*rv (dw d)*(|rv (dw g)|/rv (dw d)):=mul_le_mul_of_nonneg_right hδ (div_nonneg (abs_nonneg _) o.le) _=_:=by have:=o.ne';field_simp .exact iP n x r j g l d hj K lemma vp (n:ℕ) (d:n<=2^20) (V A E:ℝ) (g:0<= A) (j:2^149<= E) (h:|V-(A+E)|<=((n:ℝ)+30)/2^54*(A+E)):0ℝ) (m d V q D P Q:ℝ) (L:2^149<= d) (r:|V-((∑j∈i0 n,(X j-m)^2)/n+d)|<=((n:ℝ)+30)/2^54*((∑j∈i0 n,(X j-m)^2)/n+d)) (w:0X j-m);beta_reduce at x have:∑j∈i0 n,|X j|<=∑j∈i0 n,|X j-m|+n*|m|:=by simpa[ϫ] using Ϗ λj (_:j∈i0 n)=>abs_add_le (X j-m) m have J:=mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt (by linarith:(∑j∈Finset.range n,(X j-m)^2)/n<=p)) l.le have h:=mE n P Q D (ja p) m _ _ E v G t z (by rw[div_le_iff₀ l];nlinarith) (by nlinarith[(abs_le.1 g).1,ϊ p]) I refine ⟨h,?_⟩;have e:=iQ n o X m;generalize ∑k∈i0 n,X k=y at e h z⊢;rw[show p=((∑j∈i0 n,(X j-y/n)^2)/n+d)+(m-y/n)^2 by rw[<-H,e,add_div,mul_div_cancel_left₀ _ l.ne'];ring] at r g exact bI n A V _ _ D В r (h.trans (by nlinarith)) g lemma aT {d n:о} {e:i9} {x g:ZB} (h:aQ d n e x g=true): ji d n e x g=true/\d*n+1<2^32/\n<=2^20/\rq nж.toInt64.toFloat (1/nж.toInt64.toFloat)=true:=by simp only[aQ,υ,decide_eq_true_eq] at h;obtain ⟨⟨⟨j,m⟩,o⟩,l⟩:=h;exact ⟨by rw[<-e9];exact j,by omega,by omega,l⟩ lemma bE {d n:о} {e:i9} {x g:ZB} (h:ji d n e x g=true):xв=d*n/\gв=n:=by simp only[ji,υ,ZH,gt_iff_lt] at h;exact ⟨by simpa using h.1.1.1.1.1.2,by simpa using h.1.1.1.1.2⟩ lemma gy (o n:о) (h:i9) (x g b:ZB) (K:ji o n h x g=true) (L:∀jQ _ А obtain ⟨l1,l2,-⟩:=d7 n l;obtain ⟨G,V,F,O,hV,A,e⟩:=gi (lw n) _ (dw h*NR.pt 149) (1/nж.toInt64.toFloat) x _ _ h1 h2 h3;rw[e] at v⊢;simp only[υ,decide_eq_true_eq] at v;obtain ⟨⟨S,o2⟩,o3⟩:=v;obtain ⟨E,W,J⟩:=it n x _ _ h1 h2 h3 (r*n) Z u4 q l m D;rw[<-O] at E W J;obtain ⟨H,U⟩:=iJ n h x _ _ h1 h2 h3 (r*n) Z u4 q l m (eJ K) t D G E J;rw[<-hV] at H U;have X:=(dY h (eJ K) t).2.2;have u:=vp n l (rv V) _ _ В X U;obtain ⟨-,-,-,q2,-,-,Y,-,-,w3⟩:=dW V (lw n) _ H u S;obtain ⟨I,w2,p,w,B⟩:=fT V (lw n) _ H u S o3;generalize M:(dn V (lw n) (xD n x r h true)).2=d at Y I w2 p w B A⊢;rw[<-Y] at w3;obtain ⟨hm,as⟩:=iq G (dw d) F E (av d I).1 p A;have y:(lw n)а+Fа<=25:=by have:=κ.1 o2;rw[μ] at this;simp only[iZ] at this;omega obtain ⟨k1,k2⟩:=ip n q l (λj=>rv (dw x[r*n+j]!)) (rv G) _ (rv V) _ (rv (dw d)) (2^(lw n)а) (2^Fа) X U u q2 (by rw[(av d I).2];exact w3) p hm W l2 (pow_le_pow_right₀ Г l1) (one_le_pow₀ Г) (by rw[<-pow_add];exact pow_le_pow_right₀ Г y) have c:=fU V n _ (jg n x r (jo n x r)+ZA h) (((n:ℝ)+31)/2^54) l H (by have:=eD n x r (jo n x r);linarith) (by rw[iX n x r h m];exact k2) (by gcongr;norm_num) (gq n x r h true q t) S rw[M] at c;rw[<-c] exact ii n x r j z g[j]! b[j]! d G (1/dw d) _ ((lw n)а+Fа) _ (m j z) (N j z) (L j z) I w2 p w B E J (by rw[μ,μ];simp only[iZ];omega) y (by rw[f9 n x r m,pow_add];exact k1) lemma fC (d n:о) (p:Д) (o v:р) (h:i9) (x g b:ZB) (u t:FloatArray) (z:d*n+1<2^32) (J:d*n<= xв) (G:n<= gв) (B:n<= bв) (m:n<= uд) (l:n<= tд) (F:о->i9) (H:∀j∀M A y,(rL p (xD n x r h true) o v x (r*n)г ((r*n)г+nг) M A y).ok=true->∀j (RL d n p o v h x g b u t z J G B m l (r+1) w L)в=eв/\ ∀q,(RL d n p o v h x g b u t z J G B m l (r+1) w L)[q]! =if r*n<= q/\q?_⟩;rw[V,X,A,y,Ϥ,ϋ];split_ifs<;>first|rfl|omega split .rename_i O;exact K _ _ (ct _ _ _ F _ (λj N=>by have:=γ.mp N;rw[y] at this;rw[ak,ak,ak,ao,ao,Dense.ab (a:=(r*n)г) (b:=j) (by have:=ς;omega),show (r*n)гб+jб=r*n+jб by omega,H _ this,D _ this] exact E r I _ _ _ O _ this) _ _ _) .exact K _ _ (ct _ _ _ F _ (λj N=>by have:=γ.mp N;rw[y] at this;rw[A,Q r I _ this]) _ _ _) .rename_i I refine ⟨rfl,λq=>?_⟩;rw[if_neg] intro ⟨Z,k2⟩;have:=Ζ n (Nat.le_of_not_lt I);omega termination_by d-r lemma fH (d n:о) (o:Д) (m t:р) (h:i9) (x g:ZB) (p:FloatArray) (v:d*n+1<2^32) (E:d*n<= xв) (A:n<= gв) (l:n<= pд) (F:о->i9) (B:∀j∀H y u,(rR o (xD n x r h false) m t x (r*n)г ((r*n)г+nг) H y u).ok=true->∀j (RR d n o m t h x g p v E A l (r+1) w G)в=eв/\ ∀q,(RR d n o m t h x g p v E A l (r+1) w G)[q]! =if r*n<= q/\q?_⟩;rw[O,S,y,u,Ϥ,ϋ];split_ifs<;>first|rfl|omega split .rename_i J;exact K _ _ (ct _ _ _ F _ (λj I=>by have:=γ.mp I;rw[u] at this;rw[ak,ak,ao,Dense.ab (a:=(r*n)г) (b:=j) (by have:=ς;omega),show (r*n)гб+jб=r*n+jб by omega,B _ this] exact z r D _ _ _ J _ this) _ _ _) .exact K _ _ (ct _ _ _ F _ (λj I=>by have:=γ.mp I;rw[u] at this;rw[y,L r D _ this]) _ _ _) .rename_i D refine ⟨rfl,λq=>?_⟩;rw[if_neg] intro ⟨V,W⟩;have:=Ζ n (Nat.le_of_not_lt D);omega termination_by d-r def aO (rows n:о) (eps:т) (x g:ZB):ZB:= if h:aQ rows n eps x g then have d:=aT h;have z:=bE d.1 let gd:=aq g RR rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps x g gd d.2.1 А А (by rw[(af g).1];omega) 0 (Array.replicate (rows*n) 0) (by simp) else rmsnormSpec rows n eps x g lemma aX (a b:ZB) (e:aв=bв) (g:∀q(kj e n l x g)[q]!) (r*n+j)=ZT (ZA x[r*n+j]!*ZA g[j]!/ZA (jk (jg n x r 0+ZA l))):= (λr o j m=>by obtain ⟨p,w,y⟩:=f7 o m;unfold kj;dsimp only;rw[Qg _ p];simp only[w,y];rw[Qg _ o]) obtain ⟨E,F⟩:=fH e n (lw n) (dw l*NR.pt 149) (1/nж.toInt64.toFloat) l x g (aq g) d.2.1 А А (by rw[(af g).1];omega) (λq=>(kj e n l x g)[q]!) (λj m=>(af g).2 j А) u (λr o A B D t j m=>(gC e n l x g d.1 d.2.1 d.2.2.1 d.2.2.2 r o A B D t j m).trans (u r o j m).symm) 0 (jM (e*n) 0) (by simp) apply aX _ _ (by rw[E,v,ϴ]) (λq p=>?_) rw[F q,if_pos ⟨by omega,by rw[v] at p;exact p⟩] .rw[aO,dif_neg h] lemma di {d n:о} {e:i9} {x g b:ZB} (h:(aQ d n e x g&&bв==n&&b.all jS)=true): aQ d n e x g=true/\bв=n/\∀jNR.d0 b (by simpa[j8] using o) j А⟩ def ar (rows n:о) (eps:т) (x g b:ZB):ZB:= if h:aQ rows n eps x g&&bв==n&&b.all finiteWord then have l:=di h;have d:=aT l.1;have z:=bE d.1 RL rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps x g b (aq g) (aq b) d.2.1 А А А (by rw[(af g).1];omega) (by rw[(af b).1];omega) 0 (Array.replicate (rows*n) 0) (by simp) else layernormSpec rows n eps x g b lemma bF:ar=lJ:=by funext e n m x g b;by_cases h:(aQ e n m x g&&bв==n&&b.all jS)=true .rw[ar,dif_pos h] have l:=di h;have d:=aT l.1;have z:=bE d.1;unfold lJ layernormWith;rw[if_pos (by have v:=h;simp only[υ,beq_iff_eq] at v⊢;exact ⟨⟨d.1,l.2.1⟩,v.2⟩)] have y:(jN e n m x g b)в=e*n:=by simp[jN] have w:∀r(jN e n m x g b)[q]!) (r*n+j)=ZT ((ZA x[r*n+j]!-jo n x r)*ZA g[j]!/ZA (jk (jg n x r (jo n x r)+ZA m))+ZA b[j]!):= (λr p j o=>by obtain ⟨t,A,B⟩:=f7 p o;unfold jN;dsimp only;rw[Qg _ t];simp only[A,B];simp only[Qg _ p,Fin.val_mk]) obtain ⟨G,H⟩:=fC e n (lw n) (dw m*NR.pt 149) (1/nж.toInt64.toFloat) m x g b (aq g) (aq b) d.2.1 А А А (by rw[(af g).1];omega) (by rw[(af b).1];omega) (λq=>(jN e n m x g b)[q]!) (λj o=>(af g).2 j А) (λj o=>(af b).2 j А) w (λr p D E F u j o=>(gy e n m x g b d.1 l.2.2 d.2.1 d.2.2.1 d.2.2.2 r p D E F u j o).trans (w r p j o).symm) 0 (jM (e*n) 0) (by simp) apply aX _ _ (by rw[G,y,ϴ]) (λq t=>?_) rw[H q,if_pos ⟨by omega,by rw[y] at t;exact t⟩] .rw[ar,dif_neg h] @[inline] def bC (T:@& FloatArray) (hT:Tд=512) (w:т):р:= (Core.mW w).toInt64.toFloat*T.uget (w>>>23).toUSize (by rw[hT,Dense.aH,cW];have:=w.toNat_lt;omega) lemma bg (w:i9):bC P ag w=dw w:=rfl lemma aW (Y:FloatArray) (i:с) (v:р) (h:iбfirst|rfl|omega @[specialize] def bc (f:р->р) (X:@& FloatArray) (e:с) (he:eб<= Xд) (hb:eб+1<2^32) (i:с) (hi:iб<= eб) (s t:р):р:= have:=ς if h:i+1р) (X:FloatArray) (x:ZB) (d N:с) (A:Nб<= Xд) (z:Nб+1<2^32) (B:(d+N)б<= xв) (m:(d+N)б+1<2^32) (y:dб+Nб<2^32) (o:∀qf (dw w)) x (d+N) B m (d+i) v s t:=by have H:=ς;have l:(d+N)б=dб+Nб:=Dense.ab А;have e:(d+i)б=dб+iб:=Dense.ab А;rw[bc,PP];dsimp only;by_cases h:i+1h (γ.mpr (by have:=γ.mp u;rw[u1 А,e,l] at this;rw[u1 А];omega)) rw[dif_neg h,dif_neg p];by_cases g:ig (γ.mpr (by have:=γ.mp u;rw[e,l] at this;omega)) rw[dif_neg g,dif_neg j] termination_by Nб-iб decreasing_by all_goals (have:=γ.mp h;rw[u1 А,u1 А];omega) @[specialize] def aY (T:@& FloatArray) (hT:Tд=512) (x:ZB) (lo N:с) (hN:loб+Nб<2^32) (hx:loб+Nб<= xв) (hb:Nб+1<2^32) (i:с) (hi:iб<= Nб) (s t:р) (Y:FloatArray) (hY:Nб+1<= Yд):FloatArray:= have:=ς if h:i+1first|rfl|omega|(subst_vars;rfl) .exact m .split .rename_i h g have o:=γ.mp g;have r:¬iб+1h (γ.mpr (by rw[u1 А];exact l)) have e:(d+i)б=dб+iб:=Dense.ab А;intro q m;rw[bA,bA,bg,ak,e];split_ifs<;>first|rfl|omega|(subst_vars;rfl) .rename_i h g have o:¬iбg (γ.mpr l) intro q m;rw[bA,if_neg А,if_neg А] termination_by Nб-iб decreasing_by omega lemma ec (x:ZB) (d N:с) (hN hx hb) (X:FloatArray) (p:Nб<= Xд) (i:с) (hi) (s t:р) (Y:FloatArray) (hY) (j:∀q,iб<= q->qX.data[q]! =dw x[dб+q]!): (aY P ag x d N hN hx hb i hi s t Y hY).data[Nб]! =bc id X N p hb i hi s t:=by have z:=ς;rw[aY,bc];dsimp only;split .rename_i h have o:=γ.mp h;have g:=u1 (i:=i) А;have v:(i+1+1)б=iб+2:=by rw[u1 А,g] rw[ec x d N hN hx hb X p (i+1+1) _ _ _ _ _ (λq w y=>j q (by rw[v] at w;omega) y)] have e:(d+i)б=dб+iб:=Dense.ab А;have l:(d+(i+1))б=dб+(iб+1):=by rw[Dense.ab А,g] have r:bC P ag (x.uget (d+i) (by rw[e];omega))=id (X.uget i А):=by rw[bg,ak,e,ao,j _ le_rfl А];rfl have u:bC P ag (x.uget (d+(i+1)) (by rw[l];omega))=id (X.uget (i+1) (by rw[g];omega)):=by rw[bg,ak,l,ao,g,j _ А А];rfl rw[r,u] .rename_i h split .rename_i m have o:=γ.mp m;have e:(d+i)б=dб+iб:=Dense.ab А;rw[bA,if_pos rfl,bg,ak,e,ao,j _ le_rfl o];rfl .rename_i m rw[bA,if_pos rfl] termination_by Nб-iб decreasing_by omega @[inline] def dl (T:@& FloatArray) (hT:Tд=512) (Ln:Д) (k:Д->ф) (Ep rn:р) (X:@& FloatArray) (N:с) (he:Nб<= Xд) (hb:Nб+1<2^32):RS:= let m:=bc id X N he hb 0 (by simp) 0 0*rn let V:=bc (λv=>let d:=v-m;d*d) X N he hb 0 (by simp) 0 0*rn+Ep let t:=dn V Ln k let D:=bC T hT t.2 let ri:=1/D let a:=eF m.toBits let b:=eF D.toBits let mD:=if b<= a then a-b+1 else 0 ⟨t.1&&Ln+mD<=25&&rq D ri,m,ri,t.2,Ln+mD+1047⟩ lemma gN (p:Д) (k:Д->ф) (o r:р) (X:FloatArray) (x:ZB) (d N:с) (j:Nб<= Xд) (g:Nб+1<2^32) (h:(d+N)б<= xв) (e:(d+N)б+1<2^32) (l:dб<=(d+N)б) (m:dб+Nб<2^32) (u:∀qр) s t,bc f X N j g 0 (by simp) s t=PP (λw=>f (dw w)) x (d+N) h e d l s t:=by intro f s t;rw[eo f X x d N j g h e m u 0 (by simp) (by simp only[USize.add_zero];exact l) s t] simp only[USize.add_zero] simp only[dl,rL,v,bg,id] @[specialize] def bR (m ri:р) (gd bd:@& FloatArray) (N:с) (hg:Nб<= gdд) (hb:Nб<= bdд) (i:с) (Y:FloatArray) (hY:Nб<= Yд):FloatArray:= if h:ifirst|rfl|omega|(subst_vars;rfl) .rename_i h have l:¬iбh (γ.mpr o) exact λq=>by rw[if_neg А] termination_by Nб-iб decreasing_by have:=Τ N;rw[uS А];omega @[noinline] def dk (n:о) (x:ZB) (r:о) (e:RS) (xw gw bw:т) (B:Д):т:= let E:=eF B let c:=NE.mx (NE.mx (E+5) (Core.iW bw+1051)) (Core.iW gw+e.A)-E let t:=(1:Д)<<(1:Д)<<<(NE.mx (eF B+5) g-eF B)+(1:Д)<<<(NE.mx (eF B+5) g-eF B))=true): dk n x r e xw j h B=pq B:=by simp only[υ,decide_eq_true_eq] at G;obtain ⟨F,t⟩:=G;unfold dk;dsimp only;rw[if_pos];have N:=bu B;generalize eF B=E at F t N⊢;have X:=aL h;have Y:=aL j;rw[<-ZS] at X Y;have q:=κ.1 F;simp only[Κ,iZ] at q;have S:dа<= Eа/\Eа<=1298:=by have:=d.toNat_lt;omega have D:(E+5)а=Eа+5:=by rw[μ];simp only[iZ];omega have H:(NE.mx (E+5) g)а=lm (Eа+5) gа:=by rw[NE.aA,D] have p:(NE.mx (E+5) g-E)а=lm (Eа+5) gа-Eа:=by rw[χ _ _ (κ.2 (by rw[H];omega)),H] have m:(NE.mx (E+5) g-E)а<=25:=by rw[p];omega generalize NE.mx (E+5) g-E=l at t p m;have J:=du l А;have v:(iW h+1051)а=(iW h)а+1051:=by rw[μ];simp only[iZ];omega have w:(iW j+e.A)а=(iW j)а+e.Aа:=by rw[μ];omega have o:(NE.mx (NE.mx (E+5) (iW h+1051)) (iW j+e.A))а=lm (lm (Eа+5) ((iW h)а+1051)) ((iW j)а+e.Aа):=by rw[NE.aA,NE.aA,D,v,w] have z:(NE.mx (NE.mx (E+5) (iW h+1051)) (iW j+e.A)-E)а=lm (lm (Eа+5) ((iW h)а+1051)) ((iW j)а+e.Aа)-Eа:=by rw[χ _ _ (κ.2 (by rw[o];omega)),o] generalize NE.mx (NE.mx (E+5) (iW h+1051)) (iW j+e.A)-E=c at z;have L:cа<= lа:=by rw[p,z];omega have K:=du c А;have I:2^cа<=2^lа:=Ε Г L;have y:2^lа<=2^25:=Ε Г m;have Z:1<=2^cа:=Nat.one_le_two_pow;generalize 2^cа=T at K I Z;generalize 2^lа=T' at J I y;have u:=ν.1 t rw[ψ,μ,μ,J,show (0x7FFFFFF:Д)а=2^27-1 from rfl, θ] at u have hB:=B.toNat_lt;simp only[υ,decide_eq_true_eq];refine ⟨⟨κ.2 ?_,κ.2 (by simp only[iZ];omega)⟩,ν.2 ?_⟩ .simp only[Κ,iZ];omega .have M:(B&&&0x7FFFFFF)а=Bа%2^27:=by rw[ψ];exact θ _ 27 simp only[Κ,Ϛ,M,K,iZ];omega @[inline] def cV (T:@& FloatArray) (hT:Tд=512) (Ln:Д) (k:Д->ф) (Ep rn:р) (X:@& FloatArray) (N:с) (he:Nб+1<= Xд) (hb:Nб+1<2^32):RS:= let m:=X.uget N А*rn let V:=bc (λv=>let d:=v-m;d*d) X N А hb 0 (by simp) 0 0*rn+Ep let t:=dn V Ln k let D:=bC T hT t.2 let ri:=1/D let a:=eF m.toBits let b:=eF D.toBits let mD:=if b<= a then a-b+1 else 0 ⟨t.1&&Ln+mD<=25&&rq D ri,m,ri,t.2,Ln+mD+1047⟩ lemma fj (T:FloatArray) (h:Tд=512) (g:Д) (k:Д->ф) (e j:р) (X:FloatArray) (N:с) (l:Nб+1<= Xд) (d:Nб+1<2^32) (m:X.data[Nб]! =bc id X N А d 0 (by simp) 0 0):cV T h g k e j X N l d=dl T h g k e j X N А d:=by simp only[cV,dl,ao,m] lemma iv (B t d:Д) (m:tа<= dа) (g:dа<=2^25) (h:((B+d)&&&0x7FFFFFF)>d+d):((B+t)&&&0x7FFFFFF)>t+t:=by have e:∀u:Д,uа<=2^25->((B+u)&&&0x7FFFFFF)а=(Bа%2^27+uа)%2^27:=λu l=>by rw[ψ,μ,show (0x7FFFFFF:Д)а=2^27-1 from rfl,θ];omega have f:∀u:Д,uа<=2^25->(u+u)а=2*uа:=λu l=>by rw[μ];omega have j:=ν.1 h;rw[e _ g,f _ g] at j;apply ν.2;rw[e _ А,f _ А];have:=Bа%2^27;omega lemma iw (B e d S:Д) (r:Sа=2^(eа-dа)) (H:dа<= eа) (A:eа<= dа+25) (t:(eF B-d<=1298-d&&((B+NE.mx 32 (S>>>(eF B-d)))&&&0x7FFFFFF)>NE.mx 32 (S>>>(eF B-d))+NE.mx 32 (S>>>(eF B-d)))=true) (z:dа<=1298): (eF B-d<=1298-d&&((B+(1:Д)<<<(NE.mx (eF B+5) e-eF B))&&&0x7FFFFFF)>(1:Д)<<<(NE.mx (eF B+5) e-eF B)+(1:Д)<<<(NE.mx (eF B+5) e-eF B))=true:=by simp only[υ,decide_eq_true_eq] at t⊢;obtain ⟨h,q⟩:=t;refine ⟨h,?_⟩;have y:=bu B;generalize eF B=E at h q y⊢;have j:=κ.1 h;simp only[Κ,iZ] at j;have l:dа<= Eа/\Eа<=1298:=by have:=d.toNat_lt;omega have D:(E-d)а=Eа-dа:=χ _ _ (κ.2 l.1);have x:(E+5)а=Eа+5:=by rw[μ];simp only[iZ];omega have w:(NE.mx (E+5) e)а=lm (Eа+5) eа:=by rw[NE.aA,x] have p:(NE.mx (E+5) e-E)а=lm (Eа+5) eа-Eа:=by rw[χ _ _ (κ.2 (by rw[w];omega)),w] have G:=du (NE.mx (E+5) e-E) (by rw[p];omega) have o:(S>>>(E-d))а=2^(eа-dа)/2^(Eа-dа)\/2^(Eа-dа)>=2^26:=by by_cases m:Eа-dа<64 .left;rw[Α,r,D,ξ m,ι] .right;exact le_trans (Ε Г (show 26<=64 by norm_num)) (Ε Г А) have g:Sа<=2^25:=by rw[r];exact Ε Г А have F:(S>>>(E-d))а<=2^25:=by rw[Α,ι];exact le_trans (Nat.div_le_self _ _) g have v:(NE.mx 32 (S>>>(E-d)))а=lm 32 (S>>>(E-d))а:=NE.aA _ _;apply iv _ _ _ ?_ (by rw[v];omega) q rw[G,v,p];by_cases I:eа<= Eа+5 .rw[show lm (Eа+5) eа-Eа=5 by omega];norm_num .rw[show lm (Eа+5) eа-Eа=eа-Eа by omega] rcases o with u|u .rw[u,Nat.pow_div А Г,show eа-dа-(Eа-dа)=eа-Eа by omega];omega .exfalso;have:2^(Eа-dа)<=2^25:=Ε Г А;omega @[specialize] def b9 (n:о) (x g b:ZB) (r:о) (e:RS) (S Elo Wd:Д) (Y:@& FloatArray) (lo N:с) (hN:loб+Nб<2^32) (hx:loб+Nб<= xв) (hg:Nб<= gв) (hb:Nб<= bв) (hY:Nб<= Yд) (i:с) (out:ZB) (ho:loб+Nб<= outв):ZB:= if h:i>>d) let w:=if d<=Wd&&((B+t)&&&0x7FFFFFF)>t+t then pq B else dk n x r e (x.uget (lo+i) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget i А) (b.uget i А) B b9 n x g b r e S Elo Wd Y lo N hN hx hg hb hY (i+1) (out.uset (lo+i) w (by rw[Dense.ab (by have:=ς;omega)];omega)) (by rw[ϑ];exact ho) else out termination_by Nб-iб decreasing_by have:=Τ N;rw[uS А];omega lemma ek (n:о) (x g b:ZB) (r:о) (e:RS) (S h j:Д) (Y:FloatArray) (l N:с) (hN hx hg hb hY) (i:с) (d:ZB) (ho): (b9 n x g b r e S h j Y l N hN hx hg hb hY i d ho)в=dв:=by unfold b9;split .rw[ek];exact ϑ .. .rfl termination_by Nб-iб decreasing_by have:=γ.mp ‹_›;have:=Τ N;rw[uS А];omega lemma gU (d N:с) (f:(j:с)->ji9) (l:dб+Nб<2^32) (i:с) (a e:ZB) (m:dб+Nб<= aв) (g:dб+Nб<= eв) (h:a=e):QE d N f l i a m=QE d N f l i e g:=by subst h;rfl lemma iV (a:ZB) (k:с) (v d:i9) (p:kб have:=γ.mp K eL n x r e (x.uget (p+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget j А) (b.uget j А) (u.uget j А) (t.uget j А)) hN i D ho:=by rw[b9,QE];split .rename_i h have E:=γ.mp h;have M:=ς;dsimp only;rw[ej n x g b r e l S d u t Y p N hN hx hg hb hY H G B w y z v o I F (i+1)];apply gU;apply iV have L:Y.uget i А=(dw (x.uget (p+i) (by rw[Dense.ab А];omega))-e.m)*(u.uget i А*e.ri)+t.uget i А:=by rw[ao,ao,ao,ak,B _ E,Dense.ab А] rw[L,ic];split .rename_i J exact (gL n x r e _ _ _ _ l d (by rw[ak];exact w _ E) (by rw[ak];exact y _ E) z v o (iw _ l d S I А А J o)).symm .rfl .rfl termination_by Nб-iб decreasing_by have:=ς;rw[uS А];omega def bb (a:ZB) (i:о) (k:Д):Д:= if h:ij(iW a[j]!)а<=(bb a i k)а:=by rw[bb];split .rename_i h have q:(iW a[i])а<=254:=by rw[ZS];exact aL _ have l:(NE.mx k (iW a[i]))а=lm kа (iW a[i])а:=NE.aA _ _;obtain ⟨o,p⟩:=cQ a (i+1) _ (by rw[l];omega) refine ⟨o,λj e d=>?_⟩ by_cases g:j=i .subst g;rw[getElem!_pos a j d];exact le_trans (by rw[l];omega) (em a (j+1) _) .exact p j А d .exact ⟨m,λj e d=>by omega⟩ termination_by aв-i lemma iH (j:Д) (k:Д->ф) (g p:р) (x:ZB) (o l:с) (h hb hl) (d:(rL j k g p x o l h hb hl).ok=true): (rL j k g p x o l h hb hl).Aа<=1072:=by obtain ⟨m,V,q,-,-,-,e⟩:=gi j k g p x o l h hb hl;rw[e] at d⊢;simp only[υ,decide_eq_true_eq] at d;have:=κ.1 d.1.2;rw[μ];simp only[iZ] at this⊢;omega @[inline] def eu (e:RS) (KB KG:Д):ф:=e.ok&&NE.mx 1046 (NE.mx KB (KG+e.A)-25)<=1298 @[inline] def mZ (e:RS) (KB KG:Д) (gd bd:@& FloatArray) (N:с) (hg:Nб<= gdд) (hb:Nб<= bdд) (X:FloatArray) (hX:Nб<= Xд):FloatArray:= if eu e KB KG then bR e.m e.ri gd bd N hg hb 0 X hX else X lemma ix (e:RS) (d g:Д) (j h:FloatArray) (N:с) (hg hb) (X:FloatArray) (hX):(mZ e d g j h N hg hb X hX)д=Xд:=by unfold mZ;split .exact d9 .. .rfl @[inline] def cC (n:о) (x g b:ZB) (r:о) (eps:т) (e:RS) (KB KG:Д) (gd bd Z:FloatArray) (lo N:с) (hN:loб+Nб<2^32) (hx:loб+Nб<= xв) (hg:Nб<= gв) (hb:Nб<= bв) (hgd:Nб<= gdд) (hbd:Nб<= bdд) (hZ:Nб<= Zд) (out:ZB) (ho:loб+Nб<= outв):ZB:= if eu e KB KG then b9 n x g b r e ((1:Д)<<<(NE.mx KB (KG+e.A)-NE.mx 1046 (NE.mx KB (KG+e.A)-25))) (NE.mx 1046 (NE.mx KB (KG+e.A)-25)) (1298-NE.mx 1046 (NE.mx KB (KG+e.A)-25)) Z lo N hN hx hg hb hZ 0 out ho else if e.ok then QE lo N (λj hj=> have:=γ.mp hj eL n x r e (x.uget (lo+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget j А) (b.uget j А) (gd.uget j А) (bd.uget j А)) hN 0 out ho else fL n eps x g b r lo N hN out ho lemma gK (n:о) (x g b:ZB) (r:о) (h:i9) (e:RS) (j l:Д) (o m Z:FloatArray) (p N:с) (hN hx hg hb hgd hbd hZ) (d:ZB) (ho): (cC n x g b r h e j l o m Z p N hN hx hg hb hgd hbd hZ d ho)в=dв:=by unfold cC;split .exact ek .. .split .exact bL .. .simp only[fL];exact bL .. lemma gJ (n:о) (x g b:ZB) (r:о) (z:i9) (e E:RS) (Y:e=E) (V:e.ok=true->e.Aа<=1072) (l d:Д) (y N:с) (G:∀j have:=γ.mp Z eL n x r E (x.uget (y+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) (g.uget j А) (b.uget j А) (v.uget j А) (u.uget j А)) hN 0 t ho else fL n z x g b r y N hN t ho:=by subst Y;unfold cC;split .rename_i S have D:=S;simp only[eu,υ,decide_eq_true_eq] at D;obtain ⟨K,U⟩:=D;rw[if_pos K];have W:=V K;have F:(d+e.A)а=dа+e.Aа:=by rw[μ];omega have o:(NE.mx l (d+e.A))а=lm lа (dа+e.Aа):=by rw[NE.aA,F] have B:(NE.mx l (d+e.A)-25)а=lm lа (dа+e.Aа)-25:=by rw[χ _ _ (κ.2 (by rw[o];simp only[iZ];omega)),o];rfl have h:(NE.mx 1046 (NE.mx l (d+e.A)-25))а=lm 1046 (lm lа (dа+e.Aа)-25):=by rw[NE.aA,B];rfl have p:=κ.1 U;simp only[iZ] at p;have hz:mZ e l d v u N hgd hbd X I=bR e.m e.ri v u N hgd hbd 0 X I:=by unfold mZ;rw[if_pos S] apply ej n x g b r e _ _ _ v u _ y N hN hx hg hb hZ hgd hbd .intro q w;rw[hz,d8,if_pos ⟨by simp,w⟩,J q w] .intro q w;rw[o];have:=G q w;omega .intro q w;rw[o];have:=H q w;omega .rw[o];omega .rw[h,o] .rw[h] at p⊢;exact p .have Q:(NE.mx l (d+e.A)-NE.mx 1046 (NE.mx l (d+e.A)-25))а=lm lа (dа+e.Aа)-lm 1046 (lm lа (dа+e.Aа)-25):=by rw[χ _ _ (κ.2 (by rw[h,o];omega)),h,o] rw[du _ (by rw[Q];omega),Q,h,o] .rw[o];omega .rfl def dj (T:@& FloatArray) (hT:Tд=512) (rows n:о) (Ln:Д) (Ep rn:р) (eps:т) (KB KG:Д) (x g b:ZB) (gd bd:FloatArray) (hn:rows*n+1<2^32) (hx:rows*n<= xв) (hg:n<= gв) (hb:n<= bв) (hgd:n<= gdд) (hbd:n<= bdд) (r:о) (Y:FloatArray) (hY:n+1<= Yд) (out:ZB) (ho:rows*n<= outв):ZB:= if hr:rby rw[J q K,if_pos (by simp)] have M:=ec x (r*n)г nг (by rw[l,d];omega) (by rw[l,d];omega) (by rw[d];omega) (aY P ag x (r*n)г nг (by rw[l,d];omega) (by rw[l,d];omega) (by rw[d];omega) 0 (by simp) 0 0 Y (by rw[d];omega)) (by rw[bS,d];omega) 0 (by simp) 0 0 Y (by rw[d];omega) (λq _ K=>m q K) have L:=(fj P ag y (xD n x r h true) v F _ nг (by rw[bS,d];omega) (by rw[d];omega) M).trans (gN y (xD n x r h true) v F (aY P ag x (r*n)г nг (by rw[l,d];omega) (by rw[l,d];omega) (by rw[d];omega) 0 (by simp) 0 0 Y (by rw[d];omega)) x (r*n)г nг (by rw[bS,d];omega) (by rw[d];omega) (by rw[I];omega) (by rw[I];omega) (by rw[I,l];omega) (by rw[l,d];omega) m) exact (er e n y v F h u w x g b H G hn hx hg hb hgd hbd z o p A t (r+1) _ _ _ _).trans (fG _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (gJ n x g b r h _ _ L (λD=>by rw[L] at D⊢;exact iH _ _ _ _ _ _ _ _ _ _ D) u w _ _ (λj B=>z j (by rw[d] at B;exact B)) o p (λj B=>A j (by rw[d] at B;exact B)) t H G _ _ _ _ _ _ _ _ _ m _ _)) .rfl termination_by e-r lemma fB (e N:с) (f g:(j:с)->ji9) (l:eб+Nб<2^32) (i:с) (a:ZB) (m:eб+Nб<= aв) (h:∀j d,f j d=g j d):QE e N f l i a m=QE e N g l i a m:=by have:f=g:=funext λj=>funext λd=>h j d subst this;rfl lemma d5 {α:Type} {c:Prop} [Decidable c] (a d b:α) (h:c->a=d):(if c then a else b)=(if c then d else b):=by split .exact h ‹_› .rfl def c5 (rows n:о) (Ln:Д) (Ep rn:р) (eps:т) (x g b:ZB) (hn:rows*n+1<2^32) (hx:rows*n<= xв) (hg:n<= gв) (hb:n<= bв) (r:о) (out:ZB) (ho:rows*n<= outв):ZB:= if hr:r have:=γ.mp hj let gw:=g.uget j А;let bw:=b.uget j А eL n x r e (x.uget ((r*n)г+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) gw bw (dw gw) (dw bw)) (by rw[h2,h3];omega) 0 out (by rw[h2,h3];omega) else fL n eps x g b r (r*n)г nг (by rw[h2,h3];omega) out (by rw[h2,h3];omega)) (by split<;>simp only[bL,fL]<;>exact ho) else out termination_by rows-r lemma dS (d n:о) (q:Д) (p v:р) (e:i9) (x g b:ZB) (u t:FloatArray) (hn hx hg hb hgd hbd) (m:∀jby have:=d q (by simp) (by rw[j];exact g);rw[e] at this;simp only[jj] at this;omega⟩ lemma cA (a:ZB) (e:∀q0&&n>0&&xв==rows*n&&gв==n&&bв==n&&rows*n<=4294967294&&n<=1048576&& aV x x.usize (Ϭ _) 0 (aV g g.usize (Ϭ _) 0 (aV b b.usize (Ϭ _) 0 0))<255&& finiteWord eps&&(!ZX eps&&ZC eps !=0)&&rq nж.toInt64.toFloat (1/nж.toInt64.toFloat) lemma ef {d n:о} {e:i9} {x g b:ZB} (h:ee d n e x g b=true):(aQ d n e x g&&bв==n&&b.all jS)=true:=by simp only[ee,υ,decide_eq_true_eq,beq_iff_eq] at h;obtain ⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨q,r⟩,t⟩,u⟩,v⟩,w⟩,y⟩,z⟩,A⟩,j⟩,l⟩:=h;have m:=cB x _ А (ϖ.1 z);have o:=cB g _ А m.1;have p:=cB b _ А o.1;simp only[aQ,SN,υ,decide_eq_true_eq,beq_iff_eq,cA x m.2,cA g o.2,cA b p.2];exact ⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨q,r⟩,t⟩,u⟩,trivial⟩,trivial⟩,A⟩,j⟩,w⟩,y⟩,l⟩,v⟩,trivial⟩ def aM (rows n:о) (eps:т) (x g b:ZB):ZB:= if h:ee rows n eps x g b then have l:=di (ef h);have d:=aT l.1;have z:=bE d.1 if rows<4 then c5 rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps x g b d.2.1 А А А 0 (Array.replicate (rows*n) 0) (by simp) else dj P ag rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps (bb b 0 0+1051) (bb g 0 0) x g b (aq g) (aq b) d.2.1 А А А (by rw[(af g).1];omega) (by rw[(af b).1];omega) 0 (aq (Array.replicate (n+1) 0)) (by rw[(af _).1];simp) (Array.replicate (rows*n) 0) (by simp) else layernormSpec rows n eps x g b lemma bG:aM=lJ:=by funext q n r x g b;unfold aM;split .rename_i h have o:=ef h;rw[<-bF];unfold ar;rw[dif_pos o];have l:=di o;have d:=aT l.1;have z:=bE d.1;dsimp only;split .exact dS _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (λj m=>(af g).2 j А) (λj m=>(af b).2 j А) _ _ _ .have t:=cQ b 0 0 (by simp);have p:=cQ g 0 0 (by simp) have e:(bb b 0 0+1051)а=(bb b 0 0)а+1051:=by rw[μ];simp only[iZ];omega exact er _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (λj m=>by rw[e];have:=t.2 j А А;omega) (by rw[e];omega) (by rw[e];omega) (λj m=>p.2 j А А) p.1 _ _ _ _ _ .rfl def c6 (rows n:о) (Ln:Д) (Ep rn:р) (eps:т) (x g:ZB) (hn:rows*n+1<2^32) (hx:rows*n<= xв) (hg:n<= gв) (r:о) (out:ZB) (ho:rows*n<= outв):ZB:= if hr:r have:=γ.mp hj let gw:=g.uget j А eR e (x.uget ((r*n)г+j) (by rw[Dense.ab (by have:=ς;omega)];omega)) gw (dw gw)) (by rw[h2,h3];omega) 0 out (by rw[h2,h3];omega) else fR n eps x g r (r*n)г nг (by rw[h2,h3];omega) out (by rw[h2,h3];omega)) (by split<;>simp only[bL,fR]<;>exact ho) else out termination_by rows-r lemma gV (d n:о) (l:Д) (j p:р) (e:i9) (x g:ZB) (o:FloatArray) (hn hx hg hgd) (r:о) (a m:ZB) (ha ha') (h:a=m): RR d n l j p e x g o hn hx hg hgd r a ha=RR d n l j p e x g o hn hx hg hgd r m ha':=by subst h;rfl lemma dT (d n:о) (p:Д) (o t:р) (e:i9) (x g:ZB) (q:FloatArray) (hn hx hg hgd) (h:∀j0&&n>0&&xв==rows*n&&gв==n&&rows*n<=4294967294&&n<=1048576&& aV x x.usize (Ϭ _) 0 (aV g g.usize (Ϭ _) 0 0)<255&& finiteWord eps&&(!ZX eps&&ZC eps !=0)&&rq nж.toInt64.toFloat (1/nж.toInt64.toFloat) lemma eh {d n:о} {e:i9} {x g:ZB} (h:eg d n e x g=true):aQ d n e x g=true:=by simp only[eg,υ,decide_eq_true_eq,beq_iff_eq] at h;obtain ⟨⟨⟨⟨⟨⟨⟨⟨⟨p,q⟩,r⟩,t⟩,u⟩,v⟩,w⟩,y⟩,j⟩,l⟩:=h;have m:=cB x _ А (ϖ.1 w);have o:=cB g _ А m.1;simp only[aQ,SN,υ,decide_eq_true_eq,beq_iff_eq,cA x m.2,cA g o.2];exact ⟨⟨⟨⟨⟨⟨⟨⟨⟨⟨p,q⟩,r⟩,t⟩,trivial⟩,trivial⟩,y⟩,j⟩,u⟩,v⟩,l⟩ def bh (rows n:о) (eps:т) (x g:ZB):ZB:= if h:eg rows n eps x g then have d:=aT (eh h);have z:=bE d.1 if rows<4 then c6 rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps x g d.2.1 А А 0 (Array.replicate (rows*n) 0) (by simp) else let gd:=aq g RR rows n (lw n) (dw eps*NR.pt 149) (1/nж.toInt64.toFloat) eps x g gd d.2.1 А А (by rw[(af g).1];omega) 0 (Array.replicate (rows*n) 0) (by simp) else rmsnormSpec rows n eps x g lemma bZ:bh=rmsnormSpec:=by funext l n m x g;unfold bh;split .rename_i h have e:=eh h;rw[<-bY];unfold aO;rw[dif_pos e];have d:=aT e;have z:=bE d.1;dsimp only;split .exact dT _ _ _ _ _ _ _ _ _ _ _ _ _ (λj o=>(af g).2 j А) _ _ _ .rfl .rfl end Norm end namespace CV theorem dc{n}{a b c d:Nat→Word}(h:∀t,tapply Array.ext (by simp)<;>intro i j _<;>simp only[Array.size_ofFn] at j<;>simp[h i j,g i j] theorem ge{n}(f:Fin n→Word)(k)(h:kwindowAt s x 0 (r.1/s.taps/s.wo%s.ho) (r.1/s.taps%s.wo) (r.1%s.taps) @[inline] def cl(s:ConvShape)(u:Bool)(x w b:Array Word):Array Word:= if s.groups=1∧0L[(q.1%(s.ho*s.wo))*s.cout+q.1/(s.ho*s.wo)]! else conv2dWith Pinned.dotFn s u x w b theorem cl_eq:cl=conv2dWith dotOf:=by funext s u x w b;unfold cl;split_ifs with h · obtain ⟨hg,hk⟩:=h;rw[Dense.F.Pn.dK];generalize hP:s.ho*s.wo=P have p0:0