Current task: —

E-021-sinf-sf-curve.py

Experiments: E-021 · script updated 08-19-2026

E-021-sinf-sf-curve.csv — 299.9 KB, updated 08-19-2026

← prev page 5 of 10 · 500/page · 5000 rows next →
# nS_infS_flambda_nabs_Sf
2002 2001 5343.16128272 -10.703014107 5354.86429683 10.703014107
2003 2002 5346.33177811 -10.6240424134 5357.95582053 10.6240424134
2004 2003 5349.50252326 -10.5317018394 5361.0342251 10.5317018394
2005 2004 5352.67351803 -10.4261563368 5364.09967436 10.4261563368
2006 2005 5355.8447623 -10.3076173889 5367.15237969 10.3076173889
2007 2006 5359.01625594 -10.1763430958 5370.19259904 10.1763430958
2008 2007 5362.18799884 -10.0326370332 5373.22063588 10.0326370332
2009 2008 5365.35999087 -9.87684688854 5376.23683776 9.87684688854
2010 2009 5368.5322319 -9.7093628832 5379.24159479 9.7093628832
2011 2010 5371.70472181 -9.53061598778 5382.2353378 9.53061598778
2012 2011 5374.87746048 -9.34107594063 5385.21853642 9.34107594063
2013 2012 5378.05044778 -9.14124907925 5388.19169686 9.14124907925
2014 2013 5381.22368359 -8.93167599602 5391.15535959 8.93167599602
2015 2014 5384.39716778 -8.71292903017 5394.11009681 8.71292903017
2016 2015 5387.57090024 -8.48560960908 5397.05650985 8.48560960908
2017 2016 5390.74488084 -8.25034545233 5399.99522629 8.25034545233
2018 2017 5393.91910945 -8.00778765293 5402.9268971 8.00778765293
2019 2018 5397.09358595 -7.7586076507 5405.8521936 7.7586076507
2020 2019 5400.26831023 -7.50349411321 5408.77180434 7.50349411321
2021 2020 5403.44328215 -7.24314974022 5411.68643189 7.24314974022
2022 2021 5406.6185016 -6.97828800797 5414.5967896 6.97828800797
2023 2022 5409.79396844 -6.70962986987 5417.50359831 6.70962986987
2024 2023 5412.96968257 -6.43790043047 5420.407583 6.43790043047
2025 2024 5416.14564386 -6.16382560954 5423.30946947 6.16382560954
2026 2025 5419.32185218 -5.88812881331 5426.209981 5.88812881331
2027 2026 5422.49830742 -5.61152762977 5429.10983505 5.61152762977
2028 2027 5425.67500945 -5.33473056478 5432.00974001 5.33473056478
2029 2028 5428.85195814 -5.05843383556 5434.91039198 5.05843383556
2030 2029 5432.02915339 -4.78331823789 5437.81247163 4.78331823789
2031 2030 5435.20659506 -4.5100461027 5440.71664116 4.5100461027
2032 2031 5438.38428304 -4.2392583577 5443.6235414 4.2392583577
2033 2032 5441.5622172 -3.97157170863 5446.53378891 3.97157170863
2034 2033 5444.74039743 -3.70757595453 5449.44797338 3.70757595453
2035 2034 5447.91882359 -3.44783145056 5452.36665504 3.44783145056
2036 2035 5451.09749558 -3.192866731 5455.29036231 3.192866731
2037 2036 5454.27641327 -2.94317630444 5458.21958957 2.94317630444
2038 2037 5457.45557654 -2.69921863229 5461.15479517 2.69921863229
2039 2038 5460.63498526 -2.46141430055 5464.09639956 2.46141430055
2040 2039 5463.81463933 -2.23014439401 5467.04478372 2.23014439401
2041 2040 5466.99453861 -2.00574908098 5470.00028769 2.00574908098
2042 2041 5470.17468299 -1.78852641542 5472.96320941 1.78852641542
2043 2042 5473.35507235 -1.57873136244 5475.93380372 1.57873136244
2044 2043 5476.53570657 -1.37657505174 5478.91228162 1.37657505174
2045 2044 5479.71658553 -1.18222426262 5481.89880979 1.18222426262
2046 2045 5482.8977091 -0.995801142824 5484.89351024 0.995801142824
2047 2046 5486.07907717 -0.817383162417 5487.89646034 0.817383162417
2048 2047 5489.26068963 -0.647003302519 5490.90769293 0.647003302519
2049 2048 5492.44254634 -0.484650477695 5493.92719682 0.484650477695
2050 2049 5495.62464719 -0.330270189451 5496.95491738 0.330270189451
2051 2050 5498.80699207 -0.183765407188 5499.99075747 0.183765407188
2052 2051 5501.98958084 -0.0449976717221 5503.03457851 0.0449976717221
2053 2052 5505.1724134 0.0862115846027 5506.08620182 0.0862115846027
2054 2053 5508.35548963 0.210079508342 5509.14541012 0.210079508342
2055 2054 5511.5388094 0.326860094122 5512.2119493 0.326860094122
2056 2055 5514.7223726 0.436842261791 5515.28553033 0.436842261791
2057 2056 5517.9061791 0.540347751777 5518.36583135 0.540347751777
2058 2057 5521.0902288 0.637728849842 5521.45249995 0.637728849842
2059 2058 5524.27452157 0.729365953272 5524.54515562 0.729365953272
2060 2059 5527.4590573 0.815664991385 5527.64339231 0.815664991385
2061 2060 5530.64383586 0.897054714004 5530.74678114 0.897054714004
2062 2061 5533.82885714 0.973983862199 5533.85487327 0.973983862199
2063 2062 5537.01412102 1.04691823626 5536.96720278 1.04691823626
2064 2063 5540.19962738 1.11633767634 5540.0832897 1.11633767634
2065 2064 5543.38537611 1.18273297176 5543.20264314 1.18273297176
2066 2065 5546.57136709 1.24660271523 5546.32476437 1.24660271523
2067 2066 5549.75760019 1.30845011864 5549.44915008 1.30845011864
2068 2067 5552.94407531 1.36877980723 5552.57529551 1.36877980723
2069 2068 5556.13079233 1.42809460907 5555.70269772 1.42809460907
2070 2069 5559.31775113 1.48689235683 5558.83085877 1.48689235683
2071 2070 5562.50495159 1.54566271889 5561.95928887 1.54566271889
2072 2071 5565.69239359 1.60488407635 5565.08750952 1.60488407635
2073 2072 5568.88007703 1.66502046281 5568.21505657 1.66502046281
2074 2073 5572.06800178 1.72651858296 5571.34148319 1.72651858296
2075 2074 5575.25616772 1.78980492602 5574.4663628 1.78980492602
2076 2075 5578.44457475 1.85528298936 5577.58929176 1.85528298936
2077 2076 5581.63322273 1.92333062721 5580.70989211 1.92333062721
2078 2077 5584.82211157 1.99429753873 5583.82781403 1.99429753873
2079 2078 5588.01124114 2.06850290883 5586.94273823 2.06850290883
2080 2079 5591.20061132 2.14623321481 5590.0543781 2.14623321481
2081 2080 5594.390222 2.22774021037 5593.16248179 2.22774021037
2082 2081 5597.58007307 2.31323909843 5596.26683397 2.31323909843
2083 2082 5600.77016441 2.4029069025 5599.36725751 2.4029069025
2084 2083 5603.9604959 2.49688104594 5602.46361485 2.49688104594
2085 2084 5607.15106743 2.59525814701 5605.55580928 2.59525814701
2086 2085 5610.34187888 2.69809303659 5608.64378585 2.69809303659
2087 2086 5613.53293014 2.80539800454 5611.72753214 2.80539800454
2088 2087 5616.7242211 2.91714227916 5614.80707882 2.91714227916
2089 2088 5619.91575163 3.03325174331 5617.88249989 3.03325174331
2090 2089 5623.10752163 3.15360888928 5620.95391274 3.15360888928
2091 2090 5626.29953097 3.27805301362 5624.02147796 3.27805301362
2092 2091 5629.49177955 3.4063806515 5627.0853989 3.4063806515
2093 2092 5632.68426725 3.53834624934 5630.145921 3.53834624934
2094 2093 5635.87699395 3.6736630729 5633.20333088 3.6736630729
2095 2094 5639.06995955 3.81200434694 5636.2579552 3.81200434694
2096 2095 5642.26316393 3.95300462152 5639.3101593 3.95300462152
2097 2096 5645.45660696 4.09626135852 5642.3603456 4.09626135852
2098 2097 5648.65028855 4.24133673102 5645.40895182 4.24133673102
2099 2098 5651.84420857 4.38775962712 5648.45644895 4.38775962712
2100 2099 5655.03836692 4.53502784851 5651.50333907 4.53502784851
2101 2100 5658.23276347 4.68261049335 5654.55015298 4.68261049335
2102 2101 5661.42739812 4.82995051173 5657.59744761 4.82995051173
2103 2102 5664.62227075 4.97646742136 5660.64580333 4.97646742136
2104 2103 5667.81738125 5.12156017023 5663.69582108 5.12156017023
2105 2104 5671.01272951 5.26461013193 5666.74811938 5.26461013193
2106 2105 5674.20831541 5.40498421901 5669.80333119 5.40498421901
2107 2106 5677.40413883 5.54203809894 5672.86210074 5.54203809894
2108 2107 5680.60019968 5.67511949643 5675.92508018 5.67511949643
2109 2108 5683.79649783 5.80357156588 5678.99292626 5.80357156588
2110 2109 5686.99303317 5.92673631685 5682.06629685 5.92673631685
2111 2110 5690.18980559 6.04395807543 5685.14584751 6.04395807543
2112 2111 5693.38681497 6.15458696407 5688.23222801 6.15458696407
2113 2112 5696.58406122 6.25798238215 5691.32607883 6.25798238215
2114 2113 5699.7815442 6.35351646974 5694.42802773 6.35351646974
2115 2114 5702.97926381 6.44057753692 5697.53868628 6.44057753692
2116 2115 5706.17721995 6.51857344106 5700.6586465 6.51857344106
2117 2116 5709.37541248 6.58693489485 5703.78847759 6.58693489485
2118 2117 5712.57384132 6.64511868804 5706.92872263 6.64511868804
2119 2118 5715.77250634 6.69261080624 5710.07989553 6.69261080624
2120 2119 5718.97140742 6.72892943063 5713.24247799 6.72892943063
2121 2120 5722.17054447 6.753627803 5716.41691667 6.753627803
2122 2121 5725.36991737 6.76629694106 5719.60362043 6.76629694106
2123 2122 5728.56952601 6.7665681898 5722.80295782 6.7665681898
2124 2123 5731.76937027 6.75411559522 5726.01525468 6.75411559522
2125 2124 5734.96945005 6.72865808802 5729.24079196 6.72865808802
2126 2125 5738.16976523 6.68996146522 5732.47980377 6.68996146522
2127 2126 5741.37031571 6.63784015903 5735.73247555 6.63784015903
2128 2127 5744.57110137 6.57215878315 5738.99894259 6.57215878315
2129 2128 5747.77212211 6.49283344784 5742.27928866 6.49283344784
2130 2129 5750.9733778 6.39983283609 5745.57354497 6.39983283609
2131 2130 5754.17486835 6.29317903448 5748.88168932 6.29317903448
2132 2131 5757.37659364 6.17294811356 5752.20364553 6.17294811356
2133 2132 5760.57855356 6.03927045362 5755.53928311 6.03927045362
2134 2133 5763.78074801 5.89233081314 5758.88841719 5.89233081314
2135 2134 5766.98317686 5.73236813838 5762.25080872 5.73236813838
2136 2135 5770.18584002 5.55967511387 5765.62616491 5.55967511387
2137 2136 5773.38873737 5.37459745479 5769.01413991 5.37459745479
2138 2137 5776.5918688 5.17753294356 5772.41433586 5.17753294356
2139 2138 5779.7952342 4.96893021421 5775.82630399 4.96893021421
2140 2139 5782.99883347 4.74928728926 5779.24954618 4.74928728926
2141 2140 5786.20266649 4.51914987517 5782.68351662 4.51914987517
2142 2141 5789.40673316 4.27910942361 5786.12762374 4.27910942361
2143 2142 5792.61103336 4.02980096684 5789.5812324 4.02980096684
2144 2143 5795.81556699 3.77190073682 5793.04366625 3.77190073682
2145 2144 5799.02033394 3.50612357848 5796.51421036 3.50612357848
2146 2145 5802.22533409 3.23322016889 5799.99211392 3.23322016889
2147 2146 5805.43056735 2.95397405488 5803.47659329 2.95397405488
2148 2147 5808.6360336 2.66919852253 5806.96683507 2.66919852253
2149 2148 5811.84173273 2.37973331296 5810.46199942 2.37973331296
2150 2149 5815.04766463 2.08644119953 5813.96122343 2.08644119953
2151 2150 5818.25382921 1.79020444215 5817.46362476 1.79020444215
2152 2151 5821.46022633 1.49192113541 5820.9683052 1.49192113541
2153 2152 5824.66685591 1.19250146723 5824.47435445 1.19250146723
2154 2153 5827.87371784 0.892863905764 5827.98085393 0.892863905764
2155 2154 5831.08081199 0.593931332232 5831.48688066 0.593931332232
2156 2155 5834.28813827 0.296627137924 5834.99151114 0.296627137924
2157 2156 5837.49569658 0.00187130370319 5838.49382527 0.00187130370319
2158 2157 5840.70348679 -0.289423519518 5841.99291031 0.289423519518
2159 2158 5843.9115088 -0.57635591082 5845.48786471 0.57635591082
2160 2159 5847.11976251 -0.858039541408 5848.97780206 0.858039541408
2161 2160 5850.32824781 -1.13360698053 5852.46185479 1.13360698053
2162 2161 5853.5369646 -1.40221342715 5855.93917802 1.40221342715
2163 2162 5856.74591275 -1.66304034967 5859.4089531 1.66304034967
2164 2163 5859.95509217 -1.91529901635 5862.87039119 1.91529901635
2165 2164 5863.16450276 -2.1582338997 5866.32273666 2.1582338997
2166 2165 5866.37414439 -2.39112593863 5869.76527033 2.39112593863
2167 2166 5869.58401698 -2.61329564265 5873.19731262 2.61329564265
2168 2167 5872.7941204 -2.8241060236 5876.61822643 2.8241060236
2169 2168 5876.00445456 -3.02296534063 5880.0274199 3.02296534063
2170 2169 5879.21501935 -3.20932964542 5883.42434899 3.20932964542
2171 2170 5882.42581465 -3.38270511558 5886.80851977 3.38270511558
2172 2171 5885.63684037 -3.54265016478 5890.17949054 3.54265016478
2173 2172 5888.8480964 -3.68877731982 5893.53687372 3.68877731982
2174 2173 5892.05958264 -3.82075485539 5896.88033749 3.82075485539
2175 2174 5895.27129896 -3.93830817881 5900.20960714 3.93830817881
2176 2175 5898.48324528 -4.041220958 5903.52446624 4.041220958
2177 2176 5901.69542149 -4.12933598737 5906.82475748 4.12933598737
2178 2177 5904.90782747 -4.20255578732 5910.11038326 4.20255578732
2179 2178 5908.12046313 -4.26084293447 5913.38130607 4.26084293447
2180 2179 5911.33332836 -4.30422012108 5916.63754848 4.30422012108
2181 2180 5914.54642305 -4.33276994327 5919.87919299 4.33276994327
2182 2181 5917.75974709 -4.34663441896 5923.10638151 4.34663441896
2183 2182 5920.97330039 -4.34601423786 5926.31931463 4.34601423786
2184 2183 5924.18708284 -4.33116774709 5929.51825059 4.33116774709
2185 2184 5927.40109433 -4.3024096771 5932.70350401 4.3024096771
2186 2185 5930.61533476 -4.26010961405 5935.87544437 4.26010961405
2187 2186 5933.82980402 -4.20469022583 5939.03449425 4.20469022583
2188 2187 5937.04450201 -4.13662525028 5942.18112726 4.13662525028
2189 2188 5940.25942862 -4.05643725496 5945.31586588 4.05643725496
2190 2189 5943.47458375 -3.96469517935 5948.43927893 3.96469517935
2191 2190 5946.6899673 -3.862011671 5951.55197897 3.862011671
2192 2191 5949.90557916 -3.74904022842 5954.65461939 3.74904022842
2193 2192 5953.12141922 -3.6264721642 5957.74789139 3.6264721642
2194 2193 5956.33748739 -3.49503340282 5960.83252079 3.49503340282
2195 2194 5959.55378355 -3.35548112845 5963.90926468 3.35548112845
2196 2195 5962.77030761 -3.20860029852 5966.97890791 3.20860029852
2197 2196 5965.98705946 -3.05520003974 5970.0422595 3.05520003974
2198 2197 5969.20403899 -2.89610994352 5973.10014894 2.89610994352
2199 2198 5972.42124611 -2.73217627857 5976.15342239 2.73217627857
2200 2199 5975.63868071 -2.56425813834 5979.20293885 2.56425813834
2201 2200 5978.85634268 -2.39322354182 5982.24956622 2.39322354182
2202 2201 5982.07423193 -2.21994550586 5985.29417744 2.21994550586
2203 2202 5985.29234835 -2.04529810781 5988.33764645 2.04529810781
2204 2203 5988.51069183 -1.87015255679 5991.38084439 1.87015255679
2205 2204 5991.72926227 -1.69537329236 5994.42463557 1.69537329236
2206 2205 5994.94805958 -1.52181412866 5997.46987371 1.52181412866
2207 2206 5998.16708364 -1.35031446237 6000.51739811 1.35031446237
2208 2207 6001.38633436 -1.18169556201 6003.56802992 1.18169556201
2209 2208 6004.60581163 -1.01675695614 6006.62256859 1.01675695614
2210 2209 6007.82551535 -0.856272937114 6009.68178829 0.856272937114
2211 2210 6011.04544542 -0.700989196714 6012.74643461 0.700989196714
2212 2211 6014.26560173 -0.551619609294 6015.81722134 0.551619609294
2213 2212 6017.48598418 -0.408843177171 6018.89482736 0.408843177171
2214 2213 6020.70659267 -0.273301152369 6021.97989382 0.273301152369
2215 2214 6023.9274271 -0.145594347845 6025.07302145 0.145594347845
2216 2215 6027.14848736 -0.026280650413 6028.17476802 0.026280650413
2217 2216 6030.36977336 0.0841272534288 6031.28564611 0.0841272534288
2218 2217 6033.59128499 0.1851639286 6034.40612107 0.1851639286
2219 2218 6036.81302215 0.276413010417 6037.53660914 0.276413010417
2220 2219 6040.03498474 0.357508783536 6040.67747596 0.357508783536
2221 2220 6043.25717266 0.428137514125 6043.82903515 0.428137514125
2222 2221 6046.4795858 0.488038529738 6046.99154727 0.488038529738
2223 2222 6049.70222406 0.537005042622 6050.16521902 0.537005042622
2224 2223 6052.92508735 0.574884713413 6053.35020264 0.574884713413
2225 2224 6056.14817556 0.601579953461 6056.54659561 0.601579953461
2226 2225 6059.37148859 0.617047965313 6059.75444062 0.617047965313
2227 2226 6062.59502634 0.621300522128 6062.97372581 0.621300522128
2228 2227 6065.8187887 0.614403488084 6066.20438521 0.614403488084
2229 2228 6069.04277559 0.596476083101 6069.4462995 0.596476083101
2230 2229 6072.26698689 0.567689896419 6072.69929699 0.567689896419
2231 2230 6075.4914225 0.528267654811 6075.96315485 0.528267654811
2232 2231 6078.71608233 0.478481752361 6079.23760058 0.478481752361
2233 2232 6081.94096628 0.418652549917 6082.52231373 0.418652549917
2234 2233 6085.16607424 0.349146453406 6085.81692778 0.349146453406
2235 2234 6088.39140611 0.270373781268 6089.12103233 0.270373781268
2236 2235 6091.6169618 0.182786432267 6092.43417537 0.182786432267
2237 2236 6094.8427412 0.086875365879 6095.75586583 0.086875365879
2238 2237 6098.06874421 -0.0168320916517 6099.08557631 0.0168320916517
2239 2238 6101.29497074 -0.127775101686 6102.42274584 0.127775101686
2240 2239 6104.52142068 -0.245362313343 6105.766783 0.245362313343
2241 2240 6107.74809394 -0.368974994102 6109.11706894 0.368974994102
2242 2241 6110.97499041 -0.497970274943 6112.47296069 0.497970274943
2243 2242 6114.20211 -0.631684493581 6115.83379449 0.631684493581
2244 2243 6117.4294526 -0.769436618932 6119.19888922 0.769436618932
2245 2244 6120.65701811 -0.910531739592 6122.56754985 0.910531739592
2246 2245 6123.88480645 -1.05426459885 6125.93907104 1.05426459885
2247 2246 6127.1128175 -1.19992315856 6129.31274065 1.19992315856
2248 2247 6130.34105116 -1.34679217422 6132.68784334 1.34679217422
2249 2248 6133.56950735 -1.49415676333 6136.06366411 1.49415676333
2250 2249 6136.79818596 -1.64130594965 6139.43949191 1.64130594965
2251 2250 6140.02708688 -1.78753616562 6142.81462305 1.78753616562
2252 2251 6143.25621003 -1.93215469591 6146.18836473 1.93215469591
2253 2252 6146.48555531 -2.07448304517 6149.56003835 2.07448304517
2254 2253 6149.7151226 -2.2138602136 6152.92898282 2.2138602136
2255 2254 6152.94491183 -2.34964586439 6156.29455769 2.34964586439
2256 2255 6156.17492288 -2.48122336767 6159.65614625 2.48122336767
2257 2256 6159.40515566 -2.6080027065 6163.01315837 2.6080027065
2258 2257 6162.63561008 -2.72942323075 6166.36503331 2.72942323075
2259 2258 6165.86628602 -2.84495624591 6169.71124227 2.84495624591
2260 2259 6169.0971834 -2.95410742465 6173.05129083 2.95410742465
2261 2260 6172.32830212 -3.05641902963 6176.38472115 3.05641902963
2262 2261 6175.55964208 -3.1514719374 6179.71111401 3.1514719374
2263 2262 6178.79120318 -3.23888745417 6183.03009063 3.23888745417
2264 2263 6182.02298532 -3.31832891498 6186.34131423 3.31832891498
2265 2264 6185.2549884 -3.38950305947 6189.64449146 3.38950305947
2266 2265 6188.48721234 -3.4521611782 6192.93937352 3.4521611782
2267 2266 6191.71965702 -3.50610002468 6196.22575705 3.50610002468
2268 2267 6194.95232236 -3.55116248975 6199.50348485 3.55116248975
2269 2268 6198.18520826 -3.58723803576 6202.77244629 3.58723803576
2270 2269 6201.41831461 -3.61426288962 6206.0325775 3.61426288962
2271 2270 6204.65164132 -3.63221999471 6209.28386132 3.63221999471
2272 2271 6207.8851883 -3.64113872298 6212.52632702 3.64113872298
2273 2272 6211.11895545 -3.64109434994 6215.7600498 3.64109434994
2274 2273 6214.35294266 -3.63220729604 6218.98514996 3.63220729604
2275 2274 6217.58714985 -3.61464213966 6222.20179199 3.61464213966
2276 2275 6220.82157692 -3.5886064075 6225.41018333 3.5886064075
2277 2276 6224.05622377 -3.55434914981 6228.61057292 3.55434914981
2278 2277 6227.2910903 -3.51215930852 6231.80324961 3.51215930852
2279 2278 6230.52617642 -3.46236388776 6234.9885403 3.46236388776
2280 2279 6233.76148202 -3.40532593694 6238.16680796 3.40532593694
2281 2280 6236.99700703 -3.34144235763 6241.33844939 3.34144235763
2282 2281 6240.23275133 -3.27114154638 6244.50389288 3.27114154638
2283 2282 6243.46871483 -3.19488088635 6247.66359572 3.19488088635
2284 2283 6246.70489744 -3.11314410133 6250.81804154 3.11314410133
2285 2284 6249.94129906 -3.02643848663 6253.96773755 3.02643848663
2286 2285 6253.1779196 -2.93529203147 6257.11321163 2.93529203147
2287 2286 6256.41475895 -2.84025044865 6260.2550094 2.84025044865
2288 2287 6259.65181702 -2.74187412699 6263.39369115 2.74187412699
2289 2288 6262.88909372 -2.64073502305 6266.52982875 2.64073502305
2290 2289 6266.12658896 -2.53741350846 6269.66400247 2.53741350846
2291 2290 6269.36430263 -2.43249518959 6272.79679782 2.43249518959
2292 2291 6272.60223464 -2.32656771638 6275.92880235 2.32656771638
2293 2292 6275.84038489 -2.22021759701 6279.06060249 2.22021759701
2294 2293 6279.0787533 -2.11402703529 6282.19278033 2.11402703529
2295 2294 6282.31733976 -2.00857080719 6285.32591056 2.00857080719
2296 2295 6285.55614418 -1.90441319301 6288.46055737 1.90441319301
2297 2296 6288.79516646 -1.80210498103 6291.59727144 1.80210498103
2298 2297 6292.03440652 -1.70218055832 6294.73658708 1.70218055832
2299 2298 6295.27386425 -1.60515510386 6297.87901935 1.60515510386
2300 2299 6298.51353956 -1.51152189846 6301.02506146 1.51152189846
2301 2300 6301.75343235 -1.42174976541 6304.17518212 1.42174976541
2302 2301 6304.99354254 -1.33628065508 6307.3298232 1.33628065508
2303 2302 6308.23387003 -1.25552738588 6310.48939741 1.25552738588
2304 2303 6311.47441471 -1.17987155323 6313.65428627 1.17987155323
2305 2304 6314.71517651 -1.10966161714 6316.82483813 1.10966161714
2306 2305 6317.95615532 -1.04521117827 6320.0013665 1.04521117827
2307 2306 6321.19735105 -0.986797451004 6323.1841485 0.986797451004
2308 2307 6324.4387636 -0.934659941566 6326.37342354 0.934659941566
2309 2308 6327.68039289 -0.888999337418 6329.56939223 0.888999337418
2310 2309 6330.92223881 -0.849976613711 6332.77221543 0.849976613711
2311 2310 6334.16430128 -0.817712361016 6335.98201364 0.817712361016
2312 2311 6337.4065802 -0.792286337542 6339.19886654 0.792286337542
2313 2312 6340.64907547 -0.773737247847 6342.42281272 0.773737247847
2314 2313 6343.89178701 -0.762062748842 6345.65384976 0.762062748842
2315 2314 6347.13471472 -0.757219682711 6348.8919344 0.757219682711
2316 2315 6350.3778585 -0.759124535155 6352.13698304 0.759124535155
2317 2316 6353.62121827 -0.767654116202 6355.38887239 0.767654116202
2318 2317 6356.86479393 -0.782646459643 6358.64744038 0.782646459643
2319 2318 6360.10858538 -0.803901936009 6361.91248731 0.803901936009
2320 2319 6363.35259253 -0.831184572883 6365.1837771 0.831184572883
2321 2320 6366.5968153 -0.864223575255 6368.46103887 0.864223575255
2322 2321 6369.84125358 -0.902715037549 6371.74396862 0.902715037549
2323 2322 6373.08590729 -0.946323837989 6375.03223112 0.946323837989
2324 2323 6376.33077632 -0.994685704963 6378.32546203 0.994685704963
2325 2324 6379.5758606 -1.04740944417 6381.62327005 1.04740944417
2326 2325 6382.82116003 -1.10407931446 6384.92523934 1.10407931446
2327 2326 6386.0666745 -1.16425753953 6388.23093204 1.16425753953
2328 2327 6389.31240394 -1.22748694183 6391.53989088 1.22748694183
2329 2328 6392.55834825 -1.29329368459 6394.85164193 1.29329368459
2330 2329 6395.80450733 -1.36119010688 6398.16569744 1.36119010688
2331 2330 6399.0508811 -1.43067763677 6401.48155874 1.43067763677
2332 2331 6402.29746946 -1.50124976654 6404.79871923 1.50124976654
2333 2332 6405.54427233 -1.57239507397 6408.1166674 1.57239507397
2334 2333 6408.79128959 -1.64360027347 6411.43488987 1.64360027347
2335 2334 6412.03852118 -1.71435328047 6414.75287446 1.71435328047
2336 2335 6415.28596699 -1.78414627242 6418.07011326 1.78414627242
2337 2336 6418.53362693 -1.85247872997 6421.38610566 1.85247872997
2338 2337 6421.78150092 -1.9188604417 6424.70036136 1.9188604417
2339 2338 6425.02958885 -1.9828144561 6428.01240331 1.9828144561
2340 2339 6428.27789064 -2.04387996477 6431.32177061 2.04387996477
2341 2340 6431.5264062 -2.10161510105 6434.6280213 2.10161510105
2342 2341 6434.77513543 -2.15559963875 6437.93073507 2.15559963875
2343 2342 6438.02407825 -2.20543757621 6441.22951583 2.20543757621
2344 2343 6441.27323456 -2.25075959148 6444.52399415 2.25075959148
2345 2344 6444.52260427 -2.29122535487 6447.81382963 2.29122535487
2346 2345 6447.7721873 -2.32652568624 6451.09871298 2.32652568624
2347 2346 6451.02198354 -2.35638454471 6454.37836808 2.35638454471
2348 2347 6454.27199291 -2.38056083984 6457.65255375 2.38056083984
2349 2348 6457.52221532 -2.39885005366 6460.92106537 2.39885005366
2350 2349 6460.77265067 -2.41108566452 6464.18373634 2.41108566452
2351 2350 6464.02329889 -2.41714036418 6467.44043925 2.41714036418
2352 2351 6467.27415986 -2.4169270611 6470.69108692 2.4169270611
2353 2352 6470.52523352 -2.41039966357 6473.93563318 2.41039966357
2354 2353 6473.77651976 -2.39755363781 6477.17407339 2.39755363781
2355 2354 6477.02801849 -2.37842633711 6480.40644483 2.37842633711
2356 2355 6480.27972963 -2.35309709933 6483.63282673 2.35309709933
2357 2356 6483.53165308 -2.32168711138 6486.85334019 2.32168711138
2358 2357 6486.78378876 -2.28435904021 6490.0681478 2.28435904021
2359 2358 6490.03613657 -2.24131643154 6493.277453 2.24131643154
2360 2359 6493.28869642 -2.19280287825 6496.4814993 2.19280287825
2361 2360 6496.54146823 -2.13910096198 6499.68056919 2.13910096198
2362 2361 6499.7944519 -2.08053097234 6502.87498287 2.08053097234
2363 2362 6503.04764735 -2.01744940965 6506.06509676 2.01744940965
2364 2363 6506.30105448 -1.95024727785 6509.25130176 1.95024727785
2365 2364 6509.55467321 -1.87934817579 6512.43402139 1.87934817579
2366 2365 6512.80850344 -1.80520619578 6515.61370964 1.80520619578
2367 2366 6516.06254509 -1.72830363959 6518.79084873 1.72830363959
2368 2367 6519.31679807 -1.64914856288 6521.96594664 1.64914856288
2369 2368 6522.57126229 -1.56827216011 6525.13953445 1.56827216011
2370 2369 6525.82593765 -1.48622600273 6528.31216365 1.48622600273
2371 2370 6529.08082408 -1.40357914432 6531.48440322 1.40357914432
2372 2371 6532.33592147 -1.32091510712 6534.65683658 1.32091510712
2373 2372 6535.59122975 -1.2388287649 6537.83005851 1.2388287649
2374 2373 6538.84674881 -1.15792313789 6541.00467195 1.15792313789
2375 2374 6542.10247859 -1.07880611592 6544.1812847 1.07880611592
2376 2375 6545.35841897 -1.00208712635 6547.3605061 1.00208712635
2377 2376 6548.61456989 -0.928373763639 6550.54294365 0.928373763639
2378 2377 6551.87093124 -0.858268397978 6553.72919963 0.858268397978
2379 2378 6555.12750294 -0.792364780059 6556.91986772 0.792364780059
2380 2379 6558.3842849 -0.73124465971 6560.11552956 0.73124465971
2381 2380 6561.64127703 -0.675474435708 6563.31675147 0.675474435708
2382 2381 6564.89847925 -0.625601854228 6566.5240811 0.625601854228
2383 2382 6568.15589146 -0.582152773098 6569.73804423 0.582152773098
2384 2383 6571.41351358 -0.54562800884 6572.95914159 0.54562800884
2385 2384 6574.67134552 -0.516500283069 6576.1878458 0.516500283069
2386 2385 6577.92938719 -0.495211284453 6579.42459848 0.495211284453
2387 2386 6581.18763851 -0.48216886187 6582.66980737 0.48216886187
2388 2387 6584.44609938 -0.477744363834 6585.92384374 0.477744363834
2389 2388 6587.70476972 -0.48227013859 6589.18703986 0.48227013859
2390 2389 6590.96364944 -0.496037208523 6592.45968665 0.496037208523
2391 2390 6594.22273845 -0.519293131716 6595.74203158 0.519293131716
2392 2391 6597.48203667 -0.552240062618 6599.03427673 0.552240062618
2393 2392 6600.741544 -0.595033022828 6602.33657702 0.595033022828
2394 2393 6604.00126037 -0.64777839201 6605.64903876 0.64777839201
2395 2394 6607.26118567 -0.710532627889 6608.9717183 0.710532627889
2396 2395 6610.52131984 -0.783301223199 6612.30462106 0.783301223199
2397 2396 6613.78166277 -0.866037906278 6615.64770067 0.866037906278
2398 2397 6617.04221438 -0.958644090857 6619.00085847 0.958644090857
2399 2398 6620.30297459 -1.06096857936 6622.36394317 1.06096857936
2400 2399 6623.5639433 -1.17280752281 6625.73675082 1.17280752281
2401 2400 6626.82512043 -1.29390463916 6629.11902507 1.29390463916
2402 2401 6630.0865059 -1.42395169064 6632.51045759 1.42395169064
2403 2402 6633.34809961 -1.56258921939 6635.91068883 1.56258921939
2404 2403 6636.60990149 -1.70940753941 6639.31930903 1.70940753941
2405 2404 6639.87191143 -1.86394798162 6642.73585941 1.86394798162
2406 2405 6643.13412937 -2.02570438747 6646.15983375 2.02570438747
2407 2406 6646.3965552 -2.19412484536 6649.59068004 2.19412484536
2408 2407 6649.65918885 -2.36861366307 6653.02780251 2.36861366307
2409 2408 6652.92203022 -2.5485335679 6656.47056379 2.5485335679
2410 2409 6656.18507924 -2.73320812533 6659.91828736 2.73320812533
2411 2410 6659.44833581 -2.92192436587 6663.37026017 2.92192436587
2412 2411 6662.71179985 -3.11393560865 6666.82573546 3.11393560865
2413 2412 6665.97547127 -3.3084644694 6670.28393574 3.3084644694
2414 2413 6669.23934999 -3.50470603928 6673.74405603 3.50470603928
2415 2414 6672.50343592 -3.70183122063 6677.20526714 3.70183122063
2416 2415 6675.76772898 -3.89899020436 6680.66671918 3.89899020436
2417 2416 6679.03222907 -4.09531607331 6684.12754514 4.09531607331
2418 2417 6682.29693612 -4.28992851512 6687.58686463 4.28992851512
2419 2418 6685.56185004 -4.4819376276 6691.04378766 4.4819376276
2420 2419 6688.82697073 -4.67044779912 6694.49741853 4.67044779912
2421 2420 6692.09229813 -4.85456164593 6697.94685978 4.85456164593
2422 2421 6695.35783214 -5.03338398835 6701.39121613 5.03338398835
2423 2422 6698.62357267 -5.20602584719 6704.82959852 5.20602584719
2424 2423 6701.88951965 -5.37160844166 6708.26112809 5.37160844166
2425 2424 6705.15567298 -5.52926717027 6711.68494015 5.52926717027
2426 2425 6708.42203258 -5.67815555576 6715.10018813 5.67815555576
2427 2426 6711.68859836 -5.81744913562 6718.5060475 5.81744913562
2428 2427 6714.95537025 -5.94634927979 6721.90171953 5.94634927979
2429 2428 6718.22234815 -6.06408691745 6725.28643507 6.06408691745
2430 2429 6721.48953199 -6.16992615516 6728.65945814 6.16992615516
2431 2430 6724.75692167 -6.26316776919 6732.02008944 6.26316776919
2432 2431 6728.02451711 -6.34315255533 6735.36766966 6.34315255533
2433 2432 6731.29231823 -6.40926452014 6738.70158275 6.40926452014
2434 2433 6734.56032494 -6.46093389831 6742.02125883 6.46093389831
2435 2434 6737.82853715 -6.49763998162 6745.32617714 6.49763998162
2436 2435 6741.09695479 -6.51891374581 6748.61586854 6.51891374581
2437 2436 6744.36557777 -6.52434026259 6751.88991804 6.52434026259
2438 2437 6747.63440601 -6.5135608851 6755.14796689 6.5135608851
2439 2438 6750.90343941 -6.48627519599 6758.38971461 6.48627519599
2440 2439 6754.1726779 -6.44224270866 6761.61492061 6.44224270866
2441 2440 6757.44212139 -6.38128431307 6764.82340571 6.38128431307
2442 2441 6760.7117698 -6.30328345887 6768.01505326 6.30328345887
2443 2442 6763.98162305 -6.20818706986 6771.18981012 6.20818706986
2444 2443 6767.25168104 -6.09600618494 6774.34768723 6.09600618494
2445 2444 6770.52194371 -5.96681632199 6777.48876003 5.96681632199
2446 2445 6773.79241095 -5.82075756252 6780.61316851 5.82075756252
2447 2446 6777.06308269 -5.65803435619 6783.72111705 5.65803435619
2448 2447 6780.33395885 -5.47891504551 6786.8128739 5.47891504551
2449 2448 6783.60503934 -5.28373111252 6789.88877045 5.28373111252
2450 2449 6786.87632408 -5.0728761504 6792.94920023 5.0728761504
2451 2450 6790.14781298 -4.84680456438 6795.99461755 4.84680456438
2452 2451 6793.41950597 -4.60603000745 6799.02553597 4.60603000745
2453 2452 6796.69140295 -4.35112355774 6802.04252651 4.35112355774
2454 2453 6799.96350385 -4.08271164556 6805.04621549 4.08271164556
2455 2454 6803.23580858 -3.80147373933 6808.03728232 3.80147373933
2456 2455 6806.50831706 -3.50813980075 6811.01645686 3.50813980075
2457 2456 6809.7810292 -3.20348752048 6813.98451672 3.20348752048
2458 2457 6813.05394493 -2.88833934697 6816.94228428 2.88833934697
2459 2458 6816.32706416 -2.56355932166 6819.89062348 2.56355932166
2460 2459 6819.60038681 -2.23004973491 6822.83043654 2.23004973491
2461 2460 6822.87391279 -1.88874761782 6825.76266041 1.88874761782
2462 2461 6826.14764202 -1.54062108571 6828.68826311 1.54062108571
2463 2462 6829.42157442 -1.18666555002 6831.60823997 1.18666555002
2464 2463 6832.69570991 -0.827899815493 6834.52360973 0.827899815493
2465 2464 6835.97004841 -0.465362080714 6837.43541049 0.465362080714
2466 2465 6839.24458982 -0.100105859754 6840.34469568 0.100105859754
2467 2466 6842.51933408 0.266804156357 6843.25252992 0.266804156357
2468 2467 6845.79428109 0.634296279722 6846.15998481 0.634296279722
2469 2468 6849.06943078 1.0012960283 6849.06813475 1.0012960283
2470 2469 6852.34478306 1.3667303323 6851.97805273 1.3667303323
2471 2470 6855.62033785 1.72953172527 6854.89080613 1.72953172527
2472 2471 6858.89609507 2.08864250105 6857.80745257 2.08864250105
2473 2472 6862.17205464 2.44301881789 6860.72903582 2.44301881789
2474 2473 6865.44821648 2.79163473138 6863.65658175 2.79163473138
2475 2474 6868.7245805 3.13348613819 6866.59109436 3.13348613819
2476 2475 6872.00114662 3.46759461304 6869.533552 3.46759461304
2477 2476 6875.27791476 3.7930111219 6872.48490363 3.7930111219
2478 2477 6878.55488483 4.10881959503 6875.44606524 4.10881959503
2479 2478 6881.83205677 4.41414034418 6878.41791643 4.41414034418
2480 2479 6885.10943048 4.70813330906 6881.40129717 4.70813330906
2481 2480 6888.38700589 4.99000111886 6884.39700477 4.99000111886
2482 2481 6891.6647829 5.25899195587 6887.40579095 5.25899195587
2483 2482 6894.94276146 5.51440220885 6890.42835925 5.51440220885
2484 2483 6898.22094146 5.75557890502 6893.46536255 5.75557890502
2485 2484 6901.49932283 5.98192191061 6896.51740091 5.98192191061
2486 2485 6904.77790548 6.19288589102 6899.58501959 6.19288589102
2487 2486 6908.05668935 6.38798202266 6902.66870733 6.38798202266
2488 2487 6911.33567434 6.56677945013 6905.76889489 6.56677945013
2489 2488 6914.61486038 6.7289064831 6908.88595389 6.7289064831
2490 2489 6917.89424738 6.87405152898 6912.02019585 6.87405152898
2491 2490 6921.17383527 7.00196375843 6915.17187151 7.00196375843
2492 2491 6924.45362395 7.11245350222 6918.34117045 7.11245350222
2493 2492 6927.73361337 7.20539237913 6921.52822099 7.20539237913
2494 2493 6931.01380342 7.28071315585 6924.73309026 7.28071315585
2495 2494 6934.29419403 7.33840934127 6927.95578469 7.33840934127
2496 2495 6937.57478513 7.37853451865 6931.19625061 7.37853451865
2497 2496 6940.85557663 7.40120142037 6934.45437521 7.40120142037
2498 2497 6944.13656845 7.40658075143 6937.72998769 7.40658075143
2499 2498 6947.4177605 7.39489976867 6941.02286073 7.39489976867
2500 2499 6950.69915272 7.36644062421 6944.3327121 7.36644062421
2501 2500 6953.98074502 7.32153848234 6947.65920654 7.32153848234

