#### Navigation

Click and drag the left mouse to move the plot. The mouse wheel zooms.
There are also navigation buttons on the right. Recenter centers the plot on the
selecting search start point.

#### Right mouse

The right mouse either selects a search start point (default),
or selects a point from which an orbit is started. Change the
behavior of the right mouse or the orbit length on the right.

#### Function input

To use the rational function
(a1*z^p1 + ... + ak*z^pk)/(b1*z^q1 + ... + bl*z^ql), set the function
input to {p1:a1, ..., pk:ak}/{q1:b1, ..., ql:bl}. If the denominator
is omitted, it is assumed to be the constant function 1. Complex coefficients
are allowed. The function is updated (and replotted, if the Julia set plot is
selected) as soon as the input box loses focus.

#### Julia set plotting

If the Julia set of the function is not the entire plane and does
not contain infinity, it can be
useful to plot it. It is plotted by checking which points go to infinity
under iteration. In particular, the plot shows the *filled*
Julia set. The monochrome and color options determine
whether the exterior of the filled Julia set is colored according
to how quickly the point escapes to infinity.

The Julia set is plotted using WebGL, which may not be supported
in some mobile and old browsers. It may also be slow, depending
on your graphics hardware.

#### Periodic orbit searching

After selecting a search start point, radius, and maximum orbit length,
click the "go" button to initiate the search.
The program iterates the chosen point until it
comes back close to itself and then uses Newton's method to try to
find an exactly periodic orbit. The output area shows the search progress
and, if the search is successful, the found periodic orbit.
If the Julia set isn't everything, the start point should
lie on the Julia set to have any real hope of finding an orbit.

#### Technical comments

An iterate of the initial point
is defined to be "close" to itself if the derivative of the iterated
map at the initial point is large enough that, if the iterated map were linear,
we could close up the orbit by moving the initial point less than the
specified radius. The function is not linear, so this doesn't always
work.

The Julia set overlay is created by having one 2d canvas directly on
top of a webgl canvas. The webgl canvas plots the Julia set, and the
2d canvas plots everything else. The shader code source in this website
contains a placeholder where the function should be computed.
Every time the function is updated, the program reloads the source and
replaces the placeholder with dynamically generated code for the given function.

There are ways to rigorously certify the existence of a periodic orbit
near a numerical solution (see the
Kantorovich theorem
and Lemma 11.1.1 in here),
but this program does not do this.