{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Vector Norms"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Computing norms by hand\n",
        "\n",
        "$p$-norms can be computed in two different ways in numpy:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import numpy.linalg as la"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [],
      "source": [
        "x = np.array([1.,2,3])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "First, let's compute the 2-norm by hand:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.7416573867739413"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "np.sum(x**2)**(1/2)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Next, let's use `numpy` machinery to compute it:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.7416573867739413"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(x, 2)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Both of the values above represent the 2-norm: $\\|x\\|_2$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "--------------\n",
        "\n",
        "## About the $\\infty$-norm\n",
        "\n",
        "Different values of $p$ work similarly:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.077384885394063"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "np.sum(np.abs(x)**5)**(1/5)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.077384885394063"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(x, 5)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "---------------------\n",
        "\n",
        "The $\\infty$ norm represents a special case, because it's actually (in some sense) the *limit* of $p$-norms as $p\\to\\infty$.\n",
        "\n",
        "Recall that: $\\|x\\|_\\infty = \\max(|x_1|, |x_2|, |x_3|)$.\n",
        "\n",
        "Where does that come from? Let's try with $p=100$:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "array([1.00000000e+00, 1.26765060e+30, 5.15377521e+47])"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x**100"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "5.153775207320113e+47"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "np.sum(x**100)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Compare to last value in vector: the addition has essentially taken the maximum:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.0"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "np.sum(x**100)**(1/100)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Numpy can compute that, too:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "3.0"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "la.norm(x, np.inf)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "-------------\n",
        "\n",
        "## Unit Balls\n",
        "\n",
        "Once you know the set of vectors for which $\\|x\\|=1$, you know everything about the norm, because of semilinearity. The graphical version of this is called the 'unit ball'.\n",
        "\n",
        "We'll make a bunch of vectors in 2D (for visualization) and then scale them so that $\\|x\\|=1$."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(-1.5, 1.5)"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHnlJREFUeJzt3Xl4HPWd5/H3tw+1LkuWJeFDvjDIF6fBMTawQUBCCJNgEuAZ8oQJZJJxLiaZzGaeJZvdZCczz4ZkZp88yZMLLznIzABO2EnwDE4cCFYggImdYOMLH9jGlixZtmTrvrr7u390ychCtlrV1V2t0vf1PP2ouuunrq+6S5/61a+qukVVMcaY8Qr5XYAxZmKy8DDGuGLhYYxxxcLDGOOKhYcxxhULD2OMK56Eh4j8SERaRGTnOebXiUi7iGxzbl/2YrnGGP9EPHqenwDfAX56njYvqOr7PFqeMcZnnvQ8VPV5oM2L5zLGTAxe9TzSsUpEtgPHgC+o6q7RGonIGmANQGFh4dVz587NYYnnl0wmCYXyZ5jI6hlbvtWUb/Xs27fvpKpWu/plVfXkBswHdp5jXhlQ6kzfBuxP5zkXLlyo+WTTpk1+l3AWq2ds+VZTvtUDbFWX//M5iUBV7VDVLmd6AxAVkapcLNsYkx05CQ8RmSEi4kyvcJbbmotlG2Oyw5MxDxF5HKgDqkSkAfgKEAVQ1R8AdwGfEpE40Avc43SZjDETlCfhoaofGmP+d0gdyjXGBET+DPsaYyYUCw9jjCsWHsYYVyw8jDGuWHgYY1yx8DDGuGLhYYxxxcLDGOOKhYcxxhULD2OMKxYexhhXLDyMMa5YeBhjXLHwMMa4YuFhjHHFwsMY44qFhzHGFQsPY4wrFh7GGFcsPIwxrlh4GGNcsfAwxrhi4WGMccXCwxjjioWHMcYVCw9jjCsWHsYYVzwJDxH5kYi0iMjOc8wXEfm2iBwQkddE5CovlmuM8Y9XPY+fALeeZ/57gVrntgb4vkfLNcb4JOLFk6jq8yIy/zxNVgM/VVUFNovIVBGZqapNXizfvJ2qMphQBhNJ1Lmf+jnUABRFlTPznYedx9Rp89bvjGx/5rmcNi09SQ6f7EaH1TBERFI/z9x3fiJnphk5TwRx7odDQiQUIhIWos7PSEjOPK/JPU/CIw01wNFh9xucxyw8xtDRN0hDWy+Np3tp7ujjdPcAp3sHOdUzwBtH+/j27hfpGUjQH0/SN5hwbkn64wmSOvbze+75+pwuLhUqQiwSojQWoTgWoSQWoaQgTHFBhL6Ofl7u3UN1aYzK0gKqSmPUTC1idkUxBREb8stErsIjbSKyhtSuDdXV1dTX1/tb0DBdXV1Zq6cvrhxqT3K0M3Vr6EzS3JOkN/72toVhKIkKxeEkZckOisNCeQQKYkI0DAUhIRqOEg1BJJTaugNntuJDxLkhb/UIcNrI8DYjfmeo/cjf6e/rp7AwdlZvQICRGTa8R/JWL2VEmxHzkgoJhUQSEqrDplO3wYTSl4jTFx+kvxdOdCp9CejsT7D52EHiI55fgMoiYXqxMHtKiHllYeaXhZhRIoSy2JvJ5jqUa7kKj0ZgzrD7s53H3kZV1wJrARYtWqR1dXVZLy5d9fX1eFVPIqlsPdxG/b4TbD7YymsN7SScrkJlSQFLZk7lndUlzK4opqaiiJqpRcwsL6S8OEosEva8Hi/kWz2QqumGG26goy9Oa1c/Jzr7OXqqlyOt3bzZ1sPhk93UN3TSH0+ldHlRlGsvquS6i6u4YWE1c6YVe15Pvr1GbuUqPNYDD4jIE8A1QPtkHe/Y2djOui1H+fWuZk509hMJCVfOmcqnbriI5fMruGRWOdVTYn6XGSgiQnlRlPKiKAuqS7lmxPx4IsmBE13saGhny+E2fr//JL/a2QzAVXOnsvrKGm6/YhYVJQW5Lz6PeRIeIvI4UAdUiUgD8BUgCqCqPwA2ALcBB4Ae4KNeLHeiUFU27mrm/75wiD++eYrCaIibFl/Aey+dyU2LL6Aklnd7j5NKJBxi8YwyFs8o4+7lc1BVDp3sZuOu4zy1rZGvrN/F1361h7uvnsPHrr+Q+VUlfpecF7w62vKhMeYr8BkvljXRvPTGSb7+q9fZ3tDOvMpi/uf7lnLX1bMpL4r6XZo5BxFhQXUpn6or5VN1F7H7WAc/eekQ67Yc5bE/HOHD18zlczfXUlk6uXuItsnLkvaeQf7h6d08+ccGaqYW8U93Xc4Hr5pNOGSHFieapbPK+MZdV/CFWxbx7ef282+vHOGpbcf4hzsu5fYrZvldnm8sPLJgR0M7n/iXrRzv7OczN17EX99US2E07HdZJkMXlBXyj3dcxn2r5vN3T77GZx9/lef2HOehOy+flO+vHej22NOvNXHXD15CRPj3T13L371n8aRcsYKsdvoUnvzkKv723Qt5avsx/vzhl2np7PO7rJyz8PDQL15t4K8f/xOXzy5n/QPXccWcqX6XZLIkEg7x2Ztrefjeq9nf0sU9azdPugCx8PDIM7uP87c/287KBZU8+pcrJv1g2mRxyyUz+MlHV9B0uo97H3mFjr5Bv0vKGQsPD+xp6uBzT7zK5TXl/PC+d1BcYENJk8mKC6fxw/uWc/BEN59/YhtJX64LyD0Ljwz1DSb4zGN/YkphhLUfWU5RgY1vTEbXXlzFl9+/lN++3sL3f/eG3+XkhIVHhv5p414Onujm/9x9JdPLCv0ux/joL1bO47bLZvCtZ/dzoKXT73KyzsIjA/uOd/LjFw/x4Wvmcn1tld/lGJ+JCH9/+6UUx8L8j1/uPOsCwCCy8MjA/96wh5JYhC/cssjvUkyeqJ4S42/fvZDNB9t4fv9Jv8vJKgsPl15rOE393hN8uu5iu2DKnOWed8xlzrQi/nnj3kD3Piw8XHrkhUOUxiLcu3Ku36WYPFMQCfHpuovZ0djO1jdP+V1O1lh4uNDS2cfTO5r483fMYUqhXeBm3m71lbOYUhjhpy+/6XcpWWPh4cLTrzWRSCr3vGPO2I3NpFRcEOHOq2azcWcznQE9cczCw4Wnth1jycwyaqdP8bsUk8fef8UsBhJJnnu9xe9SssLCY5xaOvrYdvQ077t8pt+lmDy3bM5UppfF2LAjmB+aZ+ExTi++kTr8dsPCap8rMfkuFBJuXjKdlw60Ek8k/S7HcxYe4/T7/a1MLY6ydGaZ36WYCWDlgko6++PsburwuxTPWXiM0yuHWlm1oJKQfSKYScPKC6cBsPlgq8+VeM/CYxy6BpSGU732OR0mbReUFTJnWhHbj7b7XYrnLDzG4Uhnar/10lnlPldiJpIlM8rY02y7LZPa4Y4EAJfMsvEOk77FM8s4fLKb3oGE36V4ysJjHJq7larSAruWxYzLkhlTSCrsD9hl+hYe43CiJ8lcj79+0ATf0JdEHWnr8bkSb1l4jENLjzKv0r4tzIxPTUURAI2nen2uxFsWHmkaiCdp61PPv/jYBF9ZYZSywggNFh6T08mufhSYWW4fNWjGr6aimMbTFh6TUmvXAACVNlhqXJheFgvc97p4Eh4icquI7BWRAyLy4Cjz7xeREyKyzbl93Ivl5tLJ7n4A+z4W40pFcQGne4J1aX7GXzAiImHgu8C7gQZgi4isV9XdI5quU9UHMl2eX4Z6HtUWHsaFqcVRJzyCs/540fNYARxQ1YOqOgA8Aaz24HnzSpvT86gosU8OM+NXUVxAV3+ceIC+EMqLrzarAY4Ou98AXDNKuztF5J3APuDzqnp0lDaIyBpgDUB1dTX19fUelJi5XfsHEJQtL/+ekOTHRXFdXV158/pA/tUD+VNTS0Nql6XldHde1OOFXH0v4n8Aj6tqv4h8AngUuGm0hqq6FlgLsGjRIq2rq8tRief3QtduYocPcdONN/pdyhn19fXky+sD+VcP5E9N7dsa+dc926CgOC/q8YIXuy2NwPAP85ztPHaGqraqar9z9xHgag+Wm1M9A3FikfzocZiJZ+j7iwcSwdlt8SI8tgC1InKhiBQA9wDrhzcQkeGf2Xc7sMeD5eZUd3+CQvsaWuNSYTT1rzYYoA8Uy3i3RVXjIvIAsBEIAz9S1V0i8lVgq6quBz4rIrcDcaANuD/T5eZaz0CcWNh6HsadWCS15QnShbWejHmo6gZgw4jHvjxs+ovAF71Yll96BhLErOdhXBrqeQwE6GiLnWGapsFEkoi9WsalwmhqyxOk3Rb7d0jTYEIJ58khWjPxxJwtz6ANmE4+iaQSslfLuDTU8wjSmIf9O6RpMJHExkuNWxHn0/YD1PGw8EhXPKkWHsY1cXZ5A5QdFh7pituAqcnAme1OgNLD/h3SFE9q3lzTYiaeoVUnQNlh4ZGueMJ2W4x7gu22TFpJVewbJo1rAVx3LDzSFKQthsm9M7stAVqRLDzGIYAbD5MjQ+tOgLLDwiNdQdpimNyTAA62W3iMR/Def5Mjb/U8grMVsvBIW3DedJN7EsD9FguPNKlax8O4Z4dqJzkLD+OWnSQ2iQXpTTc+CtCKZOExHtb1MC5Zz2MSUztWazJgYx6TmGIdD+NeAE/zsPAwJhfOHKkNUNfDwiNNQXrTTe7ZGaaTXPDefpMrATxHzMIjXTZgajJhV9VOcgHseZocsd0WY0xGAtTxsPAYjyB1OU3uiVh4vI2I3Coie0XkgIg8OMr8mIisc+a/IiLzvVhuLolIoN54k3sCgUqPjMNDRMLAd4H3AkuBD4nI0hHNPgacUtWLgW8CX890ubkWwF1Wk2NB2wB50fNYARxQ1YOqOgA8Aawe0WY18Kgz/SRws0ywESQhUBsN44NEUnn5WNzvMjwT8eA5aoCjw+43ANecq42qxkWkHagETo58MhFZA6wBqK6upr6+3oMSMxcfHGRwUPOmHoCuri6rZwz5VlPHQDKv6smEF+HhKVVdC6wFWLRokdbV1flbkKPghWeIRpLkSz0A9fX1Vs8Y8qmmyG828J750bypJ1Ne7LY0AnOG3Z/tPDZqGxGJAOVAqwfLzinbbTHmLV6ExxagVkQuFJEC4B5g/Yg264H7nOm7gOd0gp2yGbTDbMZkKuPdFmcM4wFgIxAGfqSqu0Tkq8BWVV0P/BD4FxE5ALSRCpgJxtLDZCZoq48nYx6qugHYMOKxLw+b7gPu9mJZfrGeh/HChDrEOAY7wzRNQXrTjT8m2J76mCw80mQ9D+OJAG2FLDzSJEF6143xgIVHmkTswjiTmaCtPhYexuRQkPqvFh5psmtbTKaC1nO18EjTBLuOz+SpIK1FFh7jELQthzGZsPBIk3U8jDmbhUea7DwPY85m4ZEmQVCLD+NS0M4uBQuPtIkdbjEeCNLur4XHOFh2GLcC2PGw8EhXgDYYxkdBWo8sPNJk53kYczYLjzQJwex6mtwI4qpj4ZEuO1RrMhBPJgEIB6gDa+GRpgC958YH8URq0xMK0H9cgP6U7Arat32Z3IonU2tPOEBjZxYexuRA4kx4+FyIhyw80mQDpiYT8URqzCNk4TH5hEO222Lci1vPY/KKRUIMJPyuwkxUZ3ZbAvQfF6A/Jbti0TADCet7GHeGeh4hGzCdfAqjYQaTfldhJqr+eKrbGg3Qf1yA/pTsKoyErOdhXOvuT4VHLOxzIR6y8EhTzHoeJgO9A0PhYbstAIjINBF5RkT2Oz8rztEuISLbnNv6TJbpl8JIyMLDuNYzEAes5zHcg8BvVbUW+K1zfzS9qnqlc7s9w2X6ojAapt92W4xLPU7PozBiPY8hq4FHnelHgTsyfL68VVYUoTcezI+TM9nXMxC8MY9Ihr8/XVWbnOlmYPo52hWKyFYgDjykqr881xOKyBpgDUB1dTX19fUZluiN1mODJBU2PFtPSTQ/th5dXV158/pA/tUD+VPTtkMDACT6evKiHi+MGR4i8iwwY5RZXxp+R1VVRM61WZ6nqo0isgB4TkR2qOobozVU1bXAWoBFixZpXV3dWCXmxMkpDTyxdzuXXrWCeZUlfpcDQH19Pfny+kD+1QP5U9PLPXsoeOMwleWFeVGPF8YMD1V917nmichxEZmpqk0iMhNoOcdzNDo/D4pIPbAMGDU88lVFcRSAUz2DzKv0uRgz4bR2D1BVUhCoT6TLdMxjPXCfM30f8NTIBiJSISIxZ7oKuA7YneFyc25qcQEAp3oGfK7ETERt3QNMKy3wuwxPZRoeDwHvFpH9wLuc+4jIchF5xGmzBNgqItuBTaTGPCZceFQ5b/zJzn6fKzETUWtXP5UlMb/L8FRGA6aq2grcPMrjW4GPO9MvAZdlspx8MKO8EAEaT/f6XYqZgJra+1g0YwrQ43cpnrEzTNMUi4SZGhMaTll4mPHpHUjQ0tnP3GnFfpfiKQuPcagsEhpOBWfLYXJjaJ2ZY+ExeVUXCUdaLTzM+BxpS60zsyssPCatmikhjrX30d476HcpZgLZd7wLgIuq8+P8IK9YeIzDnCmpl2tvc6fPlZiJZHdTBzVTi84c7g8KC49xmOuEx56mDp8rMRPJ7mPtLJ1V5ncZnrPwGIepMaGqNMa2o6f9LsVMEO29gxw62c0lFh6Tm4hwzYJpbD7YalfXmrT84VAbSYWVC4J3TYOFxzitWlBJU3sfb9pRF5OGl99oJRYJsWzuVL9L8ZyFxzhdd3EVAJv2jnoNoDFnqCq/29fCO+ZPIxYJ0Ad5OCw8xunCqhIWTZ/Chh1NYzc2k9q+4128caKb91w62idaTHwWHi7cdtlMtr55iub2Pr9LMXnsP187Rkjg1kssPIxj9ZWzUIV1W476XYrJU4OJJE/+sYHrLq6iekqwrqYdYuHhwvyqEm5YWM2/vfImgwn7SHXzdht3NdPU3sd9q+b7XUrWWHi4dP9182np7Off/9TgdykmzySTysO/O8jcacXcuPgCv8vJGgsPl+oWVnPV3Kl885n99A3aN2Cbt2zY2cSOxnY+d3Mt4VBwPnZwJAsPl0SE/3brYpo7+nj4dwf9Lsfkid6BBN/49V4Wz5jCHctq/C4nqyw8MnDNgkref8UsvrNpP6832/UuBr6x8XWOtPXwlfdfEuheB1h4ZOzvb7+EssIon338Vbr6436XY3y06fUWfvziYe5bNY9VFwXvdPSRLDwyNK2kgG/ds4wDLV38159tI5G0a14mowMtnXz28Ve5ZFYZD753id/l5ISFhweur63iS3+2lI27jvPg/3uNpAXIpHLoZDf3PvIHYtEQaz+ynKKC4J2KPppMv27SOD52/YV09A7yrd/uJ55UHrrzskBez2DOtvtYB3/5ky0MJJI89lfXUDO1yO+ScsbCw0N/865aomHhn3+zjzdbu/n+vVczvazQ77JMljz9WhNf+Pl2youiPP5XK52vVpg8bLfFQyLCAzfV8r0PX8Wepk5u+ebz/PLVRvvsj4A53TPA59dt4zOP/YklM6ew/oHrJl1wgPU8suK2y2ayeMYUvvDz7fzNum089soRvnjbYpbNrfC7NJOB/niCf918hO9uOkBH7yCfu7mWz9x4MQWRybkNtvDIkgXVpfz8k9fy2B+O8K1n9/OB773EDQur+eh183lnbTWhgJ8DECSnewZYt+UoP335TRpP93L9xVX899uWBPJzScfDwiOLwiHhL1bO44PLavjxi4d49OU3uf/HW5hXWcz7L5/Fn12e6qEE6ZvTg6JvMEH93hM8vaOJZ3Y30zeYZMWF03jozsv4L7XVfpeXFzIKDxG5G/hfpL7MeoXzHbWjtbsV+BYQBh5R1YcyWe5EUxKL8MBNtax550Vs2NHEz/94lO/VH+A7mw4wu6KIay+qZNVFlSyfN43ZFUUWJj7oG0ywp6mDzQfbePlgK1sPt9EzkGBaSQF3XjWbe1fOY8nMyd3TGCnTnsdO4IPAw+dqICJh4LvAu4EGYIuIrFfV3Rkue8IpiIS4Y1kNdyyr4WRXP7/e2cwL+0+wcddxfrY1dXXulMIIS2eWsWRmGfMqi5k7LXWbXVE8ac4fyJZkUjnZ1c/RU700nOqh4VQve5s72dPUwcGT3WdO8Ku9oJS7rp7NLUtnsHLBNCLhyTmmMZaMwkNV9wBjbSlXAAdU9aDT9glgNTDpwmO4qtIY966cx70r55FIKnuaOtjecJpdxzrYfayDdVuO0jviat3igjCVpQVMK4lRVVJAX0c/z57eQUlBhKKC8JmfRdEwkbAQCYUIh4RISM66Hw3LWe/Z0OTwd3Fovoxok3pM3vaYKhxqT1Bx9DRK6vM71XkcFFXO3B8+T3FmwFmPvdU+1Zbhjzvz+uMJ+gaT9A0m6BtM0B9/a7qrP86p7kEOHevla68+z6meAU71DDCYOPvI16zyQpbMLOPWS2ewdGYZy+dPC+yH93gtF2MeNcDwj9xqAK7JwXInjHBIuLSmnEtrys88pqq0dg9wpK2Ho209NJ7upa1rgNbuAU529dPc0UdzW4I97c30DMTpG8yTDyV6+UW/K6AwGqI0FqGiuAAB5lcWs2zuVCpKCphVXsjsimJmVxRRU1FEcYEN+7k15isnIs8Co30I45dU9SmvCxKRNcAagOrqaurr671ehGtdXV2+1FPu3Ch1btOH6klSWhoFoiRV6U9Af1wZSEIiCUmFuCpJhYSm7ieSkFBFh23tRxp6bLTTU0Ztr6leSF9vH0VFqZPiRIb1Whjqpciw6bN7NWf3es7+XZz7I6ejISEahoIQRMNCNATR0PCesNLVlaC0tOutJ+8HmqGxGRpH+Vuyza91KCtUNeMbUA8sP8e8VcDGYfe/CHwxnedduHCh5pNNmzb5XcJZrJ6x5VtN+VYPsFVd/t/nYiRoC1ArIheKSAFwD7A+B8s1xmRRRuEhIh8QkQZSvYunRWSj8/gsEdkAoKpx4AFgI7AH+Jmq7sqsbGOM3zI92vIL4BejPH4MuG3Y/Q3AhkyWZYzJL3YA2xjjioWHMcYVCw9jjCsWHsYYVyw8jDGuWHgYY1yx8DDGuGLhYYxxxcLDGOOKhYcxxhULD2OMKxYexhhXLDyMMa5YeBhjXLHwMMa4YuFhjHHFwsMY44qFhzHGFQsPY4wrFh7GGFcsPIwxrlh4GGNcsfAwxrhi4WGMccXCwxjjioWHMcYVCw9jjCsWHsYYVzIKDxG5W0R2iUhSRJafp91hEdkhIttEZGsmyzTG5IdIhr+/E/gg8HAabW9U1ZMZLs8YkycyCg9V3QMgIt5UY4yZMDLteaRLgd+IiAIPq+raczUUkTXAGuduv4jszEWBaaoC8qn3ZPWMLd9qyrd6Frn9xTHDQ0SeBWaMMutLqvpUmsu5XlUbReQC4BkReV1Vnx+toRMsa51lb1XVc46l5JrVc375Vg/kX035WI/b3x0zPFT1XW6ffNhzNDo/W0TkF8AKYNTwMMZMDFk/VCsiJSIyZWgauIXUQKsxZgLL9FDtB0SkAVgFPC0iG53HZ4nIBqfZdOD3IrId+APwtKr+Os1FnHNsxCdWz/nlWz2QfzUFph5RVS8LMcZMEnaGqTHGFQsPY4wreRMe+Xiq+zhqulVE9orIARF5MIv1TBORZ0Rkv/Oz4hztEs7rs01E1mehjvP+vSISE5F1zvxXRGS+1zWMs577ReTEsNfk41mu50ci0nKuc5Qk5dtOva+JyFU+11MnIu3DXp8vp/XEqpoXN2AJqRNW6oHl52l3GKjKl5qAMPAGsAAoALYDS7NUzzeAB53pB4Gvn6NdVxZfkzH/XuDTwA+c6XuAdT7Xcz/wnVysM87y3glcBew8x/zbgF8BAqwEXvG5njrgP8f7vHnT81DVPaq61+86hkuzphXAAVU9qKoDwBPA6iyVtBp41Jl+FLgjS8s5n3T+3uF1PgncLNm7hiGXr39aNHUCZNt5mqwGfqopm4GpIjLTx3pcyZvwGIehU93/6JzK7rca4Oiw+w3OY9kwXVWbnOlmUofBR1MoIltFZLOIeB0w6fy9Z9qoahxoByo9rmM89QDc6ewiPCkic7JUS7pyuc6ka5WIbBeRX4nIJen8Qq6ubQFyf6p7DmvyzPnqGX5HVdW5Vmg085zXaAHwnIjsUNU3vK51AvkP4HFV7ReRT5DqFd3kc0355E+k1pkuEbkN+CVQO9Yv5TQ8NA9PdfegpkZg+JZstvOY5/WIyHERmamqTU43t+UczzH0Gh0UkXpgGalxAS+k8/cOtWkQkQhQDrR6tPxx16Oqw5f9CKmxIz95us5kSlU7hk1vEJHviUiVjvERGhNqtyVPT3XfAtSKyIUiUkBqgNDzIxyO9cB9zvR9wNt6RiJSISIxZ7oKuA7Y7WEN6fy9w+u8C3hOnZG5LBiznhHjCbcDe7JUS7rWAx9xjrqsBNqH7Y7mnIjMGBqTEpEVpHJh7LDP1Qh0GiPCHyC179cPHAc2Oo/PAjY40wtIjaZvB3aR2rXwtSZ9a/R8H6mte9ZqIjVu8FtgP/AsMM15fDnwiDN9LbDDeY12AB/LQh1v+3uBrwK3O9OFwM+BA6QuSViQ5fdprHq+5qwv24FNwOIs1/M40AQMOuvPx4BPAp905gvwXafeHZzn6GKO6nlg2OuzGbg2nee109ONMa5MqN0WY0z+sPAwxrhi4WGMccXCwxjjioWHMcYVCw9jjCsWHsYYV/4/jmzB8j0DeYUAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "alpha = np.linspace(0, 2*np.pi, 2000, endpoint=True)\n",
        "x = np.cos(alpha)\n",
        "y = np.sin(alpha)\n",
        "\n",
        "vecs = np.array([x,y])\n",
        "\n",
        "p = 5\n",
        "norms = np.sum(np.abs(vecs)**p, axis=0)**(1/p)\n",
        "norm_vecs = vecs/norms\n",
        "\n",
        "import matplotlib.pyplot as pt\n",
        "%matplotlib inline\n",
        "pt.grid()\n",
        "pt.gca().set_aspect(\"equal\")\n",
        "pt.plot(norm_vecs[0], norm_vecs[1])\n",
        "pt.xlim([-1.5, 1.5])\n",
        "pt.ylim([-1.5, 1.5])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": true
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 1
}