dpzc-4/module_4_pzc.ipynb

402 lines
74 KiB
Plaintext
Raw Normal View History

2022-01-05 14:31:13 +01:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import random\n",
"import math\n",
"import time\n",
"import threading\n",
"import logging\n",
"logging.getLogger().setLevel(logging.INFO)\n",
"\n",
"# Pre generated primes\n",
"first_primes_list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29,\n",
" 31, 37, 41, 43, 47, 53, 59, 61, 67,\n",
" 71, 73, 79, 83, 89, 97, 101, 103,\n",
" 107, 109, 113, 127, 131, 137, 139,\n",
" 149, 151, 157, 163, 167, 173, 179,\n",
" 181, 191, 193, 197, 199, 211, 223,\n",
" 227, 229, 233, 239, 241, 251, 257,\n",
" 263, 269, 271, 277, 281, 283, 293,\n",
" 307, 311, 313, 317, 331, 337, 347, 349]\n",
"\n",
"\n",
"def nBitRandom(n):\n",
" return random.randrange(2**(n-1)+1, 2**n - 1)\n",
" \n",
"def getLowLevelPrime(n):\n",
" '''Generate a prime candidate divisible\n",
" by first primes'''\n",
" while True:\n",
" # Obtain a random number\n",
" pc = nBitRandom(n)\n",
" \n",
" # Test divisibility by pre-generated\n",
" # primes\n",
" for divisor in first_primes_list:\n",
" if pc % divisor == 0 and divisor**2 <= pc:\n",
" break\n",
" else: return pc\n",
"\n",
"def isMillerRabinPassed(mrc):\n",
" '''Run 20 iterations of Rabin Miller Primality test'''\n",
" maxDivisionsByTwo = 0\n",
" ec = mrc-1\n",
" while ec % 2 == 0:\n",
" ec >>= 1\n",
" maxDivisionsByTwo += 1\n",
" assert(2**maxDivisionsByTwo * ec == mrc-1)\n",
" \n",
" def trialComposite(round_tester):\n",
" if pow(round_tester, ec, mrc) == 1:\n",
" return False\n",
" for i in range(maxDivisionsByTwo):\n",
" if pow(round_tester, 2**i * ec, mrc) == mrc-1:\n",
" return False\n",
" return True\n",
" \n",
" # Set number of trials here\n",
" numberOfRabinTrials = 20\n",
" for i in range(numberOfRabinTrials):\n",
" round_tester = random.randrange(2, mrc)\n",
" if trialComposite(round_tester):\n",
" return False\n",
" return True\n",
" \n",
"def random_large_prime(bits):\n",
" while True:\n",
" prime_candidate = getLowLevelPrime(bits)\n",
" if not isMillerRabinPassed(prime_candidate):\n",
" continue\n",
" else:\n",
" return prime_candidate\n",
"\n",
"def thread_function(i, fast, timeout):\n",
" start = time.time()\n",
"\n",
" c = 5 # bits: 20: 200ms; 21: 350ms; 22: 700ms 23: 1.5s; 25: 6s; 26: 10s; 27: 24s\n",
" bits = 19 if fast else 23\n",
" last_report = time.time()\n",
" processing_time = 0.0\n",
" reqs = 0\n",
" while True:\n",
" iter_start = time.time()\n",
" if iter_start - start > timeout:\n",
" logging.info(\"Thread: %d\\treqs: %d\\tmean time: %.3fs\\t%s\"%(i, reqs, processing_time/reqs if reqs>0 else 0.0, \"fast\\t\" if fast else \"\"))\n",
" results[i][iter_start] = processing_time/reqs if reqs>0 else 0.0\n",
" return\n",
" if iter_start - last_report > UNIT/2:\n",
" if len(results[i])%2 == 0:\n",
" logging.info(\"Thread: %d\\treqs: %d\\tmean time: %.3fs\\t%s\"%(i, reqs, processing_time/reqs if reqs>0 else 0.0, \"fast\\t\" if fast else \"\"))\n",
" results[i][iter_start] = processing_time/reqs if reqs>0 else 0.0\n",
" processing_time = 0.0\n",
" reqs = 0\n",
" last_report=iter_start\n",
"\n",
" factors = [random_large_prime(bits) for i in range(c)]\n",
" factors.sort()\n",
" n=math.prod(factors)\n",
" req_addr = API_URL+'/factors/%d'%(n)\n",
" r = requests.get(req_addr )\n",
" if r.status_code > 299:\n",
" logging.error(\"wrong status code from webservice for addr: \" + req_addr )\n",
" else: \n",
" result = r.json()\n",
" if result != factors:\n",
" logging.error(\"Wrong factors\")\n",
"\n",
" processing_time+=time.time() - iter_start\n",
" reqs+=1\n",
" time.sleep(0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.2 - AWS"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"API_URL=\"http://3.219.135.136:8080\"\n",
"UNIT = 60.0 # secs"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:Thread: 0\treqs: 36\tmean time: 0.340s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 35\tmean time: 0.350s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 14\tmean time: 1.786s\t\n",
"INFO:root:Thread: 0\treqs: 30\tmean time: 0.511s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 14\tmean time: 1.712s\t\n",
"INFO:root:Thread: 0\treqs: 29\tmean time: 0.548s\tfast\t\n",
"INFO:root:Thread: 2\treqs: 13\tmean time: 1.889s\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.817s\t\n",
"INFO:root:Thread: 0\treqs: 26\tmean time: 0.657s\tfast\t\n",
"INFO:root:Thread: 2\treqs: 13\tmean time: 1.956s\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.938s\t\n",
"INFO:root:Thread: 0\treqs: 25\tmean time: 0.770s\tfast\t\n",
"INFO:root:Thread: 3\treqs: 12\tmean time: 2.001s\t\n",
"INFO:root:Thread: 2\treqs: 12\tmean time: 2.030s\t\n",
"INFO:root:Thread: 0\treqs: 23\tmean time: 0.831s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.909s\t\n",
"INFO:root:Thread: 3\treqs: 13\tmean time: 1.813s\t\n",
"INFO:root:Thread: 2\treqs: 13\tmean time: 1.932s\t\n",
"INFO:root:Thread: 0\treqs: 25\tmean time: 0.760s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.937s\t\n",
"INFO:root:Thread: 4\treqs: 13\tmean time: 1.994s\t\n",
"INFO:root:Thread: 3\treqs: 11\tmean time: 2.218s\t\n",
"INFO:root:Thread: 2\treqs: 12\tmean time: 2.252s\t\n",
"INFO:root:Thread: 0\treqs: 17\tmean time: 1.299s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 10\tmean time: 2.651s\t\n",
"INFO:root:Thread: 4\treqs: 11\tmean time: 2.355s\t\n",
"INFO:root:Thread: 3\treqs: 12\tmean time: 2.417s\t\n",
"INFO:root:Thread: 2\treqs: 11\tmean time: 2.279s\t\n",
"INFO:root:Thread: 0\treqs: 18\tmean time: 1.201s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 11\tmean time: 2.353s\t\n",
"INFO:root:Thread: 4\treqs: 13\tmean time: 1.812s\t\n",
"INFO:root:Thread: 3\treqs: 14\tmean time: 1.847s\t\n",
"INFO:root:Thread: 2\treqs: 12\tmean time: 2.024s\t\n",
"INFO:root:Thread: 0\treqs: 18\tmean time: 1.166s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 12\tmean time: 2.231s\t\n",
"INFO:root:Thread: 4\treqs: 9\tmean time: 2.275s\t\n",
"INFO:root:Thread: 3\treqs: 12\tmean time: 2.085s\t\n",
"INFO:root:Thread: 2\treqs: 13\tmean time: 1.947s\t\n",
"INFO:root:Thread: 0\treqs: 22\tmean time: 0.887s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.960s\t\n",
"INFO:root:Thread: 3\treqs: 6\tmean time: 2.069s\t\n",
"INFO:root:Thread: 2\treqs: 14\tmean time: 1.772s\t\n",
"INFO:root:Thread: 0\treqs: 27\tmean time: 0.657s\tfast\t\n",
"INFO:root:Thread: 2\treqs: 2\tmean time: 1.711s\t\n",
"INFO:root:Thread: 1\treqs: 14\tmean time: 1.708s\t\n",
"INFO:root:Thread: 0\treqs: 32\tmean time: 0.451s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 13\tmean time: 1.728s\t\n",
"INFO:root:Thread: 0\treqs: 36\tmean time: 0.338s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 34\tmean time: 0.378s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 36\tmean time: 0.334s\tfast\t\n"
]
}
],
"source": [
"START = time.time()\n",
"slow_threads = 4\n",
"\n",
"results = [ {} for i in range(slow_threads+1)]\n",
"\n",
"t0 = threading.Thread(target=thread_function, args=(0, True, (5 + slow_threads*3) * UNIT))\n",
"t0.start()\n",
"time.sleep(2 * UNIT)\n",
"for i in range(slow_threads):\n",
" t = threading.Thread(target=thread_function, args=(i+1, False, (slow_threads-i) * 3 * UNIT))\n",
" t.start()\n",
" time.sleep(2 * UNIT)\n",
"\n",
"t0.join()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import scipy.stats as stats\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def plot():\n",
" mu = 0\n",
" std = 1\n",
" for i, result in enumerate(results):\n",
" x = [(x - START)/UNIT for x in result.keys()]\n",
" y = result.values()\n",
" plt.plot(x, y, label=\"t%d\"%(i,))\n",
"\n",
" plt.legend()\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4.1 - Hetzner"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"API_URL=\"http://95.217.175.98:8080\"\n",
"UNIT = 5.0 # secs"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:Thread: 0\treqs: 4\tmean time: 0.243s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 4\tmean time: 0.160s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.580s\t\n",
"INFO:root:Thread: 0\treqs: 3\tmean time: 0.585s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 3\tmean time: 0.512s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.289s\t\n",
"INFO:root:Thread: 2\treqs: 2\tmean time: 1.451s\t\n",
"INFO:root:Thread: 0\treqs: 2\tmean time: 1.323s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.550s\t\n",
"INFO:root:Thread: 2\treqs: 1\tmean time: 2.738s\t\n",
"INFO:root:Thread: 3\treqs: 1\tmean time: 2.642s\t\n",
"INFO:root:Thread: 0\treqs: 2\tmean time: 1.370s\tfast\t\n",
"INFO:root:Thread: 2\treqs: 2\tmean time: 1.457s\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.997s\t\n",
"INFO:root:Thread: 3\treqs: 1\tmean time: 2.158s\t\n",
"INFO:root:Thread: 0\treqs: 2\tmean time: 1.973s\tfast\t\n",
"INFO:root:Thread: 4\treqs: 2\tmean time: 2.063s\t\n",
"INFO:root:Thread: 2\treqs: 1\tmean time: 2.384s\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.721s\t\n",
"INFO:root:Thread: 3\treqs: 1\tmean time: 3.673s\t\n",
"INFO:root:Thread: 0\treqs: 2\tmean time: 1.371s\tfast\t\n",
"INFO:root:Thread: 4\treqs: 1\tmean time: 3.717s\t\n",
"INFO:root:Thread: 2\treqs: 2\tmean time: 1.469s\t\n",
"INFO:root:Thread: 1\treqs: 1\tmean time: 3.726s\t\n",
"INFO:root:Thread: 3\treqs: 1\tmean time: 3.833s\t\n",
"INFO:root:Thread: 4\treqs: 1\tmean time: 2.686s\t\n",
"INFO:root:Thread: 0\treqs: 1\tmean time: 2.421s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 1\tmean time: 2.063s\t\n",
"INFO:root:Thread: 2\treqs: 1\tmean time: 2.196s\t\n",
"INFO:root:Thread: 3\treqs: 2\tmean time: 1.929s\t\n",
"INFO:root:Thread: 0\treqs: 3\tmean time: 0.539s\tfast\t\n",
"INFO:root:Thread: 1\treqs: 2\tmean time: 1.196s\t\n",
"INFO:root:Thread: 2\treqs: 1\tmean time: 1.531s\t\n",
"INFO:root:Thread: 1\treqs: 1\tmean time: 1.502s\t\n",
"INFO:root:Thread: 0\treqs: 3\tmean time: 0.389s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 4\tmean time: 0.177s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 4\tmean time: 0.160s\tfast\t\n",
"INFO:root:Thread: 0\treqs: 1\tmean time: 0.254s\tfast\t\n"
]
}
],
"source": [
"START = time.time()\n",
"slow_threads = 4\n",
"\n",
"results = [ {} for i in range(slow_threads+1)]\n",
"\n",
"t0 = threading.Thread(target=thread_function, args=(0, True, (5 + slow_threads*3) * UNIT))\n",
"t0.start()\n",
"time.sleep(2 * UNIT)\n",
"for i in range(slow_threads):\n",
" t = threading.Thread(target=thread_function, args=(i+1, False, (slow_threads-i) * 3 * UNIT))\n",
" t.start()\n",
" time.sleep(2 * UNIT)\n",
"\n",
"t0.join()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot()"
]
},
{
"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.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}