Abstract
In complex analysis, the winding number measures the number of times a path (counter-clockwise) winds around a point, while the Cauchy index can approximate how the path winds. We formalise this approximation in the Isabelle theorem prover, and provide a tactic to evaluate winding numbers through Cauchy indices. By further combining this approximation with the argument principle, we are able to make use of remainder sequences to effectively count the number of complex roots of a polynomial within some domains, such as a rectangular box and a half-plane.
Keywords: Interactive theorem proving, Isabelle/HOL, Computer algebra, Cauchy index, Winding number, Root counting, The Routh–Hurwitz stability criterion
Introduction
The winding number, given by
measures how the path winds around the complex point z. It is an important object in complex analysis, and its evaluation is ubiquitous among analytic proofs.
However, when formally evaluating the winding number in proof assistants such as Isabelle/HOL and HOL Light, unexpected difficulties arise, as pointed out by Harrison [8] and Li et al. [14]. To address this problem, we formalise a theory of the Cauchy index on the complex plane, thereby approximating how the path winds. When the path is a cycle and comprises line segments and parts of circles, we can now evaluate the winding number by calculating Cauchy indices along those sub-paths.
In addition, by further combining our previous formalisation of the argument principle [14] (which associates the winding number with the number of complex roots), we build effective procedures to count the complex roots of a polynomial within some domains, such as a rectangle box and a half-plane.
In short, the main contributions of this paper are
a novel tactic to enable users to evaluate the winding number through Cauchy indices,
and novel verified procedures to count complex roots of a polynomial.
The Isabelle sources of this paper are available from the Archive of Formal Proofs [11, 12].
Formulations in this paper, such as the definition of the Cauchy index and statements of some key lemmas, mainly follow Rahman and Schmeisser’s book [19, Chapter 11] and Eisermann’s paper [6]. Nevertheless, we were still obliged to devise some proofs on our own, as discussed later.
This paper continues as follows: we start with a motivating example (Sect. 2) to explain the difficulty of formal evaluation of the winding number in Isabelle/HOL. We then present an intuitive description of the link between the winding number and the Cauchy indices (Sect. 3), which is then developed formally (Sect. 4). Next, we present verified procedures that count the number of complex roots in a domain (Sect. 5), along with some limitations (Sect. 6) and make some general remarks on the formalisation (Sect. 7). Finally, we discuss related work (Sect. 8) and present conclusions (Sect. 9).
A Motivating Example
In the formalisation of Cauchy’s residue theorem [14], we demonstrated an application of this theorem to formally evaluate an improper integral in Isabelle/HOL:
| 1 |
The idea is to embed this integral into the complex plane, and, as illustrated in Fig. 1, to construct a linear path from to r and a semi-circular path centred at 0 with radius :
Next, by letting
and , we can derive (1) through the following steps:
| 2 |
| 3 |
| 4 |
| 5 |
Here is formed by appending to the end of , and is the residue of f at i. Equation (3) is because as . The application of the residue theorem is within (4); we exploit the fact that i and are the only two singularities of f over the complex plane, since
While carrying out the formal proofs of (5), surprisingly, the most troublesome part of the proof is to evaluate the winding numbers:
| 6 |
| 7 |
Equations (6) and (7) are straightforward to humans, as it can be seen from Fig. 1 that passes counterclockwise around the point i exactly one time, and around zero times. However, formally deriving these facts was non-trivial.
Fig. 1.
Complex points and (0, i), and a closed path
Example 1
(Proof of ) We defined an auxiliary semi-circular path where
as can be seen in Fig. 1a. As forms a (full) circular path with i lying inside the circle, we had
| 8 |
In addition, we further proved that and are homotopic on the space of the complex plane except for the point i (i.e., on ), and hence
| 9 |
by using the following Isabelle lemma:
Lemma 1
(
) 
where
encodes the winding number of around z: , and
encodes the homotopic proposition between two paths. Putting (8) and (9) together yields , which concludes the whole proof.
Example 2
(Proof of ) We started by defining a ray starting from and pointing towards the negative infinity of the imaginary axis:
as illustrated in Fig. 1b. Subsequently, we showed that
| 10 |
and then applied the following lemma in Isabelle
Lemma 2
where
assumes that is piecewise continuously differentiable on [0, 1],
asserts that z is not on the path ,the assumption
asserts that the ray starting at and through () does not intersect with —for all , does not lie on .
Note that the real part of a winding number measures the degree of the winding: in case of winding around z counterclockwise for exactly one turn, we have . Essentially, Lemma 2 claims that a path can only wind around z for less than one turn, , if there is a ray starting at z and not intersecting with . Joining Lemma 2 with (10) leads to
| 11 |
Moreover, as is a closed path,
| 12 |
By combining (11) and (12), we managed to derive .
As can be observed in Examples 1 and 2, our proofs of and were ad hoc, and involved the manual construction of auxiliary paths or rays (e.g., and ). Similar difficulties have also been mentioned by John Harrison when formalising the prime number theorem [8]. In the next section, we will introduce an idea to systematically evaluate winding numbers.
The Intuition
The fundamental idea of evaluating a winding number in this paper is to reduce the evaluation to classifications of how paths cross the line : continuously or not and in which direction.
In a simple case, suppose a path crosses the line exactly once at the point such that (see Fig. 2 (left)), and let be the change in the argument of a complex point travelling through . It should not be hard to observe that
and by considering we can have
which is an approximation of . That is, we have approximated by the way that crosses the line .
Fig. 2.
Left: a path crosses the line at such that . Right: the image of f as a point travels through
To make this idea more precise, let
The image of f as a point travels through is as illustrated in Fig. 2 (right), where f jumps from to across . We can then formally characterise those jumps.
Definition 1
(Jump) For and , we define
Specifically, we can conjecture that captures the way that crosses the line in Fig. 2, hence can be approximated using and :
In more general cases, we can define Cauchy indices by summing up these jumps over an interval and along a path.
Definition 2
(Cauchy index) For and , the Cauchy index of f over a closed interval [a, b] is defined as
Definition 3
(Cauchy index along a path) Given a path and a point , the Cauchy index along about is defined as
where
In particular, it can be checked that the Cauchy index captures the way that crosses the line , hence leads to an approximation of :
More interestingly, by further knowing that is a loop we can derive and , following which we come to the core proposition of this paper:
Proposition 1
Given a valid path and a point , such that is a loop and is not on the image of , we have
That is, under some assumptions, we can evaluate a winding number through Cauchy indices!
A formal proof of Proposition 1 will be introduced in Sect. 4.1. Here, given the statement of the proposition, we can have alternative proofs for and .
Example 3
(Alternative proof of ) As is a loop, applying Proposition 1 yields
which reduces to the evaluations of and . In this case, by definition we can easily decide and as illustrated in Fig. 3a. Hence, we have
and conclude the proof.
Fig. 3.
Evaluating and through the way that the path crosses the imaginary axis
Example 4
(Alternative proof of ) As shown in Fig. 3b, we can similarly have
by which the proof is completed.
Compared to the previous proofs presented in Examples 1 and 2, the alternative proofs in Examples 3 and 4 are systematic and less demanding to devise once we have a formalisation of Proposition 1, which is what we will introduce in the next section.
Evaluating Winding Numbers
The previous section presented an informal intuition to systematically evaluate winding numbers; in this section, we will report the formal development of this intuition. We will first present a mechanised proof of Proposition 1 (Sect. 4.1), which includes mechanised definitions of jumps and Cauchy indices (i.e., Definition 1, 2 and 3) and several related properties of these objects. After that, we build a tactic in Isabelle/HOL that is used to mechanise proofs presented in Example 3 and 4 (Sect. 4.2). Finally, we discuss some subtleties we encountered during the formalisation (Sect. 4.3).
A Formal Proof of Proposition 1
For and (see Definition 1), we have used the filter mechanism [9] to define a function
:
and encoded and as
and
,
respectively. Here,
,
,
, and
are all filters, where a filter is a predicate on predicates that satisfies certain properties. Filters are extensively used in the analysis library of Isabelle to encode varieties of logical quantification: for example,
encodes the statement “for a variable that is sufficiently close to x from the left", and
represents “for a sufficiently large variable". Furthermore,
encoded the proposition
| 13 |
and this encoding can be justified by the following equality in Isabelle:
where
matches the usual definition of (13) in textbooks.
We can then encode and (see Definitions 2 and 3) as
and
respectively: 
Note, in the definition of we have a term
which actually hides an assumption: that only a finite number of points within the interval [a, b) contribute to the sum. This assumption is made explicit when
is defined by summing jumps over the following set:
If the set above is infinite (i.e., the sum is not mathematically well-defined) we have
In other words, Isabelle/HOL deems the sum over an infinite set to denote zero.
Due to the issue of well-defined sums, many of our lemmas related to
should assume a finite number of jumps:
which guarantees the well-definedness of
.
Now, suppose that we know that is well-defined: there are only a finite number of jumps over the path. What strategy can we employ to formally prove Proposition 1? Naturally, we may want to divide the path into a finite number of segments (subpaths) separated by those jumps, and then perform inductions on these segments. To formalise the finiteness of such segments, we defined an inductive predicate: 
The idea behind
is that a jump of
takes place only if changes from 0 to (or vice versa). Hence, each of the segments of the path separated by those jumps has either or .
As can be expected, the finiteness of jumps over a path can be derived by the finiteness of segments:
Lemma 3
(
) 
where
asserts that is a continuous function on [0..1] (so that it is a path). Roughly speaking, Lemma 3 claims that a path will have a finite number of jumps if it can be divided into a finite number of segments.
By assuming such a finite number of segments we have well-defined
, and can then derive some useful related properties:
Lemma 4
where
gives a sub-path of based on parameters a and b: 
Essentially, Lemma 4 indicates that we can combine Cauchy indices along consecutive parts of a path: given a path and three parameters a, b, c with , we have
where , and .
More importantly, we now have an induction rule for a path with a finite number of segments:
Lemma 5
(
) 
where
is a predicate that takes a path
and a complex point
, and
is the base case that
holds for a constant path;
is the inductive case when the last segment is right on the line : ;
is the inductive case when the last segment does not cross the line : .
Given a path with a finite number of segments, a complex point and a predicate P that takes a path and a complex number and returns a boolean, Lemma 5 provides us with an inductive rule to derive by recursively examining the last segment.
Before attacking Proposition 1, we can show an auxiliary lemma about and when the end points of are on the line :
Lemma 6
(
) 
Here, Lemma 6 is almost equivalent to Proposition 1 except for that more restrictions haven been placed on the end points of .
Proof of Lemma 6
As there are a finite number of segments along (i.e.,
), by inducting on these segments with Lemma 5 we end up with three cases. The base case is straightforward: given a constant path and a complex point , we have and , hence .
For the inductive case when the last segment is right on the line , there is as illustrated in Fig. 4a. Let
We have
| 14 |
and, by the induction hypothesis,
| 15 |
Moreover, it is possible to derive
| 16 |
since and . Furthermore, by Lemma 4 we can sum up the Cauchy index along and :
| 17 |
Combining Eqs. (14), (15), (16) and (17) yields
| 18 |
which concludes the case.
Fig. 4.

