{
"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
}