E-021-sinf-sf-curve.json — 1.2 KB, updated 08-19-2026

JSON sidecar (click to expand)
{
  "experiment": "E-021",
  "task": "3.7: exact S_inf(n) + |S_f(n)| curve + D-036 constants",
  "script": "research/numerics/scripts/E-021-sinf-sf-curve.py",
  "parameters": {
    "n_max": 5000,
    "t_zeros": 5000.0
  },
  "checks": {
    "V1_lambda_vs_E015": true,
    "V2_R_bound_holds": true,
    "V3_Sinf_residual_bounded": true
  },
  "key_values": {
    "A_use": 0.9,
    "B0_use": 1.0,
    "R_max_sample": 4.7507714994958565,
    "C0_samples": {
      "1e2": 6.234438640727731,
      "1e4": 8.840233256550178,
      "1e6": 11.194201354663145
    },
    "eta_0": "-0.5772156649015328606065120900824024310",
    "Sinf_residual_fits": [
      [
        1000,
        -0.2500416666625
      ],
      [
        2000,
        -0.2500208333328125
      ],
      [
        3000,
        -0.25001388888873455
      ],
      [
        4000,
        -0.25001041666660156
      ],
      [
        5000,
        -0.2500083333333
      ]
    ],
    "V1_worst_rel": 4.79820218420929e-25,
    "S_f_max_abs": "13.5229134371",
    "S_f_max_abs_n": 3298
  },
  "elapsed_seconds": 2139.3,
  "timestamp_utc": "2026-08-19T06:48:55.463113+00:00"
}

