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 8 of 10 · 500/page · 5000 rows next →
# nS_infS_flambda_nabs_Sf
3502 3501 10327.9494684 -6.97967264366 10335.929141 6.97967264366
3503 3502 10331.3996111 -7.10279990033 10339.502411 7.10279990033
3504 3503 10334.8498965 -7.21217834019 10343.0620748 7.21217834019
3505 3504 10338.3003247 -7.30738447801 10346.6077091 7.30738447801
3506 3505 10341.7508955 -7.38805058343 10350.1389461 7.38805058343
3507 3506 10345.2016091 -7.45386627724 10353.6554753 7.45386627724
3508 3507 10348.6524652 -7.50457987173 10357.1570451 7.50457987173
3509 3508 10352.1034639 -7.53999944869 10360.6434634 7.53999944869
3510 3509 10355.5546051 -7.55999367032 10364.1145988 7.55999367032
3511 3510 10359.0058889 -7.56449231894 10367.5703812 7.56449231894
3512 3511 10362.457315 -7.55348656331 10371.0108016 7.55348656331
3513 3512 10365.9088836 -7.52702895026 10374.4359126 7.52702895026
3514 3513 10369.3605946 -7.48523312172 10377.8458277 7.48523312172
3515 3514 10372.8124479 -7.42827325864 10381.2407211 7.42827325864
3516 3515 10376.2644435 -7.35638325457 10384.6208267 7.35638325457
3517 3516 10379.7165813 -7.26985562269 10387.9864369 7.26985562269
3518 3517 10383.1688613 -7.16904014184 10391.3379014 7.16904014184
3519 3518 10386.6212835 -7.05434224787 10394.6756258 7.05434224787
3520 3519 10390.0738478 -6.92622117804 10398.000069 6.92622117804
3521 3520 10393.5265542 -6.78518787738 10401.3117421 6.78518787738
3522 3521 10396.9794027 -6.63180267706 10404.6112054 6.63180267706
3523 3522 10400.4323931 -6.46667275573 10407.8990659 6.46667275573
3524 3523 10403.8855256 -6.290449396 10411.175975 6.290449396
3525 3524 10407.3387999 -6.1038250492 10414.442625 6.1038250492
3526 3525 10410.7922161 -5.90753022217 10417.6997464 5.90753022217
3527 3526 10414.2457742 -5.70233020113 10420.9481044 5.70233020113
3528 3527 10417.6994741 -5.489021628 10424.1884957 5.489021628
3529 3528 10421.1533157 -5.26842894549 10427.4217447 5.26842894549
3530 3529 10424.6072991 -5.0414007278 10430.6486998 5.0414007278
3531 3530 10428.0614242 -4.80880591427 10433.8702301 4.80880591427
3532 3531 10431.5156908 -4.57152996377 10437.0872208 4.57152996377
3533 3532 10434.9700991 -4.33047094811 10440.3005701 4.33047094811
3534 3533 10438.424649 -4.08653560269 10443.5111846 4.08653560269
3535 3534 10441.8793404 -3.84063535317 10446.7199757 3.84063535317
3536 3535 10445.3341732 -3.59368233673 10449.9278556 3.59368233673
3537 3536 10448.7891476 -3.34658543662 10453.135733 3.34658543662
3538 3537 10452.2442633 -3.1002463486 10456.3445096 3.1002463486
3539 3538 10455.6995203 -2.85555569764 10459.555076 2.85555569764
3540 3539 10459.1549187 -2.61338922291 10462.768308 2.61338922291
3541 3540 10462.6104584 -2.37460404904 10465.9850625 2.37460404904
3542 3541 10466.0661393 -2.1400350606 10469.2061744 2.1400350606
3543 3542 10469.5219615 -1.91049139693 10472.4324528 1.91049139693
3544 3543 10472.9779247 -1.68675308316 10475.6646778 1.68675308316
3545 3544 10476.4340291 -1.46956781307 10478.903597 1.46956781307
3546 3545 10479.8902746 -1.25964789845 10482.1499225 1.25964789845
3547 3546 10483.3466612 -1.05766739872 10485.4043286 1.05766739872
3548 3547 10486.8031887 -0.864259443895 10488.6674482 0.864259443895
3549 3548 10490.2598572 -0.680013762749 10491.939871 0.680013762749
3550 3549 10493.7166667 -0.505474427295 10495.2221411 0.505474427295
3551 3550 10497.173617 -0.341137823335 10498.5147548 0.341137823335
3552 3551 10500.6307081 -0.187450855933 10501.818159 0.187450855933
3553 3552 10504.0879401 -0.0448093974017 10505.1327495 0.0448093974017
3554 3553 10507.5453128 0.0864430157788 10508.4588698 0.0864430157788
3555 3554 10511.0028263 0.206016231917 10511.7968101 0.206016231917
3556 3555 10514.4604804 0.313674275003 10515.1468062 0.313674275003
3557 3556 10517.9182752 0.409235874849 10518.5090393 0.409235874849
3558 3557 10521.3762106 0.492574735093 10521.8836359 0.492574735093
3559 3558 10524.8342866 0.563619538929 10525.270667 0.563619538929
3560 3559 10528.2925031 0.622353693731 10528.6701494 0.622353693731
3561 3560 10531.7508601 0.668814816999 10532.0820452 0.668814816999
3562 3561 10535.2093575 0.70309396731 10535.5062635 0.70309396731
3563 3562 10538.6679953 0.725334625197 10538.9426607 0.725334625197
3564 3563 10542.1267735 0.73573143009 10542.3910421 0.73573143009
3565 3564 10545.5856921 0.734528680615 10545.8511634 0.734528680615
3566 3565 10549.0447509 0.722018606718 10549.3227323 0.722018606718
3567 3566 10552.50395 0.698539423121 10552.8054106 0.698539423121
3568 3567 10555.9632893 0.664473174728 10556.2988161 0.664473174728
3569 3568 10559.4227688 0.620243385533 10559.8025254 0.620243385533
3570 3569 10562.8823884 0.566312523544 10563.3160759 0.566312523544
3571 3570 10566.3421481 0.503179295094 10566.8389688 0.503179295094
3572 3571 10569.8020479 0.431375782712 10570.3706721 0.431375782712
3573 3572 10573.2620876 0.351464441458 10573.9106232 0.351464441458
3574 3573 10576.7222674 0.26403496926 10577.4582324 0.26403496926
3575 3574 10580.1825871 0.169701067398 10581.012886 0.169701067398
3576 3575 10583.6430467 0.0690971077377 10584.5739496 0.0690971077377
3577 3576 10587.1036461 -0.0371252762595 10588.1407714 0.0371252762595
3578 3577 10590.5643854 -0.14830065739 10591.7126861 0.14830065739
3579 3578 10594.0252645 -0.26375332385 10595.2890178 0.26375332385
3580 3579 10597.4862833 -0.382800811929 10598.8690841 0.382800811929
3581 3580 10600.9474418 -0.504757444461 10602.4521992 0.504757444461
3582 3581 10604.4087399 -0.628937857271 10606.0376778 0.628937857271
3583 3582 10607.8701777 -0.754660495963 10609.6248382 0.754660495963
3584 3583 10611.3317551 -0.881251065632 10613.2130062 0.881251065632
3585 3584 10614.7934721 -1.00804591632 10616.801518 1.00804591632
3586 3585 10618.2553285 -1.13439534746 10620.3897238 1.13439534746
3587 3586 10621.7173244 -1.25966681502 10623.9769912 1.25966681502
3588 3587 10625.1794597 -1.38324802556 10627.5627078 1.38324802556
3589 3588 10628.6417345 -1.50454990197 10631.1462844 1.50454990197
3590 3589 10632.1041485 -1.62300940668 10634.727158 1.62300940668
3591 3590 10635.5667019 -1.73809220827 10638.3047942 1.73809220827
3592 3591 10639.0293946 -1.84929517902 10641.8786898 1.84929517902
3593 3592 10642.4922265 -1.95614871115 10645.4483752 1.95614871115
3594 3593 10645.9551976 -2.05821884085 10649.0134165 2.05821884085
3595 3594 10649.4183079 -2.15510917006 10652.5734171 2.15510917006
3596 3595 10652.8815573 -2.24646257715 10656.1280199 2.24646257715
3597 3596 10656.3449458 -2.33196270846 10659.6769085 2.33196270846
3598 3597 10659.8084733 -2.41133524415 10663.2198085 2.41133524415
3599 3598 10663.2721398 -2.48434893273 10666.7564887 2.48434893273
3600 3599 10666.7359453 -2.55081638989 10670.2867617 2.55081638989
3601 3600 10670.1998897 -2.61059465859 10673.8104844 2.61059465859
3602 3601 10673.663973 -2.66358552833 10677.3275585 2.66358552833
3603 3602 10677.1281952 -2.70973561303 10680.8379308 2.70973561303
3604 3603 10680.5925561 -2.74903618808 10684.3415923 2.74903618808
3605 3604 10684.0570559 -2.78152278816 10687.8385787 2.78152278816
3606 3605 10687.5216943 -2.80727456908 10691.3289689 2.80727456908
3607 3606 10690.9864715 -2.82641343762 10694.8128849 2.82641343762
3608 3607 10694.4513873 -2.83910295483 10698.2904903 2.83910295483
3609 3608 10697.9164418 -2.84554701931 10701.7619888 2.84554701931
3610 3609 10701.3816348 -2.84598833807 10705.2276231 2.84598833807
3611 3610 10704.8469664 -2.84070669374 10708.6876731 2.84070669374
3612 3611 10708.3124365 -2.83001701773 10712.1424535 2.83001701773
3613 3612 10711.778045 -2.8142672802 10715.5923123 2.8142672802
3614 3613 10715.243792 -2.79383620837 10719.0376282 2.79383620837
3615 3614 10718.7096773 -2.76913084563 10722.4788082 2.76913084563
3616 3615 10722.175701 -2.74058396487 10725.916285 2.74058396487
3617 3616 10725.641863 -2.70865134981 10729.3505144 2.70865134981
3618 3617 10729.1081633 -2.67380895923 10732.7819723 2.67380895923
3619 3618 10732.5746019 -2.63654998915 10736.2111519 2.63654998915
3620 3619 10736.0411786 -2.59738184873 10739.6385604 2.59738184873
3621 3620 10739.5078935 -2.55682306616 10743.0647166 2.55682306616
3622 3621 10742.9747465 -2.51540014082 10746.4901466 2.51540014082
3623 3622 10746.4417376 -2.47364435866 10749.9153819 2.47364435866
3624 3623 10749.9088667 -2.43208858749 10753.3409553 2.43208858749
3625 3624 10753.3761339 -2.39126406938 10756.7673979 2.39126406938
3626 3625 10756.843539 -2.35169722691 10760.1952362 2.35169722691
3627 3626 10760.311082 -2.31390650037 10763.6249885 2.31390650037
3628 3627 10763.778763 -2.2783992324 10767.0571622 2.2783992324
3629 3628 10767.2465818 -2.24566861665 10770.4922504 2.24566861665
3630 3629 10770.7145384 -2.21619072647 10773.9307291 2.21619072647
3631 3630 10774.1826328 -2.19042163927 10777.3730544 2.19042163927
3632 3631 10777.6508649 -2.1687946717 10780.8196596 2.1687946717
3633 3632 10781.1192347 -2.15171774018 10784.2709525 2.15171774018
3634 3633 10784.5877422 -2.13957086074 10787.7273131 2.13957086074
3635 3634 10788.0563873 -2.13270380113 10791.1890911 2.13270380113
3636 3635 10791.5251701 -2.13143389783 10794.656604 2.13143389783
3637 3636 10794.9940903 -2.13604404909 10798.1301344 2.13604404909
3638 3637 10798.4631481 -2.14678089499 10801.609929 2.14678089499
3639 3638 10801.9323434 -2.16385319366 10805.0961966 2.16385319366
3640 3639 10805.4016761 -2.18743040265 10808.5891065 2.18743040265
3641 3640 10808.8711462 -2.21764147256 10812.0887876 2.21764147256
3642 3641 10812.3407536 -2.25457385969 10815.5953275 2.25457385969
3643 3642 10815.8104984 -2.29827276271 10819.1087712 2.29827276271
3644 3643 10819.2803805 -2.3487405875 10822.6291211 2.3487405875
3645 3644 10822.7503998 -2.40593664323 10826.1563364 2.40593664323
3646 3645 10826.2205563 -2.46977707114 10829.6903334 2.46977707114
3647 3646 10829.69085 -2.54013500677 10833.230985 2.54013500677
3648 3647 10833.1612809 -2.61684097477 10836.7781218 2.61684097477
3649 3648 10836.6318488 -2.69968351446 10840.3315323 2.69968351446
3650 3649 10840.1025538 -2.78841003306 10843.8909638 2.78841003306
3651 3650 10843.5733958 -2.88272788222 10847.4561237 2.88272788222
3652 3651 10847.0443748 -2.98230565254 10851.0266805 2.98230565254
3653 3652 10850.5154908 -3.08677467937 10854.6022655 3.08677467937
3654 3653 10853.9867437 -3.19573075239 10858.1824744 3.19573075239
3655 3654 10857.4581334 -3.30873602008 10861.7668694 3.30873602008
3656 3655 10860.92966 -3.4253210795 10865.3549811 3.4253210795
3657 3656 10864.4013234 -3.54498724062 10868.9463106 3.54498724062
3658 3657 10867.8731235 -3.66720895356 10872.5403325 3.66720895356
3659 3658 10871.3450604 -3.79143638643 10876.1364968 3.79143638643
3660 3659 10874.817134 -3.91709814034 10879.7342321 3.91709814034
3661 3660 10878.2893442 -4.04360408787 10883.3329482 4.04360408787
3662 3661 10881.761691 -4.17034832019 10886.9320393 4.17034832019
3663 3662 10885.2341744 -4.29671218777 10890.5308866 4.29671218777
3664 3663 10888.7067943 -4.42206741903 10894.1288617 4.42206741903
3665 3664 10892.1795507 -4.54577930087 10897.72533 4.54577930087
3666 3665 10895.6524436 -4.66720990454 10901.3196535 4.66720990454
3667 3666 10899.1254729 -4.78572134038 10904.9111943 4.78572134038
3668 3667 10902.5986386 -4.90067902453 10908.4993177 4.90067902453
3669 3668 10906.0719407 -5.0114549407 10912.0833956 5.0114549407
3670 3669 10909.5453791 -5.11743088012 10915.6628099 5.11743088012
3671 3670 10913.0189537 -5.21800164292 10919.2369553 5.21800164292
3672 3671 10916.4926646 -5.31257818433 10922.8052428 5.31257818433
3673 3672 10919.9665117 -5.40059068933 10926.3671024 5.40059068933
3674 3673 10923.4404949 -5.48149155972 10929.9219865 5.48149155972
3675 3674 10926.9146143 -5.55475829817 10933.4693726 5.55475829817
3676 3675 10930.3888698 -5.61989627409 10937.0087661 5.61989627409
3677 3676 10933.8632613 -5.67644135693 10940.5397027 5.67644135693
3678 3677 10937.3377889 -5.72396240302 10944.0617513 5.72396240302
3679 3678 10940.8124524 -5.76206358305 10947.574516 5.76206358305
3680 3679 10944.2872519 -5.79038653772 10951.0776384 5.79038653772
3681 3680 10947.7621872 -5.80861235035 10954.5707996 5.80861235035
3682 3681 10951.2372585 -5.81646332581 10958.0537218 5.81646332581
3683 3682 10954.7124656 -5.81370456643 10961.5261701 5.81370456643
3684 3683 10958.1878084 -5.80014533629 10964.9879538 5.80014533629
3685 3684 10961.6632871 -5.77564020649 10968.4389273 5.77564020649
3686 3685 10965.1389014 -5.74008997523 10971.8789914 5.74008997523
3687 3686 10968.6146515 -5.6934423574 10975.3080938 5.6934423574
3688 3687 10972.0905372 -5.63569243974 10978.7262296 5.63569243974
3689 3688 10975.5665585 -5.56688289888 10982.1334414 5.56688289888
3690 3689 10979.0427153 -5.48710398044 10985.5298193 5.48710398044
3691 3690 10982.5190078 -5.39649323909 10988.915501 5.39649323909
3692 3691 10985.9954357 -5.29523504016 10992.2906707 5.29523504016
3693 3692 10989.4719991 -5.18355982514 10995.6555589 5.18355982514
3694 3693 10992.9486979 -5.06174314397 10999.010441 5.06174314397
3695 3694 10996.4255321 -4.93010445897 11002.3556365 4.93010445897
3696 3695 10999.9025016 -4.78900572571 11005.6915073 4.78900572571
3697 3696 11003.3796065 -4.63884975785 11009.0184562 4.63884975785
3698 3697 11006.8568466 -4.48007838355 11012.336925 4.48007838355
3699 3698 11010.334222 -4.31317040272 11015.6473924 4.31317040272
3700 3699 11013.8117326 -4.13863935476 11018.950372 4.13863935476
3701 3700 11017.2893784 -3.95703110803 11022.2464095 3.95703110803
3702 3701 11020.7671593 -3.76892128266 11025.5360806 3.76892128266
3703 3702 11024.2450753 -3.57491251965 11028.8199879 3.57491251965
3704 3703 11027.7231264 -3.37563160968 11032.098758 3.37563160968
3705 3704 11031.2013125 -3.17172649597 11035.373039 3.17172649597
3706 3705 11034.6796336 -2.96386316598 11038.6434968 2.96386316598
3707 3706 11038.1580896 -2.75272244769 11041.9108121 2.75272244769
3708 3707 11041.6366806 -2.53899672628 11045.1756773 2.53899672628
3709 3708 11045.1154064 -2.32338659782 11048.438793 2.32338659782
3710 3709 11048.5942671 -2.1065974766 11051.7008646 2.1065974766
3711 3710 11052.0732626 -1.88933617336 11054.9625988 1.88933617336
3712 3711 11055.5523929 -1.67230746151 11058.2247003 1.67230746151
3713 3712 11059.0316579 -1.45621064873 11061.4878685 1.45621064873
3714 3713 11062.5110576 -1.24173617127 11064.7527937 1.24173617127
3715 3714 11065.9905919 -1.02956222815 11068.0201541 1.02956222815
3716 3715 11069.4702609 -0.820351472426 11071.2906124 0.820351472426
3717 3716 11072.9500645 -0.614747776219 11074.5648122 0.614747776219
3718 3717 11076.4300026 -0.413373086055 11077.8433757 0.413373086055
3719 3718 11079.9100752 -0.216824384515 11081.1268996 0.216824384515
3720 3719 11083.3902823 -0.0256707737319 11084.4159531 0.0256707737319
3721 3720 11086.8706239 0.159549304319 11087.7110746 0.159549304319
3722 3721 11090.3510999 0.338330696465 11091.0127692 0.338330696465
3723 3722 11093.8317102 0.510204002375 11094.3215062 0.510204002375
3724 3723 11097.3124549 0.674737861257 11097.6377171 0.674737861257
3725 3724 11100.7933339 0.831541049352 11100.9617928 0.831541049352
3726 3725 11104.2743471 0.980264377291 11104.2940828 0.980264377291
3727 3726 11107.7554946 1.12060237738 11107.6348922 1.12060237738
3728 3727 11111.2367763 1.25229477188 11110.9844815 1.25229477188
3729 3728 11114.7181921 1.37512771453 11114.3430644 1.37512771453
3730 3729 11118.1997421 1.48893479854 11117.7108073 1.48893479854
3731 3730 11121.6814261 1.59359782554 11121.0878283 1.59359782554
3732 3731 11125.1632442 1.68904733126 11124.4741968 1.68904733126
3733 3732 11128.6451963 1.77526286462 11127.8699334 1.77526286462
3734 3733 11132.1272823 1.85227301848 11131.2750093 1.85227301848
3735 3734 11135.6095023 1.9201552114 11134.6893471 1.9201552114
3736 3735 11139.0918562 1.97903522092 11138.112821 1.97903522092
3737 3736 11142.574344 2.02908647025 11141.5452575 2.02908647025
3738 3737 11146.0569656 2.0705290715 11144.9864366 2.0705290715
3739 3738 11149.539721 2.10362862971 11148.4360924 2.10362862971
3740 3739 11153.0226102 2.12869481321 11151.8939154 2.12869481321
3741 3740 11156.5056331 2.14607969697 11155.3595534 2.14607969697
3742 3741 11159.9887897 2.15617588687 11158.8326138 2.15617588687
3743 3742 11163.4720799 2.1594144338 11162.3126655 2.1594144338
3744 3743 11166.9555038 2.1562625476 11165.7992412 2.1562625476
3745 3744 11170.4390612 2.14722112187 11169.2918401 2.14722112187
3746 3745 11173.9227522 2.13282208176 11172.7899301 2.13282208176
3747 3746 11177.4065767 2.11362556754 11176.2929512 2.11362556754
3748 3747 11180.8905347 2.09021696775 11179.8003177 2.09021696775
3749 3748 11184.3746261 2.06320381655 11183.3114223 2.06320381655
3750 3749 11187.8588509 2.03321257036 11186.8256384 2.03321257036
3751 3750 11191.3432091 2.00088527981 11190.3423238 2.00088527981
3752 3751 11194.8277006 1.96687617329 11193.8608245 1.96687617329
3753 3752 11198.3123255 1.9318481692 11197.3804773 1.9318481692
3754 3753 11201.7970835 1.89646933392 11200.9006142 1.89646933392
3755 3754 11205.2819749 1.86140930333 11204.4205656 1.86140930333
3756 3755 11208.7669994 1.82733568554 11207.9396637 1.82733568554
3757 3756 11212.252157 1.79491046279 11211.4572465 1.79491046279
3758 3757 11215.7374478 1.76478641058 11214.9726614 1.76478641058
3759 3758 11219.2228716 1.73760355179 11218.4852681 1.73760355179
3760 3759 11222.7084286 1.71398566369 11221.9944429 1.71398566369
3761 3760 11226.1941185 1.6945368554 11225.4995816 1.6945368554
3762 3761 11229.6799414 1.67983823293 11229.0001032 1.67983823293
3763 3762 11233.1658972 1.67044466872 11232.4954526 1.67044466872
3764 3763 11236.651986 1.66688169206 11235.9851043 1.66688169206
3765 3764 11240.1382076 1.66964251603 11239.4685651 1.66964251603
3766 3765 11243.6245621 1.67918521626 11242.9453769 1.67918521626
3767 3766 11247.1110494 1.69593007583 11246.4151193 1.69593007583
3768 3767 11250.5976694 1.72025710995 11249.8774123 1.72025710995
3769 3768 11254.0844222 1.75250378316 11253.3319184 1.75250378316
3770 3769 11257.5713076 1.79296293097 11256.7783447 1.79296293097
3771 3770 11261.0583257 1.84188089663 11260.2164448 1.84188089663
3772 3771 11264.5454765 1.89945589295 11263.6460206 1.89945589295
3773 3772 11268.0327598 1.96583659789 11267.0669232 1.96583659789
3774 3773 11271.5201757 2.0411209914 11270.4790547 2.0411209914
3775 3774 11275.0077241 2.12535543999 11273.8823687 2.12535543999
3776 3775 11278.495405 2.21853403422 11277.276871 2.21853403422
3777 3776 11281.9832184 2.32059818304 11280.6626202 2.32059818304
3778 3777 11285.4711642 2.43143646765 11284.0397277 2.43143646765
3779 3778 11288.9592423 2.55088475649 11287.4083576 2.55088475649
3780 3779 11292.4474528 2.67872658123 11290.7687262 2.67872658123
3781 3780 11295.9357956 2.81469377295 11294.1211018 2.81469377295
3782 3781 11299.4242707 2.9584673558 11297.4658033 2.9584673558
3783 3782 11302.912878 3.10967869473 11300.8031993 3.10967869473
3784 3783 11306.4016175 3.26791089227 11304.1337066 3.26791089227
3785 3784 11309.8904892 3.43270042808 11307.4577888 3.43270042808
3786 3785 11313.3794931 3.60353903422 11310.775954 3.60353903422
3787 3786 11316.868629 3.77987579736 11314.0887532 3.77987579736
3788 3787 11320.357897 3.96111947842 11317.3967775 3.96111947842
3789 3788 11323.847297 4.14664103895 11320.700656 4.14664103895
3790 3789 11327.336829 4.33577636246 11324.0010527 4.33577636246
3791 3790 11330.826493 4.52782915803 11327.2986638 4.52782915803
3792 3791 11334.3162889 4.72207403261 11330.5942149 4.72207403261
3793 3792 11337.8062167 4.9177597175 11333.888457 4.9177597175
3794 3793 11341.2962764 5.11411243384 11337.1821639 5.11411243384
3795 3794 11344.7864678 5.31033938122 11340.4761285 5.31033938122
3796 3795 11348.2767911 5.50563233278 11343.7711588 5.50563233278
3797 3796 11351.7672461 5.69917131977 11347.0680748 5.69917131977
3798 3797 11355.2578329 5.8901283881 11350.3677045 5.8901283881
3799 3798 11358.7485513 6.07767140886 11353.6708799 6.07767140886
3800 3799 11362.2394013 6.26096792471 11356.9784334 6.26096792471
3801 3800 11365.730383 6.43918901368 11360.291194 6.43918901368
3802 3801 11369.2214963 6.611513152 11363.6099831 6.611513152
3803 3802 11372.7127411 6.77713005732 11366.935611 6.77713005732
3804 3803 11376.2041174 6.93524449402 11370.2688729 6.93524449402
3805 3804 11379.6956252 7.08508002226 11373.6105452 7.08508002226
3806 3805 11383.1872644 7.22588267279 11376.9613817 7.22588267279
3807 3806 11386.6790351 7.35692452985 11380.3221105 7.35692452985
3808 3807 11390.1709371 7.47750720498 11383.6934299 7.47750720498
3809 3808 11393.6629704 7.58696518487 11387.0760052 7.58696518487
3810 3809 11397.155135 7.68466903731 11390.470466 7.68466903731
3811 3810 11400.647431 7.77002845962 11393.8774025 7.77002845962
3812 3811 11404.1398581 7.84249515497 11397.297363 7.84249515497
3813 3812 11407.6324165 7.90156552262 11400.7308509 7.90156552262
3814 3813 11411.125106 7.94678314919 11404.1783228 7.94678314919
3815 3814 11414.6179266 7.97774108873 11407.6401855 7.97774108873
3816 3815 11418.1108783 7.99408392083 11411.1167944 7.99408392083
3817 3816 11421.6039611 7.99550957654 11414.6084516 7.99550957654
3818 3817 11425.097175 7.98177092338 11418.115404 7.98177092338
3819 3818 11428.5905198 7.95267710176 11421.6378427 7.95267710176
3820 3819 11432.0839956 7.90809460621 11425.175901 7.90809460621
3821 3820 11435.5776023 7.84794810627 11428.7296542 7.84794810627
3822 3821 11439.0713399 7.77222100288 11432.2991189 7.77222100288
3823 3822 11442.5652083 7.68095571762 11435.8842526 7.68095571762
3824 3823 11446.0592076 7.57425371327 11439.4849539 7.57425371327
3825 3824 11449.5533376 7.45227524556 11443.1010624 7.45227524556
3826 3825 11453.0475984 7.31523884716 11446.7323596 7.31523884716
3827 3826 11456.54199 7.16342054633 11450.3785694 7.16342054633
3828 3827 11460.0365122 6.99715282396 11454.0393594 6.99715282396
3829 3828 11463.5311651 6.81682331383 11457.7143417 6.81682331383
3830 3829 11467.0259485 6.62287325231 11461.4030753 6.62287325231
3831 3830 11470.5208626 6.41579568477 11465.1050669 6.41579568477
3832 3831 11474.0159072 6.19613343742 11468.8197738 6.19613343742
3833 3832 11477.5110823 5.96447686394 11472.5466055 5.96447686394
3834 3833 11481.0063879 5.72146137784 11476.2849266 5.72146137784
3835 3834 11484.501824 5.46776478217 11480.0340592 5.46776478217
3836 3835 11487.9973905 5.20410440932 11483.793286 5.20410440932
3837 3836 11491.4930873 4.93123408452 11487.5618532 4.93123408452
3838 3837 11494.9889145 4.64994092741 11491.3389736 4.64994092741
3839 3838 11498.484872 4.36104200691 11495.12383 4.36104200691
3840 3839 11501.9809598 4.06538086535 11498.9155789 4.06538086535
3841 3840 11505.4771778 3.76382392824 11502.7133538 3.76382392824
3842 3841 11508.973526 3.45725681666 11506.5162692 3.45725681666
3843 3842 11512.4700044 3.14658058 11510.3234238 3.14658058
3844 3843 11515.9666129 2.83270786651 11514.1339051 2.83270786651
3845 3844 11519.4633516 2.51655905009 11517.9467925 2.51655905009
3846 3845 11522.9602203 2.19905833137 11521.761162 2.19905833137
3847 3846 11526.4572191 1.88112983162 11525.5760892 1.88112983162
3848 3847 11529.9543478 1.5636936977 11529.3906541 1.5636936977
3849 3848 11533.4516065 1.24766223661 11533.2039443 1.24766223661
3850 3849 11536.9489952 0.933936097436 11537.0150591 0.933936097436
3851 3850 11540.4465138 0.623400518846 11540.8231133 0.623400518846
3852 3851 11543.9441622 0.316921659475 11544.6272406 0.316921659475
3853 3852 11547.4419405 0.0153430283387 11548.4265975 0.0153430283387
3854 3853 11550.9398486 -0.280517968168 11552.2203666 0.280517968168
3855 3854 11554.4378865 -0.569873346733 11556.0077598 0.569873346733
3856 3855 11557.936054 -0.851967719746 11559.7880218 0.851967719746
3857 3856 11561.4343513 -1.12608130555 11563.5604326 1.12608130555
3858 3857 11564.9327783 -1.39153276261 11567.3243111 1.39153276261
3859 3858 11568.4313349 -1.64768183468 11571.0790167 1.64768183468
3860 3859 11571.9300211 -1.89393179526 11574.8239529 1.89393179526
3861 3860 11575.4288368 -2.12973168022 11578.5585685 2.12973168022
3862 3861 11578.9277821 -2.35457829891 11582.2823604 2.35457829891
3863 3862 11582.4268569 -2.56801801503 11585.9948749 2.56801801503
3864 3863 11585.9260612 -2.76964828952 11589.6957095 2.76964828952
3865 3864 11589.4253949 -2.95911897923 11593.3845139 2.95911897923
3866 3865 11592.924858 -3.13613338604 11597.0609914 3.13613338604
3867 3866 11596.4244504 -3.30044905248 11600.7248995 3.30044905248
3868 3867 11599.9241722 -3.45187830111 11604.3760505 3.45187830111
3869 3868 11603.4240233 -3.59028851622 11608.0143118 3.59028851622
3870 3869 11606.9240037 -3.71560216756 11611.6396058 3.71560216756
3871 3870 11610.4241133 -3.82779657719 11615.2519098 3.82779657719
3872 3871 11613.9243521 -3.92690343176 11618.8512555 3.92690343176
3873 3872 11617.42472 -4.01300804368 11622.4377281 4.01300804368
3874 3873 11620.9252171 -4.08624836603 11626.0114655 4.08624836603
3875 3874 11624.4258433 -4.1468137671 11629.5726571 4.1468137671
3876 3875 11627.9265985 -4.19494357162 11633.1215421 4.19494357162
3877 3876 11631.4274828 -4.23092537704 11636.6584082 4.23092537704
3878 3877 11634.9284961 -4.25509315404 11640.1835893 4.25509315404
3879 3878 11638.4296384 -4.26782514163 11643.6974635 4.26782514163
3880 3879 11641.9309095 -4.26954154826 11647.2004511 4.26954154826
3881 3880 11645.4323096 -4.260702071 11650.6930117 4.260702071
3882 3881 11648.9338386 -4.24180324603 11654.1756418 4.24180324603
3883 3882 11652.4354963 -4.21337564428 11657.648872 4.21337564428
3884 3883 11655.9372829 -4.17598092671 11661.1132638 4.17598092671
3885 3884 11659.4391983 -4.13020877462 11664.569407 4.13020877462
3886 3885 11662.9412423 -4.07667371074 11668.017916 4.07667371074
3887 3886 11666.4434151 -4.01601182732 11671.4594269 4.01601182732
3888 3887 11669.9457166 -3.94887743802 11674.894594 3.94887743802
3889 3888 11673.4481466 -3.87593967056 11678.3240863 3.87593967056
3890 3889 11676.9507053 -3.79787901731 11681.7485843 3.79787901731
3891 3890 11680.4533926 -3.71538386139 11685.1687764 3.71538386139
3892 3891 11683.9562083 -3.62914699554 11688.5853553 3.62914699554
3893 3892 11687.4591526 -3.53986215126 11691.9990148 3.53986215126
3894 3893 11690.9622254 -3.44822055556 11695.4104459 3.44822055556
3895 3894 11694.4654266 -3.35490753233 11698.8203341 3.35490753233
3896 3895 11697.9687562 -3.26059916522 11702.2293553 3.26059916522
3897 3896 11701.4722141 -3.16595903845 11705.6381732 3.16595903845
3898 3897 11704.9758004 -3.07163507149 11709.0474355 3.07163507149
3899 3898 11708.479515 -2.97825646312 11712.4577715 2.97825646312
3900 3899 11711.9833579 -2.88643075967 11715.8697887 2.88643075967
3901 3900 11715.487329 -2.79674106163 11719.2840701 2.79674106163
3902 3901 11718.9914283 -2.70974338197 11722.7011717 2.70974338197
3903 3902 11722.4956558 -2.62596416886 11726.12162 2.62596416886
3904 3903 11726.0000114 -2.54589800436 11729.5459094 2.54589800436
3905 3904 11729.5044952 -2.47000548993 11732.9745007 2.47000548993
3906 3905 11733.009107 -2.39871132851 11736.4078183 2.39871132851
3907 3906 11736.5138468 -2.33240261191 11739.8462494 2.33240261191
3908 3907 11740.0187147 -2.27142732111 11743.290142 2.27142732111
3909 3908 11743.5237105 -2.21609304609 11746.7398036 2.21609304609
3910 3909 11747.0288343 -2.16666593045 11750.1955002 2.16666593045
3911 3910 11750.534086 -2.12336984523 11753.6574558 2.12336984523
3912 3911 11754.0394655 -2.08638579469 11757.1258513 2.08638579469
3913 3912 11757.5449729 -2.05585155614 11760.6008245 2.05585155614
3914 3913 11761.0506082 -2.03186155418 11764.0824697 2.03186155418
3915 3914 11764.5563712 -2.01446696895 11767.5708381 2.01446696895
3916 3915 11768.0622619 -2.00367607643 11771.065938 2.00367607643
3917 3916 11771.5682804 -1.99945481781 11774.5677352 1.99945481781
3918 3917 11775.0744265 -2.00172759387 11778.0761541 2.00172759387
3919 3918 11778.5807003 -2.01037827881 11781.5910786 2.01037827881
3920 3919 11782.0871017 -2.02525144731 11785.1123531 2.02525144731
3921 3920 11785.5936307 -2.04615380701 11788.6397845 2.04615380701
3922 3921 11789.1002872 -2.07285582809 11792.173143 2.07285582809
3923 3922 11792.6070713 -2.10509356014 11795.7121648 2.10509356014
3924 3923 11796.1139828 -2.14257062584 11799.2565534 2.14257062584
3925 3924 11799.6210218 -2.18496038 11802.8059822 2.18496038
3926 3925 11803.1281882 -2.23190822174 11806.3600964 2.23190822174
3927 3926 11806.635482 -2.2830340466 11809.9185161 2.2830340466
3928 3927 11810.1429032 -2.33793482504 11813.480838 2.33793482504
3929 3928 11813.6504517 -2.39618729278 11817.046639 2.39618729278
3930 3929 11817.1581275 -2.45735073808 11820.6154782 2.45735073808
3931 3930 11820.6659305 -2.52096987064 11824.1869004 2.52096987064
3932 3931 11824.1738608 -2.58657775618 11827.7604385 2.58657775618
3933 3932 11827.6819182 -2.65369880063 11831.335617 2.65369880063
3934 3933 11831.1901028 -2.72185176768 11834.9119546 2.72185176768
3935 3934 11834.6984146 -2.79055281294 11838.4889674 2.79055281294
3936 3935 11838.2068534 -2.85931851841 11842.0661719 2.85931851841
3937 3936 11841.7154193 -2.92766891063 11845.6430882 2.92766891063
3938 3937 11845.2241123 -2.99513044595 11849.2192427 2.99513044595
3939 3938 11848.7329322 -3.061238947 11852.7941712 3.061238947
3940 3939 11852.2418791 -3.12554247405 11856.3674216 3.12554247405
3941 3940 11855.750953 -3.18760411603 11859.9385571 3.18760411603
3942 3941 11859.2601537 -3.24700468576 11863.5071584 3.24700468576
3943 3942 11862.7694813 -3.30334530501 11867.0728266 3.30334530501
3944 3943 11866.2789358 -3.35624986527 11870.6351857 3.35624986527
3945 3944 11869.7885171 -3.40536735081 11874.1938844 3.40536735081
3946 3945 11873.2982251 -3.45037401159 11877.7485991 3.45037401159
3947 3946 11876.8080599 -3.4909753741 11881.2990353 3.4909753741
3948 3947 11880.3180214 -3.52690807916 11884.8449295 3.52690807916
3949 3948 11883.8281096 -3.5579415368 11888.3860511 3.5579415368
3950 3949 11887.3383244 -3.58387938904 11891.9222038 3.58387938904
3951 3950 11890.8486658 -3.6045607726 11895.4532266 3.6045607726
3952 3951 11894.3591338 -3.61986137464 11898.9789952 3.61986137464
3953 3952 11897.8697284 -3.62969427554 11902.4994227 3.62969427554
3954 3953 11901.3804495 -3.63401057416 11906.0144601 3.63401057416
3955 3954 11904.8912971 -3.63279979184 11909.5240968 3.63279979184
3956 3955 11908.4022711 -3.62609005285 11913.0283611 3.62609005285
3957 3956 11911.9133715 -3.61394804006 11916.5273196 3.61394804006
3958 3957 11915.4245984 -3.59647872579 11920.0210771 3.59647872579
3959 3958 11918.9359516 -3.573824879 11923.5097764 3.573824879
3960 3959 11922.4474311 -3.54616635126 11926.9935974 3.54616635126
3961 3960 11925.9590369 -3.51371914495 11930.472756 3.51371914495
3962 3961 11929.470769 -3.47673426848 11933.9475033 3.47673426848
3963 3962 11932.9826273 -3.43549638433 11937.4181237 3.43549638433
3964 3963 11936.4946118 -3.39032225679 11940.8849341 3.39032225679
3965 3964 11940.0067225 -3.34155900764 11944.3482815 3.34155900764
3966 3965 11943.5189593 -3.2895821885 11947.8085415 3.2895821885
3967 3966 11947.0313222 -3.23479368023 11951.2661159 3.23479368023
3968 3967 11950.5438112 -3.17761943003 11954.7214306 3.17761943003
3969 3968 11954.0564262 -3.11850703845 11958.1749333 3.11850703845
3970 3969 11957.5691673 -3.05792320858 11961.6270905 3.05792320858
3971 3970 11961.0820343 -2.99635107121 11965.0783853 2.99635107121
3972 3971 11964.5950272 -2.93428739987 11968.5293146 2.93428739987
3973 3972 11968.1081461 -2.87223973053 11971.9803858 2.87223973053
3974 3973 11971.6213908 -2.81072340123 11975.4321142 2.81072340123
3975 3974 11975.1347614 -2.75025852738 11978.88502 2.75025852738
3976 3975 11978.6482579 -2.69136692882 11982.3396248 2.69136692882
3977 3976 11982.1618801 -2.63456902504 11985.7964491 2.63456902504
3978 3977 11985.675628 -2.58038071525 11989.2560087 2.58038071525
3979 3978 11989.1895017 -2.5293102599 11992.718812 2.5293102599
3980 3979 11992.7035011 -2.48185518065 11996.1853563 2.48185518065
3981 3980 11996.2176261 -2.43849919532 11999.6561253 2.43849919532
3982 3981 11999.7318768 -2.39970920459 12003.131586 2.39970920459
3983 3982 12003.246253 -2.36593234677 12006.6121854 2.36593234677
3984 3983 12006.7607548 -2.33759313682 12010.098348 2.33759313682
3985 3984 12010.2753822 -2.3150907052 12013.5904729 2.3150907052
3986 3985 12013.7901351 -2.29879615192 12017.0889312 2.29879615192
3987 3986 12017.3050134 -2.28905003042 12020.5940634 2.28905003042
3988 3987 12020.8200171 -2.28615997544 12024.1061771 2.28615997544
3989 3988 12024.3351463 -2.29039848814 12027.6255448 2.29039848814
3990 3989 12027.8504009 -2.30200089121 12031.1524018 2.30200089121
3991 3990 12031.3657808 -2.32116346564 12034.6869442 2.32116346564
3992 3991 12034.881286 -2.34804178018 12038.2293278 2.34804178018
3993 3992 12038.3969165 -2.3827492233 12041.7796657 2.3827492233
3994 3993 12041.9126722 -2.42535574663 12045.338028 2.42535574663
3995 3994 12045.4285532 -2.47588682778 12048.90444 2.47588682778
3996 3995 12048.9445593 -2.53432265931 12052.478882 2.53432265931
3997 3996 12052.4606906 -2.60059756943 12056.0612882 2.60059756943
3998 3997 12055.976947 -2.67459967908 12059.6515467 2.67459967908
3999 3998 12059.4933286 -2.75617079844 12063.2494994 2.75617079844
4000 3999 12063.0098352 -2.84510656522 12066.8549417 2.84510656522
4001 4000 12066.5264668 -2.9411568253 12070.4676236 2.9411568253

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())