{
"cells": [
{
"cell_type": "markdown",
"id": "672213e3-f426-4113-b5b6-304002474ce3",
"metadata": {},
"source": [
"# Formula analysis\n",
"\n",
"This notebook analyzes behavior of formulas from the EFD in various exceptional cases, such as operating on the point at infinity or the all zero point they sometimes degenerate into."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "09d92ba3-ede4-40c3-a061-a9c328e26fb5",
"metadata": {},
"outputs": [],
"source": [
"import io\n",
"import json\n",
"\n",
"from pprint import pprint\n",
"import tabulate\n",
"from IPython.display import HTML, display\n",
"\n",
"from pyecsca.ec.params import load_params_ecgen\n",
"from pyecsca.ec.coordinates import AffineCoordinateModel\n",
"from pyecsca.ec.model import ShortWeierstrassModel\n",
"from pyecsca.ec.point import Point\n",
"from pyecsca.ec.mod import mod\n",
"from pyecsca.ec.error import UnsatisfiedAssumptionError\n",
"from pyecsca.misc.cfg import TemporaryConfig"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "5155a3ab-fd65-4add-ac3d-413de337c849",
"metadata": {},
"outputs": [],
"source": [
"model = ShortWeierstrassModel()\n",
"affine_coords = AffineCoordinateModel(model)\n",
"\n",
"curve_data = b\"\"\"[{\n",
" \"field\": {\n",
" \"p\": \"0x57880ae612d14d33afd0c965938ac1ba44824036cea5d4a1699a9f44000fb273\"\n",
" },\n",
" \"a\": \"0x55d376d1fbcc919da841bb13352d4e419ac85a100fb806014bed884db5916399\",\n",
" \"b\": \"0x21e27f7a065039ee59fd6b12c33d96709642aa6ac3738bd4f66fc663c79a19f8\",\n",
" \"order\": \"0x57880ae612d14d33afd0c965938ac1b91f16808ee875095bafed41e136ca7bfe\",\n",
" \"subgroups\": [\n",
" {\n",
" \"x\": \"0x407d5c52d9ad6f25bd7ff25f07804b4e4ebd4f5c992eafeb8c92e33f81e73b85\",\n",
" \"y\": \"0x4b92eefcfa7c5e295c7e649801b83649156974064a8649f9a94f915754bd2183\",\n",
" \"order\": \"0x57880ae612d14d33afd0c965938ac1b91f16808ee875095bafed41e136ca7bfe\",\n",
" \"cofactor\": \"0x1\",\n",
" \"points\": [\n",
" {\n",
" \"x\": \"0x2571326cc99fe050bfe1a6a02ea635c56504e49d122152fd281761748a0501d9\",\n",
" \"y\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n",
" \"order\": \"0x2\"\n",
" },\n",
" {\n",
" \"x\": \"0x266a5c5927e4f6feec30a9f3e2acb535657f365e1a24c1bb0b0d9158a7668639\",\n",
" \"y\": \"0x49c431e2a2704efb4b193e0fa26c60f815eaf195f712befd53b7bafb72b98488\",\n",
" \"order\": \"0x2bc405730968a699d7e864b2c9c560dc8f8b4047743a84add7f6a0f09b653dff\"\n",
" }\n",
" ]\n",
" }\n",
" ]\n",
"}]\"\"\"\n",
"curve_json = json.loads(curve_data)[0]\n",
"p = int(curve_json[\"field\"][\"p\"], 16)\n",
"order2_aff = Point(affine_coords,\n",
" x=mod(int(curve_json[\"subgroups\"][0][\"points\"][0][\"x\"], 16), p),\n",
" y=mod(int(curve_json[\"subgroups\"][0][\"points\"][0][\"y\"], 16), p))\n",
"orderbig_aff = Point(affine_coords,\n",
" x=mod(int(curve_json[\"subgroups\"][0][\"points\"][1][\"x\"], 16), p),\n",
" y=mod(int(curve_json[\"subgroups\"][0][\"points\"][1][\"y\"], 16), p))\n",
"\n",
"def allzero(pt):\n",
" return all(value == 0 for value in pt.coords.values())\n",
"\n",
"def affine(pt):\n",
" try:\n",
" pt.to_affine()\n",
" except Exception:\n",
" return False\n",
" return True\n",
"\n",
"def on_curve(curve, pt):\n",
" try:\n",
" return curve.is_on_curve(pt)\n",
" except Exception:\n",
" return False\n",
"\n",
"def eval_test(expected, out, curve):\n",
" return (expected.equals_homog(out) if expected is not None else \"Undefined\", allzero(out), affine(out), on_curve(curve, out), out)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e045a4cf-97db-4a2f-a191-582987f6473d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Skipping jacobian-3, unsatisfied assumption\n",
"Skipping jacobian-0, unsatisfied assumption\n",
"Skipping projective-1, unsatisfied assumption\n",
"Skipping projective-3, unsatisfied assumption\n",
"Skipping w12-0, unsatisfied assumption\n",
"Skipping xyzz-3, unsatisfied assumption\n"
]
}
],
"source": [
"results_add = {}\n",
"results_dbl = {}\n",
"\n",
"with TemporaryConfig() as cfg:\n",
" cfg.ec.unsatisfied_formula_assumption_action = \"ignore\"\n",
" for coords_name, coords in model.coordinates.items():\n",
" try:\n",
" params = load_params_ecgen(io.BytesIO(curve_data), coords_name, infty=False)\n",
" except UnsatisfiedAssumptionError:\n",
" print(f\"Skipping {coords_name}, unsatisfied assumption\")\n",
" continue\n",
" results_add[coords_name] = {}\n",
" results_dbl[coords_name] = {}\n",
" infty = params.curve.neutral\n",
" order2 = order2_aff.to_model(coords, params.curve)\n",
" orderbig = orderbig_aff.to_model(coords, params.curve)\n",
" orderbig_neg = params.curve.affine_negate(orderbig_aff).to_model(coords, params.curve)\n",
" orderbig2 = params.curve.affine_double(orderbig_aff).to_model(coords, params.curve)\n",
" r1_aff = params.curve.affine_random()\n",
" r1 = r1_aff.to_model(coords, params.curve)\n",
" r2_aff = params.curve.affine_add(order2_aff, r1_aff)\n",
" r2 = r2_aff.to_model(coords, params.curve)\n",
" zeros = Point(coords, **{var: mod(0, p) for var in coords.variables})\n",
"\n",
" adds = set(formula for formula in coords.formulas.values() if formula.shortname == \"add\")\n",
" dbls = set(formula for formula in coords.formulas.values() if formula.shortname == \"dbl\")\n",
" for add in adds:\n",
" res = {}\n",
" results_add[coords_name][add.name] = res\n",
" # P + P = ?\n",
" PpP = add(p, orderbig, orderbig, **params.curve.parameters)[0]\n",
" # P + infty = ?\n",
" PpInfty = add(p, orderbig, infty, **params.curve.parameters)[0]\n",
" InftypP = add(p, infty, orderbig, **params.curve.parameters)[0]\n",
" # ord2 + ord2 = ?\n",
" O2pO2 = add(p, order2, order2, **params.curve.parameters)[0]\n",
" # P + Q = infty\n",
" EqInfty1 = add(p, orderbig, orderbig_neg, **params.curve.parameters)[0]\n",
" EqInfty2 = add(p, orderbig_neg, orderbig, **params.curve.parameters)[0]\n",
" # P + zeros = ?\n",
" PpZeros = add(p, orderbig, zeros, **params.curve.parameters)[0]\n",
" ZerospP = add(p, zeros, orderbig, **params.curve.parameters)[0]\n",
" # P1 + P2 = ord2\n",
" PpQord2 = add(p, r1, r2, **params.curve.parameters)[0]\n",
" res[\"PpP\"] = eval_test(orderbig2, PpP, params.curve)\n",
" res[\"PpInfty\"] = eval_test(orderbig, PpInfty, params.curve)\n",
" res[\"InftypP\"] = eval_test(orderbig, InftypP, params.curve)\n",
" res[\"O2pO2\"] = eval_test(infty, O2pO2, params.curve)\n",
" res[\"EqInfty1\"] = eval_test(infty, EqInfty1, params.curve)\n",
" res[\"EqInfty2\"] = eval_test(infty, EqInfty2, params.curve)\n",
" res[\"PpZeros\"] = eval_test(None, PpZeros, params.curve)\n",
" res[\"ZerospP\"] = eval_test(None, ZerospP, params.curve)\n",
" res[\"PpQord2\"] = eval_test(order2, PpQord2, params.curve)\n",
" for dbl in dbls:\n",
" res = {}\n",
" results_dbl[coords_name][dbl.name] = res\n",
" O2twice = dbl(p, order2, **params.curve.parameters)[0]\n",
" Inftytwice = dbl(p, infty, **params.curve.parameters)[0]\n",
" Zerostwice = dbl(p, zeros, **params.curve.parameters)[0]\n",
" res[\"O2twice\"] = eval_test(infty, O2twice, params.curve)\n",
" res[\"Inftytwice\"] = eval_test(infty, Inftytwice, params.curve)\n",
" res[\"Zerostwice\"] = eval_test(None, Zerostwice, params.curve)"
]
},
{
"cell_type": "markdown",
"id": "847be8ca-6bed-47ff-b809-37d5e9b7b80a",
"metadata": {
"cell_style": "width: 700px; word-wrap: break-word;",
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"## Results (add)\n",
" - `P + P = ?`: Two behavior classes, complete formulas (RCB) and incomplete formulas.\n",
" For the complete, the result is correct, can be made affine and is on curve.\n",
" For the incomplete formulas the result is zeros, not affine and not on the curve.\n",
" - `P + infty = P` and `infty + P = P`: Four behavior classes, **for some the order matters**:\n",
" most of the `madd`s and `zadd`s. This is because they have an assumption `Z2 = 1`. Some\n",
" `madd`s fail the same in both cases.\n",
" > Not correct, zeros, not affine, not on curve\n",
" \n",
" > Correct, not zeros, affine, on curve\n",
" \n",
" > Not correct, not zeros, affine, not on curve\n",
" \n",
" > Not correct, not zeros, not affine, not on curve\n",
" - `Ord2 + Ord2 = infty`: Two behavior classes. Either correct behavior or zeros. Correct behavior for four fomulas on projective coords:\n",
" `add-2002-bj, add-2007-bl, add-2015-rcb, madd-2015-rcb`\n",
" - `P + -P = infty` and `-P + P = infty`: All correct, no zeros, no affine, on curve.\n",
" - `zeros + P = ?` and `P + zeros = ?`: Three behavior classes, in one, the zeros propagate, in another the formula makes up an affine point\n",
" that is not zeros but is not on the curve. In the final class, the formula makes up some point that is neither zeros, nor affine nor on the curve.\n",
" - `P + Q = Ord2`: The exceptional case for (otherwise complete) RCB formulas."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d0928c16-9688-4d65-a559-5895d1b7c85b",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"| Coords | Formula | Test | Correct? | Zeros? | Affine? | On curve? |
\n",
"\n",
"\n",
"| projective | madd-2015-rcb | PpP | True | False | True | True |
\n",
"| projective | madd-2015-rcb | PpInfty | False | False | True | False |
\n",
"| projective | madd-2015-rcb | InftypP | True | False | True | True |
\n",
"| projective | madd-2015-rcb | O2pO2 | True | False | False | True |
\n",
"| projective | madd-2015-rcb | EqInfty1 | True | False | False | True |
\n",
"| projective | madd-2015-rcb | EqInfty2 | True | False | False | True |
\n",
"| projective | madd-2015-rcb | PpZeros | Undefined | False | True | False |
\n",
"| projective | madd-2015-rcb | ZerospP | Undefined | True | False | False |
\n",
"| projective | madd-2015-rcb | PpQord2 | False | True | False | False |
\n",
"| projective | add-2007-bl | PpP | True | False | True | True |
\n",
"| projective | add-2007-bl | PpInfty | False | True | False | False |
\n",
"| projective | add-2007-bl | InftypP | False | True | False | False |
\n",
"| projective | add-2007-bl | O2pO2 | True | False | False | True |
\n",
"| projective | add-2007-bl | EqInfty1 | True | False | False | True |
\n",
"| projective | add-2007-bl | EqInfty2 | True | False | False | True |
\n",
"| projective | add-2007-bl | PpZeros | Undefined | True | False | False |
\n",
"| projective | add-2007-bl | ZerospP | Undefined | True | False | False |
\n",
"| projective | add-2007-bl | PpQord2 | False | False | True | True |
\n",
"| projective | madd-1998-cmo | PpP | False | True | False | False |
\n",
"| projective | madd-1998-cmo | PpInfty | False | False | True | False |
\n",
"| projective | madd-1998-cmo | InftypP | False | True | False | False |
\n",
"| projective | madd-1998-cmo | O2pO2 | False | True | False | False |
\n",
"| projective | madd-1998-cmo | EqInfty1 | True | False | False | True |
\n",
"| projective | madd-1998-cmo | EqInfty2 | True | False | False | True |
\n",
"| projective | madd-1998-cmo | PpZeros | Undefined | False | True | False |
\n",
"| projective | madd-1998-cmo | ZerospP | Undefined | True | False | False |
\n",
"| projective | madd-1998-cmo | PpQord2 | False | False | True | True |
\n",
"| projective | add-1998-cmo | PpP | False | True | False | False |
\n",
"| projective | add-1998-cmo | PpInfty | False | True | False | False |
\n",
"| projective | add-1998-cmo | InftypP | False | True | False | False |
\n",
"| projective | add-1998-cmo | O2pO2 | False | True | False | False |
\n",
"| projective | add-1998-cmo | EqInfty1 | True | False | False | True |
\n",
"| projective | add-1998-cmo | EqInfty2 | True | False | False | True |
\n",
"| projective | add-1998-cmo | PpZeros | Undefined | True | False | False |
\n",
"| projective | add-1998-cmo | ZerospP | Undefined | True | False | False |
\n",
"| projective | add-1998-cmo | PpQord2 | False | False | True | True |
\n",
"| projective | mmadd-1998-cmo | PpP | False | True | False | False |
\n",
"| projective | mmadd-1998-cmo | PpInfty | False | False | True | False |
\n",
"| projective | mmadd-1998-cmo | InftypP | False | False | True | False |
\n",
"| projective | mmadd-1998-cmo | O2pO2 | False | True | False | False |
\n",
"| projective | mmadd-1998-cmo | EqInfty1 | True | False | False | True |
\n",
"| projective | mmadd-1998-cmo | EqInfty2 | True | False | False | True |
\n",
"| projective | mmadd-1998-cmo | PpZeros | Undefined | False | True | False |
\n",
"| projective | mmadd-1998-cmo | ZerospP | Undefined | False | True | False |
\n",
"| projective | mmadd-1998-cmo | PpQord2 | False | False | True | True |
\n",
"| projective | add-2015-rcb | PpP | True | False | True | True |
\n",
"| projective | add-2015-rcb | PpInfty | True | False | True | True |
\n",
"| projective | add-2015-rcb | InftypP | True | False | True | True |
\n",
"| projective | add-2015-rcb | O2pO2 | True | False | False | True |
\n",
"| projective | add-2015-rcb | EqInfty1 | True | False | False | True |
\n",
"| projective | add-2015-rcb | EqInfty2 | True | False | False | True |
\n",
"| projective | add-2015-rcb | PpZeros | Undefined | True | False | False |
\n",
"| projective | add-2015-rcb | ZerospP | Undefined | True | False | False |
\n",
"| projective | add-2015-rcb | PpQord2 | False | True | False | False |
\n",
"| projective | add-2002-bj | PpP | True | False | True | True |
\n",
"| projective | add-2002-bj | PpInfty | False | True | False | False |
\n",
"| projective | add-2002-bj | InftypP | False | True | False | False |
\n",
"| projective | add-2002-bj | O2pO2 | True | False | False | True |
\n",
"| projective | add-2002-bj | EqInfty1 | True | False | False | True |
\n",
"| projective | add-2002-bj | EqInfty2 | True | False | False | True |
\n",
"| projective | add-2002-bj | PpZeros | Undefined | True | False | False |
\n",
"| projective | add-2002-bj | ZerospP | Undefined | True | False | False |
\n",
"| projective | add-2002-bj | PpQord2 | False | False | True | True |
\n",
"| projective | add-1998-cmo-2 | PpP | False | True | False | False |
\n",
"| projective | add-1998-cmo-2 | PpInfty | False | True | False | False |
\n",
"| projective | add-1998-cmo-2 | InftypP | False | True | False | False |
\n",
"| projective | add-1998-cmo-2 | O2pO2 | False | True | False | False |
\n",
"| projective | add-1998-cmo-2 | EqInfty1 | True | False | False | True |
\n",
"| projective | add-1998-cmo-2 | EqInfty2 | True | False | False | True |
\n",
"| projective | add-1998-cmo-2 | PpZeros | Undefined | True | False | False |
\n",
"| projective | add-1998-cmo-2 | ZerospP | Undefined | True | False | False |
\n",
"| projective | add-1998-cmo-2 | PpQord2 | False | False | True | True |
\n",
"| modified | add-2009-bl | PpP | False | True | False | False |
\n",
"| modified | add-2009-bl | PpInfty | False | True | False | False |
\n",
"| modified | add-2009-bl | InftypP | False | True | False | False |
\n",
"| modified | add-2009-bl | O2pO2 | False | True | False | False |
\n",
"| modified | add-2009-bl | EqInfty1 | True | False | False | True |
\n",
"| modified | add-2009-bl | EqInfty2 | True | False | False | True |
\n",
"| modified | add-2009-bl | PpZeros | Undefined | True | False | False |
\n",
"| modified | add-2009-bl | ZerospP | Undefined | True | False | False |
\n",
"| modified | add-2009-bl | PpQord2 | False | False | True | True |
\n",
"| modified | add-1998-cmo-2 | PpP | False | True | False | False |
\n",
"| modified | add-1998-cmo-2 | PpInfty | False | True | False | False |
\n",
"| modified | add-1998-cmo-2 | InftypP | False | True | False | False |
\n",
"| modified | add-1998-cmo-2 | O2pO2 | False | True | False | False |
\n",
"| modified | add-1998-cmo-2 | EqInfty1 | True | False | False | True |
\n",
"| modified | add-1998-cmo-2 | EqInfty2 | True | False | False | True |
\n",
"| modified | add-1998-cmo-2 | PpZeros | Undefined | True | False | False |
\n",
"| modified | add-1998-cmo-2 | ZerospP | Undefined | True | False | False |
\n",
"| modified | add-1998-cmo-2 | PpQord2 | False | False | True | True |
\n",
"| modified | mmadd-2009-bl | PpP | False | True | False | False |
\n",
"| modified | mmadd-2009-bl | PpInfty | False | False | True | False |
\n",
"| modified | mmadd-2009-bl | InftypP | False | False | True | False |
\n",
"| modified | mmadd-2009-bl | O2pO2 | False | True | False | False |
\n",
"| modified | mmadd-2009-bl | EqInfty1 | True | False | False | True |
\n",
"| modified | mmadd-2009-bl | EqInfty2 | True | False | False | True |
\n",
"| modified | mmadd-2009-bl | PpZeros | Undefined | False | True | False |
\n",
"| modified | mmadd-2009-bl | ZerospP | Undefined | False | True | False |
\n",
"| modified | mmadd-2009-bl | PpQord2 | False | False | True | True |
\n",
"| modified | madd-2009-bl | PpP | False | True | False | False |
\n",
"| modified | madd-2009-bl | PpInfty | False | False | True | False |
\n",
"| modified | madd-2009-bl | InftypP | False | True | False | False |
\n",
"| modified | madd-2009-bl | O2pO2 | False | True | False | False |
\n",
"| modified | madd-2009-bl | EqInfty1 | True | False | False | True |
\n",
"| modified | madd-2009-bl | EqInfty2 | True | False | False | True |
\n",
"| modified | madd-2009-bl | PpZeros | Undefined | False | True | False |
\n",
"| modified | madd-2009-bl | ZerospP | Undefined | True | False | False |
\n",
"| modified | madd-2009-bl | PpQord2 | False | False | True | True |
\n",
"| xyzz | mmadd-2008-s | PpP | False | True | False | False |
\n",
"| xyzz | mmadd-2008-s | PpInfty | False | False | True | False |
\n",
"| xyzz | mmadd-2008-s | InftypP | False | False | True | False |
\n",
"| xyzz | mmadd-2008-s | O2pO2 | False | True | False | False |
\n",
"| xyzz | mmadd-2008-s | EqInfty1 | True | False | False | True |
\n",
"| xyzz | mmadd-2008-s | EqInfty2 | True | False | False | True |
\n",
"| xyzz | mmadd-2008-s | PpZeros | Undefined | False | True | False |
\n",
"| xyzz | mmadd-2008-s | ZerospP | Undefined | False | True | False |
\n",
"| xyzz | mmadd-2008-s | PpQord2 | False | False | True | True |
\n",
"| xyzz | add-2008-s | PpP | False | True | False | False |
\n",
"| xyzz | add-2008-s | PpInfty | False | True | False | False |
\n",
"| xyzz | add-2008-s | InftypP | False | True | False | False |
\n",
"| xyzz | add-2008-s | O2pO2 | False | True | False | False |
\n",
"| xyzz | add-2008-s | EqInfty1 | True | False | False | True |
\n",
"| xyzz | add-2008-s | EqInfty2 | True | False | False | True |
\n",
"| xyzz | add-2008-s | PpZeros | Undefined | True | False | False |
\n",
"| xyzz | add-2008-s | ZerospP | Undefined | True | False | False |
\n",
"| xyzz | add-2008-s | PpQord2 | False | False | True | True |
\n",
"| xyzz | madd-2008-s | PpP | False | True | False | False |
\n",
"| xyzz | madd-2008-s | PpInfty | False | False | True | False |
\n",
"| xyzz | madd-2008-s | InftypP | False | True | False | False |
\n",
"| xyzz | madd-2008-s | O2pO2 | False | True | False | False |
\n",
"| xyzz | madd-2008-s | EqInfty1 | True | False | False | True |
\n",
"| xyzz | madd-2008-s | EqInfty2 | True | False | False | True |
\n",
"| xyzz | madd-2008-s | PpZeros | Undefined | False | True | False |
\n",
"| xyzz | madd-2008-s | ZerospP | Undefined | True | False | False |
\n",
"| xyzz | madd-2008-s | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-2001-b | PpP | False | True | False | False |
\n",
"| jacobian | add-2001-b | PpInfty | False | True | False | False |
\n",
"| jacobian | add-2001-b | InftypP | False | True | False | False |
\n",
"| jacobian | add-2001-b | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-2001-b | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-2001-b | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-2001-b | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-2001-b | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-2001-b | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-1986-cc | PpP | False | True | False | False |
\n",
"| jacobian | add-1986-cc | PpInfty | False | True | False | False |
\n",
"| jacobian | add-1986-cc | InftypP | False | True | False | False |
\n",
"| jacobian | add-1986-cc | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-1986-cc | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-1986-cc | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-1986-cc | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-1986-cc | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-1986-cc | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-1998-cmo-2 | PpP | False | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | PpInfty | False | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | InftypP | False | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-1998-cmo-2 | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-1998-cmo-2 | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-1998-cmo-2 | PpQord2 | False | False | True | True |
\n",
"| jacobian | madd-2004-hmv | PpP | False | True | False | False |
\n",
"| jacobian | madd-2004-hmv | PpInfty | False | False | True | False |
\n",
"| jacobian | madd-2004-hmv | InftypP | False | True | False | False |
\n",
"| jacobian | madd-2004-hmv | O2pO2 | False | True | False | False |
\n",
"| jacobian | madd-2004-hmv | EqInfty1 | True | False | False | True |
\n",
"| jacobian | madd-2004-hmv | EqInfty2 | True | False | False | True |
\n",
"| jacobian | madd-2004-hmv | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | madd-2004-hmv | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | madd-2004-hmv | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-2007-bl | PpP | False | True | False | False |
\n",
"| jacobian | add-2007-bl | PpInfty | False | True | False | False |
\n",
"| jacobian | add-2007-bl | InftypP | False | True | False | False |
\n",
"| jacobian | add-2007-bl | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-2007-bl | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-2007-bl | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-2007-bl | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-2007-bl | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-2007-bl | PpQord2 | False | False | True | True |
\n",
"| jacobian | zadd-2007-m | PpP | False | True | False | False |
\n",
"| jacobian | zadd-2007-m | PpInfty | False | False | True | False |
\n",
"| jacobian | zadd-2007-m | InftypP | False | False | False | False |
\n",
"| jacobian | zadd-2007-m | O2pO2 | False | True | False | False |
\n",
"| jacobian | zadd-2007-m | EqInfty1 | True | False | False | True |
\n",
"| jacobian | zadd-2007-m | EqInfty2 | True | False | False | True |
\n",
"| jacobian | zadd-2007-m | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | zadd-2007-m | ZerospP | Undefined | False | False | False |
\n",
"| jacobian | zadd-2007-m | PpQord2 | False | False | True | True |
\n",
"| jacobian | madd-2007-bl | PpP | False | True | False | False |
\n",
"| jacobian | madd-2007-bl | PpInfty | False | False | True | False |
\n",
"| jacobian | madd-2007-bl | InftypP | False | True | False | False |
\n",
"| jacobian | madd-2007-bl | O2pO2 | False | True | False | False |
\n",
"| jacobian | madd-2007-bl | EqInfty1 | True | False | False | True |
\n",
"| jacobian | madd-2007-bl | EqInfty2 | True | False | False | True |
\n",
"| jacobian | madd-2007-bl | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | madd-2007-bl | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | madd-2007-bl | PpQord2 | False | False | True | True |
\n",
"| jacobian | mmadd-2007-bl | PpP | False | True | False | False |
\n",
"| jacobian | mmadd-2007-bl | PpInfty | False | False | True | False |
\n",
"| jacobian | mmadd-2007-bl | InftypP | False | False | True | False |
\n",
"| jacobian | mmadd-2007-bl | O2pO2 | False | True | False | False |
\n",
"| jacobian | mmadd-2007-bl | EqInfty1 | True | False | False | True |
\n",
"| jacobian | mmadd-2007-bl | EqInfty2 | True | False | False | True |
\n",
"| jacobian | mmadd-2007-bl | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | mmadd-2007-bl | ZerospP | Undefined | False | True | False |
\n",
"| jacobian | mmadd-2007-bl | PpQord2 | False | False | True | True |
\n",
"| jacobian | madd-2008-g | PpP | False | True | False | False |
\n",
"| jacobian | madd-2008-g | PpInfty | False | False | True | False |
\n",
"| jacobian | madd-2008-g | InftypP | False | True | False | False |
\n",
"| jacobian | madd-2008-g | O2pO2 | False | True | False | False |
\n",
"| jacobian | madd-2008-g | EqInfty1 | True | False | False | True |
\n",
"| jacobian | madd-2008-g | EqInfty2 | True | False | False | True |
\n",
"| jacobian | madd-2008-g | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | madd-2008-g | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | madd-2008-g | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-1998-hnm | PpP | False | True | False | False |
\n",
"| jacobian | add-1998-hnm | PpInfty | False | True | False | False |
\n",
"| jacobian | add-1998-hnm | InftypP | False | True | False | False |
\n",
"| jacobian | add-1998-hnm | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-1998-hnm | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-1998-hnm | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-1998-hnm | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-1998-hnm | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-1998-hnm | PpQord2 | False | False | True | True |
\n",
"| jacobian | add-1998-cmo | PpP | False | True | False | False |
\n",
"| jacobian | add-1998-cmo | PpInfty | False | True | False | False |
\n",
"| jacobian | add-1998-cmo | InftypP | False | True | False | False |
\n",
"| jacobian | add-1998-cmo | O2pO2 | False | True | False | False |
\n",
"| jacobian | add-1998-cmo | EqInfty1 | True | False | False | True |
\n",
"| jacobian | add-1998-cmo | EqInfty2 | True | False | False | True |
\n",
"| jacobian | add-1998-cmo | PpZeros | Undefined | True | False | False |
\n",
"| jacobian | add-1998-cmo | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | add-1998-cmo | PpQord2 | False | False | True | True |
\n",
"| jacobian | madd | PpP | False | True | False | False |
\n",
"| jacobian | madd | PpInfty | False | False | True | False |
\n",
"| jacobian | madd | InftypP | False | True | False | False |
\n",
"| jacobian | madd | O2pO2 | False | True | False | False |
\n",
"| jacobian | madd | EqInfty1 | True | False | False | True |
\n",
"| jacobian | madd | EqInfty2 | True | False | False | True |
\n",
"| jacobian | madd | PpZeros | Undefined | False | True | False |
\n",
"| jacobian | madd | ZerospP | Undefined | True | False | False |
\n",
"| jacobian | madd | PpQord2 | False | False | True | True |
\n",
"\n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"table = [[\"Coords\", \"Formula\", \"Test\", \"Correct?\", \"Zeros?\", \"Affine?\", \"On curve?\"]]\n",
"test_filter = None\n",
"groups = {}\n",
"for coords_name, vals in results_add.items():\n",
" for name, formula in vals.items():\n",
" for k, v in formula.items():\n",
" if test_filter is None or k in test_filter:\n",
" item = (v[0], v[1], v[2], v[3])\n",
" group = groups.setdefault(item, set())\n",
" group.add(name + \"-\" + k + \"-\" + coords_name)\n",
" table.append((coords_name, name, k, v[0], v[1], v[2], v[3]))\n",
"if test_filter is not None:\n",
" for group, formulas in groups.items():\n",
" print(group)\n",
" for f in sorted(formulas):\n",
" print(f\"\\t{f}\")\n",
"display(HTML(tabulate.tabulate(table, tablefmt=\"html\", headers=\"firstrow\")))"
]
},