import numpy as np
def rapport_racines_reelles_bornes(M, n=1e8):
nb_total = 0
nb_reelles = 0
while n>0:
m = min(100000,n)
n -= m
# Tirage de b dans [-2M, 2M] et de c dans [-M^2, M^2]
b = np.random.uniform(-2*M, 2*M, m)
c = np.random.uniform(-M**2, M**2, m)
delta = b**2 - 4*c
# Calcul des racines réels ou complexes
rac1 = (-b + np.sqrt(delta + 0j)) / 2
rac2 = (-b - np.sqrt(delta + 0j)) / 2
# selection des index de racines de module <= M
mask_module = (np.abs(rac1) <= M) & (np.abs(rac2) <= M)
# selecton des réelles parmi elles
mask_reeles = (delta >= 0) & mask_module
# nombre de racines de module <= M
nb_total += np.sum(mask_module)
# nombre de racines réeles de module <= M
nb_reelles += np.sum(mask_reeles)
rapport = nb_reelles / nb_total if nb_total > 0 else np.nan
return rapport
# Exemple d'utilisation
M = 0.0001
while M<1e6:
print(f"Rapport racines réelles / toutes racines dans le domaine borné (M={M}) : {rapport_racines_reelles_bornes(M):.4f}")
M = M*10