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 4 of 20 · 500/page · 10000 rows next →
# ngamma_n
1502 1501 1981.74876889726348374032
1503 1502 1982.663279195276514024134
1504 1503 1983.923804622260659671098
1505 1504 1985.416540174526740221856
1506 1505 1986.757107716415197970684
1507 1506 1987.87347336072431737889
1508 1507 1988.251876807355766020765
1509 1508 1989.702002708021618926463
1510 1509 1990.478352526426991646736
1511 1510 1992.001706393527902715477
1512 1511 1992.784987875157572781737
1513 1512 1993.577493138259984639429
1514 1513 1995.168739611888537748107
1515 1514 1996.796176966188206905323
1516 1515 1997.390914059611449311915
1517 1516 1998.279006925984822422162
1518 1517 1999.545764176267588903843
1519 1518 2000.434515302432246776894
1520 1519 2000.929620689184555144098
1521 1520 2002.896408374361740688188
1522 1521 2004.139669233270134958656
1523 1522 2005.077848124098759130623
1524 1523 2005.900934885785710899243
1525 1524 2007.125180170301125895341
1526 1525 2008.418240330262271679374
1527 1526 2009.176634122949589834429
1528 1527 2010.153324767559326408443
1529 1528 2011.020705073650057571084
1530 1529 2012.538935477421745332358
1531 1530 2013.872097713990826264799
1532 1531 2015.186728608706282909592
1533 1532 2016.029638032375393523384
1534 1533 2016.800075655845732537993
1535 1534 2017.386767251961558011385
1536 1535 2019.264600216064099761394
1537 1536 2019.884367139755293053502
1538 1537 2021.19604276889278802438
1539 1538 2022.54561768468826602997
1540 1539 2023.572911777100747848272
1541 1540 2024.488262157951250297379
1542 1541 2025.878906202481560989772
1543 1542 2026.738258912152097653909
1544 1543 2027.573317055997542412337
1545 1544 2028.58245935403995163189
1546 1545 2029.385479550966647379168
1547 1546 2031.750550690618736964454
1548 1547 2032.420780856286430224699
1549 1548 2033.01789274566981581017
1550 1549 2034.554828788956165086574
1551 1550 2035.077440096304077976094
1552 1551 2036.527526483370326716541
1553 1552 2037.217111094340891563125
1554 1553 2038.841738250867750155857
1555 1554 2039.44321874010445184952
1556 1555 2040.839119673138223887825
1557 1556 2042.344586250604208897862
1558 1557 2043.217116563323964478921
1559 1558 2044.121593291667495425139
1560 1559 2045.037320859814820925431
1561 1560 2045.802760431561935428445
1562 1561 2047.098336345607132274609
1563 1562 2048.454094066161112393306
1564 1563 2049.847525605716069264195
1565 1564 2050.906055384684548381377
1566 1565 2051.71838819625631916192
1567 1566 2052.407790192401017867405
1568 1567 2054.059916898485734258428
1569 1568 2055.180267326166661282723
1570 1569 2055.57260289904887217876
1571 1570 2056.620866689893779289875
1572 1571 2058.450651118906136128174
1573 1572 2059.448021743771458966604
1574 1573 2060.868247208107968375763
1575 1574 2061.367059202031889720619
1576 1575 2062.572650919978394091832
1577 1576 2063.283559498380763148584
1578 1577 2064.304867699634148083155
1579 1578 2065.832672281911464707683
1580 1579 2066.985229377985287351232
1581 1580 2068.345638527370094715794
1582 1581 2068.669941082812694161776
1583 1582 2070.504717593445975155111
1584 1583 2071.377083169758596449909
1585 1584 2071.990454814760787099573
1586 1585 2073.397603715768406627216
1587 1586 2074.171064902152487264222
1588 1587 2075.028065544832156633203
1589 1588 2077.117570136877207022002
1590 1589 2078.155484639214284075548
1591 1590 2078.939288114876902368812
1592 1591 2079.567628461893227357227
1593 1592 2080.910343457561287922134
1594 1593 2081.799686563577146136113
1595 1594 2083.300276858827975710838
1596 1595 2083.779992550167397584365
1597 1596 2085.389813692285986675591
1598 1597 2086.580318534381421521998
1599 1598 2087.47334098785801634805
1600 1599 2088.712281198732581189418
1601 1600 2090.036206757016941573504
1602 1601 2090.447550027415866938227
1603 1602 2091.221580661131263636869
1604 1603 2092.473218110071891742318
1605 1604 2094.335917468631955154829
1606 1605 2095.138256660294823669283
1607 1606 2096.346529979252588528503
1608 1607 2097.371606357192894539271
1609 1608 2097.951922199887039635415
1610 1609 2099.31165126506134746351
1611 1610 2100.593745236861240663834
1612 1611 2101.135489459108414918273
1613 1612 2102.535100215297700958109
1614 1613 2103.390454808714039348515
1615 1614 2105.372206591799897773389
1616 1615 2105.994704339286241676884
1617 1616 2107.172362432443341469705
1618 1617 2107.617911407514327794276
1619 1618 2108.938384889015335597988
1620 1619 2109.963143181267582022438
1621 1620 2110.822371848131822017466
1622 1621 2112.907087523190777713859
1623 1622 2113.483966448430801284968
1624 1623 2114.396137325889992385978
1625 1624 2115.50660279468411445352
1626 1625 2116.900056068394727573854
1627 1626 2117.722399441362978078898
1628 1627 2118.618646217029262713152
1629 1628 2119.456428468939276684168
1630 1629 2120.691562591843950542792
1631 1630 2122.465151174928362415617
1632 1631 2123.344042303462499324835
1633 1632 2124.370368737568878200366
1634 1633 2125.512400029151939221741
1635 1634 2125.958784840373305395254
1636 1635 2126.97571119255798896268
1637 1636 2128.752290554262836645245
1638 1637 2129.406080228328442997539
1639 1638 2130.555102283235916685015
1640 1639 2132.080620992942643171181
1641 1640 2132.798516467884154644985
1642 1641 2134.154933985037924172455
1643 1642 2134.95077250431567212892
1644 1643 2136.086897524703213711697
1645 1644 2136.967470548471870359073
1646 1645 2137.509940525910913575813
1647 1646 2139.38075998520110757749
1648 1647 2140.949362639097040588205
1649 1648 2141.710035960389950354975
1650 1649 2142.355043196035385267587
1651 1650 2143.374444180537885595292
1652 1651 2144.895337431360428693315
1653 1652 2145.505753734180824039627
1654 1653 2146.625894475511517827017
1655 1654 2147.78536734563083385522
1656 1655 2149.151849382889221886289
1657 1656 2149.910639858102119005478
1658 1657 2151.776885116465025947986
1659 1658 2152.390226596919655112433
1660 1659 2153.011964165386528639099
1661 1660 2154.263623952320336028675
1662 1661 2154.935345848225473123273
1663 1662 2156.394727255681689229443
1664 1663 2157.856489565353127032111
1665 1664 2158.878072291083204488174
1666 1665 2159.902286017170492481155
1667 1666 2160.853062328184191260622
1668 1667 2161.692172189209531650796
1669 1668 2163.107122285732380342668
1670 1669 2164.049720356357350273506
1671 1670 2165.011437174314295775248
1672 1671 2165.503949023375744210702
1673 1672 2167.693444254746848034186
1674 1673 2168.890615851853982383041
1675 1674 2169.263829283364955071557
1676 1675 2170.787074973015736611503
1677 1676 2171.396361926494691625653
1678 1677 2172.250962827516326407029
1679 1678 2173.528296969316612154217
1680 1679 2174.745020803476645526705
1681 1680 2176.204119466215638373483
1682 1681 2176.939451698977405984225
1683 1682 2178.004209154761124386594
1684 1683 2179.232185029747187483631
1685 1684 2180.49531825927878074434
1686 1685 2181.252367010681768361235
1687 1686 2181.725783029819561812588
1688 1687 2183.33058401727993762707
1689 1688 2184.103190760680534924829
1690 1689 2185.965528320683109004493
1691 1690 2187.085690959372521088575
1692 1691 2187.798455877827899041431
1693 1692 2188.55876320308854323226
1694 1693 2189.497072902605391629207
1695 1694 2191.093363045749275649661
1696 1695 2191.778017400507988688863
1697 1696 2192.826770539861208746918
1698 1697 2194.231530050449700562118
1699 1698 2195.23168768125578497387
1700 1699 2196.715977666758543540945
1701 1700 2197.258747040205904491146
1702 1701 2198.687512684367522333657
1703 1702 2199.302965320969583610067
1704 1703 2200.351020913263048427462
1705 1704 2200.915953025551824504694
1706 1705 2203.277453730646011342181
1707 1706 2203.906364583773548146897
1708 1707 2204.997801754830107949105
1709 1708 2205.855761245543920529449
1710 1709 2207.172161914952220288888
1711 1710 2207.802741336736954730746
1712 1711 2209.153744400263258074146
1713 1712 2210.20801498925036444937
1714 1713 2210.850941099296166739204
1715 1714 2212.34356840003640434987
1716 1715 2213.700256248436090459335
1717 1716 2214.949925632092495772633
1718 1717 2215.82056569064555503271
1719 1718 2216.296375887645193428667
1720 1719 2217.469375116225193432526
1721 1720 2218.521006913395296268517
1722 1721 2219.79981569836106178955
1723 1722 2220.852158848914182607607
1724 1723 2222.636604588097467856896
1725 1724 2223.055057918810407973036
1726 1725 2223.777772507214529978821
1727 1726 2225.56464511716942600523
1728 1727 2226.332734405575587132705
1729 1728 2227.246229376595376532187
1730 1729 2227.970573882256309379833
1731 1730 2229.127958910123303939273
1732 1731 2230.898690856217248629392
1733 1732 2231.977154074073314006074
1734 1733 2232.924853868966181778427
1735 1734 2233.720222250312906190767
1736 1735 2234.8149345313269000143
1737 1736 2235.546662135600063188543
1738 1737 2236.773643845099835781107
1739 1738 2238.154799519297615396553
1740 1739 2239.16774396023665946447
1741 1740 2240.021209470471096399311
1742 1741 2241.536186523766402052073
1743 1742 2242.621180159379481080589
1744 1743 2243.373668418961998535764
1745 1744 2244.370701700430338609059
1746 1745 2245.565286531271342234985
1747 1746 2246.0165581782856269681
1748 1747 2247.364431251229392022479
1749 1748 2249.550198573537092658359
1750 1749 2249.770766552723961276493
1751 1750 2251.046641941553166316284
1752 1751 2251.84531833869339935792
1753 1752 2252.678432673838856581411
1754 1753 2254.562246994389553108462
1755 1754 2254.759079001303995297453
1756 1755 2255.824565571536941238408
1757 1756 2257.346384683132800660565
1758 1757 2258.501847291145838169489
1759 1758 2259.517842057384273982981
1760 1759 2260.890259416800265121191
1761 1760 2261.660064449481099011224
1762 1761 2262.674430648209799538702
1763 1762 2262.878305381161112230151
1764 1763 2264.676399705770246638194
1765 1764 2265.768446115469447788883
1766 1765 2267.384501067544035832234
1767 1766 2267.879175337166069873946
1768 1767 2269.226998261609550659237
1769 1768 2269.919103216838346848388
1770 1769 2271.326282468066381371306
1771 1770 2272.049015701237658460441
1772 1771 2273.347534053164474274792
1773 1772 2273.956289145943056055512
1774 1773 2275.068664775971333509603
1775 1774 2277.079317756623523062808
1776 1775 2278.012628393305380980864
1777 1776 2278.52594215578419174696
1778 1777 2279.507305841119493754732
1779 1778 2280.870719852586209260019
1780 1779 2281.356483614546293589525
1781 1780 2282.690375137647892348962
1782 1781 2284.056011459351377862036
1783 1782 2285.222242364866503875297
1784 1783 2286.149814140564054168646
1785 1784 2287.04615867101060416601
1786 1785 2288.578849445764626369874
1787 1786 2289.33628471013415010662
1788 1787 2290.241458210855731249567
1789 1788 2291.097663612112011932513
1790 1789 2291.928901252490557180192
1791 1790 2293.896145106086756681451
1792 1791 2294.687918411714311439957
1793 1792 2296.115091188330346115295
1794 1793 2296.998522472515126633932
1795 1794 2297.372647579809593948834
1796 1795 2298.612363365660205666885
1797 1796 2299.961577620089686754623
1798 1797 2301.234125798830902957743
1799 1798 2301.454840351728464478866
1800 1799 2303.29548198257322304467
1801 1800 2304.305138670374533597113
1802 1801 2305.508356788681968574967
1803 1802 2306.517733070003535106322
1804 1803 2307.355553370478083133853
1805 1804 2308.210284634764679012545
1806 1805 2309.370358239529117023469
1807 1806 2309.931122384183622924545
1808 1807 2312.047996449610743573026
1809 1808 2313.190914170747899328309
1810 1809 2313.689359967223960407923
1811 1810 2314.621182113594161877086
1812 1811 2316.049454719988829155005
1813 1812 2316.962494504840772512444
1814 1813 2317.851531864277040303424
1815 1814 2318.826035336430148359696
1816 1815 2320.088523204027257645797
1817 1816 2320.94953162865960516512
1818 1817 2322.812632606693334256532
1819 1818 2323.534274240766059714838
1820 1819 2324.512455232258388954562
1821 1820 2325.557096491765453917642
1822 1821 2325.903015927513107748496
1823 1822 2327.376855819699561060512
1824 1823 2328.63487510116860926848
1825 1824 2329.70572340644955569078
1826 1825 2331.013110289572893027477
1827 1826 2331.942707806402767833812
1828 1827 2332.987765432775017684268
1829 1828 2333.720863373782282747764
1830 1829 2335.531712574450956361889
1831 1830 2335.867153805649781363538
1832 1831 2336.621036786238721339516
1833 1832 2337.761730158820696863196
1834 1833 2339.615683895982620196782
1835 1834 2340.826726706644481424807
1836 1835 2341.324596186215486662045
1837 1836 2342.654041658469263808784
1838 1837 2343.259158955008860152899
1839 1838 2344.311216236151757824706
1840 1839 2345.570483634473816645834
1841 1840 2346.464119529787811114179
1842 1841 2347.934254641723674406079
1843 1842 2348.843423633455680124828
1844 1843 2349.730054257837876706144
1845 1844 2351.455046927851231854949
1846 1845 2352.195701502536464589525
1847 1846 2352.750870075454590985103
1848 1847 2353.91213585235305929797
1849 1848 2354.951081235008184082218
1850 1849 2355.810813978290615356117
1851 1850 2357.608315920247485789279
1852 1851 2358.904705198415579000437
1853 1852 2359.434859076439866835133
1854 1853 2360.314285089526338651524
1855 1854 2361.342541641932631563335
1856 1855 2362.718317922921381033338
1857 1856 2363.49561765411863386756
1858 1857 2364.751176089117010111223
1859 1858 2365.191515064131916564579
1860 1859 2367.249219842959468477894
1861 1860 2367.957701823155859105366
1862 1861 2369.220577767399032026332
1863 1862 2370.093390284232169389271
1864 1863 2371.100747929721673489809
1865 1864 2371.938137794610108150871
1866 1865 2372.44034726005584373976
1867 1866 2374.4442307178166502885
1868 1867 2375.543967037372248899774
1869 1868 2376.355463515560189748491
1870 1869 2377.755407914012799016083
1871 1870 2378.212961679662157315899
1872 1871 2379.726502949965822242388
1873 1872 2380.545657218736259306995
1874 1873 2381.500123710437529731055
1875 1874 2382.530830566366402181744
1876 1875 2383.356013915980869470067
1877 1876 2384.96507164118246972621
1878 1877 2386.430937109503890289813
1879 1878 2387.29908412233651475756
1880 1879 2387.813568556078037286798
1881 1880 2388.748207635493176415535
1882 1881 2389.955988113666157004736
1883 1882 2391.260549872403399478922
1884 1883 2391.754982336622772778133
1885 1884 2393.630593291699855331902
1886 1885 2394.48536785604649401565
1887 1886 2395.270169994647092172437
1888 1887 2396.603878762616071581764
1889 1888 2397.791643761773763503076
1890 1889 2398.558311382532671158357
1891 1890 2399.433832905785270121664
1892 1891 2400.152356522131457194887
1893 1892 2401.482998375771780651165
1894 1893 2403.418798445345203891616
1895 1894 2403.975315148967507493641
1896 1895 2404.921593489769997569214
1897 1896 2406.253988718289485260864
1898 1897 2406.732851182109508443646
1899 1898 2407.715910422269907279289
1900 1899 2409.441502352419540345145
1901 1900 2409.88160268287958825386
1902 1901 2411.126193380777421369069
1903 1902 2412.222935837284041670789
1904 1903 2413.976123194983408606475
1905 1904 2414.379879801270495871054
1906 1905 2415.576893465994105812422
1907 1906 2416.534054627703939300373
1908 1907 2417.278087421772193108972
1909 1908 2418.229443267357387460367
1910 1909 2419.507917163071245463497
1911 1910 2421.142943993328178887133
1912 1911 2422.152084925109508781274
1913 1912 2422.996230123486907861289
1914 1913 2423.504146888716139414249
1915 1914 2425.124760212556724475464
1916 1915 2426.193437541668300473568
1917 1916 2426.907064293753645127818
1918 1917 2427.640896948592982256414
1919 1918 2429.185595990256922491338
1920 1919 2430.265812635944403068752
1921 1920 2431.611135096253930383582
1922 1921 2432.727569299254756631148
1923 1922 2433.70589680470380893429
1924 1923 2433.916873237684183015598
1925 1924 2435.348894364694559702091
1926 1925 2436.191600375091036395379
1927 1926 2437.794076107826049841897
1928 1927 2438.671790794044180200536
1929 1928 2439.927127218672276058926
1930 1929 2440.826160290635254748389
1931 1930 2441.929836549998409528467
1932 1931 2443.033560058185132331837
1933 1932 2443.775436396199729327474
1934 1933 2445.154381015220419422029
1935 1934 2445.744952101154900370733
1936 1935 2446.398523306110247605531
1937 1936 2448.98831228603510535508
1938 1937 2449.231032009292533392599
1939 1938 2450.503650580108119102528
1940 1939 2451.181708310084449221349
1941 1940 2452.283365741213890626028
1942 1941 2453.257485812084044867872
1943 1942 2454.300561841789923492673
1944 1943 2455.482288383525923952835
1945 1944 2456.514551841288553330612
1946 1945 2457.907999090218544684006
1947 1946 2458.546799837128013408414
1948 1947 2460.01357946550619149825
1949 1948 2461.202295374506200046268
1950 1949 2461.731628648041392697212
1951 1950 2462.464294913853763629115
1952 1951 2463.569667295016347843545
1953 1952 2464.927816361223408559911
1954 1953 2466.183097013192723406218
1955 1954 2467.64086078377902469819
1956 1955 2468.186816301115243238463
1957 1956 2469.336263892497489229523
1958 1957 2469.781485031524024309086
1959 1958 2471.53929774199671694863
1960 1959 2472.33641758948227106737
1961 1960 2473.107124734645042194834
1962 1961 2474.237849734393679511181
1963 1962 2475.539353861002766769857
1964 1963 2477.021755096104594156578
1965 1964 2478.014854024809405242095
1966 1965 2478.397597583125020440488
1967 1966 2479.977351980870754122427
1968 1967 2480.433606985092072927766
1969 1968 2481.356767280358944597213
1970 1969 2482.68341151871599923226
1971 1970 2484.503238274744643366364
1972 1971 2485.087590537419866510797
1973 1972 2485.785620712392752240643
1974 1973 2487.333836442726022066814
1975 1974 2488.113831754193054379838
1976 1975 2489.261157451637116742966
1977 1976 2490.051090515746789809356
1978 1977 2491.105516421820704818303
1979 1978 2491.907473934292842644924
1980 1979 2493.489295449123217227501
1981 1980 2494.866177828255220973087
1982 1981 2495.846840419501642755475
1983 1982 2496.485336702823268245615
1984 1983 2497.648465246601934549861
1985 1984 2497.969973966752262396796
1986 1985 2499.862042821255065686392
1987 1986 2500.564386412317449341173
1988 1987 2501.57774467243353946447
1989 1988 2503.185227212086801642533
1990 1989 2504.008933658583641175764
1991 1990 2504.772152511212027926352
1992 1991 2506.305351937307695661711
1993 1992 2507.151885647675589172309
1994 1993 2507.871039579743361974712
1995 1994 2508.766046103826622408968
1996 1995 2509.652997441379421693729
1997 1996 2511.660189787186683655476
1998 1997 2512.538220985202544808611
1999 1998 2513.579517021464854594573
2000 1999 2514.259859059773677906645
2001 2000 2515.28648292471288003819

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