Source code

Python script (click to expand)
"""E-021 — task 3.7: exact S_inf(n) to n=1e4, |S_f(n)| curve, tightened
D-036 constants. Feeds D-037 (finite-height Li theorem).

Components:
  P1. D-036 constants: C0(t) from Trudgian; |R(s)| = |zeta'/zeta(s) -
      sum_{|gamma-t|<1} 1/(s-rho)| sampled at ~30 contour points (flint
      acb zeta + fd derivative, zeros via mp.zetazero) -> fit A, B0.
  P2. eta_j — ALL FLINT (session 006 cont.10 root-cause: mpmath zeta,
      Hurwitz included, silently loses accuracy beyond ~58 digits on
      this stack [mpmath 1.3 + Py 3.14] -> eta_j errors ~1e-58 ->
      S_f binomial cancellation explodes ~(4/3)^n; V1 failed 1.4e143.
      The zero-side sigma route also has eta_0 wrong by 2.4e-4 from
      sigma_1 truncation at T=5000 — both defects removed here).
      j <= 23: Stieltjes series division (E-011 machinery, validated):
        -zeta'/zeta(1+u) = (1/u) N(u)/D(u), eta_k = [u^{k+1}] N/D.
      j >= 24: Lagarias (4.10) with flint arb zeta:
        eta_j = (-1)^{j+1} [(1-2^{-(j+1)}) zeta(j+1) - 1 + sigma_{j+1}]
        with sigma_m = (-1)^{m-1}(tau_{m-1} - eta_{m-1}) + 1 EXACT
        (arithmetic side) for m <= 24, and sigma_m = 2 Re sum
        rho^{-m} over the first 100 zeros (mp.zetazero, dps 100)
        for 25 <= m <= M_SIG; omitted beyond (boundary error
        C(n,M_SIG)*14^{-M_SIG} < 1e-40 by construction).
      NOTES (hard-won, session 006 cont.10):
      * sigma_m may NOT be omitted at any m <= M_SIG — the truncation
        boundary error ~ C(n,M)*14^{-M} PEAKS at M = n/15 with size
        ~(15/14)^n: with M=200, S_f exploded as 1e133 at n=5000
        (measured). M_SIG ~ 0.22*n_max.
      * the m=24 omission alone moved S_f(200) by ~0.4 (measured).
      * float64 zeros for sigma_m are NOT enough either (S_f(300) off
        by 7.8e-8 — measured); need mp.zetazero precision. Zeros
        k > 100 contribute < (14.13/236.5)^25 ~ 1e-31 relative for
        m >= 25, so the first 100 at dps 100 are effectively exact.
      * GAMMA_E must be a string (bare float -> 53-bit, 4.94e-21).
  P3. S_inf(n) EXACT for n <= N_MAX (Lagarias (4.11)):
        S_inf(n) = sum_{j=1}^n (-1)^j C(n,j) (1-2^{-j}) zeta*(j),
        zeta*(1) = log(4pi)+gamma, zeta*(j) = zeta(j) (flint.arb).
      Cancellation ~2^n -> dps = ceil(0.31*n) + 60.
  P4. S_f(n) = sum_{j=1}^n C(n,j) eta_{j-1} (plain binomial — the
      E-011/Lagarias-(4.13) convention after the (-1) absorbed into
      the series-eta definition; VALIDATED: S_f(200) = -2.14037668
      matches S_inf(200)+1-lambda_200(E-015)); lambda_n =
      S_inf - S_f + 1.
  P5. VALIDATION: lambda_n (n <= 3000) vs E-015 certified CSV (rel dev);
      eta_0 vs E-011 value; S_inf fit: S_inf - [(1/2)n log n + C1 n]
      -> c0 (+ c1/n...), C1 = (gamma-1-log(2pi))/2.

Checks:
  V1. lambda_n matches E-015 for n <= 3000 (rel dev < 1e-50 at dps used).
  V2. |R(s)| <= A log(t+2) + B0 at all sample points with the FITTED
      A, B0 (and fitted values reported vs D-036's 2.0/2.0).
  V3. S_inf fit residual -> constant c0 (|residual - c0| -> 0 trend).

Outputs: research/numerics/data/E-021-sinf-sf-curve.csv (+ .json)
"""
import json
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