Inductive cases when applying Lemma 5
For the other inductive case when the last segment does not cross the line , without loss of generality, we assume
| 19 |
and the shape of g is as illustrated in Fig. 4b. Similar to the previous case, by letting and , we have and, by the induction hypothesis, . Moreover, by observing the shape of we have
| 20 |
| 21 |
where . Combining (20) with (21) leads to , following which we finish the case by deriving in a way analogous to (18).
Finally, we are ready to formally derive Proposition 1 in Isabelle/HOL:
Theorem 1
(
) 
Proof
By assumption, we know that is a loop, and the point can be away from the line which makes Lemma 6 inapplicable. To resolve this problem, we look for a point on such that and , and we can either fail or succeed.
In the case of failure, without loss of generality, we can assume for all , and the shape of is as illustrated in Fig. 5a. As the path does not cross the line , we can evaluate
where is the principle value of a complex logarithm function with its branch being the negative real axis and for all z. Hence, which concludes the case.
Fig. 5.
To derive when is a loop
In the case of success, as illustrated in Fig. 5b, we have . We then define a shifted path :
such that . By applying Lemma 6, we obtain a relationship between and :
following which we have , since and .
A Tactic for Evaluating Winding Numbers
With Proposition 1 formalised, we are now able to build a tactic to evaluate winding numbers using Cauchy indices. The idea has already been sketched in Examples 3 and 4. We have built a tactic
, for goals of the form
| 22 |
where k is an integer and () is either a linear path:
or a part of a circular path:
The tactic
will transform (22) into
| 23 |
| 24 |
| 25 |
where (23) ensures that the path is a loop; (24) certifies that is not on the image of .
To achieve this transformation,
will first perform a substitution step on the left-hand side of Eq. (22) using Theorem 1. As the substitution is conditional, we will need to resolve four extra subgoals (i.e., (26), (27), (28) and (29) as follows) and Eq. (22) is transformed into (30):
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |
To simplify (26), the tactic will keep applying the following introduction rule:1
Lemma 7
to eliminate the path join operations (
) until the predicate
is only applied to a linear path or a part of a circular path, and either of these two cases can be directly discharged because these two kinds of paths are proved to be divisible into a finite number of segments by the imaginary axis:
Lemma 8
(
) ![]()
Lemma 9
(
) ![]()
In terms of other subgoals introduced when applying Lemma 7, such as
,
and
, we can discharge them by the following introduction and simplification rules (all of which have been formally proved):
,
,
,
,
.
As a result,
will eventually simplify the subgoal (26) to (23).
Similar to the process of simplifying (26) to (23), the tactic
will also simplify
Finally, with respect to (30), we can similarly rewrite with a rule between the Cauchy index (
) and the path join operation (
):
Lemma 10
to convert the subgoal (30) to (23) and (25).
After building the tactic
, we are now able to convert a goal like Eq. (22) to (23), (24) and (25). In most cases, discharging (23) and (24) is straightforward. To derive (25), we will need to formally evaluate each () when is either a linear path or a part of a circular path.
When is a linear path, the following lemma grants us a way to evaluate through its right-hand side:
Lemma 11
Although Lemma 11 may appear terrifying, evaluating its right-hand side is usually automatic when the number of free variables is small. For example, in a formal proof of Example 3 in Isabelle/HOL, we can have the following fragment:
where
is first applied to convert the goal into (23), (24) and (25), and
subsequently simplifies those newly generated subgoals. In the middle of the proof, we show that the complex point i is not on the image of the linear path (i.e.,
in Isabelle/HOL), following which we apply Lemma 11 to derive : the evaluation process is automatic through the command
, given the assumption
.
When is a part of a circular path, a similar lemma has been provided to facilitate the evaluation of .
Subtleties
The first subtlety we have encountered during the formalisation of Proposition 1 is about the definitions of jumps and Cauchy indices, for which our first attempt followed the standard definitions in textbooks [2, 16, 19].
Definition 4
(Jump) For and , we define
Definition 5
(Cauchy index) For and , the Cauchy index of f over an open interval (a, b) is defined as
The impact of the difference between the current definition of the Cauchy index (i.e., Definition 2) and the classic one (i.e., Definition 5) is small when formalising the Sturm–Tarski theorem [10, 13], where f is a rational function. In this case, the path intersects with the line a finite number of times, and for each intersection point (see Fig. 6a, b), by letting , we have
hence
provided and . That is, the classic Cauchy index and the current one are equal when f is a rational function and does not jump at both ends of the target interval.
Fig. 6.
Different ways a path can intersect with the line
Naturally, the disadvantages of Definition 5 are twofold:
The function cannot vanish at either end of the interval. That is, we need to additionally assume as in Rahman and Schmeisser’s formulation [19, Lemma 11.1.1 and Theorem 11.1.3], and Proposition 1 will be inapplicable in the case of Fig. 6c where .
- The function has to be rational, which makes Proposition 1 inapplicable for cases like in Fig. 6d (if we follow Definition 5). To elaborate, it can be observed in Fig. 6d that , while we will only get a wrong answer by following Definition 5 and evaluating via Proposition 1:
where . In comparison, Definition 2 leads to the correct answer:
Fortunately, Eisermann [6] recently proposed a new formulation of the Cauchy index that overcomes those two disadvantages, and this new formulation is what we have followed (in Definitions 1 and 2).
Another subtlety we ran into was the well-definedness of the Cauchy index. Such well-definedness is usually not an issue and left implicit in the literature, because, in most cases, the Cauchy index is only defined on rational functions, where only finitely many points can contribute to the sum. When attempting to formally derive Proposition 1, we realised that this assumption needed to be made explicit, since the path can be flexible enough to allow the function to be non-rational (e.g., Fig. 6d). In our first attempt of following Definition 5, the Cauchy index was formally defined as follows:
and its well-definedness was ensured by the finite number of times that crosses the line :
where the part
ensures that
is non-zero only at finitely many points over the interval [0, 1]. When constrained by
, the function behaves like a rational function. More importantly, the path , in this case, can be divided into a finite number of ordered segments delimited by those points over [0, 1], which makes an inductive proof of Proposition 1 possible. However, after abandoning our first attempt and switching to Definition 2, the well-definedness of the Cauchy index is assured by the finite number of and of f (i.e., Definition
in Sect. 4.1), with which we did not know how to divide the path into segments and carry out an inductive proof. It took us some time to properly define the assumption of a finite number of segments (i.e., Definition
) that implied the well-definedness using Lemma 3 and provided a lemma for inductive proofs (i.e., Lemma 5).
Counting the Number of Complex Roots
The previous section described a way to evaluate winding numbers via Cauchy indices. In this section, we will further explore this idea and propose verified procedures to count the number of complex roots of a polynomial in some domain such as a rectangle and a half-plane.
Does a winding number have anything to do with the number of roots of a polynomial? The answer is yes. Thanks to the argument principle, we can calculate the number of roots by evaluating a contour integral:
| 31 |
where , is the first derivative of p and N is the number of complex roots of p (counted with multiplicity) inside the loop . Also, by the definition of winding numbers, we have
| 32 |
Combining Eqs. (31) and (32) gives us the relationship between a winding number and the number of roots of a polynomial:
| 33 |
And the question becomes: can we evaluate via Cauchy indices?
Roots in a Rectangle
Let N be the number of complex roots of a polynomial p inside the rectangle defined by its lower left corner and upper right corner . As illustrated in Fig. 7, we can define four linear paths along the edge of the rectangle:
where and . Combining Proposition 1 with Eq. (33) yields
| 34 |
Here, the path () is (mostly) neither a linear path nor a part of a circular path, which indicates that the evaluation strategies of Sect. 4.2, such as Lemma 11, will no longer apply. Thankfully, the Sturm–Tarski theorem [10, 13] came to our rescue.
Fig. 7.

