Skip to content

Instantly share code, notes, and snippets.

@CodingBobby
Created August 20, 2022 19:57
Show Gist options
  • Save CodingBobby/45bb2b9a5c44cd71b9cc0f7cf7b101b7 to your computer and use it in GitHub Desktop.
Save CodingBobby/45bb2b9a5c44cd71b9cc0f7cf7b101b7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%run ./../setup.py\n",
"import time\n",
"from IPython.display import display, clear_output"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from decimal import Decimal\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"randsign = lambda : (-1)**random.randint(0,1) # returns -1 or 1 randomly\n",
"\n",
"countdigits = lambda n : 1 if Decimal(n) == Decimal(0) else int(abs(Decimal(n)).log10())+1\n",
"\n",
"def truncate(f, n):\n",
" s = '{}'.format(f)\n",
" if 'e' in s or 'E' in s:\n",
" return '{0:.{1}f}'.format(f, n)\n",
" i, p, d = s.partition('.')\n",
" return float('.'.join([i, (d+'0'*n)[:n]]))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def randfibonacci(n, on_new, res_arr, phi_arr, digits_arr, log_arr): \n",
" if len(res_arr) >= 2:\n",
" curr = Decimal(res_arr[-1])\n",
" prev = Decimal(res_arr[-2])\n",
" \n",
" else: # should not be necessary\n",
" curr = Decimal(1)\n",
" prev = Decimal(1)\n",
" res_arr.append(1, 1)\n",
" \n",
" \n",
" for i in range(len(res_arr), len(res_arr)+int(n)):\n",
" temp = curr + randsign()*prev\n",
" prev = curr\n",
" curr = temp\n",
" on_new(curr, i+1, res_arr, phi_arr, digits_arr, log_arr)\n",
" \n",
" return"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def newfibaction(F, nth, res_arr, phi_arr, digits_arr, log_arr):\n",
" phi = abs(F)**Decimal(1/nth)\n",
" digits = countdigits(F)\n",
" log = abs(F).log10() + 1\n",
" \n",
" res_arr.append(F)\n",
" phi_arr.append(phi)\n",
" digits_arr.append(digits)\n",
" log_arr.append(log)\n",
" \n",
" clear_output(wait=True)\n",
" display('@'+str(int(time.time()-start))\n",
" + 'sec found '+str(nth)\n",
" + 'th random Fibonacci number. Digits: '\n",
" + str(digits)\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"data = pd.read_csv('randomFib_1M.csv', sep=';', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"restored 1000000 Fibonacci numbers\n"
]
}
],
"source": [
"result = [Decimal(F) for F in data['F'].tolist()]\n",
"phis = [Decimal(phi) for phi in data['phi'].tolist()]\n",
"log = [Decimal(log) for log in data['log'].tolist()]\n",
"digits = [Decimal(d) for d in data['digits'].tolist()]\n",
"print('restored {} Fibonacci numbers'.format(len(result)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'@570sec found 1287232th random Fibonacci number. Digits: 69367'"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"start = time.time()\n",
"randfibonacci(50e6-len(result), newfibaction, result, phis, digits, log)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"13685790"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(result)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"fibData = pd.DataFrame({\n",
" 'F': result,\n",
" 'phi': phis,\n",
" 'log': log,\n",
" 'digits': digits\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"fibData.to_csv('randomFib_13M.csv', sep=';', encoding='utf-8')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"logP = np.arange(len(phis))*phis[-1].log10() + 1"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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TZuqr6+vtmjRQhcsWKBvvPGGvvHGG6qqeuzYMW3RooXWrl1b69atqy1atNDz58/rzp07tUePHtqtWzft0qWLzpw509Wnw+HQdu3aaffu3bV79+6ua5mZmfrQQw9pu3bttGvXrhoZGamqqunp6TplyhS98sortVOnTvr444+rqurx48e1V69e2q1bN+3cubM+8sgjrkr/S5cu6fjx47VLly569dVX6zfffKOqqosXL9bOnTtr9+7d9eqrr9YVK1YU+lkL66sgZVkdYAcImXydO3eO4OBgRo8ezfvvv5/vPa+//joPP/wwfn5+pKamVnCExhh327t3b64COFM55PffrbgHCNl0gMnX/v37AQr95f7jjz8CWRW3VT2ZNMaYqsiSAJOvffv2AYUnATt27HD9OeeuWcYYYyoHSwJMvooaCUhPT2fXrl2u9a42HWCMMZWPJQEmX84koKDK/wMHDnDp0iW6detW6H3GGGO8V4UnASKyUEROiki+CyVFZKSI/CQiO0Rkm4hcn+NaRnb7DhFZWXFRVz9FTQc419aGhoYClgQYY0xl5IkdAxcBrwKLC7j+DbBSVVVErgLeB67Mvpasqj3KP8TqLSMjg6ioKKDgJOD48eMAri03LQkwxpjKp8JHAlT1W+BMIdcT9ddS8yDAys4r2OHDh12//IubBFhNgDHGHV555RU6derE+PHjWblyJbNnzy72s4cPH+bdd98t8HpYWBj16tVj2LBhudonT55M9+7dueqqqwgPDycxMdF17f3336dz58506dKFcePGudoLOmp40KBBhIaGuo4PPnnyJACPP/64q61jx47Uq1fP1ddTTz1F165d6dq1K8uXL3e1x8TE0KdPHzp06MCYMWPK5+/Z4mwm4O4foA3wcyHX7wD2kZUs9MvRng5sA7YAtxfy/JTs+7a1atWq0E0WTF6rV69WQFu2bKkdO3bM956pU6dqrVq1dPHixQrowYMHKzhKY4y7ecNmQaGhoRodHV3oPc4Nei63fv16ve222wp87uuvv9aVK1fmucd5PLCq6uOPP67//Oc/VVX1wIED2qNHDz1z5oyq/nqkb2FHDQ8cONC16VBBXnnlFZ00aZKqZv19e+ONN2paWpomJiZqz549XfGMHj3adVTx/fff7zoC+XJV7ihhVV0BrBCRAcAs4MbsS61U9RcRaQesE5FdqppnX1tV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NqNGjeKUU07pcX0iUtj82a2la3OBk7torweup201wmSOdc5Ncs5N9rqwfMpmOEAhgITVAKEtVC1YsIADDzww4fgBBxzQ5fPceOPO3HnIIYcAcM455/S4rqOPPjqj8y+77LIu20eOHMncuXOprKyMTTR8+eWXe1yfiBS2nIcA59wbtL3Rp2qvcc4tBJpzV1X+ZTMcUFVVRXFxcbfj0X1ZxxCQyttvv53WeSNHjozd33/HHXdQV1fHuHHjuOeeVNk0ufLy8tjujqlcf/31SY+3trZyyy23YGYsWLCAu+66K+Vz3H///dqjQEQylo+egGw44FUz+7uZXZnvYryUzXBAVVUV48ePL+jlaYuLi4GdCy+lEn9Pf1ez8U8++eTYoj/FxcUMGzaM1atXJ73Nrztdbe186KGHcueddyYce+655wA466yzuPvuuwE48sgjufXWW1M+z3XXXcfAgQMzrk1ECltvCwH/5pw7iLZbFK81s873bwFmdqWZLTKzRevXr89thT2UbQgo5KEAaBu3f+CBB2KT+9L9mqlTpyZt22233bwqLanf/e53QFtXfsfg8vWvf50FCxbEzslEc3NBdaCJSJZ6VQhwzq1r/28N8DvgkBTnzXHOTXbOTe4tK7WFw+Eedec651i+fHnBhwCAa665hokTJ3Z7XigUir35l5eXJz1n8GBv73Z98sknqaysZM2aNXz22WecfvrpOOeoqKhIen6mdwlERfctEBFJR68JAWYWNrNB0c+BE2lbq6BP6GlPwKeffsq2bdsUAjKwbdu22P4AI0aMSHpOunMM0nXBBRewfv16xo4dm/UtfU899RRlZWVJ22bOnMnSpX3mx0JEfJbzEGBmTwF/Bb5oZtVm9k0z+5aZfau9fZSZVQP/B/hu+zmDgZHA/zOzJcDfgJedc6+kep3epqchILpnQKGuEZCtO++8k8cff5wjjjgi4Xh0jkGufP755ynb4icETp8+nXPPPZcdO3bEbmHsaL/99ku654GISEfe/rmTBufced20fwaMTdK0Gej6/q5eLHqLoHMuo/vSC3n3QC8MGDCASy65hOrq6oQV+7zuCejOiBEjWLJkSadbGBsbGykpKWHNmjUceeSRnH322QntNTU1jBgxgqOPPprXX389djw63CAi0pWchwBJLjo5rKGhodsZ7vGWL19OWVkZ48aN86u0gtBx7kiuewKApMsmR+/4SLXo0PDhw3HOEYlEOi2YJCLSnV4zJ6Cvi77xZzokUFVVxV577ZWwba1k7vLLL0943NN9DLIVP6yzYsWKtL8uWc9FNisdikhh0DtHQES3AO5pCJDsxP/lX11dzaGHHpqXOqqqqnjiiSf4+OOPY7sVpquxsTFhxcNMPfzww8yfP7/HXy8ivY9CQEBEewIyuU0wEonw0UcfaT6AR4YOHQrAmDFj8lrHRRdd1KN1CkpLS/nJT36ScHvhTTfdlNbXtra2cvXVV3PcccfxzjvvYGbqSRApAAoBAdGT4YDVq1fT3NysEOCRjz76iDVr1uS7jKy9+eabsc/vueeeLhcQik5Eje8JOeyww2KfL1iwgPr6lKt898jPf/7zWMiYPXs27733Hk1NTdTV1fHJJ5/E2j7++GMAVq1aRSgU4v333/e0DhHRxMDA6EkI0J0B3ho6dGisN6AvKS0tTbhToLm5maamJsLhMEuWLOnya6O9CqtWrWL8+PE9rmHr1q1s3ryZ0aNHc+WVO1f87moZ5o57Yey///7ceuut3HHHHT2uQ0QSqScgIHoyJ0BrBEgqW7duTXi833778ec//xloCwUDBw7ktddeS/irvytnnHFGj2uJRCIMGjSIMWPGZD3EcOedd3a6tkgkgplx1FFHsXr16oS2Dz74gPnz59PS0pLV62aiqakp1psR/9HY2Mirr77K3nvvHTsWXbGyoaGBF198ke3bt7PvvvvG2pctW8aWLVtyVntHXe2vIX2DegICoidzAqqqqhg8eHDKVe+kcIXDYWbMmBFbRnjp0qV85StfoampKXbOCSeckPA1Rx99NNOmTePrX/86q1atSvhL/N1338XMerT2QKa3Lra0tNDa2sp9993HTTfdxIknnsgee+zBww8/DBDb2KmjN998k9122y1W44UXXsgvf/nLTufNnDmTQYMGcd111wHwwAMPMG3atE7nTZs2jUcffZSGhoZua37wwQe55pprujwnfvOqqE2bNnUZjNJZBhuIbS89depUioqKWLNmDW+88QbXXnstmzZtSus5MrX77ruzatUqX54b2no4S0pKqKuro6SkhP3335/y8nIaGhqIRCJEIhGGDh3KyJEjOfPMMykvL2fMmDEMGTKEHTt2UFJSwurVq3n66acZNmwY1dXVHH744Sxfvpzy8nKWLVtGS0sLjY2NHHDAAZSXlzNhwgRWrFhBY2Mj//jHP1i8eDETJ05k4MCBhMNhJk+ezDvvvMPGjRupr69n9OjRjBgxgtraWjZu3MigQYOoqKhg48aNTJ48mfr6ejZv3szgwYMxM/baay9CoRBr165l+/btNDc38+GHH7Lffvtx1lln5Xx9EgDr6wuKDBo0yB188MGxx4888ghf/OIXefHFF5k1a1an85988knGjRvHM888w0MPPdSp/bnnnqOyspK5c+cyd+7cTu3z5s0jFArx4IMP8pvf/KZT+1/+8hegbaz2pZdeih3fvn07Cxcu5Mknn+SCCy7g9ttv509/+lPC11ZUVPD8888DcOutt/LII48QiUQ46KCDABg7dmzsl94NN9zA4sWLE77+C1/4AnPmzAHgyiuvjPUkRE2aNIn77rsPaFvmtrq6OqH98MMPj+14d+aZZ1JXV5fQftxxx3HbbbcBMHXq1E6/PE855ZTY7PVjjjmm0/+bs88+m2uuuYbt27fz1a9+tVP7JZdcwiWXXEJtbS1nnXVWp/arr76ac845hzVr1nDhhRd2ap8+fTqnnnoqy5Yt46qrrurU/t3vfpfjjz+exYsXc8MNN3Rqv+OOOzjiiCN46623+M53vtOp/b777mPSpEm89tpr/OhHP+rUno9/e/ELCHXlhBNO4NVXXwWI/dv77LPPWLZsWadzb775Zt5++22am5spLi6mqKioy397yWo48sgjKSoqwjlHUVFRWv/2/uM//oNhw4aldT0ivc2cOXO44oorPHs+M/u7c25yd+epJyAgohOzMhkOaGho8HyjGylMyRZHGjVqFI2NjbEJelF33303I0aMoKamBmjrQUhHfX09w4YN49RTT2Xz5s1AZmsZdDdf49prr+WBBx7odHzKlCksWLAg7a7tKVOmJEyujDr99NMZP3488+bNo6qqiilTprBp0ybee++9hPMmTZrEkCFDEo6lCqDOOXbs2MHMmTO7DKAzZ86kqKiIbdu2cdVVV1FeXs727dspKyvrdl5H1He/+10mTpwY+0Mg/v99ugH08ccf595776W2thYzY926dQnnTZgwgc8//5wtW7YwePBgSkpK6N+/P1/60peYMmUKxcXFvPLKK0QiEerq6igqKqKioiL2/zscDsfmrBSaf//3f8/PCzvn+vTHwQcf7HqDDRs2OMDNnj07rfMbGhqcmbkZ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\n",
"text/plain": [
"<Figure size 576x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8,8))\n",
"\n",
"fig = plt.figure(figsize=(8,10))\n",
"ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=.4)\n",
"ax2 = fig.add_subplot(2,1,2)\n",
"\n",
"ax1.plot(log, '-k')\n",
"ax1.plot(logP, '--k')\n",
"\n",
"ax2.plot([0, len(phis)], [phis[-1], phis[-1]], '--k', label=truncate(phis[-1], 10))\n",
"ax2.plot(phis, '-k', label='first {}'.format(len(result)))\n",
"\n",
"ax1.set_yscale('log')\n",
"ax1.set_xscale('log')\n",
"ax2.set_xscale('log')\n",
"\n",
"ax1.set_ylabel(r'$\\log{|F_R(n)|}+1$')\n",
"ax2.set_ylabel(r'${|F_R(n)|}^{1/n}$')\n",
"ax2.set_xlabel(r'$n$')\n",
"\n",
"ax2.legend()\n",
"plt.subplots_adjust(hspace=-.28)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"fig.savefig('randomFib_13M.png', dpi=300, bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"737370"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"digits[-1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment