Current task: —

E-002-first-zeros.py

Experiments: E-002 · script updated 08-17-2026

E-002-zeros-first-10000.csv — 310.4 KB, updated 08-17-2026

← prev page 17 of 20 · 500/page · 10000 rows next →
# ngamma_n
8002 8001 8148.98665356342885059065
8003 8002 8150.740615482133180050028
8004 8003 8151.026671304605941133325
8005 8004 8152.217728258409923578097
8006 8005 8152.965931127600350832025
8007 8006 8153.488253661007389787201
8008 8007 8154.27297942726510342765
8009 8008 8155.128933992541701203322
8010 8009 8156.304912385853016565358
8011 8010 8157.194764620168424798308
8012 8011 8157.981568491565954841366
8013 8012 8158.767638742285524507584
8014 8013 8160.078200809919480286178
8015 8014 8160.950122589701705137921
8016 8015 8161.3461456332076552997
8017 8016 8162.592140586540177066228
8018 8017 8163.454284500946756961259
8019 8018 8164.106957146947787666235
8020 8019 8164.87025733330965703378
8021 8020 8165.448818475203636547097
8022 8021 8166.448089237459474072097
8023 8022 8168.295104129872097856681
8024 8023 8168.668480129248088776892
8025 8024 8169.593836203726183880082
8026 8025 8170.415779001677799885184
8027 8026 8171.095110983013008879839
8028 8027 8171.823553153261938824652
8029 8028 8173.111533980957399346911
8030 8029 8173.738292657767862694256
8031 8030 8174.366180914143181117869
8032 8031 8175.531628952027557091282
8033 8032 8176.449213453735487555264
8034 8033 8177.331542720256475596126
8035 8034 8178.104666952751349904024
8036 8035 8179.690387023258393665038
8037 8036 8180.035752135504621166749
8038 8037 8181.013209816269468891043
8039 8038 8181.282044613567902511615
8040 8039 8182.430116793736577954467
8041 8040 8183.129990253211886529689
8042 8041 8184.254600673371781122501
8043 8042 8185.038683169381324750709
8044 8043 8186.605228280465867320541
8045 8044 8187.019086128030826817515
8046 8045 8187.927398545163811762666
8047 8046 8188.675092154903384155249
8048 8047 8189.458001683713208136679
8049 8048 8190.538859646430364018567
8050 8049 8191.317359421739389510591
8051 8050 8192.334649942094885905774
8052 8051 8192.995406727353576314676
8053 8052 8193.233410994546278146708
8054 8053 8194.929408138006707608091
8055 8054 8196.067584918459480013504
8056 8055 8196.948324751570020063836
8057 8056 8197.513353942914236689239
8058 8057 8198.242611792508813813086
8059 8058 8199.585117177658381638924
8060 8059 8199.884773862718585288309
8061 8060 8200.341952211152910457329
8062 8061 8201.755260360195686605796
8063 8062 8202.876646170400668980275
8064 8063 8203.529203740132572454604
8065 8064 8204.761729330088271563228
8066 8065 8205.259250532255487837495
8067 8066 8206.228375057993273773492
8068 8067 8207.281175265221649345077
8069 8068 8208.167607521846165030017
8070 8069 8208.846424314350126775814
8071 8070 8209.530685579144148942069
8072 8071 8210.510348798943503576932
8073 8072 8211.03088888260768874934
8074 8073 8212.265612418521945718853
8075 8074 8213.253267546900586726043
8076 8075 8214.668747954193995220224
8077 8076 8215.2376249589123054241
8078 8077 8215.962628469759811710202
8079 8078 8216.502661260261756384329
8080 8079 8217.268004086898548938838
8081 8080 8218.619573329715374389626
8082 8081 8219.346543827538397744474
8083 8082 8220.050014501032126610979
8084 8083 8220.852882450029778700192
8085 8084 8222.15393348183351587209
8086 8085 8222.908793157701144833537
8087 8086 8223.804093211694585927126
8088 8087 8224.783041493124676939912
8089 8088 8225.662484685170928718521
8090 8089 8226.606391577558202104648
8091 8090 8227.022032307299329088024
8092 8091 8227.898063963536953687625
8093 8092 8228.756591820183146420054
8094 8093 8229.309424342824941151659
8095 8094 8231.318604911878211821207
8096 8095 8231.752039397669833656647
8097 8096 8232.534397486110946169717
8098 8097 8233.385017835937108190016
8099 8098 8234.463093964037106698685
8100 8099 8234.940463388085308050376
8101 8100 8235.903077656301819452453
8102 8101 8236.85283763177358824103
8103 8102 8237.661239321279663959117
8104 8103 8238.643824853558684305467
8105 8104 8239.166099547594128810781
8106 8105 8240.107660165186829692366
8107 8106 8241.810539848806186373727
8108 8107 8242.262983380447622024202
8109 8108 8243.126125160612169570479
8110 8109 8244.126672343004777226646
8111 8110 8244.522473036397773235272
8112 8111 8245.291902817523907431584
8113 8112 8246.414750234614116291306
8114 8113 8247.104523644822744979165
8115 8114 8248.198015439498015361302
8116 8115 8249.18221167399417390245
8117 8116 8250.476640454473099604445
8118 8117 8250.905128429843998432271
8119 8118 8251.591930804605724302972
8120 8119 8252.495963346239549955397
8121 8120 8253.795261750578161862216
8122 8121 8254.54211087324964365958
8123 8122 8255.238100660730337705271
8124 8123 8255.519078691640623415979
8125 8124 8256.777714951961033779459
8126 8125 8257.752236885288355165222
8127 8126 8258.997998911040735881233
8128 8127 8259.868525257801950116278
8129 8128 8260.782502762527201723169
8130 8129 8261.566253507895685790401
8131 8130 8262.002122423530632919038
8132 8131 8263.168899726109257759934
8133 8132 8263.541048290496581220259
8134 8133 8264.798832930119229835847
8135 8134 8265.847428254266062830432
8136 8135 8266.459167726401087300204
8137 8136 8267.620802307135626363065
8138 8137 8268.306797080353606837742
8139 8138 8269.29383736895733627266
8140 8139 8270.597375143773093461016
8141 8140 8271.102988988782918370475
8142 8141 8271.527124563273803948389
8143 8142 8273.023727020428422558271
8144 8143 8273.359088656960935974486
8145 8144 8274.260748915791966767715
8146 8145 8274.761296174178412149342
8147 8146 8276.53208762164125349506
8148 8147 8277.550531731380826446445
8149 8148 8278.3110448937463518479
8150 8149 8278.724155121671587525524
8151 8150 8279.658220294078459726353
8152 8151 8280.576684590987368614557
8153 8152 8281.427733833263994074704
8154 8153 8282.325186834637863743062
8155 8154 8283.364230097243276671289
8156 8155 8283.682719743919273357118
8157 8156 8284.837059154501373643261
8158 8157 8286.156465378322752117005
8159 8158 8286.666088558196641107177
8160 8159 8287.736512263615103393231
8161 8160 8288.980436058250145943269
8162 8161 8289.388001230432228513183
8163 8162 8290.178026756237918287504
8164 8163 8290.941297006235422462127
8165 8164 8291.360592491897702178059
8166 8165 8292.962945185368110517814
8167 8166 8293.588170375629208896023
8168 8167 8294.846862900661874748937
8169 8168 8295.568517315534019765416
8170 8169 8296.69373959480580608466
8171 8170 8297.216960600331349361549
8172 8171 8297.847035138319659337984
8173 8172 8299.092930897247873262129
8174 8173 8300.012435009625779094548
8175 8174 8300.536369897704659530286
8176 8175 8301.505488875302442723826
8177 8176 8302.243478656941231482732
8178 8177 8302.932610094597082915629
8179 8178 8304.590585713634893841944
8180 8179 8305.587635161418371045938
8181 8180 8306.142916438067052241718
8182 8181 8306.723994988386548927926
8183 8182 8307.761913372272002240646
8184 8183 8308.422654234320376592484
8185 8184 8309.351684270005945281409
8186 8185 8310.142625948198416468871
8187 8186 8310.895266168153841116869
8188 8187 8312.487888176029377335905
8189 8188 8313.144211388340919313914
8190 8189 8313.58488534547288764954
8191 8190 8314.936714630643792217181
8192 8191 8315.508934703107465718291
8193 8192 8316.991697012572252064972
8194 8193 8317.138031600440528164572
8195 8194 8318.217082256094855772997
8196 8195 8318.759355838360057176592
8197 8196 8319.747436440157097501898
8198 8197 8320.463512545590816766302
8199 8198 8321.89568624027986798735
8200 8199 8322.995964073077956885788
8201 8200 8323.508788173949078897611
8202 8201 8324.656429208124491402791
8203 8202 8325.300636981033048151815
8204 8203 8325.70879727819432175009
8205 8204 8326.619738160312320330269
8206 8205 8328.079211692026217181762
8207 8206 8328.715589742688303484141
8208 8207 8329.271340698187561020177
8209 8208 8330.21204892496794719154
8210 8209 8331.59350284968134051724
8211 8210 8332.263071023854104492956
8212 8211 8333.237664713927219119122
8213 8212 8334.052726657461841939375
8214 8213 8335.037292360082902758728
8215 8214 8335.626392666261988353468
8216 8215 8336.461889739043513756092
8217 8216 8337.076040922297457678821
8218 8217 8337.871295467132125577852
8219 8218 8339.257480606268247451907
8220 8219 8340.393714333008532505555
8221 8220 8341.281554842609717297811
8222 8221 8341.924980693567668196815
8223 8222 8342.350313541955185113714
8224 8223 8343.649101637255311026882
8225 8224 8344.661638669773047828916
8226 8225 8345.053008323445528110394
8227 8226 8346.083112882303631877124
8228 8227 8346.96346335886379944082
8229 8228 8347.710096767259462942755
8230 8229 8348.747559864035634572652
8231 8230 8349.53497921514655130446
8232 8231 8351.134421812470111501796
8233 8232 8351.661547503139079213605
8234 8233 8352.417119848341569396154
8235 8234 8352.958073703176818373401
8236 8235 8353.84560904902539093322
8237 8236 8354.918549437190939292958
8238 8237 8355.268913974758465421955
8239 8238 8356.904040991135406797074
8240 8239 8357.31747140342204904421
8241 8240 8358.619425855004602392326
8242 8241 8359.658407185576737169378
8243 8242 8359.970765629970357672374
8244 8243 8361.073625395230436803064
8245 8244 8361.854099314578149850512
8246 8245 8362.910269692054515895013
8247 8246 8363.896584173056802180562
8248 8247 8364.270313084730052797828
8249 8248 8364.921654252533533409299
8250 8249 8365.842461794979225357138
8251 8250 8367.570202902089375891835
8252 8251 8368.300171089583584976237
8253 8252 8368.924192690775512274865
8254 8253 8369.98051663172880026548
8255 8254 8370.774259905908703181412
8256 8255 8371.308043549177268831647
8257 8256 8372.087574386333927579119
8258 8257 8373.147445440275968387768
8259 8258 8374.076460464702356295851
8260 8259 8374.967512125239580125958
8261 8260 8375.8435753172237095433
8262 8261 8376.964785295105338449175
8263 8262 8377.391886566343676217481
8264 8263 8378.850000555768489571867
8265 8264 8379.465601294925528146675
8266 8265 8380.556228744111412492269
8267 8266 8380.966154321460878629372
8268 8267 8381.564090254533326264672
8269 8268 8382.905500683483409339639
8270 8269 8383.402690457030235591776
8271 8270 8384.24326485564340226545
8272 8271 8386.020866344514400341976
8273 8272 8386.716772953246899719499
8274 8273 8387.240328394949125401145
8275 8274 8388.199827520237767302718
8276 8275 8388.635538222305673388255
8277 8276 8389.785194387120103796663
8278 8277 8391.043045051889901812263
8279 8278 8391.345769446801131816227
8280 8279 8392.20260909272171083829
8281 8280 8393.253383485222707219665
8282 8281 8394.048747018988673222088
8283 8282 8395.25815389381998206156
8284 8283 8396.23818323103525535955
8285 8284 8396.956726475999459468832
8286 8285 8397.80153860267760821218
8287 8286 8398.740715654843454823954
8288 8287 8399.525152210574804439187
8289 8288 8399.733280376688604033395
8290 8289 8400.79002963432111382572
8291 8290 8402.07124947973954563461
8292 8291 8403.287132730923793603005
8293 8292 8403.814434922654527956345
8294 8293 8404.739289499232601788223
8295 8294 8405.705195480421934252301
8296 8295 8406.569355486752886431245
8297 8296 8407.084863515018616038864
8298 8297 8408.331513209208173246253
8299 8298 8408.928736382755880073093
8300 8299 8410.102479272850536042136
8301 8300 8410.365241307512174424407
8302 8301 8411.254384288656067219813
8303 8302 8412.634141842294539537653
8304 8303 8413.680979399162461408151
8305 8304 8414.783450748679780385434
8306 8305 8415.403499856647607585506
8307 8306 8415.723254017674352203857
8308 8307 8416.838129918141680980471
8309 8308 8417.556527395180192613376
8310 8309 8418.527239230456416319999
8311 8310 8419.56910901736279373289
8312 8311 8420.005248982217309674383
8313 8312 8421.508390247804407924037
8314 8313 8422.378527635417244940192
8315 8314 8423.240648284422228955897
8316 8315 8423.389063749008314098049
8317 8316 8425.250971770325280850542
8318 8317 8425.839729271377591603731
8319 8318 8426.287467350238028572696
8320 8319 8427.283348871030377107745
8321 8320 8428.018573119378621973182
8322 8321 8428.62483003244740669636
8323 8322 8429.995855684124555333439
8324 8323 8431.177000629286037677472
8325 8324 8431.955360419309332733644
8326 8325 8432.975958832972707389838
8327 8326 8433.312480291410010887228
8328 8327 8434.415421302017862926678
8329 8328 8435.058137203258648016662
8330 8329 8435.811385398177148761688
8331 8330 8437.043923772019933053084
8332 8331 8437.89077050587639840734
8333 8332 8438.581508721451530186008
8334 8333 8439.2804538770134547697
8335 8334 8440.622495639605906997019
8336 8335 8441.680875472000432366701
8337 8336 8442.342548491260936251721
8338 8337 8443.184375820362654366829
8339 8338 8443.859358820966436964496
8340 8339 8445.019550655988300861456
8341 8340 8445.343743347072321334456
8342 8341 8446.186349822426312355895
8343 8342 8447.097012278567900530657
8344 8343 8448.634176636200701835946
8345 8344 8449.49601887889054980244
8346 8345 8450.170450781585369006341
8347 8346 8451.011051485949539869126
8348 8347 8451.672354837663968961493
8349 8348 8452.52678758685074350417
8350 8349 8453.840544327521764686347
8351 8350 8454.385593869507225565531
8352 8351 8455.129114744626284273723
8353 8352 8455.682201309985829445138
8354 8353 8457.25693389487118666032
8355 8354 8457.58495667528384248868
8356 8355 8459.077902974867820202182
8357 8356 8459.817317810838734255545
8358 8357 8460.913889072826499636858
8359 8358 8461.56286784709621418383
8360 8359 8462.069886427542369839375
8361 8360 8462.64657916409884543737
8362 8361 8463.899499845707665651395
8363 8362 8464.878542529873564520302
8364 8363 8465.537510486056069504891
8365 8364 8466.82633599204235727265
8366 8365 8467.63563018877173894327
8367 8366 8468.44430712261821922705
8368 8367 8469.241866818203921049927
8369 8368 8470.285462154492825657051
8370 8369 8470.855567882220040853132
8371 8370 8472.106756704898335570455
8372 8371 8472.5815935858232674018
8373 8372 8473.422142529289848981107
8374 8373 8474.178986718236761062713
8375 8374 8474.840320404315802758003
8376 8375 8476.904664917529873050932
8377 8376 8477.388694101605307964919
8378 8377 8477.9218610248912868936
8379 8378 8478.842816767807682619641
8380 8379 8479.721517905517075359653
8381 8380 8480.498098395820873733765
8382 8381 8481.301917570463900710959
8383 8382 8481.987757046319566766965
8384 8383 8483.482314466079800873977
8385 8384 8483.709365226568415997957
8386 8385 8485.13431548305347405032
8387 8386 8485.731595822059216510422
8388 8387 8486.695524389842326675206
8389 8388 8487.794494038859107169326
8390 8389 8488.692418611324895743604
8391 8390 8489.335843596700493787291
8392 8391 8490.035611178059148009674
8393 8392 8490.800705906941090170709
8394 8393 8491.507454767121188134416
8395 8394 8492.596487046624479601838
8396 8395 8493.8235746352286961874
8397 8396 8494.552018029912669190852
8398 8397 8496.029850063820089994784
8399 8398 8496.290002225624985310639
8400 8399 8497.053886706817432783846
8401 8400 8497.637356296138879116551
8402 8401 8498.95506548974465721703
8403 8402 8499.848538084948723033348
8404 8403 8500.587623328917203717867
8405 8404 8501.302755466843548896163
8406 8405 8501.908544843171661705964
8407 8406 8503.52822547384323943122
8408 8407 8504.088873613565414850855
8409 8408 8505.263513054702903911336
8410 8409 8506.184467090154967255663
8411 8410 8506.655630248317176952908
8412 8411 8507.568430665196669049421
8413 8412 8508.341839184961200025298
8414 8413 8509.205092759779803210048
8415 8414 8509.605168068929470334175
8416 8415 8511.168181149292149933667
8417 8416 8512.237298970798791569751
8418 8417 8513.180504244766143780696
8419 8418 8513.42836685617616823613
8420 8419 8514.603122414804340400206
8421 8420 8515.510306167103557472846
8422 8421 8516.52071098560288541289
8423 8422 8517.066793398954224394818
8424 8423 8517.83691240993860399512
8425 8424 8518.994229230281543939863
8426 8425 8519.543241912978898299566
8427 8426 8520.204192768442940044217
8428 8427 8521.698529412680438967655
8429 8428 8522.883461465875911555468
8430 8429 8523.581766092820433852088
8431 8430 8524.072959892595080814581
8432 8431 8525.192740841855517744293
8433 8432 8525.58014593987170309798
8434 8433 8526.384967075492471422842
8435 8434 8527.801285476009697103969
8436 8435 8528.335279661196933676458
8437 8436 8529.165725244556536085169
8438 8437 8530.392088474891837509447
8439 8438 8531.215969405232129069372
8440 8439 8532.311647984247542634875
8441 8440 8532.610707274995750283752
8442 8441 8533.780194489509963862777
8443 8442 8535.042150484167910907487
8444 8443 8535.467449844383416871856
8445 8444 8536.033310080767485093766
8446 8445 8536.749664145821033413409
8447 8446 8537.778374013585088836283
8448 8447 8539.05711823390570351973
8449 8448 8540.192595719829206641771
8450 8449 8540.966649371093544179859
8451 8450 8541.539982808592548162912
8452 8451 8542.565392468219621348581
8453 8452 8543.339096416792142927247
8454 8453 8543.751519717896543629416
8455 8454 8545.303334073614737677182
8456 8455 8545.618122407256159402675
8457 8456 8546.691491452830918974214
8458 8457 8547.709108139347262475244
8459 8458 8548.380388381306182204862
8460 8459 8549.305495770688096647045
8461 8460 8550.742265127922256273429
8462 8461 8551.451183851781723423937
8463 8462 8552.036847251925592645922
8464 8463 8552.704688816772418716207
8465 8464 8553.657695231643939016909
8466 8465 8554.540035259277030641346
8467 8466 8555.129548602584506608527
8468 8467 8556.062209076877572432668
8469 8468 8557.527026799399881511298
8470 8469 8558.612656240040738909292
8471 8470 8558.923460876135345513269
8472 8471 8559.960124311472823713546
8473 8472 8560.42616701168182292516
8474 8473 8561.800541026589644234585
8475 8474 8562.354829384678896759494
8476 8475 8563.582511284261977707355
8477 8476 8563.910392634172234669086
8478 8477 8564.757382722133843278006
8479 8478 8565.618743675628756981395
8480 8479 8567.204607149902215821402
8481 8480 8567.744539733550107743858
8482 8481 8568.746748320488499739446
8483 8482 8569.695230961154600895327
8484 8483 8570.47314425496736335255
8485 8484 8570.946215417387194037721
8486 8485 8571.818896200671813037972
8487 8486 8572.426464758279965487167
8488 8487 8573.882934741582173632722
8489 8488 8574.913003319524613166857
8490 8489 8575.175968707240375444142
8491 8490 8576.70893463108900110146
8492 8491 8577.398701995898074854265
8493 8492 8577.971246763931230355045
8494 8493 8579.236900975935950131715
8495 8494 8579.917964132034007624038
8496 8495 8580.70200392061004259457
8497 8496 8581.556354734949255135715
8498 8497 8582.296736735663667835049
8499 8498 8582.982426418622655661259
8500 8499 8583.913021380959941125644
8501 8500 8585.651463150218718438076

