/teal-sea
teal-sea / zeta-labstate of record · compiled 02 Nov 2026 · revision b09fa4dd · source

Library · hunts/ff_probe/VERIFICATION.md

VERIFICATION: every exact number by a second implementation, and planted faults

2,661 words · 292 lines · source

Hunt #148. Status: the cross-check run of 2026-10-26 (15 items) reproduced every exact number it recomputes; no row disagrees with the primary run (section 2 lists the rows that record source errata or findings, and the nine probe triples that rest on the shared empty-box argument rather than an independent sum). Files produced on branch hunt/ff-probe, landed on main 2026-10-30 (PR #355). Every count on this page is read from results_second.json (written by crosscheck.py) or measured by test_ffprobe.py, and pinned there. Grades as in MISSION.md.

1. The second implementation

ffprobe_pari.py writes the arithmetic again in PARI/GP, through cypari2, and imports nothing from ffprobe.py: residue symbols by resultant and by Frobenius at each prime factor, Gauss sums by enumeration of the residues, by the Davenport-Hasse closed form and by the prime-power reduction, cyclotomic numbers as polmods modulo polcyclo(N), Patterson's C and rho_0, the probe's weights and its direct sum, the local factor of eq. (local-P) by its definition, and the rival's L-polynomials, whose roots come from PARI's polroots. Python and numpy only add up integer exponent histograms (counts of roots of unity). The conventions are read again from the sources, not from ffprobe.py.

crosscheck.py runs it over the ranges of the primary run. Where the documents quote a value, PARI recomputes the value and the two are compared as exact elements of Q(zeta_N); where they quote a count of checks, PARI recomputes the count on its own. The identities the second implementation uses beyond the definitions (the Chinese remainder theorem for Gauss sums, Davenport-Hasse, the prime-power reduction, Gamma(c) = gamma_3(c) for squarefree c, which it uses at degree 5) are each checked inside PARI against enumeration at smaller degree (item pari_internal, and the Davenport-Hasse and C_p items).

2. What was reproduced

One row per comparison in results_second.json, rendered by render_verification.py (--check fails if this table is stale; test_ffprobe.py runs it). "short" marks a row whose held count is below its checked count, a false flag or a nonzero mismatch count; the prose after the table says, for each, whether it is a documented erratum or a failure.

<!-- results-table: begin (render_verification.py) -->

