Hi, blog post author here! (I saw some traffic from here and figured it'd be an interesting discussion.) This is an interesting question! I don't know of any proof in a textbook, but it seems that with a little thought (and mild restrictions on the path) it can be proven.
swampwiz said:
I can see how it works for the case of a quadratic polynomial, since there is only a single combinational pair, and the polar angle of the vector must make a net sweep of 180 degrees (i.e, in one of the directions), and so the polar angle for the discriminant must make a net sweep of 360 degrees. However, I don't see how this can be extended to the case of the cubic or higher polynomial.
Your intuition is on the right track with thinking about the polar angle of the difference vector in the quadratic case. You basically want to calculate the
winding number of the curve traced out by the discriminant around ##0##, which must be a closed curve since any swap leaves the set of roots unchanged.
Now in order to talk about the winding number of a curve around ##0##, we must stipulate that ##0## not be in the image of the curve; in other words, the polynomial must have no repeated roots, and furthermore any path chosen to swap two roots must not cause any root to coincide with any other root.
So cribbing from Wikipedia, one definition of the winding number around ##0## of a "nice" curve ##๐พ : [0, 1] โ \mathbb{C}##, which here we take to mean that it's continuous and doesn't pass through ##0##, is
$$n_๐พ = \frac{๐_๐พ(1) - ๐_๐พ(0)}{2๐}\text{,}$$ where ##๐_๐พ(t) := \operatorname{arg}(๐พ(t))##.
In particular, for a quadratic function with distinct roots ##r_1## and ##r_2##, let ##๐พ_1(t)## and ##๐พ_2(t)## be the continuous curves swapping ##r_1## and ##r_2## such that ##๐พ_1(t) โ ๐พ_2(t)##, and let ##๐ฅ(t) = ๐พ_1(t) - ๐พ_2(t)##. Since ##๐ฅ(1) = -๐ฅ(0)##, ##๐_๐ฅ(1) - ๐_๐ฅ(0)## must be ##๐(1 + 2k)## for some integer ##k##, and thus for the curve ##๐ฅ^2## traced out by the discriminant, which must be a nice curve, ##๐_{๐ฅ^2}(1) - ๐_{๐ฅ^2}(0) = 2๐(1 + 2k)##, and thus ##๐ฅ^2## must have winding number ##1 + 2k## for some integer ##k##, i.e. an odd integer.
(You can generate any winding number by making ##r_1## and ##r_2## "circle" around each other ##k## times before swapping.)
In particular, ##n_{๐ฅ^2} โ 0##, and thus the discriminant must loop around the origin at least once.
swampwiz said:
OK, I've figured it out. With respect to the discriminant, which is simply the product of the squares of the vectors of every combination of the roots, the vectors have either 0, 1 or both of the swapped roots. Those with 0 of them are simply constant. Those with 1 end up with the same vectors at the end (i.e., the swap), although there could be some fluctuation of the net polar angle depending on exactly the paths of the swapping. There is only one vector with both, and the result is that that vector does a 180 degree sweep, which means the square of it does a 360 degree sweep, thus the loop! Those with 1 could cause there to be additional loops, but in the end those loops will unwind, leaving on the single one.
As for the general case, you're also on the right track in considering the vectors between every root pair. The key tool in this case is
additivity of winding numbers in ##\mathbb{C}## around ##0##, namely that if ##n_๐ผ## and ##n_๐ฝ## are winding numbers around ##0## of nice curves ##๐ผ##, ##๐ฝ##, then ##๐ผ๐ฝ## is also a nice curve with winding number ##n_{๐ผ๐ฝ} = n_๐ผ + n_๐ฝ## around ##0##. (See
this StackExchange question for a proof.)
So given a polynomial with distinct roots ##r_1, \dotsc, r_n## where we want to swap ##r_1## and ##r_2##, we can ignore the vectors from ##r_i## to ##r_j## with ##i, j > 2##, since those contribute only a constant factor to the discriminant. The winding number of the square of the curve of the vector from ##r_1## to ##r_2## is odd, by the above. So all that remains is to consider the curves traced out from a root ##r_i## with ##i > 2## to ##r_1## and ##r_2##.
Letting ##๐พ_1## and ##๐พ_2## be the curves swapping ##r_1## and ##r_2## as above, let ##๐พ_i(t) = (r_i - ๐พ_1(t))(r_i - ๐พ_2(t))##, which is thus a nice curve. Therefore, it has some winding number ##n_๐พ## around ##0##. But the curve traced out by the discriminant has a factor of ##๐พ_i^2##, and thus by additivity ##n_{๐พ_i^2} = 2n_{๐พ_i}## is an even integer.
Therefore, again by additivity, the discriminant curve is a nice curve with winding number around ##0## equal to the sum of an odd integer and some number of even integers, i.e. an odd integer, and thus the discriminant must loop around the origin at least once.
(I'll address pasmith's and Office_Shredder's comments in another post. This one is already long!)