{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# \n", "# \n", "# \n", "# \n", "# \n", "# Dagstuhl 11/08/2016\n", "## SageMath for Coding Theory teaching and research (in the time of Big Data)\n", "\n", "# \n", "# \n", "# \n", "# \n", "# \n", "# \n", "# \n", "# \n", "# \n", "# \n", "\n", "\n", "\n", "### SageMath is a powerful Open-Source computer-algebra system\n", " - Embeds many other projects: GAP, Singular, Macaulay2, NTL, FLINT, ...\n", " - Rapid prototyping, uses a real programming language (Python)\n", " - Powerful for experimentation using worksheets\n", " - Open-Source: Don't like it: fix it!\n", " - SageMathCloud brilliant for class-room. No installation, great interface.\n", " - ...\n", " \n", "### SageMath has matured a lot the last years\n", " - If you tried it 5 years ago -- perhaps time to revisit it?\n", " \n", " \n", " \n", " \n", "### ACTIS: Algorithmic Coding Theory in Sage\n", " - 2014-2016: one full-time engineer for improving CT in SageMath\n", " - People: David Lucas (engineer), Daniel Augot, Clément Pernet, myself\n", " \n", "# \n", "\n", "# \n", "\n", "# \n", "# \n", "# \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic stuff (you might have seen all this before)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linear code of length 5, dimension 3 over Finite Field of size 2\n" ] } ], "source": [ "G = matrix(GF(2), [ [ 1, 0, 0, 1, 1 ],\n", " [ 0, 1, 0, 1, 0 ],\n", " [ 0, 0, 1, 0, 1 ] ])\n", "C = LinearCode(G)\n", "print C" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "2" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.minimum_distance()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 0, 1, 1, 0)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.random_element()" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "([((1, 1, 1, 1, 1); (), Ring endomorphism of Finite Field of size 2\n", " Defn: 1 |--> 1),\n", " ((1, 1, 1, 1, 1); (), Ring endomorphism of Finite Field of size 2\n", " Defn: 1 |--> 1),\n", " ((1, 1, 1, 1, 1); (2,3)(4,5), Ring endomorphism of Finite Field of size 2\n", " Defn: 1 |--> 1),\n", " ((1, 1, 1, 1, 1); (2,4), Ring endomorphism of Finite Field of size 2\n", " Defn: 1 |--> 1),\n", " ((1, 1, 1, 1, 1); (3,5), Ring endomorphism of Finite Field of size 2\n", " Defn: 1 |--> 1)],\n", " 8)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.automorphism_group_gens()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 1, 0, 1)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = vector(GF(2), [0,0,1])\n", "c = C.encode(m)\n", "c" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 0, 1, 0, 1)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = c + vector(GF(2), [1,0,0,0,0])\n", "r" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 1, 0, 1)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.decode_to_code(r)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 1)" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.decode_to_message(r)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# Some codes have structure" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[59, 16, 44] Generalized Reed-Solomon Code over Finite Field of size 59\n" ] } ], "source": [ "F = GF(59)\n", "C = codes.GeneralizedReedSolomonCode(F.list(), 16)\n", "print C" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "44" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.minimum_distance()" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "7863486030543333673826577152*x^59 + 7999063375898830502902284856*x^58 + 3999531687939483355061080628*x^57 + 1310191415061834848303837204*x^56 + 316253100031228092883970512*x^55 + 59979036594424651251242464*x^54 + 9307091172531426256620792*x^53 + 1214966141686536287568696*x^52 + 136158808124233130392728*x^51 + 13303951456614403046748*x^50 + 1146121368021180420870*x^49 + 88454301571049513190*x^48 + 5917613161578583920*x^47 + 426302056363431360*x^46 + 11569714399416600*x^45 + 2313942879883320*x^44 + 1" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.weight_enumerator()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 0, 0, 0, 0, 0, 13, 1, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 49, 0, 0, 0, 0, 0, 13, 2, 0, 53, 0, 0, 0, 0, 0, 0, 0, 14, 28, 0, 0, 0, 40, 52, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = C.random_element()\n", "Ch = channels.StaticErrorRateChannel(F^C.length(), 13)\n", "\n", "r = Ch.transmit(c)\n", "r-c" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c_out = C.decode_to_code(r)\n", "c == c_out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# \n", "\n", "# \n", "\n", "# \n", "# \n", "### We have list-decoding as well" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decoding radius: 27, (s,ell) = (3, 6)\n" ] } ], "source": [ "radius, params = \\\n", " codes.decoders.GRSGuruswamiSudanDecoder.guruswami_sudan_decoding_radius(C, s=3)\n", "print \"Decoding radius: %s, (s,ell) = %s\" % (radius, params)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [], "source": [ "D = C.decoder(\"GuruswamiSudan\", parameters = params)\n", "\n", "Ch_evil = channels.StaticErrorRateChannel(C.ambient_space(), radius)\n", "r = Ch_evil.transmit(c)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nearby codewords: [(11, 14, 31, 33, 10, 10, 31, 37, 36, 36, 8, 5, 22, 29, 27, 4, 51, 42, 11, 57, 5, 55, 1, 4, 10, 42, 38, 53, 19, 47, 27, 41, 20, 13, 11, 39, 37, 2, 30, 8, 40, 52, 41, 1, 53, 45, 5, 45, 41, 48, 16, 8, 18, 28, 47, 53, 22, 30, 52)]\n" ] } ], "source": [ "lst = D.decode_to_code(r)\n", "print \"Nearby codewords: %s\" % lst" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "### Cyclic codes" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[15, 10] Cyclic Code over Finite Field of size 2 with x^5 + x^4 + x^2 + 1 as generator polynomial\n" ] } ], "source": [ "P. = GF(2)[]\n", "g = (x + 1)*(x^4 + x + 1)\n", "C = codes.CyclicCode(generator_pol = g, length = 15)\n", "print C" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[1 1 1 0 1 1 0 0 1 0 1 0 0 0 0]\n", "[0 1 1 1 0 1 1 0 0 1 0 1 0 0 0]\n", "[0 0 1 1 1 0 1 1 0 0 1 0 1 0 0]\n", "[0 0 0 1 1 1 0 1 1 0 0 1 0 1 0]\n", "[0 0 0 0 1 1 1 0 1 1 0 0 1 0 1]" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.parity_check_matrix()" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "4" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.bch_bound()" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "4" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.minimum_distance()" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[15, 10] BCH Code over Finite Field of size 2 with x^5 + x^4 + x^2 + 1 as generator polynomial\n" ] } ], "source": [ "C_bch = C.surrounding_bch_code()\n", "print C_bch" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[15, 12, 4] Generalized Reed-Solomon Code over Finite Field in z4 of size 2^4\n" ] } ], "source": [ "C_grs = C_bch.bch_to_grs()\n", "print C_grs" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[(1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0),\n", " (0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),\n", " (1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0),\n", " (1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0),\n", " (1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0),\n", " (1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0),\n", " (1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0)]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = codes.decoders.GRSGuruswamiSudanDecoder(C_grs, tau=2)\n", "\n", "c = C.random_element()\n", "Ch = channels.StaticErrorRateChannel(C_bch.ambient_space(), 2)\n", "r = Ch.transmit(c)\n", "\n", "D.decode_to_code(r)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "### Reed-Muller codes" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reed-Muller Code of order 2 and 4 variables over Finite Field of size 3\n" ] } ], "source": [ "C = codes.ReedMullerCode(GF(3), 2, 4)\n", "print C" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(15, 81, 27)" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.dimension(), C.length(), C.minimum_distance()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# \n", "# \n", "### A Reed-Muller code of low order lies inside a Reed-Solomon code" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[81, 55, 27] Generalized Reed-Solomon Code over Finite Field in y of size 3^4\n" ] } ], "source": [ "print C.reed_solomon_supercode()" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2, 2, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 0, 2, 0, 0, 0, 2, 2, 0, 2, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 2, 0, 0, 0, 2, 1, 1, 2, 0, 0, 0, 0, 2, 2, 2, 1, 0, 0, 0, 2)\n", "(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0)\n" ] } ], "source": [ "c = C.random_element()\n", "Ch = channels.ErrorErasureChannel(C.ambient_space(), 3, 20)\n", "r = Ch.transmit(c)\n", "print r[0]\n", "print r[1]" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(2, 2, 0, 0, 0, 1, 0, 0, 1, 2, 1, 1, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 2, 2, 0, 1, 0, 0, 1, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 1, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2, 2, 0, 1, 1, 2, 2, 2, 0, 0, 2, 2, 2, 1, 1, 0, 2, 2)" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = C.reed_solomon_supercode().decoder(\"ErrorErasure\")\n", "\n", "D.decode_to_code(r)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "### Benchmarking\n", "\n", "Ex: Comparing decoding speeds of algorithms across number of errors" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "['Syndrome',\n", " 'NearestNeighbor',\n", " 'ErrorErasure',\n", " 'Gao',\n", " 'GuruswamiSudan',\n", " 'KeyEquationSyndrome',\n", " 'BerlekampWelch']" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eval_pts = GF(59).list()[1:] #don't use 0 as eval point\n", "C = codes.GeneralizedReedSolomonCode(eval_pts, 30)\n", "C.decoders_available()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [], "source": [ "D_key = C.decoder(\"KeyEquationSyndrome\")\n", "D_gao = C.decoder(\"Gao\")" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [], "source": [ "V = C.ambient_space()\n", "\n", "max_radius = 14\n", "B_key = codes.Benchmark()\n", "B_gao = codes.Benchmark()\n", "for t in range(0, max_radius+1):\n", " Ch = channels.StaticErrorRateChannel(V, t)\n", " B_key += codes.Benchmark(C, D_key, Ch, identifier=t)\n", " B_gao += codes.Benchmark(C, D_gao, Ch, identifier=t)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting run for benchmark 0\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 0\n", "Starting run for benchmark 1\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 1\n", "Starting run for benchmark 2\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 2\n", "Starting run for benchmark 3\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 3\n", "Starting run for benchmark 4\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 4\n", "Starting run for benchmark 5\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 5\n", "Starting run for benchmark 6\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 6\n", "Starting run for benchmark 7\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 7\n", "Starting run for benchmark 8\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 8\n", "Starting run for benchmark 9\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 9\n", "Starting run for benchmark 10\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 10\n", "Starting run for benchmark 11\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 11\n", "Starting run for benchmark 12\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 12\n", "Starting run for benchmark 13\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 13\n", "Starting run for benchmark 14\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 14\n", "Starting run for benchmark 0\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 0\n", "Starting run for benchmark 1\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 1\n", "Starting run for benchmark 2\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 2\n", "Starting run for benchmark 3\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 3\n", "Starting run for benchmark 4\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 4\n", "Starting run for benchmark 5\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 5\n", "Starting run for benchmark 6\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 6\n", "Starting run for benchmark 7\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 7\n", "Starting run for benchmark 8\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 8\n", "Starting run for benchmark 9\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 9\n", "Starting run for benchmark 10\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 10\n", "Starting run for benchmark 11\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 11\n", "Starting run for benchmark 12\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 12\n", "Starting run for benchmark 13\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 13\n", "Starting run for benchmark 14\n", "25 percent complete\n", "50 percent complete\n", "75 percent complete\n", "Run complete for benchmark 14\n" ] } ], "source": [ "B_key.run(verbosity_level=1)\n", "B_gao.run(verbosity_level=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's plot it!" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n5HJl8Pl8qqmp6fC87vV6ddZZZ/G8HiX8z+2DBw92uxTrOI6jhQsX6s4779T48ePDet8JYb23KLRn\nzx41Nzdr+PDhHfYPHz5cW7dudakqSOYPe8mSJTr33HM1YcIEt8uxUklJiTZv3qwNGza4XYr1ysvL\n9fzzz+u2227TPffco7Vr1+qWW25RUlKS5s+f73Z51rnrrrtUX1+vU089VfHx8WppadHDDz+soqIi\nt0uzXk1NjTweT8Dn9ZqaGpeqgt+RI0d01113ad68eUpNTXW7HOs8+uijGjBggBYvXhz2+4750BCM\n4zgh54Ih8m688UZ9/vnnWrNmjdulWGnnzp1asmSJ/v73vysxMdHtcqzX0tKiadOm6Ve/+pUkadKk\nSfrXv/6l559/ntDggldffVV/+MMfVFJSogkTJmjz5s36xS9+odzcXC1YsMDt8hAAz+vua2pq0uWX\nXy6Px6PnnnvO7XKs8+mnn+rpp5/Wpk2bInL/MT89aejQoYqPj9euXbs67N+9e3eXdynQfxYvXqx3\n3nlHH3zwgXJyctwux0qffvqpamtrNXXqVCUmJioxMVGrV6/WU089pQEDBshxHLdLtEpOTk6XoeTx\n48frm2++cakiu9155526++67dfnll2vixIm66qqrtHTpUj3yyCNul2a97OxsOY7D83qU8QeGiooK\n/e1vf2OUwQUfffSRamtrlZeX1/a8vmPHDt16660qKCjo8/3HfGhITEzU1KlTtWrVqrZ9juNo1apV\nOuecc1yszF6LFy/Wm2++qX/84x8aNWqU2+VY68ILL9SWLVu0efNmlZWVqaysTGeeeabmz5+vsrIy\n3rHrZzNmzOgyZXLr1q0aPXq0SxXZ7eDBg13+DcTFxamlpcWliuCXn5+v7OzsDs/r9fX1Wrt2Lc/r\nLvEHhvLycq1atYpV31yycOFCffbZZ23P6WVlZcrNzdWdd96pd999t8/3b8X0pFtvvVVXX321pk6d\nqmnTpunJJ5/UwYMHdc0117hdmnVuvPFGFRcX66233lJKSkrbO0Xp6elKSkpyuTq7pKSkdLmWJCUl\nRZmZmWG/eArdW7p0qWbMmKFHHnlEV1xxhdauXauXXnpJL774otulWWn27Nl6+OGHlZeXp4kTJ2rj\nxo168skntWjRIrdLs8KBAwf09ddft414lpeXq6ysTBkZGcrLy9OSJUv00EMPaezYsRozZozuvfde\njRw5kmU+IyTU+cjNzdWcOXO0efNm/eUvf1FjY2Pbc3tGRgbTX8Osu38bnQNbYmKisrOzdfLJJ/f9\n4GFZg+kE8OyzzzqjR492kpKSnOnTpzvr1693uyQreTweJy4ursvH73//e7dLg+M43//+91ly1UVv\nv/22873vfc8ZNGiQM2HCBOe3v/2t2yVZq6GhwVm6dKkzZswYJzk52Rk7dqxz3333OY2NjW6XZoUP\nPvgg4PPFtdde23ab+++/38nJyXEGDRrkXHTRRc5XX33lYsWxLdT52L59e5fv+b9evXq126XHnJ78\n22gvPz8/bEuuehyHicsAAAAAgov5axoAAAAA9A2hAQAAAEBIhAYAAAAAIREaAAAAAIREaAAAAAAQ\nEqEBAAAAQEiEBgAAAAAhERoAAAAAhERoAAAAABASoQEAAABASIQGAAAAACERGgAAAACE9P8jYUvu\n874PxQAAAABJRU5ErkJggg==\n", "text/plain": [ "Graphics object consisting of 2 graphics primitives" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = Graphics()\n", "g += B_key.plot(lambda t: \\\n", " (t, B_key.compute_timings(\"decoding\", median, t)), color=\"blue\")\n", "\n", "g += B_gao.plot(lambda t: \\\n", " (t, B_gao.compute_timings(\"decoding\", median, t)), color=\"red\")\n", "g" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "## Other features in Sage:\n", "\n", "See roadmap: https://bitbucket.org/lucasdavid/sage_coding_project\n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "# \n", "\n", "## The future\n", "\n", "ACTIS ends in 1 month :-(\n", "\n", "David Lucas will go do a PhD in something related to - but not really - coding theory.\n", "\n", "### Feedback\n", "* Does it work?\n", "* Is it convenient?\n", "* Does it support your research and your teaching?\n", "* What is missing?\n", " \n", "### Reviewing the implemented-but-not-in-Sage features\n", "* Good math-skills are more important than good programming skills!\n", " \n", "### Developing new features?\n", "* What do you need?\n", "* Contact me if you're interested in helping out!\n", "\n", "### SageDays 22nd--26th August in (outskirts of) Paris on Coding Theory\n", "* For beginners and experiences users/programmers alike!\n", "* It will be awesome! Please join.\n", "* Suggest a project for the week!\n", "* https://wiki.sagemath.org/days75" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 7.3.rc0", "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 }