Repository navigation
analyse_problemes_v6_v7
Auteur : hprzeta · Date : 11 juin 2026 · Commit :
8637098Optimisation 2-phases de l'affinage Illinois en C/libmpfr
La v6 identifie l'affinage Illinois (illinois_refine, libmpfr 170 bits) comme
bottleneck à 78–83 % du temps CPU. La v7 introduit illinois_refine_adaptive,
un affinage en deux phases : les premières itérations utilisent 64 bits (1 limbe mpfr),
avant de basculer à 116 bits pour la convergence finale.
Gain mesuré : ×3.7 sur la durée totale à
La v6 (commit b676e88) a résolu les zéros manquants avec STEP = 0.010 fixe +
détection scan_arb.c. Run
Profil de phases v6 :
| Phase | ms/appel | % CPU |
|---|---|---|
illinois_C |
~130 ms | 83 % |
| turing | — | 1 % |
| detection | — | 0,5 % |
L'affinage utilise mpfr_cos, mpfr_log) sont lentes.
L'algorithme Illinois sur
Idée v7 : évaluer
| Phase | Itérations | Précision | Limbes mpfr | Objectif |
|---|---|---|---|---|
| 1 (rapide) | 64 bits | 1 | ||
| 2 (précise) | 116 bits | 2 |
La transition est opérée par mpfr_prec_round qui élargit la représentation sans recalcul.
L'idée initiale de
La formule de Riemann-Siegel
n'est correcte que pour
Exemple :
$t = 1002$ ,$N_\text{full} = 12$ ,$N_\text{fast} = 3$ .$Z_\text{RS}(c, N=3)$ peut avoir le signe opposé à$Z_\text{RS}(c, N=12)$ . Illinois diverge vers un pseudo-zéro arbitraire.
Solution retenue :
mpfr stocke un flottant en
-
prec = 64→ 1 limbe → routines SIMD spécialisées (AVX2) -
prec = 170→ 3 limbes → boucle générique multi-mots, pas de SIMD
Le rapport de vitesse observé est ×10–20 par appel, bien supérieur au simple rapport de limbes (×3).
Deux fonctions ajoutées dans illinois_mpfr.c (commit 8637098) :
/* Z(t) RS avec N_termes imposé (pas floor(sqrt(t/2pi))) */
double Z_rs_mpfr_ntermes(double t_d, int N_termes, mpfr_prec_t prec);
double illinois_refine_adaptive(
double a, double b, double fa, double fb,
double t, int iter_switch, int max_iter)
{
int N_full = (int)floor(sqrt(t / (2.0 * M_PI)));
mpfr_prec_t prec_fast = 64; /* phase 1 : 1 limbe SIMD */
mpfr_prec_t prec_full = 116; /* phase 2 : 2 limbes, convergence 1e-12 */
/* ... boucle Illinois ... */
if (i == iter_switch) {
/* transition : élargir la précision de toutes les variables mpfr */
mpfr_prec_round(ma, prec_full, MPFR_RNDN);
/* ... idem mb, mfa, mfb, mc, mfc ... */
}
}Paramètres v7 : ITER_SWITCH = 8, MAX_ITER = 50, fallback illinois_refine classique
sur exception.
| Phase | ms/appel | % CPU |
|---|---|---|
illinois_C |
42,05 ms | 78,2 % |
| detection | 9 450 ms (total) | 0,5 % |
| turing | 22 046 ms (total) | 0,3 % |
| Run | v6 (170 bits) | v7 (64→116 bits) | Gain |
|---|---|---|---|
| T=5 000 — z/s | 136 | 1 808 | ×13 |
| T=5 000 — ms/appel | 23,50 ms | 1,47 ms | ×16 |
| T=10 000 — z/s | ~66 | 408 | ×6,2 |
| T=10 000 — ms/appel | ~50 ms | 3,71 ms | ×13 |
| T=100 000 — z/s | ~20 | 74,49 | ×3,7 |
| T=100 000 — ms/appel | ~130 ms | 42,05 ms | ×3,1 |
| T=100 000 — durée | ~113 min | 30,9 min | ×3,7 |
| T=100 000 — zéros | 138 069 | 138 069 | identique |
| T=100 000 — manquants | 0 | 0 | identique |
| T=100 000 — Turing | COMPLET | COMPLET | identique |
Le gain décroît avec
À
Relation empirique :
Les deux versions convergent vers le même pseudo-zéro, dont la distance au vrai zéro
est bornée par le biais structurel RS :
| Paramètre | Valeur |
|---|---|
| Script | compute_zeros_v7.py |
| Zéros trouvés | 138 069 |
| Manquants | 0 |
| Turing-Backlund | COMPLET |
| LMFDB | 19/20 à |
| Durée | 30,9 min |
| Vitesse | 74,49 z/s |
| Gain vs v6 | ×3,7 |
| Log | logs/run_T100k_v7_20260611_1424.log |
| Option | Description | Gain estimé | Cible |
|---|---|---|---|
| A | W=8 workers (doubler le parallélisme) | ×1,3 | ~24 min |
| B | prec phase 2 = 80 bits (vérifier SIMD) | à mesurer | ? |
TÂCHE 0 obligatoire avant v8 : benchmark empirique
prec_fast ∈ {32, 48, 64, 80, 96} bits sur T=5k.
Pistes à plus long terme :
- Termes RS d'ordre supérieur (
$C_2, C_3$ ) pour réduire le biais à$\mathcal{O}(t^{-5/2})$ - Vectorisation interne : batch de plusieurs appels
$Z_\text{RS}(c_i)$ - Phase 1 en
doubleIEEE 754 (~52 bits), évitant l'overhead d'allocation mpfr
La théorie prédisait ×4,6 via réduction des termes RS. La réalité mesurée : ×16 via prec_fast=64 bits (1 limbe → SIMD). Ne jamais supposer que l'intuition théorique identifie le vrai levier — mesurer d'abord.
Voir aussi : Bonnes-Pratiques-Claude-Code § Règle précision mpfr · maths_v7_ntermes_adaptatif
Fichier : analyse_problemes_v6_v7.md · Dossier : wiki master Auteur : hprzeta · MAJ : 11 juin 2026