{ "cells": [ { "cell_type": "markdown", "id": "66a46599", "metadata": {}, "source": [ "# High School with Python\n", "\n", "\n", "Use the math you already know, or are just learning, to get stronger in Python. \n", "\n", "Use the Python you already know, or learned recently, to teach yourself more math.\n", "\n", "Climb the spiral staircase to greater mastery of today's tools and technologies.\n", "\n", "* Age range: Open to anyone wanting to combine working out in Python, learning the language, while using high school level math topics as \"grist for the mill\". \n", "\n", "* Format: Home school format over Zoom. BYOD (bring your own device). Hands on. Be willing to install new software to your local machine. Be willing to share your screen on Zoom. Be willing to open free accounts in the cloud, and paid accounts optionally.\n", "\n", "* Make your own Jupyter Notebooks and share them with your peers.\n", "\n", "* Collaborate on coding projects." ] }, { "cell_type": "markdown", "id": "f2787ae7", "metadata": {}, "source": [ "Are you reading this as a PDF document? Then chances are, it was generated by an operating system level process looking something like this:" ] }, { "cell_type": "code", "execution_count": 1, "id": "4df5059c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[NbConvertApp] Converting notebook class_proposal.ipynb to webpdf\n", "[NbConvertApp] Building PDF\n", "[NbConvertApp] PDF successfully created\n", "[NbConvertApp] Writing 288776 bytes to class_proposal.pdf\n" ] } ], "source": [ "! jupyter nbconvert --to webpdf class_proposal.ipynb " ] }, { "cell_type": "markdown", "id": "084d3cb8", "metadata": {}, "source": [ "Getting Jupyter Notebooks to render as PDFs, including with $\\LaTeX$ and Unicode emoji, is cutting edge tech at the time of this writing (Fall, 2021).\n", "\n", "As a webpdf, this document has no page breaks, so good luck trying to print it out. Adding page breaks to webpdfs is a good example of an ongoing community project." ] }, { "cell_type": "code", "execution_count": 2, "id": "7e87fe00", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.7.9 (default, Aug 31 2020, 07:22:35) \n", "[Clang 10.0.0 ]\n" ] } ], "source": [ "import sys\n", "print(sys.version)" ] }, { "cell_type": "markdown", "id": "c7090a19", "metadata": {}, "source": [ "## Examples of high school math topics:\n", "\n", "* Functions and Relations\n", "* Trigonometry\n", "* Cryptography\n", "* Pascal's Triangle and Binomial Distribution\n", "* Figurate and Polyhedral Number Sequences\n", "* $\\LaTeX$ for Math Expressions\n", "* Publishing to the Web or other eFormats\n", "* Complex Numbers (complex plane)\n", "* Vectors and Matrices (spatial geometry)\n", "* Group and Number Theory topics\n", "* Mandelbrot Set (fractals)\n", "* Calculus (differentiating and integrating)" ] }, { "cell_type": "markdown", "id": "917d6835", "metadata": {}, "source": [ "### Trigonometry\n", "\n", "Plotting sine waves in color requires very little code when you start with numpy and pandas. But then we're already inside a Jupyter Notebook, which you may think of as your new desktop workspace. In the context of JupyterLab, you will have easy access to a Python console, interactive editing, other file type viewing." ] }, { "cell_type": "code", "execution_count": 3, "id": "0082bed2", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "%matplotlib inline\n", "\n", "domain = np.linspace(-10, 10, 400) # give me 400 points evenly spaced from -10 to 10\n", "cos_wave = np.cos(domain) # cos(x) where x is every one of those 400 points\n", "sin_wave = np.sin(domain) # ditto sin(x)\n", "\n", "# build a table\n", "tabular = pd.DataFrame({\"domain\": domain, \"cosine\": cos_wave, \"sine\": sin_wave}) " ] }, { "cell_type": "code", "execution_count": 4, "id": "037c3698", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot!\n", "tabular.plot(x=\"domain\", y=[\"cosine\", \"sine\"], title=\"Trig Functions\", grid=True);" ] }, { "cell_type": "markdown", "id": "2e858091", "metadata": {}, "source": [ "### Pascal's Triangle\n", "\n", "The Python *generator* below yields successive rows of Pascal's Triangle. \n", "\n", "Generators are a special construct in Python. They're similar to functions, but get nudged forward by next(), running until a next ```yield``` statement is encountered, resuming execution from wherever the program last yielded. \n", "\n", "A generator does not forget its internal state, between nudgings. Arriving at the same ```yield``` statement over and over, inside a while True loop, is not atypical, as in the example below." ] }, { "cell_type": "code", "execution_count": 5, "id": "46a1d318", "metadata": {}, "outputs": [], "source": [ "def pascal():\n", " row = np.array([1])\n", " while True:\n", " yield row\n", " row = np.append(row, 0) + np.insert(row, 0, 0)" ] }, { "cell_type": "code", "execution_count": 6, "id": "d7b892f8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1]\n", "[1 1]\n", "[1 2 1]\n", "[1 3 3 1]\n", "[1 4 6 4 1]\n", "[ 1 5 10 10 5 1]\n", "[ 1 6 15 20 15 6 1]\n", "[ 1 7 21 35 35 21 7 1]\n", "[ 1 8 28 56 70 56 28 8 1]\n", "[ 1 9 36 84 126 126 84 36 9 1]\n" ] } ], "source": [ "iterator = pascal()\n", "for _ in range(10):\n", " print(next(iterator))" ] }, { "cell_type": "markdown", "id": "40b558cf", "metadata": {}, "source": [ "Lets get some more rows and plot the last one to see what we get." ] }, { "cell_type": "code", "execution_count": 7, "id": "ffbea828", "metadata": {}, "outputs": [], "source": [ "row = next(iterator) # run this multiple times" ] }, { "cell_type": "code", "execution_count": 8, "id": "aa81bbc2", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "binomial_distro = pd.DataFrame(row).plot()" ] }, { "cell_type": "markdown", "id": "53823575", "metadata": {}, "source": [ "### Cryptography\n", "\n", "Topics left on the back burner in the 1900s, become more front burner in the 2000s, with the rise of the internet and the need for quasi-instantaneous stranger-to-stranger secure transactions.\n", "\n", "Instead of rushing through the primes versus composite distinction, as older high school curricula used to do, and giving short shrift to modulo arithmetic, we must now take a deeper dive, with notions of totient and totative.\n", "\n", "The totatives of positive integer N is the set integers less than N, down to 1, including 1, that have no factors in common with N, other than 1." ] }, { "cell_type": "code", "execution_count": 9, "id": "cdfb7f5a", "metadata": {}, "outputs": [], "source": [ "from math import gcd\n", "\n", "def totatives(N):\n", " return [n for n in range(1, N) if gcd(n, N) == 1]" ] }, { "cell_type": "code", "execution_count": 10, "id": "2445ce7f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 5, 7, 11]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "totatives(12)" ] }, { "cell_type": "code", "execution_count": 11, "id": "3651b4af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, 31, 33, 37, 39, 41, 43, 47, 49, 51, 53, 57, 59, 61, 63, 67, 69, 71, 73, 77, 79, 81, 83, 87, 89, 91, 93, 97, 99]\n" ] } ], "source": [ "print(totatives(100))" ] }, { "cell_type": "markdown", "id": "df168a35", "metadata": {}, "source": [ "Do not confuse totatives of N with prime factors of N, another topic we will be sure to take up.\n", "\n", "The number of totatives a number N has, is called its totient. Euler sometimes used $\\phi$ for his totient function." ] }, { "cell_type": "code", "execution_count": 12, "id": "e15f1a47", "metadata": {}, "outputs": [], "source": [ "def totient(N):\n", " return len(totatives(N))" ] }, { "cell_type": "code", "execution_count": 13, "id": "c39b641b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "totient(12)" ] }, { "cell_type": "markdown", "id": "c3de12e3", "metadata": {}, "source": [ "### Group Theory \n", "\n", "Totatives of N multiply as a Group modulo N. For example the 40 totatives of 100, multiplied modulo 100, have the properties of Closure, Associativity, Inverse and Neutral element (CAIN). This group is also Abelian. In this course, we will talk about what all that means, using a \"math object\" (type) called a Modulo Number. We'll also use Permutations." ] }, { "cell_type": "code", "execution_count": 14, "id": "8f90df20", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "40" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "totient(100)" ] }, { "cell_type": "markdown", "id": "a70fde87", "metadata": {}, "source": [ "#### RSA \n", "\n", "RSA public key cryptography is these days often only taken up in computer science after high school, but in this curriculum we bring in enough Group and Number Theory topics to make the RSA algorithm a door-opening application." ] }, { "cell_type": "code", "execution_count": 15, "id": "4981d3ed", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating: p,q\n", "Generating: u\n", "Generating: d\n", "<_RSAobj @0x11bd4f310 n(1024),e,d,p,q,u,private>\n" ] } ], "source": [ "from primes import rsacrypto_test" ] }, { "cell_type": "markdown", "id": "103aa123", "metadata": {}, "source": [ "Python's 3rd party community provides some useful cryptography packages. Lets used one.\n", "\n", "The way RSA works is everybody publishes a huge composite number N, like an address, which has two prime factors p, q that each person stores secretly. \n", "\n", "There's no reasonable way to work backwards to get from the public composite number N, to its component primes (p, q), given our current understanding of Number Theory.\n", "\n", "Bob encrypts a message to Alice, by raising it in chunks to some power, with Alice's public key as the modulus. " ] }, { "cell_type": "code", "execution_count": 16, "id": "f88786e1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9720399903105459822060723185656936167945047457483806667538880527550406562427715158136554554165026194740251547794042724035455501132922783183410025086408291" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = rsacrypto_test.p\n", "p" ] }, { "cell_type": "code", "execution_count": 17, "id": "adf07522", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10042361290060786029960722120509929925462861609429081321815421527967157348653195550660718451008840150704377387415699863560935480568535755963179095743971401" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = rsacrypto_test.q\n", "q" ] }, { "cell_type": "code", "execution_count": 18, "id": "6c6a72cd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "17" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rsacrypto_test.e # raise to 17th power modulo p*q " ] }, { "cell_type": "markdown", "id": "fc42a069", "metadata": {}, "source": [ "Alice's secret \"DNA-like\" components then spring into action and decipher Bob's message, by raising it to some still higher power, governed by the totient of p * q. \n", "\n", "Alice can only decrypt messages intended for Alice (her public key address), and so on. \n", "\n", "This system has worked well and is built in to every web browser as a way to handshake with public keys, in order to shift to a faster private key, once a trusted connection has been established." ] }, { "cell_type": "code", "execution_count": 19, "id": "ef41d322", "metadata": {}, "outputs": [], "source": [ "crypt = rsacrypto_test.rsaobj # results of generating p, q, d\n", "\n", "plain_text = b\"no one will be able to read this without p, q\"" ] }, { "cell_type": "code", "execution_count": 20, "id": "4295beba", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'no one will be able to read this without p, q'\n" ] } ], "source": [ "cipher_text = crypt.encrypt(plain_text, b'K')[0]\n", "\n", "print(crypt.decrypt(cipher_text))" ] }, { "cell_type": "markdown", "id": "f6bb09a7", "metadata": {}, "source": [ "### Polynomials\n", "\n", "If 1 is to a longer $\\phi$, as $\\phi$ is to a still longer $1+\\phi$, then what is $\\phi$? \n", "\n", "That question may be expressed as a solvable polynomial, yield a specific number, called the Golden Mean.\n", "\n", "Notice $\\LaTeX$ is being used to make our math expressions.\n", "\n", "By doing the same thing to both sides, as we do with polynomials, we may simplify:\n", "\n", "$$\n", "1/\\phi = \\phi/(\\phi + 1) \\\\\n", "(\\phi + 1)/\\phi = \\phi \\\\\n", "(\\phi + 1) = \\phi^{2} \\\\\n", "0 = \\phi^{2} - (\\phi + 1) \\\\ \n", "\\phi^{2} - \\phi - 1 = 0 \\\\\n", "$$\n", "\n", "And next, we may solve this equation, using ```sympy```." ] }, { "cell_type": "code", "execution_count": 21, "id": "326c609f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IPython console for SymPy 1.7.1 (Python 3.7.9-64-bit) (ground types: gmpy)\n", "\n", "These commands were executed:\n", ">>> from __future__ import division\n", ">>> from sympy import *\n", ">>> x, y, z, t = symbols('x y z t')\n", ">>> k, m, n = symbols('k m n', integer=True)\n", ">>> f, g, h = symbols('f g h', cls=Function)\n", ">>> init_printing()\n", "\n", "Documentation can be found at https://docs.sympy.org/1.7.1/\n", "\n" ] } ], "source": [ "from sympy import init_session\n", "init_session()" ] }, { "cell_type": "code", "execution_count": 22, "id": "10358aec", "metadata": {}, "outputs": [], "source": [ "𝜙 = symbols('𝜙')" ] }, { "cell_type": "code", "execution_count": 23, "id": "1d240709", "metadata": {}, "outputs": [], "source": [ "from sympy.solvers import solve" ] }, { "cell_type": "code", "execution_count": 24, "id": "aa59d73d", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAAAdCAYAAACt6FCVAAAFcElEQVR4nO3ce6gd1RXH8U+MVUtaGpSi+Kha0Soqpn/4iEoaDfioaJO0/uE7Yv4oFIriuyhEkRLow6iBWhASsZRCaUMqmtRCr1FREITQFt8mVylqJYppovEV7R9rLhyOc+bMnJl975lmvjCcYWbP3mvW76x19+vcWStWrNDR0dEu9s659gucii14ESun1aKOjo5eluNMHIJ3cBn5gXsY3sSy6bKsJXwd/224zlkN19cxOuOq7wPZsRILpy7u1UDFewrn4jwhRlNHx/jQKn27wC3PQkzMtBEdyVioRfp2gVuO2dnxyUwb0pGE1unbBW45TsfTM21ERzJap28XuOX4Ph6daSM6ktE6fbvALccBeHemjehIRuv0rRK4P8J9eFJMm3+B35V47kDsxr3CQcuxDq9iF7bjKVxT0Z7p4mi8NODepPBD3vF2hTbGwUej6st42D8qRfrSjMaN+ydvHXcQt+Ek7MS/cWzJ536QGbMOF+M3eEvM4L0hXmqpWKs6PyvzRQW7UnMRHi64vx2rcq7vrNDGOPhoVH0ZD/tHZZi+1Ne4cf9UCdzrhKCv4nvKT50vEd2QJ8Ta1kV4BJ/3lPkZnsUPxQv8qYJdqTkGLxfcfx8rarYxDj4aVV+mx/5lWIOz8HjFZ4sYpi/1NW7cP1W6LRN4RbVM+Q2cLTLabvw9O/+8r9zbuD87X1ih/qbYC3eJbNfL/tKPfcbFR6Poy/jYX8T/nb5V/uKOwgXYB38uUfbT7POzdOYM5BzMx8HY0HO9zGzjvrgc38IH+IfIrLtLtt0WHw2iDfbX0Zd6GifxT+rAXSJe9G8l7LgyO9+Y1KJ8NoqM95jIzlPZcD5+P+TZg/BQ37WtuBqbSrTdFh8Nog3219GXehon8U/KGb79xN7PDfhoSNmVOEFkv78mtKmIzfhQLMbDV0RG7e/S9LIGi4Swc3AifosjxHufNKTNtvmonzbZv1l1famncTL/pAzcc/A1MZNWxE9xvfgJ4RUl6540eIo+7yi7rPEXMQNIjDOGZdM7xJjlP+JL8S/8GL/GVw2f0Ejpo+kglf2TvqzhmuzeRM69tSXtraov9TROpm/KrvISsffzkYIyP8E9eF5ktfdK1v2a4RmslzdLllsvpupvFE6/o0IbvdwvhFgwpFxKH00Hqexfhbl91+aJoHtQBHYvm0vUSXP6Uk7jZPqmCtzZuFBkqu0DylyLu0UGWyR+JFyWRXWMK2ATvonjRLeoylpsL1PvMqegTGofpSal/atyri0TgbvW6MtBTenLcI2T6puqq7xA7BAZ1EW4WRi8WazLjcsX8jMxxrgd/6xRz/zsc0tBmbb6aIo22t+UvgzXOKl/UgXuUjHoX59z73YxEH9OZJltiWwYlfW4xPDdNMeLdcB+Dsfq7LxobN2kj9aKsd6yIeWapK0al9WXehon9U+VrvLi7CBm2IisszY734Ybeso+LQb0vVyFO8Vs3pNiUN7PpPKTDSnYgGfELqIiLsYtYrJkK3bgKLFut5/I7L8seH6x5nw0lYDrrI8uVl7fqfJt1LisvtTTeLGE/qkSuPOyRnv5dnbA60LYk3Go6Ab0c2T2OVv07/PYZGYDd4cQZhgT+A6+K77gc8TWuKfEmt9DBu9CatpHJ2Z2F02CDGOecvrSbo3L6svoGif3z6ycf8/6h8zQDWLf6ur+AkP4OW4Vgm+t+OyeQpM+miu27f0KN9WsqyydxsU06Z9LcQrOEH+lTyM/cPcVi9OygrsqNvQCPhYZvCOfJn10If4oNgRU+SlhHTqNi2nSP7nxmNdV/jg7RuW4Gs/uKTTpo4fFeGs66TQupkn/5MbjuP2ouaOjowRd4HZ0tJAucDs6Wsj/AHfYKSyzPDxiAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\left[ \\frac{1}{2} - \\frac{\\sqrt{5}}{2}, \\ \\frac{1}{2} + \\frac{\\sqrt{5}}{2}\\right]$" ], "text/plain": [ "⎡1 √5 1 √5⎤\n", "⎢─ - ──, ─ + ──⎥\n", "⎣2 2 2 2 ⎦" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(𝜙**2 - 𝜙 - 1, 𝜙)" ] }, { "cell_type": "code", "execution_count": 25, "id": "40aaa1f8", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAASCAYAAAC0N8IHAAAKMElEQVR4nO2cfZBXVRnHP4uS4huUhUwvg+ym4Uu1UhImKhCSoRUy0ljTmlaSo0VljDb4Atg0YSWzoU5pZok5o2VlJGQo7oj05kxGL2jyuhYUIEG0BFq69cf33H73d3/n/vY+z93fH033O7Nzdu895zzn+5zznLfnudu2YMECKlSoUKFCBYAhmb8vAG4GHgf+Dvwb+HZJGWcA3wP+ArwQ0pXA9EGSfW6obytwANgMfBc4rUmZ1wJ3An8ObeoFuoGXR/LeCKwC/hTq3w38GpgPHJ1Tv6dMG/Bh4BdAH7A/lJkDHNSEi5W/Jf/FqB+a/bzUpG0JulL5P5qTx8Pfyt2rYysXz5i0yrDKOTrU9QNgY8i/F1gDfITGuSCBxVa8XHrJH1/bm9Tt0XPR+cgrw2P7aRTRl1XGxRjsuC1zUlgLvBnYh5QwFrgH+GABMjFcC3wO2AU8iDrglcApQA9wVUnZN4Y6/go8EOS8HngPcDBwEY0LSwfwM2Ak8EPgD8B4YDLwDHB6qC/BP4EngaeAncDhwATgrchQJqDOoWSZpWhA7AR+BPwDmAqciAbxLNR5Zfhb83cCM4jjDGAKsBw4LycPwOuA36FJ9wjgUuCOSD4rf0/fe3Rs5eJpl1WGR85lwFeRDfYAfwSOAWYCw4nzt9qKl0svMAItNlnsA74cee7Rs2U+8srw2H6CovqyyujEYMfZRWEympA3AmchRXkXhVnAd4BH0MDry7wfCvyrhOxRwDbgOeBNSDnpuh4FtgDtmXI/Aaah3eHNqeeLgU8DtyEDSnAo8HxE/ueBecjQLs+8s5aZgXZwW5DR7QrPhyIdzgAuAb6VKmPl79VXHn6OBt97gWU5edqAh4ExwPeBucQH+gxs/D1crDI8XMrquKi+PHKmoMljOdCfqesJNCFdgBaHBFZb8XABLQoAx+bUlYWHv3U+8valZ74Am768MmJosOPskbEH2EDz3VIRDEGr7H7gAzR2ANR3gEf26CDnl9R3WFJXH/CqzPN2NMh7gVsz7+ajnWMXMp4EMeWDBhjAcZF31jIzQ3oTtckKpKPrwu+fyJSx8vfoKw8no4G0DU0yeZiDJqNLkG7zYOXv4eLRcRpFuJTVcVF9eeQ8ik5H/Znn24Gvhd8npZ57bCWNolw8sPL3zEfevvTMF2DTl1dGFlE7zrtHLIu3oxVvBbAH3ctdDXyS4veqA2EDOkaNR0fANM4EjkS7gjSmhHQljcbRB/wUOAwpaiC8O6S/LdjeZmVGhXRzpEzybBw6Yiew8vfoKw8fC+k3yPcpnAAsAr4CrB6gPit/DxePjhMU5VJGxxZ9DWZfQm1CfDH1rIytWLgkOATdCsxD88Rk8v08Vv6e+WiwddxsvvDoyyojhqgdH1yiAc1wakh3oLuvN2ber0ZH1edKyNiNOnYxult7AN39daA7v4epkU7whpCuz6lzA9odHY8cOWnMRfd8w9Hd3USk/EVN2li0TLJzHROpI308HYucpGDn79FXDMOQ8fYTP9qCxtXd6N56XoE6rfw9XDw6BhsXr46t+hqsvkxkXxR+fyj13GsrVi4JRoVyaWxBO+fHMs+t/D3zUVkdF7V9r74sMmLIteNWLQojQ3oZ6tip6Bg2Gh3f34k8+JNKyulGx9s70f1bgo3objh77Bse0r059SXPR0TezUWOuQQPIa9+s4WtaJkHgfcDVwL3ogEJ6p+FqXzZiI9ubPyt+WN4H9LPcvIdZtcj591EFB0xEDz8u7Fx8erYysXaLo8Mr5wYFqFrhBXIh5DAayseLt9EUYfr0CmkHfg4MBv4MdrN/yZTppvi/L3zkUVGFkVt36Mvq4wYcu24VddHybGvDa3Aq1AUwTrgfORQPovyV0lXAfejDupA95tvQdcB9wBfNNbXFtKYX2NUeD8K3U+3ozCwcU3qK1rmXjT4O9Cu5HY0INeiULkNIV/2qsbKfzD0NTukt+W8H492PDchJ1YRePhbuXhkeLhY2+WR4ZETwxzgMyiqqMsgG+K24uWyEPk8dqB7/9+jCXwx2tEuiJSx8PfOR2V0XMT2vfqyyMhDrh23alHYE9LNNK7wB6jtSMaXkDEJOY+Wod3fZjSgnkQdvQ0N+PTVQLK7GU4cR2XyxbADRbFMQzHBSwu0daAy/ehIOhc5/rpQPP1WtINIwv7SO5NJ2Phb88dwIrqf3Yp2llkkR+H11Jy3RWDl7+FileHhYm2XV19WOTFcge6wn0L397sz76224uXSDIkD/MzM80nY+HvmI6uMPOTZ/mDqyzonNbXjVi0Kz4T0bznvk04aVkJGEhvfE3m3H4XZDUFHs2y7js+pM/Ha592jpvEsMqiTaHREecq8iHYMnUgvRwHnhPydaPCuS+W38vfoK4uBHMxHIN2egCIk0h/HzA95vh7+7s6UtfD3crHI8HCxtsurr7J9+SngFrQjn0z8AzGrrZTp+zwkC3Q2wsnK3zMfDYa9pJG1/Vboq+ic1NSOW+VTWI0M8DjgZciLn8bJIe0tIeOQkOaF+CXP07KTDp6GOjQdVXEk+hjnAPWOxmZ4dUiLfNXrLdOF4pLvoj5szsrfo680Dg1t6UeDKYYXmrwbhwxoDTLSosflGP+yXIrI8HCxtsurrzL8r0Z+hLXA2dSH56ZhtZVW9H1ynZONGLPy98xHgz3GoN72W6GvrIwYBrTjsieFDhStMTTzfBdwHzp6Xp95dzZy7OylPtrBisdDOht4Tebdu9CgfR59kZlgEwqxOxYdn9NYiHYkS6nFCY+lFsqYxhD0ocjIUP+e1DtPGagdx9M4FRnwPuCGzDsrf4++0piFnLAryHcwH0Cf5sd+loU8d4W/78uUtfD3crHI8HCxtsurLy//6wLXXwHvIH9BALuteLmcBLwiIn80Os1A41fDVv6e+cijY4vte/XlnV8SDGjH2ZPCDGqfQyeCT6P2lecudCebYBXqvDE07vqvBN4GXIPuBJ8Iec9Hq9il1B/nrLLvR3HCU4Gn0Z3adnQcOw85YD5L42f4lyOlLUGG8XRo52R0FL4mlfcc4Etop7Ep1HUMckq1B3npqARvGVCI2wF0pO9DxjId7Shm0rhbsvL36itB4pi6Ped9WVj4e7lYdWxFWR23Us6H0KL3Eprw5kTq7aX+i26LrXgxK7S1B0UG9aHN5rloV7uCxn9z4eFvnY88Mry2b0FZGQPacXZR6ESDJ412as6UZ6mfmJthJ+qEa5HiJ6AOXw58gcYrGqvsfmTQVwAXBhmHIYfZCjSQV0batQnF9N6AFDwd/Q+UJWgHlHa4PYKUdzr6v0wj0M5oPXISLaHRQecpAxqEF6LY4WHof5jcgXZ2vZH8Vv5efYEMYSL5DubBgIW/l4tVx1aU0XGr5STfZxyEfAoxPEb9omCxFS960DcRp6BN4OFocl6D7OVuGqMBPfyt85FHhtf2LSgjo5AdZ//3UYUKFSpU+D9Gq6KPKlSoUKHC/yCqRaFChQoVKvwX/wFuXqYFuHstUgAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 1.61803398874989484820458683437$" ], "text/plain": [ "1.61803398874989484820458683437" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol = solve(𝜙**2 - 𝜙 - 1, 𝜙)\n", "sol[1].evalf(30)" ] }, { "cell_type": "markdown", "id": "14aacd41", "metadata": {}, "source": [ "This meaning for $\\phi$ is distinct from Euler's use of it for \"totient function\" above. Math symbols get recycled in may pick up many meanings from different contexts.\n", "\n", "The Golden Mean shows up everywhere in geometry.\n", "\n", "\"pentatrig\"" ] }, { "cell_type": "markdown", "id": "68202cc4", "metadata": {}, "source": [ "## Python\n", "\n", "\n", "Python is a computer language, started in the Netherlands by Guido van Rossum in the 1990s, and still evolving.\n", "\n", "\"PSF\n", " " ] }, { "cell_type": "markdown", "id": "25ac385d", "metadata": {}, "source": [ "## Examples of Python topics:\n", "* Using Python like a scientific graphing calculator\n", "* Data Wrangling in Python (spreadsheets and databases)\n", "* Jupyter Notebooks (like here)\n", "* Coding with Functions (links to math)\n", "* Object Oriented Programming (OOP)\n", "* Dimensions of Python: keywords, built-ins, special names, library, 3rd party\n", "* ASCII and Unicode\n", "\n", "Surrounding Python is the broader landscape of the computerized office, with many components in\n", "the cloud such as:\n", "\n", "## Cloud Resources\n", "\n", "* Google Colab (Notebooks)\n", "* Replit (Computer Languages)\n", "* Github (source under version control)\n", "* PythonAnywhere (cloud hosting)\n", "* Our Home Base Text (HBT)\n", "\n", "The list continues. With the exception of PythonAnywhere, all of the above are free.\n", "\n", "But what if we're not always connected to the internet, and what about working locally in a personal workspace, with files on the local computer (such as a laptop or desktop)?\n", "\n", "That's where downloading and installation comes in. We focus on beefing up your local computer quite a bit, and do not depend solely on cloud resources.\n", "\n", "## Local Resources:\n", "\n", "* JupyterLab (local version)\n", "* Python / I-Python (the language itself)\n", "* Git (source code under version control)\n", "* Flask or Django or... (web framework)\n", "* pip and conda (for downloading and installing)\n", "* local copy of Home Base Text" ] } ], "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }