{'fraction_non_alphanumeric': 0.052620718118035495, 'fraction_numerical': 0.00873572706011831, 'mean_word_length': 3.9604230638007505, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
A Visualizable, Constructive Proof of the Fundamental Theorem of Algebra, and a Parallel Polynomial Root Estimation Algorithm

This paper presents an alternative proof of the Fundamental Theorem of Algebra that has several distinct advantages. The proof is based on simple ideas involving continuity and differentiation. Visual software demonstrations can be used to convey the gist of the proof. A rigorous and basic properties of complex numbers, but the technical details are somewhat involved. In order to facilitate the reader's intuitive grasp of the proof, we first present the main points of the argument, which can be illustrated by computer experiments. Next we fill in some of the details of the rigorous proof. Finally, we give a numerical procedure for finding all roots of an nth degree polynomial by solving 2n differential equations in parallel.


Introduction
The fundamental theorem of algebra states that any polynomial function from the complex numbers to the complex numbers with complex coefficients has at least one root. There are several proofs of the fundamental theorem of algebra, which employ a number of different domains of mathematics, including complex analysis (Liouville's theorem, Cauchy's integral theorem or the mean value property) ( [9] [11], topology (Brouwer's fixed point theorem) [1], differential topology [6], calculus ( [4], [9]), and "elementary" methods using meshes or lattices [8], [2] (for easily-accessible and readable web references, see [5], [10], [7], [3]). Many of these proofs are beautiful and elegant. Most are not constructive and do not provide a practical method for finding roots ( [8] and [2] are exceptions). The proof we present here is both constructive, and provides a practical method for finding all roots of any polynomial through the numerical solution of differential equations with different initial conditions. Furthermore, we have created a simple, intuitive visual display that demonstrates the construction of roots.

Empirical observations from computer experiments
Consider the polynomial f (z) = N n=0 a n z n , where N is a positive integer and a n are complex. We want to show that f (z) = 0 has at least one complex solution. To approach this problem, we make some preliminary empirical observations on the behavior of polynomial functions.
First we may consider how f (z) behaves for some specific values of z. When z = 0 we have f (z) = a 0 , and when z has a very large magnitude then the terms a n z n in f (z) also have large magnitudes, especially the leading-order term a N z N . To understand the behavior of f (z) between these two extremes, we isolate the behavior of f (z) for different values of |z|, as described below.
A complex number can be written in polar form as z = re iθ , where r > 0 is the magnitude of z and 0 ≤ θ < 2π. If we fix r and allow θ to vary, then the set of points {re iθ , 0 ≤ θ < 2π} is a circle of radius r in the complex plane, which we denote as C r . Since the function f is defined on all complex numbers, in particular it is defined on each circle C r . The image of C r under f is also a set (a curve, actually) in the complex plane, which we may denote as f (C r ).
Using computer software, we may investigate the changes in the shape of f (C r ) as r increases from 0, for different polynomials f (z). For this purpose, an R Shiny code (listed in the Appendix) was developed that displays f (C r ) and C r as well as upcrossings and downcrossings, for any given value of r for an arbitrary polynomial with complex coefficients, as specified by the user. A screenshot of the interface is shown in Figure 1. A sequence of f (C r ) plots for different values of r is shown in Figure 2.
Without loss of generality we may assume a 0 = −1: given any polynomial with a 0 = 0 we may obtain a polynomial with the same roots and having constant coefficient −1 by dividing by −a 0 . If we look at several different polynomials f and see how the curve f (C r ) evolves as r increases, we may make the following observations: (i) When r is sufficiently small, then f (C r ) has a nearly circular shape with where a1 = 1.6(1 + i), a2 = 1.7(−1 + i), a3 = 1.5(−1 − i). The solid blue dots indicate upcrossings (which move to the right), while the hollow red dots indicate downcrossings (which move to the left). A new downcrossing-upcrossing pair is introduced when r ≈ 1.75 (as a lobe in the upper half plane expands down across the real axs) and another pair is introduced when 1.75 < r < 2 (when a lobe in the lower half plane expands up across the real axis). Roots are found at upcrossings for r ≈ 2.15, 2.25, 2.4.
center −1 and small radius. The curve f (C r ) has multiple intersections with the real axis.
(ii) As r increases, these points of intersection betwee f (C r ) and the real axis move continuously along the real axis (although sometimes they disappear: see point (v) below) (iii) There are two types of intersections: some move consistently to the right as r increases, and others move consistently to the left. When r is small, the rightmost intersection is always rightward-moving.
(iv) New intersections with the x axis may appear as r increases. From a geometrical viewpoint, these new intersections occur when a lobe of f (C r ) located in the upper (resp. lower) half-plane shfts downward (resp. upward) as r increases so that it intersects the axis. These new intersections always appear first as a single point that splits into a left-moving and right-moving intersection as r increases.
(v) A right-moving intersection continues to move to the right unless it runs into a left-moving intersection, in which case both intersections may disappear. From the two-dimensional viewpoint, this occurs when a lobe of f (C r ) that intersects the real axis moves above or below the axis.
(vi) When r is very large, the shape of f (C r ) approaches a large circle centered at the origin. In particular, the rightmost intersection between f (C r ) and the real axis is large and positive.
(vii) The rightmost intersection when r is small is always continuously connected to the rightmost intersection when r is large by a series of rightmoving or left-moving intersections. Since the origin is on the real axis between these two intersections, the origin must be either a right-moving or left-moving intersection for some value of r.
To understand the difference between right-moving and left-moving intersections, we may look more closely into the nature of the curve f (C r ). As we mentioned above, the circle C r is parametrized by the angle θ. As θ increases, the corresponding point on C r (given by re iθ ) moves counterclockwise around C r , while the image of the point under the function f (given by f (re iθ traces out the curve f (C r ). As the tracing point crosses the real axis, we find there are two types of crossings: either upcrossings (from below to above), or downcrossings (from above to below). It may be observed experimentally (and we shall soon show mathematically) that the upcrossings correspond to the rightwardmoving intersection points as noted above, and downcrossings correspond to leftward-moving intersection points.
We may summarize a systematic procedure for using the software to locate roots of f : (I) Ensure that a 0 = −1 by dividing f by −a 0 (if a 0 = 0, then 0 is a root already); (II) Start with a small value of r and locate an upcrossing point on C r ; (III) Follow the upcrossing point as it moves rightward. Eventually it will either pass over the origin, or run into a leftward-moving downcrossing point and disappear.
(IV) If the latter holds, follow the leftward moving point backwards (i.e. decreasing r). Eventually, either it will pass over the origin, or it will merge with a rightward-moving point and disappear.
(V) Follow this rightward-moving point forward (increasing r) until it either passes through the origin or merges with a leftward-moving point.
(VI) Continue iterating Steps IV and V until the origin is reached.

Outline of a formal proof
This procedure is the basis for a formal proof of the theorem. Some of the technical detals are rather involved, but the guiding intuition is captured by the procedure described above. The proof proceeds in several steps: 1. The roots of f (z) are identical to the roots of −f (z)/a 0 . So without loss of generality, we may assume that the constant coefficient a 0 is equal to −1.
2. Assume for the moment that f (z) has no zeros on the real axis between −1 and 0. (Later we will deal with the case where this is not true.) 3. For any value of r > 0, we define the curve f r (t) ≡ f (re it ), 0 ≤ t ≤ 2π. Since f r (0) = f r (2π), it follows that this is a closed (possibly selfintersecting) curve in the complex plane.
4. Denote by upcrossing (resp. downcrossing) a point where f r crosses the real axis from below (resp. above). In other words, the real number x is an upcrossing for f r if there exists t such that f r (t) = x, and there exists δ > 0 such that Imf r (s) ≤ 0 for t − δ ≤ s ≤ t and Imf r (s) ≥ 0 for t ≤ s ≤ t + δ. By continuity, every root of Imf r is either an upcrossing, a downcrossing, or a point where the real line is tangent to f r .

Suppose
x r = f r (t) is an upcrossing and f r (t) = 0, then the crossing point moves continuously to the right as a function of r. More precisely, there exist , δ > 0 and a continuous, real-valued function g(s) that is strictly increasing on the interval r − < s < r + such that g(r) = x r and g(s) = f s (t ), for some t in the interval t − δ < t < t + δ. We call the function g an upcrossing function. A similar statement holds for the downcrossing case, except that g is decreasing: the function g in this case is called a downcrossing function).
6. The domain of any upcrossing function g may be extended to an open interval, such that either the range of g includes the origin, or the right endpoint b of the domain is such that g(b) is a point of tangency of the curve f b .
7. Every point of tangency that is the right endpoint of the domain of an upcrossing function is the left endpoint of the domain of a downcrossing function.
8. Every point in the interval [−1, 0] is either an upcrossing, a downcrossing, or a point of tangency of f r for some positive value of r. In particular, the origin is either an upcrossing, downcrossing, or point of tangency, and is thus equal to f (re it ) for some values of r and t.
Steps , we may consider the ray θ = π + ν, for sufficiently small ν, which (by continuity) will have at least one upcrossing intersection with C r if r, ν are sufficiently small. We denote this intersection as z. Since the roots of f are isolated, we can also choose the ν such that f has no roots on the ray. We may then consider the function f (z) ≡ f (z)e −iν . Then ze −iν is an upcrossing point for f of the negative real axis. Steps (1-8) above then goes through for f : and the roots of f are identical with the roots of f .

Parallel numerical procedure for finding all roots of a polynomial
As above, we suppose f (z) = N n=1 a n z n with a 0 = −1, where z = re iθ . We seek equations satisfied by upcrossing locations x as a function of r. Note that in order for x = f (re iθ ) to be an upcrossing, the complex argument θ varies as r varies, so we must consider both θ and x as functions of r. To make this clear, we will use φ = φ(r) to denote the complex argument, so that x(r) = f (z(r)) where z(r) = re iφ .
Using the chain rule, we have: Since x is real-valued, so dx dr is also a real function and dx dr = dx dr * , where * denotes complex conjugate. This gives Solving for r dφ dr , we obtain where we have replaced z with re iφ(r) to highlight the r dependence. From (1) and (3) we may calculate: |f (re iφ(r) )e iφ(r) | 2 Re f re iφ(r) e iφ(r) Equations (3) and (4) express dφ dr and dx dr respectively in terms of f re iφ(r) e iφ(r) . Fortunately, this rather complicated expression turns out to have a relatively simple interpretation. The definition of f r implies that d dθ f r (θ) = f (re iθ )(ie iθ ), so if we define: then we may re-express the system (3)-(4) as: r Re (−iα(r)) = Re (α(r)) r Im (α(r)) ; For future reference, note that Im(α(r)) is positive or negative depending on whether x(r) is an upcrossing or downcrossing. Alternatively, we can pose the system such that θ is the independent variable, and r, x are the dependent variables. To clarify the dependence of r on θ, we use ρ = ρ(θ) here to represent the complex modulus as a function of θ, so that f ρ (ρe iθ ) is an upcrossing point for the curve C ρ . In analogy to (5), we define: and in analogy to (6) we obtain: Im (−iβ(θ)) = Im (β(θ)) Re (β(θ)) ; It follows that given a crossing point x = f r (θ), we can always make the crossing point 'move' continuously to the right by following this strategy: 1. If lim z→re iθ | Imf (re iθ )/ Ref (re iθ )| > c (where c < 1 is a fixed positive parameter), then propagate x to the right using (6) with either increasing or decreasing r, depending on the sign of Imf (re iθ ): 2. Otherwise, propagate x to the right using (8) with either increasing or decreasing θ, depending on the sign of Imf (re iθ ).
Following this procedure will yield a monotonically increasing crossing point. If the initial crossing point is chosen such that it is chosen between −1 and 0 on the real axis, then eventually the crossing point will pass 0 and a root will be obtained.
The above procedure is only guaranteed to obtain a single root γ 1 . Subsequent roots may be estimated by taking f (1) (z) ≡ f (z)(1 − z/γ 1 ) −1 and finding another root γ 2 , then iterating the procedure with f (j) (z) ≡ f (z)(1 − z/γ j ) −1 , j = 1, 2, . . . until all roots are found. However, it is possible there may be numerical stability problems, because due to numerical error f (j) (z) is no longer a polynomial for j ≥ 1.
An alternative approach finds all roots in parallel as follows. If the polynomial has degree n, the z n term dominates the behavior of f (C r ) when r is large. It follows that for r sufficiently large, f (C r ) must have at least n upcrossings on the positive real axis and at least n downcrossings of the negative real axis. All upcrossings may be followed leftwards using the reverse of the rightward-tracking procedure described above; and all downcrossings may be followed rightward by a similar procedure. Not all of these 2n tracks (which may be computed in parallel) will result in a root; however, it is guaranteed that all n roots will be obtained through the procedure.