aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2024-01-23 20:54:57 +0100
committerJ08nY2024-01-23 20:54:57 +0100
commit2bf7c2b808d7e1ada34279cc7974ac69f46c33df (patch)
treede09dc99ac5f771e775bc4050b2225e45117a0ed
parent99798ed0573c860abe0618589b55858727a5077b (diff)
downloadpyecsca-notebook-2bf7c2b808d7e1ada34279cc7974ac69f46c33df.tar.gz
pyecsca-notebook-2bf7c2b808d7e1ada34279cc7974ac69f46c33df.tar.zst
pyecsca-notebook-2bf7c2b808d7e1ada34279cc7974ac69f46c33df.zip
Update ZVP notebook with new bounds.
-rw-r--r--re/zvp.ipynb415
1 files changed, 229 insertions, 186 deletions
diff --git a/re/zvp.ipynb b/re/zvp.ipynb
index cdb1d94..3835be1 100644
--- a/re/zvp.ipynb
+++ b/re/zvp.ipynb
@@ -17,9 +17,10 @@
"source": [
"import io\n",
"import numpy as np\n",
- "from sympy import FF, sympify, symbols, Poly, Monomial\n",
- "from collections import Counter\n",
+ "from sympy import FF, sympify, symbols, Poly\n",
+ "import random\n",
"import tabulate\n",
+ "import pickle\n",
"from functools import partial\n",
"from itertools import product\n",
"from IPython.display import HTML, display\n",
@@ -34,7 +35,7 @@
"from pyecsca.ec.formula import FormulaAction, AdditionFormula, DoublingFormula\n",
"from pyecsca.ec.point import Point\n",
"from pyecsca.ec.mod import Mod, gcd, SymbolicMod\n",
- "from pyecsca.sca.re.tree import build_distinguishing_tree, expand_tree\n",
+ "from pyecsca.sca.re.tree import Map, Tree\n",
"from pyecsca.sca.re.rpa import MultipleContext\n",
"from pyecsca.sca.re.zvp import zvp_points, compute_factor_set\n",
"from pyecsca.ec.context import DefaultContext, local\n",
@@ -47,16 +48,6 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "c2240ed4-5279-487a-ad90-f6a6798f403c",
- "metadata": {},
- "outputs": [],
- "source": [
- "# TODO: Maybe combine with EPA?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
"id": "faca31e8-fe51-4017-a41d-ba31b15c548d",
"metadata": {},
"outputs": [],
@@ -162,31 +153,53 @@
"source": [
"curves = list(map(lambda spec: load_params_ecgen(io.BytesIO(spec.encode()), \"affine\"), [\n",
" # Random\n",
- " \"\"\"[{\"field\":{\"p\":\"0xa7ec3617d4166b2d\"},\"a\":\"0x372994d9d680a83b\",\"b\":\"0xa0a2bf719d8e68c5\",\"order\":\"0xa7ec3618be1dab55\",\"subgroups\":[{\"x\":\"0x1ef15756946a5b6d\",\"y\":\"0x2ca9658f7ab9a558\",\"order\":\"0xa7ec3618be1dab55\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x1ef15756946a5b6d\",\"y\":\"0x2ca9658f7ab9a558\",\"order\":\"0xa7ec3618be1dab55\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xddf438409fc35161\"},\"a\":\"0x94d919b72f7dc6d8\",\"b\":\"0x9f39032abb23f62a\",\"order\":\"0xddf4383ffa8e6de7\",\"subgroups\":[{\"x\":\"0xd5673b3fe176fc6b\",\"y\":\"0x2d5b0a5bb2141317\",\"order\":\"0xddf4383ffa8e6de7\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xd5673b3fe176fc6b\",\"y\":\"0x2d5b0a5bb2141317\",\"order\":\"0xddf4383ffa8e6de7\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xa42c1467a1ed04f3\"},\"a\":\"0x55d07340a4572f2d\",\"b\":\"0x0a938c37dfb0b6d5\",\"order\":\"0xa42c14689284d3a7\",\"subgroups\":[{\"x\":\"0x8633981c83ed43a2\",\"y\":\"0x7b5374e9d7997199\",\"order\":\"0xa42c14689284d3a7\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x8633981c83ed43a2\",\"y\":\"0x7b5374e9d7997199\",\"order\":\"0xa42c14689284d3a7\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xea0d9cead19016ab\"},\"a\":\"0xcbbfe501c4ef6d92\",\"b\":\"0x5762de777a6d9178\",\"order\":\"0xea0d9cea8cd2c857\",\"subgroups\":[{\"x\":\"0xe7daa3e061c3111b\",\"y\":\"0x56ee59a6845c5e93\",\"order\":\"0xea0d9cea8cd2c857\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xe7daa3e061c3111b\",\"y\":\"0x56ee59a6845c5e93\",\"order\":\"0xea0d9cea8cd2c857\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0x9c7e7216decb71a7\"},\"a\":\"0x324ef48887401a87\",\"b\":\"0x3ce6f35a00280102\",\"order\":\"0x9c7e72175ebfe709\",\"subgroups\":[{\"x\":\"0x34683229b405418d\",\"y\":\"0x308c923cae004514\",\"order\":\"0x9c7e72175ebfe709\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x34683229b405418d\",\"y\":\"0x308c923cae004514\",\"order\":\"0x9c7e72175ebfe709\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0xeb5779f0bbf1ef5b\"},\"a\":\"0x2419e8bbc7b5f8f2\",\"b\":\"0xe74e5d3064a4f2e3\",\"order\":\"0xeb5779f21320c2e9\",\"subgroups\":[{\"x\":\"0x3b6c269560abeb00\",\"y\":\"0x29d157628e75e1c0\",\"order\":\"0xeb5779f21320c2e9\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x3b6c269560abeb00\",\"y\":\"0x29d157628e75e1c0\",\"order\":\"0xeb5779f21320c2e9\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0x97b6ea097868b95d\"},\"a\":\"0x550a41d65e4bcd13\",\"b\":\"0x47c5e527113b261c\",\"order\":\"0x97b6ea094947a76b\",\"subgroups\":[{\"x\":\"0x1e669fe19c865bd9\",\"y\":\"0x05a6bb891920440f\",\"order\":\"0x97b6ea094947a76b\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x1e669fe19c865bd9\",\"y\":\"0x05a6bb891920440f\",\"order\":\"0x97b6ea094947a76b\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0xa00629e6522032f7\"},\"a\":\"0x896f04a7ae302922\",\"b\":\"0x6bc03365b1f1cb50\",\"order\":\"0xa00629e5c03cf913\",\"subgroups\":[{\"x\":\"0x14b7b48954936d4e\",\"y\":\"0x670dc776273bf899\",\"order\":\"0xa00629e5c03cf913\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x14b7b48954936d4e\",\"y\":\"0x670dc776273bf899\",\"order\":\"0xa00629e5c03cf913\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0xd47ec1d03a62686d\"},\"a\":\"0xd00a3ee0f5c86b02\",\"b\":\"0x457a5b6c47db38d8\",\"order\":\"0xd47ec1d107db7d6f\",\"subgroups\":[{\"x\":\"0x41ebc3b763f3cd1b\",\"y\":\"0x3d6925f214620e0c\",\"order\":\"0xd47ec1d107db7d6f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x41ebc3b763f3cd1b\",\"y\":\"0x3d6925f214620e0c\",\"order\":\"0xd47ec1d107db7d6f\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0xb1c9115c6f40d755\"},\"a\":\"0x79d3ceefafc44ce9\",\"b\":\"0x8316af84264df42b\",\"order\":\"0xb1c9115d17f84a45\",\"subgroups\":[{\"x\":\"0x8b0a274089b53fe5\",\"y\":\"0x3508d33c4beba5ad\",\"order\":\"0xb1c9115d17f84a45\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x8b0a274089b53fe5\",\"y\":\"0x3508d33c4beba5ad\",\"order\":\"0xb1c9115d17f84a45\"}]}]}]\"\"\",\n",
- " #\"\"\"[{\"field\":{\"p\":\"0x8f738fda18cd5dff\"},\"a\":\"0x4747f2f9b8628cbf\",\"b\":\"0x586cdb9378a1389f\",\"order\":\"0x8f738fd8fc7ebed3\",\"subgroups\":[{\"x\":\"0x7ad306c73b64c1b5\",\"y\":\"0x69e3ca555190da4b\",\"order\":\"0x8f738fd8fc7ebed3\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x7ad306c73b64c1b5\",\"y\":\"0x69e3ca555190da4b\",\"order\":\"0x8f738fd8fc7ebed3\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x9c7e7216decb71a7\"},\"a\":\"0x324ef48887401a87\",\"b\":\"0x3ce6f35a00280102\",\"order\":\"0x9c7e72175ebfe709\",\"subgroups\":[{\"x\":\"0x34683229b405418d\",\"y\":\"0x308c923cae004514\",\"order\":\"0x9c7e72175ebfe709\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x34683229b405418d\",\"y\":\"0x308c923cae004514\",\"order\":\"0x9c7e72175ebfe709\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xeb5779f0bbf1ef5b\"},\"a\":\"0x2419e8bbc7b5f8f2\",\"b\":\"0xe74e5d3064a4f2e3\",\"order\":\"0xeb5779f21320c2e9\",\"subgroups\":[{\"x\":\"0x3b6c269560abeb00\",\"y\":\"0x29d157628e75e1c0\",\"order\":\"0xeb5779f21320c2e9\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x3b6c269560abeb00\",\"y\":\"0x29d157628e75e1c0\",\"order\":\"0xeb5779f21320c2e9\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x97b6ea097868b95d\"},\"a\":\"0x550a41d65e4bcd13\",\"b\":\"0x47c5e527113b261c\",\"order\":\"0x97b6ea094947a76b\",\"subgroups\":[{\"x\":\"0x1e669fe19c865bd9\",\"y\":\"0x05a6bb891920440f\",\"order\":\"0x97b6ea094947a76b\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x1e669fe19c865bd9\",\"y\":\"0x05a6bb891920440f\",\"order\":\"0x97b6ea094947a76b\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xa00629e6522032f7\"},\"a\":\"0x896f04a7ae302922\",\"b\":\"0x6bc03365b1f1cb50\",\"order\":\"0xa00629e5c03cf913\",\"subgroups\":[{\"x\":\"0x14b7b48954936d4e\",\"y\":\"0x670dc776273bf899\",\"order\":\"0xa00629e5c03cf913\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x14b7b48954936d4e\",\"y\":\"0x670dc776273bf899\",\"order\":\"0xa00629e5c03cf913\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xd47ec1d03a62686d\"},\"a\":\"0xd00a3ee0f5c86b02\",\"b\":\"0x457a5b6c47db38d8\",\"order\":\"0xd47ec1d107db7d6f\",\"subgroups\":[{\"x\":\"0x41ebc3b763f3cd1b\",\"y\":\"0x3d6925f214620e0c\",\"order\":\"0xd47ec1d107db7d6f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x41ebc3b763f3cd1b\",\"y\":\"0x3d6925f214620e0c\",\"order\":\"0xd47ec1d107db7d6f\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xb1c9115c6f40d755\"},\"a\":\"0x79d3ceefafc44ce9\",\"b\":\"0x8316af84264df42b\",\"order\":\"0xb1c9115d17f84a45\",\"subgroups\":[{\"x\":\"0x8b0a274089b53fe5\",\"y\":\"0x3508d33c4beba5ad\",\"order\":\"0xb1c9115d17f84a45\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x8b0a274089b53fe5\",\"y\":\"0x3508d33c4beba5ad\",\"order\":\"0xb1c9115d17f84a45\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x8f738fda18cd5dff\"},\"a\":\"0x4747f2f9b8628cbf\",\"b\":\"0x586cdb9378a1389f\",\"order\":\"0x8f738fd8fc7ebed3\",\"subgroups\":[{\"x\":\"0x7ad306c73b64c1b5\",\"y\":\"0x69e3ca555190da4b\",\"order\":\"0x8f738fd8fc7ebed3\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x7ad306c73b64c1b5\",\"y\":\"0x69e3ca555190da4b\",\"order\":\"0x8f738fd8fc7ebed3\"}]}]}]\"\"\",\n",
" # a = -1\n",
" \"\"\"[{\"field\":{\"p\":\"0xcfef393139c3007f\"},\"a\":\"0xcfef393139c3007e\",\"b\":\"0x950312812acb155f\",\"order\":\"0xcfef39320179387b\",\"subgroups\":[{\"x\":\"0xae2d2f58ca5b5cf7\",\"y\":\"0xc3a4bf3a1dc10005\",\"order\":\"0xcfef39320179387b\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xae2d2f58ca5b5cf7\",\"y\":\"0xc3a4bf3a1dc10005\",\"order\":\"0xcfef39320179387b\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xb0461c0e4946cbd5\"},\"a\":\"0xb0461c0e4946cbd4\",\"b\":\"0x082c3722016def51\",\"order\":\"0xb0461c0e07e3e1bf\",\"subgroups\":[{\"x\":\"0x5142200263be1fe3\",\"y\":\"0x14984b7551ed21a9\",\"order\":\"0xb0461c0e07e3e1bf\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x5142200263be1fe3\",\"y\":\"0x14984b7551ed21a9\",\"order\":\"0xb0461c0e07e3e1bf\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xeff607c2dc4f278b\"},\"a\":\"0xeff607c2dc4f278a\",\"b\":\"0x26fd03674f5092d2\",\"order\":\"0xeff607c30ab8c50d\",\"subgroups\":[{\"x\":\"0x004d4a5a9bb849fe\",\"y\":\"0x80eb7ef89110c149\",\"order\":\"0xeff607c30ab8c50d\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x004d4a5a9bb849fe\",\"y\":\"0x80eb7ef89110c149\",\"order\":\"0xeff607c30ab8c50d\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xedc14fda51686379\"},\"a\":\"0xedc14fda51686378\",\"b\":\"0xb3973a86901e3364\",\"order\":\"0xedc14fda0cdbc199\",\"subgroups\":[{\"x\":\"0xc76f0776feb59336\",\"y\":\"0x625adaf0fb44ab9f\",\"order\":\"0xedc14fda0cdbc199\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xc76f0776feb59336\",\"y\":\"0x625adaf0fb44ab9f\",\"order\":\"0xedc14fda0cdbc199\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xfc6ee07288f1b78f\"},\"a\":\"0xfc6ee07288f1b78e\",\"b\":\"0xe18821a83ca2ca30\",\"order\":\"0xfc6ee0713e07f37f\",\"subgroups\":[{\"x\":\"0x339d01a4b0db428e\",\"y\":\"0x68100d42e5ffd979\",\"order\":\"0xfc6ee0713e07f37f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x339d01a4b0db428e\",\"y\":\"0x68100d42e5ffd979\",\"order\":\"0xfc6ee0713e07f37f\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xa03c03a0072f69b3\"},\"a\":\"0xa03c03a0072f69b2\",\"b\":\"0x3208ecebb633b82c\",\"order\":\"0xa03c039ff31e37a7\",\"subgroups\":[{\"x\":\"0x8134208d53e6f6c0\",\"y\":\"0x6245db54032630a6\",\"order\":\"0xa03c039ff31e37a7\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x8134208d53e6f6c0\",\"y\":\"0x6245db54032630a6\",\"order\":\"0xa03c039ff31e37a7\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xbc8c6e7ce26746d9\"},\"a\":\"0xbc8c6e7ce26746d8\",\"b\":\"0xb7e2b4fb2d769c4e\",\"order\":\"0xbc8c6e7ba032dda7\",\"subgroups\":[{\"x\":\"0x8e3c9cd771e7ffd8\",\"y\":\"0x4dd02403ca890c5a\",\"order\":\"0xbc8c6e7ba032dda7\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x8e3c9cd771e7ffd8\",\"y\":\"0x4dd02403ca890c5a\",\"order\":\"0xbc8c6e7ba032dda7\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x9ccda4c062b95787\"},\"a\":\"0x9ccda4c062b95786\",\"b\":\"0x31fcbb278951e3b9\",\"order\":\"0x9ccda4bfae73e4f5\",\"subgroups\":[{\"x\":\"0x303ac583c81644e3\",\"y\":\"0x76713f6f470e94a0\",\"order\":\"0x9ccda4bfae73e4f5\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x303ac583c81644e3\",\"y\":\"0x76713f6f470e94a0\",\"order\":\"0x9ccda4bfae73e4f5\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xa339e3745518416f\"},\"a\":\"0xa339e3745518416e\",\"b\":\"0x52d39a67f2401673\",\"order\":\"0xa339e3743950389b\",\"subgroups\":[{\"x\":\"0x6b8986f706afac58\",\"y\":\"0x5c901b1afa0b64da\",\"order\":\"0xa339e3743950389b\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x6b8986f706afac58\",\"y\":\"0x5c901b1afa0b64da\",\"order\":\"0xa339e3743950389b\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x8b7d2baee4e47311\"},\"a\":\"0x8b7d2baee4e47310\",\"b\":\"0x21ab23afb5a9e2ca\",\"order\":\"0x8b7d2baf201f2bdd\",\"subgroups\":[{\"x\":\"0x797c1dec0d73ec64\",\"y\":\"0x28f90926ea9c6b33\",\"order\":\"0x8b7d2baf201f2bdd\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x797c1dec0d73ec64\",\"y\":\"0x28f90926ea9c6b33\",\"order\":\"0x8b7d2baf201f2bdd\"}]}]}]\"\"\",\n",
" # a = -3\n",
" \"\"\"[{\"field\":{\"p\":\"0x8d79ca36cee026a7\"},\"a\":\"0x8d79ca36cee026a4\",\"b\":\"0x0478c1f80ce2c9c6\",\"order\":\"0x8d79ca35a428c76f\",\"subgroups\":[{\"x\":\"0x2e94a3e38f8b345e\",\"y\":\"0x83e6c6f0cb8f69c4\",\"order\":\"0x8d79ca35a428c76f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x2e94a3e38f8b345e\",\"y\":\"0x83e6c6f0cb8f69c4\",\"order\":\"0x8d79ca35a428c76f\"}]}]}]\"\"\",\n",
- " \"\"\"[{\"field\":{\"p\":\"0xc1dbdf20f877c1f5\"},\"a\":\"0xc1dbdf20f877c1f2\",\"b\":\"0xb542de5cccf89443\",\"order\":\"0xc1dbdf20e5e39897\",\"subgroups\":[{\"x\":\"0x6179152f1dbd686b\",\"y\":\"0x74105f331a9d29ae\",\"order\":\"0xc1dbdf20e5e39897\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x6179152f1dbd686b\",\"y\":\"0x74105f331a9d29ae\",\"order\":\"0xc1dbdf20e5e39897\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x48e1a125250323a7\"},\"a\":\"0x48e1a125250323a4\",\"b\":\"0x02a4d99f41d23210\",\"order\":\"0x48e1a124f895db6d\",\"subgroups\":[{\"x\":\"0x409e15d65fcae55a\",\"y\":\"0x207e142056d62d07\",\"order\":\"0x48e1a124f895db6d\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x409e15d65fcae55a\",\"y\":\"0x207e142056d62d07\",\"order\":\"0x48e1a124f895db6d\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xcb5aa8a7a10aa06b\"},\"a\":\"0xcb5aa8a7a10aa068\",\"b\":\"0x31fe9c57c570174f\",\"order\":\"0xcb5aa8a6cf812191\",\"subgroups\":[{\"x\":\"0x84c75d46fc687ff1\",\"y\":\"0x7424362ac73df187\",\"order\":\"0xcb5aa8a6cf812191\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x84c75d46fc687ff1\",\"y\":\"0x7424362ac73df187\",\"order\":\"0xcb5aa8a6cf812191\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xba965ca9c8aa0a1b\"},\"a\":\"0xba965ca9c8aa0a18\",\"b\":\"0x676535a1eaf5c605\",\"order\":\"0xba965caae5741b6f\",\"subgroups\":[{\"x\":\"0x313d58c47b8ed95f\",\"y\":\"0x991ba98cbbb0fe9f\",\"order\":\"0xba965caae5741b6f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x313d58c47b8ed95f\",\"y\":\"0x991ba98cbbb0fe9f\",\"order\":\"0xba965caae5741b6f\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xbfb7747454a17d15\"},\"a\":\"0xbfb7747454a17d12\",\"b\":\"0x611b69881db4ce69\",\"order\":\"0xbfb7747547fd57d3\",\"subgroups\":[{\"x\":\"0x3385044d698640fc\",\"y\":\"0x50cee623251b559e\",\"order\":\"0xbfb7747547fd57d3\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x3385044d698640fc\",\"y\":\"0x50cee623251b559e\",\"order\":\"0xbfb7747547fd57d3\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x99235f1ed44b3959\"},\"a\":\"0x99235f1ed44b3956\",\"b\":\"0x5d8dda19dbe804d4\",\"order\":\"0x99235f1d975f376d\",\"subgroups\":[{\"x\":\"0x4fed262974c1d800\",\"y\":\"0x27590c454edd59ca\",\"order\":\"0x99235f1d975f376d\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x4fed262974c1d800\",\"y\":\"0x27590c454edd59ca\",\"order\":\"0x99235f1d975f376d\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xa7ff74a0dc8c161d\"},\"a\":\"0xa7ff74a0dc8c161a\",\"b\":\"0x583b968bb611b284\",\"order\":\"0xa7ff74a06811ee75\",\"subgroups\":[{\"x\":\"0x5f5c76454edf12e7\",\"y\":\"0x4c73cbfc44f41508\",\"order\":\"0xa7ff74a06811ee75\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x5f5c76454edf12e7\",\"y\":\"0x4c73cbfc44f41508\",\"order\":\"0xa7ff74a06811ee75\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xb52c62ca8703a063\"},\"a\":\"0xb52c62ca8703a060\",\"b\":\"0x0baec43a07b54c21\",\"order\":\"0xb52c62c963037121\",\"subgroups\":[{\"x\":\"0x6fe4a521a29bc1ab\",\"y\":\"0x3fca7180021f8f0f\",\"order\":\"0xb52c62c963037121\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x6fe4a521a29bc1ab\",\"y\":\"0x3fca7180021f8f0f\",\"order\":\"0xb52c62c963037121\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xb8921f25b6ce5267\"},\"a\":\"0xb8921f25b6ce5264\",\"b\":\"0xa575c9f97563265d\",\"order\":\"0xb8921f2592b6b39f\",\"subgroups\":[{\"x\":\"0x7eb120fada47765c\",\"y\":\"0x64ef4e51d4159304\",\"order\":\"0xb8921f2592b6b39f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x7eb120fada47765c\",\"y\":\"0x64ef4e51d4159304\",\"order\":\"0xb8921f2592b6b39f\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xc591b8c4df0afc19\"},\"a\":\"0xc591b8c4df0afc16\",\"b\":\"0x0a1eb46a6e647f0a\",\"order\":\"0xc591b8c3eb07239f\",\"subgroups\":[{\"x\":\"0x1963bfb862cb0bf3\",\"y\":\"0x30da8bb7fa77277d\",\"order\":\"0xc591b8c3eb07239f\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x1963bfb862cb0bf3\",\"y\":\"0x30da8bb7fa77277d\",\"order\":\"0xc591b8c3eb07239f\"}]}]}]\"\"\",\n",
" # a = 0\n",
" \"\"\"[{\"field\":{\"p\":\"0xceaf446a53f14bc1\"},\"a\":\"0x0000000000000000\",\"b\":\"0x326539376260f173\",\"order\":\"0xceaf446aae275419\",\"subgroups\":[{\"x\":\"0x98fe44948c3f8678\",\"y\":\"0x3d440ee959a912d7\",\"order\":\"0xceaf446aae275419\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x98fe44948c3f8678\",\"y\":\"0x3d440ee959a912d7\",\"order\":\"0xceaf446aae275419\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xb3c2beca75d66de3\"},\"a\":\"0x0000000000000000\",\"b\":\"0x46069225826b51aa\",\"order\":\"0xb3c2bec95881b695\",\"subgroups\":[{\"x\":\"0x81500c226efa0d5a\",\"y\":\"0x674e09d296452eee\",\"order\":\"0xb3c2bec95881b695\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x81500c226efa0d5a\",\"y\":\"0x674e09d296452eee\",\"order\":\"0xb3c2bec95881b695\"}]}]}]\"\"\",\n",
" \"\"\"[{\"field\":{\"p\":\"0xd6097c1ce207aae7\"},\"a\":\"0x0000000000000000\",\"b\":\"0x7adaab54e7dfd564\",\"order\":\"0xd6097c1b407eb413\",\"subgroups\":[{\"x\":\"0x151da8fb1f83201e\",\"y\":\"0x8bfeb90ec1177a91\",\"order\":\"0xd6097c1b407eb413\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x151da8fb1f83201e\",\"y\":\"0x8bfeb90ec1177a91\",\"order\":\"0xd6097c1b407eb413\"}]}]}]\"\"\",\n",
- " # b = 0 (causes more issues than gain)\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x97a3e2d617a2309d\"},\"a\":\"0x0000000000000000\",\"b\":\"0x7f311cba46652247\",\"order\":\"0x97a3e2d712ffd715\",\"subgroups\":[{\"x\":\"0x46d725812af15870\",\"y\":\"0x727f88365dbd0e80\",\"order\":\"0x97a3e2d712ffd715\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x46d725812af15870\",\"y\":\"0x727f88365dbd0e80\",\"order\":\"0x97a3e2d712ffd715\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xd43c9a4cd686a599\"},\"a\":\"0x0000000000000000\",\"b\":\"0xc795a256566ee407\",\"order\":\"0xd43c9a4cb750f1a5\",\"subgroups\":[{\"x\":\"0x4f1fcb572419ce5c\",\"y\":\"0x5f54d643e16732e4\",\"order\":\"0xd43c9a4cb750f1a5\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x4f1fcb572419ce5c\",\"y\":\"0x5f54d643e16732e4\",\"order\":\"0xd43c9a4cb750f1a5\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0x847de883ab4fbf4d\"},\"a\":\"0x0000000000000000\",\"b\":\"0x09866366b3b45c2d\",\"order\":\"0x847de8837e6d4477\",\"subgroups\":[{\"x\":\"0x62fd7b4bc7c9acb4\",\"y\":\"0x2d0942774607106b\",\"order\":\"0x847de8837e6d4477\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x62fd7b4bc7c9acb4\",\"y\":\"0x2d0942774607106b\",\"order\":\"0x847de8837e6d4477\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xf0d617c3c47b7c77\"},\"a\":\"0x0000000000000000\",\"b\":\"0xd856b3dcb95764a2\",\"order\":\"0xf0d617c5512cec85\",\"subgroups\":[{\"x\":\"0xeaf9b352a3daac45\",\"y\":\"0x4e4e557f9fc3febc\",\"order\":\"0xf0d617c5512cec85\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xeaf9b352a3daac45\",\"y\":\"0x4e4e557f9fc3febc\",\"order\":\"0xf0d617c5512cec85\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xce920b656c80b373\"},\"a\":\"0x0000000000000000\",\"b\":\"0xb4a07dfae71ddc62\",\"order\":\"0xce920b65eee38015\",\"subgroups\":[{\"x\":\"0x7895c02b3c5205b5\",\"y\":\"0x2926be6446b98d62\",\"order\":\"0xce920b65eee38015\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x7895c02b3c5205b5\",\"y\":\"0x2926be6446b98d62\",\"order\":\"0xce920b65eee38015\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xb6d4e25f76cc9df7\"},\"a\":\"0x0000000000000000\",\"b\":\"0x18e95a2283692623\",\"order\":\"0xb6d4e25ea270ed03\",\"subgroups\":[{\"x\":\"0x2da7a97d5d899bc5\",\"y\":\"0x17d27fd34562e3d9\",\"order\":\"0xb6d4e25ea270ed03\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x2da7a97d5d899bc5\",\"y\":\"0x17d27fd34562e3d9\",\"order\":\"0xb6d4e25ea270ed03\"}]}]}]\"\"\",\n",
+ " \"\"\"[{\"field\":{\"p\":\"0xe7cd1979ebed69ed\"},\"a\":\"0x0000000000000000\",\"b\":\"0x278e92b83191a7da\",\"order\":\"0xe7cd197966893365\",\"subgroups\":[{\"x\":\"0xc4de44402da5b9a6\",\"y\":\"0x2b45e7f32e3701ba\",\"order\":\"0xe7cd197966893365\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0xc4de44402da5b9a6\",\"y\":\"0x2b45e7f32e3701ba\",\"order\":\"0xe7cd197966893365\"}]}]}]\"\"\"\n",
+ " # b = 0 (causes more issues than gain) but the (w12-0) coords actually require it...\n",
" #\"\"\"[{\"field\":{\"p\":\"0x9d9119957f02fe3f\"},\"a\":\"0x0106903196d88df9\",\"b\":\"0x0000000000000000\",\"order\":\"0x9d9119957f02fe40\",\"subgroups\":[{\"x\":\"0x191a36b9cd81de96\",\"y\":\"0x10f2c6bded391aa9\",\"order\":\"0x9d9119957f02fe40\",\"cofactor\":\"0x1\",\"points\":[{\"x\":\"0x0000000000000000\",\"y\":\"0x0000000000000000\",\"order\":\"0x2\"},{\"x\":\"0x95913fae9065da0f\",\"y\":\"0x5eeddeee7152d6fb\",\"order\":\"0x276446655fc0bf9\"}]}]}]\"\"\"\n",
"]))\n",
+ "\n",
"for i, params in enumerate(curves):\n",
" curve = params.curve\n",
" if curve.parameters[\"a\"] == -3:\n",
@@ -215,14 +228,17 @@
"metadata": {},
"outputs": [],
"source": [
- "scalars = [123456789, 98765432, 0b10000000, 0b1010101010, 0b1010101, 77777, 66666, 55555, 44444, 33333, 22222, 11111, 0b1111111111]\n",
+ "scalars = [0b1111110, 0b1011101, 0b110110, 0b100100, 0b1000110, 0b1001101, 0b101001, 0b1100100, 0b1010110, 0b101010] * 4\n",
"\n",
"chains = []\n",
"scalar_map = {}\n",
- "for i, (scalar, params) in enumerate(zip(scalars, curves)):\n",
+ "ops = set()\n",
+ "for scalar, params in zip(scalars, curves):\n",
" chain = addition_chain(scalar, params, LTRMultiplier, lambda add,dbl: LTRMultiplier(add, dbl, None, False, AccumulationOrder.PeqRP, True, True))\n",
" chains.append(chain)\n",
- " scalar_map[params] = scalar"
+ " scalar_map[params] = scalar\n",
+ " ops.update(chain)\n",
+ "print(sorted(list(ops)))"
]
},
{
@@ -236,135 +252,96 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "91bc36bb-80e8-41d8-8612-7f9e24bdf278",
+ "id": "f71a9b68-6873-4bee-b1c2-3166ef74897b",
"metadata": {},
"outputs": [],
"source": [
- "# bound is the maximal dlog in the hard case of the DCP to be solved\n",
- "bound = 15\n",
- "# chain_bound is the number of formula applications at the start of the addition chain that is processed\n",
- "chain_bound = 30\n",
- "\n",
"formula_classes = [AdditionFormula, DoublingFormula]\n",
- "point_chains = {}\n",
- "with ProcessPoolExecutor(max_workers=30) as pool:\n",
- " futures = []\n",
- " args = []\n",
- " for coord_name, coords in model.coordinates.items():\n",
- " for chain, affine_params in zip(chains, curves):\n",
- " try:\n",
- " params = affine_params.to_coords(coords)\n",
- " except UnsatisfiedAssumptionError:\n",
- " continue\n",
- " formula_groups = [list(filter(lambda formula: isinstance(formula, formula_class) and (formula.name.startswith(\"add\") or formula.name.startswith(\"dbl\")), coords.formulas.values())) for formula_class in formula_classes]\n",
- "\n",
- " for formula_group, formula_class in zip(formula_groups, formula_classes):\n",
- " for formula in formula_group:\n",
- " futures.append(pool.submit(precomp_zvp_points, chain[:chain_bound], {formula_class.shortname: formula}, params, bound, filter_nonhomo=False))\n",
- " args.append((coords, formula, affine_params))\n",
- " for future in tqdm(as_completed(futures), desc=\"Compute\", total=len(futures)):\n",
- " j = futures.index(future)\n",
- " point_chains[args[j]] = future.result()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "55cb5e3c-b1f1-443f-9d5f-269de6eb59ec",
- "metadata": {},
- "source": [
- "Now, accumulate the rows of the distinguishing table to create the distinguishing map `point_map`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b7c7b341-5b15-44fb-b9cf-462b64e7536e",
- "metadata": {},
- "outputs": [],
- "source": [
- "point_map = {}\n",
- "for coord_name, coords in tqdm(model.coordinates.items(), desc=\"Accumulate for coord systems\"):\n",
+ "factor_sets = {}\n",
+ "for coord_name, coords in model.coordinates.items():\n",
" formula_groups = [list(filter(lambda formula: isinstance(formula, formula_class) and (formula.name.startswith(\"add\") or formula.name.startswith(\"dbl\")), coords.formulas.values())) for formula_class in formula_classes]\n",
- " formula_combinations = list(product(*formula_groups))\n",
- " for formulas in formula_combinations:\n",
- " points = set()\n",
- " for formula in formulas:\n",
- " for chain, affine_params in zip(chains, curves):\n",
- " try:\n",
- " params = affine_params.to_coords(coords)\n",
- " except UnsatisfiedAssumptionError:\n",
- " continue\n",
- " if (coords, formula, affine_params) not in point_chains:\n",
- " print(f\"Missing {formula} for {str(affine_params)}\")\n",
- " continue\n",
- " point_chain = point_chains[(coords, formula, affine_params)]\n",
- " for step in point_chain:\n",
- " for poly, poly_points in step.items():\n",
- " for point in poly_points:\n",
- " points.add((point, affine_params))\n",
- " point_map[formulas] = points\n",
- "all_points = set().union(*point_map.values())\n",
- "print(len(all_points))"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2718285c-913c-4d46-b3bc-db8c7ef1f9ee",
- "metadata": {},
- "source": [
- "We now have a distinguishing map so we can build the tree and visualize it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "8afea2a8-49a1-4969-a19e-9e17e26fb1e8",
- "metadata": {},
- "outputs": [],
- "source": [
- "tree = build_distinguishing_tree(set(point_map.keys()), point_map)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "49ee4c6f",
- "metadata": {},
- "outputs": [],
- "source": [
- "def render_tree(tree):\n",
- " print(RenderTree(tree).by_attr(lambda n: n.name if n.name is not None else \"\\n\".join((\", \".join(str(formula) for formula in cfg) for cfg in n.cfgs))))\n",
"\n",
- "def describe_tree(tree):\n",
- " leaf_sizes = [len(leaf.cfgs) for leaf in tree.leaves]\n",
- " print(f\"Total cfgs: {len(tree.cfgs)}\")\n",
- " print(f\"Depth: {tree.height}\")\n",
- " print(f\"Leaf sizes: {sorted(leaf_sizes)}\")\n",
- " print(f\"Average leaf size: {np.mean(leaf_sizes):.3}\")\n",
- " leafs = sum(([size] * size for size in leaf_sizes), [])\n",
- " print(f\"Mean result size: {np.mean(leafs):.3}\")"
+ " for formula_group, formula_class in zip(formula_groups, formula_classes):\n",
+ " for formula in formula_group:\n",
+ " fset = compute_factor_set(formula, filter_nonhomo=False)\n",
+ " if formula_class == DoublingFormula:\n",
+ " new_fset = set()\n",
+ " for poly in fset:\n",
+ " pl = poly.copy()\n",
+ " for symbol in poly.free_symbols:\n",
+ " original = str(symbol)\n",
+ " if original.endswith(\"1\"):\n",
+ " new = original.replace(\"1\", \"2\")\n",
+ " pl = pl.subs(original, new)\n",
+ " new_fset.add(pl)\n",
+ " fset = new_fset\n",
+ " factor_sets[formula] = fset\n",
+ "\n",
+ "polynomials = {}\n",
+ "for coord_name, coords in model.coordinates.items():\n",
+ " for chain, affine_params in zip(chains, curves):\n",
+ " try:\n",
+ " params = affine_params.to_coords(coords)\n",
+ " except UnsatisfiedAssumptionError:\n",
+ " continue\n",
+ " add_polynomials = set()\n",
+ " dbl_polynomials = set()\n",
+ " formula_groups = [list(filter(lambda formula: isinstance(formula, formula_class) and (formula.name.startswith(\"add\") or formula.name.startswith(\"dbl\")), coords.formulas.values())) for formula_class in formula_classes]\n",
+ " for formula_group, formula_class in zip(formula_groups, formula_classes):\n",
+ " for formula in formula_group:\n",
+ " if formula_class == AdditionFormula:\n",
+ " add_polynomials.update(factor_sets[formula])\n",
+ " else:\n",
+ " dbl_polynomials.update(factor_sets[formula])\n",
+ " polynomials[params] = {\n",
+ " \"add\": add_polynomials,\n",
+ " \"dbl\": dbl_polynomials\n",
+ " }"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "ab09b767-71ca-4d28-abf0-532307efefbd",
+ "id": "8a637899-8c3c-43a1-86fa-f0322d41ce8c",
"metadata": {},
"outputs": [],
"source": [
- "describe_tree(tree)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1a779729-380a-4e41-b35e-4afa0943e550",
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "render_tree(tree)"
+ "# bound is the maximal dlog in the hard case of the DCP to be solved\n",
+ "bound = 100\n",
+ "\n",
+ "all_points = set()\n",
+ "with ProcessPoolExecutor(max_workers=10) as pool:\n",
+ " futures = []\n",
+ " args = []\n",
+ " for coord_name, coords in model.coordinates.items():\n",
+ " for chain, affine_params in zip(chains, curves):\n",
+ " try:\n",
+ " params = affine_params.to_coords(coords)\n",
+ " except UnsatisfiedAssumptionError:\n",
+ " continue\n",
+ " for op, ks in chain:\n",
+ " if len(ks) == 1:\n",
+ " k = ks[0]\n",
+ " else:\n",
+ " # zvp_points assumes (P, [k]P)\n",
+ " ks_mod = list(map(lambda v: Mod(v, params.order), ks))\n",
+ " k = int(ks_mod[1] / ks_mod[0])\n",
+ " polys = polynomials[params][op]\n",
+ " for poly in polys:\n",
+ " only_1 = all((not str(gen).endswith(\"2\")) for gen in poly.gens)\n",
+ " only_2 = all((not str(gen).endswith(\"1\")) for gen in poly.gens)\n",
+ " # This is the hard case where a dlog needs to be substituted, so bound it.\n",
+ " if not (only_1 or only_2) and k > bound:\n",
+ " continue\n",
+ " futures.append(pool.submit(zvp_points, poly, params.curve, k, params.order))\n",
+ " args.append((poly, affine_params, k))\n",
+ " for future in tqdm(as_completed(futures), desc=\"Computing\", total=len(futures), smoothing=0):\n",
+ " j = futures.index(future)\n",
+ " poly, affine_params, k = args[j]\n",
+ " result = future.result()\n",
+ " for point in result:\n",
+ " all_points.add((point, affine_params))\n",
+ "print(f\"Got {len(all_points)} points\")"
]
},
{
@@ -389,11 +366,11 @@
"def remap(coords, formulas, points, scalar_map):\n",
" mult = LTRMultiplier(*formulas, None, False, AccumulationOrder.PeqRP, True, True)\n",
" hit_points = set()\n",
- " count_points = set()\n",
- " position_points = set()\n",
+ " count_points = {}\n",
+ " position_points = {}\n",
" \n",
" param_map = {}\n",
- " for point, params in tqdm(points):\n",
+ " for point, params in points:\n",
" if params not in param_map:\n",
" try:\n",
" param_map[params] = params.to_coords(coords)\n",
@@ -418,8 +395,8 @@
" zeros = tuple(map(lambda x: int(x) == 0, trace))\n",
" if any(zeros):\n",
" hit_points.add((point, params))\n",
- " count_points.add((point, sum(zeros), params))\n",
- " position_points.add((point, zeros, params))\n",
+ " count_points[(point, params)] = sum(zeros)\n",
+ " position_points[(point, params)] = zeros\n",
" return hit_points, count_points, position_points\n",
"\n",
"remapped_hit_point_map = {}\n",
@@ -434,8 +411,7 @@
" for formulas in formula_combinations:\n",
" futures.append(pool.submit(remap, coords, formulas, all_points, scalar_map))\n",
" pairs.append(formulas)\n",
- " results = [None for _ in futures]\n",
- " for future in tqdm(as_completed(futures), total=len(futures), desc=\"Remapping\"):\n",
+ " for future in tqdm(as_completed(futures), total=len(futures), desc=\"Remapping\", smoothing=0):\n",
" j = futures.index(future)\n",
" cfg = pairs[j]\n",
" h, c, p = future.result()\n",
@@ -446,77 +422,92 @@
},
{
"cell_type": "markdown",
- "id": "8a909b33-5c4d-450b-ad97-dee3615d8462",
+ "id": "3c0d710b-19fd-4ff7-a39f-f38b1b8856f8",
+ "metadata": {},
+ "source": [
+ "Finally, we can build a tree using the remapped distinguishing map."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "db1ffe84-f58e-465c-b417-ad1d563c8377",
"metadata": {},
+ "outputs": [],
"source": [
- "We can compare the remapped distinguishing map to the original one and see the changes."
+ "dmap_remapped = Map.from_binary_sets(set(remapped_hit_point_map.keys()), remapped_hit_point_map)"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "cc87dfd1-f058-4338-aaca-fc05105fc9f1",
+ "id": "5ffc5564-a42b-4837-94bb-4ecb890b38b2",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
- "table = [[\"Add\", \"Dbl\", \"raw\", \"remapped\", \"removed (fp)\", \"new (fn)\"]]\n",
- "for pair in point_map.keys():\n",
- " table.append((pair[0], pair[1],\n",
- " len(point_map[pair]),\n",
- " len(remapped_hit_point_map[pair]),\n",
- " -len(point_map[pair].difference(remapped_hit_point_map[pair])),\n",
- " len(remapped_hit_point_map[pair].difference(point_map[pair]))))\n",
- "\n",
- "display(HTML(tabulate.tabulate(table, tablefmt=\"html\", headers=\"firstrow\")))"
+ "tree_remapped = Tree.build(set(remapped_hit_point_map.keys()), dmap_remapped)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b921aadd-ccc6-4bc2-9cb0-e3905ff4f6ab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(tree_remapped.describe())"
]
},
{
"cell_type": "markdown",
- "id": "3c0d710b-19fd-4ff7-a39f-f38b1b8856f8",
+ "id": "27f4be08-76fd-437a-bde7-8579b38fc686",
"metadata": {},
"source": [
- "Finally, we can build a tree using the remapped distinguishing map."
+ "We can also investigate the other oracles and the distinguishing trees they can build:"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "5ffc5564-a42b-4837-94bb-4ecb890b38b2",
+ "id": "5a680f71-f2de-4358-8352-67ec99d63704",
"metadata": {},
"outputs": [],
"source": [
- "remapped_tree = build_distinguishing_tree(set(remapped_hit_point_map.keys()), remapped_hit_point_map)"
+ "dmap_count = Map.from_io_map(set(remapped_count_point_map.keys()), remapped_count_point_map)"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "b921aadd-ccc6-4bc2-9cb0-e3905ff4f6ab",
- "metadata": {},
+ "id": "cee72bcb-2486-4285-8dc7-80c101ca1760",
+ "metadata": {
+ "scrolled": true
+ },
"outputs": [],
"source": [
- "describe_tree(remapped_tree)"
+ "tree_count = Tree.build(set(remapped_count_point_map.keys()), dmap_count)"
]
},
{
- "cell_type": "markdown",
- "id": "27f4be08-76fd-437a-bde7-8579b38fc686",
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "17de9a81-102e-4804-906a-02d2baef42d5",
"metadata": {},
+ "outputs": [],
"source": [
- "We can also investigate the other oracles and the distinguishing trees they can build:"
+ "dmap_position = Map.from_io_map(set(remapped_position_point_map.keys()), remapped_position_point_map)"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "17de9a81-102e-4804-906a-02d2baef42d5",
+ "id": "db92360c-cb96-4382-8255-d7773772b07d",
"metadata": {},
"outputs": [],
"source": [
- "remapped_count_tree = build_distinguishing_tree(set(remapped_count_point_map.keys()), remapped_count_point_map)\n",
- "remapped_position_tree = build_distinguishing_tree(set(remapped_position_point_map.keys()), remapped_position_point_map)"
+ "tree_position = Tree.build(set(remapped_position_point_map.keys()), dmap_position)"
]
},
{
@@ -527,11 +518,11 @@
"outputs": [],
"source": [
"print(\"Zero hit\")\n",
- "describe_tree(remapped_tree)\n",
+ "print(tree_remapped.describe())\n",
"print(\"\\nZero count\")\n",
- "describe_tree(remapped_count_tree)\n",
+ "print(tree_count.describe())\n",
"print(\"\\nZero position\")\n",
- "describe_tree(remapped_position_tree)"
+ "print(tree_position.describe())"
]
},
{
@@ -551,10 +542,10 @@
"source": [
"fset_map = {}\n",
"fset_nonhomo_map = {}\n",
+ "factor_sets = {}\n",
+ "factor_sets_nonhomo = {}\n",
"for coord_name, coords in model.coordinates.items():\n",
" formula_groups = [list(filter(lambda formula: isinstance(formula, formula_class) and (formula.name.startswith(\"add\") or formula.name.startswith(\"dbl\")), coords.formulas.values())) for formula_class in formula_classes]\n",
- " factor_sets = {}\n",
- " factor_sets_nonhomo = {}\n",
" for formula_group in formula_groups:\n",
" for formula in formula_group:\n",
" factor_sets[formula] = compute_factor_set(formula)\n",
@@ -573,31 +564,83 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "085c37db-ffbf-4f9e-87d3-5c13ecfeadca",
+ "id": "94f611c9-4570-4674-b1f3-902d06962bfa",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dmap_fset = Map.from_binary_sets(set(fset_map.keys()), fset_map)\n",
+ "dmap_fset_nonhomo = Map.from_binary_sets(set(fset_nonhomo_map.keys()), fset_nonhomo_map)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6d4f33f3-557a-4e79-aadb-10fd73aba1d0",
"metadata": {},
"outputs": [],
"source": [
- "fset_tree = build_distinguishing_tree(set(fset_map.keys()), fset_map)\n",
- "fset_nonhomo_tree = build_distinguishing_tree(set(fset_nonhomo_map.keys()), fset_nonhomo_map)"
+ "tree_fset = Tree.build(set(fset_map.keys()), dmap_fset)\n",
+ "tree_fset_nonhomo = Tree.build(set(fset_nonhomo_map.keys()), dmap_fset_nonhomo)"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "b47a3a13-1067-4901-9441-7160130fef1c",
+ "id": "93a67306-e507-422c-92e2-f1439437060f",
"metadata": {},
"outputs": [],
"source": [
"print(\"Factor sets\")\n",
- "describe_tree(fset_tree)\n",
- "print(\"\\nFactor sets (nonhomogenous)\")\n",
- "describe_tree(fset_nonhomo_tree)"
+ "print(tree_fset.describe())\n",
+ "print(\"\\nFactor sets (unfiltered)\")\n",
+ "print(tree_fset_nonhomo.describe())"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "6d4f33f3-557a-4e79-aadb-10fd73aba1d0",
+ "id": "366ba814-c8ae-4567-8e26-27130f9dbfc9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "expanded = tree_remapped.expand(dmap_fset)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bf8ad92e-a3e9-43c6-8c8a-c5e6d42eee6b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(\"Zero hit + factor sets\")\n",
+ "print(expanded.describe())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b78f99d6-46b9-44bb-b9b4-5df7fc4fa990",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p = set()\n",
+ "for node in PreOrderIter(expanded.root):\n",
+ " if isinstance(node.dmap_input, Poly):\n",
+ " print(node.dmap_input, [len(child.cfgs) for child in node.children])\n",
+ " p.add(node.dmap_input)\n",
+ "print(\"---\")\n",
+ "for pp in p:\n",
+ " print(pp)\n",
+ " for formula, fset in factor_sets_nonhomo.items():\n",
+ " if pp in fset:\n",
+ " print(formula)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4fcc5071-72d7-45b3-a854-8d0a087bc3aa",
"metadata": {},
"outputs": [],
"source": []