import flint
import mpmath as mp
import numpy as np

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
CSV = DATA / "E-021-sinf-sf-curve.csv"
JSON = DATA / "E-021-sinf-sf-curve.json"
E015 = DATA / "E-015-li-coefficients-n3000.csv"

N_MAX = 5000            # 10000 costs ~2h (row cost ~ n^2 * dps);
                        # cached zeta/zeros make a later 1e4 rerun cheap
T_ZEROS = 5000.0        # zeros up to this height for sigma sums
N_ZMAX = 8000           # mp.zetazero count cap (N(5e3) ~ 7.9e3)
DPS_BIG = 3300
# NOTE: must be a STRING — a bare float literal collapses to 53-bit
# (measured error 4.94e-21 -> sigma_1/zeta*(1) wrong at digit 21).
GAMMA_E = "0.57721566490153286060651209008240243104215933593992337"


# ---------------------------------------------------------------- N(T)
def N_count(T):
    F = (T / (2 * np.pi)) * np.log(T / (2 * np.pi)) - T / (2 * np.pi) + 7 / 8
    return F


def S_bound(T):
    return 0.137 * np.log(T) + 0.443 * np.log(np.log(T)) + 1.588


def C0(t):
    """Upper bound for zeros in [t, t+1] (t >= 10)."""
    return (N_count(t + 1) - N_count(t)) + S_bound(t + 1) + S_bound(t)


