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 19 of 20 · 500/page · 10000 rows next →
# ngamma_n
9002 9001 9020.072493601838575758405
9003 9002 9020.646017117477096532789
9004 9003 9021.257036937257558505447
9005 9004 9022.745934352785915562315
9006 9005 9022.965488033276409706417
9007 9006 9023.565193774028462051337
9008 9007 9024.667245992580830719306
9009 9008 9025.628559533685171675823
9010 9009 9026.521713970003297238938
9011 9010 9027.231504803192407649109
9012 9011 9028.106836457523852178722
9013 9012 9028.98708138613527250391
9014 9013 9030.147631956572567710079
9015 9014 9031.032976776785352688922
9016 9015 9032.149738849134087076319
9017 9016 9032.444258621347989519058
9018 9017 9033.51572083041276041744
9019 9018 9033.85403484600264696564
9020 9019 9035.168949367586719133924
9021 9020 9035.749059047583184049494
9022 9021 9036.429306613503791499716
9023 9022 9038.302210472737052239112
9024 9023 9038.744798376163651174752
9025 9024 9039.773178757522531091046
9026 9025 9040.140208823973793232767
9027 9026 9040.975491231656144845239
9028 9027 9042.313865996179527356209
9029 9028 9043.019421319069335639359
9030 9029 9043.610772971061032276733
9031 9030 9044.61807114780585556167
9032 9031 9045.108590882362930676854
9033 9032 9046.315029701648115887675
9034 9033 9047.17889892122259644746
9035 9034 9048.588554505273906793436
9036 9035 9049.087937802135787404106
9037 9036 9049.992714867448061122306
9038 9037 9050.882205632555333098943
9039 9038 9051.428509000665653540604
9040 9039 9052.224339386075951631758
9041 9040 9052.75541723130543717915
9042 9041 9054.400106782061648406852
9043 9042 9054.931264072116587121367
9044 9043 9055.905240586100744304815
9045 9044 9056.78535195646799104581
9046 9045 9057.930288444321429894537
9047 9046 9058.352731342005848578539
9048 9047 9059.695201794214110930624
9049 9048 9059.901550740716447520619
9050 9049 9061.261010259074407955907
9051 9050 9062.010375428285563729545
9052 9051 9062.556640822880960135559
9053 9052 9063.065987666102097139575
9054 9053 9064.398647013108501442396
9055 9054 9065.676445011300738209979
9056 9055 9066.715937218861179730679
9057 9056 9067.344319123517807521527
9058 9057 9067.890693026052517601953
9059 9058 9068.707565890811084667382
9060 9059 9069.651864013749802429799
9061 9060 9070.419820652425508279787
9062 9061 9071.485275093295035216059
9063 9062 9072.068890118189823935368
9064 9063 9072.950481989126084429457
9065 9064 9074.38155178092295314955
9066 9065 9074.869755813135035742481
9067 9066 9075.539800390943315353335
9068 9067 9076.905342562263936786251
9069 9068 9077.94119316316404523606
9070 9069 9078.388813148848819226475
9071 9070 9078.885068809988736197492
9072 9071 9079.958594688502342458165
9073 9072 9080.600278836755733991293
9074 9073 9081.525029640737249606514
9075 9074 9082.687459166014285201784
9076 9075 9083.817684467939999751597
9077 9076 9084.719189339048503318443
9078 9077 9085.26199100619770288882
9079 9078 9086.216791442005527770793
9080 9079 9086.854064628998393316827
9081 9080 9087.619989058993730450906
9082 9081 9088.908988499887102058083
9083 9082 9089.425998602172679852097
9084 9083 9090.498988662223028308116
9085 9084 9090.953967030521159655553
9086 9085 9091.778385807689636113337
9087 9086 9093.554540592722420736069
9088 9087 9094.080653738819805630254
9089 9088 9094.817936161848797791499
9090 9089 9095.707283364857816795629
9091 9090 9096.611589238439235522623
9092 9091 9097.164150723324325418293
9093 9092 9098.092115417231834214956
9094 9093 9098.532042167058215653025
9095 9094 9099.836635635669620672396
9096 9095 9101.042374240885053638565
9097 9096 9101.885250829854734838067
9098 9097 9102.497480971078424010369
9099 9098 9103.493787094456411203314
9100 9099 9104.193256141506020814854
9101 9100 9105.074920829635860342209
9102 9101 9106.474161546830251547581
9103 9102 9106.705267547545049822304
9104 9103 9107.191202663575999781027
9105 9104 9108.613643184054090303156
9106 9105 9109.023970775506766177203
9107 9106 9110.230386514661648158456
9108 9107 9111.375084878634739880324
9109 9108 9112.381582610446174564091
9110 9109 9113.302297846671952023956
9111 9110 9113.658797282170079693483
9112 9111 9114.444853438540077803662
9113 9112 9115.042930636192228524639
9114 9113 9116.424405314449153115942
9115 9114 9117.13705832991963680205
9116 9115 9117.860968025157797237186
9117 9116 9118.810944247423953581334
9118 9117 9120.116281592967774568211
9119 9118 9120.569264316977313405339
9120 9119 9121.584902244997711430826
9121 9120 9122.504965210955797744932
9122 9121 9123.393854938901361287383
9123 9122 9124.084874392271585682389
9124 9123 9125.059677152573160300782
9125 9124 9125.604247738102042087207
9126 9125 9126.23547279669432712608
9127 9126 9127.121392691025071537016
9128 9127 9128.945962237436144052578
9129 9128 9129.473000953557152644688
9130 9129 9130.446701653567163583633
9131 9130 9130.768159170791863376585
9132 9131 9131.957373712514205451875
9133 9132 9132.877022276269896957711
9134 9133 9133.253132722165483241781
9135 9134 9134.299136950122365014504
9136 9135 9135.427457334468259659006
9137 9136 9136.139601993791705814993
9138 9137 9136.679196436497613879425
9139 9138 9138.105910779159086386851
9140 9139 9138.600382789620115135328
9141 9140 9140.231969818213880773735
9142 9141 9140.578259697125152479954
9143 9142 9141.357179362333558106508
9144 9143 9142.266523219928903238653
9145 9144 9142.836907708715460769025
9146 9145 9143.596977939633339639164
9147 9146 9144.619980820222348176703
9148 9147 9145.638522322160175596636
9149 9148 9146.526358405505760183183
9150 9149 9147.808894963089122963149
9151 9150 9148.555047141636330662955
9152 9151 9149.117996849556783329034
9153 9152 9149.558123853039056547726
9154 9153 9151.026455173489762682099
9155 9154 9151.817672100358132652078
9156 9155 9152.649018566887068339121
9157 9156 9153.267808749673368617435
9158 9157 9153.740200095622725885023
9159 9158 9155.111134265144337282725
9160 9159 9156.08802623241254290512
9161 9160 9157.200853860186370454449
9162 9161 9157.957603481644180873456
9163 9162 9158.830116897250462558732
9164 9163 9159.438824974985019793103
9165 9164 9160.353847711055930574152
9166 9165 9160.796139418419327529063
9167 9166 9161.926432339943943149399
9168 9167 9162.627075284894058045892
9169 9168 9164.011258568751140127906
9170 9169 9164.76502148888263268261
9171 9170 9165.44866341438627630802
9172 9171 9166.381734370744383933335
9173 9172 9167.382447422910064805623
9174 9173 9168.30492587811359957242
9175 9174 9169.005615313923935397544
9176 9175 9169.689672310457632169419
9177 9176 9170.658946113624193202636
9178 9177 9171.402013820587587476042
9179 9178 9172.213321782218370983988
9180 9179 9172.683910450422760442375
9181 9180 9174.799448248375431122673
9182 9181 9175.208835881228948165973
9183 9182 9175.927458354540129043849
9184 9183 9176.891017123539633694878
9185 9184 9177.479208892978149948443
9186 9185 9178.130377598333379830455
9187 9186 9179.285979755703922023664
9188 9187 9180.321113395797190985782
9189 9188 9180.739286973818309331477
9190 9189 9181.702974296286815894494
9191 9190 9182.8111739847728278983
9192 9191 9183.699837538327358407252
9193 9192 9184.767194414182960979656
9194 9193 9185.136000609179851710547
9195 9194 9186.578146636390093511662
9196 9195 9187.34508688956870717269
9197 9196 9187.811497032358065324796
9198 9197 9188.464829562724621473746
9199 9198 9189.187313215268485672072
9200 9199 9190.366779364116216803853
9201 9200 9191.463118656115984521105
9202 9201 9192.438691653934329890312
9203 9202 9193.368911875733562391204
9204 9203 9194.036497583255902429372
9205 9204 9194.998618070027495620553
9206 9205 9195.415993341559806407681
9207 9206 9196.54137682249813304733
9208 9207 9197.375793024768991894048
9209 9208 9198.428751554567494776923
9210 9209 9198.789347491289968059977
9211 9210 9200.006746344035404061652
9212 9211 9200.451077571462464063852
9213 9212 9201.837434832796719406558
9214 9213 9203.050941490621674275235
9215 9214 9203.761790100944719570809
9216 9215 9204.449930354577280551303
9217 9216 9204.760708258413019664245
9218 9217 9206.165350791597540071791
9219 9218 9206.847375416245798997561
9220 9219 9207.189750328559595887456
9221 9220 9208.520414152957838156004
9222 9221 9209.480933056157617442236
9223 9222 9210.873978974290070269789
9224 9223 9211.220220622675306587906
9225 9224 9211.878326613838930929908
9226 9225 9212.94254301803651810594
9227 9226 9213.953457242496974305722
9228 9227 9214.809815382855988349123
9229 9228 9215.383063606700506919289
9230 9229 9216.396499883133370407451
9231 9230 9216.889162998637362026118
9232 9231 9217.632413626711047961983
9233 9232 9219.125065265663850009482
9234 9233 9220.020083391239243435219
9235 9234 9220.852137981711882252269
9236 9235 9222.000798287770785588405
9237 9236 9222.354047560482169738129
9238 9237 9223.237859070793082618066
9239 9238 9223.870046096292178963619
9240 9239 9224.578163424445138231124
9241 9240 9226.173215900609813248291
9242 9241 9226.625762799938568981203
9243 9242 9227.262194971400653488108
9244 9243 9228.502157991702189555333
9245 9244 9229.558364129360530774599
9246 9245 9230.160704778990867326814
9247 9246 9231.116341546648182849584
9248 9247 9232.082594097691039137171
9249 9248 9232.764557616516855908792
9250 9249 9233.690366508898998280097
9251 9250 9234.086401679774349503339
9252 9251 9235.309074305779583339112
9253 9252 9235.520669016888034237282
9254 9253 9237.255825767933319287002
9255 9254 9238.525524178481370339006
9256 9255 9238.873162118126865549027
9257 9256 9239.599760445383166272905
9258 9257 9240.463318406555152061654
9259 9258 9241.168927233486630351604
9260 9259 9242.438747055546034551295
9261 9260 9243.002727144772764876577
9262 9261 9243.629625414073151065995
9263 9262 9244.722256154660442093106
9264 9263 9245.730317259871709781852
9265 9264 9246.372479217969965549581
9266 9265 9247.323682008930626018211
9267 9266 9248.859664427932921311018
9268 9267 9249.09713424481351853468
9269 9268 9250.217232551686260669017
9270 9269 9250.850268731169024825726
9271 9270 9251.325332009919586242468
9272 9271 9252.301982660402893319914
9273 9272 9253.266895877883353907828
9274 9273 9254.039963750217445707936
9275 9274 9255.629242734973237231944
9276 9275 9255.870307159365825473726
9277 9276 9257.090976369528458446198
9278 9277 9257.922851052207241564461
9279 9278 9258.513197988889457985298
9280 9279 9259.199490496887887396351
9281 9280 9260.462686089541835084493
9282 9281 9261.410917752196230514273
9283 9282 9261.832615530932199278616
9284 9283 9262.571905341420028068174
9285 9284 9263.278863899333928994523
9286 9285 9264.808555510763516010647
9287 9286 9265.914999339088186576966
9288 9287 9266.523355586281571062155
9289 9288 9267.157637377176634857953
9290 9289 9268.359885083665913555136
9291 9290 9268.846663836467749722386
9292 9291 9269.385312604052875612511
9293 9292 9270.504925928490987448591
9294 9293 9271.30102811858505523811
9295 9294 9272.394102687191569322129
9296 9295 9273.266843198505898337658
9297 9296 9274.338133839818122077946
9298 9297 9274.986375913177340146332
9299 9298 9275.55551246176609103456
9300 9299 9277.16051444452308812106
9301 9300 9277.608768374496912795784
9302 9301 9278.356214546118824287742
9303 9302 9279.04093307773736993068
9304 9303 9279.938256160905028286408
9305 9304 9280.769267593453814174345
9306 9305 9281.537438793174093437284
9307 9306 9282.734288937201592395939
9308 9307 9284.093681675076198503034
9309 9308 9284.762478436967502647888
9310 9309 9285.344159689401638077407
9311 9310 9285.849431118951149054466
9312 9311 9286.901569164031728274553
9313 9312 9287.799427530865250211939
9314 9313 9288.657678861049796134191
9315 9314 9289.63471649279187492731
9316 9315 9290.238472558106379158194
9317 9316 9291.07114994904790790618
9318 9317 9292.450151019330913264353
9319 9318 9293.02037157275915464214
9320 9319 9294.077099796136484479375
9321 9320 9294.994414285980722008409
9322 9321 9295.564223471825888879397
9323 9322 9296.607047273230002758705
9324 9323 9297.328597821578793165027
9325 9324 9297.79141709467414368699
9326 9325 9298.415822954258984334745
9327 9326 9300.174304705344880843891
9328 9327 9301.095504972085600416335
9329 9328 9301.630677861677633332355
9330 9329 9302.761169162320387533981
9331 9330 9303.238852584414123739279
9332 9331 9304.478169097739903613446
9333 9332 9304.747219152917227674576
9334 9333 9306.002925382834574161141
9335 9334 9306.808098667526065304211
9336 9335 9307.501144154387528384308
9337 9336 9308.397687577841742710468
9338 9337 9309.059307208767938778959
9339 9338 9310.294182822782933022478
9340 9339 9311.394263390712143112534
9341 9340 9312.287090010511860244143
9342 9341 9313.137110976717086755729
9343 9342 9313.642041786628516474456
9344 9343 9314.191767555917045962913
9345 9344 9315.25777709271446035136
9346 9345 9316.091993796680311267961
9347 9346 9317.221478360378137218423
9348 9347 9317.520864381380218820289
9349 9348 9319.33790016397062020912
9350 9349 9319.827795194359268678985
9351 9350 9320.592913364353857784795
9352 9351 9321.355037464780016245889
9353 9352 9322.199858975795772712359
9354 9353 9323.579903835333207239214
9355 9354 9324.038642999946304895007
9356 9355 9324.662478030882907672253
9357 9356 9325.359891018410006220914
9358 9357 9326.496593790360668218335
9359 9358 9327.029340176412155293026
9360 9359 9328.937276210058941827841
9361 9360 9329.235940410045742765846
9362 9361 9330.230659582979220887574
9363 9362 9330.921834157540974785125
9364 9363 9331.875838210982250583957
9365 9364 9332.545535709051262751945
9366 9365 9332.990177777222113313475
9367 9366 9334.305898779170962609085
9368 9367 9335.206489196422450955305
9369 9368 9336.031511109678674984305
9370 9369 9336.966415719895269407776
9371 9370 9337.535506027181276436455
9372 9371 9338.970532754690260109967
9373 9372 9339.73420671210196804692
9374 9373 9340.336005010404067877322
9375 9374 9341.34082219610239252085
9376 9375 9341.999574596002114551354
9377 9376 9342.923902156085032189301
9378 9377 9343.478761544974652274806
9379 9378 9344.189903972416580980974
9380 9379 9345.47393498995554831282
9381 9380 9346.909626243472694437959
9382 9381 9347.350886762278380690436
9383 9382 9348.412153406305665104316
9384 9383 9348.847438791957442568854
9385 9384 9349.53417482550172974887
9386 9385 9350.701823059300462514708
9387 9386 9351.640126343543127096278
9388 9387 9352.399663267564617015117
9389 9388 9353.014453103446544788971
9390 9389 9353.743506760977681139846
9391 9390 9355.235106157849490805284
9392 9391 9355.82017598183188495997
9393 9392 9356.67303379741794582026
9394 9393 9357.970513889610195915291
9395 9394 9358.838675557577985934947
9396 9395 9359.076903405517233810369
9397 9396 9360.025057415079117489473
9398 9397 9360.682314260677385289568
9399 9398 9361.527052532509376792477
9400 9399 9362.648214727740521284618
9401 9400 9363.690016544967583988217
9402 9401 9364.532422656035601899697
9403 9402 9365.565561378696494097568
9404 9403 9366.263485245108016064572
9405 9404 9366.856452107048197555156
9406 9405 9367.994621558229811589287
9407 9406 9368.900918158318199187906
9408 9407 9369.264875034456209409739
9409 9408 9370.763366235001733434785
9410 9409 9371.178734814527669614165
9411 9410 9371.587599990185917708793
9412 9411 9372.784751974935716657046
9413 9412 9374.379510450159848824208
9414 9413 9375.17079500110487739143
9415 9414 9375.736537521141903344557
9416 9415 9376.328130229520651985517
9417 9416 9377.450651133645411755492
9418 9417 9377.983702594425185357087
9419 9418 9379.018437925036132763658
9420 9419 9379.494344123485506748181
9421 9420 9380.793873689144087917807
9422 9421 9381.6758404851153048162
9423 9422 9382.5604408045469132071
9424 9423 9383.568374417504541743369
9425 9424 9384.090451459150158822663
9426 9425 9385.110359164360184352472
9427 9426 9386.234914019048871262665
9428 9427 9386.88861220783399079473
9429 9428 9387.733832772215442449848
9430 9429 9388.121802783692301718111
9431 9430 9388.979169604210411227865
9432 9431 9390.090466518718986655611
9433 9432 9391.049764368448133799514
9434 9433 9392.30585252850796482867
9435 9434 9392.964477181185068936416
9436 9435 9393.984756238854572895617
9437 9436 9394.689784015236203634634
9438 9437 9395.103416035848220287944
9439 9438 9395.826310147317038314071
9440 9439 9397.472564246870672645619
9441 9440 9397.818267625128004049989
9442 9441 9398.618868891882872587756
9443 9442 9399.494206831580636359131
9444 9443 9400.580871303545846004567
9445 9444 9401.42751666565844359547
9446 9445 9402.552909281863753700865
9447 9446 9403.382930753850642090032
9448 9447 9403.920835263551876214149
9449 9448 9405.062878277394841531243
9450 9449 9405.517985108348362313793
9451 9450 9406.317820404488019024072
9452 9451 9407.247627536476621492869
9453 9452 9407.745436535876152251608
9454 9453 9409.471336663333465988139
9455 9454 9410.603937082796806837694
9456 9455 9410.808666731094111563731
9457 9456 9411.457048111919409046177
9458 9457 9412.787360568496084647158
9459 9458 9413.355204753259020668864
9460 9459 9414.366649962946970583144
9461 9460 9415.106792479155774433527
9462 9461 9415.823151301210091513994
9463 9462 9416.804191133095786693557
9464 9463 9417.532924976708178952636
9465 9464 9418.349184602919706224933
9466 9465 9419.744269401405676970145
9467 9466 9420.58258361691233488155
9468 9467 9421.526892048423285398502
9469 9468 9422.040011768900739018568
9470 9469 9422.810743700448735747637
9471 9470 9423.59100866304396623816
9472 9471 9424.17456178801932006866
9473 9472 9425.411963546654093056694
9474 9473 9426.506903687983402776132
9475 9474 9426.874533970336455350358
9476 9475 9428.235207719002173126958
9477 9476 9429.379144119795303742034
9478 9477 9429.574025269554187470753
9479 9478 9430.535514117107588648668
9480 9479 9431.485551950740021279069
9481 9480 9432.713826104668961898524
9482 9481 9433.12501823132822368966
9483 9482 9433.826715940170206520548
9484 9483 9434.666665734315396471835
9485 9484 9435.196314279323865273168
9486 9485 9437.178849319269895382962
9487 9486 9437.419496808174807074087
9488 9487 9438.835191547619954075116
9489 9488 9439.288351898247574522594
9490 9489 9439.97862884972830380005
9491 9490 9440.804069911680055122342
9492 9491 9441.857096238964501731198
9493 9492 9442.274634497079088584847
9494 9493 9443.449249712149727168814
9495 9494 9444.311353870485109064923
9496 9495 9445.247610816520235113866
9497 9496 9446.162804214650319483836
9498 9497 9446.796122036819206297242
9499 9498 9447.907524955041770173074
9500 9499 9449.201580600951874569289
9501 9500 9449.609725389102597416137

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