Complex roots of a polynomial (red dots) and a rectangular path () on the complex plane. (Color figure online)
In general, the Sturm–Tarski theorem is about calculating Tarski queries through sign variations and signed remainder sequences: let , a and b be two extended real numbers such that and are not roots of p, we have
| 35 |
where
is the first derivative of p,
- the Tarski query defined as follows:
is the signed remainder sequence started with p and q.
- Let be a sequence of polynomials, is the difference in the number of sign variations when evaluating at a and b:
36
Note that when , (35) becomes the famous Sturm’s theorem, which counts the number of distinct real roots over an interval. For example, by calculating
we know that the polynomial has two distinct real roots within the interval (0, 3).
In our previous formal proof of the Sturm–Tarski theorem [10, 13], we used the Cauchy index to relate the Tarski query and the right-hand side of (35). Therefore, as a byproduct, we can also evaluate the Cauchy index through sign variations and signed remainder sequences:
| 37 |
where , a, b are two extended real numbers such that and are not roots of p.
Back to the case of , we have
and both and happen to be polynomials with real coefficients. Therefore, combining Eqs. (34) and (37) yields an approach to count the number of roots inside a rectangle.
While proceeding to the formal development, the first problem we encountered was that the Cauchy index in Eq. (37) actually follows the classic definition (i.e., Definition 5), and is different from the one in Eq. (34) (i.e., Definitions 2 and 3). Subtle differences between these two formulations have already been discussed in Sect. 4.3. Luckily, Eisermann [6] has also described an alternative sign variation operator so that our current definition of the Cauchy index (i.e., Definition 2) can be computationally evaluated:
Lemma 12
Here,
encodes our current definition of the Cauchy index , and
stands for
| 38 |
where the alternative sign variation operator is defined as follows:
The difference between and is that discards zeros before calculating variations while takes zeros into consideration. For example, , while .
Before implementing Eq. (34), we need to realise that there is a restriction in our strategy: roots are not allowed on the border (i.e., the image of the path ). To computationally check this restriction, the following function is defined
which will return “true” if there is no root on the closed segment between
and
, and “false” otherwise. Here,
is defined as the set , and the function
gives the set of roots of the polynomial
within the set
: 
The next step is to make the definition
executable. This is achieved by proving a code equation, where the left-hand side of the equation is the target definition and the right-hand side is an executable expression. In the case of
, the code equation is the following lemma:
Lemma 13
where
is the polynomial composition operation and
and
, respectively, extract the real and imaginary parts of the complex polynomial
.
Proof of Lemma 13
Supposing is a linear path from a to b: , we know that is still a polynomial with complex coefficients. Subsequently, we extract the real and imaginary parts ( and , respectively) of such that
If there is a root of p lying right on L, we will be able to obtain some such that
hence, by letting we have . Therefore, the polynomial p has no (complex) root on L if and only if g has no (real) root within the interval [0, 1], and the latter can be computationally checked using Sturm’s theorem.
Finally, we define the function
that returns the number of complex roots of a polynomial (counted with multiplicity) within a rectangle defined by its lower left and upper right corner:
where
denotes the number of roots of the polynomial p within the set s:
The executability of the function
can be established with the following code equation:
Lemma 14
The proof of the above code equation roughly follows Eqs. (34) and (37), where
checks if there is a root of
on the rectangle’s border. Note that the gcd calculations here, such as
, are due to the coprime assumption in Lemma 12.
Example 5
Given a rectangle defined by (as illustrated in Fig. 8) and a polynomial p with complex coefficients:
we can now type the following command to count the number of roots within the rectangle:
which will return 2 as p has exactly two complex roots (i.e., i with multiplicity 2) in the area.
Fig. 8.

