Giter Site home page Giter Site logo

jeanluct / pseudoanosov Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 1.0 1.71 MB

Mathematica and C++ files for testing polynomials of pseudo-Anosov maps.

License: GNU General Public License v3.0

Mathematica 83.71% MATLAB 13.31% Makefile 0.22% Python 0.14% C++ 2.62%

pseudoanosov's Introduction

PseudoAnosov Package

The PseudoAnosov package contains Mathematica and C++ functions for extracting properties of characteristic polynomials of pseudo-Anosov maps of surfaces. The goal is to determine whether a given polynomial is allowable on a given stratum. A stratum is a collection of singularities for a closed surface of genus g. A polynomial is allowable if it can (at least in principle) arise as the characteristic polynomial associated with a pseudo-Anosov map on that surface, where the map preserves the singularities up to permutations.

Most of the functions in the package assume that the pseudo-Anosov map stabilizes an orientable foliation, so the singularities must all have even degree. If the pseudo-Anosov map exists, then its dilatation is given by the largest root of the polynomial, also called its Perron root.

This package is an extension of the code used in papers by Erwan Lanneau and Jean-Luc Thiffeault to prove lower bounds on the smallest dilatation on closed surfaces and braids. A minimal version was included as part of the braids paper as PseudoAnosovLite.

The PseudoAnosov package is maintained by Jean-Luc Thiffeault.

See the complete list of functions in the PseudoAnosov package. There are also several sample notebooks in the repository.

A sample Mathematica session

First we load the package:

In[1]:= <<PseudoAnosov.m

Let's start with the torus (genus g=1), where we are dealing with Anosov maps (no singularities). We can list all the reciprocal monic polynomials of degree 2g=2 (with integer coefficients) with dilatation less than, say, 3:

In[2]:= P = ReciprocalPolynomialBoundedList[x,2,3]

                    2
Out[2]= {1 - 3 x + x }

There is only one such polynomial, and it gives the lowest dilatation on that surface.

Genus 2 surfaces are more interesting. First we can list all the possible strata (singularity data) for the case were the foliation is orientable:

In[3]:= s = OrientableStrataList[2]

Out[3]= {{4}, {2, 2}}

There are two strata, one with a degree-4 singularity (6 prongs), the other with two degree-2 singularities (4 prongs). The sum of the degrees in each case is 4=4g-4=-2(Euler characteristic), where g=2 is the genus. Next we find all monic reciprocal polynomials of degree 2g=4 with dilatations less than 1.75:

In[4]:= P = ReciprocalPolynomialBoundedList[x,4,1.75]

                  2    3    4
Out[4]= {1 - x - x  - x  + x }

There is only one such polynomial (which is why we chose the value 1.75). Its root with the largest magnitude (Perron root) is

In[5]:= PerronRoot /@ P

Out[5]= {1.72208}

Let's see if this polynomial is a good candidate for a pseudo-Anosov map. The command StratumOrbits tries to find a set of regular periodic orbits that is compatible with a polynomial on a given stratum. If we try the polynomial P[[1]] on the second stratum s[[2]],

In[6]:= StratumOrbits[s[[2]],P[[1]]]

Out[6]= {}

we get nothing, suggesting that this polynomial is not associated with any pseudo-Anosov maps on the stratum s[[2]]={2,2}. However, on the stratum s[[1]]={4} we get

In[7]:= so = StratumOrbits[s[[1]],P[[1]]]

                                 2    3    4
Out[7]= {{Polynomial -> 1 - x - x  - x  + x , Stratum -> {{4, 1}},
     SingularitiesPermutation -> {{{1}}},
     SeparatricesPermutation -> {{{2, 3, 1}}},
     SingularitiesLefschetzBlock -> {1, 1, -5},
     RegularOrbits ->
      {0, 1, 0, 1, 3, 3, 6, 9, 14, 21, 36, 54, 90, 141, 230, 369, 606, 977, 1608, 2619, 4312, 7074, 11682, 19248, 31872, 52731, 87514, 145260, 241644, 402137, 670380, 1118187, 1867560, 3121221, 5221938, 8742312, 14648958, 24562068, 41214696, 69199515, 116263056, 195445504, 328749954, 553264722, 931601482, 1569414123, 2645169030, 4460292930, 7524259626, 12698241600}}}

This is a candidate pseudo-Anosov, since there exists a collection of regular periodic orbits that together with the singularity respect the Lefschetz fixed-point theorem. We can present the information better with

In[8]:= StratumOrbitsTable[so[[1]]]

Out[8]=

output of StratumOrbitsTable[so[1]]

The table shows the polynomial and its Perron root. The stratum is denoted 4^1 or {{4,1}}, which means degree 4 with multiplicity 1, i.e., the same as {4}. There is only one singularity, so the permutation of singularities by the map can only be {1}. The singularity has six prongs or separatrices, 3 of which are labeled 'ingoing' and the other 3 'outgoing'. These ingoing/outgoing separatrices are cyclically permuted as {2,3,1} by this (hypothetical) pseudo-Anosov map. The table then gives Lefschetz number sequences for iterates n of the map. The last row gives the number of regular orbits (#ro). We see that there are no regular fixed points (n=1), one period-2 orbit (n=2), and so on.

It turns out that a pseudo-Anosov map having this polynomial does indeed exist, and we just deduced that it must have the minimum dilatation for a genus 2 surface, as was first shown by Zhirov (1995), since there are no candidate polynomials with a lower dilatation.

License

PseudoAnosov is released under the GNU General Public License v3. See COPYING and LICENSE.

Support

The development of PseudoAnosov was supported by the US National Science Foundation, under grants DMS-0806821 and CMMI-1233935.

pseudoanosov's People

Contributors

jeanluct avatar

Watchers

 avatar

Forkers

knut0815

pseudoanosov's Issues

Clean up Mathematica notebooks

There are several notebooks in the root folder and subfolders:

  • stratatest.nb: Title: "Automated Elimination of Strata". Worked out example that refers to tables in the systole paper. Should verify these tables. Link to arXiv version of paper. It doesn't "derive" the polynomials. Why not? Takes too much time? Update: after looking through it it doesn't seem to do things systematically later. Maybe change it so it does?
  • TestPseudoAnosov.nb
  • delta+.nb
  • homologyaction.nb
  • newbound.nb
  • newminpA_even.nb
  • newminpA.nb
  • pGolden_genusg_even.nb
  • stratatest2.nb
  • lite/disc5.nb
  • genus3/gup9_elim.nb
  • genus3/genus3_systole_polybound.nb
  • genus3/genus3_systole.nb
  • genus3/genus2_systole.nb
  • genus3/gup8_elim.nb
  • polybound/polybound.nb
  • primitive/polybound_n=6-7.nb
  • primitive/primitive_bound_n=3.nb
  • primitive/primitive_bound_n=6.nb
  • primitive/primitive_bound_n=4_reciprocal.nb
  • primitive/polybound_n=5.nb
  • primitive/primitive_bound_n=4.nb
  • primitive/primitive_bound_n=5.nb
  • primitive/ChoHam_primitive_matrices.nb
  • primitive/polybound_n=6.nb
  • primitive/xn-x-1.nb

Categorize them: some should be moved to subfolders. Keep a few that demonstrate the use of PA.

StratumOrbits on torus

I'm not sure that StratumOrbits deals with the torus s={{}} in the right way. Ditto for marked points. Do some experiments, with things like StratumOrbits[{{}},p] or StratumOrbits[{{0,2}},p]. Then maybe expand help message to clarify that marked points can be used.

Check also that table works:

StratumOrbitsTable[#, 10] & /@ StratumOrbits[{{}}, p0]
First::nofirst: "{} has zero length and no first element."

Internal function for figuring out Perron root sign

Several functions have the line

If[prs == Automatic, prs = Sign[Times @@ Take[L,-2]]];

which attempts to figure out the Perron root sign from the Lefschetz numbers (they eventually alternate). Make this a separate helper function.

Tables from stratatest.nb

stratatest.nb contains some really nice functions for making results tables. Add these to the core PseudoAnosov.m file, possibly in a new context? (`Results?)

Terminology for Perron root

Things are a little murky right now:

  • ReciprocalPolynomialBoundedList restricts to Perron root. Is this the best idea? Probably.
  • Usage, from LT2010b: "Perron root" is the root itself (signed), "Perron number" is the absolute value.
  • PerronRoot doesn't quite do that, since it returns the largest root (in magnitude), even if the polynomial is not Perron. Would it be better to call it LargestRoot or MaximalRoot?

Option for sign of Perron root

Right now Regular takes a PerronRootSign option, but the other "expert" functions Singular, SingularPermutations, and SingularStratum take a prs value of +1 or -1.

One reason for this discrepancy, I think, is that the latter can't attempt to figure out the sign (i.e., can't take the Automatic value for PerronRootSign). Still, it's not very elegant to have these two different ways.

Possible solutions:

  • Make all these expert functions truly internal, with i prefix.
  • Give the flag to the other 3 functions, but disallow Automatic. After that I'm tempted to stop labeling them as "expert" and just move them with the others.

See also issue #3.

PseudoAnosovPerronRootQ prints warning

PseudoAnosovPerronRootQ[x^2 - 3 x + 1]

Abs::argx: Abs called with 0 arguments; 1 argument is expected. >>

True

Here the optional argument lmax should default to zero, but it doesn't. The argument list of the functions has lmax___:0 (three underscores). Why?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.