
{
"cell_type": "markdown",
"id": "f8d713ed-7f06-4457-a921-1be0e9dddac3",
"metadata": {},
"source": [
"## Results (dbl)\n",
" - `2 * Ord2 = infty`: All correct, no zeros, no affine, on curve.\n",
" - `2 * infty = infty`: Three behavior classes: Some formulas are correct and return infty.\n",
" Some make up some affine point that is not zeros and not on curve.\n",
" Some return zeros.\n",
" - `2 * zeros = ?`: Two behavior classes, the zeros either propagate or become the infty."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "2d74db05-0606-4e54-87e0-c7fe0cbb5519",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"| | Formula | Test | Correct? | Zeros? | Affine? | On curve? |
\n",
"\n",
"\n",
"| projective | mdbl-2007-bl | O2twice | True | False | False | True |
\n",
"| projective | mdbl-2007-bl | Inftytwice | False | False | True | False |
\n",
"| projective | mdbl-2007-bl | Zerostwice | Undefined | False | False | True |
\n",
"| projective | dbl-2015-rcb | O2twice | True | False | False | True |
\n",
"| projective | dbl-2015-rcb | Inftytwice | True | False | False | True |
\n",
"| projective | dbl-2015-rcb | Zerostwice | Undefined | True | False | False |
\n",
"| projective | dbl-1998-cmo | O2twice | True | False | False | True |
\n",
"| projective | dbl-1998-cmo | Inftytwice | False | True | False | False |
\n",
"| projective | dbl-1998-cmo | Zerostwice | Undefined | True | False | False |
\n",
"| projective | dbl-2007-bl | O2twice | True | False | False | True |
\n",
"| projective | dbl-2007-bl | Inftytwice | False | True | False | False |
\n",
"| projective | dbl-2007-bl | Zerostwice | Undefined | True | False | False |
\n",
"| projective | dbl-1998-cmo-2 | O2twice | True | False | False | True |
\n",
"| projective | dbl-1998-cmo-2 | Inftytwice | False | True | False | False |
\n",
"| projective | dbl-1998-cmo-2 | Zerostwice | Undefined | True | False | False |
\n",
"| modified | dbl-2009-bl | O2twice | True | False | False | True |
\n",
"| modified | dbl-2009-bl | Inftytwice | True | False | False | True |
\n",
"| modified | dbl-2009-bl | Zerostwice | Undefined | True | False | False |
\n",
"| modified | mdbl-2009-bl | O2twice | True | False | False | True |
\n",
"| modified | mdbl-2009-bl | Inftytwice | False | False | True | False |
\n",
"| modified | mdbl-2009-bl | Zerostwice | Undefined | True | False | False |
\n",
"| modified | dbl-1998-cmo-2 | O2twice | True | False | False | True |
\n",
"| modified | dbl-1998-cmo-2 | Inftytwice | True | False | False | True |
\n",
"| modified | dbl-1998-cmo-2 | Zerostwice | Undefined | True | False | False |
\n",
"| xyzz | mdbl-2008-s-1 | O2twice | True | False | False | True |
\n",
"| xyzz | mdbl-2008-s-1 | Inftytwice | False | False | True | False |
\n",
"| xyzz | mdbl-2008-s-1 | Zerostwice | Undefined | False | False | True |
\n",
"| xyzz | dbl-2008-s-1 | O2twice | True | False | False | True |
\n",
"| xyzz | dbl-2008-s-1 | Inftytwice | True | False | False | True |
\n",
"| xyzz | dbl-2008-s-1 | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | dbl-1998-cmo | O2twice | True | False | False | True |
\n",
"| jacobian | dbl-1998-cmo | Inftytwice | True | False | False | True |
\n",
"| jacobian | dbl-1998-cmo | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | dbl-1986-cc | O2twice | True | False | False | True |
\n",
"| jacobian | dbl-1986-cc | Inftytwice | True | False | False | True |
\n",
"| jacobian | dbl-1986-cc | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | dbl-2007-bl | O2twice | True | False | False | True |
\n",
"| jacobian | dbl-2007-bl | Inftytwice | True | False | False | True |
\n",
"| jacobian | dbl-2007-bl | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | dbl-1998-cmo-2 | O2twice | True | False | False | True |
\n",
"| jacobian | dbl-1998-cmo-2 | Inftytwice | True | False | False | True |
\n",
"| jacobian | dbl-1998-cmo-2 | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | dbl-1998-hnm | O2twice | True | False | False | True |
\n",
"| jacobian | dbl-1998-hnm | Inftytwice | True | False | False | True |
\n",
"| jacobian | dbl-1998-hnm | Zerostwice | Undefined | True | False | False |
\n",
"| jacobian | mdbl-2007-bl | O2twice | True | False | False | True |
\n",
"| jacobian | mdbl-2007-bl | Inftytwice | False | False | True | False |
\n",
"| jacobian | mdbl-2007-bl | Zerostwice | Undefined | False | False | True |
\n",
"| xz | dbl-2002-bj-3 | O2twice | True | False | False | True |
\n",
"| xz | dbl-2002-bj-3 | Inftytwice | True | False | False | True |
\n",
"| xz | dbl-2002-bj-3 | Zerostwice | Undefined | True | False | False |
\n",
"| xz | dbl-2002-bj | O2twice | True | False | False | True |
\n",
"| xz | dbl-2002-bj | Inftytwice | True | False | False | True |
\n",
"| xz | dbl-2002-bj | Zerostwice | Undefined | True | False | False |
\n",
"| xz | dbl-2002-it-2 | O2twice | True | False | False | True |
\n",
"| xz | dbl-2002-it-2 | Inftytwice | True | False | False | True |
\n",
"| xz | dbl-2002-it-2 | Zerostwice | Undefined | True | False | False |
\n",
"| xz | dbl-2002-it | O2twice | True | False | False | True |
\n",
"| xz | dbl-2002-it | Inftytwice | True | False | False | True |
\n",
"| xz | dbl-2002-it | Zerostwice | Undefined | True | False | False |
\n",
"| xz | dbl-2002-bj-2 | O2twice | True | False | False | True |
\n",
"| xz | dbl-2002-bj-2 | Inftytwice | True | False | False | True |
\n",
"| xz | dbl-2002-bj-2 | Zerostwice | Undefined | True | False | False |
\n",
"\n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"table = [[\"Formula\", \"Test\", \"Correct?\", \"Zeros?\", \"Affine?\", \"On curve?\"]]\n",
"test_filter = None\n",
"groups = {}\n",
"for coords_name, vals in results_dbl.items():\n",
" for name, formula in vals.items():\n",
" for k, v in formula.items():\n",
" if test_filter is None or k in test_filter:\n",
" item = (v[0], v[1], v[2], v[3])\n",
" group = groups.setdefault(item, set())\n",
" group.add(name + \"-\" + k + \"-\" + coords_name)\n",
" table.append((coords_name, name, k, v[0], v[1], v[2], v[3]))\n",
"if test_filter is not None:\n",
" for group, formulas in groups.items():\n",
" print(group)\n",
" for f in sorted(formulas):\n",
" print(f\"\\t{f}\")\n",
"display(HTML(tabulate.tabulate(table, tablefmt=\"html\", headers=\"firstrow\")))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9194ed95-4aeb-4aeb-bf8f-b8e0c1f1f987",
"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
}