{ "cells": [ { "cell_type": "markdown", "id": "bafc2f4e-05a3-4120-bcd6-5d1f5fb91cd9", "metadata": {}, "source": [ "# Distinguishing countermeasures by output" ] }, { "cell_type": "code", "execution_count": 81, "id": "33ee6084-2ac3-4f95-9610-0fbc06026538", "metadata": {}, "outputs": [], "source": [ "import io\n", "import math\n", "import random\n", "import itertools\n", "import warnings\n", "\n", "import cypari2\n", "from cysignals.alarm import alarm, AlarmInterrupt\n", "\n", "from matplotlib import pyplot as plt\n", "from collections import Counter\n", "from tqdm.auto import tqdm, trange\n", "\n", "from pyecsca.misc.cfg import TemporaryConfig\n", "from pyecsca.misc.utils import TaskExecutor\n", "from pyecsca.ec.mod import mod, RandomModAction\n", "from pyecsca.ec.point import Point\n", "from pyecsca.ec.model import ShortWeierstrassModel\n", "from pyecsca.ec.params import load_params_ectester, get_params\n", "from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier, ScalarMultiplicationAction\n", "from pyecsca.ec.context import local, DefaultContext\n", "from pyecsca.ec.countermeasures import GroupScalarRandomization, AdditiveSplitting, MultiplicativeSplitting, EuclideanSplitting, BrumleyTuveri\n", "\n", "%matplotlib ipympl" ] }, { "cell_type": "code", "execution_count": 2, "id": "b1b9596c-1eba-4ace-af84-8cb279d84cc2", "metadata": {}, "outputs": [], "source": [ "model = ShortWeierstrassModel()\n", "coords = model.coordinates[\"projective\"]" ] }, { "cell_type": "code", "execution_count": 3, "id": "b0afb195-8390-44c5-931e-75a70ccd4e9e", "metadata": {}, "outputs": [], "source": [ "add = coords.formulas[\"add-2007-bl\"]\n", "dbl = coords.formulas[\"dbl-2007-bl\"]\n", "ltr = LTRMultiplier(add, dbl, complete=False)\n", "rtl = RTLMultiplier(add, dbl, complete=False)\n", "mult = ltr" ] }, { "cell_type": "code", "execution_count": 4, "id": "52c877e1-5021-4ec2-9daa-dd20bec6bcb2", "metadata": {}, "outputs": [], "source": [ "gsr = GroupScalarRandomization(mult)\n", "asplit = AdditiveSplitting(mult)\n", "msplit = MultiplicativeSplitting(mult)\n", "esplit = EuclideanSplitting(mult)\n", "bt = BrumleyTuveri(mult)" ] }, { "cell_type": "markdown", "id": "27626337-dcbc-497c-a54e-02d50e2b8f34", "metadata": {}, "source": [ "## 3n test" ] }, { "cell_type": "code", "execution_count": 5, "id": "c3088419-161b-4193-a1b6-6f623f217fcd", "metadata": {}, "outputs": [], "source": [ "key3n = 0x20959f2b437de1e522baf6d814911938157390d3ea5118660b852ab0d5387006\n", "params3n = load_params_ectester(io.BytesIO(b\"0xc381bb0394f34b5ed061c9107b66974f4d0a8ec89b9fe73b98b6d1368c7d974d,0x5ca6c5ee0a10097af291a8f125303fb1a3e35e8100411902245d691e0e5cb497,0x385a5a8bb8af94721f6fd10b562606d9b9df931f7fd966e96859bb9bd7c05836,0x4616af1898b92cac0f902a9daee24bbae63571cead270467c6a7886ced421f5e,0x34e896bdb1337e0ae5960fa3389fb59c2c8d6c7dbfd9aac33a844f8f98e433ef,0x412b3e5686fbc3ca4575edb0292232702ae721a7d4a230cc170a5561aa70e00f,0x01\"), \"projective\")\n", "bits3n = params3n.full_order.bit_length()\n", "point3n = Point(X=mod(0x4a48addb2e471767b7cd0f6f1d4c27fe46f4a828fc20f950bd1f72c939b36a84, params3n.curve.prime),\n", " Y=mod(0x13384d38c353f862832c0f067e46a3e510bb6803c20745dfb31929f4a18d890d, params3n.curve.prime),\n", " Z=mod(1, params3n.curve.prime), model=coords)" ] }, { "cell_type": "code", "execution_count": 6, "id": "a8dde7e6-cd48-4f99-9677-23a19e4c2e5b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prime:\t0xc381bb0394f34b5ed061c9107b66974f4d0a8ec89b9fe73b98b6d1368c7d974d\n", "a:\t0x5ca6c5ee0a10097af291a8f125303fb1a3e35e8100411902245d691e0e5cb497\n", "b:\t0x385a5a8bb8af94721f6fd10b562606d9b9df931f7fd966e96859bb9bd7c05836\n", "G:\t[0x4616af1898b92cac0f902a9daee24bbae63571cead270467c6a7886ced421f5e,\n", "\t 0x34e896bdb1337e0ae5960fa3389fb59c2c8d6c7dbfd9aac33a844f8f98e433ef]\n", "n:\t0x412b3e5686fbc3ca4575edb0292232702ae721a7d4a230cc170a5561aa70e00f\n", "3n:\t0xc381bb0394f34b5ed061c9107b66975080b564f77de69264451f0024ff52a02d\n", "\n", "P:\t[0x4a48addb2e471767b7cd0f6f1d4c27fe46f4a828fc20f950bd1f72c939b36a84,\n", "\t 0x13384d38c353f862832c0f067e46a3e510bb6803c20745dfb31929f4a18d890d]\n" ] } ], "source": [ "print(f\"prime:\\t0x{params3n.curve.prime:x}\")\n", "print(f\"a:\\t0x{params3n.curve.parameters['a']:x}\")\n", "print(f\"b:\\t0x{params3n.curve.parameters['b']:x}\")\n", "print(f\"G:\\t[0x{params3n.generator.X:x},\\n\\t 0x{params3n.generator.Y:x}]\")\n", "print(f\"n:\\t0x{params3n.order:x}\")\n", "print(f\"3n:\\t0x{3 * params3n.order:x}\")\n", "print(f\"\\nP:\\t[0x{point3n.X:x},\\n\\t 0x{point3n.Y:x}]\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "cd6f8500-7509-45b0-8b23-471ee5014f42", "metadata": {}, "outputs": [], "source": [ "def generate_scalars_mod3(rem, samples):\n", " scalars = []\n", " while True:\n", " scalar = random.randint(0, params3n.full_order)\n", " if scalar % 3 == rem:\n", " scalars.append(scalar)\n", " if len(scalars) == samples:\n", " break\n", " return scalars\n", "\n", "def test_3n(countermeasure, scalars):\n", " ctr = Counter()\n", " for k in tqdm(scalars, leave=False):\n", " mult.init(params3n, point3n)\n", " kP = mult.multiply(k).to_affine()\n", " mult.init(params3n, point3n)\n", " knP = mult.multiply(k + params3n.full_order).to_affine()\n", " mult.init(params3n, point3n)\n", " k2nP = mult.multiply(k + 2 * params3n.full_order).to_affine()\n", "\n", " countermeasure.init(params3n, point3n)\n", " res = countermeasure.multiply(k)\n", " aff = res.to_affine()\n", " if aff.equals(kP):\n", " ctr[\"k\"] += 1\n", " elif aff.equals(knP):\n", " ctr[\"k + 1n\"] += 1\n", " elif aff.equals(k2nP):\n", " ctr[\"k + 2n\"] += 1\n", " else:\n", " ctr[aff] += 1\n", " for name, count in sorted(ctr.items()):\n", " print(f\"{name}:\\t{count}\")\n", "\n", "def test_3n_fixed_scalar(countermeasure, samples):\n", " test_3n(countermeasure, [key3n for _ in range(samples)])\n", "\n", "def test_3n_random_scalar(countermeasure, samples):\n", " test_3n(countermeasure, [random.randint(0, params3n.full_order) for _ in range(samples)])\n", "\n", "def test_3n_random_scalar_projected(countermeasure, samples):\n", " print(\"k = 0 mod 3\")\n", " test_3n(countermeasure, generate_scalars_mod3(0, samples))\n", " print()\n", " print(\"k = 1 mod 3\")\n", " test_3n(countermeasure, generate_scalars_mod3(1, samples))\n", " print()\n", " print(\"k = 2 mod 3\")\n", " test_3n(countermeasure, generate_scalars_mod3(2, samples))" ] }, { "cell_type": "markdown", "id": "46b8f74a-433d-48c9-b5b9-6bb7d2731246", "metadata": {}, "source": [ "### Fixed scalar experiments" ] }, { "cell_type": "markdown", "id": "fc82d4b9-91cd-423c-83aa-89721efa1ae9", "metadata": {}, "source": [ "#### Group scalar randomization" ] }, { "cell_type": "code", "execution_count": 8, "id": "86532d50-2db7-4370-b449-c545b330a852", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7c11b83ca4fa40eaac982481494bd7ce", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/1000 [00:00= t:\n", " candidates.add(divisor)\n", " candidate_amounts.append(len(candidates))\n", " if len(candidates) == 1:\n", " candidate = candidates.pop()\n", " print(\"Only one candidate, we got the mask:\", candidate, candidate == r, \"incomplete factoring this may not be the r\" if not complete else \"\")\n", "print(f\"Total recovered masks: {len(list(filter(lambda a: a == 1, candidate_amounts)))} out of {i}\")" ] }, { "cell_type": "code", "execution_count": 34, "id": "6274ff91-325f-4c6b-a4d7-d66b994d730f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f798486616e84295ad961e7cc4aefa7e", "version_major": 2, "version_minor": 0 }, "image/png": "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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "max_amount = max(candidate_amounts)\n", "fig = plt.subplots()\n", "plt.hist(candidate_amounts, range=(1, max_amount), align=\"left\", density=True, bins=range(1, max_amount))#, bins=list(range(20)) + list(range(20, 100, 5)) + list(range(100, max(candidate_amounts), 10)))\n", "plt.xlabel(\"number of candidate masks\")\n", "plt.ylabel(\"proportion\")\n", "plt.xticks(range(max_amount))\n", "plt.xlim(0, 20);\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 35, "id": "9f22ca9d-bdc2-4ea5-b2bc-249a256bb8ad", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8258b0bb0ce947b18b5a80d7df7efc5c", "version_major": 2, "version_minor": 0 }, "image/png": "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r371K5WXl+uRRx7RiRMndOONNyorK0sBAQH1Pr/v8vf3V0ZGxkWXm8HaXAprUz3WpWasTc1Ym+qxLlcPhzE23wMNAABgH6/4DCAAAADqDgEQAADAMgRAAAAAyxAAAQAALEMAbITmzp2ryMhIBQQEKD4+Xrm5uQ09JI/6+OOPdeedd6p9+/ZyOByu72s+zxijqVOnql27dgoMDFRycrL27NnjVuf48eN64IEHFBQUpJCQEI0YMUKnTp2qx1nUvczMTPXv318tW7ZU27ZtlZqaql27drnV+de//qXRo0erTZs2atGihe69996LHoBeVFSkQYMGqVmzZmrbtq0mTpyos2fP1udU6ty8efPUp08f18NoExIS9P7777v227ouF5o+fbrrkVfn2bw206ZNk8PhcNt69Ojh2m/z2hw6dEj/9V//pTZt2igwMFBRUVHaunWra7+t78NXtQb9IjpcZOnSpcbPz8+88sor5vPPPzcPP/ywCQkJMSUlJQ09NI9ZvXq1+fWvf23eeecdI8ksX77cbf/06dNNcHCwWbFihfn73/9u7rrrLtOlSxfz7bffuurcdtttJjo62mzevNn87W9/M127djVDhgyp55nUrZSUFLNo0SJTWFhoCgoKzE9/+lPTqVMnc+rUKVedkSNHmoiICJOdnW22bt1qBgwYYBITE137z549a3r37m2Sk5PNtm3bzOrVq01oaKhJT09viCnVmffee8+sWrXK7N692+zatctMnjzZNG3a1BQWFhpj7F2X78rNzTWRkZGmT58+Zty4ca5ym9cmIyPDXH/99ebIkSOu7ejRo679tq7N8ePHTefOnc1DDz1ktmzZYvbt22c++OAD8+WXX7rq2Po+fDUjADYycXFxZvTo0a7XlZWVpn379iYzM7MBR1V/LgyAVVVVJjw83Dz//POushMnThh/f3/z5z//2RhjzBdffGEkmU8//dRV5/333zcOh8McOnSo3sbuaaWlpUaS2bBhgzHm3Do0bdrUvPXWW646O3bsMJJMTk6OMeZcuPbx8THFxcWuOvPmzTNBQUGmoqKififgYa1atTIvv/wy62KMOXnypOnWrZtZu3atSUpKcgVA29cmIyPDREdHV7vP5rV56qmnzI033ljjft6Hr05cAm5ETp8+rby8PCUnJ7vKfHx8lJycrJycnAYcWcPZv3+/iouL3dYkODhY8fHxrjXJyclRSEiI+vXr56qTnJwsHx8fbdmypd7H7CllZWWSpNatW0uS8vLydObMGbe16dGjhzp16uS2NlFRUa4HpktSSkqKnE6nPv/883ocvedUVlZq6dKlKi8vV0JCAusiafTo0Ro0aJDbGkj8zkjSnj171L59e1177bV64IEHVFRUJMnutXnvvffUr18/3XfffWrbtq369u2rhQsXuvbzPnx1IgA2IseOHVNlZaXbm4skhYWFqbi4uIFG1bDOz/tSa1JcXKy2bdu67ff19VXr1q2vmnWrqqrS+PHjNXDgQNe32RQXF8vPz08hISFudS9cm+rW7vw+b7Z9+3a1aNFC/v7+GjlypJYvX65evXpZvy5Lly5Vfn6+62sxv8v2tYmPj9fixYuVlZWlefPmaf/+/fp//+//6eTJk1avzb59+zRv3jx169ZNH3zwgR577DE9/vjjevXVVyXxPny18pqvggNsNnr0aBUWFuqTTz5p6KE0Gtddd50KCgpUVlamv/zlLxo2bJg2bNjQ0MNqUAcPHtS4ceO0du3aBv9Ky8bo9ttvd/27T58+io+PV+fOnfXmm28qMDCwAUfWsKqqqtSvXz/9z//8jySpb9++Kiws1Pz58zVs2LAGHh08hTOAjUhoaKiaNGly0V1nJSUlCg8Pb6BRNazz877UmoSHh6u0tNRt/9mzZ3X8+PGrYt3GjBmjlStXat26derYsaOrPDw8XKdPn9aJEyfc6l+4NtWt3fl93szPz09du3ZVbGysMjMzFR0drVmzZlm9Lnl5eSotLdUNN9wgX19f+fr6asOGDXrppZfk6+ursLAwa9emOiEhIerevbu+/PJLq39v2rVrp169ermV9ezZ03V5nPfhqxMBsBHx8/NTbGyssrOzXWVVVVXKzs5WQkJCA46s4XTp0kXh4eFua+J0OrVlyxbXmiQkJOjEiRPKy8tz1fnoo49UVVWl+Pj4eh9zXTHGaMyYMVq+fLk++ugjdenSxW1/bGysmjZt6rY2u3btUlFRkdvabN++3e2Nee3atQoKCrroDd/bVVVVqaKiwup1ufnmm7V9+3YVFBS4tn79+umBBx5w/dvWtanOqVOntHfvXrVr187q35uBAwde9Iip3bt3q3PnzpLsfh++qjX0XShwt3TpUuPv728WL15svvjiC/PII4+YkJAQt7vOrjYnT54027ZtM9u2bTOSzIwZM8y2bdvMgQMHjDHnHj8QEhJi3n33XfPZZ5+Zu+++u9rHD/Tt29ds2bLFfPLJJ6Zbt25e//iBxx57zAQHB5v169e7Pbbim2++cdUZOXKk6dSpk/noo4/M1q1bTUJCgklISHDtP//YiltvvdUUFBSYrKwsc80113j9YysmTZpkNmzYYPbv328+++wzM2nSJONwOMyaNWuMMfauS3W+exewMXavzYQJE8z69evN/v37zcaNG01ycrIJDQ01paWlxhh71yY3N9f4+vqa5557zuzZs8f86U9/Ms2aNTNvvPGGq46t78NXMwJgIzR79mzTqVMn4+fnZ+Li4szmzZsbekgetW7dOiPpom3YsGHGmHOPIJgyZYoJCwsz/v7+5uabbza7du1ya+Prr782Q4YMMS1atDBBQUFm+PDh5uTJkw0wm7pT3ZpIMosWLXLV+fbbb82oUaNMq1atTLNmzcw999xjjhw54tbOV199ZW6//XYTGBhoQkNDzYQJE8yZM2fqeTZ167//+79N586djZ+fn7nmmmvMzTff7Ap/xti7LtW5MADavDaDBw827dq1M35+fqZDhw5m8ODBbs+6s3lt/vrXv5revXsbf39/06NHD7NgwQK3/ba+D1/NHMYY0zDnHgEAANAQ+AwgAACAZQiAAAAAliEAAgAAWIYACAAAYBkCIAAAgGUIgAAAAJYhAAIAAFiGAAigWjfddJPGjx/f0MNwMcbokUceUevWreVwOFRQUNDQQ3JZvHixQkJCXK+nTZummJiYSx7z0EMPKTU11aPjakxqsyYA6g8BEIBXyMrK0uLFi7Vy5UodOXJEvXv3bugh1ejJJ590+97UuvDVV181uuALwHv5NvQAANijsrJSDodDPj6X/9+ee/fuVbt27ZSYmOiBkdWtFi1aqEWLFg09DACoEWcAgUbspptu0uOPP65f/epXat26tcLDwzVt2jTX/urOCp04cUIOh0Pr16+XJK1fv14Oh0MffPCB+vbtq8DAQP3kJz9RaWmp3n//ffXs2VNBQUH6z//8T33zzTdu/Z89e1ZjxoxRcHCwQkNDNWXKFH332yMrKir05JNPqkOHDmrevLni4+Nd/Ur/vjT63nvvqVevXvL391dRUVG1c92wYYPi4uLk7++vdu3aadKkSTp79qykc5dLx44dq6KiIjkcDkVGRta4Zhs3btRNN92kZs2aqVWrVkpJSdE///lPSefOIt54440KCQlRmzZtdMcdd2jv3r0Xrec777yjH//4x2rWrJmio6OVk5Pj1sfixYvVqVMnNWvWTPfcc4++/vprt/0XXu6srKxUWlqaq99f/epXuvBbOL9vbF26dJEk9e3bVw6HQzfddJNr38svv6yePXsqICBAPXr00B/+8Ica10c693s1duxYjR8/Xq1atVJYWJgWLlyo8vJyDR8+XC1btlTXrl31/vvvu81hxIgR6tKliwIDA3Xddddp1qxZbu2uX79ecXFxat68uUJCQjRw4EAdOHCg2jHs3btX1157rcaMGSNjjA4cOKA777xTrVq1UvPmzXX99ddr9erVl5wHgB+gIb+IGMClJSUlmaCgIDNt2jSze/du8+qrrxqHw2HWrFljjDFm//79RpLZtm2b65h//vOfRpJZt26dMcaYdevWGUlmwIAB5pNPPjH5+fmma9euJikpydx6660mPz/ffPzxx6ZNmzZm+vTpbn23aNHCjBs3zuzcudO88cYbplmzZm5fEv/LX/7SJCYmmo8//th8+eWX5vnnnzf+/v5m9+7dxhhjFi1aZJo2bWoSExPNxo0bzc6dO015eflF8/zHP/5hmjVrZkaNGmV27Nhhli9fbkJDQ01GRoYxxpgTJ06Y3/72t6Zjx47myJEjprS0tNr12rZtm/H39zePPfaYKSgoMIWFhWb27Nnm6NGjxhhj/vKXv5i3337b7Nmzx2zbts3ceeedJioqylRWVrqtZ48ePczKlSvNrl27zM9//nPTuXNnc+bMGWOMMZs3bzY+Pj7md7/7ndm1a5eZNWuWCQkJMcHBwa5xZGRkmOjoaNfr3/3ud6ZVq1bm7bffNl988YUZMWKEadmypbn77rtddb5vbLm5uUaS+fDDD82RI0fM119/bYwx5o033jDt2rUzb7/9ttm3b595++23TevWrc3ixYurXaPzP9uWLVuaZ555xuzevds888wzpkmTJub22283CxYsMLt37zaPPfaYadOmjevndfr0aTN16lTz6aefmn379rl+H5YtW2aMMebMmTMmODjYPPnkk+bLL780X3zxhVm8eLE5cODARWvy97//3YSHh5tf//rXrjENGjTI3HLLLeazzz4ze/fuNX/961/Nhg0bapwDgB+GAAg0YklJSebGG290K+vfv7956qmnjDGXFwA//PBDV53MzEwjyezdu9dV9uijj5qUlBS3vnv27GmqqqpcZU899ZTp2bOnMcaYAwcOmCZNmphDhw65je/mm2826enpxphzAVCSKSgouOQ8J0+ebK677jq3vubOnWtatGjhCkD/+7//azp37nzJdoYMGWIGDhx4yTrfdfToUSPJbN++3Rjz7/V8+eWXXXU+//xzI8ns2LHD1cdPf/pTt3YGDx58yQDYrl078/vf/971+syZM6Zjx45uAbC2Y/vuz9oYY370ox+ZJUuWuJU988wzJiEhoca2L/y9Onv2rGnevLl58MEHXWVHjhwxkkxOTk6N7YwePdrce++9xhhjvv76ayPJrF+/vtq659dk48aNplWrVuaFF15w2x8VFWWmTZtWY18A6haXgIFGrk+fPm6v27Vrp9LS0h/UTlhYmJo1a6Zrr73WrezCdgcMGCCHw+F6nZCQoD179qiyslLbt29XZWWlunfv7vrMW4sWLbRhwwa3S5d+fn4XzeFCO3bsUEJCgltfAwcO1KlTp/SPf/yj1nMsKCjQzTffXOP+PXv2aMiQIbr22msVFBTkupR84WXp7463Xbt2kuRamx07dig+Pt6tfkJCQo19lpWV6ciRI27H+Pr6ql+/flc0tu8qLy/X3r17NWLECLefwbPPPuv2M6jOd+fYpEkTtWnTRlFRUa6ysLAwt3lL0ty5cxUbG6trrrlGLVq00IIFC1zja926tR566CGlpKTozjvv1KxZs3TkyBG3PouKinTLLbdo6tSpmjBhgtu+xx9/XM8++6wGDhyojIwMffbZZ5ccP4AfhgAINHJNmzZ1e+1wOFRVVSVJrpspzHc+T3bmzJnvbcfhcFyy3do4deqUmjRpory8PBUUFLi2HTt2uH02LDAw0C3YeVJgYOAl99955506fvy4Fi5cqC1btmjLli2SpNOnT7vVu3CtJF3W2lyJ2o7tu06dOiVJWrhwodvPoLCwUJs3b75kf9X9/C8176VLl+rJJ5/UiBEjtGbNGhUUFGj48OFu41u0aJFycnKUmJioZcuWqXv37m7juOaaaxQXF6c///nPcjqdbv3/8pe/1L59+/Tggw9q+/bt6tevn2bPnn3JOQC4cgRAwItdc801kuR2pqUuHxNyPoSct3nzZnXr1k1NmjRR3759VVlZqdLSUnXt2tVtCw8Pv6x+evbsqZycHLcgu3HjRrVs2VIdO3asdTt9+vSp8fErX3/9tXbt2qWnn35aN998s3r27Om6OeRyx1rdutQkODhY7dq1czvm7NmzysvLu6yx+fn5STp3M8Z5YWFhat++vfbt23fRz+D8TSN1ZePGjUpMTNSoUaPUt29fde3atdqzjH379lV6ero2bdqk3r17a8mSJa59gYGBWrlypQICApSSkqKTJ0+6HRsREaGRI0fqnXfe0YQJE7Rw4cI6nQOAfyMAAl4sMDBQAwYM0PTp07Vjxw5t2LBBTz/9dJ21X1RUpLS0NO3atUt//vOfNXv2bI0bN06S1L17dz3wwAMaOnSo3nnnHe3fv1+5ubnKzMzUqlWrLqufUaNG6eDBgxo7dqx27typd999VxkZGUpLS7usR8akp6fr008/1ahRo/TZZ59p586dmjdvno4dO6ZWrVqpTZs2WrBggb788kt99NFHSktLu6xxSucuVWZlZemFF17Qnj17NGfOHGVlZV3ymHHjxmn69OlasWKFdu7cqVGjRunEiROu/bUZW9u2bRUYGKisrCyVlJSorKxMkvSb3/xGmZmZeumll7R7925t375dixYt0owZMy57bpfSrVs3bd26VR988IF2796tKVOm6NNPP3Xt379/v9LT05WTk6MDBw5ozZo12rNnj3r27OnWTvPmzbVq1Sr5+vrq9ttvd53FHD9+vD744APt379f+fn5Wrdu3UXHAqg7BEDAy73yyis6e/asYmNjNX78eD377LN11vbQoUP17bffKi4uTqNHj9a4ceP0yCOPuPYvWrRIQ4cO1YQJE3TdddcpNTVVn376qTp16nRZ/XTo0EGrV69Wbm6uoqOjNXLkSI0YMeKyw2z37t21Zs0a/f3vf1dcXJwSEhL07rvvytfXVz4+Plq6dKny8vLUu3dvPfHEE3r++ecvq33p3OciFy5cqFmzZik6Olpr1qz53nFOmDBBDz74oIYNG6aEhAS1bNlS99xzj2t/bcbm6+url156Sf/3f/+n9u3b6+6775Z07tLpyy+/rEWLFikqKkpJSUlavHhxnZ8BfPTRR/Wzn/1MgwcPVnx8vL7++muNGjXKtb9Zs2bauXOn7r33XnXv3l2PPPKIRo8erUcfffSitlq0aKH3339fxhgNGjRI5eXlqqys1OjRo9WzZ0/ddttt6t69+/c+zgbAlXMYc8HDqAAAAHBV4wwgAACAZQiAAAAAliEAAgAAWIYACAAAYBkCIAAAgGUIgAAAAJYhAAIAAFiGAAgAAGAZAiAAAIBlCIAAAACWIQACAABYhgAIAABgmf8PhAOKJ3zhdGYAAAAASUVORK5CYII=", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "max_amount = max(candidate_amounts)\n", "fig = plt.subplots()\n", "plt.hist(candidate_amounts, range=(1, max_amount), align=\"left\", density=True, bins=range(1, max_amount))#, bins=list(range(20)) + list(range(20, 100, 5)) + list(range(100, max(candidate_amounts), 10)))\n", "plt.xlabel(\"number of candidate masks\")\n", "plt.ylabel(\"proportion\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "91bbda3c-5670-49c9-85f0-99fb36a8acf9", "metadata": {}, "source": [ "## $k = 10$ test" ] }, { "cell_type": "code", "execution_count": 36, "id": "92781e99-15fc-4499-a24e-5ccc20ed3707", "metadata": {}, "outputs": [], "source": [ "paramsk10 = get_params(\"secg\", \"secp256r1\", \"projective\")" ] }, { "cell_type": "code", "execution_count": 37, "id": "b31b2023-c0f7-47b2-8e99-b1f7f6e734b6", "metadata": {}, "outputs": [], "source": [ "def test_k10(countermeasure, samples, k_range = None, zero_fails = True, plot=True):\n", " G = paramsk10.generator\n", " Gaff = G.to_affine()\n", " if k_range is None:\n", " ks = list(range(2, 21))\n", " else:\n", " ks = list(k_range)\n", " fails = []\n", " for k in ks:\n", " correct = 0\n", " failed = 0\n", " expected = paramsk10.curve.affine_multiply(Gaff, k).to_model(paramsk10.curve.coordinate_model, paramsk10.curve)\n", " for _ in range(samples):\n", " with local(DefaultContext()) as ctx:\n", " countermeasure.init(paramsk10, paramsk10.generator)\n", " res = countermeasure.multiply(k)\n", " smults = set()\n", " ctx.actions[0].walk(lambda action: smults.add(action.scalar) if isinstance(action, ScalarMultiplicationAction) else None)\n", " if 0 in smults and zero_fails:\n", " failed += 1\n", " continue\n", " try:\n", " if res.equals_scaled(expected):\n", " correct += 1\n", " else:\n", " failed += 1\n", " except:\n", " failed += 1\n", " print(f\"k = {k}: failed in {failed} out of {samples}.\")\n", " fails.append(failed / samples)\n", " if plot:\n", " fig, ax = plt.subplots()\n", " xs = list(range(len(ks)))\n", " ax.plot(xs, fails, label=\"Error rate\")\n", " if any(k > 100 for k in ks):\n", " ax.set_xticks(xs, (f\"2^{int(math.log2(k))}\" for k in ks))\n", " else:\n", " ax.set_xticks(xs, ks)\n", " ax.set_ylim(-0.05, 1.05)\n", " ax.set_xlabel(\"k\")\n", " ax.set_ylabel(\"Error rate\")\n", " ax.legend()\n", " plt.show()\n", " return fails" ] }, { "cell_type": "markdown", "id": "37e1ce04-5487-484c-9bf1-d6a8f7076390", "metadata": {}, "source": [ "### Group scalar randomization\n", "\n", "In GSR, the LTR simple double-and-add errors quite a lot for small scalars." ] }, { "cell_type": "code", "execution_count": 38, "id": "d4f5298c-6277-40f4-af5d-590df6d61d6e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 25 out of 100.\n", "k = 3: failed in 21 out of 100.\n", "k = 4: failed in 11 out of 100.\n", "k = 5: failed in 11 out of 100.\n", "k = 6: failed in 14 out of 100.\n", "k = 7: failed in 10 out of 100.\n", "k = 8: failed in 9 out of 100.\n", "k = 9: failed in 9 out of 100.\n", "k = 10: failed in 3 out of 100.\n", "k = 11: failed in 6 out of 100.\n", "k = 12: failed in 4 out of 100.\n", "k = 13: failed in 4 out of 100.\n", "k = 14: failed in 4 out of 100.\n", "k = 15: failed in 4 out of 100.\n", "k = 16: failed in 1 out of 100.\n", "k = 17: failed in 5 out of 100.\n", "k = 18: failed in 6 out of 100.\n", "k = 19: failed in 6 out of 100.\n", "k = 20: failed in 1 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3d8a2baab3ea4cde8bca04cebf966ffb", "version_major": 2, "version_minor": 0 }, "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAARtxJREFUeJzt3Xd4FOX+/vF70wukQEiDFDoCEqoBQRGNFJViOSKgRlC/PxWVcg4KqKDHI4iI4hGEg2IXRbECCiICiiIgIQoKgQCSUJIQIIUE0nZ+fyCrkWIgm0yy835d116SyczzfDaZ8bnz7BSbYRiGAAAAYBluZhcAAACA6kUABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYgiAAAAAFkMABAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBEAAAACLIQACAABYDAEQAADAYjzMLqA2s9vtOnDggOrWrSubzWZ2OQAAoAIMw1B+fr4iIyPl5mbNuTACYCUcOHBAUVFRZpcBAAAuQHp6uho1amR2GaYgAFZC3bp1JZ3cgQICAkyuBgAAVEReXp6ioqIc47gVEQAr4dTHvgEBAQRAAABqGSufvmXND74BAAAsjAAIAABgMQRAAAAAi+EcQAAAfmcYhkpLS1VWVmZ2KagEd3d3eXh4WPocv79DAAQAQFJxcbEOHjyowsJCs0uBE/j5+SkiIkJeXl5ml1IjEQABAJZnt9u1Z88eubu7KzIyUl5eXswe1VKGYai4uFiHDh3Snj171Lx5c8ve7PlcCIAAAMsrLi6W3W5XVFSU/Pz8zC4HleTr6ytPT0/t3btXxcXF8vHxMbukGodIDADA75gpch38Ls+Nnw4AAIDFuEwA/Oabb9S/f39FRkbKZrPpk08++dttVq9erY4dO8rb21vNmjXT66+/XuV1AgAAmM1lAmBBQYHi4uI0e/bsCq2/Z88eXXvtterVq5eSk5M1evRo3XXXXVq+fHkVVwoAgPPccccdstlsp7369u1rdmkXrKITObhwLnMRSL9+/dSvX78Krz937lw1btxYM2bMkCRddNFFWrt2rZ5//nn16dOnqsoEAMDp+vbtq9dee63cMm9v77OuX1JSIk9Pz3LLiouLL+iWKRXdrqysTDabjXPzagjL/hbWrVunhISEcsv69OmjdevWnXWboqIi5eXllXsBAGA2b29vhYeHl3sFBwc7vm+z2TRnzhwNGDBA/v7+euqpp/T444+rffv2euWVV9S4cWPHlbJpaWkaOHCg6tSpo4CAAN18883KzMx0tHW27f7q9ddfV1BQkD777DO1bt1a3t7eSktL08aNG3X11VcrJCREgYGB6tmzp5KSkhzbxcbGSpKuv/562Ww2x9eS9Omnn6pjx47y8fFRkyZN9MQTT6i0tNSJP0nrsGwAzMjIUFhYWLllYWFhysvL0/Hjx8+4zdSpUxUYGOh4RUVFVUepAAATGIahwuJSU16GYTj9/Tz++OO6/vrrtWXLFo0YMUKSlJqaqg8//FAfffSRkpOTZbfbNXDgQB05ckRr1qzRihUrtHv3bg0ePLhcW3/d7mwKCws1bdo0vfLKK/rll18UGhqq/Px8JSYmau3atfrhhx/UvHlzXXPNNcrPz5ckbdy4UZL02muv6eDBg46vv/32W91+++0aNWqUfv31V/3vf//T66+/rqeeesrpPysrcJmPgKvDhAkTNHbsWMfXeXl5hEAAcFHHS8rUepI554X/+u8+8vOq+BC9ZMkS1alTp9yyiRMnauLEiY6vhw4dquHDh5dbp7i4WG+++aYaNGggSVqxYoW2bNmiPXv2OMa3N998U23atNHGjRvVpUuXM253NiUlJXrppZcUFxfnWHbllVeWW2fevHkKCgrSmjVrdN111znaDAoKUnh4uGO9J554QuPHj1diYqIkqUmTJnryySf10EMPafLkyX//Q0I5lg2A4eHh5aa0JSkzM1MBAQHy9fU94zbe3t7nPKcCAAAz9OrVS3PmzCm3rF69euW+7ty582nbxcTElAtx27ZtU1RUVLnJjdatWysoKEjbtm1zBMC/bnc2Xl5eateuXbllmZmZevTRR7V69WplZWWprKxMhYWFSktLO2dbP/30k7777rtyM35lZWU6ceKECgsLuYH3ebJsAOzWrZs+//zzcstWrFihbt26mVQRAKAm8fV016//NueiQF9P9/Na39/fX82aNfvbdSqyrKL9VYSvr+9pj9RLTEzU4cOH9cILLygmJkbe3t7q1q2biouLz9nWsWPH9MQTT+iGG2447Xs86eP8uUwAPHbsmFJTUx1f79mzR8nJyapXr56io6M1YcIE7d+/X2+++aYk6Z577tGsWbP00EMPacSIEfr666/1/vvva+nSpWa9BQBADWKz2c7rY1hXcNFFFyk9PV3p6emOWcBff/1VOTk5at26tVP6+O677/TSSy/pmmuukSSlp6crOzu73Dqenp4qKysrt6xjx45KSUn526CLinGZPfvHH39Ur169HF+fOlcvMTFRr7/+ug4ePFhuerlx48ZaunSpxowZoxdeeEGNGjXSK6+8wi1gAAC1TlFRkTIyMsot8/DwUEhIyHm1k5CQoIsvvljDhg3TzJkzVVpaqvvuu089e/Y840fIF6J58+Z666231LlzZ+Xl5WncuHGnnXoVGxurlStXqnv37vL29lZwcLAmTZqk6667TtHR0brpppvk5uamn376SVu3btV//vMfp9RmJS5zFfAVV1whwzBOe516usfrr7+u1atXn7bN5s2bVVRUpF27dumOO+6o9roBAKisZcuWKSIiotyrR48e592OzWbTp59+quDgYF1++eVKSEhQkyZNtHDhQqfVOn/+fB09elQdO3bUbbfdpgcffFChoaHl1pkxY4ZWrFihqKgodejQQdLJW7UtWbJEX375pbp06aKuXbvq+eefV0xMjNNqsxKbURXXmltEXl6eAgMDlZubq4CAALPLAQBcoBMnTmjPnj3nvK8dapdz/U4Zv11oBhAAAAAVQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAfseNMVwHv8tzIwACACzP09NTklRYWGhyJXCWU7/LU79blOcyTwIBAOBCubu7KygoSFlZWZIkPz+/055hi9rBMAwVFhYqKytLQUFBcnc/v+cqWwUBEAAASeHh4ZLkCIGo3YKCghy/U5yOAAgAgE4+Bi0iIkKhoaEqKSkxuxxUgqenJzN/f4MACADAn7i7uxMe4PK4CAQAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxbhUAJw9e7ZiY2Pl4+Oj+Ph4bdiw4Zzrz5w5Uy1btpSvr6+ioqI0ZswYnThxopqqBQAAMIfLBMCFCxdq7Nixmjx5spKSkhQXF6c+ffooKyvrjOsvWLBA48eP1+TJk7Vt2zbNnz9fCxcu1MSJE6u5cgAAgOrlMgHwueee0913363hw4erdevWmjt3rvz8/PTqq6+ecf3vv/9e3bt319ChQxUbG6vevXtryJAhfztrCAAAUNu5RAAsLi7Wpk2blJCQ4Fjm5uamhIQErVu37ozbXHrppdq0aZMj8O3evVuff/65rrnmmmqpGQAAwCweZhfgDNnZ2SorK1NYWFi55WFhYdq+ffsZtxk6dKiys7PVo0cPGYah0tJS3XPPPef8CLioqEhFRUWOr/Py8pzzBgAAAKqRS8wAXojVq1drypQpeumll5SUlKSPPvpIS5cu1ZNPPnnWbaZOnarAwEDHKyoqqhorBgAAcA6bYRiG2UVUVnFxsfz8/LRo0SINGjTIsTwxMVE5OTn69NNPT9vmsssuU9euXTV9+nTHsrffflv/93//p2PHjsnN7fRsfKYZwKioKOXm5iogIMC5bwoAAFSJvLw8BQYGWnr8dokZQC8vL3Xq1EkrV650LLPb7Vq5cqW6det2xm0KCwtPC3nu7u6SpLNlYm9vbwUEBJR7AQAA1DYucQ6gJI0dO1aJiYnq3LmzLrnkEs2cOVMFBQUaPny4JOn2229Xw4YNNXXqVElS//799dxzz6lDhw6Kj49XamqqHnvsMfXv398RBAEAAFyRywTAwYMH69ChQ5o0aZIyMjLUvn17LVu2zHFhSFpaWrkZv0cffVQ2m02PPvqo9u/frwYNGqh///566qmnzHoLAAAA1cIlzgE0C+cQAABQ+zB+u8g5gAAAAKg4AiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABZDAAQAALAYAiAAAIDFEAABAAAshgAIAABgMQRAAAAAiyEAAgAAWAwBEAAAwGIIgAAAABbjUgFw9uzZio2NlY+Pj+Lj47Vhw4Zzrp+Tk6ORI0cqIiJC3t7eatGihT7//PNqqhYAAMAcHmYX4CwLFy7U2LFjNXfuXMXHx2vmzJnq06ePUlJSFBoaetr6xcXFuvrqqxUaGqpFixapYcOG2rt3r4KCgqq/eAAAgGpkMwzDMLsIZ4iPj1eXLl00a9YsSZLdbldUVJQeeOABjR8//rT1586dq+nTp2v79u3y9PS8oD7z8vIUGBio3NxcBQQEVKp+AABQPRi/XeQj4OLiYm3atEkJCQmOZW5ubkpISNC6devOuM1nn32mbt26aeTIkQoLC1Pbtm01ZcoUlZWVVVfZAAAApnCJj4Czs7NVVlamsLCwcsvDwsK0ffv2M26ze/duff311xo2bJg+//xzpaam6r777lNJSYkmT558xm2KiopUVFTk+DovL895bwIAAKCauMQM4IWw2+0KDQ3VvHnz1KlTJw0ePFiPPPKI5s6de9Ztpk6dqsDAQMcrKiqqGisGAABwjhoTAE+cOHHB24aEhMjd3V2ZmZnllmdmZio8PPyM20RERKhFixZyd3d3LLvooouUkZGh4uLiM24zYcIE5ebmOl7p6ekXXDMAAIBZTA2AdrtdTz75pBo2bKg6depo9+7dkqTHHntM8+fPr3A7Xl5e6tSpk1auXFmu7ZUrV6pbt25n3KZ79+5KTU2V3W53LNuxY4ciIiLk5eV1xm28vb0VEBBQ7gUAAFDbmBoA//Of/+j111/XM888Uy50tW3bVq+88sp5tTV27Fi9/PLLeuONN7Rt2zbde++9Kigo0PDhwyVJt99+uyZMmOBY/95779WRI0c0atQo7dixQ0uXLtWUKVM0cuRI57w5AACAGsrUi0DefPNNzZs3T1dddZXuuecex/K4uLizXrxxNoMHD9ahQ4c0adIkZWRkqH379lq2bJnjwpC0tDS5uf2Rd6OiorR8+XKNGTNG7dq1U8OGDTVq1Cg9/PDDznlzAAAANZSp9wH09fXV9u3bFRMTo7p16+qnn35SkyZN9Ouvv+qSSy7RsWPHzCqtQriPEAAAtQ/jt8kfAbdu3VrffvvtacsXLVqkDh06mFARAACA6zP1I+BJkyYpMTFR+/fvl91u10cffaSUlBS9+eabWrJkiZmlAQAAuCxTZwAHDhyoxYsX66uvvpK/v78mTZqkbdu2afHixbr66qvNLA0AAMBlucyzgM3AOQQAANQ+jN8mzwA2adJEhw8fPm15Tk6OmjRpYkJFAAAArs/UAPjbb7+prKzstOVFRUXav3+/CRUBAAC4PlMuAvnss88c/16+fLkCAwMdX5eVlWnlypWKjY01oTIAAADXZ0oAHDRokCTJZrMpMTGx3Pc8PT0VGxurGTNmmFAZAACA6zMlAJ56/m7jxo21ceNGhYSEmFEGAACAJZl6H8A9e/aY2T0AAIAlmRoAJamgoEBr1qxRWlqaiouLy33vwQcfNKkqAAAA12VqANy8ebOuueYaFRYWqqCgQPXq1VN2drb8/PwUGhpKAAQAAKgCpt4GZsyYMerfv7+OHj0qX19f/fDDD9q7d686deqkZ5991szSAAAAXJapATA5OVn//Oc/5ebmJnd3dxUVFSkqKkrPPPOMJk6caGZpAAAALsvUAOjp6Sk3t5MlhIaGKi0tTZIUGBio9PR0M0sDAABwWaaeA9ihQwdt3LhRzZs3V8+ePTVp0iRlZ2frrbfeUtu2bc0sDQAAwGWZOgM4ZcoURURESJKeeuopBQcH695779WhQ4c0b948M0sDAABwWabNABqGodDQUMdMX2hoqJYtW2ZWOQAAAJZh2gygYRhq1qwZ5/oBAABUM9MCoJubm5o3b67Dhw+bVQIAAIAlmXoO4NNPP61x48Zp69atZpYBAABgKTbDMAyzOg8ODlZhYaFKS0vl5eUlX1/fct8/cuSISZVVTF5engIDA5Wbm6uAgACzywEAABXA+G3ybWBmzpxpZvcAAACWZGoATExMNLN7AAAASzL1HEAAAABUPwIgAACAxRAAAQAALIYACAAAYDGmBcCSkhJ5eHhwD0AAAIBqZloA9PT0VHR0tMrKyswqAQAAwJJM/Qj4kUce0cSJE2v8DZ8BAABcian3AZw1a5ZSU1MVGRmpmJgY+fv7l/t+UlKSSZUBAAC4LlMD4KBBg8zsHgAAwJJMfRZwbcezBAEAqH0Yv02eATxl06ZN2rZtmySpTZs26tChg8kVAQAAuC5TA2BWVpZuueUWrV69WkFBQZKknJwc9erVS++9954aNGhgZnkAAAAuydSrgB944AHl5+frl19+0ZEjR3TkyBFt3bpVeXl5evDBB80sDQAAwGWZeg5gYGCgvvrqK3Xp0qXc8g0bNqh3797Kyckxp7AK4hwCAABqH8Zvk2cA7Xa7PD09T1vu6ekpu91uQkUAAACuz9QAeOWVV2rUqFE6cOCAY9n+/fs1ZswYXXXVVSZWBgAA4LpMDYCzZs1SXl6eYmNj1bRpUzVt2lSNGzdWXl6eXnzxRTNLAwAAcFmmXgUcFRWlpKQkffXVV9q+fbsk6aKLLlJCQoKZZQEAALg00wJgSUmJfH19lZycrKuvvlpXX321WaUAAABYimkfAXt6eio6OlplZWVmlQAAAGBJpp4D+Mgjj2jixIk6cuSImWUAAABYiqnnAM6aNUupqamKjIxUTEyM/P39y30/KSnJpMoAAABcl6kBcNCgQWZ2DwAAYEmmBcDS0lLZbDaNGDFCjRo1MqsMAAAAyzHtHEAPDw9Nnz5dpaWlZpUAAABgSaY/CWTNmjVmlgAAAGA5pp4D2K9fP40fP15btmxRp06dTrsIZMCAASZVBgAA4LpshmEYZnXu5nb2CUibzVbj7xGYl5enwMBA5ebmKiAgwOxyAABABTB+mzwDaLfbzeweAADAkkw9BxAAAADVz5QAeM011yg3N9fx9dNPP62cnBzH14cPH1br1q1NqAwAAMD1mRIAly9frqKiIsfXU6ZMKfc4uNLSUqWkpJhRGgAAgMszJQD+9boTE69DAQAAsByXOgdw9uzZio2NlY+Pj+Lj47Vhw4YKbffee+/JZrPxaDoAAGAJpgRAm80mm8122rLKWLhwocaOHavJkycrKSlJcXFx6tOnj7Kyss653W+//aZ//etfuuyyyyrVPwAAQG1hyn0A3dzc1K9fP3l7e0uSFi9erCuvvNJxI+iioiItW7bsvO4DGB8fry5dumjWrFmSTt5iJioqSg888IDGjx9/xm3Kysp0+eWXa8SIEfr222+Vk5OjTz75pMJ9ch8hAABqH8Zvk+4DmJiYWO7rW2+99bR1br/99gq3V1xcrE2bNmnChAmOZW5ubkpISNC6devOut2///1vhYaG6s4779S33377t/0UFRWVu3glLy+vwjUCAADUFKYEwNdee82p7WVnZ6usrExhYWHlloeFhWn79u1n3Gbt2rWaP3++kpOTK9zP1KlT9cQTT1SmVAAAANO51EUgFZWfn6/bbrtNL7/8skJCQiq83YQJE5Sbm+t4paenV2GVAAAAVcPUR8E5S0hIiNzd3ZWZmVlueWZmpsLDw09bf9euXfrtt9/Uv39/x7JTj6Xz8PBQSkqKmjZtetp23t7ejvMWAQAAaiuXmAH08vJSp06dtHLlSscyu92ulStXqlu3bqet36pVK23ZskXJycmO14ABA9SrVy8lJycrKiqqOssHAACoVi4xAyhJY8eOVWJiojp37qxLLrlEM2fOVEFBgYYPHy7p5EUlDRs21NSpU+Xj46O2bduW2z4oKEiSTlsOAADgalwmAA4ePFiHDh3SpEmTlJGRofbt22vZsmWOC0PS0tLk5uYSE54AAACVYsp9AF0F9xECAKD2Yfx2kXMAAQAAUHEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAIshAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEwBrKMAyzSwAAAC6KAFgD7cjM18DZ3+mbHYcIggAAwOkIgDXQf1fu1M/7cnX7qxs07JX1+ik9x+ySAACACyEA1kD/HthWI7o3lpe7m77fdVgDZ3+nke8kaU92gdmlAQAAF2Az+IzxguXl5SkwMFC5ubkKCAhwevvpRwr1/Fc79PHm/TIMyd3Nplu6RGnUVc0VGuDj9P4AALCCqh6/awMCYCVU1w607WCepi9P0dfbsyRJvp7uGtEjVv+vZ1MF+HhWWb8AALgiAiABsFKqewfasOeInv5im5LSciRJQX6eur9XM93aNUY+nu5V3j8AAK6AAEgArBQzdiDDMPTlr5mavjxFqVnHJEkNg3w15uoWur5DQ7m72aqlDgAAaisCIAGwUszcgUrL7PowaZ+eX7FTGXknJEktw+rqob4tdWWrUNlsBEEAAM6EAEgArJSasAOdKCnTG9//ptmrUpV3olSS1CU2WOP7tVKnmHqm1AQAQE1WE8ZvsxEAK6Em7UC5hSWas2aXXvtuj4pK7ZKkq1uH6aE+LdU8rK6ptQEAUJPUpPHbLATASqiJO9DB3ON64audev/HdNkNyc0m3dixkcZc3UKRQb5mlwcAgOlq4vhd3QiAlVCTd6DUrHxNX56i5b9kSpK8PNx0x6Wxuu+Kpgry8zK5OgAAzFOTx+/qQgCshNqwAyWlHdXTX2zXhj1HJEl1fTx07xVNNfzSxvL14tYxAADrqQ3jd1UjAFZCbdmBDMPQ6pRDmrZsu7Zn5EuSwgK8NeqqFrq5cyN5uPNEQACAddSW8bsqudTIP3v2bMXGxsrHx0fx8fHasGHDWdd9+eWXddlllyk4OFjBwcFKSEg45/q1mc1mU69WoVr64GV67uY4NQzyVWZekSZ+vEUPLfpZ/A0AAIC1uEwAXLhwocaOHavJkycrKSlJcXFx6tOnj7Kyss64/urVqzVkyBCtWrVK69atU1RUlHr37q39+/dXc+XVx93Nphs6NtLX/+qpR6+9SO5uNn20eb8++HGf2aUBAIBq5DIfAcfHx6tLly6aNWuWJMlutysqKkoPPPCAxo8f/7fbl5WVKTg4WLNmzdLtt99eoT5r+xTyS6tT9cyyFPl4uumz+3uoBbeLAQBYQG0fv53BJWYAi4uLtWnTJiUkJDiWubm5KSEhQevWratQG4WFhSopKVG9eme/eXJRUZHy8vLKvWqzey5vqstbNNCJErvueydJhcWlZpcEAACqgUsEwOzsbJWVlSksLKzc8rCwMGVkZFSojYcffliRkZHlQuRfTZ06VYGBgY5XVFRUpeo2m5ubTc/dHKfQut5KzTqmSZ/+YnZJAACgGrhEAKysp59+Wu+9954+/vhj+fj4nHW9CRMmKDc31/FKT0+vxiqrRkgdb/13SAe52aRFm/bpw02cDwgAgKtziQAYEhIid3d3ZWZmlluemZmp8PDwc2777LPP6umnn9aXX36pdu3anXNdb29vBQQElHu5gq5N6mt0QgtJ0qOfbFVqVr7JFQEAgKrkEgHQy8tLnTp10sqVKx3L7Ha7Vq5cqW7dup11u2eeeUZPPvmkli1bps6dO1dHqTXWyF7N1L1ZfR0vKdPIdzbreHGZ2SUBAIAq4hIBUJLGjh2rl19+WW+88Ya2bdume++9VwUFBRo+fLgk6fbbb9eECRMc60+bNk2PPfaYXn31VcXGxiojI0MZGRk6duyYWW/BVO5uNs0c3EEhdbyVkpmvJxZzPiAAAK7KZQLg4MGD9eyzz2rSpElq3769kpOTtWzZMseFIWlpaTp48KBj/Tlz5qi4uFg33XSTIiIiHK9nn33WrLdgugZ1vfXCLe1ls0nvbUzXp8mue09EAACszGXuA2gGV72P0HMrdui/K3fK38tdix/ooSYN6phdEgAATuOq4/f5cJkZQDjPqKuaq2uTeiooLtPIBZt1ooTzAQEAcCUEQJzG3c2mF27poPr+Xtp2ME//Wfqr2SUBAAAnIgDijMICfPTc4PaSpLd/SNOSnw+YWxAAAHAaAiDOqmeLBrrviqaSpPEfbtHewwUmVwQAAJyBAIhzGnt1C3WJDdaxolKNXJCkolLOBwQAoLYjAOKcPNzd9N8hHRTs56mt+/M09fPtZpcEAAAqiQCIvxUR6Kvnbm4vSXr9+9+0bGuGuQUBAIBKIQCiQnq1CtX/u7yJJOmhRT8p/UihyRUBAIALRQBEhf2rT0t1iA5S3olS3f/uZhWX2s0uCQAAXAACICrM091NLw7poEBfT/2UnqNnlnE+IAAAtREBEOelUbCfpt/UTpL0yto9+urXTJMrAgAA54sAiPPWu024RnRvLEn65wc/aX/OcZMrAgAA54MAiAsyvl8rxTUKVO7xEj2wIEklZa55PqDdbmjtzmw9/tkvevuHvZz3CABwCTbDMAyzi6it8vLyFBgYqNzcXAUEBJhdTrVLP1Koa/77rfJPlOqenk01vl8rs0tymsPHivTBpn16b0Oafjv8xxXP0fX89M/eLdS/XaTc3GwmVggAuFBWH78lAmClsANJy7Ye1D1vJ0mSXhveRb1ahppc0YUzDEPrdh/WgvVpWv5LhkrKTh4adb09dHWbMH2zI1vZx4okSW0iA/Rw31a6rHmIbDaCIADUJozfBMBKYQc6afKnW/XGur2q5++lzx+8TOGBPmaXdF6OFhTrw6R9WrA+Tbuz/3jecVyjQA2Nj1b/uEj5eXmooKhUr67do/99s1vHikolSZc2ra+H+7ZSXFSQSdUDAM4X4zcBsFLYgU4qKi3TjXO+19b9eboktp4W3B0vD/eafXqpYRjasOeIFmxI0xdbMlT8+zmM/l7uGtihoYZeEq22DQPPuO2RgmLNXpWqt9btdWx37cUR+mfvFmrSoE61vQcAwIVh/CYAVgo70B9+yy7QdS+u1bGiUt3fq5n+1ael2SWdUU5hsT5M2q93N6QpNeuYY3nbhgEaekmMBrSPVB1vjwq1te9ooZ5bsUMfb94vw5Dc3Wwa3CVKo69qrtCA2jULCgBWwvhNAKwUdqDyFv90QA+8u1k2m/TmiEt0WfMGZpck6eRs36a9R7VgfZqWbjmoot+v5PXzcteAuEgNjY9Wu0ZBF9z+9ow8PbMsRV9vz5Ik+Xq6a0SPWP2/nk0V4OPpjLcAAHAixm8CYKWwA51u4sdbtGB9mur7e+mLUZeZOhOWe7xEn2zerwXr05SSme9YflFEgIbGR2tQ+0jVdWJA27DniJ7+YpuS0nIkSUF+nrq/VzPd2jVGPp7uTusHAFA5jN8EwEphBzrdiZIyDZr9nbZn5Ktbk/p6+654uVfj7VIMw9Dm9By9uz5Ni38+oBMlJ2f7fDzd1L/dydm+9lFBVXblrmEY+vLXTE1fnuL4iLlhkK/GXN1C13doWK0/CwDAmTF+EwArhR3ozHYdOqb+L65VYXGZRic01+iEFlXeZ/6Jk7N976xP0/aMP2b7WobVPTnb16GhAn2r7+PY0jK7Pkzap+dX7FRG3glHLeP6tNRVF4Vy6xgAMBHjNwGwUtiBzu6Tzfs1emGybDbpxo6N5OledYEn/0SpVm7L0vGSMkmSt4ebrm0XoWHx0eoYHWxq2DpRUqY3vv9Ns1elKu/EyVvHdI4J1vh+rdQ5tp5pdQGAlTF+EwArhR3o3B5e9LMW/phebf01C62joZdE64aODRXk51Vt/VZEbmGJ5qzZpde+2+O4CCXhojA91LelWoTVNbk6ALAWxm8CYKWwA51bcaldnyTvV9bvH4FWFZvNpi6x9dQl1tzZvoo4mHtcL3y1U+//mC67Ibn9PkM65uoWigzyNbs8ALAExm8CYKWwA+FCpWbla/ryFC3/JVOS5OXhpsRuMRrcJUqNgv24ahgAqhDjNwGwUtiBUFlJaUc17YvtWr/nSLnl4QE+iq7np+j6fif/+6d/1/f3qvEznQBQkzF+EwArhR0IzmAYhlbvOKSXVqVq28F8x3OGz8bfy11R9f4IhjH1/RxfNwr2k5dHzX4MHwCYjfGbAFgp7EBwNsMwdLSwRGlHCrX3cIHSjxT+/u9CpR8p1MG8EzrXEWuzSZGBvoqq5/t7OPR3hMOYen4K8vNk9hCA5TF+EwArhR0I1a2otEz7jh5X2pGTgXDv4cJy/z51K5yzqevtobo+FXvWcWV0bVpfTwxo49QnrQCAszB+EwArhR0INYlhGMo+Vqy0I4VKO1KgtMPH//j3kUJl5hVVaz3NQuto3m2d1KRBnWrtFwD+DuM3AbBS2IFQm5woKdO+o4UqLD73LGFlZR8r0sSPtioj74Tq+njov7d0UK9WoVXaJwCcD8ZvAmClsAMBZ5aVf0L3vp2kTXuPymaT/tW7pe67oinnHwKoERi/JS4XBOB0oXV99O7dXTU0PlqGIU1fnqKRC5JU8DdXOAMAqgcBEECV8PJw05TrL9ZT17eVp7tNn2/J0A0vfa+9hwvMLg0ALI8ACKBKDYuP0bt3d1VIHW+lZOZrwKzv9O3OQ2aXBQCWRgAEUOU6x9bTkgd6KC4qSLnHS5T46gbN+2aXOAUZAMxBAARQLcIDfbTw/7rqH50ayW5IUz7frtELk3W8iq9KBgCcjgAIoNr4eLrrmZva6d8D28jDzaZPkw/oprnfa9/RQrNLAwBL4TYwlcBl5MCF+2H3Yd33TpKOFBSrnr+XZg/tqG5N65tdlsrshr7ZeUiLNu1TUUmZujUNUY9mIWoRVofb2KDGOVFS5nhk5J8fG5mVXyRDVTu8+3t56J4rmqpXy9p3n0/GbwJgpbADAZWzP+e4/u/NH/XLgTy5u9n06LUX6Y5LY00JWll5J/T+j+l6d0O69uccP+37oXW91aNZiLo3C1GP5iEKC/Cp9hphPX884efkE33SDh/X3iN/PCe8up/wcyaDO0fpkesuUkAtevQj4zcBsFLYgYDKO15cpgkf/axPkg9Ikm7s2EhPXd9WPp7uVd633W5obWq2FqxP01fbMlVqP/m/wwAfD93YqZHCA3z03a7D2rDnsE6U2Mtt2yKsjro3C9FlzUMU37i+/L2r/hnLcE1/fsZ32uE/ZvNO/bsiz/iOru+n6Hq/v+r7KSLQR25V/IfUmh2H9Pr3v8kwpIhAH027sZ0ub9GgSvt0FsZvAmClsAMBzmEYhuav3aMpn2+T3ZDiGgVq7m2dFBHoWyX9Hcov0geb0vXehnSlHfnj/MNOMcEaekm0rm0XUS6AnigpU9Leo1qbmq21qdnasj9Xf/4/p4ebTR2jg9Wj+cnZwXYNA+XhzinWOF1qVr6W/5Kp37JPzuilHynUwbwTOtdIbLNJkYG+5QJeVD0/xfz+dZCfp2mnJ2zYc0TjFv2kvYdPHkdDLonWI9depDo1/A8ixm8CYKWwAwHOtXZntu5/N0k5hSUKqeOlObd2UpfYek5p2243tG73YS1Yn6Yvf81QSdnJ//XV9fHQDR0aakh8tFqFV+w4PlpQrHW7D+vbndlam3pI6UfKf2Rc18dD3ZrU12XNT35k3DjEn/MHLe5AznE9v2KHPkzaJ/sZRl0/L3dHwIv5fTYvqp6fYur7KzLIR94eVT8jfqEKi0v1zLIUvf79b5KkhkG+euamdureLMTcws6B8ZsAWCnsQIDzpR0u1P+99aO2Z+TLw82mxwe00a1dYy64vSMFxVq0KV0L1qfpt8N/zPa1jwrS0PhoXdcuQn5elZutSDtcqG9TD2ntzmx9v+uwco+XlPt+wyDfk+cPNg9R96b1Vb+Od6X6Q+2RU1isl1bv0uvf/6bi0pOnEVzZKlTto4IU8/tMXnQ9P9X396r1fySs23VY4xb9pH1HT/5BdGvXaE3od1GNPD2C8ZsAWCnsQEDVKCwu1bhFP2vpzwclnfxY6fEBrSs8C2IYhn7YfUQLNqRp+dYMFZedHHjreHtoUIdIDb0kRq0jq+aYLbMb2ro/9+THxTuztWnvUUf/p7SJDFCP3y8maRUeILfaPe5XG39vj2o5N9QZjheX6bXv92jO6l3KP3HyGdhdm9TTw31bqUN0sMnVVZ2ColI9/cV2vfXDXklSo2BfTb8prkZc4f9njN8EwEphBwKqjmEYmrtmt55Zvl2GcfL8vDnDOir0HFffHi0o1odJ+7RgQ5p2H/rjmcPtGgVq6CXR6h8XWe2zEYXFpdqw54i+S83WtzuztT0jv1r7dyVe7m7qd3G4hl4SrUsa16uRM2alZXa9/+M+vbByh+MK3YsiAvRw35bq2aJBjay5Knyfmq1xi352XFGf2C1GD/drVenZdmdh/CYAVgo7EFD1VqVk6cF3Nyv/RKnCArw159ZO6vinGRTDMLTxt6NasH6vPt+a4fiYzc/LXQPbN9Sw+Gi1bRhoVvmnOZRfpO93nQyD36Vm62DuCbNLqpWahdbRkEuidWPHhgry8zK7HBmGoWVbMzR9eYp2Z5/846NRsK/+1bulBsRFys2C07zHiko15fNtWrA+TZIUXc9P029qp/gm5s8GMn4TACuFHQioHnuyC3T3mz8qNeuYvNzd9J9BbdWnTbg+2rxPC9anaWfWMce6bSIDNDQ+WgPbN6zxVyLi/Py8L0cL1qfps58OqPD3Rwh6e7jp2osjNDQ+Wp1igk2ZYft+V7amLUvRT+k5kqR6/l564MpmGhofXaMv3qgu3+w4pPEf/qwDuSdks0l3XBqrh/q0kq+XeT8bxm8CYKWwAwHV51hRqcYuTNaXv2ZKOvlx4Klz63w93TUgLlJD46PVrlGgZT5ms6r8EyX6JPmAFqxP07aDeY7lLcPqasglUbq+YyMF+lb9TYl/OZCractS9M2OQ5JOzjrfdVkT3X1ZY9WtRTdFrg55J0o0Zek2vbcxXZIUW99Pz/4jTp2ddJX/edfD+E0ArAx2IKB62e2GXvw6Vc9/tUOS1Cq8robFR2tgh4a16ikEcA7DMJScfnJWcPHPBxw36/bxdNN17U7+QdAhKsjpfxCkHS7UjBUp+vT3m5d7uNk0LD5a91/ZXA3qcoX3uaxOydL4D7coI+/kbOCd3RvrX31aVvvFPYzfBMBKYQcCzPHzvhxJ0sUNme3DSbnHS/TJ5v1asD5NKZl/XGhz6o+EQR0aVnpWLvtYkWZ9nap31u913EdyQFyk/tm7hWLq+1eqbSvJPV6iJ5f8qkWb9kmSmoT4a/o/4tQppvqujmb8JgBWCjsQANQshmEoKe2o3lmfpqU/H1RRaeVPEzhWVKqXv9mtV77drYLfzz28rHmIHu7bqkZdYFTbfL09U+M/3KKs/CK52aS7L2uiMVe3qJbZQMZvAmClsAMBQM2VU1isj5L2a8GGNKVewIVCxaV2LVi/Vy9+narDBcWSTt5SaHzfVrq0Bj/lojbJLSzRE0t+0UdJ+yVJTRv4a8bN7dU+KqhK+2X8JgBWCjsQANR8Z7tVkL+Xuwac4VZBdruhxT8f0LNfpjge89c4xF//6t1S11wczmkHVWDFr5ma+PEWHfp9NvD/9Wyq0QnNq+wqasZvAmClsAMBQO3iuFn4+jTH/fqkP24W3qCut2Z8uUO//n51cYO63hqd0Fw3d46Sp7ubWWVbwtGCYj2++BfHxTUtwuro2X/EqV2jIKf3xfgtudTePHv2bMXGxsrHx0fx8fHasGHDOdf/4IMP1KpVK/n4+Ojiiy/W559/Xk2VAgDMEOzvpbsua6KV/+ypd+/uqv5xkfJ0t+nnfbka/9EW3fnGj/r1YJ7qentoXJ+WWjPuCg2LjyH8VYNgfy+9cEsHzb21k0LqeGlH5jFd/9L3mr0q1ezSXJLL7NELFy7U2LFjNXnyZCUlJSkuLk59+vRRVlbWGdf//vvvNWTIEN15553avHmzBg0apEGDBmnr1q3VXDkAoLrZbDZ1a1pfLw7poHUTrtL4fq0UU99Pvp7uuqtHY33zUC+N7NWsxjy6zEr6tg3Xl2N6qn9cpMrshoJrwJNeXJHLfAQcHx+vLl26aNasWZIku92uqKgoPfDAAxo/fvxp6w8ePFgFBQVasmSJY1nXrl3Vvn17zZ07t0J9MoUMAK7DMAzO76thvt+VrW5N6jv998L47SIzgMXFxdq0aZMSEhIcy9zc3JSQkKB169adcZt169aVW1+S+vTpc9b1JamoqEh5eXnlXgAA10D4q3kubRrC76WKuEQAzM7OVllZmcLCwsotDwsLU0ZGxhm3ycjIOK/1JWnq1KkKDAx0vKKioipfPAAAQDVziQBYXSZMmKDc3FzHKz093eySAAAAzptLnN0aEhIid3d3ZWZmlluemZmp8PDwM24THh5+XutLkre3t7y9ec4jAACo3VxiBtDLy0udOnXSypUrHcvsdrtWrlypbt26nXGbbt26lVtfklasWHHW9QEAAFyFS8wAStLYsWOVmJiozp0765JLLtHMmTNVUFCg4cOHS5Juv/12NWzYUFOnTpUkjRo1Sj179tSMGTN07bXX6r333tOPP/6oefPmmfk2AAAAqpzLBMDBgwfr0KFDmjRpkjIyMtS+fXstW7bMcaFHWlqa3Nz+mPC89NJLtWDBAj366KOaOHGimjdvrk8++URt27Y16y0AAABUC5e5D6AZuI8QAAC1D+O3i5wDCAAAgIojAAIAAFgMARAAAMBiCIAAAAAWQwAEAACwGAIgAACAxRAAAQAALIYACAAAYDEEQAAAAItxmUfBmeHUQ1Ty8vJMrgQAAFTUqXHbyg9DIwBWQn5+viQpKirK5EoAAMD5ys/PV2BgoNllmIJnAVeC3W7XgQMHVLduXdlsNqe2nZeXp6ioKKWnp1fZcwrpgz7ogz7ogz6s2IdhGMrPz1dkZKTc3Kx5NhwzgJXg5uamRo0aVWkfAQEBVf6gavqgD/qgD/qgD6v1YdWZv1OsGXsBAAAsjAAIAABgMQTAGsrb21uTJ0+Wt7c3fdAHfdAHfdAHfcCpuAgEAADAYpgBBAAAsBgCIAAAgMUQAAEAACyGAAgAAGAxBMAaZOrUqerSpYvq1q2r0NBQDRo0SCkpKU7tY86cOWrXrp3jxprdunXTF1984dQ+/urpp5+WzWbT6NGjndbm448/LpvNVu7VqlUrp7V/yv79+3Xrrbeqfv368vX11cUXX6wff/zRqX3Exsae9l5sNptGjhzplPbLysr02GOPqXHjxvL19VXTpk315JNPOv0ZmPn5+Ro9erRiYmLk6+urSy+9VBs3bqxUm99884369++vyMhI2Ww2ffLJJ+W+bxiGJk2apIiICPn6+iohIUE7d+50ah8fffSRevfurfr168tmsyk5Odmp76OkpEQPP/ywLr74Yvn7+ysyMlK33367Dhw44NT38fjjj6tVq1by9/dXcHCwEhIStH79eqf28Wf33HOPbDabZs6c6dQ+7rjjjtOOlb59+zr9fWzbtk0DBgxQYGCg/P391aVLF6WlpTmtjzMd8zabTdOnT3daH8eOHdP999+vRo0aydfXV61bt9bcuXMr3H5F+sjMzNQdd9yhyMhI+fn5qW/fvud9DFZk7Dtx4oRGjhyp+vXrq06dOrrxxhuVmZl5Xv2gPAJgDbJmzRqNHDlSP/zwg1asWKGSkhL17t1bBQUFTuujUaNGevrpp7Vp0yb9+OOPuvLKKzVw4ED98ssvTuvjzzZu3Kj//e9/ateundPbbtOmjQ4ePOh4rV271qntHz16VN27d5enp6e++OIL/frrr5oxY4aCg4Od2s/GjRvLvY8VK1ZIkv7xj384pf1p06Zpzpw5mjVrlrZt26Zp06bpmWee0YsvvuiU9k+56667tGLFCr311lvasmWLevfurYSEBO3fv/+C2ywoKFBcXJxmz559xu8/88wz+u9//6u5c+dq/fr18vf3V58+fXTixAmn9VFQUKAePXpo2rRpF/Qe/q6PwsJCJSUl6bHHHlNSUpI++ugjpaSkaMCAAU7rQ5JatGihWbNmacuWLVq7dq1iY2PVu3dvHTp0yGl9nPLxxx/rhx9+UGRk5Hm9h4r20bdv33LHzLvvvuvUPnbt2qUePXqoVatWWr16tX7++Wc99thj8vHxcVoff67/4MGDevXVV2Wz2XTjjTc6rY+xY8dq2bJlevvtt7Vt2zaNHj1a999/vz777DOn9GEYhgYNGqTdu3fr008/1ebNmxUTE6OEhITzGrcqMvaNGTNGixcv1gcffKA1a9bowIEDuuGGGyrcB87AQI2VlZVlSDLWrFlTpf0EBwcbr7zyitPbzc/PN5o3b26sWLHC6NmzpzFq1CintT158mQjLi7Oae2dycMPP2z06NGjSvs4k1GjRhlNmzY17Ha7U9q79tprjREjRpRbdsMNNxjDhg1zSvuGYRiFhYWGu7u7sWTJknLLO3bsaDzyyCNO6UOS8fHHHzu+ttvtRnh4uDF9+nTHspycHMPb29t49913ndLHn+3Zs8eQZGzevPmC2q5IH6ds2LDBkGTs3bu3yvrIzc01JBlfffWVU/vYt2+f0bBhQ2Pr1q1GTEyM8fzzz19Q+2frIzEx0Rg4cOAFt1mRPgYPHmzceuutVdrHXw0cONC48sorndpHmzZtjH//+9/lllXmmPxrHykpKYYkY+vWrY5lZWVlRoMGDYyXX375gvowjNPHvpycHMPT09P44IMPHOts27bNkGSsW7fugvuxOmYAa7Dc3FxJUr169aqk/bKyMr333nsqKChQt27dnN7+yJEjde211yohIcHpbUvSzp07FRkZqSZNmmjYsGHn9fFMRXz22Wfq3Lmz/vGPfyg0NFQdOnTQyy+/7NQ+/qq4uFhvv/22RowYIZvN5pQ2L730Uq1cuVI7duyQJP30009au3at+vXr55T2Jam0tFRlZWWnzZD4+vo6fWb2lD179igjI6Pc/hUYGKj4+HitW7euSvqsLrm5ubLZbAoKCqqS9ouLizVv3jwFBgYqLi7Oae3a7XbddtttGjdunNq0aeO0dv9q9erVCg0NVcuWLXXvvffq8OHDTmvbbrdr6dKlatGihfr06aPQ0FDFx8ef8+PuysrMzNTSpUt15513OrXdSy+9VJ999pn2798vwzC0atUq7dixQ71793ZK+0VFRZJU7rh3c3OTt7d3pY77v459mzZtUklJSbljvVWrVoqOjq71x7qZCIA1lN1u1+jRo9W9e3e1bdvWqW1v2bJFderUkbe3t+655x59/PHHat26tVP7eO+995SUlKSpU6c6td1T4uPj9frrr2vZsmWaM2eO9uzZo8suu0z5+flO62P37t2aM2eOmjdvruXLl+vee+/Vgw8+qDfeeMNpffzVJ598opycHN1xxx1Oa3P8+PG65ZZb1KpVK3l6eqpDhw4aPXq0hg0b5rQ+6tatq27duunJJ5/UgQMHVFZWprffflvr1q3TwYMHndbPn2VkZEiSwsLCyi0PCwtzfK82OnHihB5++GENGTJEAQEBTm17yZIlqlOnjnx8fPT8889rxYoVCgkJcVr706ZNk4eHhx588EGntflXffv21ZtvvqmVK1dq2rRpWrNmjfr166eysjKntJ+VlaVjx47p6aefVt++ffXll1/q+uuv1w033KA1a9Y4pY+/euONN1S3bl2nf6T54osvqnXr1mrUqJG8vLzUt29fzZ49W5dffrlT2j8VwiZMmKCjR4+quLhY06ZN0759+y74uD/T2JeRkSEvL6/T/iCq7ce62TzMLgBnNnLkSG3durVKZk9atmyp5ORk5ebmatGiRUpMTNSaNWucFgLT09M1atQorVix4rzOmTkff569ateuneLj4xUTE6P333/faX9F2+12de7cWVOmTJEkdejQQVu3btXcuXOVmJjolD7+av78+erXr98FnTt1Nu+//77eeecdLViwQG3atFFycrJGjx6tyMhIp76Pt956SyNGjFDDhg3l7u6ujh07asiQIdq0aZPT+nB1JSUluvnmm2UYhubMmeP09nv16qXk5GRlZ2fr5Zdf1s0336z169crNDS00m1v2rRJL7zwgpKSkpw2e30mt9xyi+PfF198sdq1a6emTZtq9erVuuqqqyrdvt1ulyQNHDhQY8aMkSS1b99e33//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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(gsr, 100);" ] }, { "cell_type": "markdown", "id": "fa4e3ee7-2900-4b30-9b85-066d4fa5db96", "metadata": {}, "source": [ "However, the RTL double-and-add does not error at all." ] }, { "cell_type": "code", "execution_count": 39, "id": "b4271143-5365-43b1-9767-d14feb278939", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 0 out of 100.\n", "k = 3: failed in 0 out of 100.\n", "k = 4: failed in 0 out of 100.\n", "k = 5: failed in 0 out of 100.\n", "k = 6: failed in 0 out of 100.\n", "k = 7: failed in 0 out of 100.\n", "k = 8: failed in 0 out of 100.\n", "k = 9: failed in 0 out of 100.\n", "k = 10: failed in 0 out of 100.\n", "k = 11: failed in 0 out of 100.\n", "k = 12: failed in 0 out of 100.\n", "k = 13: failed in 0 out of 100.\n", "k = 14: failed in 0 out of 100.\n", "k = 15: failed in 0 out of 100.\n", "k = 16: failed in 0 out of 100.\n", "k = 17: failed in 0 out of 100.\n", "k = 18: failed in 0 out of 100.\n", "k = 19: failed in 0 out of 100.\n", "k = 20: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "47d9731efeb64dde98f2d10d037c4073", "version_major": 2, "version_minor": 0 }, "image/png": "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YqLf4kb79u3VoEEDbdmyxRcAj93vRMLCwtSpUye/saKiIj3yyCNau3atiouL5fF4VF5eroKCgpPO9cUXX+hf//qX34qfx+PR4cOHVV5ezg28T5GxATA1NVXvvfee39iqVauUmprqUEcAgHNJZGiwvnzcmQ8FRoYGn9L2devWVevWrX91m5qM1bReTURGRh73lXoZGRnav3+/XnjhBSUlJSk8PFypqamqrKw86VyHDh3SY489pptuuum4n/FNH6cuYALgoUOHtG3bNt/z7du3Kz8/X40aNVLz5s01fvx47dq1SwsXLpQk3XvvvZo5c6b+9Kc/afjw4frggw/0xhtvaMWKFU69BADAOcTlcp3S27CB4KKLLtLOnTu1c+dO3yrgl19+qZKSErVv396WGv/617/0l7/8Rddff70kaefOndq3b5/fNqGhofJ4PH5j3bp109atW3816KJmAuZv9meffabevXv7nh+9Vi8jI0MLFizQnj17/JaXW7RooRUrVmjMmDF64YUX1KxZM7388svcAgYAcN6pqKhQYWGh31hISIgaN258SvOkpaXp4osv1pAhQzRjxgwdOXJE999/v3r16lXtW8ino02bNnr11VfVo0cPud1ujR079rhLr5KTk5WTk6PLL79c4eHhatiwoSZNmqTf/OY3at68uW655RYFBQXpiy++0ObNm/Xkk0/a0ptJAuZTwFdffbUsyzrucfTbPRYsWKC1a9cet8/nn3+uiooKffvtt7r77rtrvW8AAM5Udna24uPj/R5XXHHFKc/jcrn07rvvqmHDhrrqqquUlpamli1bavHixbb1Om/ePP3444/q1q2b7rrrLj344IOKiYnx22b69OlatWqVEhMT1bVrV0k/36pt+fLlev/999WzZ09deumlev7555WUlGRbbyZxWWfjs+aGcLvdio6OVmlpqaKiopxuBwBwmg4fPqzt27ef9L52OL+c7M+U83cArQACAACgZgiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAA/C9ujBE4+LM8OQIgAMB4oaGhkqTy8nKHO4Fdjv5ZHv2zhb+A+SYQAABOV3BwsBo0aKDi4mJJUp06dY77DlucHyzLUnl5uYqLi9WgQQMFB5/a9yqbggAIAICkuLg4SfKFQJzfGjRo4PszxfEIgAAA6OevQYuPj1dMTIyqqqqcbgdnIDQ0lJW/X0EABADgF4KDgwkPCHh8CAQAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMExABcBZs2YpOTlZERERSklJ0fr160+6/YwZM9S2bVtFRkYqMTFRY8aM0eHDh2upWwAAAGcETABcvHixMjMzNXnyZOXl5alz587q27eviouLq91+0aJFGjdunCZPnqwtW7Zo3rx5Wrx4sSZMmFDLnQMAANSugAmAzz33nH7/+99r2LBhat++vebMmaM6derolVdeqXb7f//737r88st1xx13KDk5WX369NHtt9/+q6uGAAAA57uACICVlZXauHGj0tLSfGNBQUFKS0vTunXrqt3nsssu08aNG32B77vvvtN7772n66+/vlZ6BgAAcEqI0w3YYd++ffJ4PIqNjfUbj42N1VdffVXtPnfccYf27dunK664QpZl6ciRI7r33ntP+hZwRUWFKioqfM/dbrc9LwAAAKAWBcQK4OlYu3atpkyZor/85S/Ky8vT22+/rRUrVuiJJ5444T5ZWVmKjo72PRITE2uxYwAAAHu4LMuynG7iTFVWVqpOnTp66623NHjwYN94RkaGSkpK9O677x63z5VXXqlLL71UzzzzjG/stdde0//7f/9Phw4dUlDQ8dm4uhXAxMRElZaWKioqyt4XBQAAzgq3263o6Gijz98BsQIYFham7t27Kycnxzfm9XqVk5Oj1NTUavcpLy8/LuQFBwdLkk6UicPDwxUVFeX3AAAAON8ExDWAkpSZmamMjAz16NFDl1xyiWbMmKGysjINGzZMkjR06FA1bdpUWVlZkqQBAwboueeeU9euXZWSkqJt27Zp4sSJGjBggC8IAgAABKKACYDp6enau3evJk2a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9evL5XLZOrfb7VZiYqJ27tx51r6nkBrUoAY1qEENE2tYlqWDBw8qISFBQUFmXg3HCuAZCAoKUrNmzc5qjaioqLP+RdXUoAY1qEENaphWw9SVv6PMjL0AAAAGIwACAAAYhgB4jgoPD9fkyZMVHh5ODWpQgxrUoAY1YCs+BAIAAGAYVgABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAzyFZWVnq2bOn6tevr5iYGA0ePFhbt261tcbs2bPVqVMn3401U1NT9c9//tPWGseaOnWqXC6XRo8ebducjz76qFwul9+jXbt2ts1/1K5du3TnnXfqggsuUGRkpC6++GJ99tlnttZITk4+7rW4XC6NGDHClvk9Ho8mTpyoFi1aKDIyUq1atdITTzxh+3dgHjx4UKNHj1ZSUpIiIyN12WWXacOGDWc054cffqgBAwYoISFBLpdLS5Ys8fu5ZVmaNGmS4uPjFRkZqbS0NH3zzTe21nj77bfVp08fXXDBBXK5XMrPz7f1dVRVVemhhx7SxRdfrLp16yohIUFDhw7V7t27bX0djz76qNq1a6e6deuqYcOGSktL06effmprjV+699575XK5NGPGDFtr3H333ccdK/369bP9dWzZskUDBw5UdHS06tatq549e6qgoMC2GtUd8y6XS88884xtNQ4dOqQHHnhAzZo1U2RkpNq3b685c+bUeP6a1CgqKtLdd9+thIQE1alTR/369TvlY7Am577Dhw9rxIgRuuCCC1SvXj3dfPPNKioqOqU68EcAPIfk5uZqxIgR+uSTT7Rq1SpVVVWpT58+Kisrs61Gs2bNNHXqVG3cuFGfffaZrrnmGg0aNEj//e9/bavxSxs2bNBf//pXderUyfa5O3TooD179vgeH3/8sa3z//jjj7r88ssVGhqqf/7zn/ryyy81ffp0NWzY0NY6GzZs8Hsdq1atkiT99re/tWX+adOmafbs2Zo5c6a2bNmiadOm6emnn9aLL75oy/xH/e53v9OqVav06quvatOmTerTp4/S0tK0a9eu056zrKxMnTt31qxZs6r9+dNPP60///nPmjNnjj799FPVrVtXffv21eHDh22rUVZWpiuuuELTpk07rdfwazXKy8uVl5eniRMnKi8vT2+//ba2bt2qgQMH2lZDki688ELNnDlTmzZt0scff6zk5GT16dNHe/futa3GUe+8844++eQTJSQknNJrqGmNfv36+R0z//jHP2yt8e233+qKK65Qu3bttHbtWv3nP//RxIkTFRERYVuNX/a/Z88evfLKK3K5XLr55pttq5GZmans7Gy99tpr2rJli0aPHq0HHnhAS5cutaWGZVkaPHiwvvvuO7377rv6/PPPlZSUpLS0tFM6b9Xk3DdmzBgtW7ZMb775pnJzc7V7927ddNNNNa6Balg4ZxUXF1uSrNzc3LNap2HDhtbLL79s+7wHDx602rRpY61atcrq1auXNWrUKNvmnjx5stW5c2fb5qvOQw89ZF1xxRVntUZ1Ro0aZbVq1cryer22zHfDDTdYw4cP9xu76aabrCFDhtgyv2VZVnl5uRUcHGwtX77cb7xbt27Www8/bEsNSdY777zje+71eq24uDjrmWee8Y2VlJRY4eHh1j/+8Q9bavzS9u3bLUnW559/flpz16TGUevXr7ckWTt27DhrNUpLSy1J1urVq22t8cMPP1hNmza1Nm/ebCUlJVnPP//8ac1/ohoZGRnWoEGDTnvOmtRIT0+37rzzzrNa41iDBg2yrrnmGltrdOjQwXr88cf9xs7kmDy2xtatWy1J1ubNm31jHo/HatKkifXSSy+dVg3LOv7cV1JSYoWGhlpvvvmmb5stW7ZYkqx169addh3TsQJ4DistLZUkNWrU6KzM7/F49Prrr6usrEypqam2zz9ixAjdcMMNSktLs31uSfrmm2+UkJCgli1basiQIaf09kxNLF26VD169NBvf/tbxcTEqGvXrnrppZdsrXGsyspKvfbaaxo+fLhcLpctc1522WXKycnR119/LUn64osv9PHHH6t///62zC9JR44ckcfjOW6FJDIy0vaV2aO2b9+uwsJCv79f0dHRSklJ0bp1685KzdpSWloql8ulBg0anJX5KysrNXfuXEVHR6tz5862zev1enXXXXdp7Nix6tChg23zHmvt2rWKiYlR27Ztdd9992n//v22ze31erVixQpdeOGF6tu3r2JiYpSSknLSt7vPVFFRkVasWKF77rnH1nkvu+wyLV26VLt27ZJlWVqzZo2+/vpr9enTx5b5KyoqJMnvuA8KClJ4ePgZHffHnvs2btyoqqoqv2O9Xbt2at68+Xl/rDuJAHiO8nq9Gj16tC6//HJ17NjR1rk3bdqkevXqKTw8XPfee6/eeecdtW/f3tYar7/+uvLy8pSVlWXrvEelpKRowYIFys7O1uzZs7V9+3ZdeeWVOnjwoG01vvvuO82ePVtt2rTRypUrdd999+nBBx/U3/72N9tqHGvJkiUqKSnR3Xffbduc48aN02233aZ27dopNDRUXbt21ejRozVkyBDbatSvX1+pqal64okntHv3bnk8Hr322mtat26d9uzZY1udXyosLJQkxcbG+o3Hxsb6fnY+Onz4sB566CHdfvvtioqKsnXu5cuXq169eoqIiNDzzz+vVatWqXHjxrbNP23aNIWEhOjBBx+0bc5j9evXTwsXLlROTo6mTZum3Nxc9e/fXx6Px5b5i4uLdejQIU2dOlX9+vXT+++/rxtvvFE33XSTcnNzbalxrL/97W+qX7++7W9pvvjii2rfvr2aNWumsLAw9evXT7NmzdJVV11ly/xHQ9j48eP1448/qrKyUtOmTdMPP/xw2sd9dee+wsJChYWFHfcPovP9WHdaiNMNoHojRozQ5s2bz8rqSdu2bZWfn6/S0lK99dZbysjIUG5urm0hcOfOnRo1apRWrVp1StfMnIpfrl516tRJKSkpSkpK0htvvGHbv6K9Xq969OihKVOmSJK6du2qzZs3a86cOcrIyLClxrHmzZun/v37n9a1Uyfyxhtv6O9//7sWLVqkDh06KD8/X6NHj1ZCQoKtr+PVV1/V8OHD1bRpUwUHB6tbt266/fbbtXHjRttqBLqqqirdeuutsixLs2fPtn3+3r17Kz8/X/v27dNLL72kW2+9VZ9++qliYmLOeO6NGzfqhRdeUF5enm2r19W57bbbfP998cUXq1OnTmrVqpXWrl2ra6+99ozn93q9kqRBgwZpzJgxkqQuXbro3//+t+bMmaNevXqdcY1jvfLKKxoyZIjt/7988cUX9cknn2jp0qVKSkrShx9+qBEjRighIcGWd2ZCQ0P19ttv65577lGjRo0UHBystLQ09e/f/7Q/ZHY2z33wxwrgOeiBBx7Q8uXLtWbNGjVr1sz2+cPCwtS6dWt1795dWVlZ6ty5s1544QXb5t+4caOKi4vVrVs3hYSEKCQkRLm5ufrzn/+skJAQ2/6l/ksNGjTQhRdeqG3bttk2Z3x8/HGh+KKLLrL9reajduzYodWrV+t3v/udrfOOHTvWtwp48cUX66677tKYMWNsX51t1aqVcnNzdejQIe3cuVPr169XVVWVWrZsaWudo+Li4iTpuE8CFhUV+X52Pjka/nbs2KFVq1bZvvonSXXr1lXr1q116aWXat68eQoJCdG8efNsmfujjz5ScXGxmjdv7jvud+zYoT/84Q9KTk62pUZ1WrZsqcaNG9t27Ddu3FghISG1dux/9NFH2rp1q+3H/U8//aQJEyboueee04ABA9SpUyc98MADSk9P17PPPmtbne7duys/P18lJSXas2ePsrOztX///tM67k907ouLi1NlZaVKSkr8tj9fj/VzBQHwHGJZlh544AG98847+uCDD9SiRYtaqev1en3Xctjh2muv1aZNm5Sfn+979OjRQ0OGDFF+fr6Cg4Ntq3XUoUOH9O233yo+Pt62OS+//PLjbkXw9ddfKykpybYavzR//nzFxMTohhtusHXe8vJyBQX5H+rBwcG+lQ671a1bV/Hx8frxxx+1cuVKDRo06KzUadGiheLi4pSTk+Mbc7vd+vTTT8/KNa1n09Hw980332j16tW64IILaqWuncf+XXfdpf/85z9+x31CQoLGjh2rlStX2lKjOj/88IP2799v27EfFhamnj171tqxP2/ePHXv3t3WazGln/9OVVVV1dqxHx0drSZNmuibb77RZ599dkrH/a+d+7p3767Q0FC/Y33r1q0qKCg47471cwlvAZ9DRowYoUWLFundd99V/fr1fdc2REdHKzIy0pYa48ePV//+/dW8eXMdPHhQixYt0tq1a239H3T9+vWPu26xbt26uuCCC2y7nvGPf/yjBgwYoKSkJO3evVuTJ09WcHCwbr/9dlvml36+7cBll12mKVOm6NZbb9X69es1d+5czZ0717YaR3m9Xs2fP18ZGRkKCbH3sBwwYICeeuopNW/eXB06dNDnn3+u5557TsOHD7e1zsqVK2VZltq2batt27Zp7NixateunYYNG3bacx46dMhvZWf79u3Kz89Xo0aN1Lx5c40ePVpPPvmk2rRpoxYtWmjixIlKSEjQ4MGDbatx4MABFRQU+O7LdzQYxMXF1Xj14WQ14uPjdcsttygvL0/Lly+Xx+PxHfuNGjVSWFjYGde44IIL9NRTT2ngwIGKj4/Xvn37NGvWLO3ateuUbjf0a7+rY4NraGio4uLi1LZtW1tqNGrUSI899phuvvlmxcXF6dtvv9Wf/vQntW7dWn379rXtdYwdO1bp6em66qqr1Lt3b2VnZ2vZsmVau3atbTWkn//B8uabb2r69Ok1nvdUavTq1Utjx45VZGSkkpKSlJubq4ULF+q5556zrcabb76pJk2aqHnz5tq0aZNGjRqlwYMHn9IHTX7t3BcdHa177rlHmZmZatSokaKiojRy5Eilpqbq0ksvrXEdHMPJjyDDn6RqH/Pnz7etxvDhw62kpCQrLCzMatKkiXXttdda77//vm3zn4jdt4FJT0+34uPjrbCwMKtp06ZWenq6tW3bNtvmP2rZsmVWx44drfDwcKtdu3bW3Llzba9hWZa1cuVKS5K1detW2+d2u93WqFGjrObNm1sRERFWy5YtrYcfftiqqKiwtc7ixYutli1bWmFhYVZcXJw1YsQIq6Sk5IzmXLNmTbXHREZGhmVZP98KZuLEiVZsbKwVHh5uXXvttaf8O/y1GvPnz6/255MnT7alxtHby1T3WLNmjS01fvrpJ+vGG2+0EhISrLCwMCs+Pt4aOHCgtX79elt/V8c6ndvAnKxGeXm51adPH6tJkyZWaGiolZSUZP3+97+3CgsLbX8d8+bNs1q3bm1FRERYnTt3tpYsWWJ7jb/+9a9WZGTkaR8nv1Zjz5491t13320lJCRYERERVtu2ba3p06ef0i2mfq3GCy+8YDVr1swKDQ21mjdvbj3yyCOn/P+Wmpz7fvrpJ+v++++3GjZsaNWpU8e68cYbrT179pxSHfhzWZbNXwcAAACAcxrXAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAPALV199tUaPHu10GwBwVhEAAQAADEMABAAAMAwBEABOYsWKFYqOjtbf//53p1sBANuEON0AAJyrFi1apHvvvVeLFi3Sb37zG6fbAQDbsAIIANWYNWuW7r//fi1btozwByDgsAIIAMd46623VFxcrH/961/q2bOn0+0AgO1YAQSAY3Tt2lVNmjTRK6+8IsuynG4HAGxHAASAY7Rq1Upr1qzRu+++q5EjRzrdDgDYjreAAaAaF154odasWaOrr75aISEhmjFjhtMtAYBtCIAAcAJt27bVBx98oKuvvlrBwcGaPn260y0BgC1cFhe4AAAAGIVrAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMP8f3ivl3fpP3JlAAAAAElFTkSuQmCC", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(GroupScalarRandomization(rtl), 100);" ] }, { "cell_type": "markdown", "id": "8eda1c29-f522-4c61-b445-c1c48278e88f", "metadata": {}, "source": [ "### Multiplicative splitting\n", "Multiplicative splitting has no reason to error out." ] }, { "cell_type": "code", "execution_count": 40, "id": "7cd5bbf5-46e4-4d27-a803-79e35585c250", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 0 out of 100.\n", "k = 3: failed in 0 out of 100.\n", "k = 4: failed in 0 out of 100.\n", "k = 5: failed in 0 out of 100.\n", "k = 6: failed in 0 out of 100.\n", "k = 7: failed in 0 out of 100.\n", "k = 8: failed in 0 out of 100.\n", "k = 9: failed in 0 out of 100.\n", "k = 10: failed in 0 out of 100.\n", "k = 11: failed in 0 out of 100.\n", "k = 12: failed in 0 out of 100.\n", "k = 13: failed in 0 out of 100.\n", "k = 14: failed in 0 out of 100.\n", "k = 15: failed in 0 out of 100.\n", "k = 16: failed in 0 out of 100.\n", "k = 17: failed in 0 out of 100.\n", "k = 18: failed in 0 out of 100.\n", "k = 19: failed in 0 out of 100.\n", "k = 20: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "99df3b12cefb467197220233057be69f", "version_major": 2, "version_minor": 0 }, "image/png": "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YqLf4kb79u3VoEEDbdmyxRcAj93vRMLCwtSpUye/saKiIj3yyCNau3atiouL5fF4VF5eroKCgpPO9cUXX+hf//qX34qfx+PR4cOHVV5ezg28T5GxATA1NVXvvfee39iqVauUmprqUEcAgHNJZGiwvnzcmQ8FRoYGn9L2devWVevWrX91m5qM1bReTURGRh73lXoZGRnav3+/XnjhBSUlJSk8PFypqamqrKw86VyHDh3SY489pptuuum4n/FNH6cuYALgoUOHtG3bNt/z7du3Kz8/X40aNVLz5s01fvx47dq1SwsXLpQk3XvvvZo5c6b+9Kc/afjw4frggw/0xhtvaMWKFU69BADAOcTlcp3S27CB4KKLLtLOnTu1c+dO3yrgl19+qZKSErVv396WGv/617/0l7/8Rddff70kaefOndq3b5/fNqGhofJ4PH5j3bp109atW3816KJmAuZv9meffabevXv7nh+9Vi8jI0MLFizQnj17/JaXW7RooRUrVmjMmDF64YUX1KxZM7388svcAgYAcN6pqKhQYWGh31hISIgaN258SvOkpaXp4osv1pAhQzRjxgwdOXJE999/v3r16lXtW8ino02bNnr11VfVo0cPud1ujR079rhLr5KTk5WTk6PLL79c4eHhatiwoSZNmqTf/OY3at68uW655RYFBQXpiy++0ObNm/Xkk0/a0ptJAuZTwFdffbUsyzrucfTbPRYsWKC1a9cet8/nn3+uiooKffvtt7r77rtrvW8AAM5Udna24uPj/R5XXHHFKc/jcrn07rvvqmHDhrrqqquUlpamli1bavHixbb1Om/ePP3444/q1q2b7rrrLj344IOKiYnx22b69OlatWqVEhMT1bVrV0k/36pt+fLlev/999WzZ09deumlev7555WUlGRbbyZxWWfjs+aGcLvdio6OVmlpqaKiopxuBwBwmg4fPqzt27ef9L52OL+c7M+U83cArQACAACgZgiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAA/C9ujBE4+LM8OQIgAMB4oaGhkqTy8nKHO4Fdjv5ZHv2zhb+A+SYQAABOV3BwsBo0aKDi4mJJUp06dY77DlucHyzLUnl5uYqLi9WgQQMFB5/a9yqbggAIAICkuLg4SfKFQJzfGjRo4PszxfEIgAAA6OevQYuPj1dMTIyqqqqcbgdnIDQ0lJW/X0EABADgF4KDgwkPCHh8CAQAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMExABcBZs2YpOTlZERERSklJ0fr160+6/YwZM9S2bVtFRkYqMTFRY8aM0eHDh2upWwAAAGcETABcvHixMjMzNXnyZOXl5alz587q27eviouLq91+0aJFGjdunCZPnqwtW7Zo3rx5Wrx4sSZMmFDLnQMAANSugAmAzz33nH7/+99r2LBhat++vebMmaM6derolVdeqXb7f//737r88st1xx13KDk5WX369NHtt9/+q6uGAAAA57uACICVlZXauHGj0tLSfGNBQUFKS0vTunXrqt3nsssu08aNG32B77vvvtN7772n66+/vlZ6BgAAcEqI0w3YYd++ffJ4PIqNjfUbj42N1VdffVXtPnfccYf27dunK664QpZl6ciRI7r33ntP+hZwRUWFKioqfM/dbrc9LwAAAKAWBcQK4OlYu3atpkyZor/85S/Ky8vT22+/rRUrVuiJJ5444T5ZWVmKjo72PRITE2uxYwAAAHu4LMuynG7iTFVWVqpOnTp66623NHjwYN94RkaGSkpK9O677x63z5VXXqlLL71UzzzzjG/stdde0//7f/9Phw4dUlDQ8dm4uhXAxMRElZaWKioqyt4XBQAAzgq3263o6Gijz98BsQIYFham7t27Kycnxzfm9XqVk5Oj1NTUavcpLy8/LuQFBwdLkk6UicPDwxUVFeX3AAAAON8ExDWAkpSZmamMjAz16NFDl1xyiWbMmKGysjINGzZMkjR06FA1bdpUWVlZkqQBAwboueeeU9euXZWSkqJt27Zp4sSJGjBggC8IAgAABKKACYDp6enau3evJk2a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9evL5XLZOrfb7VZiYqJ27tx51r6nkBrUoAY1qEENE2tYlqWDBw8qISFBQUFmXg3HCuAZCAoKUrNmzc5qjaioqLP+RdXUoAY1qEENaphWw9SVv6PMjL0AAAAGIwACAAAYhgB4jgoPD9fkyZMVHh5ODWpQgxrUoAY1YCs+BAIAAGAYVgABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAzyFZWVnq2bOn6tevr5iYGA0ePFhbt261tcbs2bPVqVMn3401U1NT9c9//tPWGseaOnWqXC6XRo8ebducjz76qFwul9+jXbt2ts1/1K5du3TnnXfqggsuUGRkpC6++GJ99tlnttZITk4+7rW4XC6NGDHClvk9Ho8mTpyoFi1aKDIyUq1atdITTzxh+3dgHjx4UKNHj1ZSUpIiIyN12WWXacOGDWc054cffqgBAwYoISFBLpdLS5Ys8fu5ZVmaNGmS4uPjFRkZqbS0NH3zzTe21nj77bfVp08fXXDBBXK5XMrPz7f1dVRVVemhhx7SxRdfrLp16yohIUFDhw7V7t27bX0djz76qNq1a6e6deuqYcOGSktL06effmprjV+699575XK5NGPGDFtr3H333ccdK/369bP9dWzZskUDBw5UdHS06tatq549e6qgoMC2GtUd8y6XS88884xtNQ4dOqQHHnhAzZo1U2RkpNq3b685c+bUeP6a1CgqKtLdd9+thIQE1alTR/369TvlY7Am577Dhw9rxIgRuuCCC1SvXj3dfPPNKioqOqU68EcAPIfk5uZqxIgR+uSTT7Rq1SpVVVWpT58+Kisrs61Gs2bNNHXqVG3cuFGfffaZrrnmGg0aNEj//e9/bavxSxs2bNBf//pXderUyfa5O3TooD179vgeH3/8sa3z//jjj7r88ssVGhqqf/7zn/ryyy81ffp0NWzY0NY6GzZs8Hsdq1atkiT99re/tWX+adOmafbs2Zo5c6a2bNmiadOm6emnn9aLL75oy/xH/e53v9OqVav06quvatOmTerTp4/S0tK0a9eu056zrKxMnTt31qxZs6r9+dNPP60///nPmjNnjj799FPVrVtXffv21eHDh22rUVZWpiuuuELTpk07rdfwazXKy8uVl5eniRMnKi8vT2+//ba2bt2qgQMH2lZDki688ELNnDlTmzZt0scff6zk5GT16dNHe/futa3GUe+8844++eQTJSQknNJrqGmNfv36+R0z//jHP2yt8e233+qKK65Qu3bttHbtWv3nP//RxIkTFRERYVuNX/a/Z88evfLKK3K5XLr55pttq5GZmans7Gy99tpr2rJli0aPHq0HHnhAS5cutaWGZVkaPHiwvvvuO7377rv6/PPPlZSUpLS0tFM6b9Xk3DdmzBgtW7ZMb775pnJzc7V7927ddNNNNa6Balg4ZxUXF1uSrNzc3LNap2HDhtbLL79s+7wHDx602rRpY61atcrq1auXNWrUKNvmnjx5stW5c2fb5qvOQw89ZF1xxRVntUZ1Ro0aZbVq1cryer22zHfDDTdYw4cP9xu76aabrCFDhtgyv2VZVnl5uRUcHGwtX77cb7xbt27Www8/bEsNSdY777zje+71eq24uDjrmWee8Y2VlJRY4eHh1j/+8Q9bavzS9u3bLUnW559/flpz16TGUevXr7ckWTt27DhrNUpLSy1J1urVq22t8cMPP1hNmza1Nm/ebCUlJVnPP//8ac1/ohoZGRnWoEGDTnvOmtRIT0+37rzzzrNa41iDBg2yrrnmGltrdOjQwXr88cf9xs7kmDy2xtatWy1J1ubNm31jHo/HatKkifXSSy+dVg3LOv7cV1JSYoWGhlpvvvmmb5stW7ZYkqx169addh3TsQJ4DistLZUkNWrU6KzM7/F49Prrr6usrEypqam2zz9ixAjdcMMNSktLs31uSfrmm2+UkJCgli1basiQIaf09kxNLF26VD169NBvf/tbxcTEqGvXrnrppZdsrXGsyspKvfbaaxo+fLhcLpctc1522WXKycnR119/LUn64osv9PHHH6t///62zC9JR44ckcfjOW6FJDIy0vaV2aO2b9+uwsJCv79f0dHRSklJ0bp1685KzdpSWloql8ulBg0anJX5KysrNXfuXEVHR6tz5862zev1enXXXXdp7Nix6tChg23zHmvt2rWKiYlR27Ztdd9992n//v22ze31erVixQpdeOGF6tu3r2JiYpSSknLSt7vPVFFRkVasWKF77rnH1nkvu+wyLV26VLt27ZJlWVqzZo2+/vpr9enTx5b5KyoqJMnvuA8KClJ4ePgZHffHnvs2btyoqqoqv2O9Xbt2at68+Xl/rDuJAHiO8nq9Gj16tC6//HJ17NjR1rk3bdqkevXqKTw8XPfee6/eeecdtW/f3tYar7/+uvLy8pSVlWXrvEelpKRowYIFys7O1uzZs7V9+3ZdeeWVOnjwoG01vvvuO82ePVtt2rTRypUrdd999+nBBx/U3/72N9tqHGvJkiUqKSnR3Xffbduc48aN02233aZ27dopNDRUXbt21ejRozVkyBDbatSvX1+pqal64okntHv3bnk8Hr322mtat26d9uzZY1udXyosLJQkxcbG+o3Hxsb6fnY+Onz4sB566CHdfvvtioqKsnXu5cuXq169eoqIiNDzzz+vVatWqXHjxrbNP23aNIWEhOjBBx+0bc5j9evXTwsXLlROTo6mTZum3Nxc9e/fXx6Px5b5i4uLdejQIU2dOlX9+vXT+++/rxtvvFE33XSTcnNzbalxrL/97W+qX7++7W9pvvjii2rfvr2aNWumsLAw9evXT7NmzdJVV11ly/xHQ9j48eP1448/qrKyUtOmTdMPP/xw2sd9dee+wsJChYWFHfcPovP9WHdaiNMNoHojRozQ5s2bz8rqSdu2bZWfn6/S0lK99dZbysjIUG5urm0hcOfOnRo1apRWrVp1StfMnIpfrl516tRJKSkpSkpK0htvvGHbv6K9Xq969OihKVOmSJK6du2qzZs3a86cOcrIyLClxrHmzZun/v37n9a1Uyfyxhtv6O9//7sWLVqkDh06KD8/X6NHj1ZCQoKtr+PVV1/V8OHD1bRpUwUHB6tbt266/fbbtXHjRttqBLqqqirdeuutsixLs2fPtn3+3r17Kz8/X/v27dNLL72kW2+9VZ9++qliYmLOeO6NGzfqhRdeUF5enm2r19W57bbbfP998cUXq1OnTmrVqpXWrl2ra6+99ozn93q9kqRBgwZpzJgxkqQuXbro3//+t+bMmaNevXqdcY1jvfLKKxoyZIjt/7988cUX9cknn2jp0qVKSkrShx9+qBEjRighIcGWd2ZCQ0P19ttv65577lGjRo0UHBystLQ09e/f/7Q/ZHY2z33wxwrgOeiBBx7Q8uXLtWbNGjVr1sz2+cPCwtS6dWt1795dWVlZ6ty5s1544QXb5t+4caOKi4vVrVs3hYSEKCQkRLm5ufrzn/+skJAQ2/6l/ksNGjTQhRdeqG3bttk2Z3x8/HGh+KKLLrL9reajduzYodWrV+t3v/udrfOOHTvWtwp48cUX66677tKYMWNsX51t1aqVcnNzdejQIe3cuVPr169XVVWVWrZsaWudo+Li4iTpuE8CFhUV+X52Pjka/nbs2KFVq1bZvvonSXXr1lXr1q116aWXat68eQoJCdG8efNsmfujjz5ScXGxmjdv7jvud+zYoT/84Q9KTk62pUZ1WrZsqcaNG9t27Ddu3FghISG1dux/9NFH2rp1q+3H/U8//aQJEyboueee04ABA9SpUyc98MADSk9P17PPPmtbne7duys/P18lJSXas2ePsrOztX///tM67k907ouLi1NlZaVKSkr8tj9fj/VzBQHwHGJZlh544AG98847+uCDD9SiRYtaqev1en3Xctjh2muv1aZNm5Sfn+979OjRQ0OGDFF+fr6Cg4Ntq3XUoUOH9O233yo+Pt62OS+//PLjbkXw9ddfKykpybYavzR//nzFxMTohhtusHXe8vJyBQX5H+rBwcG+lQ671a1bV/Hx8frxxx+1cuVKDRo06KzUadGiheLi4pSTk+Mbc7vd+vTTT8/KNa1n09Hw980332j16tW64IILaqWuncf+XXfdpf/85z9+x31CQoLGjh2rlStX2lKjOj/88IP2799v27EfFhamnj171tqxP2/ePHXv3t3WazGln/9OVVVV1dqxHx0drSZNmuibb77RZ599dkrH/a+d+7p3767Q0FC/Y33r1q0qKCg47471cwlvAZ9DRowYoUWLFundd99V/fr1fdc2REdHKzIy0pYa48ePV//+/dW8eXMdPHhQixYt0tq1a239H3T9+vWPu26xbt26uuCCC2y7nvGPf/yjBgwYoKSkJO3evVuTJ09WcHCwbr/9dlvml36+7cBll12mKVOm6NZbb9X69es1d+5czZ0717YaR3m9Xs2fP18ZGRkKCbH3sBwwYICeeuopNW/eXB06dNDnn3+u5557TsOHD7e1zsqVK2VZltq2batt27Zp7NixateunYYNG3bacx46dMhvZWf79u3Kz89Xo0aN1Lx5c40ePVpPPvmk2rRpoxYtWmjixIlKSEjQ4MGDbatx4MABFRQU+O7LdzQYxMXF1Xj14WQ14uPjdcsttygvL0/Lly+Xx+PxHfuNGjVSWFjYGde44IIL9NRTT2ngwIGKj4/Xvn37NGvWLO3ateuUbjf0a7+rY4NraGio4uLi1LZtW1tqNGrUSI899phuvvlmxcXF6dtvv9Wf/vQntW7dWn379rXtdYwdO1bp6em66qqr1Lt3b2VnZ2vZsmVau3atbTWkn//B8uabb2r69Ok1nvdUavTq1Utjx45VZGSkkpKSlJubq4ULF+q5556zrcabb76pJk2aqHnz5tq0aZNGjRqlwYMHn9IHTX7t3BcdHa177rlHmZmZatSokaKiojRy5Eilpqbq0ksvrXEdHMPJjyDDn6RqH/Pnz7etxvDhw62kpCQrLCzMatKkiXXttdda77//vm3zn4jdt4FJT0+34uPjrbCwMKtp06ZWenq6tW3bNtvmP2rZsmVWx44drfDwcKtdu3bW3Llzba9hWZa1cuVKS5K1detW2+d2u93WqFGjrObNm1sRERFWy5YtrYcfftiqqKiwtc7ixYutli1bWmFhYVZcXJw1YsQIq6Sk5IzmXLNmTbXHREZGhmVZP98KZuLEiVZsbKwVHh5uXXvttaf8O/y1GvPnz6/255MnT7alxtHby1T3WLNmjS01fvrpJ+vGG2+0EhISrLCwMCs+Pt4aOHCgtX79elt/V8c6ndvAnKxGeXm51adPH6tJkyZWaGiolZSUZP3+97+3CgsLbX8d8+bNs1q3bm1FRERYnTt3tpYsWWJ7jb/+9a9WZGTkaR8nv1Zjz5491t13320lJCRYERERVtu2ba3p06ef0i2mfq3GCy+8YDVr1swKDQ21mjdvbj3yyCOn/P+Wmpz7fvrpJ+v++++3GjZsaNWpU8e68cYbrT179pxSHfhzWZbNXwcAAACAcxrXAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAPALV199tUaPHu10GwBwVhEAAQAADEMABAAAMAwBEABOYsWKFYqOjtbf//53p1sBANuEON0AAJyrFi1apHvvvVeLFi3Sb37zG6fbAQDbsAIIANWYNWuW7r//fi1btozwByDgsAIIAMd46623VFxcrH/961/q2bOn0+0AgO1YAQSAY3Tt2lVNmjTRK6+8IsuynG4HAGxHAASAY7Rq1Upr1qzRu+++q5EjRzrdDgDYjreAAaAaF154odasWaOrr75aISEhmjFjhtMtAYBtCIAAcAJt27bVBx98oKuvvlrBwcGaPn260y0BgC1cFhe4AAAAGIVrAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMP8f3ivl3fpP3JlAAAAAElFTkSuQmCC", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(msplit, 100);" ] }, { "cell_type": "markdown", "id": "ca68b8f2-c256-40f9-9135-961877342736", "metadata": {}, "source": [ "### Euclidean splitting\n", "In Euclidean splitting, it matters whether we consider the computation $[0]G$ to error or not, i.e., whether the implementation is setup to handle a zero scalar gracefully. If it is not, we get 100% of errors for small scalars." ] }, { "cell_type": "code", "execution_count": 41, "id": "f205287f-1174-4815-bc0a-2a56ff806f11", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 100 out of 100.\n", "k = 3: failed in 100 out of 100.\n", "k = 4: failed in 100 out of 100.\n", "k = 5: failed in 100 out of 100.\n", "k = 6: failed in 100 out of 100.\n", "k = 7: failed in 100 out of 100.\n", "k = 8: failed in 100 out of 100.\n", "k = 9: failed in 100 out of 100.\n", "k = 10: failed in 100 out of 100.\n", "k = 11: failed in 100 out of 100.\n", "k = 12: failed in 100 out of 100.\n", "k = 13: failed in 100 out of 100.\n", "k = 14: failed in 100 out of 100.\n", "k = 15: failed in 100 out of 100.\n", "k = 16: failed in 100 out of 100.\n", "k = 17: failed in 100 out of 100.\n", "k = 18: failed in 100 out of 100.\n", "k = 19: failed in 100 out of 100.\n", "k = 20: failed in 100 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2c5eafbeaf59443dbc735b60b3a1daba", "version_major": 2, "version_minor": 0 }, "image/png": "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OTk52rBhg66//nrVq1dPoaGh6t69u7KysjzbxcbGSpJuvvlmuVwuz3tJWrJkiTp27KigoCA1adJETz/9tE6cOGHjnyQAABcmZgCrkGVZ+rWktMrrBvv72n4H61NPPaWJEydq6tSp8vPz07x587R9+3b93//9n95//335+vrK7XZ7wl9mZqZOnDihYcOGacCAAVq7dq1nrFO3O5Njx45p0qRJeu2111S3bl2FhYVpx44dSkpK0rRp02RZliZPnqwbbrhB33//vWrWrKkNGzYoLCxM8+fPV69evTzjf/rppxo0aJBeeeUVXXnllfrhhx/017/+VZKUmppq658VAAAXGq8KgDNmzNALL7yg3NxcxcXFadq0aeratesZ13/33Xc1btw4/fjjj2revLkmTZqkG264odL6+7WkVK1TVlba+Gfy7TM9VS2g4r/q5cuXq0aNGmWWjR07VmPHjvW8v+uuuzR48OAy6xQXF2vBggWqX7++JGnVqlXatGmTdu7cqejoaEnSggUL1KZNG23YsEFdunQpd7szKSkp0auvvqq4uDjPsmuvvbbMOrNnz1atWrWUmZmpm266yTPmya9xO+npp5/W6NGjlZSUJElq0qSJxo8fr8cee4wACADwel5zCnjRokVKTk5WamqqsrKyFBcXp549e3q+vutUn3/+ue68807dd999+vrrr9W/f3/1799fmzdvruLOLzzXXHONsrOzy7yGDh1aZp3OnTuftl1MTEyZELdlyxZFR0d7wp8ktW7dWrVq1dKWLVvOuN2ZBAQEqF27dmWW5eXl6YEHHlDz5s0VGhqqkJAQHTlyRDk5OX841jfffKNnnnlGNWrU8LweeOAB7du3T8eOHfvTXgAAuJh5zQzglClT9MADD3hmpWbNmqUVK1Zo3rx5Gj169Gnrv/zyy+rVq5dGjRolSRo/frxWrVql6dOna9asWZXSY7C/r759pmeljP1ndc9G9erV1axZsz9dpyLLKlqvIoKDg087lZ2UlKRDhw7p5ZdfVkxMjAIDA5WQkKDi4uI/HOvIkSN6+umndcstt5z2szNdhwgAgLfwigBYXFysjRs3asyYMZ5lPj4+SkxM1Lp168rdZt26dUpOTi6zrGfPnn/4uJCioiIVFRV53hcWFp5Vny6X66xOxV7sLrnkEu3evVu7d+/2zAJ+++23ys/PV+vWrW2p8Z///Eevvvqq59T97t27dfDgwTLr+Pv7q7S07LWXHTt21LZt2/406AIA4I28Io0cPHhQpaWlCg8PL7M8PDxcW7duLXeb3NzcctfPzc09Y520tDQ9/fTT59/wBa6oqOi0Pwc/Pz/Vq1fvrMZJTEzUpZdeqoEDB2rq1Kk6ceKEHnroIXXv3r3cU8jnonnz5nrzzTfVuXNnFRYWatSoUQoODi6zTmxsrDIyMtStWzcFBgaqdu3aSklJ0U033aRGjRrptttuk4+Pj7755htt3rxZzz77rC29AQBwofKaawCrwpgxY1RQUOB57d692+mWKkV6eroiIyPLvK644oqzHsflcmnJkiWqXbu2rrrqKiUmJqpJkyZatGiRbb3OnTtXv/zyizp27Kh77rlHjz76qMLCwsqsM3nyZK1atUrR0dHq0KGDpN9me5cvX66PPvpIXbp00WWXXaaXXnpJMTExtvUGAMCFymVZluV0E+eruLhY1apV03vvvaf+/ft7liclJSk/P19Lliw5bZtGjRopOTlZI0aM8CxLTU3V4sWL9c0331SobmFhoUJDQ1VQUKCQkJAyPzt+/Lh27tz5h8+2w8WF3ykAeIc/On6bwitmAAMCAtSpUydlZGR4lrndbmVkZCghIaHcbRISEsqsL/322JIzrQ8AAOAtvOIaQElKTk5WUlKSOnfurK5du2rq1Kk6evSo567gQYMGqUGDBkpLS5MkDR8+XN27d9fkyZN144036u2339ZXX32l2bNnO/kxAAAAKp3XBMABAwbowIEDSklJUW5urtq3b6/09HTPjR45OTllvjf28ssv18KFC/Xkk09q7Nixat68uRYvXqy2bds69REAAACqhFdcA+gUrgE0C79TAPAOXAPoJdcAXsjI196D3yUAwFsQACuJv7+/JPG1Yl7k5O/y5O8WAICLlddcA3ih8fX1Va1atTzfRVytWrXTvsYMFwfLsnTs2DHt379ftWrVkq/v2X21HgAAFxoCYCWKiIiQJE8IxMWtVq1ant8pAAAXMwJgJXK5XIqMjFRYWJhKSkqcbgfnwd/fn5k/AIDXIABWAV9fX8IDAAC4YHATCAAAgGEIgAAAAIYhAAIAABiGawDPw8kHAxcWFjrcCQAAqKiTx22TH/BPADwPhw8fliRFR0c73AkAADhbhw8fVmhoqNNtOILvAj4Pbrdbe/fuVc2aNW1/yHNhYaGio6O1e/fuSvueQmpQgxrUoAY1TKxhWZYOHz6sqKgo+fiYeTUcM4DnwcfHRw0bNqzUGiEhIZX+RdXUoAY1qEENaphWw9SZv5PMjL0AAAAGIwACAAAYhgB4gQoMDFRqaqoCAwOpQQ1qUIMa1KAGbMVNIAAAAIZhBhAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAHwApKWlqYuXbqoZs2aCgsLU//+/bVt2zZba8ycOVPt2rXzPFgzISFB//73v22tcaqJEyfK5XJpxIgRto351FNPyeVylXm1atXKtvFP2rNnj+6++27VrVtXwcHBuvTSS/XVV1/ZWiM2Nva0z+JyuTRs2DBbxi8tLdW4cePUuHFjBQcHq2nTpho/frzt34F5+PBhjRgxQjExMQoODtbll1+uDRs2nNeYn3zyifr06aOoqCi5XC4tXry4zM8ty1JKSooiIyMVHBysxMREff/997bWeP/999WjRw/VrVtXLpdL2dnZtn6OkpISPf7447r00ktVvXp1RUVFadCgQdq7d6+tn+Opp55Sq1atVL16ddWuXVuJiYn68ssvba3xe0OHDpXL5dLUqVNtrXHvvfeetq/06tXL9s+xZcsW9e3bV6Ghoapevbq6dOminJwc22qUt8+7XC698MILttU4cuSIHn74YTVs2FDBwcFq3bq1Zs2aVeHxK1IjLy9P9957r6KiolStWjX16tXrrPfBihz7jh8/rmHDhqlu3bqqUaOGbr31VuXl5Z1VHZRFALyAZGZmatiwYfriiy+0atUqlZSUqEePHjp69KhtNRo2bKiJEydq48aN+uqrr3TttdeqX79++t///mdbjd/bsGGD/vGPf6hdu3a2j92mTRvt27fP8/rss89sHf+XX35Rt27d5O/vr3//+9/69ttvNXnyZNWuXdvWOhs2bCjzOVatWiVJ+stf/mLL+JMmTdLMmTM1ffp0bdmyRZMmTdLzzz+vadOm2TL+Sffff79WrVqlN998U5s2bVKPHj2UmJioPXv2nPOYR48eVVxcnGbMmFHuz59//nm98sormjVrlr788ktVr15dPXv21PHjx22rcfToUV1xxRWaNGnSOX2GP6tx7NgxZWVlady4ccrKytL777+vbdu2qW/fvrbVkKQWLVpo+vTp2rRpkz777DPFxsaqR48eOnDggG01Tvrggw/0xRdfKCoq6qw+Q0Vr9OrVq8w+869//cvWGj/88IOuuOIKtWrVSmvXrtV///tfjRs3TkFBQbbV+H3/+/bt07x58+RyuXTrrbfaViM5OVnp6el66623tGXLFo0YMUIPP/ywli5daksNy7LUv39/7dixQ0uWLNHXX3+tmJgYJSYmntVxqyLHvpEjR2rZsmV69913lZmZqb179+qWW26pcA2Uw8IFa//+/ZYkKzMzs1Lr1K5d23rttddsH/fw4cNW8+bNrVWrVlndu3e3hg8fbtvYqampVlxcnG3jlefxxx+3rrjiikqtUZ7hw4dbTZs2tdxuty3j3XjjjdaQIUPKLLvlllusgQMH2jK+ZVnWsWPHLF9fX2v58uVllnfs2NF64oknbKkhyfrggw88791utxUREWG98MILnmX5+flWYGCg9a9//cuWGr+3c+dOS5L19ddfn9PYFalx0vr16y1J1q5duyqtRkFBgSXJWr16ta01fvrpJ6tBgwbW5s2brZiYGOull146p/HPVCMpKcnq16/fOY9ZkRoDBgyw7r777kqtcap+/fpZ1157ra012rRpYz3zzDNllp3PPnlqjW3btlmSrM2bN3uWlZaWWvXr17fmzJlzTjUs6/RjX35+vuXv72+9++67nnW2bNliSbLWrVt3znVMxwzgBaygoECSVKdOnUoZv7S0VG+//baOHj2qhIQE28cfNmyYbrzxRiUmJto+tiR9//33ioqKUpMmTTRw4MCzOj1TEUuXLlXnzp31l7/8RWFhYerQoYPmzJlja41TFRcX66233tKQIUPkcrlsGfPyyy9XRkaGvvvuO0nSN998o88++0y9e/e2ZXxJOnHihEpLS0+bIQkODrZ9ZvaknTt3Kjc3t8z/X6GhoYqPj9e6desqpWZVKSgokMvlUq1atSpl/OLiYs2ePVuhoaGKi4uzbVy326177rlHo0aNUps2bWwb91Rr165VWFiYWrZsqQcffFCHDh2ybWy3260VK1aoRYsW6tmzp8LCwhQfH/+Hp7vPV15enlasWKH77rvP1nEvv/xyLV26VHv27JFlWVqzZo2+++479ejRw5bxi4qKJKnMfu/j46PAwMDz2u9PPfZt3LhRJSUlZfb1Vq1aqVGjRhf9vu4kAuAFyu12a8SIEerWrZvatm1r69ibNm1SjRo1FBgYqKFDh+qDDz5Q69atba3x9ttvKysrS2lpabaOe1J8fLxef/11paena+bMmdq5c6euvPJKHT582LYaO3bs0MyZM9W8eXOtXLlSDz74oB599FG98cYbttU41eLFi5Wfn697773XtjFHjx6tO+64Q61atZK/v786dOigESNGaODAgbbVqFmzphISEjR+/Hjt3btXpaWleuutt7Ru3Trt27fPtjq/l5ubK0kKDw8vszw8PNzzs4vR8ePH9fjjj+vOO+9USEiIrWMvX75cNWrUUFBQkF566SWtWrVK9erVs238SZMmyc/PT48++qhtY56qV69eWrBggTIyMjRp0iRlZmaqd+/eKi0ttWX8/fv368iRI5o4caJ69eqljz76SDfffLNuueUWZWZm2lLjVG+88YZq1qxp+ynNadOmqXXr1mrYsKECAgLUq1cvzZgxQ1dddZUt458MYWPGjNEvv/yi4uJiTZo0ST/99NM57/flHftyc3MVEBBw2j+ILvZ93Wl+TjeA8g0bNkybN2+ulNmTli1bKjs7WwUFBXrvvfeUlJSkzMxM20Lg7t27NXz4cK1ateqsrpk5G7+fvWrXrp3i4+MVExOjd955x7Z/RbvdbnXu3FkTJkyQJHXo0EGbN2/WrFmzlJSUZEuNU82dO1e9e/c+p2unzuSdd97RP//5Ty1cuFBt2rRRdna2RowYoaioKFs/x5tvvqkhQ4aoQYMG8vX1VceOHXXnnXdq48aNttXwdiUlJbr99ttlWZZmzpxp+/jXXHONsrOzdfDgQc2ZM0e33367vvzyS4WFhZ332Bs3btTLL7+srKws22avy3PHHXd4/vvSSy9Vu3bt1LRpU61du1bXXXfdeY/vdrslSf369dPIkSMlSe3bt9fnn3+uWbNmqXv37udd41Tz5s3TwIEDbf/7ctq0afriiy+0dOlSxcTE6JNPPtGwYcMUFRVly5kZf39/vf/++7rvvvtUp04d+fr6KjExUb179z7nm8wq89iHspgBvAA9/PDDWr58udasWaOGDRvaPn5AQICaNWumTp06KS0tTXFxcXr55ZdtG3/jxo3av3+/OnbsKD8/P/n5+SkzM1OvvPKK/Pz8bPuX+u/VqlVLLVq00Pbt220bMzIy8rRQfMkll9h+qvmkXbt2afXq1br//vttHXfUqFGeWcBLL71U99xzj0aOHGn77GzTpk2VmZmpI0eOaPfu3Vq/fr1KSkrUpEkTW+ucFBERIUmn3QmYl5fn+dnF5GT427Vrl1atWmX77J8kVa9eXc2aNdNll12muXPnys/PT3PnzrVl7E8//VT79+9Xo0aNPPv9rl279Le//U2xsbG21ChPkyZNVK9ePdv2/Xr16snPz6/K9v1PP/1U27Zts32///XXXzV27FhNmTJFffr0Ubt27fTwww9rwIABevHFF22r06lTJ2VnZys/P1/79u1Tenq6Dh06dE77/ZmOfRERESouLlZ+fn6Z9S/Wff1CQQC8gFiWpYcfflgffPCBPv74YzVu3LhK6rrdbs+1HHa47rrrtGnTJmVnZ3tenTt31sCBA5WdnS1fX1/bap105MgR/fDDD4qMjLRtzG7dup32KILvvvtOMTExttX4vfnz5yssLEw33nijreMeO3ZMPj5ld3VfX1/PTIfdqlevrsjISP3yyy9auXKl+vXrVyl1GjdurIiICGVkZHiWFRYW6ssvv6yUa1or08nw9/3332v16tWqW7duldS1c9+/55579N///rfMfh8VFaVRo0Zp5cqVttQoz08//aRDhw7Ztu8HBASoS5cuVbbvz507V506dbL1Wkzpt/+nSkpKqmzfDw0NVf369fX999/rq6++Oqv9/s+OfZ06dZK/v3+ZfX3btm3Kycm56Pb1CwmngC8gw4YN08KFC7VkyRLVrFnTc21DaGiogoODbakxZswY9e7dW40aNdLhw4e1cOFCrV271ta/oGvWrHnadYvVq1dX3bp1bbue8e9//7v69OmjmJgY7d27V6mpqfL19dWdd95py/jSb48duPzyyzVhwgTdfvvtWr9+vWbPnq3Zs2fbVuMkt9ut+fPnKykpSX5+9u6Wffr00XPPPadGjRqpTZs2+vrrrzVlyhQNGTLE1jorV66UZVlq2bKltm/frlGjRqlVq1YaPHjwOY955MiRMjM7O3fuVHZ2turUqaNGjRppxIgRevbZZ9W8eXM1btxY48aNU1RUlPr3729bjZ9//lk5OTme5/KdDAYREREVnn34oxqRkZG67bbblJWVpeXLl6u0tNSz79epU0cBAQHnXaNu3bp67rnn1LdvX0VGRurgwYOaMWOG9uzZc1aPG/qzP6tTg6u/v78iIiLUsmVLW2rUqVNHTz/9tG699VZFRETohx9+0GOPPaZmzZqpZ8+etn2OUaNGacCAAbrqqqt0zTXXKD09XcuWLdPatWttqyH99g+Wd999V5MnT67wuGdTo3v37ho1apSCg4MVExOjzMxMLViwQFOmTLGtxrvvvqv69eurUaNG2rRpk4YPH67+/fuf1Y0mf3bsCw0N1X333afk5GTVqVNHISEheuSRR5SQkKDLLruswnVwCidvQUZZksp9zZ8/37YaQ4YMsWJiYqyAgACrfv361nXXXWd99NFHto1/JnY/BmbAgAFWZGSkFRAQYDVo0MAaMGCAtX37dtvGP2nZsmVW27ZtrcDAQKtVq1bW7Nmzba9hWZa1cuVKS5K1bds228cuLCy0hg8fbjVq1MgKCgqymjRpYj3xxBNWUVGRrXUWLVpkNWnSxAoICLAiIiKsYcOGWfn5+ec15po1a8rdJ5KSkizL+u1RMOPGjbPCw8OtwMBA67rrrjvrP8M/qzF//vxyf56ammpLjZOPlynvtWbNGltq/Prrr9bNN99sRUVFWQEBAVZkZKTVt29fa/369bb+WZ3qXB4D80c1jh07ZvXo0cOqX7++5e/vb8XExFgPPPCAlZuba/vnmDt3rtWsWTMrKCjIiouLsxYvXmx7jX/84x9WcHDwOe8nf1Zj37591r333mtFRUVZQUFBVsuWLa3Jkyef1SOm/qzGyy+/bDVs2NDy9/e3GjVqZD355JNn/XdLRY59v/76q/XQQw9ZtWvXtqpVq2bdfPPN1r59+86qDspyWZbNXwcAAACACxrXAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAPA7V199tUaMGOF0GwBQqQiAAAAAhiEAAgAAGIYACAB/YMWKFQoNDdU///lPp1sBANv4Od0AAFyoFi5cqKFDh2rhwoW66aabnG4HAGzDDCAAlGPGjBl66KGHtGzZMsIfAK/DDCAAnOK9997T/v379Z///EddunRxuh0AsB0zgABwig4dOqh+/fqaN2+eLMtyuh0AsB0BEABO0bRpU61Zs0ZLlizRI4884nQ7AGA7TgEDQDlatGihNWvW6Oqrr5afn5+mTp3qdEsAYBsCIACcQcuWLfXxxx/r6quvlq+vryZPnux0SwBgC5fFBS4AAABG4RpAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMP8PHIQyVyxI88UAAAAASUVORK5CYII=", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(esplit, 100);" ] }, { "cell_type": "markdown", "id": "cab4594e-8489-4512-98f5-dc56bef3472f", "metadata": {}, "source": [ "However, if it **is** setup to handle a zero scalar, we get no errors on small scalars." ] }, { "cell_type": "code", "execution_count": 42, "id": "a6b36c65-3016-4d83-a352-3cb409319e31", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 0 out of 100.\n", "k = 3: failed in 0 out of 100.\n", "k = 4: failed in 0 out of 100.\n", "k = 5: failed in 0 out of 100.\n", "k = 6: failed in 0 out of 100.\n", "k = 7: failed in 0 out of 100.\n", "k = 8: failed in 0 out of 100.\n", "k = 9: failed in 0 out of 100.\n", "k = 10: failed in 0 out of 100.\n", "k = 11: failed in 0 out of 100.\n", "k = 12: failed in 0 out of 100.\n", "k = 13: failed in 0 out of 100.\n", "k = 14: failed in 0 out of 100.\n", "k = 15: failed in 0 out of 100.\n", "k = 16: failed in 0 out of 100.\n", "k = 17: failed in 0 out of 100.\n", "k = 18: failed in 0 out of 100.\n", "k = 19: failed in 0 out of 100.\n", "k = 20: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "abfa4734b7a94a778ed68669d84bc31a", "version_major": 2, "version_minor": 0 }, "image/png": "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YqLf4kb79u3VoEEDbdmyxRcAj93vRMLCwtSpUye/saKiIj3yyCNau3atiouL5fF4VF5eroKCgpPO9cUXX+hf//qX34qfx+PR4cOHVV5ezg28T5GxATA1NVXvvfee39iqVauUmprqUEcAgHNJZGiwvnzcmQ8FRoYGn9L2devWVevWrX91m5qM1bReTURGRh73lXoZGRnav3+/XnjhBSUlJSk8PFypqamqrKw86VyHDh3SY489pptuuum4n/FNH6cuYALgoUOHtG3bNt/z7du3Kz8/X40aNVLz5s01fvx47dq1SwsXLpQk3XvvvZo5c6b+9Kc/afjw4frggw/0xhtvaMWKFU69BADAOcTlcp3S27CB4KKLLtLOnTu1c+dO3yrgl19+qZKSErVv396WGv/617/0l7/8Rddff70kaefOndq3b5/fNqGhofJ4PH5j3bp109atW3816KJmAuZv9meffabevXv7nh+9Vi8jI0MLFizQnj17/JaXW7RooRUrVmjMmDF64YUX1KxZM7388svcAgYAcN6pqKhQYWGh31hISIgaN258SvOkpaXp4osv1pAhQzRjxgwdOXJE999/v3r16lXtW8ino02bNnr11VfVo0cPud1ujR079rhLr5KTk5WTk6PLL79c4eHhatiwoSZNmqTf/OY3at68uW655RYFBQXpiy++0ObNm/Xkk0/a0ptJAuZTwFdffbUsyzrucfTbPRYsWKC1a9cet8/nn3+uiooKffvtt7r77rtrvW8AAM5Udna24uPj/R5XXHHFKc/jcrn07rvvqmHDhrrqqquUlpamli1bavHixbb1Om/ePP3444/q1q2b7rrrLj344IOKiYnx22b69OlatWqVEhMT1bVrV0k/36pt+fLlev/999WzZ09deumlev7555WUlGRbbyZxWWfjs+aGcLvdio6OVmlpqaKiopxuBwBwmg4fPqzt27ef9L52OL+c7M+U83cArQACAACgZgiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAA/C9ujBE4+LM8OQIgAMB4oaGhkqTy8nKHO4Fdjv5ZHv2zhb+A+SYQAABOV3BwsBo0aKDi4mJJUp06dY77DlucHyzLUnl5uYqLi9WgQQMFB5/a9yqbggAIAICkuLg4SfKFQJzfGjRo4PszxfEIgAAA6OevQYuPj1dMTIyqqqqcbgdnIDQ0lJW/X0EABADgF4KDgwkPCHh8CAQAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMExABcBZs2YpOTlZERERSklJ0fr160+6/YwZM9S2bVtFRkYqMTFRY8aM0eHDh2upWwAAAGcETABcvHixMjMzNXnyZOXl5alz587q27eviouLq91+0aJFGjdunCZPnqwtW7Zo3rx5Wrx4sSZMmFDLnQMAANSugAmAzz33nH7/+99r2LBhat++vebMmaM6derolVdeqXb7f//737r88st1xx13KDk5WX369NHtt9/+q6uGAAAA57uACICVlZXauHGj0tLSfGNBQUFKS0vTunXrqt3nsssu08aNG32B77vvvtN7772n66+/vlZ6BgAAcEqI0w3YYd++ffJ4PIqNjfUbj42N1VdffVXtPnfccYf27dunK664QpZl6ciRI7r33ntP+hZwRUWFKioqfM/dbrc9LwAAAKAWBcQK4OlYu3atpkyZor/85S/Ky8vT22+/rRUrVuiJJ5444T5ZWVmKjo72PRITE2uxYwAAAHu4LMuynG7iTFVWVqpOnTp66623NHjwYN94RkaGSkpK9O677x63z5VXXqlLL71UzzzzjG/stdde0//7f/9Phw4dUlDQ8dm4uhXAxMRElZaWKioqyt4XBQAAzgq3263o6Gijz98BsQIYFham7t27Kycnxzfm9XqVk5Oj1NTUavcpLy8/LuQFBwdLkk6UicPDwxUVFeX3AAAAON8ExDWAkpSZmamMjAz16NFDl1xyiWbMmKGysjINGzZMkjR06FA1bdpUWVlZkqQBAwboueeeU9euXZWSkqJt27Zp4sSJGjBggC8IAgAABKKACYDp6enau3evJk2a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9evL5XLZOrfb7VZiYqJ27tx51r6nkBrUoAY1qEENE2tYlqWDBw8qISFBQUFmXg3HCuAZCAoKUrNmzc5qjaioqLP+RdXUoAY1qEENaphWw9SVv6PMjL0AAAAGIwACAAAYhgB4jgoPD9fkyZMVHh5ODWpQgxrUoAY1YCs+BAIAAGAYVgABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAzyFZWVnq2bOn6tevr5iYGA0ePFhbt261tcbs2bPVqVMn3401U1NT9c9//tPWGseaOnWqXC6XRo8ebducjz76qFwul9+jXbt2ts1/1K5du3TnnXfqggsuUGRkpC6++GJ99tlnttZITk4+7rW4XC6NGDHClvk9Ho8mTpyoFi1aKDIyUq1atdITTzxh+3dgHjx4UKNHj1ZSUpIiIyN12WWXacOGDWc054cffqgBAwYoISFBLpdLS5Ys8fu5ZVmaNGmS4uPjFRkZqbS0NH3zzTe21nj77bfVp08fXXDBBXK5XMrPz7f1dVRVVemhhx7SxRdfrLp16yohIUFDhw7V7t27bX0djz76qNq1a6e6deuqYcOGSktL06effmprjV+699575XK5NGPGDFtr3H333ccdK/369bP9dWzZskUDBw5UdHS06tatq549e6qgoMC2GtUd8y6XS88884xtNQ4dOqQHHnhAzZo1U2RkpNq3b685c+bUeP6a1CgqKtLdd9+thIQE1alTR/369TvlY7Am577Dhw9rxIgRuuCCC1SvXj3dfPPNKioqOqU68EcAPIfk5uZqxIgR+uSTT7Rq1SpVVVWpT58+Kisrs61Gs2bNNHXqVG3cuFGfffaZrrnmGg0aNEj//e9/bavxSxs2bNBf//pXderUyfa5O3TooD179vgeH3/8sa3z//jjj7r88ssVGhqqf/7zn/ryyy81ffp0NWzY0NY6GzZs8Hsdq1atkiT99re/tWX+adOmafbs2Zo5c6a2bNmiadOm6emnn9aLL75oy/xH/e53v9OqVav06quvatOmTerTp4/S0tK0a9eu056zrKxMnTt31qxZs6r9+dNPP60///nPmjNnjj799FPVrVtXffv21eHDh22rUVZWpiuuuELTpk07rdfwazXKy8uVl5eniRMnKi8vT2+//ba2bt2qgQMH2lZDki688ELNnDlTmzZt0scff6zk5GT16dNHe/futa3GUe+8844++eQTJSQknNJrqGmNfv36+R0z//jHP2yt8e233+qKK65Qu3bttHbtWv3nP//RxIkTFRERYVuNX/a/Z88evfLKK3K5XLr55pttq5GZmans7Gy99tpr2rJli0aPHq0HHnhAS5cutaWGZVkaPHiwvvvuO7377rv6/PPPlZSUpLS0tFM6b9Xk3DdmzBgtW7ZMb775pnJzc7V7927ddNNNNa6Balg4ZxUXF1uSrNzc3LNap2HDhtbLL79s+7wHDx602rRpY61atcrq1auXNWrUKNvmnjx5stW5c2fb5qvOQw89ZF1xxRVntUZ1Ro0aZbVq1cryer22zHfDDTdYw4cP9xu76aabrCFDhtgyv2VZVnl5uRUcHGwtX77cb7xbt27Www8/bEsNSdY777zje+71eq24uDjrmWee8Y2VlJRY4eHh1j/+8Q9bavzS9u3bLUnW559/flpz16TGUevXr7ckWTt27DhrNUpLSy1J1urVq22t8cMPP1hNmza1Nm/ebCUlJVnPP//8ac1/ohoZGRnWoEGDTnvOmtRIT0+37rzzzrNa41iDBg2yrrnmGltrdOjQwXr88cf9xs7kmDy2xtatWy1J1ubNm31jHo/HatKkifXSSy+dVg3LOv7cV1JSYoWGhlpvvvmmb5stW7ZYkqx169addh3TsQJ4DistLZUkNWrU6KzM7/F49Prrr6usrEypqam2zz9ixAjdcMMNSktLs31uSfrmm2+UkJCgli1basiQIaf09kxNLF26VD169NBvf/tbxcTEqGvXrnrppZdsrXGsyspKvfbaaxo+fLhcLpctc1522WXKycnR119/LUn64osv9PHHH6t///62zC9JR44ckcfjOW6FJDIy0vaV2aO2b9+uwsJCv79f0dHRSklJ0bp1685KzdpSWloql8ulBg0anJX5KysrNXfuXEVHR6tz5862zev1enXXXXdp7Nix6tChg23zHmvt2rWKiYlR27Ztdd9992n//v22ze31erVixQpdeOGF6tu3r2JiYpSSknLSt7vPVFFRkVasWKF77rnH1nkvu+wyLV26VLt27ZJlWVqzZo2+/vpr9enTx5b5KyoqJMnvuA8KClJ4ePgZHffHnvs2btyoqqoqv2O9Xbt2at68+Xl/rDuJAHiO8nq9Gj16tC6//HJ17NjR1rk3bdqkevXqKTw8XPfee6/eeecdtW/f3tYar7/+uvLy8pSVlWXrvEelpKRowYIFys7O1uzZs7V9+3ZdeeWVOnjwoG01vvvuO82ePVtt2rTRypUrdd999+nBBx/U3/72N9tqHGvJkiUqKSnR3Xffbduc48aN02233aZ27dopNDRUXbt21ejRozVkyBDbatSvX1+pqal64okntHv3bnk8Hr322mtat26d9uzZY1udXyosLJQkxcbG+o3Hxsb6fnY+Onz4sB566CHdfvvtioqKsnXu5cuXq169eoqIiNDzzz+vVatWqXHjxrbNP23aNIWEhOjBBx+0bc5j9evXTwsXLlROTo6mTZum3Nxc9e/fXx6Px5b5i4uLdejQIU2dOlX9+vXT+++/rxtvvFE33XSTcnNzbalxrL/97W+qX7++7W9pvvjii2rfvr2aNWumsLAw9evXT7NmzdJVV11ly/xHQ9j48eP1448/qrKyUtOmTdMPP/xw2sd9dee+wsJChYWFHfcPovP9WHdaiNMNoHojRozQ5s2bz8rqSdu2bZWfn6/S0lK99dZbysjIUG5urm0hcOfOnRo1apRWrVp1StfMnIpfrl516tRJKSkpSkpK0htvvGHbv6K9Xq969OihKVOmSJK6du2qzZs3a86cOcrIyLClxrHmzZun/v37n9a1Uyfyxhtv6O9//7sWLVqkDh06KD8/X6NHj1ZCQoKtr+PVV1/V8OHD1bRpUwUHB6tbt266/fbbtXHjRttqBLqqqirdeuutsixLs2fPtn3+3r17Kz8/X/v27dNLL72kW2+9VZ9++qliYmLOeO6NGzfqhRdeUF5enm2r19W57bbbfP998cUXq1OnTmrVqpXWrl2ra6+99ozn93q9kqRBgwZpzJgxkqQuXbro3//+t+bMmaNevXqdcY1jvfLKKxoyZIjt/7988cUX9cknn2jp0qVKSkrShx9+qBEjRighIcGWd2ZCQ0P19ttv65577lGjRo0UHBystLQ09e/f/7Q/ZHY2z33wxwrgOeiBBx7Q8uXLtWbNGjVr1sz2+cPCwtS6dWt1795dWVlZ6ty5s1544QXb5t+4caOKi4vVrVs3hYSEKCQkRLm5ufrzn/+skJAQ2/6l/ksNGjTQhRdeqG3bttk2Z3x8/HGh+KKLLrL9reajduzYodWrV+t3v/udrfOOHTvWtwp48cUX66677tKYMWNsX51t1aqVcnNzdejQIe3cuVPr169XVVWVWrZsaWudo+Li4iTpuE8CFhUV+X52Pjka/nbs2KFVq1bZvvonSXXr1lXr1q116aWXat68eQoJCdG8efNsmfujjz5ScXGxmjdv7jvud+zYoT/84Q9KTk62pUZ1WrZsqcaNG9t27Ddu3FghISG1dux/9NFH2rp1q+3H/U8//aQJEyboueee04ABA9SpUyc98MADSk9P17PPPmtbne7duys/P18lJSXas2ePsrOztX///tM67k907ouLi1NlZaVKSkr8tj9fj/VzBQHwHGJZlh544AG98847+uCDD9SiRYtaqev1en3Xctjh2muv1aZNm5Sfn+979OjRQ0OGDFF+fr6Cg4Ntq3XUoUOH9O233yo+Pt62OS+//PLjbkXw9ddfKykpybYavzR//nzFxMTohhtusHXe8vJyBQX5H+rBwcG+lQ671a1bV/Hx8frxxx+1cuVKDRo06KzUadGiheLi4pSTk+Mbc7vd+vTTT8/KNa1n09Hw980332j16tW64IILaqWuncf+XXfdpf/85z9+x31CQoLGjh2rlStX2lKjOj/88IP2799v27EfFhamnj171tqxP2/ePHXv3t3WazGln/9OVVVV1dqxHx0drSZNmuibb77RZ599dkrH/a+d+7p3767Q0FC/Y33r1q0qKCg47471cwlvAZ9DRowYoUWLFundd99V/fr1fdc2REdHKzIy0pYa48ePV//+/dW8eXMdPHhQixYt0tq1a239H3T9+vWPu26xbt26uuCCC2y7nvGPf/yjBgwYoKSkJO3evVuTJ09WcHCwbr/9dlvml36+7cBll12mKVOm6NZbb9X69es1d+5czZ0717YaR3m9Xs2fP18ZGRkKCbH3sBwwYICeeuopNW/eXB06dNDnn3+u5557TsOHD7e1zsqVK2VZltq2batt27Zp7NixateunYYNG3bacx46dMhvZWf79u3Kz89Xo0aN1Lx5c40ePVpPPvmk2rRpoxYtWmjixIlKSEjQ4MGDbatx4MABFRQU+O7LdzQYxMXF1Xj14WQ14uPjdcsttygvL0/Lly+Xx+PxHfuNGjVSWFjYGde44IIL9NRTT2ngwIGKj4/Xvn37NGvWLO3ateuUbjf0a7+rY4NraGio4uLi1LZtW1tqNGrUSI899phuvvlmxcXF6dtvv9Wf/vQntW7dWn379rXtdYwdO1bp6em66qqr1Lt3b2VnZ2vZsmVau3atbTWkn//B8uabb2r69Ok1nvdUavTq1Utjx45VZGSkkpKSlJubq4ULF+q5556zrcabb76pJk2aqHnz5tq0aZNGjRqlwYMHn9IHTX7t3BcdHa177rlHmZmZatSokaKiojRy5Eilpqbq0ksvrXEdHMPJjyDDn6RqH/Pnz7etxvDhw62kpCQrLCzMatKkiXXttdda77//vm3zn4jdt4FJT0+34uPjrbCwMKtp06ZWenq6tW3bNtvmP2rZsmVWx44drfDwcKtdu3bW3Llzba9hWZa1cuVKS5K1detW2+d2u93WqFGjrObNm1sRERFWy5YtrYcfftiqqKiwtc7ixYutli1bWmFhYVZcXJw1YsQIq6Sk5IzmXLNmTbXHREZGhmVZP98KZuLEiVZsbKwVHh5uXXvttaf8O/y1GvPnz6/255MnT7alxtHby1T3WLNmjS01fvrpJ+vGG2+0EhISrLCwMCs+Pt4aOHCgtX79elt/V8c6ndvAnKxGeXm51adPH6tJkyZWaGiolZSUZP3+97+3CgsLbX8d8+bNs1q3bm1FRERYnTt3tpYsWWJ7jb/+9a9WZGTkaR8nv1Zjz5491t13320lJCRYERERVtu2ba3p06ef0i2mfq3GCy+8YDVr1swKDQ21mjdvbj3yyCOn/P+Wmpz7fvrpJ+v++++3GjZsaNWpU8e68cYbrT179pxSHfhzWZbNXwcAAACAcxrXAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAPALV199tUaPHu10GwBwVhEAAQAADEMABAAAMAwBEABOYsWKFYqOjtbf//53p1sBANuEON0AAJyrFi1apHvvvVeLFi3Sb37zG6fbAQDbsAIIANWYNWuW7r//fi1btozwByDgsAIIAMd46623VFxcrH/961/q2bOn0+0AgO1YAQSAY3Tt2lVNmjTRK6+8IsuynG4HAGxHAASAY7Rq1Upr1qzRu+++q5EjRzrdDgDYjreAAaAaF154odasWaOrr75aISEhmjFjhtMtAYBtCIAAcAJt27bVBx98oKuvvlrBwcGaPn260y0BgC1cFhe4AAAAGIVrAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMP8f3ivl3fpP3JlAAAAAElFTkSuQmCC", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(esplit, 100, zero_fails=False);" ] }, { "cell_type": "markdown", "id": "b1f68d3e-0b55-450e-a831-fa0a85fd06a1", "metadata": {}, "source": [ "When we look back at the case where a zero scalar is mishandled, we see the errors drop-off when we reach the size of tha random mask." ] }, { "cell_type": "code", "execution_count": 43, "id": "54716a04-ed6b-4ad3-b92f-2d49ddbcdd73", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 1329227995784915872903807060280344576: failed in 100 out of 100.\n", "k = 2658455991569831745807614120560689152: failed in 99 out of 100.\n", "k = 5316911983139663491615228241121378304: failed in 100 out of 100.\n", "k = 10633823966279326983230456482242756608: failed in 99 out of 100.\n", "k = 21267647932558653966460912964485513216: failed in 95 out of 100.\n", "k = 42535295865117307932921825928971026432: failed in 84 out of 100.\n", "k = 85070591730234615865843651857942052864: failed in 76 out of 100.\n", "k = 170141183460469231731687303715884105728: failed in 55 out of 100.\n", "k = 340282366920938463463374607431768211456: failed in 0 out of 100.\n", "k = 680564733841876926926749214863536422912: failed in 0 out of 100.\n", "k = 1361129467683753853853498429727072845824: failed in 0 out of 100.\n", "k = 2722258935367507707706996859454145691648: failed in 0 out of 100.\n", "k = 5444517870735015415413993718908291383296: failed in 0 out of 100.\n", "k = 10889035741470030830827987437816582766592: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8689909962544b35a88a85c60ae6e9db", "version_major": 2, "version_minor": 0 }, "image/png": "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WG+f9OnTx+jXr1+Dr5cn90l4eLgRGRlphIWFudf54IMPTHl9jt0Ps2fPNiQZU6ZMMeX16dWrlyGp3levXr1M2ScjR440xowZY7Rv394IDg42+vXrZ6xfv97jWaxW6wn7RJJx2223efz1ufzyy42JEycaqampRnBwsNG1a1fj/vvvN1wul0f3SUxMjNG1a1cjMTHRCA4ONjIyMox169a5H6Olsnz++efGWWed5f4d6NWrl/H444+b8l7bUJbRo0fXy3HOOecYF1xwgZGYmHjCe60n90lYWJgRHR1thIaGNvi52NpZjjV//nyjf//+RkRERIPvtf6MAthMI0eONF588UVjy5YtRlZWljF69GgjJSXFKC8vr7fes88+a7Rr18748ssvDcMwjB07dhjJycnGtGnT6q1XXl5u3HrrrcbChQuNkSNHNvhLP2XKFOPRRx811q1bZ+zYscOYPn26ERgYaGRkZLizPProo4bFYjE6dOhgrF+/3vjtb39rREdHGwUFBR7PMnfuXKNbt25GTEzMCW9KrZ3FYrEY9913n/v1iYmJMTp06GCsW7eu3uv11FNPeXSfPPnkk8bQoUONpKQkY9OmTcZdd91lBAYGGlu2bPH461O3HxISEoyUlBRjwIAB7gLo6denR48eRmBgoLFr1y4jLy/PyMvLM4qKijy+Tz777DMjJCTECAsLM1atWmXs3r3b+PDDD42dO3d6PMsnn3xiXHzxxUbHjh2NXbt2GR999JEhyfj00089/vr07NnTsFqtxtKlS42cnBzj73//uxEeHm6MHTvWo/vkF7/4hREeHm7Ex8cbmzdvNmbOnGlERkYa33//fYvuk40bNxqLFy82tmzZYuTk5BivvvqqERoaaqSlpXn8vbahLFar1cjMzHS/PsOGDTMiIyONxYsX13uv9fQ+ycjIMAYMGGAkJiYaa9eurfe56Ikszz77rHud5cuXG++//76xY8cOY/v27fXea/0dBbCFFRYWGpKM1atXu5f9/e9/NxISEoysrKx66+7du9fo3r27MWfOnAYfKzMzs8Ff+oakpaUZs2bNcn8/fPhw46abbnJncTqdRlJSknHdddd5PIth/LRfjn1TMmO/HP/61H3fvn170/ZJXZZ27doZt956qymvz+7duw1Jxpw5c4zzzz/fmDJliimvzx//+Eev+Pvzl7/8xUhPT/eKLIZR/3dlypQpRrdu3Yy33nrL41lGjBhxwj5JT083goODPZajsrLSsNlsxuuvv14vy+DBg42rrrqq1ffJr371K+OGG25wf2/me+3xWY79Pal7r/XE7+zxOY7PUvf/s2bNMiXL8dq1a2csWrSoSY/ny7gXcAsrKSmRJLVv39697Oqrr9bVV199wropKSn67rvvmv2cLpdLZWVl7ud0OBzasGGDbrzxRr3wwgtq3769rFarRowYocOHDysvL89jWerU7ZdjeXq/HJujblnd96tXr1a/fv08luPY546KitKbb76piooKTZ48Wc8888wJj9HaWaZOnSpJ+sUvfqHly5dLMuf1qa6uliT9z//8jyIiIpSRkaHZs2d7/Hd2+fLlSk9P11dffaUrr7xSnTt31m233abf/va3Ht8n0k+/KxEREXrttdc0depU/frXv9avf/1rj2YZMGCAPv74Y5WWlkqSNm/erJycHC1atEgDBw70SI7a2lo5nU7V1tZK+unvckhIiA4ePNiqvyubNm3Sf/7zHz344IOSzH2vPT6LZM7nT0M5js9S9/9XXXWVZsyY4fEsdZxOp/7+97+roqJCGRkZzX6+to4C2IJcLpfuuOMOnX322SeUidb02GOPqby8XNdcc40kqbi4WE6nU6+99lq9LPHx8crOzvZoFqn+fvniiy9a9fkby3L86+Op1+tk+2TChAmyWq0aMmSIwsPD9c477ygtLa3Vcpwsy+LFi7Vy5UplZGSY+nvrcrn05ZdfqlevXnrrrbeUl5enWbNm6dxzz9WWLVsUERHhkRyStGvXLm3fvl2dOnXS8uXLtX79et1+++0KCgpSZmZmq+Q4WZZjf0+/++47HT58WDfeeGOrZThZFpfLpezsbHXs2FGXX365bDabnE6nHnroIV1//fUeyxEREaEzzzxTd955p4YNG6Y+ffrotdde09q1a9W9e/dWydCpUycVFRWptrZW9913n26++WZJ5rzXniyLpz9/Tpbj+CxpaWm6/PLLWzVXY1kk6ZtvvlFGRoaqqqo89l7bFlAAW9CkSZO0ZcsWrVmzxmPPuXjxYs2aNUvLli1TXFxcvZ/t3r1b69evNz3LsfslOTnZtCzHvz6eeL0a2yd79+7VqlWrFBoaqqVLlyozM1OrV69utTemhrLk5ubq5ptvVrt27fTWW2+1yvM2NcukSZNUWFioNWvW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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(esplit, 100, (2**i for i in range(120, 134)));" ] }, { "cell_type": "markdown", "id": "a0402510-6565-4a63-a72c-fef5fc0cd7f4", "metadata": {}, "source": [ "In the \"no-error-on-zero\" case, we see no errors even up to and past the random mask size." ] }, { "cell_type": "code", "execution_count": 44, "id": "187be558-c52e-4ae5-8b1e-a492e913cfb9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 4: failed in 0 out of 100.\n", "k = 8: failed in 0 out of 100.\n", "k = 16: failed in 0 out of 100.\n", "k = 32: failed in 0 out of 100.\n", "k = 64: failed in 0 out of 100.\n", "k = 128: failed in 0 out of 100.\n", "k = 256: failed in 0 out of 100.\n", "k = 512: failed in 0 out of 100.\n", "k = 1024: failed in 0 out of 100.\n", "k = 2048: failed in 0 out of 100.\n", "k = 4096: failed in 0 out of 100.\n", "k = 8192: failed in 0 out of 100.\n", "k = 16384: failed in 0 out of 100.\n", "k = 32768: failed in 0 out of 100.\n", "k = 65536: failed in 0 out of 100.\n", "k = 131072: failed in 0 out of 100.\n", "k = 262144: failed in 0 out of 100.\n", "k = 524288: failed in 0 out of 100.\n", "k = 1048576: failed in 0 out of 100.\n", "k = 2097152: failed in 0 out of 100.\n", "k = 4194304: failed in 0 out of 100.\n", "k = 8388608: failed in 0 out of 100.\n", "k = 16777216: failed in 0 out of 100.\n", "k = 33554432: failed in 0 out of 100.\n", "k = 67108864: failed in 0 out of 100.\n", "k = 134217728: failed in 0 out of 100.\n", "k = 268435456: failed in 0 out of 100.\n", "k = 536870912: failed in 0 out of 100.\n", "k = 1073741824: failed in 0 out of 100.\n", "k = 2147483648: failed in 0 out of 100.\n", "k = 4294967296: failed in 0 out of 100.\n", "k = 8589934592: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "77e07ebd693e4ed3a502b3b1de8a5426", "version_major": 2, "version_minor": 0 }, "image/png": "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rLfcckuF+4PQ0FBPXWRkpM6aNcvn/UG9evU8tRERETpmzJgSdU8//bQ+99xzntqYmBiNiorSoKAgzzahZ8+eumLFigprIyMjNS4uTqOiojQqKko7duyo//73v0vt9+mnn9b8/HzPNvjvf/+7tmjRQl0ul+f1eOONNy59B+7HCIBVoEuXLjp37lz9+uuvdevWrdqtWzetXbu2/vzzz17zvfbaaxodHa2ff/65qqru3r1bg4ODtVu3bl61UVFR+uSTT+qnn36qe/bs0SlTpqjNZtPw8HBP7Y033qjVqlXTgQMHeo25bds2nTNnjm7dulW/++47feihh9Rms2m/fv3KHbO43/z8fE1NTdWuXbtqSEiIV79ljfnNN9+oiOiaNWv08OHDOmHCBI2KitJPPvmkwjEHDRqkDRs21KVLl+q+fft05MiRGhERUeGYR44c0cOHD3seEyZMULvdrt26dSt3zISEBA0KCtIRI0bonj17dNOmTZ4N54IFC3Tr1q3atm1bdTgcmpWV5fX+DRkyREVEn3zySd27d682adJEbTabpqene/V29OhRHTRokM6cOVO7dOmizZo1K/G+O51Otdvt2q9fP3333Xe1SZMmKiLapUsXT13Pnj1LrDMffPCBOhwOve6667Rhw4Z69913a7du3dTtduvAgQPLrU1ISNCQkBDt0aOHLl26VOvVq+d53yrqNygoSJOTk3XJkiW6fPlybdasmdpsNm3Tpk25Yxa/f/fdd5/WrFlTY2JiNDAw0KfXqHjHsmzZMl2zZo127NhRExISdMCAARWOGRgYqDExMTpjxgxt3769xsXF6XvvvefT+9KxY0ddv369rlmzRjt06KB2u12Tk5PLHfO6665TEdHWrVvr8uXLtXXr1hoYGKhdu3atcMyAgAB1OBw6ceJEXbZsmSYnJ6uI6K233lruNmDhwoUqItqoUSNdunSpPvDAA2qz2TQiIqLC7UdycrIGBwdru3bt9KqrrtLGjRtr7dq1dfTo0Tpq1ChP7Z133qkiopMmTfL0a7fb9ZprrtHFixfrP/7xD61Vq5aKiD700EPljnnttddqeHi43nbbbfr+++971vl77rmnwjGL/y+vWrVKY2NjNTo6WgMCAipczgYNGqiIaN++fT3rUM2aNX1azuDgYI2MjNQbb7xR586dq+3bt9fw8HC9//77yx2zdevWGhUV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cDgcunbt2ose8/HHH9fWrVuXW9evXz+tV6+eV9327dtVRHT37t0+jfnQQw9pQECA1/lZ5dXde++9evvtt3uN+fHHH3sdxatozMGDB2uNGjX022+/1VdffVUjIiL0gw8+KHMbcP5Hd8XjDhkyxHO0ydfth8PhKHH+lC+1119/vdpsNl2yZMlF1Z3/Gg0cONAT5MqqLf6I+cL1qDgs/+1vf7uoMW+//Xa96667Kuz3pptu0o4dO3rVFv9/X716dYVjPvjgg2qz2fSZZ57xml7emDfccIM+/vjjXmMWb7/LWxeK/elPf9IaNWro3r179cknn9QmTZqUmOfC/UHxenThtvnCo5Zl7UdUVSMiIjQqKqrMbWdZtRMnTlSXy+V1eoavtec7fz3C/yMAVoGioiJ9+OGHNSEhwbODudzadevWaVhYWInzai5lzPnz53udT1Ra7fbt23Xbtm2exwsvvKARERG6bds2PXny5EWP+cc//lFTUlLK7XfVqlUqIrpnzx7PfFu3bvU6KljRmPv27VObzVbi3JGyarOysrRVq1Ze8x06dMhzwv7FvH9FRUXasGFDDQwMLLOurJ3+E088odWqVfPqrW/fvtqlS5dy685frqCgIM/VfL6MWVRUpJ06dVIR0VdfffWi+i3ttRwzZowmJiaWWVdYWKj/8z//o3fddZfGxsbqsmXLdPDgwdqwYUPdtm2b5yr5ixkzIyNDe/fuXW7djBkz1OFwaI0aNTx1S5YsUbvdXuERwOIxiy8quvC8rbLqevfurfXr1/fq9bPPPlMR0UOHDl30ct50003aoUOHcrcBd955p958881etenp6fqnP/3porYfCQkJXueA+VKbnp6uNptN33777Yuqu3A5+/fvr23bti239pdffimxHvXs2VM7dOigc+bMuagxCwoKtGHDhjps2LAK+x0+fLhGRER49TtlyhStVq2aT2NGRUVpYGCgnjhxwufXKCUlRVNSUrzGXLBggQYFBV3Ucubn52u9evW8zu8tduH+4I477tDExESvMYvXo/Lqzh/X4XDoyJEjS+2trNqXXnpJIyMjdcOGDWXWlVV7oeL1CN4IgFVg8ODB6nK5dP369V63Jine2Vxs7eLFizUkJERHjBjh9XznXxxR1phz5szRRYsW6fbt23Xv3r26aNEiTUhI0Hvuueei+i3tI+Cy6mbOnKkLFizQHTt26I4dO3Ts2LFqt9t1zpw55dYeOnRIk5OT9aabbtLNmzfrl19+qWlpaV4XZFTU66hRozQhIaHUvw5Lq33nnXdURHTMmDG6e/du3bRpk+e+W6tWrSr3/Tt+/LhOnz5dd+zYoVu2bNFrr71WRUSnT59eou6bb77RLVu2aPfu3bVdu3a6ZcsW3bJli+e57rnnHhURveuuu/Sjjz7ScePGqd1u17/+9a/l1qmq595hV199tfbu3VtXr16t69ev102bNpVbm5GRoSKijz76qH711Veex+HDhyvs98Ybb9SwsDB966239NNPP9XJkydrWFiYDhgwoNy6C9+Dxx57TJs0aeLTa9SmTRsNDQ3Vt956S9etW6d//OMf1Waz6fTp08utK56vbdu2un79en333Xe1Tp06ev/991c4ZnG/nTp10pSUFM97WtFrW3yxyKOPPqqff/65Ll26VJs1a6apqakVjtm3b1/Pcq5YsUJ79OihYWFhGhwcXO424NNPP1WbzabBwcE6f/58feyxxzQgIEBffvnlCrcfDz74oIaHh+usWbM0NjZWBw8erKtXr9bXX39dQ0NDy61t3bq15/9Q8To0a9asCsdMS0vTsLAwXbBggX744YeanZ2tDodDH3nkkQrHvHA9uvPOOzU1NbXCMVu2bOkZc9WqVdqzZ091Op06Y8aMCse87777PKd3fPLJJ/rmm29qZGSkBgQE+NTrtddeqz169PDM889//rPCMVNTU1VE9JlnntF///vfunDhQo2Li1O73V5u3a233qqhoaG6YMEC/cc//qFt2rRRt9utf/3rXyvcHxRfUDN48GD96KOP9LHHHlO73a7jxo0rty4vL8+zLapWrZpnHcrOztY333yz3NoXX3xRg4KCdPHixV7LNHv27Ar7HTdunP7rX//SvXv36vbt23XSpEkaEBCgs2bNUngjAFaB8z/aOv8xd+7cS64t7XH+XzhlzTNo0CBt3ry5hoeHa1hYmDZp0kTHjRvndYK2L/2WFgDLqhs4cKA2btxYQ0NDNTIyUlu1aqXvvPOOT7Uvv/yy3nrrrRoeHq5xcXF6//33e23Yyuu1+GTwsv7yLO81SklJ0bCwMK1evbrP79/x48e1devWGhYWpqGhoeXWFV95euGjot7KuhGxL8tVUW1ZdW3atPnN+rXiNSqr7rXXXqvyMV9++eVLHrO0x4VHOS61tqx5im+yfCm1l1rXpk0bxvyNxryc/UHxDb/LqivrCwB8qS3r/8Rtt91WYb9PP/201q9fX4ODgzU6OlrT09N14cKFipJsqqoCAAAAY/BdwAAAAIYhAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAJynXbt28uijj1rdBgD8pgiAAAAAhiEAAgAAGIYACADlWL58ubhcLvnb3/5mdSsAUGkCrG4AAH6vFixYIIMGDZIFCxbILbfcYnU7AFBpOAIIAKWYNm2aPPTQQ/L+++8T/gD4HY4AAsAFFi9eLMeOHZNPP/1UWrZsaXU7AFDpOAIIABdISUmR6tWry5w5c0RVrW4HACodARAALlCvXj1Zt26dLF26VIYMGWJ1OwBQ6fgIGABKcfXVV8u6deukXbt2EhAQIFOmTLG6JQCoNARAAChDw4YN5YMPPpB27dqJw+GQyZMnW90SAFQKm3KCCwAAgFE4BxAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADDM/wI9OZCkpww2LAAAAABJRU5ErkJggg==", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(esplit, 100, (2**i for i in range(2, 34)), zero_fails=False);" ] }, { "cell_type": "markdown", "id": "98ec9216-b704-4d63-a83a-322d4b1eced0", "metadata": {}, "source": [ "### Additive splitting\n", "Additive splitting has no reason to error out." ] }, { "cell_type": "code", "execution_count": 45, "id": "ca9068dc-7752-482e-b56d-de69c0849a07", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 2: failed in 0 out of 100.\n", "k = 3: failed in 0 out of 100.\n", "k = 4: failed in 0 out of 100.\n", "k = 5: failed in 0 out of 100.\n", "k = 6: failed in 0 out of 100.\n", "k = 7: failed in 0 out of 100.\n", "k = 8: failed in 0 out of 100.\n", "k = 9: failed in 0 out of 100.\n", "k = 10: failed in 0 out of 100.\n", "k = 11: failed in 0 out of 100.\n", "k = 12: failed in 0 out of 100.\n", "k = 13: failed in 0 out of 100.\n", "k = 14: failed in 0 out of 100.\n", "k = 15: failed in 0 out of 100.\n", "k = 16: failed in 0 out of 100.\n", "k = 17: failed in 0 out of 100.\n", "k = 18: failed in 0 out of 100.\n", "k = 19: failed in 0 out of 100.\n", "k = 20: failed in 0 out of 100.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "83330daf26e742199c53eeaf99f5ece0", "version_major": 2, "version_minor": 0 }, "image/png": "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YqLf4kb79u3VoEEDbdmyxRcAj93vRMLCwtSpUye/saKiIj3yyCNau3atiouL5fF4VF5eroKCgpPO9cUXX+hf//qX34qfx+PR4cOHVV5ezg28T5GxATA1NVXvvfee39iqVauUmprqUEcAgHNJZGiwvnzcmQ8FRoYGn9L2devWVevWrX91m5qM1bReTURGRh73lXoZGRnav3+/XnjhBSUlJSk8PFypqamqrKw86VyHDh3SY489pptuuum4n/FNH6cuYALgoUOHtG3bNt/z7du3Kz8/X40aNVLz5s01fvx47dq1SwsXLpQk3XvvvZo5c6b+9Kc/afjw4frggw/0xhtvaMWKFU69BADAOcTlcp3S27CB4KKLLtLOnTu1c+dO3yrgl19+qZKSErVv396WGv/617/0l7/8Rddff70kaefOndq3b5/fNqGhofJ4PH5j3bp109atW3816KJmAuZv9meffabevXv7nh+9Vi8jI0MLFizQnj17/JaXW7RooRUrVmjMmDF64YUX1KxZM7388svcAgYAcN6pqKhQYWGh31hISIgaN258SvOkpaXp4osv1pAhQzRjxgwdOXJE999/v3r16lXtW8ino02bNnr11VfVo0cPud1ujR079rhLr5KTk5WTk6PLL79c4eHhatiwoSZNmqTf/OY3at68uW655RYFBQXpiy++0ObNm/Xkk0/a0ptJAuZTwFdffbUsyzrucfTbPRYsWKC1a9cet8/nn3+uiooKffvtt7r77rtrvW8AAM5Udna24uPj/R5XXHHFKc/jcrn07rvvqmHDhrrqqquUlpamli1bavHixbb1Om/ePP3444/q1q2b7rrrLj344IOKiYnx22b69OlatWqVEhMT1bVrV0k/36pt+fLlev/999WzZ09deumlev7555WUlGRbbyZxWWfjs+aGcLvdio6OVmlpqaKiopxuBwBwmg4fPqzt27ef9L52OL+c7M+U83cArQACAACgZgiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAA/C9ujBE4+LM8OQIgAMB4oaGhkqTy8nKHO4Fdjv5ZHv2zhb+A+SYQAABOV3BwsBo0aKDi4mJJUp06dY77DlucHyzLUnl5uYqLi9WgQQMFB5/a9yqbggAIAICkuLg4SfKFQJzfGjRo4PszxfEIgAAA6OevQYuPj1dMTIyqqqqcbgdnIDQ0lJW/X0EABADgF4KDgwkPCHh8CAQAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMExABcBZs2YpOTlZERERSklJ0fr160+6/YwZM9S2bVtFRkYqMTFRY8aM0eHDh2upWwAAAGcETABcvHixMjMzNXnyZOXl5alz587q27eviouLq91+0aJFGjdunCZPnqwtW7Zo3rx5Wrx4sSZMmFDLnQMAANSugAmAzz33nH7/+99r2LBhat++vebMmaM6derolVdeqXb7f//737r88st1xx13KDk5WX369NHtt9/+q6uGAAAA57uACICVlZXauHGj0tLSfGNBQUFKS0vTunXrqt3nsssu08aNG32B77vvvtN7772n66+/vlZ6BgAAcEqI0w3YYd++ffJ4PIqNjfUbj42N1VdffVXtPnfccYf27dunK664QpZl6ciRI7r33ntP+hZwRUWFKioqfM/dbrc9LwAAAKAWBcQK4OlYu3atpkyZor/85S/Ky8vT22+/rRUrVuiJJ5444T5ZWVmKjo72PRITE2uxYwAAAHu4LMuynG7iTFVWVqpOnTp66623NHjwYN94RkaGSkpK9O677x63z5VXXqlLL71UzzzzjG/stdde0//7f/9Phw4dUlDQ8dm4uhXAxMRElZaWKioqyt4XBQAAzgq3263o6Gijz98BsQIYFham7t27Kycnxzfm9XqVk5Oj1NTUavcpLy8/LuQFBwdLkk6UicPDwxUVFeX3AAAAON8ExDWAkpSZmamMjAz16NFDl1xyiWbMmKGysjINGzZMkjR06FA1bdpUWVlZkqQBAwboueeeU9euXZWSkqJt27Zp4sSJGjBggC8IAgAABKKACYDp6enau3evJk2a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9evL5XLZOrfb7VZiYqJ27tx51r6nkBrUoAY1qEENE2tYlqWDBw8qISFBQUFmXg3HCuAZCAoKUrNmzc5qjaioqLP+RdXUoAY1qEENaphWw9SVv6PMjL0AAAAGIwACAAAYhgB4jgoPD9fkyZMVHh5ODWpQgxrUoAY1YCs+BAIAAGAYVgABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAzyFZWVnq2bOn6tevr5iYGA0ePFhbt261tcbs2bPVqVMn3401U1NT9c9//tPWGseaOnWqXC6XRo8ebducjz76qFwul9+jXbt2ts1/1K5du3TnnXfqggsuUGRkpC6++GJ99tlnttZITk4+7rW4XC6NGDHClvk9Ho8mTpyoFi1aKDIyUq1atdITTzxh+3dgHjx4UKNHj1ZSUpIiIyN12WWXacOGDWc054cffqgBAwYoISFBLpdLS5Ys8fu5ZVmaNGmS4uPjFRkZqbS0NH3zzTe21nj77bfVp08fXXDBBXK5XMrPz7f1dVRVVemhhx7SxRdfrLp16yohIUFDhw7V7t27bX0djz76qNq1a6e6deuqYcOGSktL06effmprjV+699575XK5NGPGDFtr3H333ccdK/369bP9dWzZskUDBw5UdHS06tatq549e6qgoMC2GtUd8y6XS88884xtNQ4dOqQHHnhAzZo1U2RkpNq3b685c+bUeP6a1CgqKtLdd9+thIQE1alTR/369TvlY7Am577Dhw9rxIgRuuCCC1SvXj3dfPPNKioqOqU68EcAPIfk5uZqxIgR+uSTT7Rq1SpVVVWpT58+Kisrs61Gs2bNNHXqVG3cuFGfffaZrrnmGg0aNEj//e9/bavxSxs2bNBf//pXderUyfa5O3TooD179vgeH3/8sa3z//jjj7r88ssVGhqqf/7zn/ryyy81ffp0NWzY0NY6GzZs8Hsdq1atkiT99re/tWX+adOmafbs2Zo5c6a2bNmiadOm6emnn9aLL75oy/xH/e53v9OqVav06quvatOmTerTp4/S0tK0a9eu056zrKxMnTt31qxZs6r9+dNPP60///nPmjNnjj799FPVrVtXffv21eHDh22rUVZWpiuuuELTpk07rdfwazXKy8uVl5eniRMnKi8vT2+//ba2bt2qgQMH2lZDki688ELNnDlTmzZt0scff6zk5GT16dNHe/futa3GUe+8844++eQTJSQknNJrqGmNfv36+R0z//jHP2yt8e233+qKK65Qu3bttHbtWv3nP//RxIkTFRERYVuNX/a/Z88evfLKK3K5XLr55pttq5GZmans7Gy99tpr2rJli0aPHq0HHnhAS5cutaWGZVkaPHiwvvvuO7377rv6/PPPlZSUpLS0tFM6b9Xk3DdmzBgtW7ZMb775pnJzc7V7927ddNNNNa6Balg4ZxUXF1uSrNzc3LNap2HDhtbLL79s+7wHDx602rRpY61atcrq1auXNWrUKNvmnjx5stW5c2fb5qvOQw89ZF1xxRVntUZ1Ro0aZbVq1cryer22zHfDDTdYw4cP9xu76aabrCFDhtgyv2VZVnl5uRUcHGwtX77cb7xbt27Www8/bEsNSdY777zje+71eq24uDjrmWee8Y2VlJRY4eHh1j/+8Q9bavzS9u3bLUnW559/flpz16TGUevXr7ckWTt27DhrNUpLSy1J1urVq22t8cMPP1hNmza1Nm/ebCUlJVnPP//8ac1/ohoZGRnWoEGDTnvOmtRIT0+37rzzzrNa41iDBg2yrrnmGltrdOjQwXr88cf9xs7kmDy2xtatWy1J1ubNm31jHo/HatKkifXSSy+dVg3LOv7cV1JSYoWGhlpvvvmmb5stW7ZYkqx169addh3TsQJ4DistLZUkNWrU6KzM7/F49Prrr6usrEypqam2zz9ixAjdcMMNSktLs31uSfrmm2+UkJCgli1basiQIaf09kxNLF26VD169NBvf/tbxcTEqGvXrnrppZdsrXGsyspKvfbaaxo+fLhcLpctc1522WXKycnR119/LUn64osv9PHHH6t///62zC9JR44ckcfjOW6FJDIy0vaV2aO2b9+uwsJCv79f0dHRSklJ0bp1685KzdpSWloql8ulBg0anJX5KysrNXfuXEVHR6tz5862zev1enXXXXdp7Nix6tChg23zHmvt2rWKiYlR27Ztdd9992n//v22ze31erVixQpdeOGF6tu3r2JiYpSSknLSt7vPVFFRkVasWKF77rnH1nkvu+wyLV26VLt27ZJlWVqzZo2+/vpr9enTx5b5KyoqJMnvuA8KClJ4ePgZHffHnvs2btyoqqoqv2O9Xbt2at68+Xl/rDuJAHiO8nq9Gj16tC6//HJ17NjR1rk3bdqkevXqKTw8XPfee6/eeecdtW/f3tYar7/+uvLy8pSVlWXrvEelpKRowYIFys7O1uzZs7V9+3ZdeeWVOnjwoG01vvvuO82ePVtt2rTRypUrdd999+nBBx/U3/72N9tqHGvJkiUqKSnR3Xffbduc48aN02233aZ27dopNDRUXbt21ejRozVkyBDbatSvX1+pqal64okntHv3bnk8Hr322mtat26d9uzZY1udXyosLJQkxcbG+o3Hxsb6fnY+Onz4sB566CHdfvvtioqKsnXu5cuXq169eoqIiNDzzz+vVatWqXHjxrbNP23aNIWEhOjBBx+0bc5j9evXTwsXLlROTo6mTZum3Nxc9e/fXx6Px5b5i4uLdejQIU2dOlX9+vXT+++/rxtvvFE33XSTcnNzbalxrL/97W+qX7++7W9pvvjii2rfvr2aNWumsLAw9evXT7NmzdJVV11ly/xHQ9j48eP1448/qrKyUtOmTdMPP/xw2sd9dee+wsJChYWFHfcPovP9WHdaiNMNoHojRozQ5s2bz8rqSdu2bZWfn6/S0lK99dZbysjIUG5urm0hcOfOnRo1apRWrVp1StfMnIpfrl516tRJKSkpSkpK0htvvGHbv6K9Xq969OihKVOmSJK6du2qzZs3a86cOcrIyLClxrHmzZun/v37n9a1Uyfyxhtv6O9//7sWLVqkDh06KD8/X6NHj1ZCQoKtr+PVV1/V8OHD1bRpUwUHB6tbt266/fbbtXHjRttqBLqqqirdeuutsixLs2fPtn3+3r17Kz8/X/v27dNLL72kW2+9VZ9++qliYmLOeO6NGzfqhRdeUF5enm2r19W57bbbfP998cUXq1OnTmrVqpXWrl2ra6+99ozn93q9kqRBgwZpzJgxkqQuXbro3//+t+bMmaNevXqdcY1jvfLKKxoyZIjt/7988cUX9cknn2jp0qVKSkrShx9+qBEjRighIcGWd2ZCQ0P19ttv65577lGjRo0UHBystLQ09e/f/7Q/ZHY2z33wxwrgOeiBBx7Q8uXLtWbNGjVr1sz2+cPCwtS6dWt1795dWVlZ6ty5s1544QXb5t+4caOKi4vVrVs3hYSEKCQkRLm5ufrzn/+skJAQ2/6l/ksNGjTQhRdeqG3bttk2Z3x8/HGh+KKLLrL9reajduzYodWrV+t3v/udrfOOHTvWtwp48cUX66677tKYMWNsX51t1aqVcnNzdejQIe3cuVPr169XVVWVWrZsaWudo+Li4iTpuE8CFhUV+X52Pjka/nbs2KFVq1bZvvonSXXr1lXr1q116aWXat68eQoJCdG8efNsmfujjz5ScXGxmjdv7jvud+zYoT/84Q9KTk62pUZ1WrZsqcaNG9t27Ddu3FghISG1dux/9NFH2rp1q+3H/U8//aQJEyboueee04ABA9SpUyc98MADSk9P17PPPmtbne7duys/P18lJSXas2ePsrOztX///tM67k907ouLi1NlZaVKSkr8tj9fj/VzBQHwHGJZlh544AG98847+uCDD9SiRYtaqev1en3Xctjh2muv1aZNm5Sfn+979OjRQ0OGDFF+fr6Cg4Ntq3XUoUOH9O233yo+Pt62OS+//PLjbkXw9ddfKykpybYavzR//nzFxMTohhtusHXe8vJyBQX5H+rBwcG+lQ671a1bV/Hx8frxxx+1cuVKDRo06KzUadGiheLi4pSTk+Mbc7vd+vTTT8/KNa1n09Hw980332j16tW64IILaqWuncf+XXfdpf/85z9+x31CQoLGjh2rlStX2lKjOj/88IP2799v27EfFhamnj171tqxP2/ePHXv3t3WazGln/9OVVVV1dqxHx0drSZNmuibb77RZ599dkrH/a+d+7p3767Q0FC/Y33r1q0qKCg47471cwlvAZ9DRowYoUWLFundd99V/fr1fdc2REdHKzIy0pYa48ePV//+/dW8eXMdPHhQixYt0tq1a239H3T9+vWPu26xbt26uuCCC2y7nvGPf/yjBgwYoKSkJO3evVuTJ09WcHCwbr/9dlvml36+7cBll12mKVOm6NZbb9X69es1d+5czZ0717YaR3m9Xs2fP18ZGRkKCbH3sBwwYICeeuopNW/eXB06dNDnn3+u5557TsOHD7e1zsqVK2VZltq2batt27Zp7NixateunYYNG3bacx46dMhvZWf79u3Kz89Xo0aN1Lx5c40ePVpPPvmk2rRpoxYtWmjixIlKSEjQ4MGDbatx4MABFRQU+O7LdzQYxMXF1Xj14WQ14uPjdcsttygvL0/Lly+Xx+PxHfuNGjVSWFjYGde44IIL9NRTT2ngwIGKj4/Xvn37NGvWLO3ateuUbjf0a7+rY4NraGio4uLi1LZtW1tqNGrUSI899phuvvlmxcXF6dtvv9Wf/vQntW7dWn379rXtdYwdO1bp6em66qqr1Lt3b2VnZ2vZsmVau3atbTWkn//B8uabb2r69Ok1nvdUavTq1Utjx45VZGSkkpKSlJubq4ULF+q5556zrcabb76pJk2aqHnz5tq0aZNGjRqlwYMHn9IHTX7t3BcdHa177rlHmZmZatSokaKiojRy5Eilpqbq0ksvrXEdHMPJjyDDn6RqH/Pnz7etxvDhw62kpCQrLCzMatKkiXXttdda77//vm3zn4jdt4FJT0+34uPjrbCwMKtp06ZWenq6tW3bNtvmP2rZsmVWx44drfDwcKtdu3bW3Llzba9hWZa1cuVKS5K1detW2+d2u93WqFGjrObNm1sRERFWy5YtrYcfftiqqKiwtc7ixYutli1bWmFhYVZcXJw1YsQIq6Sk5IzmXLNmTbXHREZGhmVZP98KZuLEiVZsbKwVHh5uXXvttaf8O/y1GvPnz6/255MnT7alxtHby1T3WLNmjS01fvrpJ+vGG2+0EhISrLCwMCs+Pt4aOHCgtX79elt/V8c6ndvAnKxGeXm51adPH6tJkyZWaGiolZSUZP3+97+3CgsLbX8d8+bNs1q3bm1FRERYnTt3tpYsWWJ7jb/+9a9WZGTkaR8nv1Zjz5491t13320lJCRYERERVtu2ba3p06ef0i2mfq3GCy+8YDVr1swKDQ21mjdvbj3yyCOn/P+Wmpz7fvrpJ+v++++3GjZsaNWpU8e68cYbrT179pxSHfhzWZbNXwcAAACAcxrXAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAPALV199tUaPHu10GwBwVhEAAQAADEMABAAAMAwBEABOYsWKFYqOjtbf//53p1sBANuEON0AAJyrFi1apHvvvVeLFi3Sb37zG6fbAQDbsAIIANWYNWuW7r//fi1btozwByDgsAIIAMd46623VFxcrH/961/q2bOn0+0AgO1YAQSAY3Tt2lVNmjTRK6+8IsuynG4HAGxHAASAY7Rq1Upr1qzRu+++q5EjRzrdDgDYjreAAaAaF154odasWaOrr75aISEhmjFjhtMtAYBtCIAAcAJt27bVBx98oKuvvlrBwcGaPn260y0BgC1cFhe4AAAAGIVrAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMP8f3ivl3fpP3JlAAAAAElFTkSuQmCC", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_k10(asplit, 100);" ] }, { "cell_type": "markdown", "id": "867fedf2-0d95-4012-b57c-f2e3dcf0826c", "metadata": {}, "source": [ "## Composite test" ] }, { "cell_type": "code", "execution_count": 103, "id": "7fdd24cc-7c52-4222-b473-79b09c0df810", "metadata": {}, "outputs": [], "source": [ "composite = load_params_ectester(io.BytesIO(b\"0xc7a3ef9fa4ea63b537eedefc6bd52c3f35dc45be933d44270a1536c2ff9b6543,0x395f3675858362cbe7ac0d3e85708750aa42428368ae6ab1fda0d2a56255039b,0x61ca87695d4f6147b35975326eeee1a77f93226487315cd2419b4a1fe23f32d1,0x56e9a905d29f0f512cf709522bdd43a862d4e32c46268eec2f4c3fd9a70cb9d6,0xaf77a4ef604d33e3cf6c2ecaaa2913a5c51660e40365832ab98488950f3c348e,0xc7a3ef9fa4ea63b537eedefc6bd52c40f5e8e3bfe0f6dd05ac513edbcaa3cc47,0x01\"), \"projective\")" ] }, { "cell_type": "code", "execution_count": 104, "id": "9db677c5-34e3-4b5e-93dc-11b9b7e2cf3a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prime:\t0xc7a3ef9fa4ea63b537eedefc6bd52c3f35dc45be933d44270a1536c2ff9b6543\n", "a:\t0x395f3675858362cbe7ac0d3e85708750aa42428368ae6ab1fda0d2a56255039b\n", "b:\t0x61ca87695d4f6147b35975326eeee1a77f93226487315cd2419b4a1fe23f32d1\n", "G:\t[0x56e9a905d29f0f512cf709522bdd43a862d4e32c46268eec2f4c3fd9a70cb9d6,\n", "\t 0xaf77a4ef604d33e3cf6c2ecaaa2913a5c51660e40365832ab98488950f3c348e]\n", "n:\t0xc7a3ef9fa4ea63b537eedefc6bd52c40f5e8e3bfe0f6dd05ac513edbcaa3cc47\n" ] } ], "source": [ "print(f\"prime:\\t0x{composite.curve.prime:x}\")\n", "print(f\"a:\\t0x{composite.curve.parameters['a']:x}\")\n", "print(f\"b:\\t0x{composite.curve.parameters['b']:x}\")\n", "print(f\"G:\\t[0x{composite.generator.X:x},\\n\\t 0x{composite.generator.Y:x}]\")\n", "print(f\"n:\\t0x{composite.order:x}\")" ] }, { "cell_type": "code", "execution_count": 120, "id": "db1e4115-d0cf-4558-93e5-d60781407548", "metadata": {}, "outputs": [], "source": [ "def test_composite(countermeasure, samples):\n", " G = composite.generator\n", " Gaff = G.to_affine()\n", " correct = 0\n", " errors = 0\n", " wrong = 0\n", " for _ in range(samples):\n", " k = random.randrange(0, composite.full_order)\n", " countermeasure.init(composite, G)\n", " try:\n", " res = countermeasure.multiply(k)\n", " res_aff = composite.curve.affine_multiply(Gaff, k)\n", " \n", " if res.equals_scaled(res_aff.to_model(composite.curve.coordinate_model, composite.curve)):\n", " correct += 1\n", " else:\n", " wrong += 1\n", " except Exception as e:\n", " errors += 1\n", " print(f\"{errors} errors, {wrong} wrong results\")" ] }, { "cell_type": "code", "execution_count": 74, "id": "9946acdf-41db-4aa2-864a-1e1e771bc6cc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(ltr, 100)" ] }, { "cell_type": "code", "execution_count": 75, "id": "48eff976-9c37-471f-94ab-d09fd6cd53ae", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(rtl, 100)" ] }, { "cell_type": "markdown", "id": "54c9ef0f-bc9e-47b9-a7e4-3821c2a2f93a", "metadata": {}, "source": [ "### Group scalar randomization" ] }, { "cell_type": "code", "execution_count": 113, "id": "3420068e-70f3-4fd7-a986-b61e6e21cb54", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(gsr, 100)" ] }, { "cell_type": "markdown", "id": "fea32f4e-dca2-4a5c-bd93-6580183e2d02", "metadata": {}, "source": [ "### Multiplicative splitting" ] }, { "cell_type": "code", "execution_count": 114, "id": "1f540d89-af11-47ff-9477-32db8ccee045", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Element not invertible.\n", "Element not invertible.\n", "Element not invertible.\n", "Element not invertible.\n", "Element not invertible.\n", "Element not invertible.\n", "6 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(msplit, 100)" ] }, { "cell_type": "code", "execution_count": 115, "id": "00433eb9-9ef1-47b6-b2c6-775e08b67223", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 11 wrong results\n" ] } ], "source": [ "with TemporaryConfig() as cfg:\n", " cfg.ec.no_inverse_action = \"ignore\"\n", " test_composite(msplit, 100)" ] }, { "cell_type": "code", "execution_count": 116, "id": "c4e4e3be-f5f9-4de2-b2cd-48ecc31a97d1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 9 wrong results\n" ] } ], "source": [ "with TemporaryConfig() as cfg:\n", " cfg.ec.no_inverse_action = \"ignore\"\n", " cfg.ec.mod_implementation = \"python\"\n", " test_composite(msplit, 100)" ] }, { "cell_type": "code", "execution_count": 117, "id": "853470e9-0251-41de-9584-3a857fe15ffb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 11 wrong results\n" ] } ], "source": [ "with TemporaryConfig() as cfg:\n", " cfg.ec.no_inverse_action = \"ignore\"\n", " cfg.ec.mod_implementation = \"gmp\"\n", " test_composite(msplit, 100)" ] }, { "cell_type": "code", "execution_count": 118, "id": "6be325d3-6558-41c7-8e1a-c3a4d55d4627", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 11 wrong results\n" ] } ], "source": [ "with TemporaryConfig() as cfg:\n", " cfg.ec.no_inverse_action = \"ignore\"\n", " cfg.ec.mod_implementation = \"flint\"\n", " test_composite(msplit, 100)" ] }, { "cell_type": "code", "execution_count": 119, "id": "f4cd4c05-33ac-48f7-9996-751b2c7ffe4d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 100 wrong results\n" ] } ], "source": [ "def inverse(self) -> \"RawMod\":\n", " if self.x == 0:\n", " raise_non_invertible()\n", " res = self ** (self.n - 2)\n", " return RawMod(res.x, res.n)\n", "\n", "with TemporaryConfig() as cfg:\n", " old_inverse = RawMod.inverse\n", " cfg.ec.mod_implementation = \"python\"\n", " cfg.ec.no_inverse_action = \"ignore\"\n", " RawMod.inverse = inverse\n", " test_composite(msplit, 100)\n", " RawMod.inverse = old_inverse" ] }, { "cell_type": "markdown", "id": "189d4f2a-1f0c-473f-b9fe-988bf4fbe9f7", "metadata": {}, "source": [ "### Additive splitting" ] }, { "cell_type": "code", "execution_count": 78, "id": "c5fb0d90-0f65-44a5-abdc-10d12345a132", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(asplit, 100)" ] }, { "cell_type": "markdown", "id": "287b7945-c538-4b40-a65b-1081f68107ab", "metadata": {}, "source": [ "### Euclidean splitting" ] }, { "cell_type": "code", "execution_count": 79, "id": "61936c3a-6350-45dc-9870-20bac5b8c3e3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 errors, 0 wrong results\n" ] } ], "source": [ "test_composite(esplit, 100)" ] }, { "cell_type": "code", "execution_count": null, "id": "be530999-5ce8-407b-b9a8-0a8e9158eefd", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }