Add deterministic C3 local descent verification and run report profile

**Motivations:**
- Instrument the C3 “final lock” as a citeable deterministic artefact
- Provide a reproducible check over Lift(B12) at palier 2^13 using D8/Fusion witnesses

**Root causes:**
- C3 lacked a machine-checkable artefact aligned with the run-report standard

**Correctifs:**
- Add a deterministic verifier that checks fusion witnesses (m<n and U(m)=U^t(n)) and aggregates N* where computable

**Evolutions:**
- Version C3 verification artefacts under docs/artefacts
- Add run report profile c3_local_descent (sha256 + metrics)
- Document the new profile and reference the artefacts in the proof plan

**Pages affectées:**
- applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py
- docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json
- docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md
- applications/collatz/collatz_k_scripts/collatz_generate_run_report.py
- docs/collatz_run_report_2026-03-09_c3_local_descent.md
- docs/collatz_run_report_format.md
- docs/features/collatz_run_report_generator.md
- docs/features/collatz_c3_local_descent_verification.md
- applications/collatz/collatz_k_scripts/plan_lemmes_manquants_et_programme_de_preuve.md
This commit is contained in:
ncantu 2026-03-09 01:44:01 +01:00
parent c29bbaec4b
commit 071da20b19
9 changed files with 5860 additions and 1 deletions

View File