E-002-zeros-first-10000.json — 712 bytes, updated 08-17-2026

JSON sidecar (click to expand)
{
  "experiment": "E-002",
  "task": "0.6a",
  "description": "First 10000 nontrivial zero ordinates via mpmath.zetazero (multiprocess)",
  "script": "research/numerics/scripts/E-002-first-zeros.py",
  "parameters": {
    "n_zeros": 10000,
    "dps": 25,
    "workers": 15
  },
  "checks": {
    "strictly_monotone": true,
    "gamma_1_matches_known": true,
    "riemann_von_mangoldt_abs_error": "0.3207309991"
  },
  "gap_statistics": {
    "min_gap": "0.03769849773",
    "max_gap": "6.887314497",
    "mean_gap": "0.9864634392",
    "local_mean_spacing_at_end": "0.8536743703"
  },
  "elapsed_seconds": 0.0,
  "timestamp_utc": "2026-08-17T20:09:20.100449+00:00",
  "row_count": 10000
}

Source code

Python script (click to expand)
"""E-002 — Task 0.6a: first 10^4 nontrivial zero ordinates of zeta.

Computes γ_n = Im(ρ_n) for n = 1..N via mpmath.zetazero at dps 25.
Parallel: multiprocessing over contiguous n-blocks (zetazero(n) is
independent per n); each worker writes its own part file with per-row
flush (crash-safe), main merges. Resumable: existing complete part files
are skipped.

Sanity checks: strict monotonicity; γ_1 = 14.134725141734693790…;
Riemann–von Mangoldt N(T) agreement at T = γ_N.

Outputs: research/numerics/data/E-002-zeros-first-10000.csv (+ .json)
Parts:   research/numerics/data/E-002-parts/part-NNN.csv
Cached:  does not recompute if final CSV is complete (use --force).
"""
import json
import os
import sys
import time
from datetime import datetime, timezone
from multiprocessing import Pool
from pathlib import Path