A complex point i and a rectangle defined by its lower left corner and upper right corner
Roots in a Half-plane
For roots in a half-plane, we can start with a simplified case, where we count the number of roots of a polynomial in the upper half-plane of :
As usual, our next step is to set up the executability of
. To achieve that, we first define a linear path and a semi-circular path , as illustrated in Fig. 9. Subsequently, let
and by following Eq. (33) we have
| 39 |
where is the number of roots of p inside the path . Note that as r approaches positive infinity, will be the roots on the upper half-plane (i.e.,
), which is what we are aiming for. For this reason, it is natural for us to examine two cases:
For the case of , we can have
Fig. 9.

Complex roots of a polynomial (red dots) and a linear path () concatenated by a semi-circular path () on the complex plane. (Color figure online)
Lemma 15
which essentially indicates
| 40 |
provided that the polynomial p is monic and does not have any root on the real axis.
Next, for , we first derive a lemma about :
Lemma 16
that is, , following which and by induction we have
Lemma 17
which is equivalent to
| 41 |
provided .
Putting Eqs. (40) and (41) together yields the core lemma about
in this section:
Lemma 18
where
is mathematically interpreted as , which is derived from in Eq. (40) since
Finally, following Lemma 18, the executability of the function
is established:
Lemma 19
where
divides the polynomial
by its leading coefficient so that the resulting polynomial
is monic. This corresponds to the assumption
in Lemma 18.
checks if
has no root lying on the real axis, which is due to the second assumption in Lemma 18.
As for the general case of a half-plane, we can have a definition as follows:
which encodes the number of roots in the left half-plane of the vector . Roots of
in this half-plane can be transformed to roots of
in the upper half-plane of :
Lemma 20
(
) 
And so we can naturally evaluate
through
:
Lemma 21
(
) 
Example 6
We can now use the following command
to decide that the polynomial
has exactly two roots within the left half-plane of the vector (0, i), as shown in Fig. 10.
Fig. 10.

