Testo. Nel grafo casuale G(n,p) ogni coppia di vertici è collegata con probabilità p, indipendentemente. X è il numero di triangoli.
Calcolare E[X] e, con la formula della varianza di una somma, Var(X).
Per n=50 e p=0,01 limitare P(X≥1) con Markov.
Per n=50 e p=0,05, poi p=0,2, limitare dal basso P(X>0) con il secondo momento.
Perché la soglia è p≈1/n?
Soluzione
1. Media e varianza.X=∑TIT sui (3n) triangoli T possibili; IT=1 se i 3 archi sono presenti: E[IT]=p3, Var(IT)=p3−p6 e E[X]=(3n)p3.
Covarianze: due triangoli distinti hanno in comune al più due vertici, quindi al più un arco.
Nessun arco in comune: IT,IT′ dipendono da archi diversi, quindi sono indipendenti, covarianza 0.
Un arco in comune: gli archi distinti sono 3+3−1=5, E[ITIT′]=p5 e Cov=p5−p6. Le coppie ordinate (T,T′) di questo tipo sono (2n)(n−2)(n−3): l'arco comune, poi il terzo vertice di T (n−2 scelte) e quello di T′ (diverso dal primo, n−3 scelte).
Var(X)=(3n)(p3−p6)+(2n)(n−2)(n−3)(p5−p6).
(Verificata per enumerazione di tutti i grafi: per n=5, p=21: E[X]=45, Var(X)=3265; n=5, p=51: 252 e 3125296; n=6, p=31: 2720 e 729880.)
2. Markov, n=50, p=0,01.E[X]=(350)⋅10−6=19600⋅10−6=0,0196. Poiché X è intero, P(X≥1)≤E[X]=0,0196 (simulazione: 0,017). Triangoli praticamente assenti. Il secondo momento qui non serve: Var(X)/E[X]2=51,7.
3. Secondo momento.
p=0,05: E[X]=19600⋅1,25×10−4=2,45. Secondo termine: (250)(48)(47)=1225⋅2256=2763600 coppie, per p5−p6=3,125×10−7−1,5625×10−8=2,969×10−7: 0,8205. Primo termine: 2,45(1−1,25×10−4)=2,4497. Var(X)=3,2701. Allora E[X2]=3,2701+2,452=9,2726 e
P(X>0)≥E[X2]E[X]2=9,27266,0025=0.647.
La simulazione (4000 grafi) dà P(X>0)=0,873.
p=0,2: E[X]=156,8, Var(X)=863,0, rapporto Var/E2=0,0351: P(X=0)≤0,0351 (Chebyshev) e P(X>0)≥0,966. In simulazione non si osserva nessun grafo senza triangoli.
4. Soglia. Per n grande, (3n)p3≈6n3p3 e (2n)(n−2)(n−3)≈2n4, quindi
E[X]2Var(X)≈n3p36+n6p6/36n4p5/2=(np)36+n2p18.
Se np→∞ entrambi i termini tendono a 0 e P(X=0)→0: i triangoli ci sono con probabilità →1. Se np→0 è E[X]→0 e per Markov P(X≥1)→0. La transizione sta a p≈1/n.
import math, itertools
from fractions import Fraction as F
defstat(n, p):
E = math.comb(n, 3) * p**3
V = E * (1 - p**3) + math.comb(n, 2) * (n - 2) * (n - 3) * (p**5 - p**6)
return E, V
for p in (0.01, 0.05, 0.2):
E, V = stat(50, p)
print(p, E, V, V / E**2, E * E / (V + E * E))
# controllo per enumerazione di tutti i grafi su 5 vertici
n, p = 5, F(1, 2)
edges = list(itertools.combinations(range(n), 2)); idx = {e: i for i, e inenumerate(edges)}
tris = list(itertools.combinations(range(n), 3))
EX = EX2 = F(0)
for mask inrange(1 << len(edges)):
k = bin(mask).count("1"); w = p**k * (1 - p)**(len(edges) - k)
x = sum(all(mask >> idx[e] & 1for e in itertools.combinations(t, 2)) for t in tris)
EX += w * x; EX2 += w * x * x
print(EX, EX2 - EX**2, stat(n, p)) # 5/4 65/32