import mpmath as mp
import numpy as np

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
PARTS = DATA / "E-002-parts"
N_ZEROS = 10_000
DPS = 25
N_WORKERS = min(15, os.cpu_count() or 4)  # leave one core for the OS

CSV = DATA / "E-002-zeros-first-10000.csv"
JSON = DATA / "E-002-zeros-first-10000.json"


def block_bounds(n_blocks: int):
    bounds = []
    per = N_ZEROS // n_blocks
    lo = 1
    for b in range(n_blocks):
        hi = N_ZEROS if b == n_blocks - 1 else lo + per - 1
        bounds.append((lo, hi))
        lo = hi + 1
    return bounds


def part_path(lo: int) -> Path:
    return PARTS / f"part-{lo:05d}.csv"


def compute_block(lo: int, hi: int) -> str:
    mp.mp.dps = DPS
    p = part_path(lo)
    tmp = p.with_suffix(".tmp")
    with tmp.open("w", encoding="utf-8", newline="") as f:
        for n in range(lo, hi + 1):
            g = mp.im(mp.zetazero(n))
            f.write(f"{n},{mp.nstr(g, DPS)}\n")
            f.flush()  # crash-safe: no buffered loss on kill
    os.replace(tmp, p)  # atomic: complete parts only
    return str(p)


