{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sage presentation, Oaxaca Mexico, May 2016\n",
    "==========================================\n",
    "(Vincent Delecroix, CNRS Bordeaux, France supported by [OpenDreamKit](http://opendreamkit.org/))\n",
    "\n",
    "<div style=\"align:center; margin-top: 20px; margin-bottom:20px\">\n",
    "<img src=\"http://localhost:8888/files/sage_logo.png\"> <br/>\n",
    "<img style=\"display:inline; margin-right:50px;\" src=\"http://localhost:8888/files/Flag_of_Europe-small.png\">\n",
    "<img style=\"display:inline; margin-bottom:12px;\" src=\"http://localhost:8888/files/Flag_of_Mexico-small.png\">\n",
    "</div>\n",
    "\n",
    "Sage (or SageMath) is a free and open source software for mathematics. It  was started by William Stein in 2005 and is now developed by many volunteers around the world.\n",
    "\n",
    "Sage can be used in many different ways:\n",
    "\n",
    "- console mode (`$ sage`)\n",
    "- sage notebook (`$ sage --notebook=sagenb`)\n",
    "- jupyter notebook (`$ sage --notebook=jupyter`)\n",
    "- as a program run on a file which contain commands (`$ sage my_file.py`)\n",
    "- online cell https://sagecell.sagemath.org/\n",
    "- online cloud http://cloud.sagemath.com\n",
    "\n",
    "Other links:\n",
    "\n",
    " - main website: http://www.sagemath.org/\n",
    " - help forum: http://ask.sagemath.org"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sage is based on Python\n",
    "-----------------------\n",
    "\n",
    "  - expressive and flexible language\n",
    "  - used around the world by thousands of programers outside of Sage\n",
    "\n",
    "For example the list `{i^2: i=0,1,...,12 s.t. gcd(i,30) = 1}` is constructed via"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "[i**2 for i in range(13) if gcd(i,30) == 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sage behavior is not exactly the one of Python. Sage primarily focuses on mathematics."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "14341231237.is_prime()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "25512318.factor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 3.5\n",
    "(a^5 - 3*a^4) .exp()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "continued_fraction(pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "plot(cos(x), (x, 0, 2*pi))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that in some of the above examples we used the syntax `x.f()` that has to be thought as the application of the function `f` to the object `x` (a more standard mathematical syntax is `f(x)`). Indeed Python is object oriented and functions are attached to objects (in that context these are called *methods*)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finding commands, accessing help\n",
    "--------------------------------\n",
    "\n",
    "- `<TAB>` automatic completion\n",
    "- ?`<ENTER>` accessing help\n",
    "- ??`<ENTER>` accessing source code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "is_p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "is_prime?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "is_prime??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a = 34"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a.str?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a.str??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sage as an interface\n",
    "--------------------\n",
    "\n",
    "Sage was primarily thought as an interface to hundreds of specialized softwares (GAP, pari/GP, maxima, R, ...) and libraries (mpfr, gmp, flint, numpy, ...). But it now contains more than 2.000.000 lines of Python/Cython/C code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 1234\n",
    "b = pari(a)          # pari/GP version of a\n",
    "c = b.Zn_sqrt(2597)  # call to a pari method\n",
    "print c\n",
    "d = ZZ(c)            # convert back to Sage\n",
    "print d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print type(c)\n",
    "print type(d)\n",
    "print parent(c)\n",
    "print parent(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p = gap('(1,2,4)(3,5)')\n",
    "print p\n",
    "print p.Order()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# to convert p back to a Sage element is not that simple!\n",
    "print SymmetricGroup(5)(p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "s = pari(\"Ser( (1-x)^(-3))\")\n",
    "print s\n",
    "print s.log()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# to convert s back to a Sage element is not that simple either!!\n",
    "s.sage(locals={'x':PowerSeriesRing(ZZ,'x').gen()})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Two graph examples\n",
    "------------------\n",
    "\n",
    "The graph on 5 vertices and at most 4 edges up to isomorphism"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "show(graphs(5, lambda G: G.size() <= 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we consider a one player game (which has interest only if there is a time limit). We have cards numbered from 1 to 100. The aim is to produce the longest chain which has the following property: two cards are allowed to be next to each other if one of their value divides the other.\n",
    "\n",
    "For example, 1, 12, 6, 42, 7 is a valid chain.\n",
    "\n",
    "(*technical note:* this example will work only if you setup an efficient linear programming solver either CPLEX or Gurobi.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G = Graph()  # creates an empty graph\n",
    "for i in range(1,101):\n",
    "    j = 1\n",
    "    while i*j < 100:\n",
    "        G.add_edge(i,i*j,None)\n",
    "        j += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print G.num_verts()\n",
    "print G.num_edges()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "H = G.longest_path()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "H.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cython\n",
    "------\n",
    "\n",
    "If further speed is needed, you can code in Cython or integrate C code very easily (technical note: Sage is better supported in the console and the Sage notebook)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def f_python(x):\n",
    "    y = x\n",
    "    for i in range(100):\n",
    "        y = 3.5 * y * (1-y)\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "cython(\"\"\"\n",
    "def f_cython(double x):\n",
    "    cdef double y\n",
    "    cdef int i\n",
    "    y = x\n",
    "    for i in range(100):\n",
    "        y = 3.5 * y * (1-y)\n",
    "    return y\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print f_python(0.2)\n",
    "print f_cython(0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%%timeit\n",
    "f_python(0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%%timeit\n",
    "f_cython(0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some graphics\n",
    "-------------\n",
    "\n",
    "There are many graphics primitive in Sage:\n",
    "\n",
    "- `point2d` (or `point3d`): list of points\n",
    "- `line2d` (or `line3d`): broken line\n",
    "- `plot`: graph of functions\n",
    "- `polygon`, `circle`, `ellipse`\n",
    "- and many objects do have a `plot` method\n",
    "\n",
    "Then to sum primitive just use the standard `+` operator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "Graphics object consisting of 3 graphics primitives"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f(x) = exp(x) * cos(x)\n",
    "G = plot(f, (x,-1,2))\n",
    "df = f.derivative(x)\n",
    "a = f(1)\n",
    "b = df(1)\n",
    "L = line2d([(0, a-b), (2, a+b)], color='red')\n",
    "P = point2d((1,a), pointsize=20)\n",
    "G + L + P"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\na+rsAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "Graphics object consisting of 9 graphics primitives"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V = RR^2\n",
    "pts = [V.random_element() for _ in range(20)]\n",
    "P = Polyhedron(pts)\n",
    "point2d(pts, color='red') + P.plot(alpha=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Going further\n",
    "-------------\n",
    "\n",
    "To continue you are advised to open the sage-notebook (via `$ sage --notebook=sagenb`) and have a look at the various thematic tutorials that will guide you. Once the sage-notebook is open, you need to click on the `Help` link (top right of the screen) and then select `Thematic Tutorials`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath 7.2.beta6",
   "language": "",
   "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.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