itemcheckheld / checked
C_pagree720 / 720
C_preduction_eq_enumeration448 / 448
C_routesagree56 / 56
F_routespari_crt_eq_pari_definition30,576 / 30,576
F_routespari_definition_eq_ffprobe_factorization30,576 / 30,576
Kspecs.0.agree120,344 / 120,344
Kspecs.1.agree44,247 / 44,247
davenport_hasseq13_n4.mismatches.2007_own_character0 mismatches
davenport_hasseq13_n4.mismatches.2007_with_2014_character4,394 mismatchesshort
davenport_hasseq13_n4.mismatches.20140 mismatches
davenport_hasseq7_n3.mismatches.2007_own_character0 mismatches
davenport_hasseq7_n3.mismatches.2007_with_2014_character0 mismatches
davenport_hasseq7_n3.mismatches.20140 mismatches
davenport_hasseq7_n6.mismatches.2007_own_character0 mismatches
davenport_hasseq7_n6.mismatches.2007_with_2014_character45,129 mismatchesshort
davenport_hasseq7_n6.mismatches.20140 mismatches
ledgertarget_L.degree_onetrue
pari_internalGamma_eq_gamma3_squarefree2,401 / 2,401
pari_internalstructural_eq_enumeration9,975 / 9,975
phase_identitiesG_refinement_all_pairs.mismatches0 mismatches in 3,249
phase_identitiesGamma_closed_form.mismatches0 mismatches in 400
phase_identitieslambda_alpha_equaltrue
phase_identitiesprime_phases.mismatches0 mismatches in 27
phase_identitiesreciprocity.mismatches0 mismatches in 2,688
phase_identitiessignal.mismatches.G_squarefree0 mismatches
phase_identitiessignal.mismatches.gamma1_gamma20 mismatches
phase_identitiessignal.mismatches.gamma2_cubed0 mismatches
probe0_0_1.equal_to_storedtrue
probe0_0_1.zerotrue
probe0_0_2.equal_to_storedtrue
probe0_0_2.zerotrue
probe0_0_3.equal_to_storedtrue
probe0_0_3.zerotrue
probe0_0_5.equal_to_storedtrue
probe0_0_5.zerotrue
probe0_1_0.frequency_box_emptytrue
probe0_1_0.zerotrue
probe0_1_1.equal_to_storedtrue
probe0_1_1.zerotrue
probe0_1_2.equal_to_storedtrue
probe0_1_2.zerotrue
probe0_2_1.equal_to_storedtrue
probe0_2_1.zerofalse
probe0_2_2.equal_to_storedtrue
probe0_2_2.zerotrue
probe0_3_2.equal_to_storedtrue
probe0_3_2.zerofalse
probe1_0_2.equal_to_storedtrue
probe1_0_2.zerotrue
probe1_0_3.equal_to_storedtrue
probe1_0_3.zerotrue
probe1_0_5.equal_to_storedtrue
probe1_0_5.zerotrue
probe1_1_0.frequency_box_emptytrue
probe1_1_0.zerotrue
probe1_1_2.equal_to_storedtrue
probe1_1_2.zerotrue
probe1_1_3.equal_to_storedtrue
probe1_1_3.zerotrue
probe1_2_1.frequency_box_emptytrue
probe1_2_1.zerotrue
probe1_3_2.equal_to_storedtrue
probe1_3_2.zerofalse
probe2_0_3.equal_to_storedtrue
probe2_0_3.zerotrue
probe2_1_0.frequency_box_emptytrue
probe2_1_0.zerotrue
probe2_2_1.frequency_box_emptytrue
probe2_2_1.zerotrue
probe3_0_5.equal_to_storedtrue
probe3_0_5.zerofalse
probe3_1_0.frequency_box_emptytrue
probe3_1_0.zerotrue
probe3_2_1.frequency_box_emptytrue
probe3_2_1.zerotrue
probe4_0_5.equal_to_storedtrue
probe4_0_5.zerofalse
probe4_1_0.frequency_box_emptytrue
probe4_1_0.zerotrue
probe5_1_0.frequency_box_emptytrue
probe5_1_0.zerotrue
rho0_relationsaffine_invariance.hold144 / 144
rho0_relationsfinite_hecke.hold72 / 72
rho0_relationsfinite_hecke.vanish_at_r_o_P^(n-1)36 / 36
rho0_relationshecke_infinity.corrected.hold60 / 60
rho0_relationshecke_infinity.printed_2007.hold40 / 60short
rho0_relationshecke_infinity.printed_2014.hold20 / 40short
rho0_relationshecke_infinity_both.q7_n3.2007_character.hold30 / 30
rho0_relationshecke_infinity_both.q7_n3.2014_character.hold30 / 30
rho0_relationshecke_infinity_both.q7_n6.2007_character.hold30 / 30
rho0_relationshecke_infinity_both.q7_n6.2014_character.hold30 / 30
rho0_relationsperiodicity.hold24 / 24
rho0_relationspsi_polynomial.vanish_above_R36 / 36
rho0_relationsrho0_agree_q7_n3.agree1,218 / 1,218
rho0_relationsrho0_agree_q7_n6.agree60 / 60
rho0_relationstheta_base.j1.rho0_1_0_is_1true
rho0_relationstheta_base.j1.rho0_1_1_is_q_tautrue
rho0_relationstheta_base.j1.rho0_1_2_is_0true
rho0_relationstheta_base.j2.rho0_1_0_is_1true
rho0_relationstheta_base.j2.rho0_1_1_is_q_tautrue
rho0_relationstheta_base.j2.rho0_1_2_is_0true
rivalany_disc_zerofalse
rivaloff_iff_disc_positivetrue
s4F_abs2_q_to_1_plus_degA.hold10 / 10
s4base_values.deg1_rho0_0_is_1true
s4base_values.deg1_rho0_1_3_zerotrue
s4base_values.deg1_rho0_2_is_tau2_q2true
s4base_values.rho0_1_0_is_1true
s4base_values.rho0_1_1_is_q_tautrue
s4base_values.rho0_1_2_is_0true
s4base_values.rho0_1_3_is_0true
s4component_table.0,0.all_zerofalse
s4component_table.0,1.all_zerofalse
s4component_table.0,2.all_zerotrue
s4component_table.0,3.all_zerotrue
s4component_table.1,0.all_zerofalse
s4component_table.1,1.all_zerotrue
s4component_table.1,2.all_zerofalse
s4component_table.1,3.all_zerotrue
s4component_table.2,0.all_zerofalse
s4component_table.2,1.all_zerofalse
s4component_table.2,2.all_zerofalse
s4component_table.2,3.all_zerofalse
s4component_table.3,0.all_zerotrue
s4component_table.3,1.all_zerofalse
s4component_table.3,2.all_zerotrue
s4component_table.3,3.all_zerofalse
s4component_table.4,0.all_zerofalse
s4component_table.4,1.all_zerofalse
s4component_table.4,2.all_zerofalse
s4component_table.4,3.all_zerofalse
s4hecke_infinity_both.2007_character.hold20 / 20
s4hecke_infinity_both.2014_character.hold20 / 20
s4hypergeometric.0.C1_equals_tau_times_Htrue
s4hypergeometric.0.rho0_i1_equals_C1true
s4hypergeometric.1.C1_equals_tau_times_Htrue
s4hypergeometric.1.rho0_i1_equals_C1true
s4hypergeometric.2.C1_equals_tau_times_Htrue
s4hypergeometric.2.rho0_i1_equals_C1true
s4hypergeometric.3.C1_equals_tau_times_Htrue
s4hypergeometric.3.rho0_i1_equals_C1true
s4hypergeometric.4.C1_equals_tau_times_Htrue
s4hypergeometric.4.rho0_i1_equals_C1true
s4hypergeometric.5.C1_equals_tau_times_Htrue
s4hypergeometric.5.rho0_i1_equals_C1true
s4hypergeometric.6.C1_equals_tau_times_Htrue
s4hypergeometric.6.rho0_i1_equals_C1true
s4hypergeometric.7.C1_equals_tau_times_Htrue
s4hypergeometric.7.rho0_i1_equals_C1true
s4hypergeometric.8.C1_equals_tau_times_Htrue
s4hypergeometric.8.rho0_i1_equals_C1true
s4hypergeometric.9.C1_equals_tau_times_Htrue
s4hypergeometric.9.rho0_i1_equals_C1true
s4relations.finite_hecke.hold36 / 36
s4relations.hecke_infinity_corrected.hold10 / 20short
s4relations.periodicity_r_b4true
s4rho0_agree_q13_n4.agree232 / 232
s4three_body.0001.all_equal_onefalseshort
s4three_body.0003.all_equal_onefalseshort
s4three_body.0011.all_equal_onefalseshort
s4three_body.0013.all_equal_onefalseshort
s4three_body.0021.all_equal_onefalseshort
s4three_body.0023.all_equal_onefalseshort
s4three_body.0031.all_equal_onefalseshort
s4three_body.0033.all_equal_onefalseshort
s4three_body.0201.all_equal_onefalseshort
s4three_body.0203.all_equal_onefalseshort
s4three_body.0211.all_equal_onefalseshort
s4three_body.0213.all_equal_onefalseshort
s4three_body.0221.all_equal_onefalseshort
s4three_body.0223.all_equal_onefalseshort
s4three_body.0231.all_equal_onefalseshort
s4three_body.0233.all_equal_onefalseshort
s4three_body.1001.all_equal_onefalseshort
s4three_body.1003.all_equal_onefalseshort
s4three_body.1011.all_equal_onefalseshort
s4three_body.1013.all_equal_onefalseshort
s4three_body.1021.all_equal_onefalseshort
s4three_body.1023.all_equal_onefalseshort
s4three_body.1031.all_equal_onefalseshort
s4three_body.1033.all_equal_onefalseshort
s4three_body.1201.all_equal_onefalseshort
s4three_body.1203.all_equal_onefalseshort
s4three_body.1211.all_equal_onefalseshort
s4three_body.1213.all_equal_onefalseshort
s4three_body.1221.all_equal_onefalseshort
s4three_body.1223.all_equal_onefalseshort
s4three_body.1231.all_equal_onefalseshort
s4three_body.1233.all_equal_onefalseshort
structuralagree319,200 / 319,200
symbolsq13_n4.all_routes_agree182 / 182
symbolsq7_n3.all_routes_agree399 / 399
symbolsq7_n6.all_routes_agree399 / 399