# ------------------------------------------------------------- zeros
def compute_zeros():
    cache = DATA / "E-021-zeros-cache.npy"
    n_est = int(N_count(T_ZEROS) + S_bound(T_ZEROS)) + 100
    n_est = min(n_est, N_ZMAX)
    if cache.exists():
        zs = np.load(cache)
        if len(zs) >= n_est:
            print(f"  loaded {n_est} zeros from cache", flush=True)
            return zs[:n_est]
    print(f"  computing {n_est} zeros via mp.zetazero ...", flush=True)
    mp.mp.dps = 30
    zs = []
    for k in range(1, n_est + 1):
        zs.append(mp.zetazero(k).imag)
        if k % 1000 == 0:
            print(f"    {k}/{n_est}", flush=True)
    out = np.array([float(z) for z in zs])
    np.save(cache, out)
    return out


# ------------------------------------------------------- zeta strings
def get_zeta_strings(n_max):
    """zeta(j) decimal strings at full precision (flint arb), cached.
    full_digits = 0.31*n_max + 100 covers the ~2^n cancellation in
    BOTH S_inf and the (1-2^{-s})zeta(s)-1 eta formula (absolute
    error ~1e-1650 uniformly)."""
    full_digits = int(0.31 * n_max) + 100
    zcache = DATA / "E-021-zeta-cache.json"
    if zcache.exists():
        zeta_str = {int(k): v for k, v in
                    json.loads(zcache.read_text()).items()}
        print("  zeta strings loaded from cache", flush=True)
        # patch legacy zeta*(1) (built with double-precision GAMMA_E)
        mp.mp.dps = full_digits + 50
        z1 = mp.nstr(mp.log(4 * mp.pi) + mp.mpf(GAMMA_E), full_digits)
        if zeta_str.get(1) != z1:
            zeta_str[1] = z1
            zcache.write_text(json.dumps(zeta_str))
            print("  patched zeta*(1) in cache (GAMMA_E float fix)",
                  flush=True)
        return zeta_str, full_digits
    flint.ctx.prec = int(full_digits * 3.33) + 200
    mp.mp.dps = full_digits + 50
    zeta_str = {1: mp.nstr(mp.log(4 * mp.pi) + mp.mpf(GAMMA_E),
                           full_digits)}
    for j in range(2, n_max + 1):
        zeta_str[j] = flint.arb(j).zeta().str(full_digits,
                                              radius=False)
        if j % 2000 == 0:
            print(f"    zeta({j}) done", flush=True)
    zcache.write_text(json.dumps(zeta_str))
    return zeta_str, full_digits


