Repository navigation
niveau 2 analyse complexe
Session 3 — Fonctions holomorphes, théorème de Cauchy et prolongement analytique Méthode : théorie → formule → exemple à la main → code Python
| Animation | Ce qu'elle montre |
|---|---|
| ▶ Plan complexe | Heatmap |
Comprendre pourquoi
C'est la brique entre la définition élémentaire de
- Les zéros non triviaux de
$\zeta(s)$ vivent dans la bande$0 < \text{Re}(s) < 1$ - Pour y accéder, il faut sortir du domaine de convergence de la série
- Le prolongement analytique est l'outil qui rend cela rigoureux
Une fonction
La différence avec la dérivée réelle :
On écrit
Intuition : ces deux équations forcent la dérivée à être la même quelle que soit la direction d'approche.
Vérifions que
On écrit
Ainsi
Les conditions de Cauchy-Riemann sont satisfaites —
Pour
from mpmath import mp, mpc, re, im, diff
import numpy as np
import matplotlib.pyplot as plt
mp.dps = 15
def f(z):
return z**2
# Vérification numérique des conditions C-R en z = 1 + 2i
z0 = mpc(1, 2)
h = 1e-7
# Dérivées partielles de u = Re(f) et v = Im(f)
du_dx = float(re(f(z0 + h) - f(z0)) / h)
du_dy = float(re(f(z0 + mpc(0,h)) - f(z0)) / h)
dv_dx = float(im(f(z0 + h) - f(z0)) / h)
dv_dy = float(im(f(z0 + mpc(0,h)) - f(z0)) / h)
print("Conditions de Cauchy-Riemann pour f(z) = z² en z = 1+2i")
print(f" du/dx = {du_dx:.6f} dv/dy = {dv_dy:.6f} → égaux : {abs(du_dx - dv_dy) < 1e-5}")
print(f" du/dy = {du_dy:.6f} -dv/dx = {-dv_dx:.6f} → égaux : {abs(du_dy + dv_dx) < 1e-5}")
# Visualisation du module |f(z)| sur C
x = np.linspace(-2, 2, 300)
y = np.linspace(-2, 2, 300)
X, Y = np.meshgrid(x, y)
Z = (X + 1j*Y)**2
module = np.abs(Z)
plt.figure(figsize=(7, 6))
plt.contourf(X, Y, module, levels=30, cmap='plasma')
plt.colorbar(label='|f(z)| = |z²|')
plt.xlabel('Re(z)')
plt.ylabel('Im(z)')
plt.title('Module de f(z) = z² — fonction holomorphe\n(les lignes de niveau sont des cercles)')
plt.tight_layout()
plt.savefig("niveau2_holomorphie.png", dpi=150)
plt.show()
print("Graphique sauvegardé : niveau2_holomorphie.png")Théorème de Cauchy : Si
Intuition : une fonction holomorphe n'a "aucune information cachée" à l'intérieur — la valeur sur le bord détermine tout.
Conséquence directe : si
Ce que cela signifie : la valeur de
Toute fonction holomorphe est développable en série de Taylor :
Ce développement converge dans tout disque ne contenant pas de singularité.
Calculons
On paramétrise
La fonction
from mpmath import mp, mpc, exp, pi, quad, log, re, im
import numpy as np
import matplotlib.pyplot as plt
mp.dps = 15
def integrer_contour(f, centre, rayon, n_points=1000):
"""Intégrale numérique de f sur un cercle de centre et rayon donnés."""
thetas = np.linspace(0, 2*np.pi, n_points, endpoint=False)
dtheta = 2*np.pi / n_points
resultat = mpc(0)
for theta in thetas:
z = centre + rayon * exp(mpc(0, theta))
dz = mpc(0, 1) * rayon * exp(mpc(0, theta)) * dtheta
resultat += f(z) * dz
return resultat
# Test 1 : f(z) = 1/z → devrait donner 2πi
f1 = lambda z: 1/z
I1 = integrer_contour(f1, mpc(0,0), 1.0)
print(f"∮ 1/z dz sur |z|=1 :")
print(f" Résultat numérique : {float(re(I1)):.6f} + {float(im(I1)):.6f}i")
print(f" Valeur exacte : 0 + {float(2*pi):.6f}i (= 2πi)")
# Test 2 : f(z) = z² → devrait donner 0 (f holomorphe)
f2 = lambda z: z**2
I2 = integrer_contour(f2, mpc(0,0), 1.0)
print(f"\n∮ z² dz sur |z|=1 :")
print(f" Résultat numérique : {float(re(I2)):.2e} + {float(im(I2)):.2e}i")
print(f" Valeur exacte : 0 (théorème de Cauchy)")
# Test 3 : formule intégrale — récupérer f(z0) = z0² = (0.5+0.3i)²
z0 = mpc(0.5, 0.3)
f3 = lambda z: z**2 / (z - z0)
I3 = integrer_contour(f3, mpc(0,0), 1.0)
f_reconstitue = I3 / (2 * pi * mpc(0,1))
f_exact = z0**2
print(f"\nFormule intégrale de Cauchy pour f(z)=z², z0={z0}:")
print(f" f(z0) reconstruit : {float(re(f_reconstitue)):.6f} + {float(im(f_reconstitue)):.6f}i")
print(f" f(z0) exact : {float(re(f_exact)):.6f} + {float(im(f_exact)):.6f}i")Principe du prolongement analytique : si deux fonctions holomorphes
Conséquence : si une fonction holomorphe est connue sur un domaine
On part d'une série
convergente dans un disque centré en
Disque initial Nouveau disque
centré en z0 centré en z1
___________ ___________
/ \ / \
/ z0 \ z1 / \
| • |---•----| • |
\ / \ /
\___________|_____ \___________|
| prolongement
| vers un nouveau domaine
Un cas particulier important : si
C'est exactement la propriété qu'on utilise pour ζ : puisque
La série géométrique converge pour
La fonction
La série diverge pour
from mpmath import mp, mpc, fabs
import numpy as np
import matplotlib.pyplot as plt
mp.dps = 15
# Comparaison : somme partielle vs fonction prolongée 1/(1-z)
def serie_geometrique(z, N=50):
s = mpc(0)
zn = mpc(1)
for n in range(N):
s += zn
zn *= z
if fabs(zn) > 1e10: # divergence
return None
return s
x = np.linspace(-2, 2, 400)
y = np.linspace(-2, 2, 400)
X, Y = np.meshgrid(x, y)
Z_exact = 1.0 / (1.0 - (X + 1j*Y))
module_exact = np.abs(Z_exact)
module_exact = np.clip(module_exact, 0, 10)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# Prolongement analytique 1/(1-z)
ax1 = axes[0]
cf1 = ax1.contourf(X, Y, module_exact, levels=30, cmap='viridis')
plt.colorbar(cf1, ax=ax1, label='|1/(1-z)|')
circle = plt.Circle((0,0), 1, color='red', fill=False, linewidth=2, label='|z|=1 (bord de convergence)')
ax1.add_patch(circle)
ax1.plot(1, 0, 'r*', markersize=15, label='Pôle en z=1')
ax1.set_xlim(-2, 2)
ax1.set_ylim(-2, 2)
ax1.set_aspect('equal')
ax1.set_title('Prolongement analytique de Σzⁿ\nFonction 1/(1−z) sur C\\{1}')
ax1.set_xlabel('Re(z)')
ax1.set_ylabel('Im(z)')
ax1.legend(fontsize=8)
ax1.grid(True, alpha=0.2)
# Domaine de convergence de la série
ax2 = axes[1]
module_serie = np.where(X**2 + Y**2 < 1, module_exact, np.nan)
cf2 = ax2.contourf(X, Y, module_serie, levels=30, cmap='viridis')
plt.colorbar(cf2, ax=ax2, label='|Σzⁿ| (série tronquée)')
circle2 = plt.Circle((0,0), 1, color='red', fill=False, linewidth=2)
ax2.add_patch(circle2)
ax2.set_xlim(-2, 2)
ax2.set_ylim(-2, 2)
ax2.set_aspect('equal')
ax2.set_title('Série Σzⁿ — converge seulement\npour |z| < 1 (disque rouge)')
ax2.set_xlabel('Re(z)')
ax2.set_ylabel('Im(z)')
ax2.grid(True, alpha=0.2)
plt.tight_layout()
plt.savefig("niveau2_prolongement.png", dpi=150)
plt.show()
print("Graphique sauvegardé : niveau2_prolongement.png")La définition par série :
Pour
Une première façon d'étendre
où
Le prolongement à tout
Ce que cela signifie : connaître
La droite critique
| Région | Comportement de |
|---|---|
| Série convergente |
|
| Pôle simple, résidu |
|
| Zone critique — zéros non triviaux | |
| Droite critique — HR : tous les zéros y sont | |
| Zéros triviaux | |
| Défini par l'équation fonctionnelle |
Les valeurs de
La valeur
from mpmath import mp, mpc, zeta, re, im, fabs, log, pi
import numpy as np
import matplotlib.pyplot as plt
import warnings
mp.dps = 15
# Valeurs remarquables du prolongement
print("Valeurs de ζ(s) par prolongement analytique :")
print(f"{'s':<12} | {'Re(ζ(s))':>14} | {'Im(ζ(s))':>14} | Note")
print("-" * 65)
points = [
(mpc(2, 0), "ζ(2) = π²/6"),
(mpc(0, 0), "ζ(0) = -1/2"),
(mpc(-1, 0), "ζ(-1) = -1/12"),
(mpc(-2, 0), "ζ(-2) = 0 (zéro trivial)"),
(mpc(-3, 0), "ζ(-3) = 1/120"),
(mpc(0.5, 14.1347), "premier zéro non trivial"),
]
for s, note in points:
try:
val = zeta(s)
print(f"s={s!r:<10} | {float(re(val)):>+14.6f} | {float(im(val)):>+14.6f} | {note}")
except Exception:
print(f"s={s!r:<10} | {'(pôle)':>14} | {'':>14} | {note}")
# Carte du module |ζ(s)| dans la bande critique
sigma = np.linspace(-1, 3, 400)
t = np.linspace(0.5, 40, 400)
S, T = np.meshgrid(sigma, t)
module = np.zeros_like(S)
for i in range(len(t)):
for j in range(len(sigma)):
try:
val = zeta(mpc(S[i,j], T[i,j]))
module[i,j] = min(float(fabs(val)), 5)
except Exception:
module[i,j] = 5
fig, ax = plt.subplots(figsize=(10, 7))
cf = ax.contourf(S, T, module, levels=40, cmap='hot_r')
plt.colorbar(cf, ax=ax, label='|ζ(s)| (écrêté à 5)')
# Droite critique
ax.axvline(0.5, color='cyan', linewidth=2, linestyle='--', label='Droite critique Re(s)=1/2')
# Bord de convergence de la série
ax.axvline(1.0, color='lime', linewidth=2, linestyle='--', label='Re(s)=1 (bord série)')
# Zéros connus
zeros_t = [14.1347, 21.0220, 25.0109, 30.4249, 32.9351]
for t_zero in zeros_t:
ax.plot(0.5, t_zero, 'b*', markersize=12)
ax.plot([], [], 'b*', markersize=12, label='Zéros non triviaux')
ax.set_xlabel('Re(s) = σ', fontsize=12)
ax.set_ylabel('Im(s) = t', fontsize=12)
ax.set_title('Module |ζ(s)| dans la bande 0 < Re(s) < 1\nProlongement analytique au-delà de Re(s) > 1', fontsize=11)
ax.legend(loc='upper right', fontsize=9)
ax.grid(True, alpha=0.2)
plt.tight_layout()
plt.savefig("niveau2_zeta_bande_critique.png", dpi=150)
plt.show()
print("Graphique sauvegardé : niveau2_zeta_bande_critique.png")Vérifiez à la main que
Indication :
Calculez numériquement
Indication : la fonction a des pôles en integrer_contour du code de la Partie 2 et comparez au résultat théorique.
Calculez
et vérifiez que vous obtenez
from mpmath import mp, zeta, pi, gamma, sin
mp.dps = 15
s = -1
val = 2**s * pi**(s-1) * sin(pi*s/2) * gamma(1-s) * zeta(1-s)
print(f"ζ(-1) via équation fonctionnelle = {float(val):.8f}")
print(f"ζ(-1) via mpmath directement = {float(zeta(-1)):.8f}")Vérifiez numériquement que
from mpmath import mp, mpc, zeta
mp.dps = 20
s = mpc(0.5, 14.134725141734693)
print(f"|ζ(1/2 + 14.13...i)| = {abs(zeta(s)):.2e}")graph TD
A["Fonction holomorphe\nf'(z) existe pour tout z"] --> B["Conditions Cauchy-Riemann\n∂u/∂x = ∂v/∂y"]
A --> C["Développable en série entière"]
C --> D["Théorème de Cauchy\n∮ f dz = 0"]
D --> E["Formule intégrale\nf(z0) = 1/(2πi) ∮ f(z)/(z-z0) dz"]
E --> F["Principe de prolongement\nanalytique — unicité"]
F --> G["ζ(s) = Σ 1/nˢ pour Re(s) > 1"]
G --> H["Pôle simple en s=1"]
G --> I["Prolongement à C\\{1}"]
I --> J["Équation fonctionnelle\nζ(s) = 2ˢπˢ⁻¹ sin(πs/2) Γ(1-s) ζ(1-s)"]
J --> K["Symétrie autour de Re(s)=1/2"]
K --> L["Zéros non triviaux\ndans 0 < Re(s) < 1"]
L --> M["Hypothèse de Riemann :\ntous sur Re(s) = 1/2"]
| Concept | Formule | Rôle dans ζ |
|---|---|---|
| Holomorphie | ζ(s) est holomorphe pour Re(s) > 1 | |
| Cauchy-Riemann |
|
Condition équivalente à l'holomorphie |
| Théorème de Cauchy | Régularité globale des fonctions holomorphes | |
| Formule intégrale | Base du prolongement analytique | |
| Prolongement | Unicité de l'extension holomorphe | ζ(s) défini sur |
| Équation fonctionnelle | Symétrie autour de Re(s) = 1/2 | |
| Pôle de ζ | Seule singularité de ζ sur |
Prochaine session : Fonction Γ et séries de Dirichlet — vers la démonstration de l'équation fonctionnelle de
Dernière mise à jour : 22 mai 2026 — 518 lignes