{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center>\n",
    "<h1>Free groups and train-tracks with Sage</h1>\n",
    "<h3>Thierry Coulbois, Marseille</h3>\n",
    "<code>thierry.coulbois@univ-amu.fr</code><br>\n",
    "Bonn, July 2019\n",
    "</center>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from train_track import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>1. Introduction</h2>\n",
    "<ul>\n",
    "    <li>Package written 6 years ago, more than 10 000 lines of code (in Sage/Python).\n",
    "    <li>Mainly non-programming community (free group automorphisms). \n",
    "    <li>Main results [Bestvina, Feighn, Handel] around 1985. No strict statement about algorithmicity. \n",
    "    <li>Paper proving algorithmicity [Bogopolski, Maslakova, 2012, 70 pages]. \n",
    "    <li>Previously Java-applet [Brinkmann].\n",
    "    <li>(Some) Mapping class groups are concerned, braid groups.\n",
    "    \n",
    "<ul>\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>2. Some math</h2>\n",
    "\n",
    "<b>Free groups</b> = group of reduced words on an alphabet (with inverses)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Free Group on generators {x0, x1, x2}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FreeGroup(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Free Group on generators {a, b, c}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F = FreeGroup('a,b,c')\n",
    "F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a*b*a*c*b"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F('abacb')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a*b*a^-1*c"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w = F('abAbBc')\n",
    "w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "((a*b*a^-1*c)^2, (a*b*a^-1*c)^5, c^-1*a*b^-1*a^-1)\n"
     ]
    }
   ],
   "source": [
    "print((w * w, w**5, w**-1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Automorphism of free group</b> = sort of a word morphism"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Automorphism of the Free Group on generators {a, b, c}: a->a*b,b->a*c,c->a"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phi = FreeGroupAutomorphism(\"a->ab,b->ac,c->a\")\n",
    "phi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a*b*a^-1\n"
     ]
    }
   ],
   "source": [
    "print(phi(\"aC\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a->a*b*a*c,b->a*b*a,c->a*b\n"
     ]
    }
   ],
   "source": [
    "print(phi*phi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Length of $\\varphi^n(a)$ ?</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = phi.domain().gen(0)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "abacabaabacababacabaabacabacabaabacababacabaabacabaabacababacabaabacabacabaabacab\n"
     ]
    }
   ],
   "source": [
    "print(phi(a,7).to_word())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1 1 1]\n",
       "[1 0 0]\n",
       "[0 1 0]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = phi.rose_representative().matrix()\n",
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1.839286755214161?, -0.4196433776070806? - 0.6062907292071993?*I, -0.4196433776070806? + 0.6062907292071993?*I]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.eigenvalues()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So we have easily:\n",
    "$$\\lim_{n\\to\\infty}\\frac 1n\\log|\\varphi^n(a)|=1.839...$$\n",
    "\n",
    "<h3>But what about inverses and cancellations?</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Automorphism of the Free Group on generators {a, b, c}: a->c,b->c^-1*a,c->c^-1*b"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phiinv = phi.inverse()\n",
    "phiinv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "word: AbAccAcc"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phiinv(a,7).to_word()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Graph self map:\n",
       "Marked graph: a: 0->0, b: 1->0, c: 1->0, e: 0->1\n",
       "Marking: a->a, b->eb, c->ec\n",
       "Edge map: a->ec, b->Ea, c->b, e->C\n",
       "Irreducible representative"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f = phiinv.train_track()\n",
    "f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "Graphics object consisting of 13 graphics primitives"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f.domain().plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0 1 0 0]\n",
       "[0 0 1 0]\n",
       "[1 0 0 1]\n",
       "[1 1 0 0]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Minv = f.matrix()\n",
    "Minv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-0.4746266175626056?, 1.395336994467073?, -0.4603551884522338? - 1.139317680301923?*I, -0.4603551884522338? + 1.139317680301923?*I]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Minv.eigenvalues()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So we have less easily:\n",
    "$$\\lim_{n\\to\\infty}\\frac 1n\\log|\\varphi^{-n}(a)|=1.39533...$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>3. What next</h2>\n",
    "\n",
    "<ul>\n",
    "    <li>Code distributed as a package on pypi.org\n",
    "    <li>Code cleaned, documented, doc-tested, by Dominique Bienelli (Research software engineer at our math department)\n",
    "    <li>Bugs and updates\n",
    "    <li>Compatibility with futur versions of Sage\n",
    "    <li>Ticket for integration vs Sage (Python) package\n",
    "    <li>Free groups wrapped from GAP [Miguel Angel Marco Buzunariz, Volker Braun] modifications in my package\n",
    "    <li>New features (subgroups for free groups, fixed subgroups)\n",
    "    <li>Free group automorphism still active\n",
    "    <li>Category hierarchy (parents and such)\n",
    "    \n",
    "        \n",
    "</ul>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Aucun(e)",
  "kernelspec": {
   "display_name": "SageMath 8.8",
   "language": "sage",
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
