135 lines
29 KiB
Plaintext
135 lines
29 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e4ea692f",
|
|
"metadata": {},
|
|
"source": [
|
|
"# [Quadratic Primes](https://projecteuler.net/problem=27)\n",
|
|
"\n",
|
|
"Couple of observations to speed up iterating through values of $a$ and $b$:\n",
|
|
"1. $0^2 + 0a + b = b$ must be prime. Additionally, since $|b| \\leq 1000$, the largest possible value for $b$ is 997.\n",
|
|
"2. $1^2 + 1a + b = 1 + a + b$ must be prime. Therefore $a = p - b - 1$ for some prime $p$. Furthermore, since $|a| < 1000$, it follows that $-1000 < p - b - 1 < 1000 \\implies b - 999 < p < b + 1001$, so $p$ must be less than $997 + 1001 = 1998$ in the most extreme case.\n",
|
|
"\n",
|
|
"These facts allows us to iterate over just prime numbers instead of the larger range of integers."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "a9751bc6",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"-59231\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from itertools import count\n",
|
|
"\n",
|
|
"def consecutive_primes(a, b):\n",
|
|
" f = lambda x: x^2 + a*x + b\n",
|
|
" for n in count(0):\n",
|
|
" if not is_prime(f(n)):\n",
|
|
" return n\n",
|
|
"\n",
|
|
"\n",
|
|
"coeffs = dict()\n",
|
|
"primes = prime_range(2000)\n",
|
|
"for b in primes:\n",
|
|
" if b > 1000:\n",
|
|
" break\n",
|
|
" \n",
|
|
" for p in primes:\n",
|
|
" a = p - b - 1\n",
|
|
" if not (abs(a) < 1000):\n",
|
|
" break\n",
|
|
" \n",
|
|
" coeffs[(a, b)] = consecutive_primes(a, b)\n",
|
|
"\n",
|
|
"a, b = max(coeffs, key=coeffs.get)\n",
|
|
"print(a * b)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "cbd83361",
|
|
"metadata": {},
|
|
"source": [
|
|
"It's worth noting that the coefficients end up being $a=-61$ and $b=971$. If you iterate through $n=0,1,2,\\ldots$ for the resulting quadratic and the other formula given, $n^2 - 79n + 1601$, you'll see that these polynomials don't actually generate any new prime numbers compared to Euler's formula - they just repeat primes that Euler's formula already gives.\n",
|
|
"\n",
|
|
"Furthermore, both of these polynomials are actually just shifts of Euler's formula:\n",
|
|
"$$n^2 - 61n + 971 = (n-31)^2 + (n-31) + 41$$\n",
|
|
"$$n^2 - 79n + 1601 = (n-40)^2 + (n-40) + 41$$\n",
|
|
"\n",
|
|
"What's going on? Let $f(n) = n^2 + n + 41$. An interesting property of [prime-generating functions](https://mathworld.wolfram.com/Prime-GeneratingPolynomial.html) is if $p(n)$ generates primes for $0 \\leq n \\leq u$, then $p(u - n)$ also will. To understand why, try evaluating $p(u-n)$ at $n=0,1,2,\\ldots,u$; you get $p(u),p(u-1),p(u-2),\\ldots,p(0)$, which are the same values given by $p(n)$, just in reverse.\n",
|
|
"\n",
|
|
"However, that property alone doesn't explain why shifting $f$ right generates *more* (non-distinct) primes than $f(n)$. To understand that aspect, let's look at a plot of $f(n)$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "93c85dea",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABGUElEQVR4nO3de5zVc+LH8depNF00g+i2klCYcm8UuWRXYW1L0bK5lEtCKEnEtopVbiU0RS0Rm6x1v+S2q1gVyT3XyK+hEmGmm0l1fn98tpSKLjPzOZfX8/E4j9E505y3OU29z+fz/Xw+iWQymUSSJElpr1LsAJIkSSobFjtJkqQMYbGTJEnKEBY7SZKkDGGxkyRJyhAWO0mSpAxhsZMkScoQFjtJkqQMYbGTlPGSySQlJSW4H7ukTGexk5TxFi5cSF5eHgsXLowdRZLKlcVOkiQpQ1jsJEmSMoTFTpIkKUNY7CRJkjKExU6SJClDWOwkSZIyhMVOkiSpAj3+OLRrB4sXl/3XtthJyliFhYXk5+dTUFAQO4okrVZYCMXFULNm2X/tRNKt2CVluJKSEvLy8iguLiY3Nzd2HElZbOZMaNIE7r4bunQp+6/viJ0kSVIFuf122HZb+NOfyufrW+wkSZIqwNKlMGYMnHkmVK9ePs9hsZMkSaoA//wnfPstnHtu+T2HxU6SJKkCjBgRVsPutlv5PUeV8vvSkiRJApg+HV57DR59tHyfxxE7SZKkcjZyJDRsCMceW77PY7GTJEkqR99/D+PGwTnnQJVyniu12EmKaueddyaRSKxz69GjBwDJZJIBAwbQoEEDqlevTps2bZgxY0bk1JK08e65B378Ec4+u/yfy2InKapp06Yxd+7c1bfnn38egE6dOgFwww03MHToUIYPH860adOoV68ebdu2ZeHChTFjS9JGSSbDNGzHjlCvXvk/n8VOUlQ77LAD9erVW3178skn2XXXXTn88MNJJpMMGzaMK6+8ko4dO9K8eXPuuecelixZwrhx42JHl6Rf9eKL8NFHcP75FfN8FjtJKWPZsmXcd999nHnmmSQSCWbNmsW8efNo167d6s/Jycnh8MMPZ/LkyRv8OqWlpZSUlKx1k6QYRoyA/Hw47LCKeT6LnaSU8eijj/L999/TtWtXAObNmwdA3bp11/q8unXrrn5sfQYPHkxeXt7qW8OGDcstsyRtyJw5YXuT886DRKJintNiJyll3HnnnRxzzDE0aNBgrfsTP/sbMZlMrnPfmvr160dxcfHqW1FRUbnklaRfMno0VKsGp51Wcc/pBsWSUsL//d//8cILL/Dwww+vvq/e/640njdvHvXr1199//z589cZxVtTTk4OOTk55RdWkn7Fjz/CqFFw6qmQl1dxz+uInaSUMGbMGOrUqcOxa+ze2bhxY+rVq7d6pSyE6/AmTZrEwQcfHCOmJG2UJ54IU7HnnVexz+uInaToVq5cyZgxY+jSpQtV1ti9M5FI0KtXLwYNGkSTJk1o0qQJgwYNokaNGnTu3DliYkn6ZSNGwMEHwz77VOzzWuwkRffCCy8we/ZszjzzzHUe69u3L0uXLuX888/nu+++o2XLljz33HPUqlUrQlJJ+nUffQT//jfce2/FP3cimUwmK/5pJanilJSUkJeXR3FxMbm5ubHjSMpwF18M990HRUVh8URF8ho7SZKkMrJkCdx9N5x1VsWXOrDYSZIklZn774fiYujePc7zW+wkSZLKQDIJw4fD738PjRvHyWCxkyRJKgOTJ8Nbb8GFF8bLYLGTJEkqA7fdBk2aQNu28TJY7CRJkrbQnDnw0ENwwQVQKWK7sthJyliFhYXk5+dTUFAQO4qkDHfHHZCTA126xM3hPnaSMp772EkqT8uWwU47wQknQGFh3CyO2EmSJG2Bf/0LvvoKevSIncRiJ0mStEWGD4ff/Q7y82Mn8axYSZKkzTZ9OkyZAo8+GjtJ4IidJEnSZho+HBo1gj/8IXaSwGInSZK0Gb7+Ohwhdv75ULly7DSBxU6SJGkz3HknJBJw1lmxk/zEYidJkrSJli+HESOgc2eoXTt2mp9Y7CRJkjbRE09AUVE4aSKVWOwkSZI20W23QevWsN9+sZOsze1OJEmSNsGMGfDii2HhRKpxxE6SJGkTDB8O9etDx46xk6zLYicpYxUWFpKfn09BQUHsKJIyxPffw9ix0L07VK0aO826EslkMhk7hCSVp5KSEvLy8iguLiY3Nzd2HElpbNgw6NsXZs+GevVip1mXI3aSJEkbYcWKMA3bqVNqljpw8YQkSdJGeeop+PRTGDcudpINc8ROkiRpI9xyCxx0EBx4YOwkG+aInSRJ0q945x34z39g/PjYSX6ZI3aSJEm/4tZb4Te/Sc0tTtZksZMkSfoFX38N990Xjg/baqvYaX6ZxU6SJOkXjBoFlSpBt26xk/w6i50kSdIGLFsGhYVw6qlQu3bsNL/OYidJkrQB//oXzJ0LPXvGTrJxLHaSJEnrkUyGkyaOPBKaNYudZuO43YkkSdJ6TJ0K06bBk0/GTrLxHLGTlLEKCwvJz8+noKAgdhRJaeiWW6BJEzjmmNhJNl4imUwmY4eQpPJUUlJCXl4excXF5Obmxo4jKQ0UFUHjxnDzzXDhhbHTbDxH7CRJkn5mxAioWRO6do2dZNNY7CRJktawZAnccQecdRbUqhU7zaax2EmSJK3hvvvg++/DSRPpxmInSZL0P8lkWDRx3HGwyy6x02w6tzuRJEn6nxdegPffD6dNpCNH7CRJkv5n6FDYd184/PDYSTaPI3aSJEnAjBnwzDMwdiwkErHTbB5H7CRJkgh71jVoACedFDvJ5rPYSZKkrPfVV3DvvWEz4qpVY6fZfBY7SZKU9UaMgCpVoHv32Em2jMVOkiRltaVLQ7E780zYdtvYabaMxU5SxiosLCQ/P5+CgoLYUSSlsHvvhQULoFev2Em2XCKZTCZjh5Ck8lRSUkJeXh7FxcXk5ubGjiMphaxcCc2awZ57wsMPx06z5dzuRJIkZa0JE+DDD+Hvf4+dpGw4Yicp4zliJ2lDfvc7WLQIpk5N373r1uSInSRJykpvvQX/+Q888EBmlDpw8YQkScpSQ4fCTjtBx46xk5Qdi50kSco6X34J998PPXuG/esyhcVOkiRlneHDoXp1OPvs2EnKlsVOkiRllUWL4PbboVs3yLT1VBY7SdF9+eWXnHrqqdSuXZsaNWqw7777Mn369NWPd+3alUQisdatVatWERNLSmd33w0LF8JFF8VOUvYyaFZZUjr67rvvaN26NUcccQQTJkygTp06fPrpp2yzzTZrfd7RRx/NmDFjVv+6ajqf0i0pmhUrYNgwOPFEaNQodpqyZ7GTFNX1119Pw4YN1yptO++88zqfl5OTQ7169SowmaRM9Pjj8OmnMG5c7CTlw6lYSVE9/vjjtGjRgk6dOlGnTh32228/Ro8evc7nTZw4kTp16tC0aVO6devG/PnzI6SVlO6GDIFDDoEDD4ydpHx48oSkqKpVqwZA79696dSpE6+99hq9evXijjvu4PTTTwfggQceYOutt6ZRo0bMmjWL/v37s3z5cqZPn05OTs46X7O0tJTS0tLVvy4pKaFhw4aePCFluVdeCaXuscfgj3+MnaZ8WOwkRVW1alVatGjB5MmTV9930UUXMW3aNKZMmbLe3zN37lwaNWrE+PHj6bienUUHDBjAwIED17nfYidlt+OPh48+ghkzoFKGzllm6P+WpHRRv3598vPz17pvzz33ZPbs2b/4exo1asQnn3yy3sf79etHcXHx6ltRUVGZZpaUfj78MFxfd+mlmVvqwMUTkiJr3bo1H3300Vr3ffzxxzT6heVqCxYsoKioiPr166/38ZycnPVO0UrKXkOGQL16cMopsZOUrwzurJLSwcUXX8zUqVMZNGgQM2fOZNy4cYwaNYoePXoAsGjRIvr06cOUKVP4/PPPmThxIu3bt2f77benQ4cOkdNLSgdz58LYseH4sEx/z2exkxRVQUEBjzzyCPfffz/NmzfnmmuuYdiwYZzyv7fVlStX5t133+W4446jadOmdOnShaZNmzJlyhRq1aoVOb2kdHDrraHQde8eO0n5c/GEpIxXUlJCXl6eiyekLFRSAjvtFI4Pu/HG2GnKnyN2kiQpY40eDUuWhGnYbGCxkyRJGWnZMrj55rBgYscdY6epGBY7SZKUkcaPhy+/hD59YiepOBY7SZKUcZJJuOEG+MMfoFmz2GkqjvvYSZKkjDNhQjhhYuTI2EkqlqtiJWU8V8VK2adNGygthcmTIZGInabiOGInSZIyyquvwqRJ8NBD2VXqwGvsJGWwwsJC8vPzKSgoiB1FUgW68UZo0gSOOy52kornVKykjOdUrJQ9Zs6Epk3h9tvhnHNip6l4jthJkqSMMWQI7LADnH567CRxWOwkSVJGmD8fxowJp0xUqxY7TRwWO0mSlBGGDYOttoLzzoudJB6LnSRJSnvFxVBYGErdttvGThOPxU6SJKW9ESPCvnUXXxw7SVwWO0mSlNaWLIGbb4YzzoD69WOnictiJ0mS0tpdd8G338Kll8ZOEp/FTpIkpa0ffwwbEp98MuyyS+w08VnsJElS2ho3DmbPhssvj50kNVjsJElSWlq5Eq67Dv74R2jePHaa1FAldgBJkqTN8eij8OGHYVNiBY7YScpYhYWF5OfnU1BQEDuKpDKWTMKgQXDEEdCqVew0qSORTCaTsUNIUnkqKSkhLy+P4uJicnNzY8eRVAaefx7atQsfjzwydprUYbGTlPEsdlLmOeIIWLQIXnsNEonYaVKH19hJkqS0MmUKTJwIDz9sqfs5r7GTJElpZfBg2HNPOO642ElSjyN2kiQpbbz7LjzxBNxzD1RyeGodfkskSVLauO46aNQI/vzn2ElSkyN2kiQpLXz6KYwfD7feClttFTtNanLETpIkpYUbb4Ttt4czz4ydJHVZ7CRJUsr78stwwsTFF0P16rHTpC6LnSRJSnk33AA1a8L558dOktosdpIkKaXNmwejRkGvXuAe47/MYidJklLaTTdB1apw0UWxk6Q+i52kjFVYWEh+fj4FBQWxo0jaTF9/DSNHhlK3zTax06Q+z4qVlPE8K1ZKX/36wfDh8PnnULt27DSpzxE7SZKUkhYsCKWuRw9L3cay2EmSpJR0yy2wciX07h07Sfqw2EmSpJTz/feh2J13HtSpEztN+rDYSZKklHPrrbBsGfTpEztJerHYSZKklFJSAsOGwTnnQL16sdOkF4udJElKKYWFsHgx9O0bO0n6sdhJkqSUsWgRDB0KZ50Fv/lN7DTpx2InSZJSxu23h4UTl10WO0l6sthJkqSUsGQJ3HgjdO0KjRrFTpOeLHaSJCkljB4dNiXu1y92kvRV5sVu4ULo3BkmTizrryxJkjLVDz/A9dfDqafCLrvETpO+yrzYbb01fPghXHUVeAqtpJgKCwvJz8+noKAgdhRJv+LOO+Grr+CKK2InSW+JZLLs69fjj8Nxx8G//w2//W1Zf3VJ2jQlJSXk5eVRXFxMbm5u7DiSfmbZMthtNzj0UPjHP2KnSW/lco1d+/ZwwAGO2kmSpF93113wxRdw5ZWxk6S/cil2iQQMHAj//W8YtZMkSVqf0lK49lo4+WTIz4+dJv2V26rY3/8eDjzQUTtJkrRhf/87zJkDf/1r7CSZodyKXSIBAwbA5Mnw/PPl9SySJCld/fADDBoEp5wCe+wRO01mKNd97I4+Glq2dNROkiSta9SosBK2f//YSTJHuRa7VdfaTZ0Kzz5bns8kSZLSydKlMHgwnHYaNGkSO03mKPeTJ9q1g4MOctROkiT95Pbb4euv4S9/iZ0ks5R7sVs1avfaazBhQnk/m6R09OWXX3LqqadSu3ZtatSowb777sv06dNXP55MJhkwYAANGjSgevXqtGnThhkzZkRMLGlLLF4M110XzoTdddfYaTJLhZwVe+SR0Lq1o3aS1vXdd9/RunVrttpqKyZMmMD777/PkCFD2GabbVZ/zg033MDQoUMZPnw406ZNo169erRt25aFCxfGCy5ps40YAd9+62hdeSiXkyfW59//DgXviSfgD3+oiGeUlA4uv/xyXnnlFV5++eX1Pp5MJmnQoAG9evXisssuA6C0tJS6dety/fXX07179199Dk+ekFLHokXQuDF07Ah33BE7TeapkBE7CEeLHXpo2ALFUTtJqzz++OO0aNGCTp06UadOHfbbbz9Gjx69+vFZs2Yxb9482rVrt/q+nJwcDj/8cCZPnrzer1laWkpJSclaN0mpYfhwKC72lInyUmHFLpGAq6+G6dPDqJ0kAXz22WeMHDmSJk2a8Oyzz3Luuedy0UUXMXbsWADmzZsHQN26ddf6fXXr1l392M8NHjyYvLy81beGDRuW7/+EpI1SUgI33gjdusFOO8VOk5kqrNgBtGkTblddBStXVuQzS0pVK1euZP/992fQoEHst99+dO/enW7dujFy5Mi1Pi+RSKz162Qyuc59q/Tr14/i4uLVt6KionLLL2nj3XZbmIrt1y92ksxVocUO4Jpr4K234KGHKvqZJaWi+vXrk/+zAyL33HNPZs+eDUC9evUA1hmdmz9//jqjeKvk5OSQm5u71k1SXMXFMGQIdO8OO+4YO03mqvBid8gh4USKv/4VVqyo6GeXlGpat27NRx99tNZ9H3/8MY0aNQKgcePG1KtXj+fXOJtw2bJlTJo0iYMPPrhCs0rafDffHDYlvvzy2EkyW4UXO4C//Q0+/BDuuy/Gs0tKJRdffDFTp05l0KBBzJw5k3HjxjFq1Ch69OgBhCnYXr16MWjQIB555BHee+89unbtSo0aNejcuXPk9JI2xoIFMHQo9OgBDRrETpPZKmy7k5874QR44w346COoWjVGAkmp4sknn6Rfv3588sknNG7cmN69e9OtW7fVjyeTSQYOHMgdd9zBd999R8uWLSksLKR58+Yb9fXd7kSKq29fGDkSZs2C7bePnSazRSt2M2bAXntBYSGcd16MBJKyhcVOimfOHNhtN+jTJ+yOofIVZSoWoFkzOOWUMC27dGmsFJIkqTxdey1UqwaXXBI7SXaIVuwgbHvy1VfhaBFJkpRZPv8cRo+Gyy6DvLzYabJD1GK3225w5pnhIGCPfJQkKbMMHAjbbQcXXBA7SfaIWuwA+vcPO1EPGxY7iSRJKisffABjx8Jf/gI1a8ZOkz2iF7uGDcPiiZtugm+/jZ1GkiSVhauuChsRr7HAXRUgerGDcLTI8uXh/DhJkpTe3nwTHnwwlLucnNhpsktKFLu6daFnT7j1VtjAmd6StMkKCwvJz8+noKAgdhQpq/zlL9C0KZx+euwk2SfaPnY/99130LgxdOkCt9wSO42kTOI+dlLFmTwZWreG8ePhpJNip8k+KTFiB7DttmHzwttvh/+d/S1JktJIMglXXgn77AOdOsVOk51SpthBmI7NzXVnakmS0tG//w0TJ8I110CllGoY2SNlpmJXGTYs7E793nuw556x00jKBE7FSuUvmYSWLaFy5TAdm0jETpSdUq5Pn3de2ALlyitjJ5EkSRvroYdg2jQYPNhSF1PKFbucnDCE+8gjMGVK7DSSJOnX/PgjXHEFHHMMtGkTO012S7liB9C5M+y1F1x+eRjalSRJqeuuu2DmzDBap7hSsthVrhzOj33pJZgwIXYaSZK0IYsXhzNhO3cOq2EVV0oWOwjDuYcdFkbtVqyInUaSJK3PLbfAN9+Ey6gUX8oWu0QCrr8e3n0Xxo2LnUaSJP3cggXh3+rzzguHDCi+lC12AK1aQYcO0L8/lJbGTiNJktY0aBCsXOlOFqkkpYsdwLXXQlERjBwZO4kkSVpl9mwYPhwuvRTq1ImdRqukfLHbc08444xQ8EpKYqeRlE4KCwvJz8+noKAgdhQp41x1FWyzDfTuHTuJ1pRyJ0+szxdfQJMm4V2Bx41J2lSePCGVrffeg733hltvhQsuiJ1Ga0r5ETuAHXeEiy6CIUNg3rzYaSRJym5XXBEWS5xzTuwk+rm0KHYQtj2pWtXl1JIkxfTf/8ITT8Df/hb+XVZqSYup2FVuuCGsvPngA9htt9hpJKULp2KlspFMwiGHwNKl8PrrUClthoeyR1q9JBdeCHXrwl/+EjuJJEnZ57HHYPLkcHSYpS41pdXLUr16OLbkgQdg2rTYaSRJyh4//gh9+0LbtnDUUbHTaEPSqtgBdO0KzZtDnz5hSFiSJJW/UaNg5ky48cbYSfRL0q7YVa4c/lC99BI8/njsNJIkZb7iYhgwALp0gX32iZ1GvyTtih2EIeC2bcOQ8I8/xk4jSVJmu/56WLzYnSnSQVoWu0QijNp98kkYGpYkSeWjqAhuvjmcMLHjjrHT6Nek1XYnP3fWWWE6duZMyMuLnUZSqnK7E2nzde0KTz8d/q31xyf1peWI3SpXXw1LlsB118VOIklS5nnrLRg7NuxIYalLD2ld7H7zm7A69uabYfbs2GkkpZrCwkLy8/MpKCiIHUVKO8lkOKO9aVM4++zYabSx0noqFmDRonAKRdu2cO+9sdNISkVOxUqb7pln4JhjwqbEf/xj7DTaWGlf7ABGjw4HEU+bBi1axE4jKdVY7KRNs2IF7LsvbLcdTJwYFi0qPaT1VOwqZ5wBzZq5abEkSWXh7rvhvffgppssdekmI4pdlSph+5NJk+CJJ2KnkSQpfS1cCFdeCX/+M3h5avrJiGIHcPTRcOSRblosSdKWuO66cNKEO06kp4wpdqs2Lf7443DNnSRJ2jSffw5DhoTVsDvtFDuNNkdGLJ5Y0xlnwJNPhlMpttkmdhpJqcDFE9LGOekkePnlMEiy9dax02hzZMyI3SrXXgtLl3qenSRJm+KVV+Cf/4TBgy116SzjRuwglLsBA2DGjLCxoqTs5oid9MtWroSWLcPOEq+9BpUybtgne2TkS9e790+nUkiSpF/2j3/A66+Hk5wsdektI1++6tXhhhvC1ifPPx87jSRJqWvxYrj8cujUCQ49NHYabamMLHYQ/oAecghcfDEsXx47jSRJqemGG2DBArj++thJVBYyttglEjBsGLz/vtufSJK0PkVFYauw3r2hcePYaVQWMrbYARxwAHTpAv37w3ffxU4jqaIVFhaSn59PgdvnS+vVrx/k5oaPygwZuSp2TXPmhJWx55wDQ4fGTiMpBlfFSut69VVo1Qr+/nc466zYaVRWMr7YAQwaBFddFQ403n332GkkVTSLnbS2ZBIOPhh++CGshq1cOXYilZWMnopd5eKL3f5EkqRV7r8fpk4N25tY6jJLVhS76tXDxaFPPgnPPBM7jSRJ8SxaFM6C7dgR2rSJnUZlLSuKHcCJJ4Y/wD17wrJlsdNIkhTHoEHw7bcwZEjsJCoPWVPsEgm49Vb49NOwDYokSdlm5sxQ6C67DHbeOXYalYesWDyxpp494a674MMPw3V3kjKfiyekoH17eOcd+OADqFEjdhqVh6wZsVtl4MBwzV3fvrGTSAIYMGAAiURirVu9evVWP961a9d1Hm/VqlXExFJ6evrpcK35kCGWukxWJXaAirbNNnDddWHPnnPP9Vw8KRU0a9aMF154YfWvK/9smd7RRx/NmDFjVv+6atWqFZZNygTLlkGvXvDb38IJJ8ROo/KUdcUOoGtXuOMOuOACmD4dqmTld0FKHVWqVFlrlO7ncnJyfvFxSb9s2DD47DN4+OFwzbkyV9ZNxQJUqgS33RauM7jjjthpJH3yySc0aNCAxo0bc/LJJ/PZZ5+t9fjEiROpU6cOTZs2pVu3bsyfPz9SUin9zJkD11wDPXpA8+ax06i8Zd3iiTWdfXZ49/Lxx7D99rHTSNlpwoQJLFmyhKZNm/LVV1/xt7/9jQ8//JAZM2ZQu3ZtHnjgAbbeemsaNWrErFmz6N+/P8uXL2f69Onk5OSs92uWlpZSWlq6+tclJSU0bNjQxRPKSqefDhMmhH/rtt02dhqVt6wudvPnh3NkTzrJkTspVSxevJhdd92Vvn370rt373Uenzt3Lo0aNWL8+PF07NhxvV9jwIABDBw4cJ37LXbKNpMnQ+vWMGoUdOsWO40qQlZOxa5Spw5cfTWMHh3OypMUX82aNdlrr7345JNP1vt4/fr1adSo0QYfB+jXrx/FxcWrb0VFReUVV0pZy5fDeefBAQfAmWfGTqOKktXFDuD886FZM7jwQli5MnYaSaWlpXzwwQfUr19/vY8vWLCAoqKiDT4OYbFFbm7uWjcp2xQWwrvvwsiRngebTbK+2FWpAsOHh8OQx46NnUbKPn369GHSpEnMmjWLV199lRNPPJGSkhK6dOnCokWL6NOnD1OmTOHzzz9n4sSJtG/fnu23354OHTrEji6lrLlzoX9/6N4dCgpip1FFyvpiB3D44XDyyeGIleLi2Gmk7PLFF1/w5z//md13352OHTtStWpVpk6dSqNGjahcuTLvvvsuxx13HE2bNqVLly40bdqUKVOmUKtWrdjRpZTVpw/k5MC118ZOooqW1Ysn1vTFF7D77uHiUs+SlTKLR4opm7z4YtiI+K674IwzYqdRRbPYreH66+GKK8KmxfvuGzuNpLJisVO2WLYs/Pu17bbw8sth31ZlF1/yNVx8MeyxR1hF5EIKSVK6GTYMPvoIRoyw1GUrX/Y1VK0aVg9NnQp//3vsNJIkbbyiIhg4EC66CPbZJ3YaxeJU7HqccQY89hh8+GHY605SenMqVtnghBNgypTwb5d/zLOXI3brccMN4eOll8bNIUnSxnjmmXBE5pAhlrpsZ7Fbjx12CAspxo6FSZNip5EkacN++AEuuACOOCJs3aXsZrHbgLPOgoMOCgspli2LnUaSpPW74QaYPTucNJFIxE6j2Cx2G1CpUlhI8fHHMHRo7DSSNkdhYSH5+fkUuPW+MtRnn8HgwXDJJbDnnrHTKBW4eOJXXHJJKHjvvw877xw7jaTN4eIJZaJkEv7wh3Ae7AcfQM2asRMpFThi9ysGDIDttoMLLww/RJIkpYIHH4Snnw7nnVvqtIrF7lfUqgW33AJPPhm2QJEkKbbvv4eePaFDB/jjH2OnUSqx2G2Ejh3hmGPCpo+LFsVOI0nKdv36weLFcNttsZMo1VjsNkIiEYa6v/4arr46dhpJUjabPBluvx2uvRZ+85vYaZRqXDyxCQYNgr/+FV5/PRyyLCk9uHhCmeLHH2H//aF69XDKROXKsRMp1Thitwn69AnLybt1gxUrYqeRJGWbm24KK2BHjbLUaf0sdpugalUYPRqmT4dbb42dRpKUTT79NFwOdPHFzhppw5yK3QwXXgh33QUzZri3nZQOnIpVuksm4aijwqb5M2a4vYk2zBG7zTBoUNjb7rzz3NtOklT+xo2D55+HESMsdfplFrvNUKtW+OF65hkYPz52GklSJluwIEy/duoEv/997DRKdRa7zdS+ffgh69kz/NBJklQeevcOq2FvuSV2EqUDi90WuOUWWLYsrJaVlHoKCwvJz8+noKAgdhRpszzzDIwdC0OHQv36sdMoHbh4YguNHg3nnAMvvAC/+13sNJLWx8UTSkcLF0Lz5tC0KTz3XNgsX/o1jthtobPOgsMOg+7dYcmS2GkkSZniiivgm2/CnnWWOm0si90WqlQp/NB98UU4lUKSpC313/9CYWHYhaFx49hplE6cii0jN9wQDmV+5RVo1Sp2GklrcipW6eSHH8IGxNtuGwqeJ0xoUzhiV0Z694YDDoAzzgg/lJIkbY5rroFZs+DOOy112nQWuzJSpQqMGfPTkS+SJG2qt96C66+Hv/wF8vNjp1E6ciq2jP3tbzBgALz6ahjBkxSfU7FKB8uXw4EHho+vvx7OJ5c2lSN2Zeyyy2CvvcKU7LJlsdNIktLFkCHw9tthCtZSp81lsStjW20VpmQ/+CCsZpIk6dd89BFcdVW4Xtv9tLUlnIotJ3/9KwweDNOnw957x04jZTenYpXKVqyA1q3h22/DNXY1asROpHTmiF05ufJK2H33MCX744+x00iSUtWQIfDaa3D33ZY6bTmLXTnJyQlTsm+9BTfdFDuNJCkVvf8+9O8Pl1wCBx8cO40ygVOx5eyyy2DYMHjzTZeuSxWtsLCQwsJCVqxYwccff+xUrFLK8uVw0EGwaBG88QZUrx47kTKBxa6cLV0K++0H22wTTqVws0mp4nmNnVLRtdeG67EnT4aWLWOnUaZwKracVa8Od90Vrp+48cbYaSRJqeCdd2DgwDCrY6lTWXLEroJcdhncfHPYdNJVslLFcsROqeTHH8NGxD/+GHZOyMmJnUiZxBG7CnL11WGV7GmnQWlp7DSSpFgGDYJ334V77rHUqexZ7CpITg7ce2/YuHjgwNhpJEkxvPlmOHryiis8dlLlw6nYCjZoUFja/vLLLm2XKopTsUoFy5ZBixaQSMC0aR4bpvLhiF0F69s3XFtx+umweHHsNJKkijJwYJi1ueceS53Kj8WuglWpAmPHwty5oeRJkjLfK6/AddeF82D33Td2GmUyp2IjGTECevSAZ56Bo46KnUbKbE7FKqaFC0OZq1sXXnopvMGXyosjdpGcdx60bQtnngnffRc7jSSpvFx8MXz1VVhAZ6lTebPYRZJIhI2LFy+GCy+MnUaSVB4efRTuvDMcLbnrrrHTKBtY7CLacUcoLIR//AMefDB2GklSWZo3D7p1gz/+Ec46K3YaZQuLXWSdO8MJJ4Sp2TlzYqeRMkthYSH5+fkUFBTEjqIsk0zC2WdDpUowenSYpZEqgosnUsA334Rjxpo1g2efDX8RSCo7Lp5QRbvjDjj3XHjiCfjDH2KnUTaxQqSA7bcP+xq98EI4T1aSlL4++QR694ZzzrHUqeI5YpdC+vSBW2+FV1+F/faLnUbKHI7YqaIsXw6HHAILFoTjw7beOnYiZRtH7FLItdeG6djOnWHJkthpJEmb6ppr4PXXw9YmljrFYLFLITk5cP/98H//F4bxJUnp46WX4G9/g7/+FVq1ip1G2cqp2BS06qLbRx6B44+PnUZKf07Fqrx9+y3ssw/ssgv85z9QuXLsRMpWjtiloHPOgeOOC0vl3QJFklJbMhn2q1u8GO67z1KnuCx2KSiRgL//HapWhS5dYOXK2IkkSRsyahQ8/HD4e7thw9hplO0sdinKLVCULQYMGEAikVjrVq9evdWPJ5NJBgwYQIMGDahevTpt2rRhxowZERNLP5kxA3r1gu7doWPH2Gkki11Ka9sWLrkE+vWDN96InUYqP82aNWPu3Lmrb+++++7qx2644QaGDh3K8OHDmTZtGvXq1aNt27YsXLgwYmIJfvgB/vzncF3d0KGx00iBxS7FXXst7LUXnHQSlJTETiOVjypVqlCvXr3Vtx122AEIo3XDhg3jyiuvpGPHjjRv3px77rmHJUuWMG7cuMiple0uvRQ+/hjGj4caNWKnkQKLXYrLyYEHHoCvvgpD/a5hVib65JNPaNCgAY0bN+bkk0/ms88+A2DWrFnMmzePdu3arf7cnJwcDj/8cCZPnrzBr1daWkpJSclaN6ksPf44DB8ON90U3nxLqcJilwZ22y0cIj1+fPgoZZKWLVsyduxYnn32WUaPHs28efM4+OCDWbBgAfPmzQOgbt26a/2eunXrrn5sfQYPHkxeXt7qW0OvaFcZ+vJLOPNMaN8eevSInUZam/vYpZFzzw0LKl59FfbeO3YaqXwsXryYXXfdlb59+9KqVStat27NnDlzqF+//urP6datG0VFRTzzzDPr/RqlpaWUlpau/nVJSQkNGzZ0HzttseXL4Xe/g5kz4e23w0I3KZU4YpdGbr4ZmjaFP/0JFi2KnUYqHzVr1mSvvfbik08+Wb069uejc/Pnz19nFG9NOTk55ObmrnWTysJVV8Err4QZFEudUpHFLo1Urw7//Cd88QWcf77X2ykzlZaW8sEHH1C/fn0aN25MvXr1eP7551c/vmzZMiZNmsTBBx8cMaWy0TPPwKBB4diwQw+NnUZaP4tdmtl993Dk2L33wt13x04jbbk+ffowadIkZs2axauvvsqJJ55ISUkJXbp0IZFI0KtXLwYNGsQjjzzCe++9R9euXalRowadO3eOHV1Z5Isv4LTT4JhjoG/f2GmkDasSO4A23SmnhLMIe/SAAw+EZs1iJ5I23xdffMGf//xnvvnmG3bYYQdatWrF1KlTadSoEQB9+/Zl6dKlnH/++Xz33Xe0bNmS5557jlq1akVOrmyxfHnYr65aNRg7Fio5JKIU5uKJNLVkSSh1ySS89hrUrBk7kZS6SkpKyMvLc/GENku/fnDjjTBpErRuHTuN9Mt835GmatQI19t9/jlceGHsNJKUmZ5+Gq67LlxbZ6lTOrDYpbH8fCgshDFjwjYokqSyU1QEp58Oxx4LffrETiNtHItdmuvaNdzOPTfsqSRJ2nLLlsHJJ4fZkXvu8bo6pQ//qGaAESNgjz2gY0f47rvYaSQp/V1yCUybFi55qV07dhpp41nsMkD16vDQQ/Dtt2HaYOXK2IkkKX3dd184B/aWW6BVq9hppE1jscsQu+wS/jJ68kkYPDh2GklKT++8A+ecA126hEtcpHRjscsgxx4Lf/0r9O8Pzz0XO40UX2FhIfn5+RQUFMSOojTw/ffhkpbdd4eRIyGRiJ1I2nTuY5dhVqwIBe/112H6dPjfHq9SVnMfO/2alSvhuOPCObCvvx5mQaR05IhdhqlcGf7xD9h6a+jUCUpLYyeSpNQ3aBA89VT4+9NSp3RmsctAtWvDv/4VrhXp2TN2GklKbc88Ey5jueqqcBaslM4sdhmqRYuwquuOO+Dvf4+dRpJS06xZ0LlzKHT9+8dOI225KrEDqPycfXa4VuT888MpFQcfHDuRJKWOJUvghBNg223DrgJuQqxM4B/jDHfrrWEfpo4d4YsvYqeRpNSQTMJZZ8FHH8HDD4dyJ2UCi12Gq1o1XG9XtSocfzwsXRo7kSTFd/31MH483H037LNP7DRS2bHYZYE6deDRR+H996Fbt/BOVZKy1VNPwRVXwF/+EnYPkDKJxS5L7L8/jBkTlvIPGRI7jSTF8eGHYbFE+/YwcGDsNFLZc/FEFjnpJHj7bbjsMmjeHI4+OnYiSao4338fNiHecUe4914XSygz+cc6y1xzTVjWf/LJ8PHHsdNIUsVYsQL+/GeYPx8eeww8gESZymKXZVadTFG/fnjnWlwcO5Eklb9+/cIZ2g88ALvtFjuNVH4sdlkoLy+8Y507F045JbyTlTJRYWEh+fn5FBQUxI6iiO66C268EW66Cdq1i51GKl+JZNI1ktnqmWfg2GPhoovg5ptjp5HKT0lJCXl5eRQXF5PrHFxWefHFUObOPBNuvx0SidiJpPLliF0WO/rosIHxsGEwYkTsNJJUtj76KJws0aZNOGLRUqds4KrYLNejB3zyCVx4ITRu7AHYkjLDggVhRqJePXjwQdhqq9iJpIphsRNDhsBnn8Gf/gSvvAJ77x07kSRtvtJS6NAhLA579VXYZpvYiaSK41SsqFwZxo2DJk3gD38IiyokKR0lk3DOOaHQPfoo7LJL7ERSxbLYCYCtt4YnnggrZP/4R1i8OHYiSdp0gwfD2LHhpJ3WrWOnkSqexU6r/eY38OST8MEHcNppsHJl7ESStPEefBCuvBKuuiocGyZlI4ud1rLffnD//WGfu8svj51GkjbO1Klw+unhdImrroqdRorHYqd1tG8PQ4eGDT1HjYqdRpJ+2ccfh+uDDzggbEbstibKZq6K1XpddBHMnAnnnReOH2vfPnYiSVrXvHlhT846deDxx6FatdiJpLgcsdN6JRJh4+Ljj4eTToIpU2InkqS1LVwY9qr74QeYMAG22y52Iik+i502qHJl+Mc/oKAgTHN8+GHsRJIU/PgjdOoUNlifMAEaNYqdSEoNFjv9omrVwkKKBg3gqKNgzpzYiSRlu2QSunWD//wHHnkE9tkndiIpdVjs9Ku22Sa8I165Mhw5VlwcO5G0cQoLC8nPz6egoCB2FJWh/v3hnnvCXnW/+13sNFJqSSSTyWTsEEoP778PhxwS3h0/8wzk5MROJG2ckpIS8vLyKC4uJjc3N3YcbYGRI+H88+GGG+DSS2OnkVKPI3baaPn54XSKqVPdwFhSxRs/Hnr0CKv2+/SJnUZKTRY7bZLWrcMGxg89BBdeGK51kaTy9vTT4Q3lqafCzTe7V520IRY7bbLjj4c77oARI8K1LpJUnl5+GU48EX7/e7jzTqjkv1zSBrlBsTbL2WfD99+Ha1zy8rzWRVL5ePPNsN1Sq1bwwAOw1VaxE0mpzWKnzdanTyh3ffuGlbPdusVOJCmTfPxx2GapadOw7ZKnSki/zmKnLXLNNaHcde8OubnhlApJ2lJFRdC2LeywQ9huqVat2Imk9GCx0xZJJODWW8PedqeeGv7y/f3vY6eSlM6+/jqUukQCnnsOtt8+diIpfXgJqrZYpUpho9Bjj4UTToAXX4ydSFK6+u67MP36/ffwwgvwm9/ETiSlF4udykSVKmGPqUMOCRc6v/xy7ESS0k1xMbRrB7Nnw/PPw267xU4kpR+LncrMqnNlW7YMR4+98krsRJLSxcKFcPTR8OmnYaRur71iJ5LSk8VOZapGjXA6xQEHhHI3dWrsRJJS3aJF4drcDz4I19Ttu2/sRFL6stipzNWsCU89BXvvHa6VmTYtdiJlq8LCQvLz8ykoKIgdRRuwZAm0bw9vvw3PPgstWsROJKW3RDLpoVAqHwsXhmL3wQdhauWAA2InUrYqKSkhLy+P4uJicnNzY8fR//zwQyh1U6bAM8+Ea3QlbRlH7FRuatUK+081bRq2LnjrrdiJJKWKH36ADh3CtbhPPmmpk8qKxU7lKi8vTK/suisceSS8807sRJJiW7IE/vhHmDQJHn8c2rSJnUjKHBY7lbtttgkXRO+0E/z2t+HsR0nZadGisOfl5Mnw9NPhDZ+ksmOxU4XYdttwnd0uu8ARR7haVspGCxeG1fKvvx6uqXOkTip7FjtVmO22+2l/qrZtwzSMpOywavPhd94Jmw97TZ1UPix2qlC5ueGd+qpNjJ99NnYiSeXtu+/ClOuHH8K//w2tWsVOJGUui50qXM2aYRXcb38bLqB+7LHYiZQqBg8eTCKRoFevXqvv69q1K4lEYq1bK5tB2vjqq3D5xaxZ8J//uE+dVN4sdoqiWjV4+OFQ7E48ER54IHYixTZt2jRGjRrF3nvvvc5jRx99NHPnzl19e/rppyMk1Kb6/PMw5Tp/PkycCPvtFzuRlPksdoqmalW4/344+WTo3Bnuvjt2IsWyaNEiTjnlFEaPHs222267zuM5OTnUq1dv9W277baLkFKb4v33Q6lbuTLsVde8eexEUnaw2CmqKlXgnnvg7LPhjDNgyJDYiRRDjx49OPbYYzlyA3tfTJw4kTp16tC0aVO6devG/PnzKzihNsVrr8Ghh4YFU//9LzRuHDuRlD2qxA4gVaoEt98OtWtDnz5h2ua66yCRiJ1MFWH8+PG88cYbTNvAocLHHHMMnTp1olGjRsyaNYv+/fvz29/+lunTp5OTk7Pe31NaWkppaenqX5eUlJRLdq3rP/+B444Lq9+feipsdSSp4ljslBISCRg0COrUgYsvhq+/hlGjwoieMldRURE9e/bkueeeo1q1auv9nJNOOmn1fzdv3pwWLVrQqFEjnnrqKTp27Lje3zN48GAGDhxYLpm1YY8+CiedFBZLPPRQWCglqWIlkslkMnYIaU3/+Ad07Qq//z2MHw/Vq8dOpPLy6KOP0qFDBypXrrz6vhUrVpBIJKhUqRKlpaVrPbZKkyZNOPvss7nsssvW+3XXN2LXsGFDiouLyc3NLfv/EXHXXdCtW1gMde+94RpaSRXP8RClnFNOCdOyJ5wARx0VtkNxOicz/e53v+Pdd99d674zzjiDPfbYg8suu2y9pW7BggUUFRVRv379DX7dnJycDU7TqmwlkzBgAFx9NZx7LgwfDut52SRVEIudUtLRR4eNTI89Flq3DmdK7rxz7FQqa7Vq1aL5z5ZL1qxZk9q1a9O8eXMWLVrEgAEDOOGEE6hfvz6ff/45V1xxBdtvvz0dOnSIlFqrLFsG55wTFkANHgyXXea1sVJsropVymrVCqZMgdLS8N+vvx47kSpa5cqVeffddznuuONo2rQpXbp0oWnTpkyZMoVatWrFjpfViovDG69x48LlE5dfbqmTUoHX2Cnlff112Mj4nXfCNXft28dOpHRTUlJCXl6e19iVkS++CNfAFhXBI49AmzaxE0laxRE7pbwddghbKBx1FBx/PBQWxk4kZa+33w4j6MXFYeNhS52UWix2SgvVq8ODD8JFF8EFF8All8CKFbFTSdnluefCxsN16sDUqZCfHzuRpJ+z2CltVK4MN98Mt9wCw4aFTVDdd1Yqf8kk3HZbmH495BB46SX4hUXJkiKy2CntXHRR2NH+v/8NU0IzZ8ZOJGWuZcvCNiYXXQQ9e8ITT8DWW8dOJWlDLHZKS0cfDa++CsuXQ8uW4Ro8SWXrm2+gXTsYMyZsQDxkiHvUSanOYqe0tfvuodztv3/4x2fEiNiJpMwxYwYceCC8/35443TGGbETSdoYFjultW23hQkToEePcDvvPPjxx9ippPT2yCNw0EFhyvW118J1dZLSg8VOaa9KlbCgYvRouPPOcAD5l1/GTqVUUFhYSH5+PgUFBbGjpIUVK6BfP+jYMYyCT57siS9SunGDYmWUKVOgU6cwajd+fCh5khsU/7pvvoHOncNRftddB336eJKElI4csVNGOeggeOMNaN4cjjwSrr8+bNUgacOmT4cDDoA334Tnn4dLL7XUSenKYqeMU6dO2Ej18svDrWPHsEu+pLUlk/D3v0Pr1lC3bih4v/1t7FSStoTFThmpcmW49lp4/HF48UVo0SKcNSspWLgQTj0VunWDLl3CpsM77RQ7laQtZbFTRmvfPoxCbL112O9u1CinZqW33gpTr48/DvffD3fcAdWqxU4lqSxY7JTxdt01rO47/XTo3h1OOgm+/z52KqniJZNhv8dWrcKbnTfegJNPjp1KUlmy2CkrVK8eRiUefDBcHL7vvqHsSdni22/hT38K+z2efXb489+kSexUksqaxU5Z5cQTwzTUb34Dhx0WrsNbsSJ2Kql8vfAC7LVX+PjggzB8uFOvUqay2CnrNGoEkyaFjVj79w973c2aFTuVVPaWLoVevaBtW9hzT3j33fDmRlLmstgpK1WpAtdcAxMnQlER7L132PbBhRXKFG++GVaD3347DBsWtgDaccfYqSSVN4udstphh4VtUE4+OWz70L49zJsXO5W0+VasCCdHtGwJVauGVeE9e0Il/7aXsoI/6sp6tWqFc2afeAJefz2cWvHPfzp6p/Tz0Udw+OFwxRVwySXw6qvQrFnsVJIqksVO+p8//AHeey9cc3fSSeHEijlzYqfSligsLCQ/P5+CgoLYUcrVjz/C4MGwzz7w1VfhGtLBg8OInaTskkgmHZeQ1pRMwkMPwQUXwA8/wJAhcOaZnp2ZzkpKSsjLy6O4uJjc3NzYccrUG2/AWWeFhRGXXAIDBoTtfSRlJ0fspJ9JJMLKwfffhw4dwp5fRx4Jn34aO5n0k6VLw1nIBx4Y3oy8+ipcf72lTsp2FjtpA7bbDsaMgWefhc8+C/uADRoEpaWxkynb/fvfYdr15pvh6qth2rRwRJgkWeykX9GuXZjmOv98+Otfw9YoL7wQO5WyUVFROD3iyCOhXj14++2wUGKrrWInk5QqLHbSRth6a7jppnBqRf36YcPXP/0JvvgidjJlg2XLwhYme+wBL78M994bFkjssUfsZJJSjcVO2gTNm8OLL8J998FLL4V/WG+80elZlZ/nnguXAfzlL9C9e9jS5NRTXcwjaf0sdtImSiTglFPCP7Bnnx2OJsvPD2dwusZcZeXjj8PinaOOCtOub70FQ4dChi3qlVTGLHbSZsrLC0c1vfNOGLn705/gkENg6tTYyZTO5s+HHj3Cm4U33oB//CMcfde8eexkktKBxU7aQvn58NRT8PzzsHgxHHRQ2OB41qzYyZROliyBa6+F3XYLZW7w4DAq3Lmz066SNp7FTiojRx4ZzuW8665wgfsee8BFF8HcubGTKZUtXx7+zDRpAgMHhun9Tz+FSy+FatVip5OUbix2UhmqXBnOOAM++QT69w+rF3fdFfr0ga+/jp1OqWT5chg7FvbcM5wccdhh8OGH4Tq62rVjp5OUrix2UjmoWTOsYpw1K5S6UaOgceOw59i338ZOp5iWL4d77gmFrksXaNYsjPTefz/sskvsdJLSncVOKkfbbBNOBpg1Cy68EG65JRS8yy93irYiFBYWkp+fT0FBQewoLF8Od98dpui7dg2LId54Ax59FPbfP3I4SRkjkUy6QYNUUebPhyFDYOTIsPddly7hWqomTWIny2wlJSXk5eVRXFxMbgXvF7J4cSh0Q4eGo+k6dAgnmOy7b4XGkJQlHLGTKlCdOuGg9tmzw4Xyjz8Ou+8OnTrB66/HTqey9NVX4TrLnXaCnj3hwAPhzTfh4YctdZLKj8VOimCbbcJ07Oefh9G7N9+EggJo3Tpca7VsWeyE2lxvvx1Wtu60E9x8M5x+OsycGV5XC52k8maxkyKqVu2nY6L+9S/IyQn7lu20U5iu+/LL2Am1MX74IayAPvjgUN4mTAjXVhYVhXK3886xE0rKFl5jJ6WYGTNgxIiwFcbSpeGarLPPDvvkVa4cO116Kq9r7GbOhDvugDFjYMGC8Bqddx60bw9bbVVmTyNJG81iJ6WokpJQ7kaMgA8+gB13DNN6Xbu62GJTlWWx+/77cC7w2LHw3//CttuGvQu7d4emTcsmryRtLoudlOKSSXjttbCy8v77obg4nEnbuTN07Ah168ZOmPq2tNgtWwbPPBOmW594An78MYzOnXYanHACVK9eDqElaTNY7KQ0snQpPPZYKHkvvBBK3+GHh1W1lrwN25xiV1oK//43PPJI2Gvum29gn31CmevcGerXL9/MkrQ5LHZSmlqwIBSOf/4zFJBVJa9jR/j97z3FYE0bW+xKSsLCh0cegaefhoULw7R3x45wyimw114VGFqSNoPFTsoAa5a8F18MU4W77w7HHBNK3mGHhRW32WpDxW7lSnjnHXj++XCbNClMu+63X1i00rEj5OdDIhExvCRtAoudlGEWLgwjeE8/HW5ffgk1asChh4aCd9hhYc+8bCp6q4rd998X8913uUycGIrcCy+E00CqVw/fl6OPhuOPd3sSSenLYidlsGQS3nsvFLxJk8IqzoULw/55rVqFMtOqFRxwQDgVI9P88ANMnw4vvlhC//551KlTzPz5uSQS4XzWtm3D7eCDw/dEktKdxU7KIsuXh5MRXnop3F5+OUzjAjRsGApeixaw996w557QuHF67J2XTIYjvN59N0ytvvtuuL399gpWrKgMzAPq07t3MW3a5HLwwVC7duzUklT2LHZSFksmYdascE7t9Ok/fSwuDo/n5IRr9fbcM+zR1rhxmKZs3Djsq1elSsVlXbkS5s4Nx7DNmhVun38On30WNnX++uvweTVqQLNmYaHDfvvBQQfBzjuXsP32Zb9BsSSlGoudpLUkk+G6vA8+gPffDx8/+CCcsjBnztqfW7s27LBDmMZd8+M224SCteatatWfvv6qv3WSybCtyMKFsGjR2h+//z5c//bVV+HjnDlrn6G7ww4/Fc38/FDk9t57/aOM5XXyhCSlGoudpI32ww8we3YYKSsqCqNk8+eH25r/XVICixf/VOA2RiIBtWrB1luHW15e2JevTp3wsX79n4rczjuHz9lYFjtJ2aICJ1Ikpbtq1cKU7MYcnZVMhhG2JUvCrbQ0lLdVW4es+u9q1UJJq17dbUUkaUtZ7CSVi0QiXKOXkxPOU5Uklb9KsQNIkiSpbFjsJEmSMoTFTpIkKUNY7CRJkjKExU6SJClDWOwkSZIyhBsUS8p4yWSShQsXUqtWLRJulicpg1nsJEmSMoRTsZIkSRnCYidJkpQhLHaSJEkZwmInSZKUISx2kiRJGcJiJ0mSlCEsdpIkSRnCYidJkpQhLHaSJEkZwmInSZKUIapszCetOmdRkiRJcWzMedcbVewWLlxIXl5emYSSJEnSpisuLiY3N/cXPyeRTCaTv/aFNmfErqCggGnTpm3S79lSFf2cJSUlNGzYkKKiol/9Rpe1bPj+xnrOWK9rtnx/YzxvNr2msZ43W15TyI7vb6znzKaf1c15zjIbsUskEpv8Da5cuXKF/7DFeE6A3NzcrPh/zZbnXKWiX9ds+v5my89qNn1/s+U1hez5/vr3b3o+Z7ktnujRo0d5femUes5YsuX762uaec8Z83krWjZ9f7PlNYXs+f76mqbnc27UVKzWr6SkhLy8vI2a81b68HXNPL6mmcfXNDP5um45tzvZAjk5OVx11VXk5OTEjqIy5OuaeXxNM4+vaWbydd1yjthJkiRlCEfsJEmSMoTFTpIkKUNY7CRJkjKExU6SJClDWOzKQWlpKfvuuy+JRIK33nordhxtps8//5yzzjqLxo0bU716dXbddVeuuuoqli1bFjuaNsGIESNo3Lgx1apV44ADDuDll1+OHUlbYPDgwRQUFFCrVi3q1KnD8ccfz0cffRQ7lsrQ4MGDSSQS9OrVK3aUtGSxKwd9+/alQYMGsWNoC3344YesXLmSO+64gxkzZnDzzTdz++23c8UVV8SOpo30wAMP0KtXL6688krefPNNDj30UI455hhmz54dO5o206RJk+jRowdTp07l+eefZ/ny5bRr147FixfHjqYyMG3aNEaNGsXee+8dO0racruTMjZhwgR69+7NQw89RLNmzXjzzTfZd999Y8dSGbnxxhsZOXIkn332Wewo2ggtW7Zk//33Z+TIkavv23PPPTn++OMZPHhwxGQqK19//TV16tRh0qRJHHbYYbHjaAssWrSI/fffnxEjRvC3v/2Nfffdl2HDhsWOlXYcsStDX331Fd26dePee++lRo0aseOoHBQXF7PddtvFjqGNsGzZMqZPn067du3Wur9du3ZMnjw5UiqVteLiYgB/LjNAjx49OPbYYznyyCNjR0lrVWIHyBTJZJKuXbty7rnn0qJFCz7//PPYkVTGPv30U2677TaGDBkSO4o2wjfffMOKFSuoW7fuWvfXrVuXefPmRUqlspRMJunduzeHHHIIzZs3jx1HW2D8+PG88cYbTJs2LXaUtOeI3a8YMGAAiUTiF2+vv/46t912GyUlJfTr1y92ZP2KjX1N1zRnzhyOPvpoOnXqxNlnnx0puTZHIpFY69fJZHKd+5SeLrjgAt555x3uv//+2FG0BYqKiujZsyf33Xcf1apVix0n7XmN3a/45ptv+Oabb37xc3beeWdOPvlknnjiibX+wVixYgWVK1fmlFNO4Z577invqNpIG/uarvoLZs6cORxxxBG0bNmSu+++m0qVfD+UDpYtW0aNGjV48MEH6dChw+r7e/bsyVtvvcWkSZMiptOWuvDCC3n00Ud56aWXaNy4cew42gKPPvooHTp0oHLlyqvvW7FiBYlEgkqVKlFaWrrWY/plFrsyMnv2bEpKSlb/es6cORx11FH861//omXLluy4444R02lzffnllxxxxBEccMAB3Hffff7lkmZatmzJAQccwIgRI1bfl5+fz3HHHefiiTSVTCa58MILeeSRR5g4cSJNmjSJHUlbaOHChfzf//3fWvedccYZ7LHHHlx22WVOs28ir7ErIzvttNNav956660B2HXXXS11aWrOnDm0adOGnXbaiZtuuomvv/569WP16tWLmEwbq3fv3px22mm0aNGCgw46iFGjRjF79mzOPffc2NG0mXr06MG4ceN47LHHqFWr1urrJfPy8qhevXrkdNoctWrVWqe81axZk9q1a1vqNoPFTtqA5557jpkzZzJz5sx1yrkD3enhpJNOYsGCBVx99dXMnTuX5s2b8/TTT9OoUaPY0bSZVm1d06ZNm7XuHzNmDF27dq34QFKKcSpWkiQpQ3gVuCRJUoaw2EmSJGUIi50kSVKGsNhJkiRlCIudJElShrDYSZIkZQiLnSRJUoaw2EmSJGUIi50kSVKGsNhJkiRlCIudJElShrDYSZIkZYj/B9WgTT7j1bYAAAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"Graphics object consisting of 1 graphics primitive"
|
|
]
|
|
},
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"f(n) = n^2 + n + 41\n",
|
|
"plot(f, (-5, 5))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "af51cf45",
|
|
"metadata": {},
|
|
"source": [
|
|
"This quadratic is symmetric across $x=-0.5$. Because of this, $f(-1) = f(0)$, $f(-2) = f(1)$, and so on; in general, $f(n) = f(-1-n)$. However, since the axis of symmetry is just to the left of the $y$-axis, when we iterate through $n=0,1,2,\\ldots$, we only output values on one side of the axis, so we don't output any duplicated values.\n",
|
|
"\n",
|
|
"But when we transform this function by shifting it $k$ units to the right, $f(n - k)$, we cause the part of the function that's left of the axis of symmetry to *also* be output when we iterate through $n=0,1,2,\\ldots$. Since these values are all equal to values we were already outputting, they'll also be prime, but they won't be *new* primes. Since $f$ outputs primes from $n=0$ to $39$ (40 distinct values), we can shift it up to 40 units to the right and have every value from $n=0$ to $79$ be prime.\n",
|
|
"\n",
|
|
"Because of the symmetry of $f$, the transformation $f(u-n)$ is actually the *same* as shifting $f$ to the right $u+1$ units (this can be shown algebraically); then, after outputting the primes in reverse, the vertex is reached and the function starts increasing again, repeating the primes that were already output.\n",
|
|
"\n",
|
|
"## Relevant sequences\n",
|
|
"* Primes generated by Euler's formula: [A005846](https://oeis.org/A005846)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "SageMath 9.5",
|
|
"language": "sage",
|
|
"name": "sagemath"
|
|
},
|
|
"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.11.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|