# ---------------------------------------------------------------- eta
# K_SPLIT: eta_j for j < K_SPLIT from Stieltjes (exact, arithmetic);
# sigma_m exact for m <= K_SPLIT. Must be ~80: with K_SPLIT=24 the
# zero-tail (k>100) of sigma_25 entered at term j=24 with C(n,24)
# amplification — S_f(3000) was off by 1.06e3 growing ~n^24 (measured).
# With K_SPLIT=80 the zero-tail exposure (m>=81, k>100) is < 3e-11.
K_SPLIT = 80


def compute_eta(zeta_str, full_digits):
    """eta_j for j = 0..N_MAX-1, ALL flint-based (see header P2).
    Returns dict j -> decimal string at full_digits."""
    print(f"  eta_0..{K_SPLIT - 1}: flint Stieltjes + series division "
          "(E-011) ...", flush=True)
    flint.ctx.prec = int((full_digits + 100) * 3.33) + 200
    mp.mp.dps = full_digits + 100   # BEFORE mp.mpf(string) parses below!
    gam_s = [mp.mpf(flint.acb.stieltjes(k).real.str(
        full_digits + 100, radius=False)) for k in range(K_SPLIT + 2)]
    N_ = [mp.mpf(0)] * (K_SPLIT + 2)
    D_ = [mp.mpf(0)] * (K_SPLIT + 2)
    N_[0] = D_[0] = 1
    for m in range(0, K_SPLIT + 1):
        D_[m + 1] = (-1) ** m * gam_s[m] / mp.factorial(m)
    for m in range(1, K_SPLIT + 1):
        N_[m + 1] = -(-1) ** m * gam_s[m] / mp.factorial(m - 1)
    Ev = [mp.mpf(0)] * (K_SPLIT + 2)
    for k in range(0, K_SPLIT + 2):
        s = N_[k]
        for i in range(1, k + 1):
            s -= D_[i] * Ev[k - i]
        Ev[k] = s
    eta_str = {j: mp.nstr(Ev[j + 1], full_digits)
               for j in range(K_SPLIT)}
    print(f"    eta_0 = {mp.nstr(Ev[1], 15)} (should be -gamma)",
          flush=True)
    print(f"    eta_1 = {mp.nstr(Ev[2], 15)}", flush=True)

    # ---- sigma_m: exact (arithmetic) for m <= 24; zeros for 25..200
    print("  sigma_m: m<=24 exact (tau-eta), 25..200 from zeros ...",
          flush=True)
    mp.mp.dps = full_digits + 50
    tau = {0: mp.mpf(-0.5) * (mp.log(4 * mp.pi) + mp.mpf(GAMMA_E))}
    for j in range(1, K_SPLIT):
        z = mp.mpf(zeta_str[j + 1])
        tau[j] = (-1) ** (j + 1) * (1 - mp.mpf(2) ** (-(j + 1))) * z
    sigma = {}
    for m in range(1, K_SPLIT + 1):
        sigma[m] = ((-1) ** (m - 1)
                    * (tau[m - 1] - mp.mpf(eta_str[m - 1])) + 1)
    mp.mp.dps = 60
    sig1_known = 1 + mp.euler / 2 - mp.log(4 * mp.pi) / 2
    print(f"    sigma_1 = {mp.nstr(sigma[1], 20)} "
          f"(closed form {mp.nstr(sig1_known, 20)})", flush=True)
    # sigma_m, m = 25..M_SIG: first 100 zeros via mp.zetazero, dps 100.
    # M_SIG must be adaptive: truncating sigma at M leaves a boundary
    # error ~ C(n,M)*14.13^{-M} which PEAKS at M = n/15 (~(15/14)^n);
    # with M=200 the run exploded as 1e133 at n=5000 (measured). Need
    # C(n,M)*14^{-M} < 1e-40 on the decreasing side (M > n/15).
    # float64 zeros are NOT enough (S_f(300) off 7.8e-8 — measured);
    # zeros k>100 are suppressed by (14.13/236.5)^25 ~ 1e-31 relative.
    n_zeta = max(zeta_str)
    M_SIG = n_zeta
    for M in range(K_SPLIT + 1, n_zeta + 1):
        if M > n_zeta / 15:
            logC = (mp.loggamma(n_zeta + 1) - mp.loggamma(M + 1)
                    - mp.loggamma(n_zeta - M + 1))
            if float(logC - (M - 1) * mp.log(14.13)
                     + mp.log(0.05)) / np.log(10) < -40:
                M_SIG = M
                break
    print(f"    M_SIG = {M_SIG} (C(n,M)*14^{{-M}} < 1e-40)", flush=True)
    # sigma_m precision matters: dps-100 sums left eps_m ~ 14^{-m}e-100,
    # whose C(n,j)-amplified impact (peak term C(n,n/15)*14^{-n/15} ~
    # 1e105 at n=3000) showed up as S_f error ~1e3 (measured). Zeros
    # at 400 digits + sums at full_digits+50 kill it.
    # dps BEFORE any mp.mpf(string) parse! (Third instance of this bug
    # class: g100 parsed at leftover dps 60 corrupted sigma_m at
    # ~m*1e-60*14^{-m} -> S_f(3000) off by 1.7e7, growth ~n^80.)
    mp.mp.dps = full_digits + 50
    z100cache = DATA / "E-021-zeros100-hi-cache.json"
    if z100cache.exists():
        g100 = [mp.mpf(v) for v in
                json.loads(z100cache.read_text())]
    else:
        mp.mp.dps = 450
        g100 = [mp.zetazero(k).imag for k in range(1, 101)]
        z100cache.write_text(json.dumps([mp.nstr(g, 400)
                                         for g in g100]))
        mp.mp.dps = full_digits + 50
    rho = [mp.mpc(mp.mpf("0.5"), g) for g in g100]
    for m in range(K_SPLIT + 1, M_SIG + 1):
        sigma[m] = 2 * mp.re(sum(r ** (-m) for r in rho))
    mp.mp.dps = 60
    print(f"    sigma_2 = {mp.nstr(sigma[2], 20)}", flush=True)
    print(f"    sigma_25 (zeros) = {mp.nstr(sigma[25], 6)}; "
          f"sigma_{M_SIG} = {mp.nstr(sigma[M_SIG], 6)}", flush=True)

    print("  eta_j (j>=24): (-1)^{j+1}[(1-2^{-(j+1)})zeta(j+1) - 1 "
          "+ sigma_{j+1}] ...", flush=True)
    mp.mp.dps = full_digits + 50
    for j in range(K_SPLIT, n_zeta):
        z = mp.mpf(zeta_str[j + 1])
        sig = sigma[j + 1] if j + 1 <= M_SIG else mp.mpf(0)
        eta = (-1) ** (j + 1) * ((1 - mp.mpf(2) ** (-(j + 1))) * z - 1
                                 + sig)
        eta_str[j] = mp.nstr(eta, full_digits)
    # stitch check: eta_{K_SPLIT-1} via Stieltjes vs via full formula
    mp.mp.dps = full_digits + 50
    eta23_formula = ((-1) ** K_SPLIT
                     * ((1 - mp.mpf(2) ** (-K_SPLIT))
                        * mp.mpf(zeta_str[K_SPLIT])
                        - 1 + sigma[K_SPLIT]))
    stitch = abs(eta23_formula - mp.mpf(eta_str[K_SPLIT - 1]))
    mp.mp.dps = 60
    print(f"    stitch |eta_{K_SPLIT - 1} stieltjes - formula| = "
          f"{mp.nstr(stitch, 3)}", flush=True)
    return eta_str