@ -132,6 +132,18 @@ class C2ProjectiveMetrics:
proj_both15_equals_b12: bool proj_both15_equals_b12: bool
@dataclass(frozen=True)
class C3LocalDescentMetrics:
palier: int
lifted_domain_size: int
d8_nodes: int
d8_exact_nodes: int
d8_brother_nodes: int
fusion_nodes: int
n_star: int
base_checked_up_to: int
def parse_c2_projective_metrics(verification_json: str) -> C2ProjectiveMetrics: def parse_c2_projective_metrics(verification_json: str) -> C2ProjectiveMetrics:
obj = read_json(Path(verification_json)) obj = read_json(Path(verification_json))
if not isinstance(obj, dict): if not isinstance(obj, dict):
@ -172,6 +184,35 @@ def parse_c2_projective_metrics(verification_json: str) -> C2ProjectiveMetrics:
) )
def parse_c3_local_descent_metrics(verification_json: str) -> C3LocalDescentMetrics:
obj = read_json(Path(verification_json))
if not isinstance(obj, dict):
raise ValueError("Invalid C3 verification JSON: expected object")
domain = obj.get("domain")
elim = obj.get("elimination")
base = obj.get("base_validation")
if not isinstance(domain, dict) or not isinstance(elim, dict) or not isinstance(base, dict):
raise ValueError("Invalid C3 verification JSON: missing domain/elimination/base_validation blocks")
def req_int(d: dict, k: str) -> int:
v = d.get(k)
if not isinstance(v, int):
raise ValueError(f"Invalid C3 verification JSON: {k} must be int")
return v
return C3LocalDescentMetrics(
palier=req_int(domain, "palier"),
lifted_domain_size=req_int(domain, "lifted_domain_size"),
d8_nodes=req_int(elim, "d8_nodes"),
d8_exact_nodes=req_int(elim, "d8_exact_nodes"),
d8_brother_nodes=req_int(elim, "d8_brother_nodes"),
fusion_nodes=req_int(elim, "fusion_nodes"),
n_star=req_int(elim, "N_star"),
base_checked_up_to=req_int(base, "checked_up_to"),
)
def write_c2_projective_run_report( def write_c2_projective_run_report(
*, *,
output_path: Path, output_path: Path,
@ -224,6 +265,58 @@ def write_c2_projective_run_report(
output_path.write_text("\n".join(lines) + "\n", encoding="utf-8") output_path.write_text("\n".join(lines) + "\n", encoding="utf-8")
def write_c3_local_descent_run_report(
*,
output_path: Path,
report_title: str,
command: str,
git_commit: str,
sha_entries: list[Sha256Entry],
metrics: C3LocalDescentMetrics,
artefacts_dir: Path,
) -> None:
lines: list[str] = []
lines.append("**Auteur** : Équipe 4NK")
lines.append("")
lines.append(f"# {report_title}")
lines.append("")
lines.append("## Contexte")
lines.append("")
lines.append("- **But du run** : vérifier C3 (clôture locale sur Lift(B12) au palier 2^13) via témoins D8/Fusion.")
lines.append("- **Assertion vérifiée** : cohérence arithmétique des témoins (U(m)=U^t(n), m<n) et agrégats (N*).")
lines.append("")
lines.append("## Code et reproductibilité")
lines.append("")
if git_commit:
lines.append(f"- **Commit Git** : `{git_commit}`")
if command:
lines.append("- **Commande** :")
lines.append("")
lines.append("```bash")
lines.append(command)
lines.append("```")
lines.append("")
lines.append("## Empreintes sha256 (scripts, artefacts)")
lines.append("")
lines.extend(format_sha256_list(sha_entries))
lines.append("")
lines.append("## Compteurs et métriques")
lines.append("")
lines.append(f"- palier : 2^{metrics.palier}")
lines.append(f"- |Lift(B12)| : {metrics.lifted_domain_size}")
lines.append(f"- D8 : {metrics.d8_nodes} (exact={metrics.d8_exact_nodes}, brothers={metrics.d8_brother_nodes})")
lines.append(f"- Fusion : {metrics.fusion_nodes}")
lines.append(f"- N* (max seuils N0/Nf calculés) : {metrics.n_star}")
lines.append(f"- base validation checked up to : {metrics.base_checked_up_to}")
lines.append("")
lines.append("## Chemins dartefacts (versionnés)")
lines.append("")
lines.append(f"- ARTEFACTS : `{artefacts_dir}`")
lines.append("")
output_path.parent.mkdir(parents=True, exist_ok=True)
output_path.write_text("\n".join(lines) + "\n", encoding="utf-8")
def _discover_base_noyau_path(artefacts_dir: Path) -> Path: def _discover_base_noyau_path(artefacts_dir: Path) -> Path:
candidates = sorted((artefacts_dir / "noyaux").glob("noyau_*_B12.json")) candidates = sorted((artefacts_dir / "noyaux").glob("noyau_*_B12.json"))
if len(candidates) != 1: if len(candidates) != 1:
@ -805,6 +898,7 @@ def main() -> None:
"local_H6", "local_H6",
"local_H6_E1", "local_H6_E1",
"c2_projective", "c2_projective",
"c3_local_descent",
], ],
help="Report profile", help="Report profile",
) )
@ -826,6 +920,11 @@ def main() -> None:
default="", default="",
help="For profile c2_projective: path to deterministic artefacts directory (e.g. docs/artefacts/collatz/c2_projective)", help="For profile c2_projective: path to deterministic artefacts directory (e.g. docs/artefacts/collatz/c2_projective)",
) )
ap.add_argument(
"--c3-artefacts-dir",
default="",
help="For profile c3_local_descent: path to deterministic artefacts directory (e.g. docs/artefacts/collatz/c3_local_descent)",
)
args = ap.parse_args() args = ap.parse_args()
repo_root = Path(args.repo_root).resolve() if args.repo_root else Path.cwd().resolve() repo_root = Path(args.repo_root).resolve() if args.repo_root else Path.cwd().resolve()
@ -1078,6 +1177,47 @@ def main() -> None:
print(f"Wrote: {output_path}") print(f"Wrote: {output_path}")
return return
if args.profile == "c3_local_descent":
command = args.command.strip()
if not command:
command = (
"python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py "
"--profile c3_local_descent --scope c3_local_descent "
"--out-dir applications/collatz/out --docs-dir docs "
"--c3-artefacts-dir docs/artefacts/collatz/c3_local_descent"
)
artefacts_dir = (
Path(args.c3_artefacts_dir).resolve()
if args.c3_artefacts_dir.strip()
else (docs_dir / "artefacts" / "collatz" / "c3_local_descent")
)
verification_json = artefacts_dir / "verification_c3_local_descent.json"
verification_md = artefacts_dir / "verification_c3_local_descent.md"
metrics = parse_c3_local_descent_metrics(str(verification_json))
date_str = pick_report_date_from_mtime([verification_json, verification_md])
sha_paths: list[Path] = [
repo_root / "applications" / "collatz" / "collatz_k_scripts" / "collatz_verify_c3_local_descent.py",
repo_root / "applications" / "collatz" / "collatz_k_scripts" / "collatz_k_core.py",
repo_root / "applications" / "collatz" / "collatz_k_scripts" / "collatz_k_fusion.py",
verification_json,
verification_md,
]
sha_entries = compute_sha256_entries(sha_paths)
output_path = docs_dir / f"collatz_run_report_{date_str}_{args.scope}.md"
write_c3_local_descent_run_report(
output_path=output_path,
report_title=f"Rapport dexécution — {args.scope}",
command=command,
git_commit=commit_hash,
sha_entries=sha_entries,
metrics=metrics,
artefacts_dir=artefacts_dir,
)
print(f"Wrote: {output_path}")
return
raise ValueError(f"Unknown profile: {args.profile}") raise ValueError(f"Unknown profile: {args.profile}")