def part_complete(lo: int, hi: int) -> bool:
    p = part_path(lo)
    if not p.exists():
        return False
    with p.open(encoding="utf-8") as f:
        return sum(1 for _ in f) == hi - lo + 1


def main() -> int:
    force = "--force" in sys.argv
    if CSV.exists() and JSON.exists() and not force:
        with CSV.open(encoding="utf-8") as f:
            if sum(1 for _ in f) - 1 >= N_ZEROS:
                print(f"cached: {CSV} complete (use --force to recompute)")
                return 0
    DATA.mkdir(parents=True, exist_ok=True)
    PARTS.mkdir(parents=True, exist_ok=True)

    blocks = block_bounds(N_WORKERS)
    todo = [(lo, hi) for lo, hi in blocks
            if force or not part_complete(lo, hi)]
    print(f"blocks: {len(blocks)} total, {len(todo)} to compute "
          f"({N_WORKERS} workers)")

    t0 = time.time()
    if todo:
        with Pool(N_WORKERS) as pool:
            for i, path in enumerate(pool.starmap(compute_block, todo), 1):
                print(f"  part done {i}/{len(todo)}: {Path(path).name} "
                      f"({time.time()-t0:.0f}s)", flush=True)

    # merge
    rows = []
    for lo, hi in blocks:
        with part_path(lo).open(encoding="utf-8") as f:
            rows.extend(f.read().strip().splitlines())
    rows.sort(key=lambda r: int(r.split(",", 1)[0]))
    with CSV.open("w", encoding="utf-8", newline="") as f:
        f.write("n,gamma_n\n")
        f.write("\n".join(rows) + "\n")
    elapsed = time.time() - t0

    # sanity checks
    mp.mp.dps = DPS
    # full-precision values straight from the CSV text (not float64 reload)
    with CSV.open(encoding="utf-8") as f:
        next(f)
        gammas = [mp.mpf(line.split(",", 1)[1]) for line in f]
    mono = all(gammas[i] < gammas[i + 1] for i in range(len(gammas) - 1))
    g1_known = mp.mpf("14.134725141734693790457251983562470270784257115699")
    g1_ok = abs(gammas[0] - g1_known) < mp.mpf("1e-20")
    T = gammas[-1]
    rvm = (T / (2 * mp.pi)) * (mp.log(T / (2 * mp.pi)) - 1) + mp.mpf("0.875")
    rvm_err = abs(N_ZEROS - rvm)
    gaps = [gammas[i + 1] - gammas[i] for i in range(len(gammas) - 1)]
    stats = {
        "min_gap": mp.nstr(min(gaps), 10),
        "max_gap": mp.nstr(max(gaps), 10),
        "mean_gap": mp.nstr(sum(gaps) / len(gaps), 10),
        "local_mean_spacing_at_end": mp.nstr(2 * mp.pi / mp.log(T / (2 * mp.pi)), 10),
    }
    print(f"monotone: {mono} | g1 ok: {g1_ok} | RvM err: "
          f"{mp.nstr(rvm_err, 5)} (should be << log T = "
          f"{mp.nstr(mp.log(T), 3)})")
    print("gap stats:", stats)

    meta = {
        "experiment": "E-002",
        "task": "0.6a",
        "description": f"First {N_ZEROS} nontrivial zero ordinates via "
                       "mpmath.zetazero (multiprocess)",
        "script": "research/numerics/scripts/E-002-first-zeros.py",
        "parameters": {"n_zeros": N_ZEROS, "dps": DPS,
                       "workers": N_WORKERS},
        "checks": {
            "strictly_monotone": bool(mono),
            "gamma_1_matches_known": bool(g1_ok),
            "riemann_von_mangoldt_abs_error": mp.nstr(rvm_err, 10),
        },
        "gap_statistics": stats,
        "elapsed_seconds": round(elapsed, 1),
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
        "row_count": N_ZEROS,
    }
    JSON.write_text(json.dumps(meta, indent=2), encoding="utf-8")
    ok = mono and g1_ok and rvm_err < 2 * mp.log(T)
    print(f"wrote {CSV.name}, {JSON.name} in {elapsed:.0f}s — "
          f"{'ALL CHECKS PASS' if ok else 'CHECK FAILURE'}")
    return 0 if ok else 1


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