15 items, 193 rows, 37 marked short; 7,727.7 s of item time in total. <!-- results-table: end -->

No row is a failure to reproduce. The rows marked short are of three kinds, and each equals the primary run's own record (test_ffprobe.py, test_second_implementation_reproduces_the_primary_numbers):

Beyond the rows, PARI reproduces these values: the 66 off-circle rivals, 50 of them beyond sigma = 1; the rival's mismatched monomials, X^2 to X^3 W; the balanced probe values 1.529 and 0.609; and every probe triple's exact value. The nine triples with an empty frequency box are zero by the same box argument in both implementations, not by an independent sum. The crosscheck run of 2026-10-26 crashed once in item s4. The cause was a bug in crosscheck.norm2, which asked PARI for the degree of an exact zero; nothing disagreed. It was fixed and s4 was rerun alone (RUNS.md).

3. Planted faults

ffprobe.FAULTS switches on eight planted faults, four wrong Gauss-sum signs and four wrong residue symbols, each at a different place, and test_ffprobe.py checks which of six quick equality checks each one turns red: the two symbol routes, Davenport-Hasse against enumeration, the structural route against enumeration, Lemma 7.1 locally (definition against closed form at T + 1 for j = 0..5 and at T^2 + 1 for j = 0, 3), the probe's direct and Euler representations at (0,2,1), and the PARI implementation against ffprobe. Without a plant all six are green.