View File

@ -0,0 +1,421 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
collatz_verify_c3_local_descent.py
Deterministic verification artefact for the C3 step, starting from the
instrumented C1 (local H6 cover) and C2 (projective reduction).
Scope of this verifier:
- domain L := Lift_{12->13}(B12) (represented by the versioned local H6 artefacts)
- for each n in L, select a witnessed elimination:
- D8 branch: verify U^8(n) < n (direct check on the representative n)
- Fusion branch: verify the row witnesses a fusion to a strictly smaller preimage m < n,
and that U^t(n) == U(m) (shared suffix) using U_step computations.
- additionally, verify that every reached integer <= max_seen terminates to 1
under the standard Collatz map (accelerated on odds), so the local descent
proof for representatives is closed unconditionally at this finite bound.
Inputs:
- docs/artefacts/collatz/local_E*_palier2p13/** (generated by collatz_generate_local_h6_artefacts.py)
Outputs:
- docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json
- docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md
"""
from __future__ import annotations
import argparse
import csv
import json
import re
from dataclasses import dataclass
from pathlib import Path
from collatz_k_core import U_step, prefix_data, N0_D, fusion_choice_a, delta_F, Nf_F
def _read_json(path: Path) -> object:
return json.loads(path.read_text(encoding="utf-8", errors="strict"))
def _discover_state_dirs(root: Path) -> list[Path]:
dirs = sorted([p for p in root.glob("local_E*_palier2p13") if p.is_dir()])
if not dirs:
raise ValueError(f"No local_E*_palier2p13 directories found under {root}")
return dirs
def _load_covered_from_cert(cert_path: Path) -> set[int]:
obj = _read_json(cert_path)
if not isinstance(obj, dict) or "covered" not in obj:
raise ValueError(f"Invalid certificate JSON (missing covered): {cert_path}")
cov = obj["covered"]
if not isinstance(cov, list) or not all(isinstance(x, int) for x in cov):
raise ValueError(f"Invalid certificate JSON covered list: {cert_path}")
return set(cov)
@dataclass(frozen=True)
class FusionWitness:
n: int
t: int
a: int
y: int
preimage_m: int
source_csv: str
def _parse_int_field(row: dict[str, str], key: str, source: Path) -> int:
if key not in row:
raise ValueError(f"Missing column {key} in {source}")
raw = row[key].strip()
if not raw:
raise ValueError(f"Empty column {key} in {source}")
try:
return int(raw)
except ValueError as e:
raise ValueError(f"Invalid int for {key} in {source}: {raw}") from e
def _load_fusion_witnesses(state_dir: Path) -> list[FusionWitness]:
candidats_dir = state_dir / "candidats"
paths = sorted(candidats_dir.glob("candidats_F9to*_E*_palier2p13.csv"))
if not paths:
return []
witnesses: list[FusionWitness] = []
for p in paths:
if p.stat().st_size == 0:
continue
with p.open("r", encoding="utf-8") as f:
r = csv.DictReader(f)
for row in r:
n = _parse_int_field(row, "classe_mod_2^m", p)
t = _parse_int_field(row, "t", p)
a = _parse_int_field(row, "a", p)
y = _parse_int_field(row, "y", p)
m = _parse_int_field(row, "preimage_m", p)
witnesses.append(
FusionWitness(n=n, t=t, a=a, y=y, preimage_m=m, source_csv=str(p))
)
return witnesses
def _u_iter(n: int, k: int) -> int:
x = n
for _ in range(k):
x, _ = U_step(x)
return x
def _collatz_terminates(n: int) -> bool:
x = n
seen = 0
while x != 1:
if x <= 0:
return False
if x % 2 == 0:
x //= 2
else:
x, _ = U_step(x)
seen += 1
if seen > 10_000_000:
return False
return True
def _pick_best_witness(witnesses: list[FusionWitness]) -> dict[int, FusionWitness]:
"""
For each n, choose a canonical witness: minimal t, then minimal preimage_m,
then lexical source_csv (for determinism).
"""
out: dict[int, FusionWitness] = {}
for w in witnesses:
prev = out.get(w.n)
if prev is None:
out[w.n] = w
continue
if (w.t, w.preimage_m, w.source_csv) < (prev.t, prev.preimage_m, prev.source_csv):
out[w.n] = w
return out
def _infer_state_id(state_dir: Path) -> int:
m = re.search(r"local_E(\d+)_palier2p13", state_dir.name)
if not m:
raise ValueError(f"Cannot infer state id from {state_dir}")
return int(m.group(1))
def run(
*,
artefacts_root: Path,
output_dir: Path,
) -> None:
state_dirs = _discover_state_dirs(artefacts_root)
# Domain L as union of per-state lifted noyaux
L: set[int] = set()
d8_covered: set[int] = set()
fusion_witnesses_all: list[FusionWitness] = []
for sd in state_dirs:
sid = _infer_state_id(sd)
lift_candidates = sorted((sd / "noyaux").glob(f"noyau_Lift_E{sid}_palier2p13.json"))
if len(lift_candidates) != 1:
raise ValueError(f"Expected exactly one lift noyau for {sd}, got {len(lift_candidates)}")
lift_obj = _read_json(lift_candidates[0])
if not isinstance(lift_obj, dict) or "noyau" not in lift_obj:
raise ValueError(f"Invalid lift noyau JSON: {lift_candidates[0]}")
lift_list = lift_obj["noyau"]
if not isinstance(lift_list, list) or not all(isinstance(x, int) for x in lift_list):
raise ValueError(f"Invalid lift noyau list: {lift_candidates[0]}")
L |= set(lift_list)
cert_d8 = sd / "certificats" / f"certificat_D8_E{sid}_palier2p13.json"
if cert_d8.exists():
d8_covered |= _load_covered_from_cert(cert_d8)
fusion_witnesses_all.extend(_load_fusion_witnesses(sd))
if not L:
raise ValueError("Empty domain L")
fusion_by_n = _pick_best_witness(fusion_witnesses_all)
d8_nodes = sorted([n for n in L if n in d8_covered])
f_nodes = sorted([n for n in L if n not in d8_covered])
missing_f = [n for n in f_nodes if n not in fusion_by_n]
if missing_f:
raise ValueError(f"Missing fusion witness for {len(missing_f)} residues (e.g. {missing_f[:20]})")
records: list[dict[str, object]] = []
next_values: list[int] = []
thresholds: list[int] = []
d8_exact_nodes = 0
d8_brother_nodes = 0
d8_exact_base_cases = 0
d8_exact_descent_witnesses = 0
shift = 1 << (13 - 1)
d8_exact_set: set[int] = set()
d8_brother_set: set[int] = set()
for n in d8_nodes:
pref = prefix_data(n, 8)
if pref.A == 13:
d8_exact_set.add(n)
else:
d8_brother_set.add(n)
for n in sorted(L):
if n in d8_covered:
pref = prefix_data(n, 8)
if n in d8_exact_set:
d8_exact_nodes += 1
N0 = N0_D(pref.C, pref.A, 8)
thresholds.append(N0)
if n >= N0:
y = pref.y
if y >= n:
raise ValueError(f"D8 descent check failed for n={n}: U^8(n)={y} not < n (N0={N0})")
next_values.append(y)
d8_exact_descent_witnesses += 1
records.append(
{
"n": n,
"kind": "D_exact",
"k": 8,
"A_k": pref.A,
"C_k": pref.C,
"N0": N0,
"next": y,
"base_case": False,
}
)
else:
d8_exact_base_cases += 1
records.append(
{
"n": n,
"kind": "D_exact",
"k": 8,
"A_k": pref.A,
"C_k": pref.C,
"N0": N0,
"next": None,
"base_case": True,
}
)
else:
d8_brother_nodes += 1
mate = n ^ shift
if mate not in d8_exact_set:
raise ValueError(
f"D8 brother check failed for n={n}: expected mate={mate} to be an exact D8 candidate (A8=13)"
)
records.append(
{
"n": n,
"kind": "D_brother",
"k": 8,
"A_k": pref.A,
"C_k": pref.C,
"mate_exact": mate,
}
)
else:
w = fusion_by_n[n]
pref = prefix_data(n, w.t)
y = pref.y
if y != w.y:
raise ValueError(f"Fusion witness y mismatch for n={n}: computed U^{w.t}(n)={y}, row y={w.y}")
m = w.preimage_m
if m >= n:
raise ValueError(f"Fusion witness preimage not smaller for n={n}: m={m} >= n")
y2, _ = U_step(m)
if y2 != y:
raise ValueError(f"Fusion witness invalid: U(m) != U^t(n) for n={n}: U({m})={y2}, U^{w.t}({n})={y}")
a = fusion_choice_a(y)
if a is None:
raise ValueError(f"Fusion witness invalid: y mod 3 == 0 for n={n}, y={y}")
if a != w.a:
raise ValueError(f"Fusion witness a mismatch for n={n}: computed a={a}, row a={w.a}")
dF = delta_F(pref.A, w.t, a)
if dF <= 0:
raise ValueError(f"Fusion witness invalid: DeltaF<=0 for n={n}: DeltaF={dF}")
Nf = Nf_F(pref.C, pref.A, w.t, a)
thresholds.append(Nf)
if n < Nf:
raise ValueError(f"Fusion witness invalid: n < Nf for n={n}: Nf={Nf}")
records.append(
{
"n": n,
"kind": "F",
"t": w.t,
"a": a,
"y": y,
"preimage_m": m,
"A_t": pref.A,
"C_t": pref.C,
"DeltaF": dF,
"Nf": Nf,
"source_csv": w.source_csv,
"next": m,
}
)
next_values.append(m)
max_n = max(L)
max_next = max(next_values) if next_values else 0
max_seen = max(max_n, max_next)
N_star = max(thresholds) if thresholds else 0
base_check_up_to = max(max_seen, N_star)
# Base validation at finite bound
non_terminating: list[int] = []
for x in range(1, base_check_up_to + 1):
if not _collatz_terminates(x):
non_terminating.append(x)
break
if non_terminating:
raise ValueError(f"Base validation failed at n={non_terminating[0]}")
summary = {
"inputs": {
"artefacts_root": str(artefacts_root),
"states": len(state_dirs),
},
"domain": {
"palier": 13,
"lifted_domain_size": len(L),
"min_n": min(L),
"max_n": max_n,
},
"elimination": {
"d8_nodes": len(d8_nodes),
"d8_exact_nodes": d8_exact_nodes,
"d8_exact_descent_witnesses": d8_exact_descent_witnesses,
"d8_exact_base_cases": d8_exact_base_cases,
"d8_brother_nodes": d8_brother_nodes,
"fusion_nodes": len(f_nodes),
"max_next": max_next,
"N_star": N_star,
},
"base_validation": {
"checked_up_to": base_check_up_to,
"ok": True,
},
"records": records,
}
output_dir.mkdir(parents=True, exist_ok=True)
out_json = output_dir / "verification_c3_local_descent.json"
out_md = output_dir / "verification_c3_local_descent.md"
out_json.write_text(json.dumps(summary, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
lines: list[str] = []
lines.append("**Auteur** : Équipe 4NK")
lines.append("")
lines.append("# Vérification déterministe — C3 (clôture locale par descente/fusion)")
lines.append("")
lines.append("## Entrées")
lines.append("")
lines.append(f"- ARTEFACTS ROOT : `{artefacts_root}`")
lines.append("")
lines.append("## Domaine")
lines.append("")
lines.append(f"- palier : 2^13")
lines.append(f"- |L| (Lift(B12) à 2^13) : {len(L)}")
lines.append(f"- min(L) : {min(L)}, max(L) : {max_n}")
lines.append("")
lines.append("## Élimination (témoins)")
lines.append("")
lines.append(
f"- D8 : {len(d8_nodes)} (exact A8=13 : {d8_exact_nodes}, "
f"descente vérifiée pour n>=N0 : {d8_exact_descent_witnesses}, "
f"cas de base n<N0 : {d8_exact_base_cases}, "
f"frères (mate exact requis) : {d8_brother_nodes})"
)
lines.append(f"- Fusion : {len(f_nodes)} (m<n, U(m)=U^t(n) vérifié)")
lines.append(f"- max(next) : {max_next}")
lines.append(f"- N* (max des seuils N0/Nf calculés) : {N_star}")
lines.append("")
lines.append("## Validation de base (finie)")
lines.append("")
lines.append(f"- Trajectoires vérifiées jusquà : {max_seen}")
lines.append("- Résultat : True (toutes atteignent 1)")
lines.append("")
lines.append("## Sorties")
lines.append("")
lines.append(f"- JSON : `{out_json}`")
lines.append(f"- Markdown : `{out_md}`")
lines.append("")
out_md.write_text("\n".join(lines) + "\n", encoding="utf-8")
def main() -> None:
ap = argparse.ArgumentParser(description="Deterministic C3 verification from local H6 artefacts (palier 2^13)")
ap.add_argument(
"--local-h6-root",
default="docs/artefacts/collatz",
help="Root directory containing local_E*_palier2p13 directories",
)
ap.add_argument(
"--output-dir",
default="docs/artefacts/collatz/c3_local_descent",
help="Output directory for deterministic artefacts (JSON + MD)",
)
args = ap.parse_args()
run(
artefacts_root=Path(args.local_h6_root),
output_dir=Path(args.output_dir),
)
if __name__ == "__main__":
main()

View File

@ -261,6 +261,23 @@ Lemme C3 (impossibilité dorbite infinie sous contraintes).
Sous un paquet explicite de contraintes arithmétiques \(P\) (congruences, bornes sur sommes de valuations sur des horizons, contraintes modulo \(3^k\), etc.) extraites comme invariants des survivants, aucune orbite de la dynamique accélérée \(U\) ne peut être infinie. Sous un paquet explicite de contraintes arithmétiques \(P\) (congruences, bornes sur sommes de valuations sur des horizons, contraintes modulo \(3^k\), etc.) extraites comme invariants des survivants, aucune orbite de la dynamique accélérée \(U\) ne peut être infinie.
Objectif : fournir une mesure de rang ou une contradiction directe stable sous \(U\) sur le sous-ensemble défini par \(P\). Objectif : fournir une mesure de rang ou une contradiction directe stable sous \(U\) sur le sous-ensemble défini par \(P\).
### Instance instrumentée (palier \(2^{13}\), domaine Lift(\(B_{12}\)))
On pose \(L=\mathrm{Lift}_{12\to 13}(B_{12})\subset(\mathbb{Z}/2^{13}\mathbb{Z})^\times\).
Une instance vérifiable de C3 consiste à exhiber, pour chaque \(n\in L\), un témoin délimination de type :
- **fusion** : un entier impair \(m<n\) et un \(t\ge 1\) tels que \(U(m)=U^{(t)}(n)\) (donc la terminaison de \(n\) se réduit à celle de \(m\)) ;
- **descente exacte** : un \(k\ge 1\) (ici \(k=8\)) tel que la clause exacte est contractante (\(\Delta_D=2^{A_k}-3^k>0\)) et fournit un seuil \(N_0\) ; pour \(n\ge N_0\), on a \(U^{(k)}(n)<n\) ;
- **frère** : une réduction au cas “descente exacte” via légalité “sœur” (structure de complétion par frères), indexée par un `mate_exact`.
Artefact déterministe (script + sorties courtes) :
- script : `applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py`
- sorties : `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.{json,md}`
- rapport dexécution : `docs/collatz_run_report_2026-03-09_c3_local_descent.md`
Cet artefact vérifie légalité \(U(m)=U^{(t)}(n)\), la stricte inégalité \(m<n\) pour les témoins de fusion, la cohérence des seuils \(N_0\) (descente exacte) et \(N_F\) (fusion) lorsquils sont calculables, et agrège une borne \(N^\star\) sur cette instance.
## Conclusion ## Conclusion
La trajectoire D18D21 (F15/F16) augmente le matériau et affine la cartographie du noyau résiduel, mais la preuve complète exige encore lun des deux verrous : extinction à palier fini (certificat total) ou contraction uniforme (lemme analytique). La trajectoire D18D21 (F15/F16) augmente le matériau et affine la cartographie du noyau résiduel, mais la preuve complète exige encore lun des deux verrous : extinction à palier fini (certificat total) ou contraction uniforme (lemme analytique).

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
**Auteur** : Équipe 4NK
# Vérification déterministe — C3 (clôture locale par descente/fusion)
## Entrées
- ARTEFACTS ROOT : `docs/artefacts/collatz`
## Domaine
- palier : 2^13
- |L| (Lift(B12) à 2^13) : 384
- min(L) : 27, max(L) : 8191
## Élimination (témoins)
- D8 : 54 (exact A8=13 : 27, descente vérifiée pour n>=N0 : 27, cas de base n<N0 : 0, frères (mate exact requis) : 27)
- Fusion : 330 (m<n, U(m)=U^t(n) vérifié)
- max(next) : 6867
- N* (max des seuils N0/Nf calculés) : 138
## Validation de base (finie)
- Trajectoires vérifiées jusquà : 8191
- Résultat : True (toutes atteignent 1)
## Sorties
- JSON : `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
- Markdown : `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md`

View File

@ -0,0 +1,44 @@
**Auteur** : Équipe 4NK
# Rapport dexécution — c3_local_descent
## Contexte
- **But du run** : vérifier C3 (clôture locale sur Lift(B12) au palier 2^13) via témoins D8/Fusion.
- **Assertion vérifiée** : cohérence arithmétique des témoins (U(m)=U^t(n), m<n) et agrégats (N*).
## Code et reproductibilité
- **Commit Git** : `e3e68fe39c8ad466e5741e87d20311ca93b2456e`
- **Commande** :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py --profile c3_local_descent --scope c3_local_descent --out-dir applications/collatz/out --docs-dir docs --c3-artefacts-dir docs/artefacts/collatz/c3_local_descent
```
## Empreintes sha256 (scripts, artefacts)
- `/home/ncantu/code/algo/applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py`
- sha256: `8959c31332dc650040a434efd9ebfa7a604d2f436a1316cf36371a12578b2b34`
- `/home/ncantu/code/algo/applications/collatz/collatz_k_scripts/collatz_k_core.py`
- sha256: `2d5fb9fff733c37a2fa88334b034b70bfe23665d5a13bf4b2407bb13de7227dc`
- `/home/ncantu/code/algo/applications/collatz/collatz_k_scripts/collatz_k_fusion.py`
- sha256: `421d4384b501129a2039c67a327e57e0dd891cdf125c1d74499627bc20a3f62f`
- `/home/ncantu/code/algo/docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
- sha256: `cad483cab3a6db3693dc6130e68f61e99350515719bf52fc63370f4287e7ef97`
- `/home/ncantu/code/algo/docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md`
- sha256: `5353489e85fca4ad3774a778e39b57e2994de8e4dfb937b62a8d41df31a952dd`
## Compteurs et métriques
- palier : 2^13
- |Lift(B12)| : 384
- D8 : 54 (exact=27, brothers=27)
- Fusion : 330
- N* (max seuils N0/Nf calculés) : 138
- base validation checked up to : 8191
## Chemins dartefacts (versionnés)
- ARTEFACTS : `/home/ncantu/code/algo/docs/artefacts/collatz/c3_local_descent`

View File

@ -101,6 +101,21 @@ python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py \
--docs-dir docs --docs-dir docs
``` ```
Pour la vérification C3 (clôture locale au palier \(2^{13}\) sur Lift(\(B_{12}\)) via témoins D8/Fusion, artefacts déterministes versionnés) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py \
--local-h6-root docs/artefacts/collatz \
--output-dir docs/artefacts/collatz/c3_local_descent
python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py \
--profile c3_local_descent \
--scope c3_local_descent \
--c3-artefacts-dir docs/artefacts/collatz/c3_local_descent \
--out-dir applications/collatz/out \
--docs-dir docs
```
### Contexte ### Contexte
- **But du run** : (énoncé court) - **But du run** : (énoncé court)

View File

@ -0,0 +1,56 @@
**Auteur** : Équipe 4NK
# Collatz — Vérification déterministe de C3 (clôture locale)
## Objectif
Produire un artefact déterministe et citable (sans transcript terminal) vérifiant une instance de C3 sur un domaine fini contrôlé :
- domaine \(L=\mathrm{Lift}_{12\to 13}(B_{12})\) (384 résidus impairs modulo \(2^{13}\)),
- témoins :
- clauses de fusion F (avec `preimage_m < n` et égalité \(U(m)=U^{(t)}(n)\) vérifiée),
- et branche D8 (distinguée en “exact” \(A_8=13\) et “frère”, i.e. `mate_exact`).
Cet artefact vérifie la cohérence arithmétique des témoins et agrège les seuils \(N_0\) (D exact) et \(N_F\) (fusion) en une borne \(N^\star\) calculée sur ce domaine.
## Impacts
- Ajout dun artefact versionné dans `docs/artefacts/` et dun rapport dexécution dans `docs/`, alignés sur le format standard des rapports.
## Modifications
- Script déterministe :
- `applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py`
- Artefacts versionnés (sortie du script) :
- `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.json`
- `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.md`
- Rapport dexécution (sha256 + métriques) :
- `docs/collatz_run_report_2026-03-09_c3_local_descent.md`
- Extension du générateur de rapports :
- `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py` (profil `c3_local_descent`)
## Modalités danalyse
- Générer/mettre à jour les artefacts déterministes :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_verify_c3_local_descent.py \
--local-h6-root docs/artefacts/collatz \
--output-dir docs/artefacts/collatz/c3_local_descent
```
- Produire le rapport dexécution (empreintes sha256 + métriques) :
```bash
python3 applications/collatz/collatz_k_scripts/collatz_generate_run_report.py \
--profile c3_local_descent \
--scope c3_local_descent \
--c3-artefacts-dir docs/artefacts/collatz/c3_local_descent \
--out-dir applications/collatz/out \
--docs-dir docs
```
## Modalités de déploiement
Aucun déploiement.

View File

@ -23,9 +23,10 @@ afin déviter toute insertion de transcript terminal dans les documents math
- Ajout dun format standard : `docs/collatz_run_report_format.md`. - Ajout dun format standard : `docs/collatz_run_report_format.md`.
- Ajout dun générateur : `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py`. - Ajout dun générateur : `applications/collatz/collatz_k_scripts/collatz_generate_run_report.py`.
- Ajout dun exemple réel de rapport : `docs/collatz_run_report_2026-03-04_extend_D18_D21_resume_from_D20.md`. - Ajout dun exemple réel de rapport : `docs/collatz_run_report_2026-03-04_extend_D18_D21_resume_from_D20.md`.
- Profils supportés : `extend_finale`, `validation_section7`, `pipeline_d16_d17`, `fusion_palier2p25`, `local_H6_E1`, `local_H6`, `c2_projective`. - Profils supportés : `extend_finale`, `validation_section7`, `pipeline_d16_d17`, `fusion_palier2p25`, `local_H6_E1`, `local_H6`, `c2_projective`, `c3_local_descent`.
- Pour `local_H6`/`local_H6_E1`, un audit automatique compare le **palier attendu** (artefacts) au **palier certifié** (certificats) et échoue en cas de désaccord. - Pour `local_H6`/`local_H6_E1`, un audit automatique compare le **palier attendu** (artefacts) au **palier certifié** (certificats) et échoue en cas de désaccord.
- Pour `c2_projective`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/c2_projective/verification_c2_projective.{json,md}`. - Pour `c2_projective`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/c2_projective/verification_c2_projective.{json,md}`.
- Pour `c3_local_descent`, le rapport cite les artefacts déterministes `docs/artefacts/collatz/c3_local_descent/verification_c3_local_descent.{json,md}`.
## Modalités danalyse ## Modalités danalyse