Complex roots of a polynomial (red dots) and a vector (0, i). (Color figure online)
Despite our naive implementation, both
and
are applicable for small or medium examples. For most polynomials with coefficient bitsize up to 10 and degree up to 30, our complex root counting procedures terminate within minutes.
Limitations and Future Work
There are, of course, several improvements that can be made on both the evaluation tactic of Sect. 4.2 and the root counting procedures of Sect. 5. As the tactic is intended to be applied to winding numbers with variables, full automation with this tactic is unlikely in most cases, but we can always aim for better automation and an enhanced interactive experience for users (e.g., presenting unsolved goals in a more user-friendly way).
Regarding the two root-counting procedures in Sect. 5, a key limitation is that they do not allow cases where any root is on the border. There are two possible solutions to this problem:
- To generalise the definition of winding numbers. The current formulation of winding numbers in Isabelle/HOL follows the one in complex analysis:
which becomes undefined when the point z is on the image of the path . With more general formulations of winding numbers, such as the algebraic version by Eisermann [6], we may be able to derive a stronger version of the argument principle that allows zeros on the border. To deploy a more sophisticated strategy to count the number of times that the path winds. Recall that the underlying idea in this paper is to reduce the evaluation of winding numbers to classifications of how paths cross some line. The Cauchy index merely provides one classification strategy, which we considered simple and elegant enough for formalisation. In contrast, Collins and Krandick [4] propose a much more sophisticated strategy for such classifications. Their strategy has, in fact, been widely implemented in modern systems, such as Mathematica and SymPy, to count the number of complex roots.
Neither of these two solutions are straightforward to incorporate, hence we leave them for future investigation.
Besides rectangles and half-planes, it is also possible to similarly count the number of roots in an open disk and even a sector:
where returns the argument of a complex number. Informal proofs of root counting in these domains can be found in Rahman and Schmeisser [19, Chapter 11].
Potential Applications
Rahman and Schmeisser’s book [19, Chapter 11] and Eisermann’s paper [6] are the two main sources that our development is built upon. Nevertheless, there are still some differences in formulations:
Rahman and Schmeisser formulated the Cauchy index as in Definitions 4 and 5, and we used their formulation in our first attempt. However, after we realised the subtleties discussed in Sect. 4.3, we abandoned this formulation and switched to Eisermann’s (i.e., Definition 2). As a result, the root counting procedures presented in this paper are more general than the ones in their book, having fewer preconditions.
Eisermann formulated a winding number in a real-algebraical sense where is required to be a piecewise polynomial path (i.e., each piece from the path needs to be a polynomial). In comparison, in Isabelle/HOL follows the classic definition in complex analysis, and places fewer restrictions on the shape of (i.e., piecewise continuously differentiable is less restrictive than being a piecewise polynomial) but does not permit to be on the image of (while Eisermann’s formulation does). Consequently, Eisermann’s root counting procedure works in more restrictive domains (i.e., he only described the rectangle case in his paper) but does not prevent roots on the border.
Another point worth mentioning is the difference between informal and formal proofs. In this development, we generally treated their lemma statements as bald facts: we had to discover our own proofs. For instance, when proving Proposition 1, we defined an inductive data type for segments and derived an induction rule for it, which was nothing like the informal proof. Such situations also happened when we justified the root counting procedure in a half-plane. Overall, the formal proofs are about 12,000 lines.
Interestingly, the root-counting procedure in a half-plane is also related to the stability problems in the theory of dynamical systems. For instance, let be a square matrix with real coefficients and be a function that models the system state over time. A linear dynamical system can be described as an ordinary differential equation:
| 42 |
with an initial condition . The system of (42) is considered stable if all roots of the characteristic polynomial of A lie within the open left half-plane (i.e., ), and this stability test is usually referred as the Routh–Hurwitz stability criterion [1, Section 23], [16, Chapter 9]. As has been demonstrated in Example 6, counting the number of roots in the left half-plane is within the scope of the procedure
. For this reason, we believe that the development in this paper will be beneficial for reasoning about dynamical systems in Isabelle/HOL.
It is worth mentioning that root counting in a rectangle is usually coupled with a classic problem in computer algebra, namely, complex root isolation. The basic idea is to keep bisecting a rectangle (vertically or horizontally) into smaller ones until a sub-rectangle contains exactly one root or none (provided the target polynomial is square-free). Following this idea, it is possible to build a simple and verified procedure for complex root isolation similar to Wilf’s algorithm [20]: we start with a large rectangle and then repeatedly apply the verified procedure to count roots during the rectangle bisection phase. However, compared to modern complex procedures [4, 21], this simplistic approach suffers from several drawbacks:
Our root counting procedure is based on remainder sequences, which are generally considered much slower than those built upon Descartes’ rule of signs.
Modern isolation procedures are routinely required to deliver isolation boxes whose sizes meet some user-specified limit, hence they usually keep refining the isolation boxes even after the roots have been successfully isolated. The bisection strategy still works in the root refinement stage, but dedicated numerical approaches such as Newton’s iteration are commonly implemented for efficiency reasons.
Modern isolation procedures sometimes prefer a bit-stream model in which the coefficients of the polynomial are approximated as a bit stream. This approach is particularly beneficial when the coefficients have extremely large bit-width or consist of algebraic numbers.
Modern implementations usually incorporate numerous low-level optimisations, such as hash tables, which are hard to implement as verified procedures in a theorem prover.
Therefore, it is unlikely that our verified root counting procedures will ever deliver high performance. Nevertheless, they can be used to certify results from untrusted external root isolation programs, as in the certificate-based approach to solving univariate polynomial problems [13].
Related Work
Formalisations of the winding number (from an analytical perspective) are available in Coq [3], HOL Light [7] and Isabelle/HOL. To the best of our knowledge, our tactic of evaluating winding numbers through Cauchy indices is novel. As both HOL Light and Isabelle/HOL have a relatively comprehensive library of complex analysis (i.e., at least including Cauchy’s integral theorem), our evaluation tactic could be useful when deriving analytical proofs in these two proof assistants.
The ability to count the real roots of a polynomial only requires Sturm’s theorem, so this capability is widely available among major proof assistants including PVS [18], Coq [15], HOL Light [17] and Isabelle [5, 10, 13]. However, as far as we know, our procedures to count complex roots are novel, as they require a formalisation of the argument principle [14], which is only available in Isabelle at the time of writing.
Conclusion
In this paper, we have described a novel tactic
to evaluate winding numbers via Cauchy indices: given a goal of the form
the tactic converts the target into an equality about Cauchy indices:
This can be then solved by individually evaluating . As open variables may occur in those Cauchy indices, the evaluation of them is unlikely to be fully automatic, but we provide lemmas (e.g., Lemma 11) to mitigate the laborious process. The tactic
has greatly helped us with the motivating proofs shown in Sect. 2, and we believe that it should be also beneficial in similar situations when dealing with winding numbers in a formal framework.
We have further related Cauchy indices to the argument principle and developed novel verified procedures to count the complex roots of a polynomial within the areas of rectangles and half-planes. Despite the limitations of not allowing roots on the border (which we will solve in future work), the ability to formally count complex roots is believed to lay the foundations for conducting stability analysis (e.g., the Routh–Hurwitz stability criterion) in the framework of the Isabelle theorem prover.
Acknowledgements
We thank Dr. Angeliki Koutsoukou-Argyraki and Anthony Bordg for commenting on the early version of this draft. The work was supported by the ERC Advanced Grant ALEXANDRIA (Project 742178), funded by the European Research Council.
Footnotes
Applying an introduction rule will replace a goal by a set of subgoals derived from the premises of the rule, provided the goal can be unified with the conclusion of the rule.
The first author was funded by the China Scholarship Council, via the CSC Cambridge Scholarship programme. This development is also supported by the European Research Council Advanced Grant ALEXANDRIA (Project 742178).
Publisher's Note
Springer Nature remains neutral with regard to jurisdictional claims in published maps and institutional affiliations.
Contributor Information
Wenda Li, Email: wl302@cam.ac.uk.
Lawrence C. Paulson, Email: lp15@cam.ac.uk
References
- 1.Arnold VI. Ordinary Differential Equations. Berlin: Springer; 1992. [Google Scholar]
- 2.Basu S, Pollack R, Roy MF. Algorithms in Real Algebraic Geometry. Berlin: Springer; 2006. [Google Scholar]
- 3.Brunel, A.: Non-constructive complex analysis in Coq. In: Danielsson, N.A., Nordström, B. (eds.) 18th International Workshop on Types for Proofs and Programs (TYPES 2011), pp. 1–15. Schloss Dagstuhl-Leibniz-Zentrum fuer Informatik, Dagstuhl, Germany (2013)
- 4.Collins, G.E., Krandick, W.: An efficient algorithm for infallible polynomial complex root isolation. In: Proceedings of International Symposium on Symbolic and Algebraic Computation, ISSAC ’92, pp. 189–194. ACM (1992)
- 5.Eberl, M.: A decision procedure for univariate real polynomials in Isabelle/HOL. In: Conference on Certified Programs and Proofs, pp. 75–83. ACM Press (2015)
- 6.Eisermann M. The fundamental theorem of algebra made effective: an elementary real-algebraic proof via Sturm chains. Am. Math. Mon. 2012;119(9):715. doi: 10.4169/amer.math.monthly.119.09.715. [DOI] [Google Scholar]
- 7.Harrison, J.: Formalizing basic complex analysis. In: Matuszewski, R., Zalewska, A. (eds.) From Insight to Proof: Festschrift in Honour of Andrzej Trybulec, Studies in Logic, Grammar and Rhetoric, vol. 10, no. 23, pp. 151–165. University of Białystok (2007). http://mizar.org/trybulec65/. Accessed 2 Apr 2019
- 8.Harrison J. Formalizing an analytic proof of the prime number theorem (Dedicated to Mike Gordon on the occasion of his 60th birthday) J. Autom. Reason. 2009;43:243–261. doi: 10.1007/s10817-009-9145-6. [DOI] [Google Scholar]
- 9.Hölzl Johannes, Immler Fabian, Huffman Brian. Interactive Theorem Proving. Berlin, Heidelberg: Springer Berlin Heidelberg; 2013. Type Classes and Filters for Mathematical Analysis in Isabelle/HOL; pp. 279–294. [Google Scholar]
- 10.Li, W.: The Sturm–Tarski theorem. In: Archive of Formal Proofs (2014). http://isa-afp.org/entries/Sturm_Tarski.html. Accessed 2 Apr 2019
- 11.Li, W.: Count the number of complex roots. In: Archive of Formal Proofs (2017). http://isa-afp.org/entries/Count_Complex_Roots.html. Accessed 2 Apr 2019
- 12.Li, W.: Evaluate winding numbers through cauchy indices. In: Archive of Formal Proofs (2017). http://isa-afp.org/entries/Winding_Number_Eval.html. Accessed 2 Apr 2019
- 13.Li W, Passmore GO, Paulson LC. Deciding univariate polynomial problems using untrusted certificates in Isabelle/HOL. J Autom Reason. 2017;62:69–91. doi: 10.1007/s10817-017-9424-6. [DOI] [Google Scholar]
- 14.Li, W., Paulson, L.C.: A formal proof of Cauchy’s residue theorem. In: Blanchette, J.C., Merz, S., (eds.) 7th International Conference on Interactive Theorem Proving, pp. 235–251. Springer (2016)
- 15.Mahboubi A, Cohen C. Formal proofs in real algebraic geometry: from ordered fields to quantifier elimination. Log. Methods Comput. Sci. 2012;8(1):1–40. doi: 10.2168/LMCS-8(1:2)2012. [DOI] [Google Scholar]
- 16.Marden M. Geometry of Polynomials. 2. Providence: American Mathematical Society; 1949. [Google Scholar]
- 17.McLaughlin S, Harrison J. A proof-producing decision procedure for real arithmetic. In: Nieuwenhuis R, editor. Automated Deduction – CADE-20. CADE 2005. Lecture Notes in Computer Science. Berlin: Springer; 2005. [Google Scholar]
- 18.Narkawicz A, Muñoz CA, Dutle A. Formally-verified decision procedures for univariate polynomial computation based on Sturm’s and Tarski’s theorems. J. Autom. Reason. 2015;54(4):285–326. doi: 10.1007/s10817-015-9320-x. [DOI] [Google Scholar]
- 19.Rahman QI, Schmeisser G. Analytic Theory of Polynomials (2002) Oxford: Oxford University Press; 2016. [Google Scholar]
- 20.Wilf HS. A global bisection algorithm for computing the zeros of polynomials in the complex plane. J. ACM. 1978;25(3):415–420. doi: 10.1145/322077.322084. [DOI] [Google Scholar]
- 21.Yap, C.K., Sagraloff, M.: A simple but exact and efficient algorithm for complex root isolation. In: 36th International Symposium on Symbolic and Algebraic Computation, ISSAC ’11, pp. 353–360. ACM Press (2011)


) 


and
,
) 

) 
) 
) 

) 
) 
) 
) 
) 
) 
) 
) 
evaluates