{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Números Fibonacci em Python\n", "\n", "![img](https://raw.githubusercontent.com/the-akira/Python-Matematica/master/imagens/fibonacciblocks.png)\n", "\n", "## Introdução\n", "\n", "Em matemática, os números de Fibonacci, comumente denotados por $F_n$, formam uma sequência, chamada de sequência de Fibonacci, de modo que cada número é a soma dos dois precedentes, começando de **0** e **1**. \n", "\n", "Isso é:\n", "\n", "$F_0 = 0$, $F_1 = 1$\n", "\n", "e\n", "\n", "$F_n = F_{n-1} + F_{n-2}$\n", "\n", "para $n > 1$.\n", "\n", "A sequência inicia:\n", "\n", "$0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...$\n", "\n", "Em algumas definições antigas, o valor $F_0 = 0$ é omitido, de forma que a sequência inicia com $F_1 = F_2 = 1$, e a recorrência:\n", "\n", "\\begin{equation}\n", "\\left\\{\n", "\\begin{aligned}\n", " F_{n} & = F_{n-1} + F_{n-2} \\\\\n", " F_1 & = 1 \\\\\n", " F_2 & = 1 \\\\\n", "\\end{aligned}\n", "\\right.\n", "\\end{equation}\n", "\n", "É válida para $n > 2$. Em sua definição original, Fibonacci iniciou a sequência com $F_1 = 1, F_2 = 1$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Derivação da Fórmula Geral\n", "\n", "Como toda sequência definida por uma recorrência linear com coeficientes constantes, os números de Fibonacci têm uma expressão de forma fechada que tornou-se conhecida como fórmula de Binet, em homenagem ao matemático francês Jacques Philippe Marie Binet.\n", "\n", "É possível derivar uma fórmula geral para $F_n$ sem computarmos todos os números anteriores da sequência.\n", "\n", "Se uma série geométrica (uma série com uma razão constante entre seus termos consecutivos $r^n$) é para resolver a equação de diferença, nós devemos ter:\n", "\n", "\\begin{aligned}\n", " r^n = r^{n-1} + r^{n-2} \\\\\n", "\\end{aligned}\n", "\n", "No qual é equivalente à:\n", "\n", "\\begin{aligned}\n", " r^2 = r + 1 \\\\\n", "\\end{aligned}\n", "\n", "Esta equação tem duas soluções únicas:\n", "\n", "\\begin{aligned}\n", " \\varphi = & \\frac{1 + \\sqrt{5}}{2} \\approx 1.61803\\cdots \n", "\\end{aligned}\n", "\n", "\\begin{aligned}\n", " \\psi = & \\frac{1 - \\sqrt{5}}{2} = 1 - \\varphi = - {1 \\over \\varphi} \\approx -0.61803\\cdots\n", "\\end{aligned}\n", "\n", "Particularmente, a raiz maior é conhecida como o **golden ratio**:\n", "\n", "\\begin{align}\n", "\\varphi = \\frac{1 + \\sqrt{5}}{2} \\approx 1.61803\\cdots\n", "\\end{align}\n", "\n", "Agora, já que ambas as raízes resolvem a equação de diferença para os números Fibonacci, qualquer combinação linear das duas sequência também resolvem-no:\n", "\n", "\\begin{aligned}\n", " a \\left(\\frac{1 + \\sqrt{5}}{2}\\right)^n + b \\left(\\frac{1 - \\sqrt{5}}{2}\\right)^n \\\\\n", "\\end{aligned}\n", "\n", "Não é difícil de observarmos que todos os números Fibonacci devem ser dessa forma geral, porque nós podemos unicamente resolver para $a$ e $b$ de forma que as condições iniciais de $F_1 = 1$ e $F_0 = 0$ são encontradas:\n", "\n", "\\begin{equation}\n", "\\left\\{\n", "\\begin{aligned}\n", " F_0 = 0 = a \\left(\\frac{1 + \\sqrt{5}}{2}\\right)^0 + b \\left(\\frac{1 - \\sqrt{5}}{2}\\right)^0 \\\\\n", " F_1 = 1 = a \\left(\\frac{1 + \\sqrt{5}}{2}\\right)^1 + b \\left(\\frac{1 - \\sqrt{5}}{2}\\right)^1 \\\\\n", "\\end{aligned}\n", "\\right.\n", "\\end{equation}\n", "\n", "Produzindo:\n", "\n", "\\begin{equation}\n", "\\left\\{\n", "\\begin{aligned}\n", " a = \\frac{1}{\\sqrt{5}} \\\\\n", " b = \\frac{-1}{\\sqrt{5}} \\\\\n", "\\end{aligned}\n", "\\right.\n", "\\end{equation}\n", "\n", "Nós então derivamos a fórmula geral para o $n$-ésimo número Fibonacci:\n", "\n", "\\begin{aligned}\n", " F_n = \\frac{1}{\\sqrt{5}} \\left(\\frac{1 + \\sqrt{5}}{2}\\right)^n - \\frac{1}{\\sqrt{5}} \\left(\\frac{1 - \\sqrt{5}}{2}\\right)^n \\\\\n", "\\end{aligned}\n", "\n", "Uma vez que o segundo termo tem um valor absoluto menor do que 1, nós podemos ver as razões dos números Fibonacci convergirem para o **golden ratio**:\n", "\n", "\\begin{aligned}\n", " \\lim_{n \\rightarrow \\infty} \\frac{F_n}{F_{n-1}} = \\frac{1 + \\sqrt{5}}{2}\n", "\\end{aligned}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementações em Python\n", "\n", "Escrever uma função em Python que seja capaz de imprimir o número Fibonacci **n** parece muito simples. \n", "\n", "Entretanto, até mesmo nesse simples caso nós devemos estar cientes de algumas sutilezas computacionais de forma a evitarmos erros e melhorarmos a eficiência da computação.\n", "\n", "### Erro Comum: Recursão Ineficiente\n", "\n", "Apresentamos a seguir uma solução recursiva:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]\n" ] } ], "source": [ "import math\n", "\n", "def fibonacci_recursivo(n):\n", " if n == 0:\n", " return 0\n", " elif n == 1:\n", " return 1\n", " else:\n", " return fibonacci_recursivo(n-1) + fibonacci_recursivo(n-2)\n", "\n", "print([fibonacci_recursivo(i) for i in range(20)]) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aparentemente a solução parece funcionar bem, entretanto a sobrecarga da recursão é na realidade muito significante quando $n$ é levemente maior. \n", "\n", "Aqui estamos computando $F_{34}$:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.65 s ± 86.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "%timeit fibonacci_recursivo(34)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A sobrecarga incorrida pela criação de um grande número de stack frames é tremenda. Python por padrão não executa o que é conhecido como **tail recursion elimination** e sendo assim, essa é uma implementação muito ineficiente. \n", "\n", "Em contraste, se tivermos uma implementação iterativa, isso acelerará dramaticamente a solução:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def fibonacci_iterativo(n):\n", " a, b = 0, 1\n", " while n > 0:\n", " a, b = b, a + b\n", " n -= 1\n", " return a" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.1 µs ± 287 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit fibonacci_iterativo(34)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora vejamos se conseguimos fazer ainda mais rápido ao eliminarmos os loops completamente e irmos diretamente para a fórmula geral que derivamos mais cedo:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def formula_fibonacci(n):\n", " golden_ratio = (1 + math.sqrt(5)) / 2\n", " val = (golden_ratio**n - (1 - golden_ratio)**n) / math.sqrt(5)\n", " return int(round(val))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.14 µs ± 16.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" ] } ], "source": [ "%timeit formula_fibonacci(34)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mais rápido ainda! E uma vez que não estamos mais utilizando looping, nós devemos esperar ver que o tempo computacional escalará melhor ao 𝑛 aumentar." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Desenhando o Espiral de Fibonacci\n", "\n", "Os números de Fibonacci na sequência de Fibonacci frequentemente aparecerão diante de nossos olhos, como pinhas, abacaxis, o arranjo das folhas, o número de pétalas de certas flores e assim por diante. Também por causa de várias \"coincidências\" na natureza, a espiral de Fibonacci formada pela sequência de Fibonacci também é chamado de \"Curva de Deus\".\n", "\n", "Para que possamos desenhar o espiral, primeiro vamos definir uma função que irá nos retornar a sequência de Fibonacci até o número que escolhermos:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "def fibo_seq(n):\n", " if n == 0:\n", " fibo_list = np.array([0])\n", " elif n == 1:\n", " fibo_list = np.array([0,1])\n", " else:\n", " f_0, f_1 = 0, 1\n", " fibo_list = np.array([f_0,f_1])\n", " for i in np.arange(n-2):\n", " fibo_num = f_0 + f_1\n", " fibo_list = np.append(fibo_list,fibo_num)\n", " f_0, f_1 = f_1, fibo_num\n", " return fibo_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A seguir podemos testar a função computando os 10 primeiros números da sequência:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 1 2 3 5 8 13 21 34]\n" ] } ], "source": [ "print(fibo_seq(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora precisamos encontrar os pontos correspondentes a cada 1/4 de círculo no gráfico.\n", "\n", "Da mesma forma, se você desenhar qualquer centro de um círculo, você precisa encontrar a regra primeiro.\n", "\n", "Liste as primeiras coordenadas do centro do círculo da seguinte forma:\n", "\n", "| n | (x,y) | Fibonacci | Flag |\n", "|---|---|---|---|\n", "| 1 | (0,0) | 0 | 1 |\n", "| 2 | (1,0) | 1 | 1 |\n", "| 3 | (1,-1) | 1 | -1 |\n", "| 4 | (-1,-1) | 2 | -1 |\n", "| 5 | (-1,2) | 3 | 1 |\n", "| 6 | (4,2) | 5 | 1 |\n", "| 7 | (4,-6) | 8 | -1 |\n", "| 8 | (-9,-6) | 13 | -1 |\n", "| 9 | (-9,15) | 21 | 1 |\n", "| 10 | (25,15) | 34 | 1 |\n", "\n", "Como apresentamos na tabela acima:\n", "\n", "1. As coordenadas do centro do círculo são as coordenadas (**x**, **y**), em cada duas elas mudam uma. \n", "2. Para a abscissa x do n-ésimo centro do círculo, cada vez que ela muda, a sequência de números de Fibonacci é adicionada ou removida do n-ésimo termo. A mesma regra se aplica à ordenada y.\n", "3. Adicione ou subtraia o número ordinal do enésimo item, consulte a série de flags na tabela para a regra. \n", "\n", "A lei pode ser expressa da seguinte forma:\n", "\n", "$(-1)^{1+\\frac{mod(n,2)+n}{2}} (-1)1+2mod(n,2)+n$\n", "\n", "Em resumo, a coordenada **x** e **y** podem ser expressas como:\n", "\n", "$x(n)=x(n-1)+mod(n+1,2)\\times{F(n)}\\times{(-1)^{1+\\frac{mod(n,2)+n}{2}}}$\n", "\n", "$x(n)=x(n-1)+mod(n+1,2)\\times{F(n)}\\times(-1)1+2mod(n,2)+n$\n", "\n", "$y(n)=y(n-1)+mod(n,2)\\times{F(n)}\\times{(-1)^{1+\\frac{mod(n,2)+n}{2}}}$\n", "\n", "$y(n)=y(n-1)+mod(n,2)\\times{F(n)}\\times(-1)1+2mod(n,2)+n$\n", "\n", "Entre eles, a sequência de Fibonacci é representada por $F(n)$:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def find_o_xy(f_list):\n", " # Coordenadas iniciais do centro do círculo\n", " x_n, y_n = 0, 0\n", " o_x_array, o_y_array = np.array([x_n]), np.array([y_n])\n", " for n in np.arange(1,len(f_list)):\n", " # O primeiro item foi dado como o ponto inicial\n", " y_n = y_n + np.mod(n+1,2) * f_list[n] * (-1)**(1+(np.mod(n+1,2)+n+1)/2)\n", " x_n = x_n + np.mod(n,2) * f_list[n] * (-1)**(1+(np.mod(n+1,2)+n+1)/2)\n", " # Coordenadas (x,y) horitontal e vertical\n", " o_x_array = np.append(o_x_array, x_n)\n", " o_y_array = np.append(o_y_array, y_n)\n", " return o_x_array, o_y_array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Com esta função podemos então encontrar as coordenadas:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 1. 1. -1. -1. 4. 4. -9. -9. 25.] [ 0. 0. -1. -1. 2. 2. -6. -6. 15. 15.]\n" ] } ], "source": [ "sequencia = fibo_seq(10)\n", "x, y = find_o_xy(sequencia)\n", "print(x,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "E agora podemos plotar o gráfico com os pontos:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(10,6))\n", "plt.plot(x, y, marker='o', linestyle=\"\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para melhor compreensão, podemos conectá-los com linhas:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,6))\n", "plt.plot(x, y, marker='o');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sabendo a localização do centro do círculo, o raio do círculo muda de acordo com a sequência de números. \n", "\n", "Portanto, uma curva pode ser desenhada. Vamos tomar $n = 7$ como um exemplo:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAFlCAYAAAAgSAb7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3iU1fb28e8mFCmhCKFLB+k/wIByQMVGUUTsIHaPvRz16BFFBbvHhmLXIzawi4WOoNgLvYsUASmCSBGpBvb7x0reIAKmTLJnnrk/1zXXE5I4WYzD5J5d1nbee0REREQk94qELkBEREQkUSlIiYiIiOSRgpSIiIhIHilIiYiIiOSRgpSIiIhIHilIiYiIiORR0RA/tFKlSr5OnTohfrSIiIhIrkyZMmWt9z5tb18LEqTq1KnD5MmTQ/xoERERkVxxzi3d19c0tSciIiKSRwpSIiIiInmkICUiIiKSRwpSIiIiInmkICUiIiKSRwpSIiIiInmkICUiIiKSRwpSIiIiInmkICUiIiKSRzkOUs65wc65Nc652bt9boBzboVzbnrm7fiCKVNEREQk/uRmROoloOtePj/Qe98q8zYqNmWJiIiIxL8cn7Xnvf/MOVen4EoRkZzwHrZvh82bYcuW7NvWrZCRATt32vWnn+CXX6BNG0hJyb4VLfrnjw84AEqVgpIl7XrAAeBc6L+liEhiiMWhxVc5584FJgP/9t6v39s3OecuAS4BqFWrVgx+rEg07NwJP/8MK1Zk39asgV9//ett3ToLUN4XbE2lSmWHqzJloHx5qFDhz9esjytUgLQ0qFLFbmXLKoiJSPJwPhevyJkjUiO8980z/1wFWAt44C6gmvf+wr+7n/T0dD958uS81CuScLyH1ath4cI/35YsgeXLLUTt3Pnn/8Y5OPBAu1WsaLesP6emQunS2WFn99CTNdpUtKiFrg0boH797JGqrNvuI1fbt/95ZGv3Ea4tW2DTJrufrNv69XbdtWvvf98SJaBy5exgVaUKVK8OBx0EtWplX1NTC/yhFxGJCefcFO99+t6+lq8RKe/96t1+yPPAiPzcn0gi8x6WLoXZs2HWLLvNnWuhafPm7O9LSYE6daBuXTjuOKhZE2rUsFvWx5UqQZE43lPrPfz+uwWqdetsBG3NGguMu99WroRp0yws7hm8ypfPDlW1alnga9gQGjSAevVsilFEJN7lK0g556p571dl/vFkYPb+vl8kKjIyLCRNmmS3mTMtQG3alP09tWpB8+Zw1FEWDrJutWpBsWLhao8F52xEKTXVwtDfyciAVatg2TJbu7Vs2Z8//uorG+na/f5r1swOVg0aQOPG0KyZhdB4DpkiklxyHKScc68DnYBKzrnlQH+gk3OuFTa1twS4tABqFAku65f9pEnw3XcwdapNewGUKwf/939w7rnQooXdmjWzz4spWtQC1/5C17p12dOeCxZkf/zuu7Y+LEupUtCkiT3Gu99q1VLAEpHCl6s1UrGiNVISz7yHRYvgs8/g00/tumSJfa1ECWjdGtq1g7Zt7dqggX6BF7T162HePJgz58+3Vauyvyc11f7ftG5tOxXbtLFRrKKx2FIjIkltf2ukFKREsLU8Y8fCRx9ZeFq50j5fqRIccQQceSR06AAtWyb+tFyUrF9vU6xz5sCMGbYea/p0WygPts6qZcvsYHXYYdC0qa1TExHJKQUpkT1s3w5ffgljxliAmjnTPl+liq1pOvJIC1BNmmgrf6LZuRPmz7dQNXWq3aZNg40b7eupqTaSeNhh0L69XStWDFuziMQ3BSkRbA3O8OHw/vs28rR5s40udewIXbpA1642eqHgFD3e23qrb7+Fr7+228yZ2W0nGja0UHX44RaiGzTQ80BEsilISdJavtyC03vv2ZTdzp22G+zEE6FbNxt9KlMmdJUSwubNMHkyfPNNdrhas8a+Vr26BapOnezWsKGClUgyU5CSpLJqFbzxht2++84+17gxnHyy3dLT9UtR/sp7mxKcONFC98SJ1v8KoGpVC1RHH22jlzqcQSS5KEhJ5G3cCMOGwdCh8Mkn1vyxTRs4/XTo2dOClEhueG9tGCZOzL5l7RJs3Bg6d7ZQdeSR1mleRKJLQUoiKSMDRo+Gl16CkSNtAXn9+tCnD/TurfAkseW97RAcN842KHz6KWzbBsWLZ6+z69bNmrBqxFMkWhSkJFIWLYLBg+HFF22EoHJl6NXLAlTbtvolJoVj61b44gsLVePG2ZFAYJ3Xe/Sw2+GHW9ASkcSmICUJb9s2WzT+v//BhAnWAPP44+Gf/7SrejtJaCtWwKhRtjP0o4/sOVu2rI1S9ehh1woVQlcpInmhICUJa8UKePppePZZWLvW3u1fdBFccIEd7isSj7ZsgfHj4cMPYcQIO8A5JcXWU51+Opxyio2kikhiUJCShOK9bUkfNAjeecdaFvToAVdeCccco+NYJLHs2mVnNH7wgW2ImD/fnsO7h6oqVUJXKSL7oyAlCSEjA958Ex57zH7xlCtno09XXgn16oWuTiT/vIfZs+Htt+32/fcWqo44wkLVqacqVInEIwUpiWtbt9rC8QcftMOBDz4YrrkGzj1XzTIlury3MwKzQtW8eTb9d9xxcM45cNJJaqsgEi8UpCQubdwITz0Fjz5qHaXbt4ebb4YTTtD0nSSf2bPhtdesF9qyZfYm4pRT4OyzrRGoDloWCUdBSuLKr7/Cww/Dk0/Cb7/ZGXd9+9r0hloXSLLbtQs+/xyGDLGRqo0boVo1OOssOO88aNEidIUiyWd/QUrv+6XQbNgA/ftD3bpw//0WoKZOtaaaRx6pECUC2QvRn3/ejqh5+23rj/bYY3ao9qGH2tc2bQpdqYiAgpQUgt9/h3vvtQB1553WAXrWLFtY3rp16OpE4tcBB8Bpp9mOv1WrYOBAO2z5kktslOqii+yw5QATCyKSSUFKCsz27fDIIxag+vWzYzSmTrV32M2aha5OJLFUqgTXXmtvQr7+2rr5v/km/OMfdizNwIE2bS4ihUtBSmLOe3uBb9wY/v1vaNXK+kINH64RKJH8cg4OO8y6/K9aZdN8qalw/fVQs6aNUk2dGrpKkeShICUx9dVX9g65Vy87HmPcODsu49BDQ1cmEj2pqXZM0jffwIwZthj9jTfgkEPs3+Frr8GOHaGrFIk2BSmJicWL4YwzoEMHWLrUDhWeOtV64ohIwWvZEp55xo5VGjjQjlTq0wdq1YLbboPly0NXKBJNClKSL1u32k68pk1h5EgYMAAWLLCz8NT3RqTwlS9va6m+/x7GjLEdf/fcY+dU9umjaT+RWFOQkjwbMcIWjd95px1tsWCBhSp1YxYJr0gR2yE7fDgsWmSnBQwfbtN+Rx8No0ZZzyoRyR8FKcm1H3+0Q4RPPBFKloRPPrFuzNWrh65MRPambl3bQfvTT3YU0w8/2AkCLVrACy/Atm2hKxRJXApSkmN//AH33WfTeB9/bC/I06dDp06hKxORnChXDm64wdY0vvoqFC9ui9Xr1LFebxs3hq5QJPEoSEmOTJsG7drBLbdA9+62/uKGG6BYsdCViUhuFS9uZ/hNnQrjx1tbkn79oHZtW5i+dm3oCkUSh4KU7Ne2bXaQcNu2dlzFsGHWULNmzdCViUh+OQfHHGPHNE2ZAsceC3ffbSNUN95o/+ZFZP8UpGSfvvzSmmnef7/1p5k7F04+OXRVIlIQ2rSBd96B2bOhZ09bU1WnDlx9NSxbFro6kfilICV/sX073HQTHH64ffzRR7YgtUKF0JWJSEFr1gyGDIH58+Gcc+DZZ6FBA7j8cvWiEtkbBSn5kzlzrAv5Aw/AxRfbuV7HHhu6KhEpbA0a2PEzCxfagvQXXrDPXX89rFkTujqR+KEgJYD1k3n0Uesxs2oVfPihvRMtUyZ0ZSISUq1a8NRT1jKhTx947DFrp3DLLbBuXejqRMJTkBJWroTOneG666yB36xZ1iNKRCRLnTo2KjVvHpx0kq2drFvXGvL+9lvo6kTCUZBKcmPH2oLyr7+2Yfz334fKlUNXJSLxqlEjOwx5xgzrkN6/P9SvD088oQOSJTkpSCWpjAzrG9O1K1SpYluf//lP2w4tIvJ3WrSA996D776zj6++2haqv/sueB+6OpHCoyCVhFassHeS995r4enbb6Fx49BViUgiatsWJkywszeLF4fTToOOHeGrr0JXJlI4FKSSzPjxNpU3daodEfH881CqVOiqRCSROWdn982YYa8pP/4IHTpYqFqwIHR1IgVLQSpJeA8PP2yLyatUgcmT7YgIEZFYKVrURrkXLIA77oAxY+xszhtu0IJ0iS4FqSSwZYuFphtusM7k33yjqTwRKTilS8Ptt1sPqvPPty7pjRrBSy9ZqxWRKFGQirilS229wuuvwz332Dl56g0lIoWhalWb6vvuO6hXDy64ANq3tz+LRIWCVIR99hmkp8PixTB8uDXQ0648ESls6enwxRfwyivw0092esIFF+hQZIkGBamIevVVO9qlYkV793fCCaErEpFkVqSInd03f76d5Tl0qE33PfYY7NwZujqRvFOQihjvYcAAOPdcm9L7+mt7sRIRiQepqdYVfc4c29l37bXQrp1tgBFJRApSEbJ9uwWoO+6wBZ5jxkCFCqGrEhH5q4YNYdQoePNNO6aqXTtr6rlxY+jKRHJHQSoi1q2z8/KGDIG774bBg605nohIvHIOzjgDvv8errgCnnwSmjSxTTHqji6JQkEqAlasgCOOsLYGr71mR79oUbmIJIpy5eysvm++sT53Z5xh6zqXLg1dmcjfU5BKcAsW2FqopUth9Gjo3Tt0RSIiedOuHUyaBAMH2q7j5s3hqafUe0rim4JUAps2zULU77/DJ5/Y+XkiIomsaFFbgD5njvWcuvJKe21buDB0ZSJ7pyCVoD79FDp1ghIlrD9LenroikREYqd2bRg7Fl54AaZPh5YtbaRKrRIk3ihIJaCxY6FrV6hRA778Eg4+OHRFIiKx5xxceKGNTh19NFx/PRx+uC1OF4kXClIJZtQo6NHDzsr77DM46KDQFYmIFKwaNex0hldftRDVqpWd36e1UxIPFKQSyPDh0LOnLcCcMAEqVQpdkYhI4XDODl+fOxe6dIF//9tOb1i2LHRlkuwUpBLE++/DqafaO7Hx4+HAA0NXJCJS+KpWtdfDF16wHX4tW9pxM+o7JaEoSCWAYcPg9NPhkEPgo4/UrVxEklvW2qkZM6BZMxup6tXLGhOLFDYFqTg3erS9QLRta4vMy5ULXZGISHyoV8/Wit57r73hbNECxo0LXZUkGwWpOPbpp3DKKbYmatQoKFs2dEUiIvElJQVuvhm+/dbeaHbpAjfeCDt2hK5MkoWCVJz67jvo3h3q1rWRqPLlQ1ckIhK/2rSBKVPg8svhoYesTcLixaGrkmSgIBWHZs60PlFpabYmKi0tdEUiIvGvZEk7Uuadd2D+fGjd2g5AFilIClJxZvFi6NzZXhAmTLD+KSIiknOnnmrd0Js2tQOQL70Utm4NXZVElYJUHFm71kaiduywkai6dUNXJCKSmOrUsYXoN90Ezz1nByLPnRu6KokiBak4sWULnHiiNZf78EN7JyUiInlXrBjcfz+MGQOrV9vu5zfeCF2VRI2CVBzYuRP69LFdJ0OHQseOoSsSEYmOLl1sqq91a+jdG/71L+3qk9hRkArMe/tH/f778OijNrcvIiKxVb06fPIJXHstDBoERx0FK1eGrkqiIMdByjk32Dm3xjk3e7fPHeic+8g5tyDzqp7bufTYY/Dkk3DDDXDNNaGrERGJrmLFYOBAm96bMcNaJnz6aeiqJNHlZkTqJaDrHp/rC0zw3jcEJmT+WXJo7Fg7ePPkk+G//w1djYhIcjjzTFtKUb48HHOM9Z3SWX2SVzkOUt77z4A9TzI6CXg58+OXgZ4xqivy5s+3f8zNm8Mrr0ARTbKKiBSaZs2s8fFJJ1kn9D591CJB8ia/v76reO9XAWReK+/rG51zlzjnJjvnJv/yyy/5/LGJbf1626FXvLjt0CtTJnRFIiLJp2xZa95533023Xf44bBiReiqJNEU2jiI9/4573269z49LYlbdWdk2EjUkiV2yGbt2qErEhFJXs5B377wwQc2U5CebtN+IjmV3yC12jlXDSDzuib/JUXbLbdYs82nn1abAxGReHHiifDNN1CqFBx5JAwZEroiSRT5DVIfAudlfnwe8EE+7y/S3n8fHnwQLrsMLroodDUiIrK7rHVT7dvDOefAf/5jff5E9ic37Q9eB74GDnbOLXfOXQTcDxznnFsAHJf5Z9mLRYvg/PNt2PjRR0NXIyIie1OxIowbB1dcYW98e/aE338PXZXEs6I5/Ubvfe99fOmYGNUSWVu3WqPNIkXsJPISJUJXJCIi+1KsmPX3a9YMrr7apvpGjIBq1UJXJvFIm+4LwVVXWfO3V1+1gzRFRCT+XXEFDB9ui9APOwzmzAldkcQjBakCNmQIDB4M/frBCSeErkZERHLj+OPh88/hjz/gH/+ACRNCVyTxRkGqAC1ebO9oOnaEO+4IXY2IiORF69bWEqFWLejaFV56KXRFEk8UpArIH39Yp9wiRWDoUEhJCV2RiIjk1UEHwRdf2GHHF1wA/fvrWBkxClIF5K67rCfJs8/auxgREUls5crByJEWpO68Ey6/XO0RJBe79iTnPv8c7rkHzjvPupiLiEg0FCsGL7wAVava0TJr19qsg3ZjJy8FqRjbtMkaudWtC48/HroaERGJNefg3nshLQ2uv97OT33/fUhNDV2ZhKCpvRj7z39g2TJ45RX9oxIRibLrrrPX+k8/tbVTa3RIWlJSkIqhCRPgmWfsHco//hG6GhERKWjnnGMHHs+dC4cfDkuXhq5ICpuCVIxs2mTn5zVqZAvNRUQkOZxwgh1Gv2aNvYn+/vvQFUlhUpCKkb59bUpv8GAoWTJ0NSIiUpg6dIDPPoOMDDtSZvbs0BVJYVGQioGJE+Gpp+Daa+0fk4iIJJ8WLWy9VNGi0KkTTJ0auiIpDApS+bR9O1x2GdSrB3ffHboaEREJqXFjG5kqXRqOOcY6oku0KUjl04MP2oGWTz4JpUqFrkZEREKrX9/CVMWKcNxx1hFdoktBKh8WL7bGm6efbucviYiIANSubdN81atDly467DjKFKTyyHu46iqbCx84MHQ1IiISb2rUsDBVrx507w4ffxy6IikIClJ5NGwYjB5t66Jq1AhdjYiIxKMqVeCTT6BBAzjxRJvyk2hRkMqDrVuto22rVnDllaGrERGReFapEowfbwfYH388fPll6IoklhSk8uDhh+Gnn2DQIJvaExER2Z8qVWxqr3p16NZNu/miREEql1autBO/Tz3VjgMQERHJiWrVLEylpdkC9ClTQlcksaAglUv9+lnn2gceCF2JiIgkmpo1bc1UhQrWGmH69NAVSX4pSOXClCnw0kvwr3/ZLgwREZHcqlXLwlSZMtC5M/zwQ+iKJD8UpHLIe7j+ehuS7dcvdDUiIpLI6tSxBehgI1M//RS0HMkHBakcGjPGtq327w/lyoWuRkREEl2jRjB2LGzYYCNTa9eGrkjyQkEqB3btslGoOnXg4otDVyMiIlHRujUMHw5Llthuvk2bQlckuaUglQPDhsG0aXDHHVC8eOhqREQkSo44At5+237PnHQSbNsWuiLJDQWpv7FzJ9x2GzRpAn36hK5GRESiqHt3ePllW4Teq5ftDpfEoCD1N4YMge+/h7vugpSU0NWIiEhU9ekDjz8OH3xgp2Z4H7oiyQn15d6PjAy4805o0wZOOSV0NSIiEnVXXZXd+Ll2bbjlltAVyd9RkNqPN96AxYvh/ffBudDViIhIMrjnHli2zDY51aoFZ58duiLZHwWpfdi1y94RNG9uJ3aLiIgUBudg8GAbmbrwQjuf7+ijQ1cl+6I1UvvwwQcwdy7cfDMU0aMkIiKFqHhx2zHeqBGcfDLMnh26ItkXRYS98B7uvdeOgTnjjNDViIhIMipfHkaNsqNkunWDFStCVyR7oyC1F+PHw+TJ0LcvFNXkp4iIBFKrFowcad3Pu3eHzZtDVyR7UpDai4cegmrV4NxzQ1ciIiLJrlUreOstmDnTfi/t2hW6ItmdgtQe5s6FceOsh0eJEqGrERERsam9Bx+0dVMDBoSuRnanias9DBpkAeqSS0JXIiIiku2662DOHGsQ3bSpdUCX8DQitZt16+CVV6xnR1pa6GpERESyOQdPPQUdO8IFF8CkSaErElCQ+pPnn4etW+Ff/wpdiYiIyF+VKGHTe1Wr2gHH2skXnoJUpowMeOIJa3rWokXoakRERPYuLQ0+/BA2bYKePWHbttAVJTcFqUyjR8Py5XbOkYiISDxr0QKGDrVWPTrgOCwFqUzPPw9VqlifDhERkXjXowfceqsdJ/P886GrSV4KUtgc88iRtnivWLHQ1YiIiOTMgAHQpQtcfTV8913oapKTghTw4ovW4Oyf/wxdiYiISM6lpMBrr9nBxqeeCmvWhK4o+SR9kNq1C154wRaZ168fuhoREZHcOfBA28m3dq31lsrICF1Rckn6IPXxx7BkCVx8cehKRERE8qZ1a3jmGfjkE7j55tDVJJekD1JDhkC5craFVEREJFGddx5ccYWdF/vhh6GrSR5JHaS2brXh0FNPhQMOCF2NiIhI/jzyCLRpA+efD8uWha4mOSR1kBoxwhqanXVW6EpERETyr0QJePNNWyfVuzf88UfoiqIvqYPU0KFQrRp06hS6EhERkdho0ACeew6++gr69w9dTfQlbZBavx5GjbLEnpISuhoREZHY6dXLNlHddx+MHRu6mmhL2iD17rs25KlpPRERiaJHH4VmzeCcc2DVqtDVRFfSBqn33oN69WxRnoiISNSUKgVvvQW//w5nn219EyX2kjJI/fYbjB9vLQ+cC12NiIhIwWjaFAYNsp6Jjz4auppoSsogNWYM7Nih3lEiIhJ9F11kv+9uvhlmzgxdTfQkZZB6/31IS4N//CN0JSIiIgXLOdvFV6GCTfFt2xa6omhJuiC1YweMHAk9emi3noiIJIe0NBg8GGbNgltvDV1NtCRdkJo40dZIaVpPRESSyfHHw+WXW/fzjz8OXU10JF2QGjPGOr8efXToSkRERArXQw9Bo0Z2Lt/69aGriYakC1LjxsERR9i2UBERkWRSqhQMGQI//wz/+lfoaqIhqYLU8uUwZw507hy6EhERkTDS020H36uv2pphyZ+YBCnn3BLn3Czn3HTn3ORY3GdBGDfOrl26hK1DREQkpFtvhebN4ZJLYMOG0NUktliOSB3lvW/lvU+P4X3G1Lhxdkhx8+ahKxEREQmneHF48UVYvRr+/e/Q1SS2pJna27XLupkfd5y6mYuIiKSnw403WlsEHWycd7EKUh4Y55yb4py7JEb3GVNz58Kvv2q3noiISJb+/aFJE7j4YmsNJLkXqyDVwXvfBugGXOmcO2LPb3DOXeKcm+ycm/zLL7/E6Mfm3Oef2/Xwwwv9R4uIiMSlAw6wEakVK+Cmm0JXk5hiEqS89yszr2uA94B2e/me57z36d779LS0tFj82Fz5/HOoXh3q1i30Hy0iIhK3DjsMrrsOnnkGvvgidDWJJ99ByjlX2jmXmvUx0BmYnd/7jSXvLUh17Kj1USIiInu64w6oXRsuu8yOUpOci8WIVBXgC+fcDOA7YKT3fkwM7jdmli61HlKa1hMREfmr0qXhiSes1+Ijj4SuJrEUze8deO8XA/8Xg1oKTNZQpYKUiIjI3nXvDqecAnfeCWeeqaUwOZUU7Q8mTbK0rf5RIiIi+/bYY5CSAldeacti5O8lRZCaMgVatbInh4iIiOxdzZpw990wejS8807oahJD5IPUzp0wbRocckjoSkREROLfVVdBmzZ2qPHGjaGriX+RD1Lffw9btihIiYiI5ERKCjz7LPz8s62Xkv2LfJCaMsWuClIiIiI5k54OF10EgwbZgITsW1IEqVKloHHj0JWIiIgkjnvusY1a116rhef7E/kgNXu27dbTQnMREZGcq1wZBgywA41HjAhdTfyKfJCaOxeaNQtdhYiISOK58ko71Pi662D79tDVxKdIB6l162yxXJMmoSsRERFJPMWKwaOPwqJFdpW/inSQmjfPrk2bhq1DREQkUXXuDD16WH+plStDVxN/FKRERERkvx55xA4z7t8/dCXxJ9JBau5cKFnSTrQWERGRvKlf39ZLDR5sBxtLtkgHqQULoGFDKBLpv6WIiEjB69cPUlOhb9/QlcSXSEeMH3/U6dUiIiKxULEi3HyztUKYODF0NfEjskHKe1iyREFKREQkVq65xg42vvFG2LUrdDXxIbJBau1a2LwZ6tQJXYmIiEg0lCxpu/cmT4a33w5dTXyIbJBassSuClIiIiKxc/bZ0LKlTfOpSWcSBClN7YmIiMROSgr897+2Dvl//wtdTXiRDVLLltm1Vq2wdYiIiERNly7QsaMdbLx1a+hqwopskPr5ZyhRAsqVC12JiIhItDgHd90Fq1bBs8+GriasyAapNWugShX7ny0iIiKx1akTHHUU3Hefbe5KVpENUqtXW5ASERGRgnHXXTZw8eSToSsJR0FKRERE8qRDB1sv9cADsGlT6GrCUJASERGRPLvzTvj1Vxg0KHQlYUQySHkPv/wClSuHrkRERCTa2rWDE0+Ehx6C334LXU3hi2SQ2rIFMjKgfPnQlYiIiETfrbfChg3JuYMvkkEqa562bNmwdYiIiCSDdu3g2GPh4Ydh27bQ1RSuSAaprKFFBSkREZHCccsttj75xRdDV1K4Ih2kUlPD1iEiIpIsOnWCQw+1HXx//BG6msIT6SClESkREZHC4ZyNSi1ZAm+8EbqawhPpIKURKRERkcLTvTs0bw733w+7doWupnBEMkht327XAw4IW4eIiEgyKVIEbr4Z5s6FDz8MXU3hiGSQypqbLVYsbB0iIiLJ5owzoHZteOSR0JUUjkgGqYwMuypIiYiIFK6iReGaa+Dzz2HKlNDVFLxIBqmsEamiRcPWISIikowuugjKlIGBA0NXUvAiGaQ0IiUiIhJOuXIWpt58E1asCF1NwYrkmB5IsnMAAB0VSURBVM2MGXZNpj4WEhvew4IF9hxasgSWLrXDOFetgpkzoUULO8OxZElIS4MaNaB6dahfH5o2hdKlQ/8NRETiwzXXwOOPwxNPwH33ha6m4EQySGW1p0+WrZeSP0uXwogRMHIkfP21nReVpXx5C0zO2UjnmjV2IPaWLfbx1q3Z3+sc1K0LrVvDEUfYrUULSEkp/L+TiEho9epBz552/t6tt0b3jWYkg9Rhh8HLL0Px4qErkXi1eTO89RY8/7yFJ4BGjWy3Sbt20KaNvQiUK7fv+/AeNm60YesFC2D2bJg1C777Dt59177nwAOhRw84+WQ47jgbyRIRSRbXXQfDhsErr8Dll4eupmA4732h/9D09HQ/efLkArv/F16Af/7TRhpq1SqwHyMJaONGGDTIFkCuXw8HHwwXXmjvmho1it3PWbbMdqyMGQPDh9vPTU2Fs86CSy6xoCYiEnXe25vTLVvszaZzoSvKG+fcFO99+t6+FsnF5lkjUTt2hK1D4sfOnTZPX6cO3H47dOwIn30G8+bBf/4T2xAFFuD79IFXX7UpwLFjbVTq5ZfhkEOgbVsbtdL0s4hEmXM2EjV3rr25jCIFKYm86dPtHdHVV0N6OkyebB13Dz+8cN4dFS8OnTtbiFq1ygLdxo1w2mnQrBkMHapAJSLR1auXrTd9+unQlRSMSAaprMOKN24MW4eE5b2FlkMPhZUrbRvuuHE2IhRK+fJw5ZU2Evbmm1CiBJx9ttX4xRfh6hIRKSilSsF559ko/Jo1oauJvUgGqQoV7Lp+fdg6JJzt221q7eqrbZH3rFm2kDxe5udTUqyeqVNt+m/VKhshO/tsa7cgIhIll15qLYkGDw5dSewpSEnkrF9vU2mvvw733muLvStVCl3V3hUpYuHphx/gtttslKpZM3jvvdCViYjETpMm0KmTtULYuTN0NbGlICWR8ttv0KWLtTR47TU7hTxeRqH2p1QpuPNOW79VrRqccgpcdll2TzQRkUR3+eXW6HjcuNCVxFakg9S6dWHrkMK1dSt07w7TptlcfO/eoSvKvf/7P+tD9Z//2Du3jh3thUdEJNH17AlVqsAzz4SuJLYiGaSKFbNjPKJ+vo9k8976M33xBQwZAieeGLqivCtWDP77X3j/fVi40HYcTpoUuioRkfwpXtwWnY8cCatXh64mdiIZpABq1oSffgpdhRSWQYMsQN1xB5x5ZuhqYuOkk+Dbb+1YhU6dYPTo0BWJiOTP+efbGqmhQ0NXEjuRDVIHHaQglSzmzLGpsB49oF+/0NXE1sEH23qvgw+2UTYtQheRRNakibV7efFFm0mIAgUpSWgZGXDBBdY77PnnbRdc1FStChMnWjf0M8+0YXERkUR1/vl2XMzUqaEriY0I/toxtWpZQ84NG0JXIgXpxRdt/dCgQbYuLqrKlrWpvZYt4dRT7XgbEZFE1KuXNSN+6aXQlcRGZIPUwQfb9fvvw9YhBWfLFujfH9q3t3+YUVe+vJ3ZV6eOndu3aFHoikREcq98eXsNe+01a56c6CIbpJo0seu8eWHrkILz3HPWEfyBBxKjV1QsVKwII0bYx9276xgkEUlM559vLYqGDw9dSf5FNkjVrWtbLTUiFU07d8Ljj0OHDtZrKZk0aGB9shYssKadUVmwKSLJ49hjoXp1222d6CIbpIoWhYYNNSIVVePGweLFcM01oSsJo1Mna/Xwxhvw8suhqxERyZ2UFNs8M3p04q9ljmyQAmjeHGbODF2FFIQ334Ry5axTbrLq29cC1VVXwdKloasREcmdXr1gxw5rPpzIIh2k0tPtF8wvv4SuRGLpjz/ggw+sYWXx4qGrCSclxXa9eJ+8I3MikrjatoV69WxkPZFFPkiBHQQr0TF1qg0FJ/IxMLFSuzYMGAAffpj47+pEJLk4Z6NS48cn9oBHpIPUIYfY/yidUxYtX35p12RbZL4v114LzZrBjTfaaJ2ISKLo1cs2D73zTuhK8i7SQSo1FRo3VpCKmkmTbCSmatXQlcSHYsXgvvvsgOOoNLgTkeTQvDk0bZrY03uRDlJgzRq/+gp27QpdicTKwoXZDVfFdO8Ohx0Gd94ZjQZ3IpIcnIPeveHzz2HFitDV5E1MgpRzrqtzbr5zbqFzrm8s7jNWOnWypl/avRcdixZB/fqhq4gvztlaqeXL4a23QlcjIpJzp59um2Y++CB0JXmT7yDlnEsBngS6AU2B3s65pvm931g56ii7fvJJ2DokNnbuhPXrIS0tdCXxp3Nnm8p+7DE16RSRxHHwwfba9d57oSvJm1iMSLUDFnrvF3vvdwBvACfF4H5jomZN6wStIBUNa9bYNdEbuBUE56wNwpQp8O23oasREcm5nj1h4kR7o5xoYhGkagA/7fbn5Zmf+xPn3CXOucnOucm/FPI+x6OOgs8+046mKMgKUKtWha0jXvXpAwccYIeBiogkip49ISMDRo0KXUnuxSJI7e242L9MLHjvn/Pep3vv09MKeV6ma1c73DVr27wkrqy1UY0bh60jXpUtCyecYOukMjJCVyMikjNt20K1aok5vReLILUcOGi3P9cEVsbgfmOmc2frgB2FU6aTXfHi1vpg4cLQlcSv3r1h9Wr44ovQlYiI5EyRIjYqNWYMbN0auprciUWQmgQ0dM7Vdc4VB3oBH8bgfmOmTBk4+mjr/qxFuImvVSv4+mv9v9yXzp3t+JiPPgpdiYhIzvXsCZs3w4QJoSvJnXwHKe99BnAVMBaYB7zlvZ+T3/uNtRNPtFGM+fNDVyL51a0bLFkCs2eHriQ+pabCoYfasQsiIomiUydbnpBobRBi0kfKez/Ke9/Ie1/fe39PLO4z1rLOZRs2LGwdkn+nnAIlSsAzz4SuJH4dc4ydMblpU+hKRERypnhxOO44m95LpBmHyHc2z3LQQdChA7z+euhKJL/S0mx32uDBNjIlf9W2rXXznzUrdCUiIjnXtas1Fp4Td/Na+5Y0QQrgrLNsOki/XBLfHXfY4sSrrkqsdy6FpVUru06fHrYOEZHc6NrVrmPGhK0jN5IqSJ1+ui3CVY+dxFezph3UO3IkPPBA6GriT82aUKGC3jSISGKpWdMOMlaQilNpabaj6bXXdIhxFFx9NZx5JvTtC889F7qa+OKctYn46ae//14RkXjStasdYvz776EryZmkClIA554Ly5ZpR1MUOAcvvwzHHw+XXgo336wmlLs76CBbayAikki6dYMdOxLnaLekC1InnwyVKsGzz4auRGKhRAnbiXnJJXD//bahYMqU0FXFh+rVYWVctcYVEfl7HTpA6dIwenToSnIm6YJUiRJwwQXWp0K/ZKKhRAkLxkOHwtKlkJ4O3bvbP8Lt20NXF07p0rBlS+gqRERyp0QJOyM3UZoKJ12QAhu92LnTts9LdJx1ljVcHTAAvvvOpvzS0my+/cYbYeBA+3/+44+hKy0cmzZZkNJh3SKSaI46yppoJ8LyhKQMUg0aWMPCZ5/VL5moKVcO+ve3dXAjRmSfOzdoEFx/PVx0EUyaFLrKwvHjj9YaYseO0JWIiOTOUUfZdeLEoGXkSFIGKYBrr7Wk+9ZboSuRgnDAAXDCCRaWp02zkZl16yxcdOsWurrC0aqV9doqVSp0JSIiudOyJZQvryAV144/Hpo0gQcfVEPHZJCSYn2V6tSxs+iSxQEH2O5GEZFEkpICRx6ZGDv3kjZIFSkCN9wAM2aoFYJE07ZttmhTRCQRdeoEixfbUo14lrRBCuy8tqpV1RlbomnzZtu5JyKSiBJlnVRSB6kSJWwB8vjx8NVXoasRia3Vq6Fy5dBViIjkTYsWcOCB8T+9l9RBCuCKK+yXze23h65EJLbWrFGQEpHEVaQIdOwIX34ZupL9S/ogVbq0ndU2YQJ8+mnoakRiRyNSIpLo2reHBQtg7drQlexb0gcpgMsus+M0brtNO/gkGjIyYNUqqFEjdCUiInnXvr1dv/kmbB37oyAFlCwJ/frZadMjR4auRiT/liyxMNWoUehKRETyLj3dWiF8/XXoSvZNQSrTxRfDwQdbSwR1O5dE98MPdm3YMGwdIiL5Ubo0/N//KUglhGLF4OGH7ay2p58OXY1I/ixYYFeNSIlIomvf3s5PzcgIXcneKUjt5vjj4bjj7NDbdetCVyOSd9On24HNlSqFrkREJH/at7e+eLNnh65k7xSkduMcPPIIbNwIt94auhqRvJs8Gdq21fEwIpL4shacx+v0noLUHpo3h6uvhmeeid//aSL7s3kzzJ1rizRFRBJd3bpQsSJMnRq6kr1TkNqLu+6ybeOXXKKF55J4pkyBXbtsREpEJNE5B61bK0gllNRUePJJm499+OHQ1Yjkzief2AvPP/4RuhIRkdho3dp+J8fj4IaC1D706AGnngp33JG9A0okEXz0kU3rHXhg6EpERGKjdWvYscOWLcQbBan9GDTImnWec078brsU2d1vv1kH4GOPDV2JiEjstGlj12nTwtaxNwpS+1G9uvWU+vZbuP/+0NWI/L2PP4adOxWkRCRaGja05pzxuE5KQepvnHkm9O5tU3yTJ4euRmT/3n3XpvQOPzx0JSIisVOkiHU414hUgnrySahSxab4Nm8OXY3I3m3fDh9+CD17Wqd+EZEoad3amg3v2hW6kj9TkMqBChXg5Zft+JgrrgDvQ1ck8lcffWRrpE47LXQlIiKx16IF/P47/PRT6Er+TEEqh445Bm6/HV55BV54IXQ1In/16qs2rXfMMaErERGJvaZN7TpvXtg69qQglQu33WaLeK+6yoYXReLFL7/Ae+/Z9HPx4qGrERGJvawgFW8tEBSkciElBYYOtVb1p50GGzaErkjEvPyyNaq7+OLQlYiIFIyKFaFyZQWphFe5Mrz1FixbBmecof5SEt6uXfD889bJvFmz0NWIiBScpk0VpCKhQwc71Pijj+C660JXI8lu5Ej44QfbCCEiEmVNmliQiqdNXwpSeXThhXDDDfDEE9a0UySU//4Xate2EVIRkShr2hQ2boRVq0JXkk1BKh/uvx+6d4err4Zx40JXI8noyy/tdv316h0lItEXjwvOFaTyISUFXnsNmjeHU06BSZNCVyTJ5u67bQHmRReFrkREpOA1aGDXxYvD1rE7Bal8Sk2FMWOs83m3bvD996ErkmQxcaI99/r2tTOoRESirkYNa/GyaFHoSrIpSMVA1ao2tVe0KHTuDMuXh65Ios57C1A1a8KVV4auRkSkcKSkQJ06GpGKpPr1YfRo6y113HGwenXoiiTKhg2Db7+FAQOgZMnQ1YiIFJ569RSkIqt1axgxwnpMHXWUwpQUjM2bre1GixZw3nmhqxERKVz16ytIRdoRR8CoUbB0qcKUFIy777ZDO596yqaTRUSSSb16Nvuzbl3oSoyCVAE48sjsMHX00QpTEjvz5sFDD8EFF0DHjqGrEREpfPXr2zVeRqUUpArIkUdax+klS+wX3o8/hq5IEl1GBpx/PpQta004RUSSUb16dlWQSgKdOsH48fDrr3aszKxZoSuSRHb//fDdd9ZJPy0tdDUiImHUrGnXeNkhryBVwNq3h88/B+ds/dSXX4auSBLR1Klwxx3Qu7eOghGR5Fa+vO1WXrkydCVGQaoQNGtmASotzVojDBsWuiJJJL/9ZgGqcmU721FEJJk5Z405V6wIXYlRkCokderAF19Ay5Zw6qk2TRNPp1dLfPLeDshetAhefx0OPDB0RSIi4SlIJanKleGTT2x04eabbeHw9u2hq5J4NnAgvPuuBe8jjghdjYhIfIinIKUuNIWsZEkYOhQaN4b+/W3Xwdtv2zEzIrsbNw7+8x87EPvf/w5djYhI/MgKUt7bVF9IGpEKwDm4/XZ44w2YMgXatLEF6SJZZs2C006z9XUvvhj+hUJEJJ7UqGEzOvHQlFNBKqAzz7Tz0sqUsS7oDz2kdVNiO1GOPx5SU60XWdmyoSsSEYkv1avbNR527ilIBdaiBUyeDD17wo032jROPCRsCePXX6FbNzv+YOTI7H4pIiKSLauX3tq1YesABam4ULasrZMaONAOPW7ZEiZMCF2VFLYNG6BzZ5g/H957D1q1Cl2RiEh8qlTJrgpS8v85B9deC998Y1N9xx4L118P27aFrkwKw6ZN0LWrrY0aNsz+/4uIyN5VrGhXBSn5i0MOsS7WV15pI1Rt28K0aaGrkoL0668WnKZMsZHJ448PXZGISHzLClK//hq2DlCQikulSlkH61GjLG23bQs33QRbtoSuTGJt+XI4/HCYMQPeeQdOOil0RSIi8a94cVsWoxEp2a9u3WDuXGvc+cADtnbq449DVyWx8v33dpj18uUwdqxClIhIblSsqBEpyYEKFeB//7MA5Rwcc4wFq59/Dl2Z5MfYsXDYYbB1K0ycCEceGboiEZHEUqlSBEaknHMDnHMrnHPTM29a3VFAjjoKZs60o2Veew0aNbJRKh0xk1i8h8ces3VQtWvDpEnWkFVERHInSiNSA733rTJvo2Jwf7IPJUvCvffCnDk2gnHTTdC8OQwfrkaeieD332008dproUcP+PJLC1MiIpJ7qam24zk0Te0loIYNLTyNHg1Fi9ov5U6d7BezxKcZMyA9HYYMgQED7CDiMmVCVyUikrhSU+0NamixCFJXOedmOucGO+cqxOD+JIe6drXpvscftyaOHTvCCSfA9OmhK5Msu3bZDsxDD4XffrNGq/37QxG9hRERyZcyZRJkRMo5N945N3svt5OAp4H6QCtgFfDwfu7nEufcZOfc5F9++SVmf4FkV6wYXHUVLFoE990HX30FrVvDGWcoUIW2cCEcfTRcfbVdZ8ywkUMREcm/MmVsRCr00pa/DVLe+2O99833cvvAe7/ae7/Te78LeB5ot5/7ec57n+69T0/LOiRHYqZ0aejbF378Efr1gzFjLFB16waffRb+iZZMdu60ZqotW1oz1f/9z87N09NeRCR2UlPt9Tb0pqv87tqrttsfTwZm568cya/y5eHuu2HZMluYPmWKLUzv2NGOHsnICF1htH36qe3Cu/56G4WaOxcuushaV4iISOxkrTMNPb2X35UaDzjnZjnnZgJHAdfFoCaJgfLlrVXC0qW2RmfFCjj1VKhXzwLWmjWhK4yWpUttOrVTJzt8+K23bENAjRqhKxMRiaasIBV6wXm+gpT3/hzvfQvvfUvvfQ/v/apYFSaxUbKkndu3cCG89x4cfLBN/R10EJx9to2g7NoVusrEtXKlrVFr1AhGjIA77rCO5aefrlEoEZGCFIkgJYmjaFHo2RM++gjmzYNLL7URk06doH5920m2aFHoKhPHqlU2fVe/Pjz7rPWHmj8fbr/dwquIiBSs4sXtumNH2DoUpJJQ48YwaJCFgSFDrC/VXXdBgwZ2gO7jj9tUoPzV9Olw3nnWSHPQIOjd2wLUs8/aKJ+IiBSOokXt+scfYetQkEpipUpBnz4wbpwtTr/vPli3Dq65BmrWhPbt4aGHbCdgMtu2Dd580xaPt25tzTQvu8wC1ODBtu5MREQKV7Fidg29iUpBSgALTn372vEz8+bZzr/t2+HGGy0oNGliR5uMGQNbtoSutuB5D1OnWg+o6tWhVy+b+nzgAVi+3Eaj6tcPXaWISPLKClKhR6SKhv3xEo8aN7YF6f36weLF8MEHMHasTV899hiUKAFHHGFtFTp0gHbtbHQr0e3aBd9+a20ihg2zv3uJEnDKKXDhhTYipY7kIiLxQUFKEkK9enDddXbbutWae44da4vWb73VvqdoUTjkEAtV6ek2/dWwIaSkhK09J376yY5tmTABxo+Hn3+2f5zHHmsjdKedBhV08JGISNxRkJKEU7IkdOliN7D1VF9/bYclf/EFPPlkdofZUqWss3erVtC0qbUHaNjQFmmHClhbt1qn8cmTYdIkG31asMC+lpZmI049eth5heXKhalRRERyRkFKEt6BB1roOOEE+/Mff9j6qmnTbHfbtGnw+uuwcWP2f1O8uI1y1a1rzSpr1LA1SDVqQNWqNvpTvrwFmdwGrowMazS6apXdli+HH36wReHz59ui+ayeWdWqQdu2cPnlcMwx0Ly5pu1ERBKJgpRETrFiNgrVsqW1CABbtL16tY38/PBD9nXpUlvMvWbNvs8BTE2FsmVtnVKxYtm3BQssdJUuDZs3WzO2rOue91WypI2GHXKI7VBs08YCVPXqBftYiIhIwcpqehz6LFkFKSlQzlnoqVrVelTt6Y8/bF3SihUWuDZssBGsDRuyP96xw77vjz9s6nDZMgtYNWpYZ9vSpe1WtqyNNGXdska7NNIkIhI9lSvDnXfajEJIClISVLFi1shSzSxFRCQ30tLgtttCV6E+UiIiIiJ5piAlIiIikkcKUiIiIiJ5pCAlIiIikkcKUiIiIiJ5pCAlIiIikkcKUiIiIiJ5pCAlIiIikkcKUiIiIiJ5pCAlIiIikkcKUiIiIiJ5pCAlIiIikkcKUiIiIiJ55Lz3hf9DnfsFWJqDb60ErC3gcqJCj1XO6bHKGT1OOafHKmf0OOWcHqucK4zHqrb3Pm1vXwgSpHLKOTfZe58euo5EoMcq5/RY5Ywep5zTY5UzepxyTo9VzoV+rDS1JyIiIpJHClIiIiIieRTvQeq50AUkED1WOafHKmf0OOWcHquc0eOUc3qsci7oYxXXa6RERERE4lm8j0iJiIiIxK24DFLOudOdc3Occ7ucc+l7fO1m59xC59x851yXUDXGI+fcAOfcCufc9Mzb8aFriifOua6Zz5uFzrm+oeuJZ865Jc65WZnPo8mh64knzrnBzrk1zrnZu33uQOfcR865BZnXCiFrjAf7eJz0GrUH59xBzrlPnHPzMn/v/Svz83pO7WE/j1XQ51VcTu0555oAu4BngRu895MzP98UeB1oB1QHxgONvPc7Q9UaT5xzA4DfvfcPha4l3jjnUoAfgOOA5cAkoLf3fm7QwuKUc24JkO69Vx+bPTjnjgB+B17x3jfP/NwDwDrv/f2ZIb2C9/6mkHWGto/HaQB6jfoT51w1oJr3fqpzLhWYAvQEzkfPqT/Zz2N1BgGfV3E5IuW9n+e9n7+XL50EvOG93+69/xFYiIUqkb/TDljovV/svd8BvIE9n0RyxXv/GbBuj0+fBLyc+fHL2It7UtvH4yR78N6v8t5Pzfx4EzAPqIGeU3+xn8cqqLgMUvtRA/hptz8vJw4exDhzlXNuZuawetIPBe9Gz53c8cA459wU59wloYtJAFW896vAXuyByoHriWd6jdoH51wdoDXwLXpO7dcejxUEfF4FC1LOufHOudl7ue1vlMDt5XPxNzdZgP7mcXsaqA+0AlYBDwctNr4k/XMnlzp479sA3YArM6dpRPJLr1H74JwrA7wLXOu9/y10PfFsL49V0OdV0cL8Ybvz3h+bh/9sOXDQbn+uCayMTUWJIaePm3PueWBEAZeTSJL+uZMb3vuVmdc1zrn3sKnRz8JWFddWO+eqee9XZa7jWBO6oHjkvV+d9bFeo7I554phwWCo935Y5qf1nNqLvT1WoZ9XiTa19yHQyzlXwjlXF2gIfBe4priR+Y8ty8nA7H19bxKaBDR0ztV1zhUHemHPJ9mDc6505kJOnHOlgc7oufR3PgTOy/z4POCDgLXELb1G/ZVzzgEvAPO894/s9iU9p/awr8cq9PMqXnftnQw8DqQBG4Dp3vsumV/rB1wIZGDDeqODFRpnnHOvYkObHlgCXJo1xy6QuSX2USAFGOy9vydwSXHJOVcPeC/zj0WB1/RYZXPOvQ50wk6cXw30B94H3gJqAcuA0733Sb3Qeh+PUyf0GvUnzrmOwOfALGy3OsAt2NofPad2s5/HqjcBn1dxGaREREREEkGiTe2JiIiIxA0FKREREZE8UpASERERySMFKREREZE8UpASERERySMFKREREZE8UpASERERySMFKREREZE8+n95MLZwUd21MgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "count = 7\n", "f_list = fibo_seq(count)\n", "x0_array, y0_array = find_o_xy(f_list)\n", "\n", "# O comprimento lateral correspondente a cada quadrado, conforme mostrado no exemplo, o raio começa em 1, 2, ...\n", "f_list_r = fibo_seq(count+2)[2::]\n", "\n", "# Desenhar o círculo 1/4 em cada quadrado\n", "plt.figure(figsize=(10,6))\n", "start_angle, end_angle = np.pi, 1.5 * np.pi\n", "\n", "for n in np.arange(len(f_list)):\n", " t = np.arange(start_angle,end_angle,0.001)\n", " circle_x = (f_list_r[n]) * (np.sin(t)) + x0_array[n]\n", " circle_y = (f_list_r[n]) * (np.cos(t)) + y0_array[n]\n", " start_angle += 0.5 * np.pi\n", " end_angle += 0.5 * np.pi\n", " plt.plot(circle_x,circle_y,color='b')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para imitarmos o diagrama clássico da espiral de Fibonacci, desenhamos os quadrados:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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npkz7YmnQAHflYiIREaLFvaaHI2DGwpSh9G9O/TsCYMHZ1wBJRILpk2z3itaaC4iYdGiBezbZ8sWoo2C1BEMGWLNOi++OHovuxQ52B9/WAfgU0/1XYmISOS0bGnnBQv81pEZBakjqFLFekp98w088ojvakT+2ccfw4EDClIiEi716llzzmhcJ6Ug9Q8uuAB697YpvrlzfVcjcmQffABlykC7dr4rERGJnIQE63CuEakY9fzzULGiTfHt2uW7GpHM7d0LY8dCjx7WqV9EJExatLBmw6mpviv5KwWpLChdGt54w7aPue46CALfFYn83bRptkbq3HN9VyIiEnlNm8LOnfDzz74r+SsFqSw65RS4915480149VXf1Yj83Vtv2bTeKaf4rkREJPIaNbLz8uV+6ziUglQ23HOPLeLt18+GF0Wixa+/wocf2vRzoUK+qxERibz0IBVtLRAUpLIhMRFGjrRW9eeeC7//7rsiEfPGG9ao7qqrfFciIpI3ypaFChUUpGJehQrw3nuwdi2cf776S4l/qanw8stw4onQuLHvakRE8k6jRgpSodCmjW1qPG0a9O/vuxqJdxMmwPff24UQIiJh1rChBalouuhLQSqHrrgCbrkFnnvOmnaK+PLf/0KNGjZCKiISZo0awfbtsHGj70oyKEjlwiOPQLducMMNMHWq72okHn3xhR0336zeUSISftG44FxBKhcSE2HUKGjSBM45B+bM8V2RxJsHHrAFmFde6bsSEZG8V7eunVet8lvHwRSkcikpCSZPts7nXbvCd9/5rkjixaxZ9ti74w7bg0pEJOyqVrUWLz/+6LuSDApSEVCpkk3tFSgAnTrBunW+K5KwCwILUNWqwfXX+65GRCR/JCZCzZoakQqlOnVg0iTrLXXaabBpk++KJMxGj4ZvvoFBg6BIEd/ViIjkn9q1FaRCq0ULGD/eekx17KgwJXlj1y5ru9G0KVx6qe9qRETyV506ClKhdtJJMHEirFmjMCV544EHbNPOF16w6WQRkXhSu7bN/mzd6rsSoyCVB9q3zwhTJ5+sMCWRs3w5PP44XH45tG3ruxoRkfxXp46do2VUSkEqj7Rvbx2nV6+2F7yffvJdkcS6lBS47DIoUcKacIqIxKPate2sIBUHOnSA6dPht99sW5nFi31XJLHskUdg9mzrpF++vO9qRET8qFbNztFyhbyC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y5pVVq1qa5CqVoVKlWz0p1QpCzLZDVwpKdZodONGO9atg++/t0XhK1bYovn0ufTKleG44+Daa+GUU6BJE03biYjEEgWpPLZwoTaIjQb/+pcFrD//tBGh3bthyxYLOXv32vcOJzHRjoQEa26Zft65075fvLgFowMHMo5DJSTYSFrRotaeoHhx25+pcGELeB99ZEcYpQdY/R2ISBjt2mVnBak8cOGFviuQdM7ZKFShQjbSdKjUVNi3L+NISfnrceCA/Uz6xpSpqRaOChSAo47KCFrpoatw4Yzfl/6xOoyLiIRPwYJQs6Ztz+VTKINU3752iIiIiOQlrQoRERERySEFKREREZEcUpASERERySEFKREREZEcUpASERERySEFKREREZEcUpASERERySEFKREREZEcUpASERERySEFKREREZEcUpASERERySEFKREREZEcUpASERERySEXBEH+/1LnfgXWZOFHywFb8ricsNB9lXW6r7JG91PW6b7KGt1PWaf7Kuvy476qEQRB+cy+4SVIZZVzbm4QBMm+64gFuq+yTvdV1uh+yjrdV1mj+ynrdF9lne/7SlN7IiIiIjmkICUiIiKSQ9EepIb5LiCG6L7KOt1XWaP7Ket0X2WN7qes032VdV7vq6heIyUiIiISzaJ9REpEREQkakVlkHLOneecW+qcS3XOJR/yvTudcz8451Y45zr7qjEaOecGOefWO+cWph2n+64pmjjnuqQ9bn5wzt3hu55o5pxb7ZxbnPY4muu7nmjinBvunNvsnFty0NfKOOemOedWpp1L+6wxGhzmftJz1CGcc0c752Y655anve79O+3rekwd4gj3ldfHVVRO7TnnGgKpwFDgliAI5qZ9vRHwNtAKqAJMB+oHQXDAV63RxDk3CNgZBMHjvmuJNs65ROB74DRgHTAH6B0EwTKvhUUp59xqIDkIAvWxOYRz7iRgJ/BmEARN0r72KLA1CIJH0kJ66SAIbvdZp2+HuZ8Goeeov3DOVQYqB0Ew3zmXBMwDegCXocfUXxzhvjofj4+rqByRCoJgeRAEKzL51lnAO0EQ7A2C4CfgByxUifyTVsAPQRCsCoJgH/AO9ngSyZYgCD4Fth7y5bOAN9I+fgN7co9rh7mf5BBBEGwMgmB+2sc7gOVAVfSY+psj3FdeRWWQOoKqwM8Hfb6OKLgTo0w/59y3acPqcT8UfBA9drInAKY65+Y55/r6LiYGVAyCYCPYkz1QwXM90UzPUYfhnKsJtAC+QY+pIzrkvgKPjytvQco5N905tyST40ijBC6Tr0Xf3GQe+of77UWgDtAc2Ag84bXY6BL3j51sahMEQUugK3B92jSNSG7pOeownHPFgQ+Am4Ig+MN3PdEsk/vK6+OqQH7+soMFQXBqDv6zdcDRB31eDdgQmYpiQ1bvN+fcy8D4PC4nlsT9Yyc7giDYkHbe7Jz7EJsa/dRvVVFtk3OuchAEG9PWcWz2XVA0CoJgU/rHeo7K4JwriAWDkUEQjE77sh5TmcjsvvL9uIq1qb2xQC/nXGHnXC2gHjDbc01RI+2PLd3ZwJLD/WwcmgPUc87Vcs4VAnphjyc5hHOuWNpCTpxzxYBO6LH0T8YCl6Z9fCnwkcdaopaeo/7OOeeAV4HlQRA8edC39Jg6xOHuK9+Pq2i9au9s4FmgPPA7sDAIgs5p3xsAXAGkYMN6k7wVGmWcc29hQ5sBsBq4On2OXSDtktingURgeBAED3ouKSo552oDH6Z9WgAYpfsqg3PubaADtuP8JmAgMAZ4D6gOrAXOC4IgrhdaH+Z+6oCeo/7COdcW+AxYjF2tDnAXtvZHj6mDHOG+6o3Hx1VUBikRERGRWBBrU3siIiIiUUNBSkRERCSHFKREREREckhBSkRERCSHFKREREREckhBSkRERCSHFKREREREckhBSkRERCSH/h9Kwv439niQaQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "count = 7\n", "f_list = fibo_seq(count)\n", "x0_array, y0_array = find_o_xy(f_list)\n", "\n", "f_list_r = fibo_seq(count+2)[2::] # O comprimento lateral correspondente de cada quadrado\n", "square_list = np.zeros([1,2,5])\n", "start_angle, end_angle = np.pi, 1.5 * np.pi\n", "\n", "plt.figure(figsize=(10,6))\n", "for n in np.arange(len(f_list_r)):\n", " # Coordenadas do centro do círculo\n", " x0 = x0_array[n]\n", " y0 = y0_array[n]\n", " \n", " # Obtenha coordenadas diagonais de vértice\n", " x2 = x0+f_list_r[n]*(-1)**((np.mod(n+1,2)+n+1)/2)\n", " if n == 0:\n", " y2 = -1 # Ponto de partida especial \n", " else:\n", " y2 = y0+f_list_r[n]*(-1)**(1+(np.mod(n,2)+n)/2)\n", "\n", " # As duas coordenadas restantes\n", " x1, x3 = x0, x2\n", " y1, y3 = y2, y0\n", " \n", " # Integrar, desenhar um quadrado precisa-se voltar à origem, então 5 pontos\n", " pp = np.array([[[x0,x1,x2,x3,x0],[y0,y1,y2,y3,y0]]])\n", " \n", " # Desenhar o arco\n", " t = np.arange(start_angle,end_angle,0.001)\n", " circle_x = (f_list_r[n]) * (np.sin(t)) + x0_array[n]\n", " circle_y = (f_list_r[n]) * (np.cos(t)) + y0_array[n]\n", " start_angle += 0.5 * np.pi\n", " end_angle += 0.5 * np.pi\n", " \n", " plt.plot(pp[0][0][::], pp[0][1][::], color='b')\n", " plt.plot(circle_x, circle_y, color='b')" ] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 4 }