theorem laplacianQF_zero_iff_blockConstant (net : ComplementarityNetwork J)
(hw : ∀ j k, 0 ≤ net.w j k) (v : Fin J → ℝ) :
laplacianQF net v = 0 ↔
∀ j k, net.w j k > 0 → v j = v k := by
simp only [laplacianQF]
-- (1/2) * S = 0 ↔ S = 0 since 1/2 > 0
have half_ne : (1 / 2 : ℝ) ≠ 0 := by norm_num
rw [mul_eq_zero, or_iff_right_of_imp (fun h => absurd h half_ne)]
-- S = Σ_j Σ_k w_{jk}(v_j-v_k)² = 0 ↔ each term = 0
have hterm : ∀ j k, (0 : ℝ) ≤ net.w j k * (v j - v k) ^ 2 :=
fun j k => mul_nonneg (hw j k) (sq_nonneg _)
rw [Finset.sum_eq_zero_iff_of_nonneg (fun j _ =>
Finset.sum_nonneg (fun k _ => hterm j k))]
constructor
· -- Forward: all inner sums = 0 → for w > 0, v_j = v_k
intro hzero j k hwjk
have := hzero j (Finset.mem_univ j)
rw [Finset.sum_eq_zero_iff_of_nonneg (fun k _ => hterm j k)] at this
have := this k (Finset.mem_univ k)
-- w_{jk} * (v_j - v_k)² = 0 with w_{jk} > 0 → (v_j - v_k)² = 0
rcases mul_eq_zero.mp this with h | h
· linarith
· rwa [sq_eq_zero_iff, sub_eq_zero] at h
· -- Backward: block constant → each term = 0
intro hconst j _
apply Finset.sum_eq_zero
intro k _
by_cases hwjk : net.w j k > 0
· rw [hconst j k hwjk, sub_self, sq, mul_zero, mul_zero]
· push_neg at hwjk
have : net.w j k = 0 := le_antisymm hwjk (hw j k)
rw [this, zero_mul]CES on Networks: Heterogeneous Pairwise Complementarity