Polynomial Lemniscates

Interactive figure

To activate the interactive figure, place the cursor anywhere in the cell with the bold Manipulate code and type Shift+Enter.

Manipulate[ContourPlot[sumprod[EuclideanDistance[{x,y},pts[[i]]],{i,1,Length[pts]}]==a,{x,-3,3},{y,-3,3},PerformanceGoal->"Quality",Frame->False,ImageSize->Medium,Background->White,ContourLabels->None],
{{sumprod,Product,"locus type"},{Sum->"ellipse",Product->"lemniscate"},ControlPlacement->Top},
{{a,1,"contour level"},0,maxcontour,.001,Appearance->"Labeled",ControlPlacement->Top},
{{pts,{{0,0}}},Locator,Appearance->•,LocatorAutoCreate->True},Column[{"add/remove points",Row[{Button["add origin",AppendTo[pts,{0,0}]],"  or Alt+Click"}]}],
Column[{" ","arrange points   ",Button["unit circle",{pts={{0,0}},a=1.}],Button["roots of unity",pts=makeRoots[Length[pts]]]}],
ControlPlacement->Right,Initialization:>{makeRoots[n_]:=Table[{Re[Exp[2Pi I k/n]],Im[Exp[2 Pi I k/n]]},{k,0,n-1}],maxcontour:=6}]

Caption

Choose n points (Subscript[a, 1]),…,(Subscript[a, n]) in the complex plane (Alt+Click to add points to the figure).

With the lemniscate setting, this figure shows the locus of points z such that the product of the distances to each of the chosen points is equal to a constant c (the contour level), i.e. {z : |z-(Subscript[a, 1])|×⋯×|z-(Subscript[a, n])|=c}.  See how the contour level and configuration of points (click and drag to rearrange points) affect the number of connected components of the complement of the lemniscate.

For comparison, the ellipse setting shows the locus of points z such that the sum of the distances to each of the chosen points is equal to a constant c (the contour level), i.e. {z : |z-(Subscript[a, 1])|+⋯+|z-(Subscript[a, n])|=c}.

Note: This notebook is inspired by exercise V.8.40 in An Introduction to Complex Function Theory by Palka.

Snapshots