# ----------------------------------------------------------- S_inf, Sf
def compute_S_inf(n_max, zeta_str, full_digits):
    """Exact S_inf(n) via zeta*(j) (flint arb), dps scaled by n.
    Cancellation ~2^n: every zeta(j) stored at FULL string precision
    (the Sigma(-1)^j C(n,j)*1 = 0 piece must cancel exactly)."""
    print("  parsing zeta strings once at full precision ...", flush=True)
    mp.mp.dps = full_digits + 50
    zeta_mpf = {j: mp.mpf(v) for j, v in zeta_str.items()}
    results = {}
    for n in range(1, n_max + 1):
        mp.mp.dps = int(0.31 * n) + 80
        s = mp.mpf(0)
        c = mp.mpf(1)
        for j in range(1, n + 1):
            c = c * (n - j + 1) / j          # C(n,j) by recurrence
            s += ((-1) ** j) * c * (1 - mp.mpf(2) ** (-j)) * zeta_mpf[j]
        results[n] = +s
        if n % 500 == 0:
            print(f"    S_inf row {n}/{n_max}", flush=True)
    return results


def compute_Sf(n_max, eta_str):
    """S_f(n) = sum_j C(n,j) eta_{j-1} — plain binomial (E-011/Lagarias
    (4.13) convention with series-eta; validated at n=200 vs E-015:
    S_f(200) = -2.14037668 = S_inf(200)+1-lambda_200). Requires eta_j
    absolute accuracy ~1e-1650 at n=5000 (terms C(n,j)*eta up to
    ~1e312 cancel to O(1)) — flint-only computation, see P2."""
    full_digits = int(0.31 * n_max) + 100
    mp.mp.dps = full_digits + 50
    eta_mpf = {j: mp.mpf(v) for j, v in eta_str.items()}
    results = {}
    for n in range(1, n_max + 1):
        mp.mp.dps = int(0.31 * n) + 80
        s = mp.mpf(0)
        c = mp.mpf(1)
        for j in range(1, n + 1):
            c = c * (n - j + 1) / j
            s += c * eta_mpf[j - 1]
        results[n] = +s
        if n % 500 == 0:
            print(f"    S_f row {n}/{n_max}", flush=True)
    return results