plantwhat is wrongchecks turned red
gauss_signG_1(P) negated at every prime of degree 2 (structural route)structural, Lemma 7.1, probe, PARI
gauss_brute_signevery enumerated Gauss sum negatedDavenport-Hasse, structural, probe, PARI
dh_signthe Davenport-Hasse closed form negatedDavenport-Hasse
prime_gauss_allevery prime Gauss sum G_m(P) negated (structural route)structural, Lemma 7.1, probe, PARI
tau_signevery tau(eps chi^j) negatedall but the symbol routes
symbolthe Frobenius-route symbol modulo T + 1 one step offall but Davenport-Hasse
symbol_resthe resultant-route symbol modulo T + 1 one step offall six
dlogthe discrete logarithm of 2, which both symbol routes share, one step offall six

Every plant turns at least one check red. The Davenport-Hasse closed form of gauss_dh feeds nothing else (the structural route has its own prime formula), so its sign is caught by its own check alone. A fault in a component that both of ffprobe's own routes share is what the PARI comparison is for: it goes red for six of the eight plants.

4. Reproduce

.venv/bin/python hunts/ff_probe/crosscheck.py                 # results_second.json, checkpointed per item
.venv/bin/python -m pytest -q -n0 hunts/ff_probe/test_ffprobe.py -k "plant or lesion or second"