{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Foundations of Computational Economics #6\n", "\n", "by Fedor Iskhakov, ANU\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## Two simple examples\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "[https://youtu.be/UGExPIDwDMs](https://youtu.be/UGExPIDwDMs)\n", "\n", "Description: Indexing problem and its inverse, base-N number conversion" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Example 1\n", "\n", "Code up a function to convert $ (i,j) $ index in a two-dimensional array\n", "into a single index $ k $ which swipes the matrix by column.\n", "Also code up the inverse of this function." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "# code here" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(0,0) --> 0 --> (0,0)\n", "(0,1) --> 5 --> (0,1)\n", "(0,2) --> 10 --> (0,2)\n", "(0,3) --> 15 --> (0,3)\n", "(0,4) --> 20 --> (0,4)\n", "(0,5) --> 25 --> (0,5)\n", "(0,6) --> 30 --> (0,6)\n", "(0,7) --> 35 --> (0,7)\n", "(0,8) --> 40 --> (0,8)\n", "(0,9) --> 45 --> (0,9)\n", "(1,0) --> 1 --> (1,0)\n", "(1,1) --> 6 --> (1,1)\n", "(1,2) --> 11 --> (1,2)\n", "(1,3) --> 16 --> (1,3)\n", "(1,4) --> 21 --> (1,4)\n", "(1,5) --> 26 --> (1,5)\n", "(1,6) --> 31 --> (1,6)\n", "(1,7) --> 36 --> (1,7)\n", "(1,8) --> 41 --> (1,8)\n", "(1,9) --> 46 --> (1,9)\n", "(2,0) --> 2 --> (2,0)\n", "(2,1) --> 7 --> (2,1)\n", "(2,2) --> 12 --> (2,2)\n", "(2,3) --> 17 --> (2,3)\n", "(2,4) --> 22 --> (2,4)\n", "(2,5) --> 27 --> (2,5)\n", "(2,6) --> 32 --> (2,6)\n", "(2,7) --> 37 --> (2,7)\n", "(2,8) --> 42 --> (2,8)\n", "(2,9) --> 47 --> (2,9)\n", "(3,0) --> 3 --> (3,0)\n", "(3,1) --> 8 --> (3,1)\n", "(3,2) --> 13 --> (3,2)\n", "(3,3) --> 18 --> (3,3)\n", "(3,4) --> 23 --> (3,4)\n", "(3,5) --> 28 --> (3,5)\n", "(3,6) --> 33 --> (3,6)\n", "(3,7) --> 38 --> (3,7)\n", "(3,8) --> 43 --> (3,8)\n", "(3,9) --> 48 --> (3,9)\n", "(4,0) --> 4 --> (4,0)\n", "(4,1) --> 9 --> (4,1)\n", "(4,2) --> 14 --> (4,2)\n", "(4,3) --> 19 --> (4,3)\n", "(4,4) --> 24 --> (4,4)\n", "(4,5) --> 29 --> (4,5)\n", "(4,6) --> 34 --> (4,6)\n", "(4,7) --> 39 --> (4,7)\n", "(4,8) --> 44 --> (4,8)\n", "(4,9) --> 49 --> (4,9)\n" ] } ], "source": [ "def k(i,j,m,base0=True):\n", " '''Convert (i,j) indexes in a two-dimensional array\n", " with m rows into a single index computed column-wise\n", " '''\n", " if base0:\n", " return j*m + i\n", " else:\n", " return (j-1)*m + i\n", "\n", "def ik(k,m,base0=True):\n", " '''Convert k index in a two-dimensional array\n", " with m rows into a pair of (i,j) indexes\n", " '''\n", " if base0:\n", " j = k//m\n", " i = k%m\n", " else:\n", " j = k//m + 1\n", " i = k%m\n", " return i,j\n", "\n", "m=5\n", "for i in range(5):\n", " for j in range(10):\n", " k0 = k(i,j,m)\n", " i1,j1 = ik(k0,m)\n", " print('(%d,%d) --> %d --> (%d,%d)'%(i,j,k0,i1,j1))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1,1) --> 1 --> (1,1)\n", "(1,2) --> 6 --> (1,2)\n", "(1,3) --> 11 --> (1,3)\n", "(1,4) --> 16 --> (1,4)\n", "(1,5) --> 21 --> (1,5)\n", "(1,6) --> 26 --> (1,6)\n", "(1,7) --> 31 --> (1,7)\n", "(1,8) --> 36 --> (1,8)\n", "(1,9) --> 41 --> (1,9)\n", "(1,10) --> 46 --> (1,10)\n", "(2,1) --> 2 --> (2,1)\n", "(2,2) --> 7 --> (2,2)\n", "(2,3) --> 12 --> (2,3)\n", "(2,4) --> 17 --> (2,4)\n", "(2,5) --> 22 --> (2,5)\n", "(2,6) --> 27 --> (2,6)\n", "(2,7) --> 32 --> (2,7)\n", "(2,8) --> 37 --> (2,8)\n", "(2,9) --> 42 --> (2,9)\n", "(2,10) --> 47 --> (2,10)\n", "(3,1) --> 3 --> (3,1)\n", "(3,2) --> 8 --> (3,2)\n", "(3,3) --> 13 --> (3,3)\n", "(3,4) --> 18 --> (3,4)\n", "(3,5) --> 23 --> (3,5)\n", "(3,6) --> 28 --> (3,6)\n", "(3,7) --> 33 --> (3,7)\n", "(3,8) --> 38 --> (3,8)\n", "(3,9) --> 43 --> (3,9)\n", "(3,10) --> 48 --> (3,10)\n", "(4,1) --> 4 --> (4,1)\n", "(4,2) --> 9 --> (4,2)\n", "(4,3) --> 14 --> (4,3)\n", "(4,4) --> 19 --> (4,4)\n", "(4,5) --> 24 --> (4,5)\n", "(4,6) --> 29 --> (4,6)\n", "(4,7) --> 34 --> (4,7)\n", "(4,8) --> 39 --> (4,8)\n", "(4,9) --> 44 --> (4,9)\n", "(4,10) --> 49 --> (4,10)\n", "(5,1) --> 5 --> (0,2)\n", "(5,2) --> 10 --> (0,3)\n", "(5,3) --> 15 --> (0,4)\n", "(5,4) --> 20 --> (0,5)\n", "(5,5) --> 25 --> (0,6)\n", "(5,6) --> 30 --> (0,7)\n", "(5,7) --> 35 --> (0,8)\n", "(5,8) --> 40 --> (0,9)\n", "(5,9) --> 45 --> (0,10)\n", "(5,10) --> 50 --> (0,11)\n" ] } ], "source": [ "# Running the check for base1 reveals the bug when i=5!\n", "\n", "m=5\n", "for i in range(1,m+1):\n", " for j in range(1,11):\n", " k0 = k(i,j,m,base0=False)\n", " i1,j1 = ik(k0,m,base0=False)\n", " print('(%d,%d) --> %d --> (%d,%d)'%(i,j,k0,i1,j1))\n", "\n", "# So, the correct inverse conversion in base1 should be:\n", "\n", "def ik(k,m,base0=True):\n", " '''Convert k index in a two-dimensional array\n", " with m rows into a pair of (i,j) indexes\n", " '''\n", " if base0:\n", " j = k//m\n", " i = k%m\n", " else:\n", " j = (k-1)//m + 1\n", " i = (k-1)%m + 1\n", " return i,j" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1,1) --> 1 --> (1,1)\n", "(1,2) --> 6 --> (1,2)\n", "(1,3) --> 11 --> (1,3)\n", "(1,4) --> 16 --> (1,4)\n", "(2,1) --> 2 --> (2,1)\n", "(2,2) --> 7 --> (2,2)\n", "(2,3) --> 12 --> (2,3)\n", "(2,4) --> 17 --> (2,4)\n", "(3,1) --> 3 --> (3,1)\n", "(3,2) --> 8 --> (3,2)\n", "(3,3) --> 13 --> (3,3)\n", "(3,4) --> 18 --> (3,4)\n", "(4,1) --> 4 --> (4,1)\n", "(4,2) --> 9 --> (4,2)\n", "(4,3) --> 14 --> (4,3)\n", "(4,4) --> 19 --> (4,4)\n", "(5,1) --> 5 --> (5,1)\n", "(5,2) --> 10 --> (5,2)\n", "(5,3) --> 15 --> (5,3)\n", "(5,4) --> 20 --> (5,4)\n" ] } ], "source": [ "m=5\n", "for i in range(1,m+1):\n", " for j in range(1,5):\n", " k0 = k(i,j,m,base0=False)\n", " i1,j1 = ik(k0,m,base0=False)\n", " print('(%d,%d) --> %d --> (%d,%d)'%(i,j,k0,i1,j1)) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Example 2\n", "\n", "Write a function to converter a decimal number into a given base. Return the result as string." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "# code here" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "def baseN(x,base=2):\n", " '''Converts given number to given base'''\n", " digits = [str(i) for i in range(10)] + [chr(i) for i in range(97,123)]\n", " assert 2 <= base <= len(digits),'Number base must be between 2 and %d'%(len(digits))\n", " if x == 0:\n", " return '0'\n", " out = []\n", " while x>0:\n", " i = x%base\n", " out.append(digits[i])\n", " x = x//base\n", " return ''.join(out[::-1])\n", "\n", "for n in [3,8,35,574,1023523,9999]:\n", " for b in range(36,1,-4):\n", " print('%d in base %d is %s' % (n,b,baseN(n,b)))\n", " print()" ] } ], "metadata": { "celltoolbar": "Slideshow", "date": 1628246895.2099788, "filename": "06_python_ex1.rst", "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.6" }, "title": "Foundations of Computational Economics #6" }, "nbformat": 4, "nbformat_minor": 4 }