def main() -> int:
    if CSV.exists() and "--force" not in sys.argv:
        print(f"cached: {CSV} (use --force to recompute)")
        return 0
    t0 = time.time()

    # ---- P1: constants
    print("P1: D-036 constants ...", flush=True)
    print(f"  C0(100) = {C0(100):.3f}, C0(1e4) = {C0(1e4):.3f}, "
          f"C0(1e6) = {C0(1e6):.3f}", flush=True)
    gam_sample = compute_zeros()

    def xi_mp(s):
        return 0.5 * s * (s - 1) * mp.pi ** (-s / 2) * mp.gamma(s / 2) \
            * mp.zeta(s)

    def zeta_logder(s):
        """zeta'/zeta via xi'/xi minus explicit terms (mpmath dps 30;
        complex-zeta OK to ~1e-10 per E-018 C2)."""
        sm = mp.mpc(s.real, s.imag)
        xi_log = mp.diff(xi_mp, sm) / xi_mp(sm)
        return complex(xi_log - 1 / sm - 1 / (sm - 1)
                       + mp.mpf(0.5) * mp.log(mp.pi)
                       - mp.mpf(0.5) * mp.digamma(sm / 2))

    R_samples = []
    mp.mp.dps = 30
    for sig in (-2.5, 0.5, 3.0):
        for t in (10.0, 50.0, 100.0, 500.0, 1000.0):
            s = complex(sig, t)
            near = [g for g in gam_sample if abs(g - t) < 1.0]
            psum = sum(1.0 / (s - complex(0.5, g)) for g in near)
            R_samples.append((sig, t, abs(zeta_logder(s) - psum)))
    # fit |R| <= A log(t+2) + B0
    A_fit = max(v / np.log(t + 2) for _, t, v in R_samples)
    A_use = max(0.5, float(np.ceil(A_fit * 1.2 * 10) / 10))
    B0_need = max(v - A_use * np.log(t + 2) for _, t, v in R_samples)
    B0_use = max(1.0, float(np.ceil(B0_need * 1.3 * 10) / 10))
    print(f"  |R| max sample = {max(v for *_ , v in R_samples):.2f}; "
          f"A_use={A_use}, B0_use={B0_use}", flush=True)

    # ---- P2: zeta strings + eta (all flint)
    print("P2: zeta strings + eta_j (flint) ...", flush=True)
    zeta_str, full_digits = get_zeta_strings(N_MAX)
    eta_str = compute_eta(zeta_str, full_digits)

    # ---- P3/P4: S_inf, S_f
    print("P3: S_inf exact ...", flush=True)
    S_inf = compute_S_inf(N_MAX, zeta_str, full_digits)
    print("P4: S_f ...", flush=True)
    S_f = compute_Sf(N_MAX, eta_str)

    # ---- P5: validation + fit
    print("P5: validation vs E-015 ...", flush=True)
    e015 = {}
    with E015.open() as f:
        header = f.readline()
        for line in f:
            parts = line.strip().split(",")
            if len(parts) >= 2 and parts[0].isdigit():
                e015[int(parts[0])] = mp.mpf(parts[1])
    worst = 0.0
    mp.mp.dps = 100
    for n in sorted(e015):
        lam = S_inf[n] - S_f[n] + 1
        dev = abs(lam - e015[n]) / abs(e015[n])
        worst = max(worst, float(dev))
    print(f"  V1 worst rel dev vs E-015 (n<=3000): {worst:.2e}", flush=True)

    C1 = (mp.mpf(GAMMA_E) - 1 - mp.log(2 * mp.pi)) / 2
    fits = []
    for n in (1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000):
        if n > N_MAX:
            continue
        mp.mp.dps = 100
        resid = S_inf[n] - (mp.mpf(n) / 2) * mp.log(n) - C1 * n
        fits.append((n, float(resid)))
    print(f"  S_inf residual (should -> c0): {fits}", flush=True)

    # ---- write CSV
    with CSV.open("w", encoding="utf-8", newline="") as f:
        f.write("n,S_inf,S_f,lambda_n,abs_Sf\n")
        for n in range(1, N_MAX + 1):
            lam = S_inf[n] - S_f[n] + 1
            f.write(f"{n},{mp.nstr(S_inf[n],12)},{mp.nstr(S_f[n],12)},"
                    f"{mp.nstr(lam,12)},{mp.nstr(abs(S_f[n]),12)}\n")

    checks = {
        # V1 floor is ~1e-24 (E-015 CSV holds 26 digits); 1e-15 still
        # kills any macroscopic (convention/precision) bug — the bugs
        # found in cont.10 produced 1e-8..1e143 deviations.
        "V1_lambda_vs_E015": bool(worst < 1e-15),
        "V2_R_bound_holds": bool(all(
            v <= A_use * np.log(t + 2) + B0_use for _, t, v in R_samples)),
        "V3_Sinf_residual_bounded": bool(
            abs(fits[-1][1] - fits[-2][1]) < abs(fits[0][1] - fits[1][1])),
    }
    meta = {
        "experiment": "E-021",
        "task": "3.7: exact S_inf(n) + |S_f(n)| curve + D-036 constants",
        "script": "research/numerics/scripts/E-021-sinf-sf-curve.py",
        "parameters": {"n_max": N_MAX, "t_zeros": T_ZEROS},
        "checks": checks,
        "key_values": {
            "A_use": A_use, "B0_use": B0_use,
            "R_max_sample": max(v for *_, v in R_samples),
            "C0_samples": {"1e2": C0(100), "1e4": C0(1e4), "1e6": C0(1e6)},
            "eta_0": eta_str[0][:40],
            "Sinf_residual_fits": fits,
            "V1_worst_rel": worst,
            "S_f_max_abs": mp.nstr(max(abs(S_f[n]) for n in S_f), 12),
            "S_f_max_abs_n": int(max(S_f, key=lambda k: abs(S_f[k]))),
        },
        "elapsed_seconds": round(time.time() - t0, 1),
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
    }
    JSON.write_text(json.dumps(meta, indent=2), encoding="utf-8")
    ok = all(checks.values())
    print(f"wrote {CSV.name}, {JSON.name} — "
          f"{'ALL CHECKS PASS' if ok else 'CHECK FAILURE: ' + str(checks)}")
    return 0 if ok else 1


if __name__ == "__main__":
    raise SystemExit(main())