{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "K = Knot([[[1,-2,3,-1,2,-3]],[1,1,1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Knot represented by 3 crossings"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G = K.fundamental_group()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Finitely presented group < x0, x1, x2 | x2*x1*x2^-1*x0^-1, x1*x0*x1^-1*x2^-1, x0*x2*x0^-1*x1^-1 >"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "S = SymmetricGroup(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<fp group on the generators [ x0, x1, x2 ]>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Gg = G._gap_()\n",
    "Gg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SymmetricGroup( [ 1 .. 3 ] )"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sg = S._gap_()\n",
    "Sg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[ [ x0, x1, x2 ] -> [ (1,3), (2,3), (1,2) ] ]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Gg.GQuotients(Sg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "Graphics object consisting of 22 graphics primitives"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B = BraidGroup(3)\n",
    "b = B([1,-2,1,-2])\n",
    "K4 = Knot(b)\n",
    "K4.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G4 = K4.fundamental_group()\n",
    "G4g = G4._gap_()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[  ]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G4g.GQuotients(Sg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def colorings(K, n):\n",
    "    gauss_code = K.oriented_gauss_code()\n",
    "    crossing_list=gauss_code[0][0]\n",
    "    negative_indices = [i for i in range(len(crossing_list)) if crossing_list[i]<0]\n",
    "    gens = [crossing_list[negative_indices[i]:negative_indices[i+1]+1] for i in range(len(negative_indices)-1)]\n",
    "    gens.append(crossing_list[negative_indices[-1]:]+crossing_list[:negative_indices[0]+1])\n",
    "    m = len(gens)\n",
    "    M = matrix(IntegerModRing(n), m, m)\n",
    "    for cros in range(len(gauss_code[1])):\n",
    "        gi = [g for g in gens if cros+1 in g][0]\n",
    "        gj = [g for g in gens if -(cros+1)==g[-1]][0]\n",
    "        giind = gens.index(gi)\n",
    "        gjind = gens.index(gj)\n",
    "        gkind = gjind + 1\n",
    "        if gkind >= len(gens):\n",
    "            gkind = 0\n",
    "        M[cros,giind] = 2\n",
    "        M[cros, gjind] = -1\n",
    "        M[cros, gkind] = -1\n",
    "    solutions =  M.kernel().list()\n",
    "    return [s for s in solutions if len(set(s))>1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 0, 2), (2, 0, 1), (0, 1, 2), (2, 1, 0), (0, 2, 1), (1, 2, 0)]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "colorings(K,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 0, 2, 3),\n",
       " (2, 0, 4, 1),\n",
       " (3, 0, 1, 4),\n",
       " (4, 0, 3, 2),\n",
       " (0, 1, 4, 3),\n",
       " (2, 1, 3, 4),\n",
       " (3, 1, 0, 2),\n",
       " (4, 1, 2, 0),\n",
       " (0, 2, 3, 1),\n",
       " (1, 2, 0, 4),\n",
       " (3, 2, 4, 0),\n",
       " (4, 2, 1, 3),\n",
       " (0, 3, 2, 4),\n",
       " (1, 3, 4, 2),\n",
       " (2, 3, 1, 0),\n",
       " (4, 3, 0, 1),\n",
       " (0, 4, 1, 2),\n",
       " (1, 4, 3, 0),\n",
       " (2, 4, 0, 3),\n",
       " (3, 4, 2, 1)]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "colorings(K4,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0}"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(_[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "colorings(K4,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "colorings(K4,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[4 4 0 2]\n",
       "[4 0 2 4]\n",
       "[0 2 4 4]\n",
       "[2 4 4 0]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = is_coloreable(K4,5)\n",
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.delete_columns([0]).delete_rows([0]).determinant()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.nullity()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[4 4 0 2]\n",
       "[4 0 2 4]\n",
       "[0 2 4 4]\n",
       "[2 4 4 0]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vector space of degree 4 and dimension 2 over Ring of integers modulo 5\n",
       "Basis matrix:\n",
       "[1 0 2 3]\n",
       "[0 1 4 3]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M.kernel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0, 0, 0, 0),\n",
       " (1, 0, 2, 3),\n",
       " (2, 0, 4, 1),\n",
       " (3, 0, 1, 4),\n",
       " (4, 0, 3, 2),\n",
       " (0, 1, 4, 3),\n",
       " (1, 1, 1, 1),\n",
       " (2, 1, 3, 4),\n",
       " (3, 1, 0, 2),\n",
       " (4, 1, 2, 0),\n",
       " (0, 2, 3, 1),\n",
       " (1, 2, 0, 4),\n",
       " (2, 2, 2, 2),\n",
       " (3, 2, 4, 0),\n",
       " (4, 2, 1, 3),\n",
       " (0, 3, 2, 4),\n",
       " (1, 3, 4, 2),\n",
       " (2, 3, 1, 0),\n",
       " (3, 3, 3, 3),\n",
       " (4, 3, 0, 1),\n",
       " (0, 4, 1, 2),\n",
       " (1, 4, 3, 0),\n",
       " (2, 4, 0, 3),\n",
       " (3, 4, 2, 1),\n",
       " (4, 4, 4, 4)]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_.list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G = Graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "G.characteristic_polynomial?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath 7.3",
   "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
}
