normalizeSign
Flips the sign of v in place, if needed, so that its largest-magnitude component is positive. Eigenvectors are only defined up to sign; this picks a canonical one so that repeated extraction (across seeds, resolutions, or re-runs) doesn't flip a mode's polarity arbitrarily.
Domains with a reflection symmetry (a rectangle, a circle, a symmetric star, ...) produce antisymmetric modes whose two largest-magnitude components are an exact mirrored pair of opposite sign -- an inherent tie, not just a numerical coincidence. Picking the single largest component in that case would let tiny solver noise decide the sign at random, so instead this breaks such (near-)ties deterministically by lowest index.