diff --git a/.gitignore b/.gitignore
index 7d633ad..4ac3dfa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ code/testdata/
.DS_Store
figures/
code/power_matrix.json
+# Calibration output (regenerate with scripts/run_extensive_calibration.py)
+extensive_calibration.json
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..b0346b9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "code/falcon"]
+ path = code/falcon
+ url = https://github.com/tprest/falcon.py
diff --git a/README.md b/README.md
index a89973d..0bbbb48 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,14 @@ pytest code/tests/ -v
## How to use
-Along with the main file to run these statistical tests, `saga.py`, we also provide code for our proposed sampler [1] in the files `sampler.c`, `sampler.py`, where `sampler_rep.py` is a file we use to get data on the repetition rate. We also provide [falcon/](code/falcon) and [testdata/](code/testdata) for python implementations of [Falcon](https://falcon-sign.info/) and its output values.
+Along with the main file to run these statistical tests, `saga.py`, we also provide code for our proposed sampler [1] in the files `sampler.c`, `sampler.py`. Test data is generated on demand by `generate_test_vectors.py` (the original ~530MB HPRR20 reference samples are preserved in the `pqcrypto2020-as-published` tag). Auxiliary scripts (baseline runner, calibration, figures, terminal report card) live under [scripts/](code/scripts).
+
+The optional end-to-end test `test_sig()` runs against the reference Falcon implementation ([github.com/tprest/falcon.py](https://github.com/tprest/falcon.py)), vendored as the `code/falcon` git submodule. The core suite does not depend on it; fetch it only if you want to run `test_sig()`:
+
+```
+git submodule update --init
+pip install ".[falcon]"
+```
#### Example for univariate samples
diff --git a/code/extensive_calibration.json b/code/extensive_calibration.json
deleted file mode 100644
index ea14954..0000000
--- a/code/extensive_calibration.json
+++ /dev/null
@@ -1,4717 +0,0 @@
-{
- "params": {
- "n": 10000,
- "reps": 100,
- "alpha": 0.001
- },
- "n_flaws": 65,
- "n_tests": 8,
- "n_param_points": 7,
- "total_time_seconds": 8340.346817016602,
- "results": {
- "base_sampler": {
- "mu": 0.0,
- "sigma": 1.55,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.01,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.01,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.1,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.18,
- "discrete_ad": 0.07,
- "higher_crit": 0.26,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.45,
- "tail_exceedance": 0.06,
- "sign_halfgauss": 0.62,
- "discrete_ad": 0.29,
- "higher_crit": 0.61,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 0.98,
- "tail_exceedance": 0.48,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.99,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.79,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.99,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.03,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.03,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.13,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.2,
- "discrete_ad": 0.61,
- "higher_crit": 0.5,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.94,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.9,
- "discrete_ad": 1.0,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.32,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 0.98,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.12,
- "higher_crit": 0.09,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.14,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.28,
- "discrete_ad": 0.63,
- "higher_crit": 0.53,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.7,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.9,
- "discrete_ad": 0.99,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 0.99,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.09,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.11,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.22,
- "discrete_ad": 0.12,
- "higher_crit": 0.31,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.93,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.96,
- "discrete_ad": 0.71,
- "higher_crit": 0.96,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.28,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.96,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.99,
- "discrete_ad": 0.99,
- "higher_crit": 0.24,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.96,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "markov_0.01": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.03,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.05,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.44,
- "runs_test": 0.97,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.05,
- "discrete_ad": 0.04,
- "higher_crit": 0.07,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.04,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.07,
- "discrete_ad": 0.06,
- "higher_crit": 0.09,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.06,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.11,
- "discrete_ad": 0.03,
- "higher_crit": 0.09,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.36,
- "tail_exceedance": 0.07,
- "sign_halfgauss": 0.3,
- "discrete_ad": 0.15,
- "higher_crit": 0.31,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.04
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.13,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.13,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.31,
- "discrete_ad": 0.04,
- "higher_crit": 0.08,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.01,
- "higher_crit": 0.02,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.11217818031772564,
- "ks_pvalue": 0.5189618768601902,
- "mean_pvalue": 0.46682711576849345,
- "passes": 1
- }
- },
- "sigmin": {
- "mu": 0.0,
- "sigma": 1.2778,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.01,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.12,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.24,
- "discrete_ad": 0.11,
- "higher_crit": 0.23,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.52,
- "tail_exceedance": 0.11,
- "sign_halfgauss": 0.67,
- "discrete_ad": 0.32,
- "higher_crit": 0.58,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.67,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.96,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.91,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.01,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.03,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.1,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.33,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.36,
- "discrete_ad": 0.8,
- "higher_crit": 0.72,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.99,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.99,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.02,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.08,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.94,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.03,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.11,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.16,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.28,
- "discrete_ad": 0.54,
- "higher_crit": 0.5,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.65,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.82,
- "discrete_ad": 0.99,
- "higher_crit": 0.95,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.08,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.03,
- "higher_crit": 0.14,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.02,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.08,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.1,
- "discrete_ad": 0.09,
- "higher_crit": 0.26,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.95,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.91,
- "discrete_ad": 0.49,
- "higher_crit": 0.98,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.01,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.54,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.77,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.87,
- "discrete_ad": 1.0,
- "higher_crit": 0.05,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.63,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.02,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.01,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.09,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.44,
- "runs_test": 0.99,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.01,
- "higher_crit": 0.04,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.04,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.04,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.06,
- "higher_crit": 0.07,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.09,
- "discrete_ad": 0.03,
- "higher_crit": 0.08,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.26,
- "tail_exceedance": 0.1,
- "sign_halfgauss": 0.3,
- "discrete_ad": 0.16,
- "higher_crit": 0.25,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.04
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.11,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.21,
- "discrete_ad": 0.04,
- "higher_crit": 0.05,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.02,
- "runs_test": 0.0,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.10766645928945306,
- "ks_pvalue": 0.5710713422181413,
- "mean_pvalue": 0.4654877318656508,
- "passes": 1
- }
- },
- "mu_quarter": {
- "mu": 0.25,
- "sigma": 1.55,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.03,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.03,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.13,
- "tail_exceedance": 0.03,
- "sign_halfgauss": 0.16,
- "discrete_ad": 0.13,
- "higher_crit": 0.11,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.5,
- "tail_exceedance": 0.1,
- "sign_halfgauss": 0.56,
- "discrete_ad": 0.38,
- "higher_crit": 0.42,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.44,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.97,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.85,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.04,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.12,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.67,
- "higher_crit": 0.27,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.93,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.03,
- "discrete_ad": 1.0,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.12,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 1.0,
- "tail_exceedance": 0.1,
- "sign_halfgauss": 0.56,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.34,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.99,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.19,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.28,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.05,
- "discrete_ad": 0.81,
- "higher_crit": 0.69,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.93,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.21,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.86,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.99,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.61,
- "higher_crit": 0.49,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.04,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.18,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.22,
- "higher_crit": 0.16,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.82,
- "discrete_ad": 0.84,
- "higher_crit": 0.9,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.07,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.09,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.01,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.31,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.58,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.93,
- "discrete_ad": 1.0,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_1.0%": {
- "chi2": 0.99,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.4,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.03,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.08,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.45,
- "runs_test": 0.98,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.03,
- "higher_crit": 0.02,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.03,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.05,
- "higher_crit": 0.01,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.09,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.08,
- "higher_crit": 0.05,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.05,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.04,
- "higher_crit": 0.05,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.37,
- "tail_exceedance": 0.08,
- "sign_halfgauss": 0.2,
- "discrete_ad": 0.22,
- "higher_crit": 0.16,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.04
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.15,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.96,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.02,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.14,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.24,
- "discrete_ad": 0.11,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.01,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.09434522030912107,
- "ks_pvalue": 0.7294453173492841,
- "mean_pvalue": 0.5055332103617974,
- "passes": 1
- }
- },
- "mu_half": {
- "mu": 0.5,
- "sigma": 1.55,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.14,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.16,
- "discrete_ad": 0.12,
- "higher_crit": 0.15,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.5,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 0.47,
- "discrete_ad": 0.31,
- "higher_crit": 0.41,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.16,
- "sign_halfgauss": 0.98,
- "discrete_ad": 0.99,
- "higher_crit": 0.96,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.4,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.87,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.04,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.15,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.6,
- "higher_crit": 0.36,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.96,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.17,
- "discrete_ad": 1.0,
- "higher_crit": 0.98,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.63,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.09,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 0.71,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.14,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.31,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.75,
- "higher_crit": 0.64,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.95,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.3,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.94,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.15,
- "higher_crit": 0.32,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.3,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.21,
- "discrete_ad": 0.26,
- "higher_crit": 0.28,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.99,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.96,
- "discrete_ad": 0.96,
- "higher_crit": 0.97,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.2,
- "discrete_ad": 0.28,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.58,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.41,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.09,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.41,
- "runs_test": 0.93,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.03,
- "higher_crit": 0.04,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.02,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.06,
- "higher_crit": 0.05,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.03,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.04,
- "higher_crit": 0.05,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.32,
- "tail_exceedance": 0.05,
- "sign_halfgauss": 0.23,
- "discrete_ad": 0.14,
- "higher_crit": 0.17,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.04
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.05,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.2,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.31,
- "discrete_ad": 0.09,
- "higher_crit": 0.07,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.08228818289024642,
- "ks_pvalue": 0.8597583336081112,
- "mean_pvalue": 0.501019642765522,
- "passes": 1
- }
- },
- "mu_near_half": {
- "mu": 0.499,
- "sigma": 1.55,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.15,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.16,
- "discrete_ad": 0.12,
- "higher_crit": 0.13,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.5,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 0.47,
- "discrete_ad": 0.3,
- "higher_crit": 0.37,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.16,
- "sign_halfgauss": 0.98,
- "discrete_ad": 0.99,
- "higher_crit": 0.96,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.4,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.87,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.04,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.16,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.6,
- "higher_crit": 0.35,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.96,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.17,
- "discrete_ad": 1.0,
- "higher_crit": 0.97,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.63,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.09,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 0.71,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.14,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.31,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.75,
- "higher_crit": 0.63,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.94,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.3,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.93,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.15,
- "higher_crit": 0.32,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.31,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.21,
- "discrete_ad": 0.24,
- "higher_crit": 0.29,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.99,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.94,
- "discrete_ad": 0.94,
- "higher_crit": 0.97,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.21,
- "discrete_ad": 0.28,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.57,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.4,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.09,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.42,
- "runs_test": 0.93,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.02,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.03,
- "higher_crit": 0.03,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.02,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.06,
- "higher_crit": 0.05,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.04,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.04,
- "higher_crit": 0.04,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.32,
- "tail_exceedance": 0.05,
- "sign_halfgauss": 0.21,
- "discrete_ad": 0.14,
- "higher_crit": 0.16,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.05
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.05,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.99,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.2,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.31,
- "discrete_ad": 0.09,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.08618472718081072,
- "ks_pvalue": 0.8206738403763748,
- "mean_pvalue": 0.49955529110319646,
- "passes": 1
- }
- },
- "keygen_512": {
- "mu": 0.0,
- "sigma": 4.05,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.03,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.05,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.13,
- "higher_crit": 0.12,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.33,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 0.44,
- "discrete_ad": 0.32,
- "higher_crit": 0.43,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 0.98,
- "tail_exceedance": 0.28,
- "sign_halfgauss": 0.99,
- "discrete_ad": 0.99,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.69,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.99,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.07,
- "higher_crit": 0.02,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.39,
- "higher_crit": 0.11,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 0.11,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.79,
- "higher_crit": 0.44,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 0.44,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.22,
- "discrete_ad": 0.97,
- "higher_crit": 0.83,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 0.97,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.59,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.09,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.18,
- "higher_crit": 0.05,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.09,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.18,
- "discrete_ad": 0.75,
- "higher_crit": 0.55,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.69,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.63,
- "discrete_ad": 1.0,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.17,
- "higher_crit": 0.6,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 0.01,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.06,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.16,
- "discrete_ad": 0.06,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.6,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.78,
- "discrete_ad": 0.14,
- "higher_crit": 0.14,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.99,
- "higher_crit": 0.99,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.01,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.68,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.49,
- "higher_crit": 0.05,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.57,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.02,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.03,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.07,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.44,
- "runs_test": 0.95,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.04,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.02,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.04,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.04,
- "higher_crit": 0.02,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.08,
- "tail_exceedance": 0.03,
- "sign_halfgauss": 0.1,
- "discrete_ad": 0.08,
- "higher_crit": 0.03,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.33,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.23,
- "discrete_ad": 0.05,
- "higher_crit": 0.07,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.84,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 0.68,
- "discrete_ad": 0.25,
- "higher_crit": 0.27,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.01
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.99,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 0.99,
- "tail_exceedance": 0.58,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.02,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.62,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.83,
- "discrete_ad": 0.08,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.02,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.09,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.12421661499651926,
- "ks_pvalue": 0.39121727523225835,
- "mean_pvalue": 0.4967427118459444,
- "passes": 1
- }
- },
- "keygen_1024": {
- "mu": 0.0,
- "sigma": 2.87,
- "power_matrix": {
- "sigma+0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.2%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+0.5%": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.03,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sigma+1.0%": {
- "chi2": 0.01,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.01,
- "higher_crit": 0.06,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+2.0%": {
- "chi2": 0.07,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.11,
- "discrete_ad": 0.1,
- "higher_crit": 0.3,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+3.0%": {
- "chi2": 0.34,
- "tail_exceedance": 0.06,
- "sign_halfgauss": 0.48,
- "discrete_ad": 0.33,
- "higher_crit": 0.66,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+5.0%": {
- "chi2": 0.98,
- "tail_exceedance": 0.37,
- "sign_halfgauss": 0.99,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+7.0%": {
- "chi2": 1.0,
- "tail_exceedance": 0.78,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+15.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sigma+20.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.02": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.03,
- "discrete_ad": 0.0,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.05": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.04,
- "discrete_ad": 0.17,
- "higher_crit": 0.13,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.1": {
- "chi2": 0.09,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.17,
- "discrete_ad": 0.72,
- "higher_crit": 0.6,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.15": {
- "chi2": 0.49,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.4,
- "discrete_ad": 0.99,
- "higher_crit": 0.95,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.2": {
- "chi2": 0.95,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.88,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.3": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.5": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "mu+0.7": {
- "chi2": 1.0,
- "tail_exceedance": 0.03,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "mu+1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.45,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_50/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.02,
- "higher_crit": 0.04,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "sign_51/49": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.14,
- "higher_crit": 0.08,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_52/48": {
- "chi2": 0.08,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.18,
- "discrete_ad": 0.76,
- "higher_crit": 0.76,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_53/47": {
- "chi2": 0.66,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.74,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_55/44": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_56/43": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_60/40": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "sign_65/35": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_2.5sig": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.13,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.0sig": {
- "chi2": 0.78,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.54,
- "discrete_ad": 0.02,
- "higher_crit": 0.03,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_3.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_4.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_4.5sig": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "trunc_5.5sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.0,
- "runs_test": 0.01,
- "block_homog": 0.0
- },
- "trunc_6.0sig": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.1x": {
- "chi2": 0.1,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.26,
- "discrete_ad": 0.11,
- "higher_crit": 0.14,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.2x": {
- "chi2": 0.85,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.91,
- "discrete_ad": 0.35,
- "higher_crit": 0.51,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_1.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_2.5x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_3.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_4.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.02,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "table_5.0x": {
- "chi2": 1.0,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.1%": {
- "chi2": 0.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 0.08,
- "discrete_ad": 0.01,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_0.5%": {
- "chi2": 0.91,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 0.83,
- "higher_crit": 0.22,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_1.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 0.93,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_2.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "contam_5.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.01
- },
- "contam_10.0%": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.01,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "markov_0.01": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.01,
- "runs_test": 0.03,
- "block_homog": 0.0
- },
- "markov_0.02": {
- "chi2": 0.02,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.01,
- "higher_crit": 0.02,
- "ljung_box": 0.0,
- "runs_test": 0.06,
- "block_homog": 0.0
- },
- "markov_0.05": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.02,
- "discrete_ad": 0.0,
- "higher_crit": 0.0,
- "ljung_box": 0.46,
- "runs_test": 0.97,
- "block_homog": 0.0
- },
- "markov_0.1": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.01,
- "discrete_ad": 0.02,
- "higher_crit": 0.04,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.15": {
- "chi2": 0.01,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.05,
- "discrete_ad": 0.05,
- "higher_crit": 0.07,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.2": {
- "chi2": 0.06,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.07,
- "discrete_ad": 0.11,
- "higher_crit": 0.13,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.3": {
- "chi2": 0.17,
- "tail_exceedance": 0.01,
- "sign_halfgauss": 0.16,
- "discrete_ad": 0.06,
- "higher_crit": 0.14,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.0
- },
- "markov_0.5": {
- "chi2": 0.67,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 0.62,
- "discrete_ad": 0.23,
- "higher_crit": 0.44,
- "ljung_box": 1.0,
- "runs_test": 1.0,
- "block_homog": 0.03
- },
- "bimodal_sep1.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.99,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep2.0": {
- "chi2": 1.0,
- "tail_exceedance": 0.04,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "bimodal_sep3.0": {
- "chi2": 1.0,
- "tail_exceedance": 1.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_10": {
- "chi2": 1.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 1.0,
- "discrete_ad": 1.0,
- "higher_crit": 1.0,
- "ljung_box": 0.0,
- "runs_test": 0.03,
- "block_homog": 0.0
- },
- "periodic_50": {
- "chi2": 0.45,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.57,
- "discrete_ad": 0.09,
- "higher_crit": 0.11,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "periodic_100": {
- "chi2": 0.03,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.06,
- "discrete_ad": 0.01,
- "higher_crit": 0.03,
- "ljung_box": 0.01,
- "runs_test": 0.01,
- "block_homog": 0.0
- }
- },
- "false_alarm_rates": {
- "chi2": 0.0,
- "tail_exceedance": 0.0,
- "sign_halfgauss": 0.0,
- "discrete_ad": 0.0,
- "higher_crit": 0.01,
- "ljung_box": 0.0,
- "runs_test": 0.0,
- "block_homog": 0.0
- },
- "pvalue_uniformity": {
- "ks_stat": 0.11738448040522875,
- "ks_pvalue": 0.46140958644229213,
- "mean_pvalue": 0.4628356528970091,
- "passes": 1
- }
- }
- }
-}
\ No newline at end of file
diff --git a/code/falcon b/code/falcon
new file mode 160000
index 0000000..5145a81
--- /dev/null
+++ b/code/falcon
@@ -0,0 +1 @@
+Subproject commit 5145a818c9512b4a443507d3375e75dae3076af6
diff --git a/code/falcon/LICENSE b/code/falcon/LICENSE
deleted file mode 100644
index 8fb1439..0000000
--- a/code/falcon/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2018 Thomas Prest
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/code/falcon/README.md b/code/falcon/README.md
deleted file mode 100644
index 4cbd61d..0000000
--- a/code/falcon/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# falcon.py
-
-This is a private repository implementing the signature scheme Falcon (https://falcon-sign.info/).
-Falcon stands for **FA**st Fourier **L**attice-based **CO**mpact signatures over **N**TRU
-
-## Content
-
-This repository contains the following files (in order of dependency):
-1. **generate_constants.sage** contains the code which was used to generate the constants used in this project
-1. **common.py** contains shared functions and constants
-1. **fft_constants.py** contains precomputed constants used in the FFT
-1. **ntt_constants.py** contains precomputed constants used in the NTT
-1. **fft.py** contains a stand-alone implementation of the FFT over R[x] / (xn + 1)
-1. **ntt.py** contains a stand-alone implementation of the NTT over Zq[x] / (xn + 1)
-1. **ntrugen.py** generate polynomials f,g,F,G in Z[x] / (xn + 1) such that f G - g F = q
-1. **sampler.py** implements a Gaussian sampler over the integers
-1. **ffsampling.py** implements the fast Fourier sampling algorithm
-1. **falcon.py** implements Falcon
-1. **test.py** implements tests to check that everything is properly implemented
-
-
-## How to use
-
-1. Generate a secret key **sk = SecretKey(n)**
-1. Generate the corresponding public key **pk = PublicKey(sk)**
-1. Now we can sign messages:
- - To plainly sign a message m: **sig = sk.sign(m)**
- - To sign a message m with a pre-chosen 320-bit integer salt: **sig = sk.sign(m, salt)**
-1. We can also verify signatures: **pk.verify(m, sig)**
-
-## Todo
-
-- [ ] Compress and decompress
-- [ ] Document all the docstrings
-
-
-## Author
-
-* **Thomas Prest** (thomas.prest@ens.fr)
-
-## Disclaimer
-
-This is work in progress. It is not to be considered suitable for production.
-It can, to some extent, be considered reference code, but the "true" reference code of Falcon is on https://falcon-sign.info/.
-
-If you find errors or flaw, I will be very happy if you report them to me at the provided address.
-
-## License
-
-MIT
diff --git a/code/falcon/__init__.py b/code/falcon/__init__.py
deleted file mode 100755
index e69de29..0000000
diff --git a/code/falcon/common.py b/code/falcon/common.py
deleted file mode 100755
index 817c513..0000000
--- a/code/falcon/common.py
+++ /dev/null
@@ -1,45 +0,0 @@
-"""This file contains methods and objects which are reused through multiple files."""
-
-
-"""q is the integer modulus which is used in Falcon."""
-q = 12 * 1024 + 1
-
-
-def split(f):
- """Split a polynomial f in two polynomials.
-
- Args:
- f: a polynomial
-
- Format: coefficient
- """
- n = len(f)
- f0 = [f[2 * i + 0] for i in range(n // 2)]
- f1 = [f[2 * i + 1] for i in range(n // 2)]
- return [f0, f1]
-
-
-def merge(f_list):
- """Merge two polynomials into a single polynomial f.
-
- Args:
- f_list: a list of polynomials
-
- Format: coefficient
- """
- f0, f1 = f_list
- n = 2 * len(f0)
- f = [0] * n
- for i in range(n // 2):
- f[2 * i + 0] = f0[i]
- f[2 * i + 1] = f1[i]
- return f
-
-
-def sqnorm(v):
- """Compute the square euclidean norm of the vector v."""
- res = 0
- for elt in v:
- for coef in elt:
- res += coef ** 2
- return res
diff --git a/code/falcon/encoding.py b/code/falcon/encoding.py
deleted file mode 100755
index 01ab0c1..0000000
--- a/code/falcon/encoding.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""Docstring."""
-
-
-def compress(v):
- """Docstring."""
- u = ""
- for elt in v:
- s = "1" if elt > 0 else "0"
- s += format((abs(elt) % (1 << 7)), '#09b')[:1:-1]
- s += "0" * (abs(elt) >> 7) + "1"
- u += s
- u += "0" * ((8 - len(u)) % 8)
- return [int(u[8 * i: 8 * i + 8], 2) for i in range(len(u) // 8)]
-
-
-def decompress(t):
- """Docstring."""
- u = ""
- for elt in t:
- u += bin((1 << 8) ^ elt)[3:]
- v = []
- while u[-1] == "0":
- u = u[:-1]
- while u != "":
- sign = 1 if u[0] == "1" else -1
- low = int(u[7:0:-1], 2)
- i, high = 8, 0
- while u[i] == "0":
- i += 1
- high += 1
- elt = sign * (low + (high << 7))
- v += [elt]
- u = u[i + 1:]
- return v
diff --git a/code/falcon/falcon.py b/code/falcon/falcon.py
deleted file mode 100755
index 1fbfdc2..0000000
--- a/code/falcon/falcon.py
+++ /dev/null
@@ -1,288 +0,0 @@
-"""Reference implementation of Falcon: https://falcon-sign.info/."""
-
-from falcon.common import q
-from numpy import set_printoptions
-from math import sqrt
-from falcon.fft import fft, ifft, sub, neg, add_fft, mul_fft
-from falcon.ntt import add_zq, mul_zq, div_zq
-from falcon.ffsampling import gram, ffldl_fft, ffsampling_fft
-from falcon.ntrugen import ntru_gen, gs_norm
-from random import randint
-from falcon.encoding import compress, decompress
-
-# If Python has version >= 3.6, then the built-in hashlib has shake_256.
-# Otherwise, sha3 has to be loaded to monkey-patch hashlib.
-# See https://pypi.python.org/pypi/pysha3.
-import sys
-import hashlib
-if sys.version_info < (3, 6):
- import sha3
-
-if sys.version_info >= (3, 4):
- from importlib import reload # Python 3.4+ only.
-
-set_printoptions(linewidth=200, precision=5, suppress=True)
-
-
-def infinity_max(vector):
- return max(max(abs(x.real), abs(x.imag)) for x in vector)
-
-
-def infinity_max_tree(tree):
- if len(tree) == 3:
- max_0 = infinity_max(tree[0])
- max_1 = infinity_max_tree(tree[1])
- max_2 = infinity_max_tree(tree[2])
- return max(max_0, max_1, max_2)
-
- else:
- return infinity_max(tree)
-
-
-def print_tree(tree, pref=""):
- """
- Display a LDL tree in a readable form.
-
- Args:
- T: a LDL tree
-
- Format: coefficient or fft
- """
- leaf = "|_____> "
- top = "|_______"
- son1 = "| "
- son2 = " "
- width = len(top)
-
- a = ""
- if len(tree) == 3:
- # max_0 = infinity_max(tree[0])
- if (pref == ""):
- a += pref + str(tree[0]) + "\n"
- else:
- a += pref[:-width] + top + str(tree[0]) + "\n"
- a += print_tree(tree[1], pref + son1)
- a += print_tree(tree[2], pref + son2)
- return a
- # return max(max_0, max_1, max_2)
-
- else:
- # max_t = infinity_max(tree)
- return (pref[:-width] + leaf + str(tree) + "\n")
- # return max_t
-
-
-def normalize_tree(tree, sigma):
- """
- Normalize the leaves of a LDL tree (from values ||b_i||**2 to sigma/||b_i||).
-
- Args:
- T: a LDL tree
- sigma: a standard deviation
-
- Format: coefficient or fft
- """
- if len(tree) == 3:
- normalize_tree(tree[1], sigma)
- normalize_tree(tree[2], sigma)
- else:
- tree[0] = sigma / sqrt(tree[0].real)
- tree[1] = 0
-
-
-class PublicKey:
- """This class constains methods for performing public key operations in Falcon."""
-
- def __init__(self, sk):
- """Docstring."""
- self.n = sk.n
- self.q = sk.q
- self.h = sk.h
- self.hash_to_point = sk.hash_to_point
- self.signature_bound = sk.signature_bound
- self.verify = sk.verify
- self.verify_aggregate = sk.verify_aggregate
-
-
-class SecretKey:
- """
- This class contains methods for performing secret key operations (and also public key operations) in Falcon.
-
- One can perform:
- - initializing a secret key for:
- - n = 8, 16, 32, 64, 128, 256, 512, 1024,
- - phi = x ** n + 1,
- - q = 12 * 1024 + 1
- - finding a preimage t of a point c (both in ( Z[x] mod (Phi,q) )**2 ) such that t*B0 = c
- - hashing a message to a point of Z[x] mod (Phi,q)
- - sign a message
- - verify the signature of a message
- """
-
- def __init__(self, n):
- """Initialize a secret key."""
- """Public parameters"""
- self.n = n
- self.q = q
- self.hash_function = hashlib.shake_256
-
- """Private key part 1: NTRU polynomials f, g, F, G verifying fG - gF = q mod Phi"""
- self.f, self.g, self.F, self.G = ntru_gen(n)
-
- """Private key part 2: fft's of f, g, F, G"""
- self.f_fft = fft(self.f)
- self.g_fft = fft(self.g)
- self.F_fft = fft(self.F)
- self.G_fft = fft(self.G)
-
- """Private key part 3: from f, g, F, G, compute the basis B0 of a NTRU lattice as well as its Gram matrix and their fft's"""
- self.B0 = [[self.g, neg(self.f)], [self.G, neg(self.F)]]
- self.G0 = gram(self.B0)
- self.B0_fft = [[fft(elt) for elt in row] for row in self.B0]
- self.G0_fft = [[fft(elt) for elt in row] for row in self.G0]
-
- # self.T = ffldl(self.G0)
- self.T_fft = ffldl_fft(self.G0_fft)
-
- """Private key part 4: compute sigma and signature bound."""
- slack = 1.1
- smooth = 1.28
- sq_gs_norm = gs_norm(self.f, self.g, q)
- self.sigma = smooth * sqrt(sq_gs_norm)
- self.signature_bound = slack * 2 * self.n * (self.sigma**2)
-
- """Private key part 5: set leaves of tree to be the standard deviations."""
- print_tree(self.T_fft)
- normalize_tree(self.T_fft, self.sigma)
-
- """Public key: h such that h*f = g mod (Phi,q)"""
- self.h = div_zq(self.g, self.f)
-
- def __repr__(self, verbose=True):
- """Print the object in readable form."""
- rep = "Private key for n = {n}:\n\n".format(n=self.n)
- rep += "f = {f}\n".format(f=self.f)
- rep += "g = {g}\n".format(g=self.g)
- rep += "F = {F}\n".format(F=self.F)
- rep += "G = {G}\n".format(G=self.G)
- if verbose:
- rep += "\nFFT tree\n"
- rep += print_tree(self.T_fft, pref="")
- return rep
-
- def get_coord_in_fft(self, point):
- """Compute t such that t*B0 = c."""
- c0, c1 = point
- [[a, b], [c, d]] = self.B0_fft
- c0_fft, c1_fft = fft(c0), fft(c1)
- t0_fft = [(c0_fft[i] * d[i] - c1_fft[i] * c[i]) / self.q for i in range(self.n)]
- t1_fft = [(-c0_fft[i] * b[i] + c1_fft[i] * a[i]) / self.q for i in range(self.n)]
- return t0_fft, t1_fft
-
- def hash_to_point(self, message, salt):
- """Hash a message to a point in Z[x] mod(Phi, q).
-
- Inspired by the Parse function from NewHope.
- """
- n, q = self.n, self.q
- if q > 2 ** 16:
- raise ValueError("The modulus is too large")
-
- k = (2 ** 16) / q
- # We take twice the number of bits that would be needed if there was no rejection
- emessage = message.encode('utf-8')
- esalt = salt.encode('utf-8')
- hash_instance = self.hash_function()
- hash_instance.update(esalt)
- hash_instance.update(emessage)
- digest = hash_instance.hexdigest(8 * n)
- hashed = [0 for i in range(n)]
- i = 0
- j = 0
- while i < n:
- # Takes 2 bytes, transform them in a 16 bits integer
- elt = int(digest[4 * j: 4 * (j + 1)], 16)
- # Implicit rejection sampling
- if elt < k * q:
- hashed[i] = elt % q
- i += 1
- j += 1
- return hashed
-
- def sample_preimage_fft(self, point):
- """Sample preimage."""
- B = self.B0_fft
- c = point, [0] * self.n
- t_fft = self.get_coord_in_fft(c)
- # print("t0,", infinity_max(t_fft[0]))
- # print("t1,", infinity_max(t_fft[1]))
- z_fft = ffsampling_fft(t_fft, self.T_fft)
- # print("z0,", infinity_max(z_fft[0]))
- # print("z1,", infinity_max(z_fft[1]))
- # print("t_fft = {t_fft}".format(t_fft=t_fft))
- # print("z_fft = {z_fft}".format(z_fft=z_fft))
- v0_fft = add_fft(mul_fft(z_fft[0], B[0][0]), mul_fft(z_fft[1], B[1][0]))
- v1_fft = add_fft(mul_fft(z_fft[0], B[0][1]), mul_fft(z_fft[1], B[1][1]))
- v0 = [int(round(elt)) for elt in ifft(v0_fft)]
- v1 = [int(round(elt)) for elt in ifft(v1_fft)]
- v = v0, v1
- s = [sub(c[0], v[0]), sub(c[1], v[1])]
- # print("s0,", infinity_max(s[0]))
- # print("s1,", infinity_max(s[1]))
- return s
-
- def sign(self, message, salt=None, reject=True):
- """Sign a message. Needs hash randomization to be secure."""
- """1. The message is hashed into a point of Z[x] mod (Phi,q)."""
- if salt is None:
- salt = randint(0, (1 << 320) - 1)
- r = ""
- for i in range(320 // 8):
- r += chr((salt >> (8 * i)) & 0xff)
- hashed = self.hash_to_point(message, r)
- """2. A short pre-image of this point is determined."""
- while(1):
- s = self.sample_preimage_fft(hashed)
- """3. The norm of the signature is checked."""
- norm_sign = sum(sum(elt**2 for elt in part) for part in s)
- if (norm_sign < self.signature_bound) or (reject is False):
- return r, s
- # else:
- # print("redo")
-
- def verify(self, message, signature):
- """Verify a signature."""
- r, s = signature
- # Hashes a message to a point of Z[x] mod (Phi,q)
- hashed = self.hash_to_point(message, r)
- # Computes s0 + s1 * h
- result = add_zq(s[0], mul_zq(s[1], self.h))
- # Verifies that the s0 + s1*h = hashed
- if any(result[i] != hashed[i] for i in range(self.n)):
- print("The signature does not correspond to the hash!")
- return False
- # Verifies that the norm is small
- norm_sign = sum(sum(elt**2 for elt in part) for part in s)
- if norm_sign > self.signature_bound:
- print("The squared norm of the signature is too big:", norm_sign)
- return False
- # If the previous steps did not fail, accept
- return True
-
- def verify_aggregate(self, message_list, signature):
- r, s = signature
- aggregate_hash = [0] * self.n
- for msg in message_list:
- msg_hash = self.hash_to_point(msg, r)
- aggregate_hash = add_zq(aggregate_hash, msg_hash)
- result = add_zq(s[0], mul_zq(s[1], self.h))
- if any(result[i] != aggregate_hash[i] for i in range(self.n)):
- print("The aggregate signature does not correspond to the hash!")
- return False
- k = len(message_list)
- norm_sign = sum(sum(elt**2 for elt in part) for part in s)
- if norm_sign > k * self.signature_bound:
- print("The squared norm of the signature is too big:", norm_sign)
- return False
- # If the previous steps did not fail, accept.
- return True
diff --git a/code/falcon/ffsampling.py b/code/falcon/ffsampling.py
deleted file mode 100755
index 2f398bc..0000000
--- a/code/falcon/ffsampling.py
+++ /dev/null
@@ -1,209 +0,0 @@
-"""This file contains important algorithms for Falcon.
-
-- the Fast Fourier orthogonalization (in coefficient and FFT representation)
-- the Fast Fourier nearest plane (in coefficient and FFT representation)
-- the Fast Fourier sampling (only in FFT)
-.
-"""
-from falcon.common import split, merge # Split, merge
-from falcon.fft import add, sub, mul, div, adj # Operations in coef.
-from falcon.fft import add_fft, sub_fft, mul_fft, div_fft, adj_fft # Ops in FFT
-from falcon.fft import split_fft, merge_fft, fft_ratio # FFT
-from falcon.sampler import sampler_z # Gaussian sampler in Z
-from falcon.newsampler import samplerz
-
-def gram(B):
- """Compute the Gram matrix of B.
-
- Args:
- B: a matrix
-
- Format: coefficient
- """
- rows = range(len(B))
- ncols = len(B[0])
- deg = len(B[0][0])
- G = [[[0 for coef in range(deg)] for j in rows] for i in rows]
- for i in rows:
- for j in rows:
- for k in range(ncols):
- G[i][j] = add(G[i][j], mul(B[i][k], adj(B[j][k])))
- return G
-
-
-def ldl(G):
- """Compute the LDL decomposition of G.
-
- Args:
- G: a Gram matrix
-
- Format: coefficient
-
- Corresponds to algorithm 8 (LDL) of Falcon's documentation,
- except it's in polynomial representation.
- """
- deg = len(G[0][0])
- dim = len(G)
- L = [[[0 for k in range(deg)] for j in range(dim)] for i in range(dim)]
- D = [[[0 for k in range(deg)] for j in range(dim)] for i in range(dim)]
- for i in range(dim):
- L[i][i] = [1] + [0 for j in range(deg - 1)]
- D[i][i] = G[i][i]
- for j in range(i):
- L[i][j] = G[i][j]
- for k in range(j):
- L[i][j] = sub(L[i][j], mul(mul(L[i][k], adj(L[j][k])), D[k][k]))
- L[i][j] = div(L[i][j], D[j][j])
- D[i][i] = sub(D[i][i], mul(mul(L[i][j], adj(L[i][j])), D[j][j]))
- return [L, D]
-
-
-def ldl_fft(G):
- """Compute the LDL decomposition of G.
-
- Args:
- G: a Gram matrix
-
- Format: FFT
-
- Corresponds to algorithm 8 (LDL) of Falcon's documentation.
- """
- deg = len(G[0][0])
- dim = len(G)
- L = [[[0 for k in range(deg)] for j in range(dim)] for i in range(dim)]
- D = [[[0 for k in range(deg)] for j in range(dim)] for i in range(dim)]
- for i in range(dim):
- L[i][i] = [1 for j in range(deg)]
- D[i][i] = G[i][i]
- for j in range(i):
- L[i][j] = G[i][j]
- for k in range(j):
- L[i][j] = sub_fft(L[i][j], mul_fft(mul_fft(L[i][k], adj_fft(L[j][k])), D[k][k]))
- L[i][j] = div_fft(L[i][j], D[j][j])
- D[i][i] = sub_fft(D[i][i], mul_fft(mul_fft(L[i][j], adj_fft(L[i][j])), D[j][j]))
- return [L, D]
-
-
-def ffldl(G):
- """Compute the ffLDL decomposition tree of G.
-
- Args:
- G: a Gram matrix
-
- Format: coefficient
-
- Corresponds to algorithm 9 (ffLDL) of Falcon's documentation,
- except it's in polynomial representation.
- """
- n = len(G[0][0])
- L, D = ldl(G)
- # Coefficients of L, D are elements of R[x]/(x^n - x^(n/2) + 1), in coefficient representation
- if (n > 2):
- # A bisection is done on elements of a 2*2 diagonal matrix.
- d00, d01 = split(D[0][0])
- d10, d11 = split(D[1][1])
- G0 = [[d00, d01], [adj(d01), d00]]
- G1 = [[d10, d11], [adj(d11), d10]]
- return [L[1][0], ffldl(G0), ffldl(G1)]
- elif (n == 2):
- # Bottom of the recursion.
- D[0][0][1] = 0
- D[1][1][1] = 0
- return [L[1][0], D[0][0], D[1][1]]
-
-
-def ffldl_fft(G):
- """Compute the ffLDL decomposition tree of G.
-
- Args:
- G: a Gram matrix
-
- Format: FFT
-
- Corresponds to algorithm 9 (ffLDL) of Falcon's documentation.
- """
- n = len(G[0][0]) * fft_ratio
- L, D = ldl_fft(G)
- # Coefficients of L, D are elements of R[x]/(x^n - x^(n/2) + 1), in FFT representation
- if (n > 2):
- # A bisection is done on elements of a 2*2 diagonal matrix.
- d00, d01 = split_fft(D[0][0])
- d10, d11 = split_fft(D[1][1])
- G0 = [[d00, d01], [adj_fft(d01), d00]]
- G1 = [[d10, d11], [adj_fft(d11), d10]]
- return [L[1][0], ffldl_fft(G0), ffldl_fft(G1)]
- elif (n == 2):
- # End of the recursion (each element is real).
- return [L[1][0], D[0][0], D[1][1]]
-
-
-def ffnp(t, T):
- """Compute the ffnp reduction of t, using T as auxilary information.
-
- Args:
- t: a vector
- T: a ldl decomposition tree
-
- Format: coefficient
- """
- n = len(t[0])
- z = [None, None]
- if (n > 1):
- l10, T0, T1 = T
- z[1] = merge(ffnp(split(t[1]), T1))
- t0b = add(t[0], mul(sub(t[1], z[1]), l10))
- z[0] = merge(ffnp(split(t0b), T0))
- return z
- elif (n == 1):
- z[0] = [round(t[0][0])]
- z[1] = [round(t[1][0])]
- return z
-
-
-def ffnp_fft(t, T):
- """Compute the ffnp reduction of t, using T as auxilary information.
-
- Args:
- t: a vector
- T: a ldl decomposition tree
-
- Format: FFT
- """
- n = len(t[0]) * fft_ratio
- z = [0, 0]
- if (n > 1):
- l10, T0, T1 = T
- z[1] = merge_fft(ffnp_fft(split_fft(t[1]), T1))
- t0b = add_fft(t[0], mul_fft(sub_fft(t[1], z[1]), l10))
- z[0] = merge_fft(ffnp_fft(split_fft(t0b), T0))
- return z
- elif (n == 1):
- z[0] = [round(t[0][0].real)]
- z[1] = [round(t[1][0].real)]
- return z
-
-
-def ffsampling_fft(t, T):
- """Compute the ffsampling of t, using T as auxilary information.
-
- Args:
- t: a vector
- T: a ldl decomposition tree
-
- Format: FFT
- Corresponds to algorithm 11 (ffSampling) of Falcon's documentation.
- """
- n = len(t[0]) * fft_ratio
- z = [0, 0]
- if (n > 1):
- l10, T0, T1 = T
- z[1] = merge_fft(ffsampling_fft(split_fft(t[1]), T1))
- t0b = add_fft(t[0], mul_fft(sub_fft(t[1], z[1]), l10))
- z[0] = merge_fft(ffsampling_fft(split_fft(t0b), T0))
- return z
- elif (n == 1):
- z[0] = [sampler_z(T[0], t[0][0].real)]
- z[1] = [sampler_z(T[0], t[1][0].real)]
- # z[0] = [samplerz(t[0][0].real, T[0])]
- # z[1] = [samplerz(t[1][0].real, T[0])]
- return z
diff --git a/code/falcon/fft.py b/code/falcon/fft.py
deleted file mode 100755
index cc43d31..0000000
--- a/code/falcon/fft.py
+++ /dev/null
@@ -1,163 +0,0 @@
-"""This file contains an implementation of the FFT.
-
-The FFT implemented here is for polynomials in R[x]/(phi), with:
-- The polynomial modulus phi = x ** n + 1, with n a power of two, n =< 1024
-
-The code is voluntarily very similar to the code of the NTT.
-It is probably possible to use templating to merge both implementations.
-"""
-
-from falcon.common import split, merge # Import split and merge
-from falcon.fft_constants import roots_dict # Import constants useful for the FFT
-
-
-def split_fft(f_fft):
- """Split a polynomial f in two polynomials.
-
- Args:
- f: a polynomial
-
- Format: FFT
-
- Corresponds to algorithm 1 (splitfft_2) of Falcon's documentation.
- """
- n = len(f_fft)
- w = roots_dict[n]
- f0_fft = [0] * (n // 2)
- f1_fft = [0] * (n // 2)
- for i in range(n // 2):
- f0_fft[i] = 0.5 * (f_fft[2 * i] + f_fft[2 * i + 1])
- f1_fft[i] = 0.5 * (f_fft[2 * i] - f_fft[2 * i + 1]) * w[2 * i].conjugate()
- return [f0_fft, f1_fft]
-
-
-def merge_fft(f_list_fft):
- """Merge two or three polynomials into a single polynomial f.
-
- Args:
- f_list: a list of polynomials
-
- Format: FFT
-
- Corresponds to algorithm 2 (mergefft_2) of Falcon's documentation.
- """
- f0_fft, f1_fft = f_list_fft
- n = 2 * len(f0_fft)
- w = roots_dict[n]
- f_fft = [0] * n
- for i in range(n // 2):
- f_fft[2 * i + 0] = f0_fft[i] + w[2 * i] * f1_fft[i]
- f_fft[2 * i + 1] = f0_fft[i] - w[2 * i] * f1_fft[i]
- return f_fft
-
-
-def fft(f):
- """Compute the FFT of a polynomial mod (x ** n + 1).
-
- Args:
- f: a polynomial
-
- Format: input as coefficients, output as FFT
- """
- n = len(f)
- if (n > 2):
- f0, f1 = split(f)
- f0_fft = fft(f0)
- f1_fft = fft(f1)
- f_fft = merge_fft([f0_fft, f1_fft])
- elif (n == 2):
- f_fft = [0] * n
- f_fft[0] = f[0] + 1j * f[1]
- f_fft[1] = f[0] - 1j * f[1]
- return f_fft
-
-
-def ifft(f_fft):
- """Compute the inverse FFT of a polynomial mod (x ** n + 1).
-
- Args:
- f: a FFT of a polynomial
-
- Format: input as FFT, output as coefficients
- """
- n = len(f_fft)
- if (n > 2):
- f0_fft, f1_fft = split_fft(f_fft)
- f0 = ifft(f0_fft)
- f1 = ifft(f1_fft)
- f = merge([f0, f1])
- elif (n == 2):
- f = [0] * n
- f[0] = f_fft[0].real
- f[1] = f_fft[0].imag
- return f
-
-
-def add(f, g):
- """Addition of two polynomials (coefficient representation)."""
- assert len(f) == len(g)
- deg = len(f)
- return [f[i] + g[i] for i in range(deg)]
-
-
-def neg(f):
- """Negation of a polynomials (any representation)."""
- deg = len(f)
- return [- f[i] for i in range(deg)]
-
-
-def sub(f, g):
- """Substraction of two polynomials (any representation)."""
- return add(f, neg(g))
-
-
-def mul(f, g):
- """Multiplication of two polynomials (coefficient representation)."""
- return ifft(mul_fft(fft(f), fft(g)))
-
-
-def div(f, g):
- """Division of two polynomials (coefficient representation)."""
- return ifft(div_fft(fft(f), fft(g)))
-
-
-def adj(f):
- """Ajoint of a polynomial (coefficient representation)."""
- return ifft(adj_fft(fft(f)))
-
-
-def add_fft(f_fft, g_fft):
- """Addition of two polynomials (FFT representation)."""
- return add(f_fft, g_fft)
-
-
-def sub_fft(f_fft, g_fft):
- """Substraction of two polynomials (FFT representation)."""
- return sub(f_fft, g_fft)
-
-
-def mul_fft(f_fft, g_fft):
- """Multiplication of two polynomials (coefficient representation)."""
- deg = len(f_fft)
- return [f_fft[i] * g_fft[i] for i in range(deg)]
-
-
-def div_fft(f_fft, g_fft):
- """Division of two polynomials (FFT representation)."""
- assert len(f_fft) == len(g_fft)
- deg = len(f_fft)
- return [f_fft[i] / g_fft[i] for i in range(deg)]
-
-
-def adj_fft(f_fft):
- """Ajoint of a polynomial (FFT representation)."""
- deg = len(f_fft)
- return [f_fft[i].conjugate() for i in range(deg)]
-
-
-"""This value is the ratio between:
- - The degree n
- - The number of complex coefficients of the NTT
-While here this ratio is 1, it is possible to develop a short NTT such that it is 2.
-"""
-fft_ratio = 1
diff --git a/code/falcon/fft_constants.py b/code/falcon/fft_constants.py
deleted file mode 100755
index 7573d94..0000000
--- a/code/falcon/fft_constants.py
+++ /dev/null
@@ -1,2112 +0,0 @@
-"""This file contains constants related to the FFT (roots of cyclotomic polynomials).
-
-If this module is loaded with fft_short, we only need the first half of each phi*_roots table.
-"""
-
-
-""" The roots of phi_4 = x^2 + 1
-The second root is the conjugates of the first one.
-"""
-phi4_roots = [1.00000000000000j, -1.00000000000000j]
-
-""" The roots of phi_8 = x^4 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi8_roots = [0.707106781186548 + 0.707106781186547j,
- -0.707106781186548 - 0.707106781186547j,
- 0.707106781186548 - 0.707106781186547j,
- -0.707106781186548 + 0.707106781186547j]
-
-
-""" The roots of phi_16 = x^8 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi16_roots = [0.923879532511287 + 0.382683432365090j,
- -0.923879532511287 - 0.382683432365090j,
- 0.382683432365090 - 0.923879532511287j,
- -0.382683432365090 + 0.923879532511287j,
- 0.923879532511287 - 0.382683432365090j,
- -0.923879532511287 + 0.382683432365090j,
- 0.382683432365090 + 0.923879532511287j,
- -0.382683432365090 - 0.923879532511287j]
-
-
-""" The roots of phi_32 = x^16 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi32_roots = [0.980785280403230 + 0.195090322016128j,
- -0.980785280403230 - 0.195090322016128j,
- 0.195090322016128 - 0.980785280403230j,
- -0.195090322016128 + 0.980785280403230j,
- 0.831469612302545 - 0.555570233019602j,
- -0.831469612302545 + 0.555570233019602j,
- 0.555570233019602 + 0.831469612302545j,
- -0.555570233019602 - 0.831469612302545j,
- 0.980785280403230 - 0.195090322016128j,
- -0.980785280403230 + 0.195090322016128j,
- 0.195090322016128 + 0.980785280403230j,
- -0.195090322016128 - 0.980785280403230j,
- 0.831469612302545 + 0.555570233019602j,
- -0.831469612302545 - 0.555570233019602j,
- 0.555570233019602 - 0.831469612302545j,
- -0.555570233019602 + 0.831469612302545j]
-
-
-""" The roots of phi_64 = x^32 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi64_roots = [0.995184726672197 + 0.0980171403295606j,
- -0.995184726672197 - 0.0980171403295606j,
- 0.0980171403295606 - 0.995184726672197j,
- -0.0980171403295606 + 0.995184726672197j,
- 0.773010453362737 - 0.634393284163646j,
- -0.773010453362737 + 0.634393284163646j,
- 0.634393284163645 + 0.773010453362737j,
- -0.634393284163645 - 0.773010453362737j,
- 0.956940335732209 - 0.290284677254462j,
- -0.956940335732209 + 0.290284677254462j,
- 0.290284677254462 + 0.956940335732209j,
- -0.290284677254462 - 0.956940335732209j,
- 0.881921264348355 + 0.471396736825998j,
- -0.881921264348355 - 0.471396736825998j,
- 0.471396736825998 - 0.881921264348355j,
- -0.471396736825998 + 0.881921264348355j,
- 0.995184726672197 - 0.0980171403295606j,
- -0.995184726672197 + 0.0980171403295606j,
- 0.0980171403295606 + 0.995184726672197j,
- -0.0980171403295606 - 0.995184726672197j,
- 0.773010453362737 + 0.634393284163646j,
- -0.773010453362737 - 0.634393284163646j,
- 0.634393284163645 - 0.773010453362737j,
- -0.634393284163645 + 0.773010453362737j,
- 0.956940335732209 + 0.290284677254462j,
- -0.956940335732209 - 0.290284677254462j,
- 0.290284677254462 - 0.956940335732209j,
- -0.290284677254462 + 0.956940335732209j,
- 0.881921264348355 - 0.471396736825998j,
- -0.881921264348355 + 0.471396736825998j,
- 0.471396736825998 + 0.881921264348355j,
- -0.471396736825998 - 0.881921264348355j]
-
-
-""" The roots of phi_128 = x^64 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi128_roots = [0.998795456205172 + 0.0490676743274180j,
- -0.998795456205172 - 0.0490676743274180j,
- 0.0490676743274180 - 0.998795456205172j,
- -0.0490676743274180 + 0.998795456205172j,
- 0.740951125354959 - 0.671558954847018j,
- -0.740951125354959 + 0.671558954847018j,
- 0.671558954847018 + 0.740951125354959j,
- -0.671558954847018 - 0.740951125354959j,
- 0.941544065183021 - 0.336889853392220j,
- -0.941544065183021 + 0.336889853392220j,
- 0.336889853392220 + 0.941544065183021j,
- -0.336889853392220 - 0.941544065183021j,
- 0.903989293123443 + 0.427555093430282j,
- -0.903989293123443 - 0.427555093430282j,
- 0.427555093430282 - 0.903989293123443j,
- -0.427555093430282 + 0.903989293123443j,
- 0.989176509964781 - 0.146730474455362j,
- -0.989176509964781 + 0.146730474455362j,
- 0.146730474455362 + 0.989176509964781j,
- -0.146730474455362 - 0.989176509964781j,
- 0.803207531480645 + 0.595699304492433j,
- -0.803207531480645 - 0.595699304492433j,
- 0.595699304492433 - 0.803207531480645j,
- -0.595699304492433 + 0.803207531480645j,
- 0.970031253194544 + 0.242980179903264j,
- -0.970031253194544 - 0.242980179903264j,
- 0.242980179903264 - 0.970031253194544j,
- -0.242980179903264 + 0.970031253194544j,
- 0.857728610000272 - 0.514102744193222j,
- -0.857728610000272 + 0.514102744193222j,
- 0.514102744193222 + 0.857728610000272j,
- -0.514102744193222 - 0.857728610000272j,
- 0.998795456205172 - 0.0490676743274180j,
- -0.998795456205172 + 0.0490676743274180j,
- 0.0490676743274180 + 0.998795456205172j,
- -0.0490676743274180 - 0.998795456205172j,
- 0.740951125354959 + 0.671558954847018j,
- -0.740951125354959 - 0.671558954847018j,
- 0.671558954847018 - 0.740951125354959j,
- -0.671558954847018 + 0.740951125354959j,
- 0.941544065183021 + 0.336889853392220j,
- -0.941544065183021 - 0.336889853392220j,
- 0.336889853392220 - 0.941544065183021j,
- -0.336889853392220 + 0.941544065183021j,
- 0.903989293123443 - 0.427555093430282j,
- -0.903989293123443 + 0.427555093430282j,
- 0.427555093430282 + 0.903989293123443j,
- -0.427555093430282 - 0.903989293123443j,
- 0.989176509964781 + 0.146730474455362j,
- -0.989176509964781 - 0.146730474455362j,
- 0.146730474455362 - 0.989176509964781j,
- -0.146730474455362 + 0.989176509964781j,
- 0.803207531480645 - 0.595699304492433j,
- -0.803207531480645 + 0.595699304492433j,
- 0.595699304492433 + 0.803207531480645j,
- -0.595699304492433 - 0.803207531480645j,
- 0.970031253194544 - 0.242980179903264j,
- -0.970031253194544 + 0.242980179903264j,
- 0.242980179903264 + 0.970031253194544j,
- -0.242980179903264 - 0.970031253194544j,
- 0.857728610000272 + 0.514102744193222j,
- -0.857728610000272 - 0.514102744193222j,
- 0.514102744193222 - 0.857728610000272j,
- -0.514102744193222 + 0.857728610000272j]
-
-
-""" The roots of phi_256 = x^128 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi256_roots = [0.999698818696204 + 0.0245412285229123j,
- -0.999698818696204 - 0.0245412285229123j,
- 0.0245412285229123 - 0.999698818696204j,
- -0.0245412285229123 + 0.999698818696204j,
- 0.724247082951467 - 0.689540544737067j,
- -0.724247082951467 + 0.689540544737067j,
- 0.689540544737067 + 0.724247082951467j,
- -0.689540544737067 - 0.724247082951467j,
- 0.932992798834739 - 0.359895036534988j,
- -0.932992798834739 + 0.359895036534988j,
- 0.359895036534988 + 0.932992798834739j,
- -0.359895036534988 - 0.932992798834739j,
- 0.914209755703531 + 0.405241314004990j,
- -0.914209755703531 - 0.405241314004990j,
- 0.405241314004990 - 0.914209755703531j,
- -0.405241314004990 + 0.914209755703531j,
- 0.985277642388941 - 0.170961888760301j,
- -0.985277642388941 + 0.170961888760301j,
- 0.170961888760301 + 0.985277642388941j,
- -0.170961888760301 - 0.985277642388941j,
- 0.817584813151584 + 0.575808191417845j,
- -0.817584813151584 - 0.575808191417845j,
- 0.575808191417845 - 0.817584813151584j,
- -0.575808191417845 + 0.817584813151584j,
- 0.975702130038529 + 0.219101240156870j,
- -0.975702130038529 - 0.219101240156870j,
- 0.219101240156870 - 0.975702130038529j,
- -0.219101240156870 + 0.975702130038529j,
- 0.844853565249707 - 0.534997619887097j,
- -0.844853565249707 + 0.534997619887097j,
- 0.534997619887097 + 0.844853565249707j,
- -0.534997619887097 - 0.844853565249707j,
- 0.997290456678690 - 0.0735645635996674j,
- -0.997290456678690 + 0.0735645635996674j,
- 0.0735645635996674 + 0.997290456678690j,
- -0.0735645635996674 - 0.997290456678690j,
- 0.757208846506485 + 0.653172842953777j,
- -0.757208846506485 - 0.653172842953777j,
- 0.653172842953777 - 0.757208846506485j,
- -0.653172842953777 + 0.757208846506485j,
- 0.949528180593037 + 0.313681740398892j,
- -0.949528180593037 - 0.313681740398892j,
- 0.313681740398892 - 0.949528180593037j,
- -0.313681740398892 + 0.949528180593037j,
- 0.893224301195515 - 0.449611329654607j,
- -0.893224301195515 + 0.449611329654607j,
- 0.449611329654607 + 0.893224301195515j,
- -0.449611329654607 - 0.893224301195515j,
- 0.992479534598710 + 0.122410675199216j,
- -0.992479534598710 - 0.122410675199216j,
- 0.122410675199216 - 0.992479534598710j,
- -0.122410675199216 + 0.992479534598710j,
- 0.788346427626606 - 0.615231590580627j,
- -0.788346427626606 + 0.615231590580627j,
- 0.615231590580627 + 0.788346427626606j,
- -0.615231590580627 - 0.788346427626606j,
- 0.963776065795440 - 0.266712757474898j,
- -0.963776065795440 + 0.266712757474898j,
- 0.266712757474898 + 0.963776065795440j,
- -0.266712757474898 - 0.963776065795440j,
- 0.870086991108711 + 0.492898192229784j,
- -0.870086991108711 - 0.492898192229784j,
- 0.492898192229784 - 0.870086991108711j,
- -0.492898192229784 + 0.870086991108711j,
- 0.999698818696204 - 0.0245412285229123j,
- -0.999698818696204 + 0.0245412285229123j,
- 0.0245412285229123 + 0.999698818696204j,
- -0.0245412285229123 - 0.999698818696204j,
- 0.724247082951467 + 0.689540544737067j,
- -0.724247082951467 - 0.689540544737067j,
- 0.689540544737067 - 0.724247082951467j,
- -0.689540544737067 + 0.724247082951467j,
- 0.932992798834739 + 0.359895036534988j,
- -0.932992798834739 - 0.359895036534988j,
- 0.359895036534988 - 0.932992798834739j,
- -0.359895036534988 + 0.932992798834739j,
- 0.914209755703531 - 0.405241314004990j,
- -0.914209755703531 + 0.405241314004990j,
- 0.405241314004990 + 0.914209755703531j,
- -0.405241314004990 - 0.914209755703531j,
- 0.985277642388941 + 0.170961888760301j,
- -0.985277642388941 - 0.170961888760301j,
- 0.170961888760301 - 0.985277642388941j,
- -0.170961888760301 + 0.985277642388941j,
- 0.817584813151584 - 0.575808191417845j,
- -0.817584813151584 + 0.575808191417845j,
- 0.575808191417845 + 0.817584813151584j,
- -0.575808191417845 - 0.817584813151584j,
- 0.975702130038529 - 0.219101240156870j,
- -0.975702130038529 + 0.219101240156870j,
- 0.219101240156870 + 0.975702130038529j,
- -0.219101240156870 - 0.975702130038529j,
- 0.844853565249707 + 0.534997619887097j,
- -0.844853565249707 - 0.534997619887097j,
- 0.534997619887097 - 0.844853565249707j,
- -0.534997619887097 + 0.844853565249707j,
- 0.997290456678690 + 0.0735645635996674j,
- -0.997290456678690 - 0.0735645635996674j,
- 0.0735645635996674 - 0.997290456678690j,
- -0.0735645635996674 + 0.997290456678690j,
- 0.757208846506485 - 0.653172842953777j,
- -0.757208846506485 + 0.653172842953777j,
- 0.653172842953777 + 0.757208846506485j,
- -0.653172842953777 - 0.757208846506485j,
- 0.949528180593037 - 0.313681740398892j,
- -0.949528180593037 + 0.313681740398892j,
- 0.313681740398892 + 0.949528180593037j,
- -0.313681740398892 - 0.949528180593037j,
- 0.893224301195515 + 0.449611329654607j,
- -0.893224301195515 - 0.449611329654607j,
- 0.449611329654607 - 0.893224301195515j,
- -0.449611329654607 + 0.893224301195515j,
- 0.992479534598710 - 0.122410675199216j,
- -0.992479534598710 + 0.122410675199216j,
- 0.122410675199216 + 0.992479534598710j,
- -0.122410675199216 - 0.992479534598710j,
- 0.788346427626606 + 0.615231590580627j,
- -0.788346427626606 - 0.615231590580627j,
- 0.615231590580627 - 0.788346427626606j,
- -0.615231590580627 + 0.788346427626606j,
- 0.963776065795440 + 0.266712757474898j,
- -0.963776065795440 - 0.266712757474898j,
- 0.266712757474898 - 0.963776065795440j,
- -0.266712757474898 + 0.963776065795440j,
- 0.870086991108711 - 0.492898192229784j,
- -0.870086991108711 + 0.492898192229784j,
- 0.492898192229784 + 0.870086991108711j,
- -0.492898192229784 - 0.870086991108711j]
-
-
-""" The roots of phi_512 = x^256 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi512_roots = [0.999924701839145 + 0.0122715382857199j,
- -0.999924701839145 - 0.0122715382857199j,
- 0.0122715382857199 - 0.999924701839145j,
- -0.0122715382857199 + 0.999924701839145j,
- 0.715730825283819 - 0.698376249408973j,
- -0.715730825283819 + 0.698376249408973j,
- 0.698376249408973 + 0.715730825283819j,
- -0.698376249408973 - 0.715730825283819j,
- 0.928506080473216 - 0.371317193951837j,
- -0.928506080473216 + 0.371317193951837j,
- 0.371317193951837 + 0.928506080473216j,
- -0.371317193951837 - 0.928506080473216j,
- 0.919113851690058 + 0.393992040061048j,
- -0.919113851690058 - 0.393992040061048j,
- 0.393992040061048 - 0.919113851690058j,
- -0.393992040061048 + 0.919113851690058j,
- 0.983105487431216 - 0.183039887955141j,
- -0.983105487431216 + 0.183039887955141j,
- 0.183039887955141 + 0.983105487431216j,
- -0.183039887955141 - 0.983105487431216j,
- 0.824589302785025 + 0.565731810783613j,
- -0.824589302785025 - 0.565731810783613j,
- 0.565731810783613 - 0.824589302785025j,
- -0.565731810783613 + 0.824589302785025j,
- 0.978317370719628 + 0.207111376192219j,
- -0.978317370719628 - 0.207111376192219j,
- 0.207111376192219 - 0.978317370719628j,
- -0.207111376192219 + 0.978317370719628j,
- 0.838224705554838 - 0.545324988422046j,
- -0.838224705554838 + 0.545324988422046j,
- 0.545324988422046 + 0.838224705554838j,
- -0.545324988422046 - 0.838224705554838j,
- 0.996312612182778 - 0.0857973123444399j,
- -0.996312612182778 + 0.0857973123444399j,
- 0.0857973123444399 + 0.996312612182778j,
- -0.0857973123444399 - 0.996312612182778j,
- 0.765167265622459 + 0.643831542889791j,
- -0.765167265622459 - 0.643831542889791j,
- 0.643831542889791 - 0.765167265622459j,
- -0.643831542889791 + 0.765167265622459j,
- 0.953306040354194 + 0.302005949319228j,
- -0.953306040354194 - 0.302005949319228j,
- 0.302005949319228 - 0.953306040354194j,
- -0.302005949319228 + 0.953306040354194j,
- 0.887639620402854 - 0.460538710958240j,
- -0.887639620402854 + 0.460538710958240j,
- 0.460538710958240 + 0.887639620402854j,
- -0.460538710958240 - 0.887639620402854j,
- 0.993906970002356 + 0.110222207293883j,
- -0.993906970002356 - 0.110222207293883j,
- 0.110222207293883 - 0.993906970002356j,
- -0.110222207293883 + 0.993906970002356j,
- 0.780737228572094 - 0.624859488142386j,
- -0.780737228572094 + 0.624859488142386j,
- 0.624859488142386 + 0.780737228572094j,
- -0.624859488142386 - 0.780737228572094j,
- 0.960430519415566 - 0.278519689385053j,
- -0.960430519415566 + 0.278519689385053j,
- 0.278519689385053 + 0.960430519415566j,
- -0.278519689385053 - 0.960430519415566j,
- 0.876070094195407 + 0.482183772079123j,
- -0.876070094195407 - 0.482183772079123j,
- 0.482183772079123 - 0.876070094195407j,
- -0.482183772079123 + 0.876070094195407j,
- 0.999322384588350 - 0.0368072229413588j,
- -0.999322384588350 + 0.0368072229413588j,
- 0.0368072229413588 + 0.999322384588350j,
- -0.0368072229413588 - 0.999322384588350j,
- 0.732654271672413 + 0.680600997795453j,
- -0.732654271672413 - 0.680600997795453j,
- 0.680600997795453 - 0.732654271672413j,
- -0.680600997795453 + 0.732654271672413j,
- 0.937339011912575 + 0.348418680249435j,
- -0.937339011912575 - 0.348418680249435j,
- 0.348418680249435 - 0.937339011912575j,
- -0.348418680249435 + 0.937339011912575j,
- 0.909167983090522 - 0.416429560097637j,
- -0.909167983090522 + 0.416429560097637j,
- 0.416429560097637 + 0.909167983090522j,
- -0.416429560097637 - 0.909167983090522j,
- 0.987301418157858 + 0.158858143333861j,
- -0.987301418157858 - 0.158858143333861j,
- 0.158858143333861 - 0.987301418157858j,
- -0.158858143333861 + 0.987301418157858j,
- 0.810457198252595 - 0.585797857456439j,
- -0.810457198252595 + 0.585797857456439j,
- 0.585797857456439 + 0.810457198252595j,
- -0.585797857456439 - 0.810457198252595j,
- 0.972939952205560 - 0.231058108280671j,
- -0.972939952205560 + 0.231058108280671j,
- 0.231058108280671 + 0.972939952205560j,
- -0.231058108280671 - 0.972939952205560j,
- 0.851355193105265 + 0.524589682678469j,
- -0.851355193105265 - 0.524589682678469j,
- 0.524589682678469 - 0.851355193105265j,
- -0.524589682678469 + 0.851355193105265j,
- 0.998118112900149 + 0.0613207363022086j,
- -0.998118112900149 - 0.0613207363022086j,
- 0.0613207363022086 - 0.998118112900149j,
- -0.0613207363022086 + 0.998118112900149j,
- 0.749136394523459 - 0.662415777590172j,
- -0.749136394523459 + 0.662415777590172j,
- 0.662415777590172 + 0.749136394523459j,
- -0.662415777590172 - 0.749136394523459j,
- 0.945607325380521 - 0.325310292162263j,
- -0.945607325380521 + 0.325310292162263j,
- 0.325310292162263 + 0.945607325380521j,
- -0.325310292162263 - 0.945607325380521j,
- 0.898674465693954 + 0.438616238538528j,
- -0.898674465693954 - 0.438616238538528j,
- 0.438616238538528 - 0.898674465693954j,
- -0.438616238538528 + 0.898674465693954j,
- 0.990902635427780 - 0.134580708507126j,
- -0.990902635427780 + 0.134580708507126j,
- 0.134580708507126 + 0.990902635427780j,
- -0.134580708507126 - 0.990902635427780j,
- 0.795836904608884 + 0.605511041404325j,
- -0.795836904608884 - 0.605511041404325j,
- 0.605511041404326 - 0.795836904608883j,
- -0.605511041404326 + 0.795836904608883j,
- 0.966976471044852 + 0.254865659604515j,
- -0.966976471044852 - 0.254865659604515j,
- 0.254865659604515 - 0.966976471044852j,
- -0.254865659604515 + 0.966976471044852j,
- 0.863972856121587 - 0.503538383725718j,
- -0.863972856121587 + 0.503538383725718j,
- 0.503538383725718 + 0.863972856121587j,
- -0.503538383725718 - 0.863972856121587j,
- 0.999924701839145 - 0.0122715382857199j,
- -0.999924701839145 + 0.0122715382857199j,
- 0.0122715382857199 + 0.999924701839145j,
- -0.0122715382857199 - 0.999924701839145j,
- 0.715730825283819 + 0.698376249408973j,
- -0.715730825283819 - 0.698376249408973j,
- 0.698376249408973 - 0.715730825283819j,
- -0.698376249408973 + 0.715730825283819j,
- 0.928506080473216 + 0.371317193951837j,
- -0.928506080473216 - 0.371317193951837j,
- 0.371317193951837 - 0.928506080473216j,
- -0.371317193951837 + 0.928506080473216j,
- 0.919113851690058 - 0.393992040061048j,
- -0.919113851690058 + 0.393992040061048j,
- 0.393992040061048 + 0.919113851690058j,
- -0.393992040061048 - 0.919113851690058j,
- 0.983105487431216 + 0.183039887955141j,
- -0.983105487431216 - 0.183039887955141j,
- 0.183039887955141 - 0.983105487431216j,
- -0.183039887955141 + 0.983105487431216j,
- 0.824589302785025 - 0.565731810783613j,
- -0.824589302785025 + 0.565731810783613j,
- 0.565731810783613 + 0.824589302785025j,
- -0.565731810783613 - 0.824589302785025j,
- 0.978317370719628 - 0.207111376192219j,
- -0.978317370719628 + 0.207111376192219j,
- 0.207111376192219 + 0.978317370719628j,
- -0.207111376192219 - 0.978317370719628j,
- 0.838224705554838 + 0.545324988422046j,
- -0.838224705554838 - 0.545324988422046j,
- 0.545324988422046 - 0.838224705554838j,
- -0.545324988422046 + 0.838224705554838j,
- 0.996312612182778 + 0.0857973123444399j,
- -0.996312612182778 - 0.0857973123444399j,
- 0.0857973123444399 - 0.996312612182778j,
- -0.0857973123444399 + 0.996312612182778j,
- 0.765167265622459 - 0.643831542889791j,
- -0.765167265622459 + 0.643831542889791j,
- 0.643831542889791 + 0.765167265622459j,
- -0.643831542889791 - 0.765167265622459j,
- 0.953306040354194 - 0.302005949319228j,
- -0.953306040354194 + 0.302005949319228j,
- 0.302005949319228 + 0.953306040354194j,
- -0.302005949319228 - 0.953306040354194j,
- 0.887639620402854 + 0.460538710958240j,
- -0.887639620402854 - 0.460538710958240j,
- 0.460538710958240 - 0.887639620402854j,
- -0.460538710958240 + 0.887639620402854j,
- 0.993906970002356 - 0.110222207293883j,
- -0.993906970002356 + 0.110222207293883j,
- 0.110222207293883 + 0.993906970002356j,
- -0.110222207293883 - 0.993906970002356j,
- 0.780737228572094 + 0.624859488142386j,
- -0.780737228572094 - 0.624859488142386j,
- 0.624859488142386 - 0.780737228572094j,
- -0.624859488142386 + 0.780737228572094j,
- 0.960430519415566 + 0.278519689385053j,
- -0.960430519415566 - 0.278519689385053j,
- 0.278519689385053 - 0.960430519415566j,
- -0.278519689385053 + 0.960430519415566j,
- 0.876070094195407 - 0.482183772079123j,
- -0.876070094195407 + 0.482183772079123j,
- 0.482183772079123 + 0.876070094195407j,
- -0.482183772079123 - 0.876070094195407j,
- 0.999322384588350 + 0.0368072229413588j,
- -0.999322384588350 - 0.0368072229413588j,
- 0.0368072229413588 - 0.999322384588350j,
- -0.0368072229413588 + 0.999322384588350j,
- 0.732654271672413 - 0.680600997795453j,
- -0.732654271672413 + 0.680600997795453j,
- 0.680600997795453 + 0.732654271672413j,
- -0.680600997795453 - 0.732654271672413j,
- 0.937339011912575 - 0.348418680249435j,
- -0.937339011912575 + 0.348418680249435j,
- 0.348418680249435 + 0.937339011912575j,
- -0.348418680249435 - 0.937339011912575j,
- 0.909167983090522 + 0.416429560097637j,
- -0.909167983090522 - 0.416429560097637j,
- 0.416429560097637 - 0.909167983090522j,
- -0.416429560097637 + 0.909167983090522j,
- 0.987301418157858 - 0.158858143333861j,
- -0.987301418157858 + 0.158858143333861j,
- 0.158858143333861 + 0.987301418157858j,
- -0.158858143333861 - 0.987301418157858j,
- 0.810457198252595 + 0.585797857456439j,
- -0.810457198252595 - 0.585797857456439j,
- 0.585797857456439 - 0.810457198252595j,
- -0.585797857456439 + 0.810457198252595j,
- 0.972939952205560 + 0.231058108280671j,
- -0.972939952205560 - 0.231058108280671j,
- 0.231058108280671 - 0.972939952205560j,
- -0.231058108280671 + 0.972939952205560j,
- 0.851355193105265 - 0.524589682678469j,
- -0.851355193105265 + 0.524589682678469j,
- 0.524589682678469 + 0.851355193105265j,
- -0.524589682678469 - 0.851355193105265j,
- 0.998118112900149 - 0.0613207363022086j,
- -0.998118112900149 + 0.0613207363022086j,
- 0.0613207363022086 + 0.998118112900149j,
- -0.0613207363022086 - 0.998118112900149j,
- 0.749136394523459 + 0.662415777590172j,
- -0.749136394523459 - 0.662415777590172j,
- 0.662415777590172 - 0.749136394523459j,
- -0.662415777590172 + 0.749136394523459j,
- 0.945607325380521 + 0.325310292162263j,
- -0.945607325380521 - 0.325310292162263j,
- 0.325310292162263 - 0.945607325380521j,
- -0.325310292162263 + 0.945607325380521j,
- 0.898674465693954 - 0.438616238538528j,
- -0.898674465693954 + 0.438616238538528j,
- 0.438616238538528 + 0.898674465693954j,
- -0.438616238538528 - 0.898674465693954j,
- 0.990902635427780 + 0.134580708507126j,
- -0.990902635427780 - 0.134580708507126j,
- 0.134580708507126 - 0.990902635427780j,
- -0.134580708507126 + 0.990902635427780j,
- 0.795836904608884 - 0.605511041404325j,
- -0.795836904608884 + 0.605511041404325j,
- 0.605511041404326 + 0.795836904608883j,
- -0.605511041404326 - 0.795836904608883j,
- 0.966976471044852 - 0.254865659604515j,
- -0.966976471044852 + 0.254865659604515j,
- 0.254865659604515 + 0.966976471044852j,
- -0.254865659604515 - 0.966976471044852j,
- 0.863972856121587 + 0.503538383725718j,
- -0.863972856121587 - 0.503538383725718j,
- 0.503538383725718 - 0.863972856121587j,
- -0.503538383725718 + 0.863972856121587j]
-
-
-""" The roots of phi_1024 = x^512 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi1024_roots = [0.999981175282601 + 0.00613588464915448j,
- -0.999981175282601 - 0.00613588464915448j,
- 0.00613588464915448 - 0.999981175282601j,
- -0.00613588464915448 + 0.999981175282601j,
- 0.711432195745216 - 0.702754744457225j,
- -0.711432195745216 + 0.702754744457225j,
- 0.702754744457225 + 0.711432195745216j,
- -0.702754744457225 - 0.711432195745216j,
- 0.926210242138311 - 0.377007410216418j,
- -0.926210242138311 + 0.377007410216418j,
- 0.377007410216418 + 0.926210242138311j,
- -0.377007410216418 - 0.926210242138311j,
- 0.921514039342042 + 0.388345046698826j,
- -0.921514039342042 - 0.388345046698826j,
- 0.388345046698826 - 0.921514039342042j,
- -0.388345046698826 + 0.921514039342042j,
- 0.981963869109555 - 0.189068664149806j,
- -0.981963869109555 + 0.189068664149806j,
- 0.189068664149806 + 0.981963869109555j,
- -0.189068664149806 - 0.981963869109555j,
- 0.828045045257756 + 0.560661576197336j,
- -0.828045045257756 - 0.560661576197336j,
- 0.560661576197336 - 0.828045045257756j,
- -0.560661576197336 + 0.828045045257756j,
- 0.979569765685441 + 0.201104634842092j,
- -0.979569765685441 - 0.201104634842092j,
- 0.201104634842092 - 0.979569765685441j,
- -0.201104634842092 + 0.979569765685441j,
- 0.834862874986380 - 0.550457972936605j,
- -0.834862874986380 + 0.550457972936605j,
- 0.550457972936605 + 0.834862874986380j,
- -0.550457972936605 - 0.834862874986380j,
- 0.995767414467660 - 0.0919089564971327j,
- -0.995767414467660 + 0.0919089564971327j,
- 0.0919089564971327 + 0.995767414467660j,
- -0.0919089564971327 - 0.995767414467660j,
- 0.769103337645580 + 0.639124444863776j,
- -0.769103337645580 - 0.639124444863776j,
- 0.639124444863776 - 0.769103337645580j,
- -0.639124444863776 + 0.769103337645580j,
- 0.955141168305771 + 0.296150888243624j,
- -0.955141168305771 - 0.296150888243624j,
- 0.296150888243624 - 0.955141168305771j,
- -0.296150888243624 + 0.955141168305771j,
- 0.884797098430938 - 0.465976495767966j,
- -0.884797098430938 + 0.465976495767966j,
- 0.465976495767966 + 0.884797098430938j,
- -0.465976495767966 - 0.884797098430938j,
- 0.994564570734255 + 0.104121633872055j,
- -0.994564570734255 - 0.104121633872055j,
- 0.104121633872055 - 0.994564570734255j,
- -0.104121633872055 + 0.994564570734255j,
- 0.776888465673232 - 0.629638238914927j,
- -0.776888465673232 + 0.629638238914927j,
- 0.629638238914927 + 0.776888465673233j,
- -0.629638238914927 - 0.776888465673233j,
- 0.958703474895871 - 0.284407537211272j,
- -0.958703474895871 + 0.284407537211272j,
- 0.284407537211272 + 0.958703474895871j,
- -0.284407537211272 - 0.958703474895871j,
- 0.879012226428633 + 0.476799230063322j,
- -0.879012226428633 - 0.476799230063322j,
- 0.476799230063322 - 0.879012226428634j,
- -0.476799230063322 + 0.879012226428634j,
- 0.999077727752645 - 0.0429382569349408j,
- -0.999077727752645 + 0.0429382569349408j,
- 0.0429382569349408 + 0.999077727752645j,
- -0.0429382569349408 - 0.999077727752645j,
- 0.736816568877370 + 0.676092703575316j,
- -0.736816568877370 - 0.676092703575316j,
- 0.676092703575316 - 0.736816568877370j,
- -0.676092703575316 + 0.736816568877370j,
- 0.939459223602190 + 0.342660717311994j,
- -0.939459223602190 - 0.342660717311994j,
- 0.342660717311994 - 0.939459223602190j,
- -0.342660717311994 + 0.939459223602190j,
- 0.906595704514915 - 0.422000270799800j,
- -0.906595704514915 + 0.422000270799800j,
- 0.422000270799800 + 0.906595704514915j,
- -0.422000270799800 - 0.906595704514915j,
- 0.988257567730749 + 0.152797185258443j,
- -0.988257567730749 - 0.152797185258443j,
- 0.152797185258443 - 0.988257567730749j,
- -0.152797185258443 + 0.988257567730749j,
- 0.806847553543799 - 0.590759701858874j,
- -0.806847553543799 + 0.590759701858874j,
- 0.590759701858874 + 0.806847553543799j,
- -0.590759701858874 - 0.806847553543799j,
- 0.971503890986252 - 0.237023605994367j,
- -0.971503890986252 + 0.237023605994367j,
- 0.237023605994367 + 0.971503890986252j,
- -0.237023605994367 - 0.971503890986252j,
- 0.854557988365401 + 0.519355990165590j,
- -0.854557988365401 - 0.519355990165590j,
- 0.519355990165590 - 0.854557988365401j,
- -0.519355990165590 + 0.854557988365401j,
- 0.998475580573295 + 0.0551952443496899j,
- -0.998475580573295 - 0.0551952443496899j,
- 0.0551952443496899 - 0.998475580573295j,
- -0.0551952443496899 + 0.998475580573295j,
- 0.745057785441466 - 0.666999922303638j,
- -0.745057785441466 + 0.666999922303638j,
- 0.666999922303637 + 0.745057785441466j,
- -0.666999922303637 - 0.745057785441466j,
- 0.943593458161960 - 0.331106305759876j,
- -0.943593458161960 + 0.331106305759876j,
- 0.331106305759876 + 0.943593458161960j,
- -0.331106305759876 - 0.943593458161960j,
- 0.901348847046022 + 0.433093818853152j,
- -0.901348847046022 - 0.433093818853152j,
- 0.433093818853152 - 0.901348847046022j,
- -0.433093818853152 + 0.901348847046022j,
- 0.990058210262297 - 0.140658239332849j,
- -0.990058210262297 + 0.140658239332849j,
- 0.140658239332849 + 0.990058210262297j,
- -0.140658239332849 - 0.990058210262297j,
- 0.799537269107905 + 0.600616479383869j,
- -0.799537269107905 - 0.600616479383869j,
- 0.600616479383869 - 0.799537269107905j,
- -0.600616479383869 + 0.799537269107905j,
- 0.968522094274417 + 0.248927605745720j,
- -0.968522094274417 - 0.248927605745720j,
- 0.248927605745720 - 0.968522094274417j,
- -0.248927605745720 + 0.968522094274417j,
- 0.860866938637767 - 0.508830142543107j,
- -0.860866938637767 + 0.508830142543107j,
- 0.508830142543107 + 0.860866938637767j,
- -0.508830142543107 - 0.860866938637767j,
- 0.999830581795823 - 0.0184067299058048j,
- -0.999830581795823 + 0.0184067299058048j,
- 0.0184067299058048 + 0.999830581795823j,
- -0.0184067299058048 - 0.999830581795823j,
- 0.720002507961382 + 0.693971460889654j,
- -0.720002507961382 - 0.693971460889654j,
- 0.693971460889654 - 0.720002507961382j,
- -0.693971460889654 + 0.720002507961382j,
- 0.930766961078984 + 0.365612997804774j,
- -0.930766961078984 - 0.365612997804774j,
- 0.365612997804774 - 0.930766961078984j,
- -0.365612997804774 + 0.930766961078984j,
- 0.916679059921043 - 0.399624199845647j,
- -0.916679059921043 + 0.399624199845647j,
- 0.399624199845647 + 0.916679059921043j,
- -0.399624199845647 - 0.916679059921043j,
- 0.984210092386929 + 0.177004220412149j,
- -0.984210092386929 - 0.177004220412149j,
- 0.177004220412149 - 0.984210092386929j,
- -0.177004220412149 + 0.984210092386929j,
- 0.821102514991105 - 0.570780745886967j,
- -0.821102514991105 + 0.570780745886967j,
- 0.570780745886967 + 0.821102514991105j,
- -0.570780745886967 - 0.821102514991105j,
- 0.977028142657754 - 0.213110319916091j,
- -0.977028142657754 + 0.213110319916091j,
- 0.213110319916091 + 0.977028142657754j,
- -0.213110319916091 - 0.977028142657754j,
- 0.841554977436898 + 0.540171472729893j,
- -0.841554977436898 - 0.540171472729893j,
- 0.540171472729893 - 0.841554977436898j,
- -0.540171472729893 + 0.841554977436898j,
- 0.996820299291166 + 0.0796824379714301j,
- -0.996820299291166 - 0.0796824379714301j,
- 0.0796824379714301 - 0.996820299291166j,
- -0.0796824379714301 + 0.996820299291166j,
- 0.761202385484262 - 0.648514401022113j,
- -0.761202385484262 + 0.648514401022113j,
- 0.648514401022112 + 0.761202385484262j,
- -0.648514401022112 - 0.761202385484262j,
- 0.951435020969008 - 0.307849640041535j,
- -0.951435020969008 + 0.307849640041535j,
- 0.307849640041535 + 0.951435020969008j,
- -0.307849640041535 - 0.951435020969008j,
- 0.890448723244758 + 0.455083587126344j,
- -0.890448723244758 - 0.455083587126344j,
- 0.455083587126344 - 0.890448723244758j,
- -0.455083587126344 + 0.890448723244758j,
- 0.993211949234795 - 0.116318630911905j,
- -0.993211949234795 + 0.116318630911905j,
- 0.116318630911905 + 0.993211949234795j,
- -0.116318630911905 - 0.993211949234795j,
- 0.784556597155575 + 0.620057211763289j,
- -0.784556597155575 - 0.620057211763289j,
- 0.620057211763289 - 0.784556597155575j,
- -0.620057211763289 + 0.784556597155575j,
- 0.962121404269042 + 0.272621355449949j,
- -0.962121404269042 - 0.272621355449949j,
- 0.272621355449949 - 0.962121404269042j,
- -0.272621355449949 + 0.962121404269042j,
- 0.873094978418290 - 0.487550160148436j,
- -0.873094978418290 + 0.487550160148436j,
- 0.487550160148436 + 0.873094978418290j,
- -0.487550160148436 - 0.873094978418290j,
- 0.999529417501093 + 0.0306748031766366j,
- -0.999529417501093 - 0.0306748031766366j,
- 0.0306748031766366 - 0.999529417501093j,
- -0.0306748031766366 + 0.999529417501093j,
- 0.728464390448225 - 0.685083667772700j,
- -0.728464390448225 + 0.685083667772700j,
- 0.685083667772700 + 0.728464390448225j,
- -0.685083667772700 - 0.728464390448225j,
- 0.935183509938948 - 0.354163525420490j,
- -0.935183509938948 + 0.354163525420490j,
- 0.354163525420490 + 0.935183509938948j,
- -0.354163525420490 - 0.935183509938948j,
- 0.911706032005430 + 0.410843171057904j,
- -0.911706032005430 - 0.410843171057904j,
- 0.410843171057904 - 0.911706032005430j,
- -0.410843171057904 + 0.911706032005430j,
- 0.986308097244599 - 0.164913120489970j,
- -0.986308097244599 + 0.164913120489970j,
- 0.164913120489970 + 0.986308097244599j,
- -0.164913120489970 - 0.986308097244599j,
- 0.814036329705948 + 0.580813958095765j,
- -0.814036329705948 - 0.580813958095765j,
- 0.580813958095765 - 0.814036329705948j,
- -0.580813958095765 + 0.814036329705948j,
- 0.974339382785576 + 0.225083911359793j,
- -0.974339382785576 - 0.225083911359793j,
- 0.225083911359793 - 0.974339382785576j,
- -0.225083911359793 + 0.974339382785576j,
- 0.848120344803297 - 0.529803624686295j,
- -0.848120344803297 + 0.529803624686295j,
- 0.529803624686295 + 0.848120344803297j,
- -0.529803624686295 - 0.848120344803297j,
- 0.997723066644192 - 0.0674439195636641j,
- -0.997723066644192 + 0.0674439195636641j,
- 0.0674439195636641 + 0.997723066644192j,
- -0.0674439195636641 - 0.997723066644192j,
- 0.753186799043613 + 0.657806693297079j,
- -0.753186799043613 - 0.657806693297079j,
- 0.657806693297079 - 0.753186799043613j,
- -0.657806693297079 + 0.753186799043613j,
- 0.947585591017741 + 0.319502030816016j,
- -0.947585591017741 - 0.319502030816016j,
- 0.319502030816016 - 0.947585591017741j,
- -0.319502030816016 + 0.947585591017741j,
- 0.895966249756185 - 0.444122144570429j,
- -0.895966249756185 + 0.444122144570429j,
- 0.444122144570429 + 0.895966249756185j,
- -0.444122144570429 - 0.895966249756185j,
- 0.991709753669100 + 0.128498110793793j,
- -0.991709753669100 - 0.128498110793793j,
- 0.128498110793793 - 0.991709753669100j,
- -0.128498110793793 + 0.991709753669100j,
- 0.792106577300212 - 0.610382806276309j,
- -0.792106577300212 + 0.610382806276309j,
- 0.610382806276309 + 0.792106577300212j,
- -0.610382806276309 - 0.792106577300212j,
- 0.965394441697689 - 0.260794117915276j,
- -0.965394441697689 + 0.260794117915276j,
- 0.260794117915276 + 0.965394441697689j,
- -0.260794117915276 - 0.965394441697689j,
- 0.867046245515693 + 0.498227666972782j,
- -0.867046245515693 - 0.498227666972782j,
- 0.498227666972782 - 0.867046245515693j,
- -0.498227666972782 + 0.867046245515693j,
- 0.999981175282601 - 0.00613588464915448j,
- -0.999981175282601 + 0.00613588464915448j,
- 0.00613588464915448 + 0.999981175282601j,
- -0.00613588464915448 - 0.999981175282601j,
- 0.711432195745216 + 0.702754744457225j,
- -0.711432195745216 - 0.702754744457225j,
- 0.702754744457225 - 0.711432195745216j,
- -0.702754744457225 + 0.711432195745216j,
- 0.926210242138311 + 0.377007410216418j,
- -0.926210242138311 - 0.377007410216418j,
- 0.377007410216418 - 0.926210242138311j,
- -0.377007410216418 + 0.926210242138311j,
- 0.921514039342042 - 0.388345046698826j,
- -0.921514039342042 + 0.388345046698826j,
- 0.388345046698826 + 0.921514039342042j,
- -0.388345046698826 - 0.921514039342042j,
- 0.981963869109555 + 0.189068664149806j,
- -0.981963869109555 - 0.189068664149806j,
- 0.189068664149806 - 0.981963869109555j,
- -0.189068664149806 + 0.981963869109555j,
- 0.828045045257756 - 0.560661576197336j,
- -0.828045045257756 + 0.560661576197336j,
- 0.560661576197336 + 0.828045045257756j,
- -0.560661576197336 - 0.828045045257756j,
- 0.979569765685441 - 0.201104634842092j,
- -0.979569765685441 + 0.201104634842092j,
- 0.201104634842092 + 0.979569765685441j,
- -0.201104634842092 - 0.979569765685441j,
- 0.834862874986380 + 0.550457972936605j,
- -0.834862874986380 - 0.550457972936605j,
- 0.550457972936605 - 0.834862874986380j,
- -0.550457972936605 + 0.834862874986380j,
- 0.995767414467660 + 0.0919089564971327j,
- -0.995767414467660 - 0.0919089564971327j,
- 0.0919089564971327 - 0.995767414467660j,
- -0.0919089564971327 + 0.995767414467660j,
- 0.769103337645580 - 0.639124444863776j,
- -0.769103337645580 + 0.639124444863776j,
- 0.639124444863776 + 0.769103337645580j,
- -0.639124444863776 - 0.769103337645580j,
- 0.955141168305771 - 0.296150888243624j,
- -0.955141168305771 + 0.296150888243624j,
- 0.296150888243624 + 0.955141168305771j,
- -0.296150888243624 - 0.955141168305771j,
- 0.884797098430938 + 0.465976495767966j,
- -0.884797098430938 - 0.465976495767966j,
- 0.465976495767966 - 0.884797098430938j,
- -0.465976495767966 + 0.884797098430938j,
- 0.994564570734255 - 0.104121633872055j,
- -0.994564570734255 + 0.104121633872055j,
- 0.104121633872055 + 0.994564570734255j,
- -0.104121633872055 - 0.994564570734255j,
- 0.776888465673232 + 0.629638238914927j,
- -0.776888465673232 - 0.629638238914927j,
- 0.629638238914927 - 0.776888465673233j,
- -0.629638238914927 + 0.776888465673233j,
- 0.958703474895871 + 0.284407537211272j,
- -0.958703474895871 - 0.284407537211272j,
- 0.284407537211272 - 0.958703474895871j,
- -0.284407537211272 + 0.958703474895871j,
- 0.879012226428633 - 0.476799230063322j,
- -0.879012226428633 + 0.476799230063322j,
- 0.476799230063322 + 0.879012226428634j,
- -0.476799230063322 - 0.879012226428634j,
- 0.999077727752645 + 0.0429382569349408j,
- -0.999077727752645 - 0.0429382569349408j,
- 0.0429382569349408 - 0.999077727752645j,
- -0.0429382569349408 + 0.999077727752645j,
- 0.736816568877370 - 0.676092703575316j,
- -0.736816568877370 + 0.676092703575316j,
- 0.676092703575316 + 0.736816568877370j,
- -0.676092703575316 - 0.736816568877370j,
- 0.939459223602190 - 0.342660717311994j,
- -0.939459223602190 + 0.342660717311994j,
- 0.342660717311994 + 0.939459223602190j,
- -0.342660717311994 - 0.939459223602190j,
- 0.906595704514915 + 0.422000270799800j,
- -0.906595704514915 - 0.422000270799800j,
- 0.422000270799800 - 0.906595704514915j,
- -0.422000270799800 + 0.906595704514915j,
- 0.988257567730749 - 0.152797185258443j,
- -0.988257567730749 + 0.152797185258443j,
- 0.152797185258443 + 0.988257567730749j,
- -0.152797185258443 - 0.988257567730749j,
- 0.806847553543799 + 0.590759701858874j,
- -0.806847553543799 - 0.590759701858874j,
- 0.590759701858874 - 0.806847553543799j,
- -0.590759701858874 + 0.806847553543799j,
- 0.971503890986252 + 0.237023605994367j,
- -0.971503890986252 - 0.237023605994367j,
- 0.237023605994367 - 0.971503890986252j,
- -0.237023605994367 + 0.971503890986252j,
- 0.854557988365401 - 0.519355990165590j,
- -0.854557988365401 + 0.519355990165590j,
- 0.519355990165590 + 0.854557988365401j,
- -0.519355990165590 - 0.854557988365401j,
- 0.998475580573295 - 0.0551952443496899j,
- -0.998475580573295 + 0.0551952443496899j,
- 0.0551952443496899 + 0.998475580573295j,
- -0.0551952443496899 - 0.998475580573295j,
- 0.745057785441466 + 0.666999922303638j,
- -0.745057785441466 - 0.666999922303638j,
- 0.666999922303637 - 0.745057785441466j,
- -0.666999922303637 + 0.745057785441466j,
- 0.943593458161960 + 0.331106305759876j,
- -0.943593458161960 - 0.331106305759876j,
- 0.331106305759876 - 0.943593458161960j,
- -0.331106305759876 + 0.943593458161960j,
- 0.901348847046022 - 0.433093818853152j,
- -0.901348847046022 + 0.433093818853152j,
- 0.433093818853152 + 0.901348847046022j,
- -0.433093818853152 - 0.901348847046022j,
- 0.990058210262297 + 0.140658239332849j,
- -0.990058210262297 - 0.140658239332849j,
- 0.140658239332849 - 0.990058210262297j,
- -0.140658239332849 + 0.990058210262297j,
- 0.799537269107905 - 0.600616479383869j,
- -0.799537269107905 + 0.600616479383869j,
- 0.600616479383869 + 0.799537269107905j,
- -0.600616479383869 - 0.799537269107905j,
- 0.968522094274417 - 0.248927605745720j,
- -0.968522094274417 + 0.248927605745720j,
- 0.248927605745720 + 0.968522094274417j,
- -0.248927605745720 - 0.968522094274417j,
- 0.860866938637767 + 0.508830142543107j,
- -0.860866938637767 - 0.508830142543107j,
- 0.508830142543107 - 0.860866938637767j,
- -0.508830142543107 + 0.860866938637767j,
- 0.999830581795823 + 0.0184067299058048j,
- -0.999830581795823 - 0.0184067299058048j,
- 0.0184067299058048 - 0.999830581795823j,
- -0.0184067299058048 + 0.999830581795823j,
- 0.720002507961382 - 0.693971460889654j,
- -0.720002507961382 + 0.693971460889654j,
- 0.693971460889654 + 0.720002507961382j,
- -0.693971460889654 - 0.720002507961382j,
- 0.930766961078984 - 0.365612997804774j,
- -0.930766961078984 + 0.365612997804774j,
- 0.365612997804774 + 0.930766961078984j,
- -0.365612997804774 - 0.930766961078984j,
- 0.916679059921043 + 0.399624199845647j,
- -0.916679059921043 - 0.399624199845647j,
- 0.399624199845647 - 0.916679059921043j,
- -0.399624199845647 + 0.916679059921043j,
- 0.984210092386929 - 0.177004220412149j,
- -0.984210092386929 + 0.177004220412149j,
- 0.177004220412149 + 0.984210092386929j,
- -0.177004220412149 - 0.984210092386929j,
- 0.821102514991105 + 0.570780745886967j,
- -0.821102514991105 - 0.570780745886967j,
- 0.570780745886967 - 0.821102514991105j,
- -0.570780745886967 + 0.821102514991105j,
- 0.977028142657754 + 0.213110319916091j,
- -0.977028142657754 - 0.213110319916091j,
- 0.213110319916091 - 0.977028142657754j,
- -0.213110319916091 + 0.977028142657754j,
- 0.841554977436898 - 0.540171472729893j,
- -0.841554977436898 + 0.540171472729893j,
- 0.540171472729893 + 0.841554977436898j,
- -0.540171472729893 - 0.841554977436898j,
- 0.996820299291166 - 0.0796824379714301j,
- -0.996820299291166 + 0.0796824379714301j,
- 0.0796824379714301 + 0.996820299291166j,
- -0.0796824379714301 - 0.996820299291166j,
- 0.761202385484262 + 0.648514401022113j,
- -0.761202385484262 - 0.648514401022113j,
- 0.648514401022112 - 0.761202385484262j,
- -0.648514401022112 + 0.761202385484262j,
- 0.951435020969008 + 0.307849640041535j,
- -0.951435020969008 - 0.307849640041535j,
- 0.307849640041535 - 0.951435020969008j,
- -0.307849640041535 + 0.951435020969008j,
- 0.890448723244758 - 0.455083587126344j,
- -0.890448723244758 + 0.455083587126344j,
- 0.455083587126344 + 0.890448723244758j,
- -0.455083587126344 - 0.890448723244758j,
- 0.993211949234795 + 0.116318630911905j,
- -0.993211949234795 - 0.116318630911905j,
- 0.116318630911905 - 0.993211949234795j,
- -0.116318630911905 + 0.993211949234795j,
- 0.784556597155575 - 0.620057211763289j,
- -0.784556597155575 + 0.620057211763289j,
- 0.620057211763289 + 0.784556597155575j,
- -0.620057211763289 - 0.784556597155575j,
- 0.962121404269042 - 0.272621355449949j,
- -0.962121404269042 + 0.272621355449949j,
- 0.272621355449949 + 0.962121404269042j,
- -0.272621355449949 - 0.962121404269042j,
- 0.873094978418290 + 0.487550160148436j,
- -0.873094978418290 - 0.487550160148436j,
- 0.487550160148436 - 0.873094978418290j,
- -0.487550160148436 + 0.873094978418290j,
- 0.999529417501093 - 0.0306748031766366j,
- -0.999529417501093 + 0.0306748031766366j,
- 0.0306748031766366 + 0.999529417501093j,
- -0.0306748031766366 - 0.999529417501093j,
- 0.728464390448225 + 0.685083667772700j,
- -0.728464390448225 - 0.685083667772700j,
- 0.685083667772700 - 0.728464390448225j,
- -0.685083667772700 + 0.728464390448225j,
- 0.935183509938948 + 0.354163525420490j,
- -0.935183509938948 - 0.354163525420490j,
- 0.354163525420490 - 0.935183509938948j,
- -0.354163525420490 + 0.935183509938948j,
- 0.911706032005430 - 0.410843171057904j,
- -0.911706032005430 + 0.410843171057904j,
- 0.410843171057904 + 0.911706032005430j,
- -0.410843171057904 - 0.911706032005430j,
- 0.986308097244599 + 0.164913120489970j,
- -0.986308097244599 - 0.164913120489970j,
- 0.164913120489970 - 0.986308097244599j,
- -0.164913120489970 + 0.986308097244599j,
- 0.814036329705948 - 0.580813958095765j,
- -0.814036329705948 + 0.580813958095765j,
- 0.580813958095765 + 0.814036329705948j,
- -0.580813958095765 - 0.814036329705948j,
- 0.974339382785576 - 0.225083911359793j,
- -0.974339382785576 + 0.225083911359793j,
- 0.225083911359793 + 0.974339382785576j,
- -0.225083911359793 - 0.974339382785576j,
- 0.848120344803297 + 0.529803624686295j,
- -0.848120344803297 - 0.529803624686295j,
- 0.529803624686295 - 0.848120344803297j,
- -0.529803624686295 + 0.848120344803297j,
- 0.997723066644192 + 0.0674439195636641j,
- -0.997723066644192 - 0.0674439195636641j,
- 0.0674439195636641 - 0.997723066644192j,
- -0.0674439195636641 + 0.997723066644192j,
- 0.753186799043613 - 0.657806693297079j,
- -0.753186799043613 + 0.657806693297079j,
- 0.657806693297079 + 0.753186799043613j,
- -0.657806693297079 - 0.753186799043613j,
- 0.947585591017741 - 0.319502030816016j,
- -0.947585591017741 + 0.319502030816016j,
- 0.319502030816016 + 0.947585591017741j,
- -0.319502030816016 - 0.947585591017741j,
- 0.895966249756185 + 0.444122144570429j,
- -0.895966249756185 - 0.444122144570429j,
- 0.444122144570429 - 0.895966249756185j,
- -0.444122144570429 + 0.895966249756185j,
- 0.991709753669100 - 0.128498110793793j,
- -0.991709753669100 + 0.128498110793793j,
- 0.128498110793793 + 0.991709753669100j,
- -0.128498110793793 - 0.991709753669100j,
- 0.792106577300212 + 0.610382806276309j,
- -0.792106577300212 - 0.610382806276309j,
- 0.610382806276309 - 0.792106577300212j,
- -0.610382806276309 + 0.792106577300212j,
- 0.965394441697689 + 0.260794117915276j,
- -0.965394441697689 - 0.260794117915276j,
- 0.260794117915276 - 0.965394441697689j,
- -0.260794117915276 + 0.965394441697689j,
- 0.867046245515693 - 0.498227666972782j,
- -0.867046245515693 + 0.498227666972782j,
- 0.498227666972782 + 0.867046245515693j,
- -0.498227666972782 - 0.867046245515693j]
-
-
-""" The roots of phi_2048 = x^1024 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi2048_roots = [0.999995293809576 + 0.00306795676296598j,
- -0.999995293809576 - 0.00306795676296598j,
- 0.00306795676296598 - 0.999995293809576j,
- -0.00306795676296598 + 0.999995293809576j,
- 0.709272826438866 - 0.704934080375905j,
- -0.709272826438866 + 0.704934080375905j,
- 0.704934080375905 + 0.709272826438866j,
- -0.704934080375905 - 0.709272826438866j,
- 0.925049240782678 - 0.379847208924051j,
- -0.925049240782678 + 0.379847208924051j,
- 0.379847208924051 + 0.925049240782678j,
- -0.379847208924051 - 0.925049240782678j,
- 0.922701128333879 + 0.385516053843919j,
- -0.922701128333879 - 0.385516053843919j,
- 0.385516053843919 - 0.922701128333879j,
- -0.385516053843919 + 0.922701128333879j,
- 0.981379193313755 - 0.192080397049892j,
- -0.981379193313755 + 0.192080397049892j,
- 0.192080397049892 + 0.981379193313755j,
- -0.192080397049892 - 0.981379193313755j,
- 0.829761233794523 + 0.558118531220556j,
- -0.829761233794523 - 0.558118531220556j,
- 0.558118531220556 - 0.829761233794523j,
- -0.558118531220556 + 0.829761233794523j,
- 0.980182135968117 + 0.198098410717954j,
- -0.980182135968117 - 0.198098410717954j,
- 0.198098410717954 - 0.980182135968117j,
- -0.198098410717954 + 0.980182135968117j,
- 0.833170164701913 - 0.553016705580028j,
- -0.833170164701913 + 0.553016705580028j,
- 0.553016705580028 + 0.833170164701913j,
- -0.553016705580028 - 0.833170164701913j,
- 0.995480755491927 - 0.0949634953296390j,
- -0.995480755491927 + 0.0949634953296390j,
- 0.0949634953296390 + 0.995480755491927j,
- -0.0949634953296390 - 0.995480755491927j,
- 0.771060524261814 + 0.636761861236284j,
- -0.771060524261814 - 0.636761861236284j,
- 0.636761861236284 - 0.771060524261814j,
- -0.636761861236284 + 0.771060524261814j,
- 0.956045251349996 + 0.293219162694259j,
- -0.956045251349996 - 0.293219162694259j,
- 0.293219162694259 - 0.956045251349996j,
- -0.293219162694259 + 0.956045251349996j,
- 0.883363338665732 - 0.468688822035828j,
- -0.883363338665732 + 0.468688822035828j,
- 0.468688822035828 + 0.883363338665732j,
- -0.468688822035828 - 0.883363338665732j,
- 0.994879330794806 + 0.101069862754828j,
- -0.994879330794806 - 0.101069862754828j,
- 0.101069862754828 - 0.994879330794806j,
- -0.101069862754828 + 0.994879330794806j,
- 0.774953106594874 - 0.632018735939809j,
- -0.774953106594874 + 0.632018735939809j,
- 0.632018735939809 + 0.774953106594874j,
- -0.632018735939809 - 0.774953106594874j,
- 0.957826413027533 - 0.287347459544730j,
- -0.957826413027533 + 0.287347459544730j,
- 0.287347459544730 + 0.957826413027533j,
- -0.287347459544730 - 0.957826413027533j,
- 0.880470889052161 + 0.474100214650550j,
- -0.880470889052161 - 0.474100214650550j,
- 0.474100214650550 - 0.880470889052161j,
- -0.474100214650550 + 0.880470889052161j,
- 0.998941293186857 - 0.0460031821309146j,
- -0.998941293186857 + 0.0460031821309146j,
- 0.0460031821309146 + 0.998941293186857j,
- -0.0460031821309146 - 0.998941293186857j,
- 0.738887324460615 + 0.673829000378756j,
- -0.738887324460615 - 0.673829000378756j,
- 0.673829000378756 - 0.738887324460615j,
- -0.673829000378756 + 0.738887324460615j,
- 0.940506070593268 + 0.339776884406827j,
- -0.940506070593268 - 0.339776884406827j,
- 0.339776884406827 - 0.940506070593268j,
- -0.339776884406827 + 0.940506070593268j,
- 0.905296759318119 - 0.424779681209109j,
- -0.905296759318119 + 0.424779681209109j,
- 0.424779681209109 + 0.905296759318119j,
- -0.424779681209109 - 0.905296759318119j,
- 0.988721691960324 + 0.149764534677322j,
- -0.988721691960324 - 0.149764534677322j,
- 0.149764534677322 - 0.988721691960324j,
- -0.149764534677322 + 0.988721691960324j,
- 0.805031331142964 - 0.593232295039800j,
- -0.805031331142964 + 0.593232295039800j,
- 0.593232295039800 + 0.805031331142964j,
- -0.593232295039800 - 0.805031331142964j,
- 0.970772140728950 - 0.240003022448741j,
- -0.970772140728950 + 0.240003022448741j,
- 0.240003022448741 + 0.970772140728950j,
- -0.240003022448741 - 0.970772140728950j,
- 0.856147328375194 + 0.516731799017650j,
- -0.856147328375194 - 0.516731799017650j,
- 0.516731799017650 - 0.856147328375194j,
- -0.516731799017650 + 0.856147328375194j,
- 0.998640218180265 + 0.0521317046802833j,
- -0.998640218180265 - 0.0521317046802833j,
- 0.0521317046802833 - 0.998640218180265j,
- -0.0521317046802833 + 0.998640218180265j,
- 0.743007952135122 - 0.669282588346636j,
- -0.743007952135122 + 0.669282588346636j,
- 0.669282588346636 + 0.743007952135122j,
- -0.669282588346636 - 0.743007952135122j,
- 0.942573197601447 - 0.333999651442009j,
- -0.942573197601447 + 0.333999651442009j,
- 0.333999651442009 + 0.942573197601447j,
- -0.333999651442009 - 0.942573197601447j,
- 0.902673318237259 + 0.430326481340083j,
- -0.902673318237259 - 0.430326481340083j,
- 0.430326481340083 - 0.902673318237259j,
- -0.430326481340083 + 0.902673318237259j,
- 0.989622017463201 - 0.143695033150294j,
- -0.989622017463201 + 0.143695033150294j,
- 0.143695033150294 + 0.989622017463201j,
- -0.143695033150294 - 0.989622017463201j,
- 0.801376171723140 + 0.598160706996342j,
- -0.801376171723140 - 0.598160706996342j,
- 0.598160706996342 - 0.801376171723140j,
- -0.598160706996342 + 0.801376171723140j,
- 0.969281235356549 + 0.245955050335795j,
- -0.969281235356549 - 0.245955050335795j,
- 0.245955050335795 - 0.969281235356549j,
- -0.245955050335795 + 0.969281235356549j,
- 0.859301818357008 - 0.511468850437970j,
- -0.859301818357008 + 0.511468850437970j,
- 0.511468850437970 + 0.859301818357008j,
- -0.511468850437970 - 0.859301818357008j,
- 0.999769405351215 - 0.0214740802754695j,
- -0.999769405351215 + 0.0214740802754695j,
- 0.0214740802754695 + 0.999769405351215j,
- -0.0214740802754695 - 0.999769405351215j,
- 0.722128193929215 + 0.691759258364158j,
- -0.722128193929215 - 0.691759258364158j,
- 0.691759258364158 - 0.722128193929215j,
- -0.691759258364158 + 0.722128193929215j,
- 0.931884265581668 + 0.362755724367397j,
- -0.931884265581668 - 0.362755724367397j,
- 0.362755724367397 - 0.931884265581668j,
- -0.362755724367397 + 0.931884265581668j,
- 0.915448716088268 - 0.402434650859418j,
- -0.915448716088268 + 0.402434650859418j,
- 0.402434650859418 + 0.915448716088268j,
- -0.402434650859418 - 0.915448716088268j,
- 0.984748501801904 + 0.173983873387464j,
- -0.984748501801904 - 0.173983873387464j,
- 0.173983873387464 - 0.984748501801904j,
- -0.173983873387464 + 0.984748501801904j,
- 0.819347520076797 - 0.573297166698042j,
- -0.819347520076797 + 0.573297166698042j,
- 0.573297166698042 + 0.819347520076797j,
- -0.573297166698042 - 0.819347520076797j,
- 0.976369731330021 - 0.216106797076220j,
- -0.976369731330021 + 0.216106797076220j,
- 0.216106797076220 + 0.976369731330021j,
- -0.216106797076220 - 0.976369731330021j,
- 0.843208239641845 + 0.537587076295646j,
- -0.843208239641845 - 0.537587076295646j,
- 0.537587076295646 - 0.843208239641845j,
- -0.537587076295646 + 0.843208239641845j,
- 0.997060070339483 + 0.0766238613920315j,
- -0.997060070339483 - 0.0766238613920315j,
- 0.0766238613920315 - 0.997060070339483j,
- -0.0766238613920315 + 0.997060070339483j,
- 0.759209188978388 - 0.650846684996381j,
- -0.759209188978388 + 0.650846684996381j,
- 0.650846684996381 + 0.759209188978388j,
- -0.650846684996381 - 0.759209188978388j,
- 0.950486073949482 - 0.310767152749612j,
- -0.950486073949482 + 0.310767152749612j,
- 0.310767152749612 + 0.950486073949482j,
- -0.310767152749612 - 0.950486073949482j,
- 0.891840709392343 + 0.452349587233771j,
- -0.891840709392343 - 0.452349587233771j,
- 0.452349587233771 - 0.891840709392343j,
- -0.452349587233771 + 0.891840709392343j,
- 0.992850414459865 - 0.119365214810991j,
- -0.992850414459865 + 0.119365214810991j,
- 0.119365214810991 + 0.992850414459865j,
- -0.119365214810991 - 0.992850414459865j,
- 0.786455213599086 + 0.617647307937804j,
- -0.786455213599086 - 0.617647307937804j,
- 0.617647307937804 - 0.786455213599086j,
- -0.617647307937804 + 0.786455213599086j,
- 0.962953266873684 + 0.269668325572915j,
- -0.962953266873684 - 0.269668325572915j,
- 0.269668325572915 - 0.962953266873684j,
- -0.269668325572915 + 0.962953266873684j,
- 0.871595086655951 - 0.490226483288291j,
- -0.871595086655951 + 0.490226483288291j,
- 0.490226483288291 + 0.871595086655951j,
- -0.490226483288291 - 0.871595086655951j,
- 0.999618822495179 + 0.0276081457789657j,
- -0.999618822495179 - 0.0276081457789657j,
- 0.0276081457789657 - 0.999618822495179j,
- -0.0276081457789657 + 0.999618822495179j,
- 0.726359155084346 - 0.687315340891759j,
- -0.726359155084346 + 0.687315340891759j,
- 0.687315340891759 + 0.726359155084346j,
- -0.687315340891759 - 0.726359155084346j,
- 0.934092550404259 - 0.357030961233430j,
- -0.934092550404259 + 0.357030961233430j,
- 0.357030961233430 + 0.934092550404259j,
- -0.357030961233430 - 0.934092550404259j,
- 0.912962190428398 + 0.408044162864979j,
- -0.912962190428398 - 0.408044162864979j,
- 0.408044162864979 - 0.912962190428398j,
- -0.408044162864979 + 0.912962190428398j,
- 0.985797509167567 - 0.167938294974731j,
- -0.985797509167567 + 0.167938294974731j,
- 0.167938294974731 + 0.985797509167567j,
- -0.167938294974731 - 0.985797509167567j,
- 0.815814410806734 + 0.578313796411656j,
- -0.815814410806734 - 0.578313796411656j,
- 0.578313796411656 - 0.815814410806734j,
- -0.578313796411656 + 0.815814410806734j,
- 0.975025345066994 + 0.222093620973204j,
- -0.975025345066994 - 0.222093620973204j,
- 0.222093620973204 - 0.975025345066994j,
- -0.222093620973204 + 0.975025345066994j,
- 0.846490938774052 - 0.532403127877198j,
- -0.846490938774052 + 0.532403127877198j,
- 0.532403127877198 + 0.846490938774052j,
- -0.532403127877198 - 0.846490938774052j,
- 0.997511456140303 - 0.0705045733896139j,
- -0.997511456140303 + 0.0705045733896139j,
- 0.0705045733896139 + 0.997511456140303j,
- -0.0705045733896139 - 0.997511456140303j,
- 0.755201376896537 + 0.655492852999615j,
- -0.755201376896537 - 0.655492852999615j,
- 0.655492852999615 - 0.755201376896537j,
- -0.655492852999615 + 0.755201376896537j,
- 0.948561349915730 + 0.316593375556166j,
- -0.948561349915730 - 0.316593375556166j,
- 0.316593375556166 - 0.948561349915730j,
- -0.316593375556166 + 0.948561349915730j,
- 0.894599485631383 - 0.446868840162374j,
- -0.894599485631383 + 0.446868840162374j,
- 0.446868840162374 + 0.894599485631383j,
- -0.446868840162374 - 0.894599485631383j,
- 0.992099313142192 + 0.125454983411546j,
- -0.992099313142192 - 0.125454983411546j,
- 0.125454983411546 - 0.992099313142192j,
- -0.125454983411546 + 0.992099313142192j,
- 0.790230221437310 - 0.612810082429410j,
- -0.790230221437310 + 0.612810082429410j,
- 0.612810082429410 + 0.790230221437310j,
- -0.612810082429410 - 0.790230221437310j,
- 0.964589793289813 - 0.263754678974831j,
- -0.964589793289813 + 0.263754678974831j,
- 0.263754678974831 + 0.964589793289813j,
- -0.263754678974831 - 0.964589793289813j,
- 0.868570705971341 + 0.495565261825772j,
- -0.868570705971341 - 0.495565261825772j,
- 0.495565261825772 - 0.868570705971341j,
- -0.495565261825772 + 0.868570705971341j,
- 0.999957644551964 - 0.00920375478205982j,
- -0.999957644551964 + 0.00920375478205982j,
- 0.00920375478205982 + 0.999957644551964j,
- -0.00920375478205982 - 0.999957644551964j,
- 0.713584868780794 + 0.700568793943248j,
- -0.713584868780794 - 0.700568793943248j,
- 0.700568793943248 - 0.713584868780794j,
- -0.700568793943248 + 0.713584868780794j,
- 0.927362525650401 + 0.374164062971458j,
- -0.927362525650401 - 0.374164062971458j,
- 0.374164062971458 - 0.927362525650401j,
- -0.374164062971458 + 0.927362525650401j,
- 0.920318276709110 - 0.391170384302254j,
- -0.920318276709110 + 0.391170384302254j,
- 0.391170384302254 + 0.920318276709111j,
- -0.391170384302254 - 0.920318276709111j,
- 0.982539302287441 + 0.186055151663447j,
- -0.982539302287441 - 0.186055151663447j,
- 0.186055151663447 - 0.982539302287441j,
- -0.186055151663447 + 0.982539302287441j,
- 0.826321062845664 - 0.563199344013834j,
- -0.826321062845664 + 0.563199344013834j,
- 0.563199344013834 + 0.826321062845664j,
- -0.563199344013834 - 0.826321062845664j,
- 0.978948175319062 - 0.204108966092817j,
- -0.978948175319062 + 0.204108966092817j,
- 0.204108966092817 + 0.978948175319062j,
- -0.204108966092817 - 0.978948175319062j,
- 0.836547727223512 + 0.547894059173100j,
- -0.836547727223512 - 0.547894059173100j,
- 0.547894059173100 - 0.836547727223512j,
- -0.547894059173100 + 0.836547727223512j,
- 0.996044700901252 + 0.0888535525825246j,
- -0.996044700901252 - 0.0888535525825246j,
- 0.0888535525825246 - 0.996044700901252j,
- -0.0888535525825246 + 0.996044700901252j,
- 0.767138911935820 - 0.641481012808583j,
- -0.767138911935820 + 0.641481012808583j,
- 0.641481012808583 + 0.767138911935820j,
- -0.641481012808583 - 0.767138911935820j,
- 0.954228095109106 - 0.299079826308040j,
- -0.954228095109106 + 0.299079826308040j,
- 0.299079826308040 + 0.954228095109106j,
- -0.299079826308040 - 0.954228095109106j,
- 0.886222530148881 + 0.463259783551860j,
- -0.886222530148881 - 0.463259783551860j,
- 0.463259783551860 - 0.886222530148881j,
- -0.463259783551860 + 0.886222530148881j,
- 0.994240449453188 - 0.107172424956809j,
- -0.994240449453188 + 0.107172424956809j,
- 0.107172424956809 + 0.994240449453188j,
- -0.107172424956809 - 0.994240449453188j,
- 0.778816512381476 + 0.627251815495144j,
- -0.778816512381476 - 0.627251815495144j,
- 0.627251815495144 - 0.778816512381476j,
- -0.627251815495144 + 0.778816512381476j,
- 0.959571513081985 + 0.281464937925758j,
- -0.959571513081985 - 0.281464937925758j,
- 0.281464937925758 - 0.959571513081985j,
- -0.281464937925758 + 0.959571513081985j,
- 0.877545290207261 - 0.479493757660153j,
- -0.877545290207261 + 0.479493757660153j,
- 0.479493757660153 + 0.877545290207261j,
- -0.479493757660153 - 0.877545290207261j,
- 0.999204758618364 + 0.0398729275877398j,
- -0.999204758618364 - 0.0398729275877398j,
- 0.0398729275877398 - 0.999204758618364j,
- -0.0398729275877398 + 0.999204758618364j,
- 0.734738878095963 - 0.678350043129862j,
- -0.734738878095963 + 0.678350043129862j,
- 0.678350043129861 + 0.734738878095963j,
- -0.678350043129861 - 0.734738878095963j,
- 0.938403534063108 - 0.345541324963989j,
- -0.938403534063108 + 0.345541324963989j,
- 0.345541324963989 + 0.938403534063108j,
- -0.345541324963989 - 0.938403534063108j,
- 0.907886116487666 + 0.419216888363224j,
- -0.907886116487666 - 0.419216888363224j,
- 0.419216888363224 - 0.907886116487666j,
- -0.419216888363224 + 0.907886116487666j,
- 0.987784141644572 - 0.155828397654265j,
- -0.987784141644572 + 0.155828397654265j,
- 0.155828397654265 + 0.987784141644572j,
- -0.155828397654265 - 0.987784141644572j,
- 0.808656181588175 + 0.588281548222645j,
- -0.808656181588175 - 0.588281548222645j,
- 0.588281548222645 - 0.808656181588175j,
- -0.588281548222645 + 0.808656181588175j,
- 0.972226497078936 + 0.234041958583543j,
- -0.972226497078936 - 0.234041958583543j,
- 0.234041958583543 - 0.972226497078936j,
- -0.234041958583543 + 0.972226497078936j,
- 0.852960604930364 - 0.521975292937154j,
- -0.852960604930364 + 0.521975292937154j,
- 0.521975292937154 + 0.852960604930364j,
- -0.521975292937154 - 0.852960604930364j,
- 0.998301544933893 - 0.0582582645004358j,
- -0.998301544933893 + 0.0582582645004358j,
- 0.0582582645004358 + 0.998301544933893j,
- -0.0582582645004358 - 0.998301544933893j,
- 0.747100605980180 + 0.664710978203345j,
- -0.747100605980180 - 0.664710978203345j,
- 0.664710978203345 - 0.747100605980180j,
- -0.664710978203345 + 0.747100605980180j,
- 0.944604837261480 + 0.328209843579092j,
- -0.944604837261480 - 0.328209843579092j,
- 0.328209843579092 - 0.944604837261480j,
- -0.328209843579092 + 0.944604837261480j,
- 0.900015892016160 - 0.435857079922255j,
- -0.900015892016160 + 0.435857079922255j,
- 0.435857079922256 + 0.900015892016160j,
- -0.435857079922256 - 0.900015892016160j,
- 0.990485084256457 + 0.137620121586486j,
- -0.990485084256457 - 0.137620121586486j,
- 0.137620121586486 - 0.990485084256457j,
- -0.137620121586486 + 0.990485084256457j,
- 0.797690840943391 - 0.603066598540348j,
- -0.797690840943391 + 0.603066598540348j,
- 0.603066598540348 + 0.797690840943391j,
- -0.603066598540348 - 0.797690840943391j,
- 0.967753837093475 - 0.251897818154217j,
- -0.967753837093475 + 0.251897818154217j,
- 0.251897818154217 + 0.967753837093475j,
- -0.251897818154217 - 0.967753837093475j,
- 0.862423956111041 + 0.506186645345155j,
- -0.862423956111041 - 0.506186645345155j,
- 0.506186645345155 - 0.862423956111041j,
- -0.506186645345155 + 0.862423956111041j,
- 0.999882347454213 + 0.0153392062849881j,
- -0.999882347454213 - 0.0153392062849881j,
- 0.0153392062849881 - 0.999882347454213j,
- -0.0153392062849881 + 0.999882347454213j,
- 0.717870045055732 - 0.696177131491463j,
- -0.717870045055732 + 0.696177131491463j,
- 0.696177131491463 + 0.717870045055732j,
- -0.696177131491463 - 0.717870045055732j,
- 0.929640895843181 - 0.368466829953372j,
- -0.929640895843181 + 0.368466829953372j,
- 0.368466829953372 + 0.929640895843181j,
- -0.368466829953372 - 0.929640895843181j,
- 0.917900775621390 + 0.396809987416710j,
- -0.917900775621390 - 0.396809987416710j,
- 0.396809987416710 - 0.917900775621390j,
- -0.396809987416710 + 0.917900775621390j,
- 0.983662419211730 - 0.180022901405700j,
- -0.983662419211730 + 0.180022901405700j,
- 0.180022901405700 + 0.983662419211730j,
- -0.180022901405700 - 0.983662419211730j,
- 0.822849781375826 + 0.568258952670132j,
- -0.822849781375826 - 0.568258952670132j,
- 0.568258952670132 - 0.822849781375826j,
- -0.568258952670132 + 0.822849781375826j,
- 0.977677357824510 + 0.210111836880470j,
- -0.977677357824510 - 0.210111836880470j,
- 0.210111836880470 - 0.977677357824510j,
- -0.210111836880470 + 0.977677357824510j,
- 0.839893794196000 - 0.542750784864516j,
- -0.839893794196000 + 0.542750784864516j,
- 0.542750784864516 + 0.839893794196000j,
- -0.542750784864516 - 0.839893794196000j,
- 0.996571145790555 - 0.0827402645493757j,
- -0.996571145790555 + 0.0827402645493757j,
- 0.0827402645493757 + 0.996571145790555j,
- -0.0827402645493757 - 0.996571145790555j,
- 0.763188417263381 + 0.646176012983316j,
- -0.763188417263381 - 0.646176012983316j,
- 0.646176012983316 - 0.763188417263381j,
- -0.646176012983316 + 0.763188417263381j,
- 0.952375012719766 + 0.304929229735402j,
- -0.952375012719766 - 0.304929229735402j,
- 0.304929229735402 - 0.952375012719766j,
- -0.304929229735402 + 0.952375012719766j,
- 0.889048355854665 - 0.457813303598877j,
- -0.889048355854665 + 0.457813303598877j,
- 0.457813303598877 + 0.889048355854665j,
- -0.457813303598877 - 0.889048355854665j,
- 0.993564135520595 + 0.113270952177564j,
- -0.993564135520595 - 0.113270952177564j,
- 0.113270952177564 - 0.993564135520595j,
- -0.113270952177564 + 0.993564135520595j,
- 0.782650596166576 - 0.622461279374150j,
- -0.782650596166576 + 0.622461279374150j,
- 0.622461279374150 + 0.782650596166576j,
- -0.622461279374150 - 0.782650596166576j,
- 0.961280485811321 - 0.275571819310958j,
- -0.961280485811321 + 0.275571819310958j,
- 0.275571819310958 + 0.961280485811321j,
- -0.275571819310958 - 0.961280485811321j,
- 0.874586652278176 + 0.484869248000791j,
- -0.874586652278176 - 0.484869248000791j,
- 0.484869248000791 - 0.874586652278176j,
- -0.484869248000791 + 0.874586652278176j,
- 0.999430604555462 - 0.0337411718513776j,
- -0.999430604555462 + 0.0337411718513776j,
- 0.0337411718513776 + 0.999430604555462j,
- -0.0337411718513776 - 0.999430604555462j,
- 0.730562769227828 + 0.682845546385248j,
- -0.730562769227828 - 0.682845546385248j,
- 0.682845546385248 - 0.730562769227828j,
- -0.682845546385248 + 0.730562769227828j,
- 0.936265667170278 + 0.351292756085567j,
- -0.936265667170278 - 0.351292756085567j,
- 0.351292756085567 - 0.936265667170278j,
- -0.351292756085567 + 0.936265667170278j,
- 0.910441292258067 - 0.413638312238435j,
- -0.910441292258067 + 0.413638312238435j,
- 0.413638312238435 + 0.910441292258067j,
- -0.413638312238435 - 0.910441292258067j,
- 0.986809401814185 + 0.161886393780112j,
- -0.986809401814185 - 0.161886393780112j,
- 0.161886393780112 - 0.986809401814185j,
- -0.161886393780112 + 0.986809401814185j,
- 0.812250586585204 - 0.583308652937698j,
- -0.812250586585204 + 0.583308652937698j,
- 0.583308652937698 + 0.812250586585204j,
- -0.583308652937698 - 0.812250586585204j,
- 0.973644249650812 - 0.228072083170886j,
- -0.973644249650812 + 0.228072083170886j,
- 0.228072083170886 + 0.973644249650812j,
- -0.228072083170886 - 0.973644249650812j,
- 0.849741768000852 + 0.527199134781901j,
- -0.849741768000852 - 0.527199134781901j,
- 0.527199134781901 - 0.849741768000853j,
- -0.527199134781901 + 0.849741768000853j,
- 0.997925286198596 + 0.0643826309298575j,
- -0.997925286198596 - 0.0643826309298575j,
- 0.0643826309298575 - 0.997925286198596j,
- -0.0643826309298575 + 0.997925286198596j,
- 0.751165131909686 - 0.660114342067420j,
- -0.751165131909686 + 0.660114342067420j,
- 0.660114342067420 + 0.751165131909686j,
- -0.660114342067420 - 0.751165131909686j,
- 0.946600913083284 - 0.322407678801070j,
- -0.946600913083284 + 0.322407678801070j,
- 0.322407678801070 + 0.946600913083284j,
- -0.322407678801070 - 0.946600913083284j,
- 0.897324580705418 + 0.441371268731717j,
- -0.897324580705418 - 0.441371268731717j,
- 0.441371268731717 - 0.897324580705418j,
- -0.441371268731717 + 0.897324580705418j,
- 0.991310859846115 - 0.131540028702883j,
- -0.991310859846115 + 0.131540028702883j,
- 0.131540028702883 + 0.991310859846115j,
- -0.131540028702883 - 0.991310859846115j,
- 0.793975477554337 + 0.607949784967774j,
- -0.793975477554337 - 0.607949784967774j,
- 0.607949784967774 - 0.793975477554337j,
- -0.607949784967774 + 0.793975477554337j,
- 0.966190003445413 + 0.257831102162159j,
- -0.966190003445413 - 0.257831102162159j,
- 0.257831102162159 - 0.966190003445413j,
- -0.257831102162159 + 0.966190003445413j,
- 0.865513624090569 - 0.500885382611241j,
- -0.865513624090569 + 0.500885382611241j,
- 0.500885382611241 + 0.865513624090569j,
- -0.500885382611241 - 0.865513624090569j,
- 0.999995293809576 - 0.00306795676296598j,
- -0.999995293809576 + 0.00306795676296598j,
- 0.00306795676296598 + 0.999995293809576j,
- -0.00306795676296598 - 0.999995293809576j,
- 0.709272826438866 + 0.704934080375905j,
- -0.709272826438866 - 0.704934080375905j,
- 0.704934080375905 - 0.709272826438866j,
- -0.704934080375905 + 0.709272826438866j,
- 0.925049240782678 + 0.379847208924051j,
- -0.925049240782678 - 0.379847208924051j,
- 0.379847208924051 - 0.925049240782678j,
- -0.379847208924051 + 0.925049240782678j,
- 0.922701128333879 - 0.385516053843919j,
- -0.922701128333879 + 0.385516053843919j,
- 0.385516053843919 + 0.922701128333879j,
- -0.385516053843919 - 0.922701128333879j,
- 0.981379193313755 + 0.192080397049892j,
- -0.981379193313755 - 0.192080397049892j,
- 0.192080397049892 - 0.981379193313755j,
- -0.192080397049892 + 0.981379193313755j,
- 0.829761233794523 - 0.558118531220556j,
- -0.829761233794523 + 0.558118531220556j,
- 0.558118531220556 + 0.829761233794523j,
- -0.558118531220556 - 0.829761233794523j,
- 0.980182135968117 - 0.198098410717954j,
- -0.980182135968117 + 0.198098410717954j,
- 0.198098410717954 + 0.980182135968117j,
- -0.198098410717954 - 0.980182135968117j,
- 0.833170164701913 + 0.553016705580028j,
- -0.833170164701913 - 0.553016705580028j,
- 0.553016705580028 - 0.833170164701913j,
- -0.553016705580028 + 0.833170164701913j,
- 0.995480755491927 + 0.0949634953296390j,
- -0.995480755491927 - 0.0949634953296390j,
- 0.0949634953296390 - 0.995480755491927j,
- -0.0949634953296390 + 0.995480755491927j,
- 0.771060524261814 - 0.636761861236284j,
- -0.771060524261814 + 0.636761861236284j,
- 0.636761861236284 + 0.771060524261814j,
- -0.636761861236284 - 0.771060524261814j,
- 0.956045251349996 - 0.293219162694259j,
- -0.956045251349996 + 0.293219162694259j,
- 0.293219162694259 + 0.956045251349996j,
- -0.293219162694259 - 0.956045251349996j,
- 0.883363338665732 + 0.468688822035828j,
- -0.883363338665732 - 0.468688822035828j,
- 0.468688822035828 - 0.883363338665732j,
- -0.468688822035828 + 0.883363338665732j,
- 0.994879330794806 - 0.101069862754828j,
- -0.994879330794806 + 0.101069862754828j,
- 0.101069862754828 + 0.994879330794806j,
- -0.101069862754828 - 0.994879330794806j,
- 0.774953106594874 + 0.632018735939809j,
- -0.774953106594874 - 0.632018735939809j,
- 0.632018735939809 - 0.774953106594874j,
- -0.632018735939809 + 0.774953106594874j,
- 0.957826413027533 + 0.287347459544730j,
- -0.957826413027533 - 0.287347459544730j,
- 0.287347459544730 - 0.957826413027533j,
- -0.287347459544730 + 0.957826413027533j,
- 0.880470889052161 - 0.474100214650550j,
- -0.880470889052161 + 0.474100214650550j,
- 0.474100214650550 + 0.880470889052161j,
- -0.474100214650550 - 0.880470889052161j,
- 0.998941293186857 + 0.0460031821309146j,
- -0.998941293186857 - 0.0460031821309146j,
- 0.0460031821309146 - 0.998941293186857j,
- -0.0460031821309146 + 0.998941293186857j,
- 0.738887324460615 - 0.673829000378756j,
- -0.738887324460615 + 0.673829000378756j,
- 0.673829000378756 + 0.738887324460615j,
- -0.673829000378756 - 0.738887324460615j,
- 0.940506070593268 - 0.339776884406827j,
- -0.940506070593268 + 0.339776884406827j,
- 0.339776884406827 + 0.940506070593268j,
- -0.339776884406827 - 0.940506070593268j,
- 0.905296759318119 + 0.424779681209109j,
- -0.905296759318119 - 0.424779681209109j,
- 0.424779681209109 - 0.905296759318119j,
- -0.424779681209109 + 0.905296759318119j,
- 0.988721691960324 - 0.149764534677322j,
- -0.988721691960324 + 0.149764534677322j,
- 0.149764534677322 + 0.988721691960324j,
- -0.149764534677322 - 0.988721691960324j,
- 0.805031331142964 + 0.593232295039800j,
- -0.805031331142964 - 0.593232295039800j,
- 0.593232295039800 - 0.805031331142964j,
- -0.593232295039800 + 0.805031331142964j,
- 0.970772140728950 + 0.240003022448741j,
- -0.970772140728950 - 0.240003022448741j,
- 0.240003022448741 - 0.970772140728950j,
- -0.240003022448741 + 0.970772140728950j,
- 0.856147328375194 - 0.516731799017650j,
- -0.856147328375194 + 0.516731799017650j,
- 0.516731799017650 + 0.856147328375194j,
- -0.516731799017650 - 0.856147328375194j,
- 0.998640218180265 - 0.0521317046802833j,
- -0.998640218180265 + 0.0521317046802833j,
- 0.0521317046802833 + 0.998640218180265j,
- -0.0521317046802833 - 0.998640218180265j,
- 0.743007952135122 + 0.669282588346636j,
- -0.743007952135122 - 0.669282588346636j,
- 0.669282588346636 - 0.743007952135122j,
- -0.669282588346636 + 0.743007952135122j,
- 0.942573197601447 + 0.333999651442009j,
- -0.942573197601447 - 0.333999651442009j,
- 0.333999651442009 - 0.942573197601447j,
- -0.333999651442009 + 0.942573197601447j,
- 0.902673318237259 - 0.430326481340083j,
- -0.902673318237259 + 0.430326481340083j,
- 0.430326481340083 + 0.902673318237259j,
- -0.430326481340083 - 0.902673318237259j,
- 0.989622017463201 + 0.143695033150294j,
- -0.989622017463201 - 0.143695033150294j,
- 0.143695033150294 - 0.989622017463201j,
- -0.143695033150294 + 0.989622017463201j,
- 0.801376171723140 - 0.598160706996342j,
- -0.801376171723140 + 0.598160706996342j,
- 0.598160706996342 + 0.801376171723140j,
- -0.598160706996342 - 0.801376171723140j,
- 0.969281235356549 - 0.245955050335795j,
- -0.969281235356549 + 0.245955050335795j,
- 0.245955050335795 + 0.969281235356549j,
- -0.245955050335795 - 0.969281235356549j,
- 0.859301818357008 + 0.511468850437970j,
- -0.859301818357008 - 0.511468850437970j,
- 0.511468850437970 - 0.859301818357008j,
- -0.511468850437970 + 0.859301818357008j,
- 0.999769405351215 + 0.0214740802754695j,
- -0.999769405351215 - 0.0214740802754695j,
- 0.0214740802754695 - 0.999769405351215j,
- -0.0214740802754695 + 0.999769405351215j,
- 0.722128193929215 - 0.691759258364158j,
- -0.722128193929215 + 0.691759258364158j,
- 0.691759258364158 + 0.722128193929215j,
- -0.691759258364158 - 0.722128193929215j,
- 0.931884265581668 - 0.362755724367397j,
- -0.931884265581668 + 0.362755724367397j,
- 0.362755724367397 + 0.931884265581668j,
- -0.362755724367397 - 0.931884265581668j,
- 0.915448716088268 + 0.402434650859418j,
- -0.915448716088268 - 0.402434650859418j,
- 0.402434650859418 - 0.915448716088268j,
- -0.402434650859418 + 0.915448716088268j,
- 0.984748501801904 - 0.173983873387464j,
- -0.984748501801904 + 0.173983873387464j,
- 0.173983873387464 + 0.984748501801904j,
- -0.173983873387464 - 0.984748501801904j,
- 0.819347520076797 + 0.573297166698042j,
- -0.819347520076797 - 0.573297166698042j,
- 0.573297166698042 - 0.819347520076797j,
- -0.573297166698042 + 0.819347520076797j,
- 0.976369731330021 + 0.216106797076220j,
- -0.976369731330021 - 0.216106797076220j,
- 0.216106797076220 - 0.976369731330021j,
- -0.216106797076220 + 0.976369731330021j,
- 0.843208239641845 - 0.537587076295646j,
- -0.843208239641845 + 0.537587076295646j,
- 0.537587076295646 + 0.843208239641845j,
- -0.537587076295646 - 0.843208239641845j,
- 0.997060070339483 - 0.0766238613920315j,
- -0.997060070339483 + 0.0766238613920315j,
- 0.0766238613920315 + 0.997060070339483j,
- -0.0766238613920315 - 0.997060070339483j,
- 0.759209188978388 + 0.650846684996381j,
- -0.759209188978388 - 0.650846684996381j,
- 0.650846684996381 - 0.759209188978388j,
- -0.650846684996381 + 0.759209188978388j,
- 0.950486073949482 + 0.310767152749612j,
- -0.950486073949482 - 0.310767152749612j,
- 0.310767152749612 - 0.950486073949482j,
- -0.310767152749612 + 0.950486073949482j,
- 0.891840709392343 - 0.452349587233771j,
- -0.891840709392343 + 0.452349587233771j,
- 0.452349587233771 + 0.891840709392343j,
- -0.452349587233771 - 0.891840709392343j,
- 0.992850414459865 + 0.119365214810991j,
- -0.992850414459865 - 0.119365214810991j,
- 0.119365214810991 - 0.992850414459865j,
- -0.119365214810991 + 0.992850414459865j,
- 0.786455213599086 - 0.617647307937804j,
- -0.786455213599086 + 0.617647307937804j,
- 0.617647307937804 + 0.786455213599086j,
- -0.617647307937804 - 0.786455213599086j,
- 0.962953266873684 - 0.269668325572915j,
- -0.962953266873684 + 0.269668325572915j,
- 0.269668325572915 + 0.962953266873684j,
- -0.269668325572915 - 0.962953266873684j,
- 0.871595086655951 + 0.490226483288291j,
- -0.871595086655951 - 0.490226483288291j,
- 0.490226483288291 - 0.871595086655951j,
- -0.490226483288291 + 0.871595086655951j,
- 0.999618822495179 - 0.0276081457789657j,
- -0.999618822495179 + 0.0276081457789657j,
- 0.0276081457789657 + 0.999618822495179j,
- -0.0276081457789657 - 0.999618822495179j,
- 0.726359155084346 + 0.687315340891759j,
- -0.726359155084346 - 0.687315340891759j,
- 0.687315340891759 - 0.726359155084346j,
- -0.687315340891759 + 0.726359155084346j,
- 0.934092550404259 + 0.357030961233430j,
- -0.934092550404259 - 0.357030961233430j,
- 0.357030961233430 - 0.934092550404259j,
- -0.357030961233430 + 0.934092550404259j,
- 0.912962190428398 - 0.408044162864979j,
- -0.912962190428398 + 0.408044162864979j,
- 0.408044162864979 + 0.912962190428398j,
- -0.408044162864979 - 0.912962190428398j,
- 0.985797509167567 + 0.167938294974731j,
- -0.985797509167567 - 0.167938294974731j,
- 0.167938294974731 - 0.985797509167567j,
- -0.167938294974731 + 0.985797509167567j,
- 0.815814410806734 - 0.578313796411656j,
- -0.815814410806734 + 0.578313796411656j,
- 0.578313796411656 + 0.815814410806734j,
- -0.578313796411656 - 0.815814410806734j,
- 0.975025345066994 - 0.222093620973204j,
- -0.975025345066994 + 0.222093620973204j,
- 0.222093620973204 + 0.975025345066994j,
- -0.222093620973204 - 0.975025345066994j,
- 0.846490938774052 + 0.532403127877198j,
- -0.846490938774052 - 0.532403127877198j,
- 0.532403127877198 - 0.846490938774052j,
- -0.532403127877198 + 0.846490938774052j,
- 0.997511456140303 + 0.0705045733896139j,
- -0.997511456140303 - 0.0705045733896139j,
- 0.0705045733896139 - 0.997511456140303j,
- -0.0705045733896139 + 0.997511456140303j,
- 0.755201376896537 - 0.655492852999615j,
- -0.755201376896537 + 0.655492852999615j,
- 0.655492852999615 + 0.755201376896537j,
- -0.655492852999615 - 0.755201376896537j,
- 0.948561349915730 - 0.316593375556166j,
- -0.948561349915730 + 0.316593375556166j,
- 0.316593375556166 + 0.948561349915730j,
- -0.316593375556166 - 0.948561349915730j,
- 0.894599485631383 + 0.446868840162374j,
- -0.894599485631383 - 0.446868840162374j,
- 0.446868840162374 - 0.894599485631383j,
- -0.446868840162374 + 0.894599485631383j,
- 0.992099313142192 - 0.125454983411546j,
- -0.992099313142192 + 0.125454983411546j,
- 0.125454983411546 + 0.992099313142192j,
- -0.125454983411546 - 0.992099313142192j,
- 0.790230221437310 + 0.612810082429410j,
- -0.790230221437310 - 0.612810082429410j,
- 0.612810082429410 - 0.790230221437310j,
- -0.612810082429410 + 0.790230221437310j,
- 0.964589793289813 + 0.263754678974831j,
- -0.964589793289813 - 0.263754678974831j,
- 0.263754678974831 - 0.964589793289813j,
- -0.263754678974831 + 0.964589793289813j,
- 0.868570705971341 - 0.495565261825772j,
- -0.868570705971341 + 0.495565261825772j,
- 0.495565261825772 + 0.868570705971341j,
- -0.495565261825772 - 0.868570705971341j,
- 0.999957644551964 + 0.00920375478205982j,
- -0.999957644551964 - 0.00920375478205982j,
- 0.00920375478205982 - 0.999957644551964j,
- -0.00920375478205982 + 0.999957644551964j,
- 0.713584868780794 - 0.700568793943248j,
- -0.713584868780794 + 0.700568793943248j,
- 0.700568793943248 + 0.713584868780794j,
- -0.700568793943248 - 0.713584868780794j,
- 0.927362525650401 - 0.374164062971458j,
- -0.927362525650401 + 0.374164062971458j,
- 0.374164062971458 + 0.927362525650401j,
- -0.374164062971458 - 0.927362525650401j,
- 0.920318276709110 + 0.391170384302254j,
- -0.920318276709110 - 0.391170384302254j,
- 0.391170384302254 - 0.920318276709111j,
- -0.391170384302254 + 0.920318276709111j,
- 0.982539302287441 - 0.186055151663447j,
- -0.982539302287441 + 0.186055151663447j,
- 0.186055151663447 + 0.982539302287441j,
- -0.186055151663447 - 0.982539302287441j,
- 0.826321062845664 + 0.563199344013834j,
- -0.826321062845664 - 0.563199344013834j,
- 0.563199344013834 - 0.826321062845664j,
- -0.563199344013834 + 0.826321062845664j,
- 0.978948175319062 + 0.204108966092817j,
- -0.978948175319062 - 0.204108966092817j,
- 0.204108966092817 - 0.978948175319062j,
- -0.204108966092817 + 0.978948175319062j,
- 0.836547727223512 - 0.547894059173100j,
- -0.836547727223512 + 0.547894059173100j,
- 0.547894059173100 + 0.836547727223512j,
- -0.547894059173100 - 0.836547727223512j,
- 0.996044700901252 - 0.0888535525825246j,
- -0.996044700901252 + 0.0888535525825246j,
- 0.0888535525825246 + 0.996044700901252j,
- -0.0888535525825246 - 0.996044700901252j,
- 0.767138911935820 + 0.641481012808583j,
- -0.767138911935820 - 0.641481012808583j,
- 0.641481012808583 - 0.767138911935820j,
- -0.641481012808583 + 0.767138911935820j,
- 0.954228095109106 + 0.299079826308040j,
- -0.954228095109106 - 0.299079826308040j,
- 0.299079826308040 - 0.954228095109106j,
- -0.299079826308040 + 0.954228095109106j,
- 0.886222530148881 - 0.463259783551860j,
- -0.886222530148881 + 0.463259783551860j,
- 0.463259783551860 + 0.886222530148881j,
- -0.463259783551860 - 0.886222530148881j,
- 0.994240449453188 + 0.107172424956809j,
- -0.994240449453188 - 0.107172424956809j,
- 0.107172424956809 - 0.994240449453188j,
- -0.107172424956809 + 0.994240449453188j,
- 0.778816512381476 - 0.627251815495144j,
- -0.778816512381476 + 0.627251815495144j,
- 0.627251815495144 + 0.778816512381476j,
- -0.627251815495144 - 0.778816512381476j,
- 0.959571513081985 - 0.281464937925758j,
- -0.959571513081985 + 0.281464937925758j,
- 0.281464937925758 + 0.959571513081985j,
- -0.281464937925758 - 0.959571513081985j,
- 0.877545290207261 + 0.479493757660153j,
- -0.877545290207261 - 0.479493757660153j,
- 0.479493757660153 - 0.877545290207261j,
- -0.479493757660153 + 0.877545290207261j,
- 0.999204758618364 - 0.0398729275877398j,
- -0.999204758618364 + 0.0398729275877398j,
- 0.0398729275877398 + 0.999204758618364j,
- -0.0398729275877398 - 0.999204758618364j,
- 0.734738878095963 + 0.678350043129862j,
- -0.734738878095963 - 0.678350043129862j,
- 0.678350043129861 - 0.734738878095963j,
- -0.678350043129861 + 0.734738878095963j,
- 0.938403534063108 + 0.345541324963989j,
- -0.938403534063108 - 0.345541324963989j,
- 0.345541324963989 - 0.938403534063108j,
- -0.345541324963989 + 0.938403534063108j,
- 0.907886116487666 - 0.419216888363224j,
- -0.907886116487666 + 0.419216888363224j,
- 0.419216888363224 + 0.907886116487666j,
- -0.419216888363224 - 0.907886116487666j,
- 0.987784141644572 + 0.155828397654265j,
- -0.987784141644572 - 0.155828397654265j,
- 0.155828397654265 - 0.987784141644572j,
- -0.155828397654265 + 0.987784141644572j,
- 0.808656181588175 - 0.588281548222645j,
- -0.808656181588175 + 0.588281548222645j,
- 0.588281548222645 + 0.808656181588175j,
- -0.588281548222645 - 0.808656181588175j,
- 0.972226497078936 - 0.234041958583543j,
- -0.972226497078936 + 0.234041958583543j,
- 0.234041958583543 + 0.972226497078936j,
- -0.234041958583543 - 0.972226497078936j,
- 0.852960604930364 + 0.521975292937154j,
- -0.852960604930364 - 0.521975292937154j,
- 0.521975292937154 - 0.852960604930364j,
- -0.521975292937154 + 0.852960604930364j,
- 0.998301544933893 + 0.0582582645004358j,
- -0.998301544933893 - 0.0582582645004358j,
- 0.0582582645004358 - 0.998301544933893j,
- -0.0582582645004358 + 0.998301544933893j,
- 0.747100605980180 - 0.664710978203345j,
- -0.747100605980180 + 0.664710978203345j,
- 0.664710978203345 + 0.747100605980180j,
- -0.664710978203345 - 0.747100605980180j,
- 0.944604837261480 - 0.328209843579092j,
- -0.944604837261480 + 0.328209843579092j,
- 0.328209843579092 + 0.944604837261480j,
- -0.328209843579092 - 0.944604837261480j,
- 0.900015892016160 + 0.435857079922255j,
- -0.900015892016160 - 0.435857079922255j,
- 0.435857079922256 - 0.900015892016160j,
- -0.435857079922256 + 0.900015892016160j,
- 0.990485084256457 - 0.137620121586486j,
- -0.990485084256457 + 0.137620121586486j,
- 0.137620121586486 + 0.990485084256457j,
- -0.137620121586486 - 0.990485084256457j,
- 0.797690840943391 + 0.603066598540348j,
- -0.797690840943391 - 0.603066598540348j,
- 0.603066598540348 - 0.797690840943391j,
- -0.603066598540348 + 0.797690840943391j,
- 0.967753837093475 + 0.251897818154217j,
- -0.967753837093475 - 0.251897818154217j,
- 0.251897818154217 - 0.967753837093475j,
- -0.251897818154217 + 0.967753837093475j,
- 0.862423956111041 - 0.506186645345155j,
- -0.862423956111041 + 0.506186645345155j,
- 0.506186645345155 + 0.862423956111041j,
- -0.506186645345155 - 0.862423956111041j,
- 0.999882347454213 - 0.0153392062849881j,
- -0.999882347454213 + 0.0153392062849881j,
- 0.0153392062849881 + 0.999882347454213j,
- -0.0153392062849881 - 0.999882347454213j,
- 0.717870045055732 + 0.696177131491463j,
- -0.717870045055732 - 0.696177131491463j,
- 0.696177131491463 - 0.717870045055732j,
- -0.696177131491463 + 0.717870045055732j,
- 0.929640895843181 + 0.368466829953372j,
- -0.929640895843181 - 0.368466829953372j,
- 0.368466829953372 - 0.929640895843181j,
- -0.368466829953372 + 0.929640895843181j,
- 0.917900775621390 - 0.396809987416710j,
- -0.917900775621390 + 0.396809987416710j,
- 0.396809987416710 + 0.917900775621390j,
- -0.396809987416710 - 0.917900775621390j,
- 0.983662419211730 + 0.180022901405700j,
- -0.983662419211730 - 0.180022901405700j,
- 0.180022901405700 - 0.983662419211730j,
- -0.180022901405700 + 0.983662419211730j,
- 0.822849781375826 - 0.568258952670132j,
- -0.822849781375826 + 0.568258952670132j,
- 0.568258952670132 + 0.822849781375826j,
- -0.568258952670132 - 0.822849781375826j,
- 0.977677357824510 - 0.210111836880470j,
- -0.977677357824510 + 0.210111836880470j,
- 0.210111836880470 + 0.977677357824510j,
- -0.210111836880470 - 0.977677357824510j,
- 0.839893794196000 + 0.542750784864516j,
- -0.839893794196000 - 0.542750784864516j,
- 0.542750784864516 - 0.839893794196000j,
- -0.542750784864516 + 0.839893794196000j,
- 0.996571145790555 + 0.0827402645493757j,
- -0.996571145790555 - 0.0827402645493757j,
- 0.0827402645493757 - 0.996571145790555j,
- -0.0827402645493757 + 0.996571145790555j,
- 0.763188417263381 - 0.646176012983316j,
- -0.763188417263381 + 0.646176012983316j,
- 0.646176012983316 + 0.763188417263381j,
- -0.646176012983316 - 0.763188417263381j,
- 0.952375012719766 - 0.304929229735402j,
- -0.952375012719766 + 0.304929229735402j,
- 0.304929229735402 + 0.952375012719766j,
- -0.304929229735402 - 0.952375012719766j,
- 0.889048355854665 + 0.457813303598877j,
- -0.889048355854665 - 0.457813303598877j,
- 0.457813303598877 - 0.889048355854665j,
- -0.457813303598877 + 0.889048355854665j,
- 0.993564135520595 - 0.113270952177564j,
- -0.993564135520595 + 0.113270952177564j,
- 0.113270952177564 + 0.993564135520595j,
- -0.113270952177564 - 0.993564135520595j,
- 0.782650596166576 + 0.622461279374150j,
- -0.782650596166576 - 0.622461279374150j,
- 0.622461279374150 - 0.782650596166576j,
- -0.622461279374150 + 0.782650596166576j,
- 0.961280485811321 + 0.275571819310958j,
- -0.961280485811321 - 0.275571819310958j,
- 0.275571819310958 - 0.961280485811321j,
- -0.275571819310958 + 0.961280485811321j,
- 0.874586652278176 - 0.484869248000791j,
- -0.874586652278176 + 0.484869248000791j,
- 0.484869248000791 + 0.874586652278176j,
- -0.484869248000791 - 0.874586652278176j,
- 0.999430604555462 + 0.0337411718513776j,
- -0.999430604555462 - 0.0337411718513776j,
- 0.0337411718513776 - 0.999430604555462j,
- -0.0337411718513776 + 0.999430604555462j,
- 0.730562769227828 - 0.682845546385248j,
- -0.730562769227828 + 0.682845546385248j,
- 0.682845546385248 + 0.730562769227828j,
- -0.682845546385248 - 0.730562769227828j,
- 0.936265667170278 - 0.351292756085567j,
- -0.936265667170278 + 0.351292756085567j,
- 0.351292756085567 + 0.936265667170278j,
- -0.351292756085567 - 0.936265667170278j,
- 0.910441292258067 + 0.413638312238435j,
- -0.910441292258067 - 0.413638312238435j,
- 0.413638312238435 - 0.910441292258067j,
- -0.413638312238435 + 0.910441292258067j,
- 0.986809401814185 - 0.161886393780112j,
- -0.986809401814185 + 0.161886393780112j,
- 0.161886393780112 + 0.986809401814185j,
- -0.161886393780112 - 0.986809401814185j,
- 0.812250586585204 + 0.583308652937698j,
- -0.812250586585204 - 0.583308652937698j,
- 0.583308652937698 - 0.812250586585204j,
- -0.583308652937698 + 0.812250586585204j,
- 0.973644249650812 + 0.228072083170886j,
- -0.973644249650812 - 0.228072083170886j,
- 0.228072083170886 - 0.973644249650812j,
- -0.228072083170886 + 0.973644249650812j,
- 0.849741768000852 - 0.527199134781901j,
- -0.849741768000852 + 0.527199134781901j,
- 0.527199134781901 + 0.849741768000853j,
- -0.527199134781901 - 0.849741768000853j,
- 0.997925286198596 - 0.0643826309298575j,
- -0.997925286198596 + 0.0643826309298575j,
- 0.0643826309298575 + 0.997925286198596j,
- -0.0643826309298575 - 0.997925286198596j,
- 0.751165131909686 + 0.660114342067420j,
- -0.751165131909686 - 0.660114342067420j,
- 0.660114342067420 - 0.751165131909686j,
- -0.660114342067420 + 0.751165131909686j,
- 0.946600913083284 + 0.322407678801070j,
- -0.946600913083284 - 0.322407678801070j,
- 0.322407678801070 - 0.946600913083284j,
- -0.322407678801070 + 0.946600913083284j,
- 0.897324580705418 - 0.441371268731717j,
- -0.897324580705418 + 0.441371268731717j,
- 0.441371268731717 + 0.897324580705418j,
- -0.441371268731717 - 0.897324580705418j,
- 0.991310859846115 + 0.131540028702883j,
- -0.991310859846115 - 0.131540028702883j,
- 0.131540028702883 - 0.991310859846115j,
- -0.131540028702883 + 0.991310859846115j,
- 0.793975477554337 - 0.607949784967774j,
- -0.793975477554337 + 0.607949784967774j,
- 0.607949784967774 + 0.793975477554337j,
- -0.607949784967774 - 0.793975477554337j,
- 0.966190003445413 - 0.257831102162159j,
- -0.966190003445413 + 0.257831102162159j,
- 0.257831102162159 + 0.966190003445413j,
- -0.257831102162159 - 0.966190003445413j,
- 0.865513624090569 + 0.500885382611241j,
- -0.865513624090569 - 0.500885382611241j,
- 0.500885382611241 - 0.865513624090569j,
- -0.500885382611241 + 0.865513624090569j]
-
-
-"""A dictionary of all the roots."""
-roots_dict = {2: phi4_roots,
- 4: phi8_roots,
- 8: phi16_roots,
- 16: phi32_roots,
- 32: phi64_roots,
- 64: phi128_roots,
- 128: phi256_roots,
- 256: phi512_roots,
- 512: phi1024_roots,
- 1024: phi2048_roots
- }
diff --git a/code/falcon/generate_constants.sage b/code/falcon/generate_constants.sage
deleted file mode 100755
index f5f5750..0000000
--- a/code/falcon/generate_constants.sage
+++ /dev/null
@@ -1,50 +0,0 @@
-"""Generate the complex roots of x ** 2 + 1."""
-phi4 = cyclotomic_polynomial(4)
-phi4_roots = phi4.complex_roots()
-phi4_roots.reverse()
-
-"""Generate the complex roots of x ** n + 1, for n = 4, 8, 16, ..., 1024."""
-phi8_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi4_roots], [])
-phi16_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi8_roots], [])
-phi32_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi16_roots], [])
-phi64_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi32_roots], [])
-phi128_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi64_roots], [])
-phi256_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi128_roots], [])
-phi512_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi256_roots], [])
-phi1024_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi512_roots], [])
-phi2048_roots = sum([[sqrt(elt), - sqrt(elt)] for elt in phi1024_roots], [])
-
-
-"""Generate the roots of x ** n + 1 in Z_q,
- for q = 12 * 1024 + 1 and n = 4, 8, 16, ..., 1024."""
-q = 12 * 1024 + 1
-Zq = Integers(q)
-phi4_roots_Zq = [sqrt(R(- 1)), - sqrt(R(- 1))]
-phi8_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi4_roots_Zq], [])
-phi16_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi8_roots_Zq], [])
-phi32_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi16_roots_Zq], [])
-phi64_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi32_roots_Zq], [])
-phi128_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi64_roots_Zq], [])
-phi256_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi128_roots_Zq], [])
-phi512_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi256_roots_Zq], [])
-phi1024_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi512_roots_Zq], [])
-phi2048_roots_Zq = sum([[sqrt(elt), - sqrt(elt)] for elt in phi1024_roots_Zq], [])
-
-
-RRR = RealField(256)
-
-
-"""Generate precomputed constants for the Gaussian sampler over Z."""
-def gaussian(sigma, mu, x):
- return exp(- (RRR(x) - RRR(mu)) ** 2 / (2 * (RRR(sigma) ** 2)))
-
-
-def half_gaussian_table(sigma):
- normalization_factor = sum(gaussian(sigma, 0, i) for i in range(10 * sigma))
- table = []
- for i in range(10 * sigma):
- u = sum(gaussian(sigma, 0, j) for j in range(i + 1)) / normalization_factor
- high_u = '0x%016x' % floor(u * (1 << 64))
- low_u = '0x%016x' % (floor(u * (1 << 128)) & ((1 << 64) - 1))
- table += [u]
- return table
diff --git a/code/falcon/makefile b/code/falcon/makefile
deleted file mode 100644
index afd37e1..0000000
--- a/code/falcon/makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-PY = python3
-AUX = *.pyc *.cprof
-
-test:
- $(PY) test.py
-
-profile:
- rm -f $(AUX)
- rm -rf __pycache__
- touch profile_action.cprof
- $(PY) -m cProfile -o profile_action.cprof profile_action.py
- pyprof2calltree -k -i profile_action.cprof &
-
-clean:
- rm -f $(AUX)
- rm -rf __pycache__
- @echo "Clean done"
diff --git a/code/falcon/newsampler.py b/code/falcon/newsampler.py
deleted file mode 100644
index ec785f9..0000000
--- a/code/falcon/newsampler.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Importing dependencies
-from random import randint
-from math import floor, exp
-# For debugging purposes
-import sys
-if sys.version_info >= (3, 4):
- from importlib import reload # Python 3.4+ only.
-
-# Upper bound on all the values of sigma
-sigma0 = 1.8205
-# Lower bound on all the values of sigma
-sigmin = 1.2
-# Precision of the CDT
-cdt_precision = 72
-
-# New probability distribution table from [PRR19]
-halfgaussian_pdt = [
- 1697680241746640300030,
- 1459943456642912959616,
- 928488355018011056515,
- 436693944817054414619,
- 151893140790369201013,
- 39071441848292237840,
- 7432604049020375675,
- 1045641569992574730,
- 108788995549429682,
- 8370422445201343,
- 476288472308334,
- 20042553305308,
- 623729532807,
- 14354889437,
- 244322621,
- 3075302,
- 28626,
- 197,
- 1]
-
-
-def make_cdt(pdt):
- len_pdt = len(pdt)
- cdt = pdt[:-1]
- for i in range(1, len_pdt - 1):
- cdt[i] += cdt[i - 1]
- return cdt
-
-# Compute the CDT from the PDT
-halfgaussian_cdt = make_cdt(halfgaussian_pdt)
-
-
-def sampler0():
- """Sample from a half-Gaussian."""
- r = randint(0, (1 << cdt_precision) - 1)
- z0 = 0
- for elt in halfgaussian_cdt:
- z0 += (r >= elt)
- return z0
-
-
-# Precision in bits of p in BerExp
-berexp_p = 64
-# Precision in bits of each rand in BerExp
-berexp_rand = 8
-rand_mask = (1 << berexp_rand) - 1
-# Sanity check
-assert(berexp_p % berexp_rand == 0)
-
-
-def berexp(x, sf):
- """
- Return True with a probability exp(-x).
- sf is a scaling factor.
- """
- # FIXME
- p = int(exp(-x) * sf * (1 << berexp_p)) - 1
- i = berexp_p
- # Careful: in C, i must be unsigned otherwise it might loop forever!
- while(i > 0):
- i -= berexp_rand
- r = randint(0, (1 << berexp_rand) - 1)
- # Si la randomness est plus faible que p, on accepte
- if r < ((p >> i) & rand_mask):
- return True
- # Si la randomness est plus elevee que p, on refuse
- if r > ((p >> i) & rand_mask):
- return False
- # Sinon, on continue jusqu'a ce que i = 0
- return True
-
-
-def samplerz(center, sigma):
- """
- Sample from a discrete Gaussian with specified center and sigma.
- """
- assert(sigma < sigma0)
- assert(sigma >= sigmin)
- # c0 is the fractional part of center
- c0 = center - floor(center)
- sf = sigma / sigma0
- while(1):
- z0 = sampler0()
- b = randint(0, 1)
- z = ((b << 1) - 1) * z0 + b
- x = ((z - c0) ** 2) / (2 * (sigma ** 2)) - (z0 ** 2) / (2 * (sigma0 ** 2))
- if berexp(x, sf) is True:
- return floor(center) + z
diff --git a/code/falcon/ntrugen.py b/code/falcon/ntrugen.py
deleted file mode 100755
index 4cea9ae..0000000
--- a/code/falcon/ntrugen.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""This file implements the section 3.8.2 of Falcon's documentation."""
-from random import gauss
-from math import sqrt
-from falcon.fft import fft, ifft, add_fft, mul_fft, adj_fft, div_fft # FFT operations
-from falcon.fft import add, mul, div, adj # regular operations
-from falcon.ntt import div_zq
-from falcon.common import sqnorm
-
-
-q = 12 * 1024 + 1
-
-
-def karatsuba(a, b, n):
- """Karatsuba multiplication between polynomials.
-
- The coefficients may be either integer or real.
- """
- if n == 1:
- return [a[0] * b[0], 0]
- else:
- n2 = n // 2
- a0 = a[:n2]
- a1 = a[n2:]
- b0 = b[:n2]
- b1 = b[n2:]
- ax = [a0[i] + a1[i] for i in range(n2)]
- bx = [b0[i] + b1[i] for i in range(n2)]
- a0b0 = karatsuba(a0, b0, n2)
- a1b1 = karatsuba(a1, b1, n2)
- axbx = karatsuba(ax, bx, n2)
- for i in range(n):
- axbx[i] -= (a0b0[i] + a1b1[i])
- ab = [0] * (2 * n)
- for i in range(n):
- ab[i] += a0b0[i]
- ab[i + n] += a1b1[i]
- ab[i + n2] += axbx[i]
- return ab
-
-
-def karamul(a, b):
- """Karatsuba multiplication, followed by reduction mod (x ** n + 1)."""
- n = len(a)
- ab = karatsuba(a, b, n)
- abr = [ab[i] - ab[i + n] for i in range(n)]
- return abr
-
-
-def galois_conjugate(a):
- """Galois conjugate of an element a in Q[x] / (x ** n + 1).
-
- Here, the Galois conjugate of a(x) is simply a(-x).
- """
- n = len(a)
- return [((-1) ** i) * a[i] for i in range(n)]
-
-
-def field_norm(a):
- """Project an element a of Q[x] / (x ** n + 1) onto Q[x] / (x ** (n // 2) + 1).
-
- Only works if n is a power-of-two.
- """
- n2 = len(a) // 2
- ae = [a[2 * i] for i in range(n2)]
- ao = [a[2 * i + 1] for i in range(n2)]
- ae_squared = karamul(ae, ae)
- ao_squared = karamul(ao, ao)
- res = ae_squared[:]
- for i in range(n2 - 1):
- res[i + 1] -= ao_squared[i]
- res[0] += ao_squared[n2 - 1]
- return res
-
-
-def lift(a):
- """Lift an element a of Q[x] / (x ** (n // 2) + 1) up to Q[x] / (x ** n + 1).
-
- The lift of a(x) is simply a(x ** 2) seen as an element of Q[x] / (x ** n + 1).
- """
- n = len(a)
- res = [0] * (2 * n)
- for i in range(n):
- res[2 * i] = a[i]
- return res
-
-
-def bitsize(a):
- """Compute the bitsize of an element of Z (not counting the sign)."""
- val = abs(a)
- res = 0
- while val:
- res += 1
- val >>= 1
- return res
-
-
-def reduce(f, g, F, G):
- """Reduce (F, G) relatively to (f, g).
-
- This is done via Babai's reduction.
- (F, G) <-- (F, G) - k * (f, g), where k = round((F f* + G g*) / (f f* + g g*)).
- Corresponds to algorithm 7 (Reduce) of Falcon's documentation.
- """
- n = len(f)
- size = max(53, bitsize(min(f)), bitsize(max(f)), bitsize(min(g)), bitsize(max(g)))
-
- f_adjust = [elt >> (size - 53) for elt in f]
- g_adjust = [elt >> (size - 53) for elt in g]
- fa_fft = fft(f_adjust)
- ga_fft = fft(g_adjust)
-
- while(1):
- # Because we are working in finite precision to reduce very large polynomials,
- # we may need to perform the reduction several times.
- Size = max(53, bitsize(min(F)), bitsize(max(F)), bitsize(min(G)), bitsize(max(G)))
- if Size < size:
- break
-
- F_adjust = [elt >> (Size - 53) for elt in F]
- G_adjust = [elt >> (Size - 53) for elt in G]
- Fa_fft = fft(F_adjust)
- Ga_fft = fft(G_adjust)
-
- den_fft = add_fft(mul_fft(fa_fft, adj_fft(fa_fft)), mul_fft(ga_fft, adj_fft(ga_fft)))
- num_fft = add_fft(mul_fft(Fa_fft, adj_fft(fa_fft)), mul_fft(Ga_fft, adj_fft(ga_fft)))
- k_fft = div_fft(num_fft, den_fft)
- k = ifft(k_fft)
- k = [int(round(elt)) for elt in k]
- if all(elt == 0 for elt in k):
- break
-
- fk = karamul(f, k)
- gk = karamul(g, k)
- for i in range(n):
- F[i] -= fk[i] << (Size - size)
- G[i] -= gk[i] << (Size - size)
- return F, G
-
-
-def xgcd(b, n):
- """Compute the extended GCD of two integers b and n.
-
- Return d, u, v such that d = u * b + v * n, and d is the GCD of b, n.
- """
- x0, x1, y0, y1 = 1, 0, 0, 1
- while n != 0:
- q, b, n = b // n, n, b % n
- x0, x1 = x1, x0 - q * x1
- y0, y1 = y1, y0 - q * y1
- return b, x0, y0
-
-
-def ntru_solve(f, g):
- """Solve the NTRU equation for f and g.
-
- Corresponds to algorithm 6 (NTRUSolve) of Falcon's documentation.
- """
- n = len(f)
- if n == 1:
- f0 = f[0]
- g0 = g[0]
- d, u, v = xgcd(f0, g0)
- if d != 1:
- raise ValueError
- else:
- return [- q * v], [q * u]
- else:
- fp = field_norm(f)
- gp = field_norm(g)
- Fp, Gp = ntru_solve(fp, gp)
- F = karamul(lift(Fp), galois_conjugate(g))
- G = karamul(lift(Gp), galois_conjugate(f))
- F, G = reduce(f, g, F, G)
- return F, G
-
-
-def gs_norm(f, g, q):
- """Compute the squared Gram-Schmidt norm of the NTRU matrix generated by f, g.
-
- This matrix is [[g, - f], [G, - F]].
- This algorithm is equivalent to line 9 of algorithm 5 (NTRUGen).
- """
- sqnorm_fg = sqnorm([f, g])
- ffgg = add(mul(f, adj(f)), mul(g, adj(g)))
- Ft = div(adj(g), ffgg)
- Gt = div(adj(f), ffgg)
- sqnorm_FG = (q ** 2) * sqnorm([Ft, Gt])
- return max(sqnorm_fg, sqnorm_FG)
-
-
-def ntru_gen(n):
- """Implement the algorithm 5 (NTRUGen) of Falcon's documentation.
-
- At the end of the function, polynomials f, g, F, G in Z[x]/(x ** n + 1)
- are output, which verify f * G - g * F = 1 mod (x ** n + 1).
- """
- while True:
- sigma = 1.17 * sqrt(q / (2. * n))
- f = [int(round(gauss(0, sigma))) for i in range(n)]
- g = [int(round(gauss(0, sigma))) for i in range(n)]
- try:
- h = div_zq(g, f)
- F, G = ntru_solve(f, g)
- if gs_norm(f, g, q) < (1.17 ** 2) * q:
- F = [int(coef) for coef in F]
- G = [int(coef) for coef in G]
- return f, g, F, G
- # If f is not invertible, a ZeroDivisionError is raised
- # If the NTRU equation cannot be solved, a ValueError is raised
- # In both cases, we start again
- except (ZeroDivisionError, ValueError):
- continue
diff --git a/code/falcon/ntt.py b/code/falcon/ntt.py
deleted file mode 100755
index ad8a22b..0000000
--- a/code/falcon/ntt.py
+++ /dev/null
@@ -1,173 +0,0 @@
-"""This file contains an implementation of the NTT.
-
-The NTT implemented here is for polynomials in Z_q[x]/(phi), with:
-- The integer modulus q = 12 * 1024 + 1 = 12289
-- The polynomial modulus phi = x ** n + 1, with n a power of two, n =< 1024
-
-The code is voluntarily very similar to the code of the FFT.
-It is probably possible to use templating to merge both implementations.
-"""
-from falcon.common import split, merge, q # Import split and merge
-from falcon.ntt_constants import roots_dict_Zq, inv_mod_q # Import constants useful for the FFT
-
-
-"""i2 is the inverse of 2 mod q."""
-i2 = 6145
-
-
-""" sqr1 is a square root of (-1) mod q (currently, sqr1 = 1479)."""
-sqr1 = roots_dict_Zq[2][0]
-
-
-def split_ntt(f_ntt):
- """Split a polynomial f in two or three polynomials.
-
- Args:
- f_ntt: a polynomial
-
- Format: NTT
- """
- n = len(f_ntt)
- w = roots_dict_Zq[n]
- f0_ntt = [0] * (n // 2)
- f1_ntt = [0] * (n // 2)
- for i in range(n // 2):
- f0_ntt[i] = (i2 * (f_ntt[2 * i] + f_ntt[2 * i + 1])) % q
- f1_ntt[i] = (i2 * (f_ntt[2 * i] - f_ntt[2 * i + 1]) * inv_mod_q[w[2 * i]]) % q
- return [f0_ntt, f1_ntt]
-
-
-def merge_ntt(f_list_ntt):
- """Merge two or three polynomials into a single polynomial f.
-
- Args:
- f_list_ntt: a list of polynomials
-
- Format: NTT
- """
- f0_ntt, f1_ntt = f_list_ntt
- n = 2 * len(f0_ntt)
- w = roots_dict_Zq[n]
- f_ntt = [0] * n
- for i in range(n // 2):
- f_ntt[2 * i + 0] = (f0_ntt[i] + w[2 * i] * f1_ntt[i]) % q
- f_ntt[2 * i + 1] = (f0_ntt[i] - w[2 * i] * f1_ntt[i]) % q
- return f_ntt
-
-
-def ntt(f):
- """Compute the NTT of a polynomial.
-
- Args:
- f: a polynomial
-
- Format: input as coefficients, output as NTT
- """
- n = len(f)
- if (n > 2):
- f0, f1 = split(f)
- f0_ntt = ntt(f0)
- f1_ntt = ntt(f1)
- f_ntt = merge_ntt([f0_ntt, f1_ntt])
- elif (n == 2):
- f_ntt = [0] * n
- f_ntt[0] = (f[0] + sqr1 * f[1]) % q
- f_ntt[1] = (f[0] - sqr1 * f[1]) % q
- return f_ntt
-
-
-def intt(f_ntt):
- """Compute the inverse NTT of a polynomial.
-
- Args:
- f_ntt: a NTT of a polynomial
-
- Format: input as NTT, output as coefficients
- """
- n = len(f_ntt)
- if (n > 2):
- f0_ntt, f1_ntt = split_ntt(f_ntt)
- f0 = intt(f0_ntt)
- f1 = intt(f1_ntt)
- f = merge([f0, f1])
- elif (n == 2):
- f = [0] * n
- f[0] = (i2 * (f_ntt[0] + f_ntt[1])) % q
- f[1] = (i2 * inv_mod_q[1479] * (f_ntt[0] - f_ntt[1])) % q
- return f
-
-
-def add_zq(f, g):
- """Addition of two polynomials (coefficient representation)."""
- assert len(f) == len(g)
- deg = len(f)
- return [(f[i] + g[i]) % q for i in range(deg)]
-
-
-def neg_zq(f):
- """Negation of a polynomials (any representation)."""
- deg = len(f)
- return [(- f[i]) % q for i in range(deg)]
-
-
-def sub_zq(f, g):
- """Substraction of two polynomials (any representation)."""
- return add_zq(f, neg_zq(g))
-
-
-def mul_zq(f, g):
- """Multiplication of two polynomials (coefficient representation)."""
- return intt(mul_ntt(ntt(f), ntt(g)))
-
-
-def div_zq(f, g):
- """Division of two polynomials (coefficient representation)."""
- try:
- return intt(div_ntt(ntt(f), ntt(g)))
- except ZeroDivisionError:
- raise
-
-
-# def adj(f):
-# """Ajoint of a polynomial (coefficient representation)."""
-# return intt(adj_ntt(ntt(f)))
-
-
-def add_ntt(f_ntt, g_ntt):
- """Addition of two polynomials (NTT representation)."""
- return add_zq(f_ntt, g_ntt)
-
-
-def sub_ntt(f_ntt, g_ntt):
- """Substraction of two polynomials (NTT representation)."""
- return sub_zq(f_ntt, g_ntt)
-
-
-def mul_ntt(f_ntt, g_ntt):
- """Multiplication of two polynomials (coefficient representation)."""
- assert len(f_ntt) == len(g_ntt)
- deg = len(f_ntt)
- return [(f_ntt[i] * g_ntt[i]) % q for i in range(deg)]
-
-
-def div_ntt(f_ntt, g_ntt):
- """Division of two polynomials (NTT representation)."""
- assert len(f_ntt) == len(g_ntt)
- deg = len(f_ntt)
- if any(elt == 0 for elt in g_ntt):
- raise ZeroDivisionError
- return [(f_ntt[i] * inv_mod_q[g_ntt[i]]) % q for i in range(deg)]
-
-
-# def adj_ntt(f_ntt):
-# """Ajoint of a polynomial (NTT representation)."""
-# deg = len(f_ntt)
-# return [f_ntt[i].conjugate() for i in range(deg)]
-
-
-"""This value is the ratio between:
- - The degree n
- - The number of complex coefficients of the NTT
-While here this ratio is 1, it is possible to develop a short NTT such that it is 2.
-"""
-ntt_ratio = 1
diff --git a/code/falcon/ntt_constants.py b/code/falcon/ntt_constants.py
deleted file mode 100755
index 60165fa..0000000
--- a/code/falcon/ntt_constants.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""Docstring."""
-
-"""Roots of phi_4 = x^2 + 1.
-The second root is the conjugates of the first one.
-"""
-phi4_roots_Zq = [1479, 10810]
-
-
-"""Roots of phi_8 = x^4 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi8_roots_Zq = [4043, 8246, 5146, 7143]
-
-
-"""Roots of phi_16 = x^8 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi16_roots_Zq = [5736, 6553, 4134, 8155, 722, 11567, 1305, 10984]
-
-
-"""Roots of phi_32 = x^16 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi32_roots_Zq = [1646, 10643, 1212, 11077, 5860, 6429, 3195, 9094, 2545, 9744, 3621, 8668, 3504, 8785, 3542, 8747]
-
-
-"""Roots of phi_64 = x^32 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi64_roots_Zq = [4591, 7698, 5728, 6561, 5023, 7266, 5828, 6461, 4978, 7311, 1351, 10938, 3328, 8961, 5777, 6512, 2975, 9314, 563, 11726, 3006, 9283, 2744, 9545, 949, 11340, 2625, 9664, 4821, 7468, 2639, 9650]
-
-
-"""Roots of phi_128 = x^64 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi128_roots_Zq = [1000, 11289, 4320, 7969, 3091, 9198, 81, 12208, 2963, 9326, 4896, 7393, 3051, 9238, 2366, 9923, 1853, 10436, 140, 12149, 4611, 7678, 726, 11563, 4255, 8034, 1177, 11112, 2768, 9521, 1635, 10654, 3712, 8577, 3135, 9154, 2747, 9542, 4846, 7443, 3553, 8736, 4805, 7484, 2294, 9995, 1062, 11227, 1326, 10963, 5086, 7203, 3014, 9275, 3201, 9088, 1170, 11119, 2319, 9970, 955, 11334, 790, 11499]
-
-
-"""Roots of phi_256 = x^128 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi256_roots_Zq = [544, 11745, 5791, 6498, 339, 11950, 2468, 9821, 2842, 9447, 480, 11809, 9, 12280, 1022, 11267, 4278, 8011, 1673, 10616, 4989, 7300, 5331, 6958, 3584, 8705, 4177, 8112, 1381, 10908, 2525, 9764, 2396, 9893, 4452, 7837, 3296, 8993, 3949, 8340, 130, 12159, 4354, 7935, 5374, 6915, 2837, 9452, 5767, 6522, 827, 11462, 3748, 8541, 953, 11336, 5067, 7222, 2197, 10092, 118, 12171, 2476, 9813, 2548, 9741, 4231, 8058, 355, 11934, 3382, 8907, 3707, 8582, 1759, 10530, 3694, 8595, 5179, 7110, 5542, 6747, 145, 12144, 3637, 8652, 3459, 8830, 5911, 6378, 4890, 7399, 3932, 8357, 2731, 9558, 2089, 10200, 5092, 7197, 2881, 9408, 3284, 9005, 729, 11560, 3241, 9048, 3289, 9000, 2013, 10276, 5755, 6534, 4632, 7657, 1260, 11029, 4388, 7901, 334, 11955, 2426, 9863, 1696, 10593, 1428, 10861]
-
-
-"""Roots of phi_512 = x^256 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi512_roots_Zq = [1663, 10626, 1777, 10512, 1426, 10863, 4654, 7635, 5291, 6998, 2704, 9585, 4938, 7351, 3636, 8653, 3915, 8374, 2166, 10123, 113, 12176, 4919, 7370, 3, 12286, 4437, 7852, 160, 12129, 3149, 9140, 4057, 8232, 3271, 9018, 1689, 10600, 3364, 8925, 4372, 7917, 2174, 10115, 4414, 7875, 2847, 9442, 2645, 9644, 4053, 8236, 2305, 9984, 5042, 7247, 5195, 7094, 2780, 9509, 1484, 10805, 4895, 7394, 3016, 9273, 243, 12046, 3000, 9289, 671, 11618, 3136, 9153, 5191, 7098, 2399, 9890, 3400, 8889, 2178, 10111, 1544, 10745, 420, 11869, 5559, 6730, 476, 11813, 3531, 8758, 3985, 8304, 4905, 7384, 5332, 6957, 3510, 8779, 2370, 9919, 2865, 9424, 2969, 9320, 3978, 8311, 2686, 9603, 3247, 9042, 4048, 8241, 2249, 10040, 1153, 11136, 2884, 9405, 5407, 6882, 3186, 9103, 1630, 10659, 2126, 10163, 2187, 10102, 2566, 9723, 2422, 9867, 6039, 6250, 2987, 9302, 6022, 6267, 2437, 9852, 3646, 8643, 875, 11414, 3780, 8509, 1607, 10682, 4976, 7313, 5011, 7278, 1002, 11287, 4284, 8005, 5088, 7201, 3248, 9041, 1207, 11082, 1168, 11121, 5277, 7012, 1065, 11224, 2143, 10146, 404, 11885, 4645, 7644, 1912, 10377, 1378, 10911, 435, 11854, 4337, 7952, 2381, 9908, 5444, 6845, 4096, 8193, 493, 11796, 545, 11744, 5019, 7270, 3704, 8585, 2678, 9611, 1537, 10752, 242, 12047, 4714, 7575, 4143, 8146, 27, 12262, 3066, 9223, 3763, 8526, 1440, 10849, 5084, 7205, 1632, 10657, 1017, 11272, 4885, 7404, 3778, 8511, 3833, 8456, 390, 11899, 773, 11516, 2401, 9888, 442, 11847, 5101, 7188, 1067, 11222, 2912, 9377, 5698, 6591, 354, 11935, 4861, 7428, 2859, 9430, 1045, 11244, 5012, 7277, 2481, 9808]
-
-
-"""Roots of phi_1024 = x^512 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi1024_roots_Zq = [3957, 8332, 2839, 9450, 2127, 10162, 151, 12138, 431, 11858, 1579, 10710, 5906, 6383, 2505, 9784, 1323, 10966, 2766, 9523, 52, 12237, 3174, 9115, 6055, 6234, 3336, 8953, 677, 11612, 5874, 6415, 4169, 8120, 3127, 9162, 5241, 7048, 2920, 9369, 1010, 11279, 5468, 6821, 787, 11502, 3482, 8807, 1321, 10968, 192, 12097, 4912, 7377, 2049, 10240, 4698, 7591, 5057, 7232, 4780, 7509, 3445, 8844, 1956, 10333, 5009, 7280, 6008, 6281, 885, 11404, 3532, 8757, 1003, 11286, 58, 12231, 241, 12048, 975, 11314, 4212, 8077, 2844, 9445, 3438, 8851, 1105, 11184, 142, 12147, 5681, 6608, 3477, 8812, 2302, 9987, 605, 11684, 4213, 8076, 504, 11785, 5886, 6403, 4782, 7507, 5594, 6695, 3029, 9260, 421, 11868, 4080, 8209, 6068, 6221, 3602, 8687, 6077, 6212, 4624, 7665, 3263, 9026, 3600, 8689, 4948, 7341, 6137, 6152, 400, 11889, 1728, 10561, 5862, 6427, 6136, 6153, 5415, 6874, 3643, 8646, 56, 12233, 3199, 9090, 5206, 7083, 5529, 6760, 3565, 8724, 654, 11635, 1987, 10302, 1702, 10587, 3988, 8301, 468, 11821, 316, 11973, 382, 11907, 3710, 8579, 6093, 6196, 5446, 6843, 5339, 6950, 973, 11316, 1254, 11035, 1359, 10930, 5435, 6854, 2033, 10256, 3998, 8291, 3879, 8410, 1922, 10367, 3860, 8429, 5445, 6844, 4536, 7753, 1050, 11239, 3818, 8471, 6118, 6171, 1190, 11099, 2683, 9606, 3789, 8500, 147, 12142, 5456, 6833, 4449, 7840, 4749, 7540, 5537, 6752, 4789, 7500, 4467, 7822, 1018, 11271, 5925, 6364, 1041, 11248, 3514, 8775, 2344, 9945, 1278, 11011, 5574, 6715, 1973, 10316, 4324, 7965, 4916, 7373, 4075, 8214, 5315, 6974, 5079, 7210, 3262, 9027, 522, 11767, 2169, 10120, 1200, 11089, 5184, 7105, 2555, 9734, 6122, 6167, 5297, 6992, 6119, 6170, 3956, 8333, 1360, 10929, 1962, 10327, 1594, 10695, 5961, 6328, 5106, 7183, 4298, 7991, 3329, 8960, 168, 12121, 2692, 9597, 4049, 8240, 3728, 8561, 1159, 11130, 5990, 6299, 948, 11341, 1146, 11143, 1404, 10885, 325, 11964, 5766, 6523, 652, 11637, 295, 11994, 6099, 6190, 2919, 9370, 3762, 8527, 4016, 8273, 4077, 8212, 6065, 6224, 835, 11454, 3570, 8719, 4240, 8049, 4046, 8243, 709, 11580, 3150, 9139, 1319, 10970, 1058, 11231, 4079, 8210, 922, 11367, 441, 11848, 4322, 7967, 1958, 10331, 2078, 10211, 1112, 11177, 3834, 8455, 5257, 7032, 4433, 7856, 5919, 6370, 5486, 6803, 3054, 9235, 1747, 10542, 3123, 9166, 2948, 9341, 2503, 9786, 5782, 6507, 1566, 10723, 64, 12225, 3656, 8633, 2459, 9830, 683, 11606, 1293, 10996, 4737, 7552, 5429, 6860, 4774, 7515, 5908, 6381, 453, 11836, 418, 11871, 3772, 8517, 3991, 8298, 3969, 8320, 2767, 9522, 156, 12133, 2281, 10008, 5876, 6413, 5333, 6956, 2031, 10258, 3963, 8326, 576, 11713, 2447, 9842, 6142, 6147, 2051, 10238, 1954, 10335, 1805, 10484, 2882, 9407, 3529, 8760, 3434, 8855, 2908, 9381, 218, 12071, 3030, 9259, 4115, 8174, 1843, 10446, 2361, 9928, 3202, 9087, 4493, 7796, 2057, 10232, 5369, 6920, 1512, 10777, 350, 11939, 1815, 10474, 5383, 6906, 49, 12240, 1263, 11026, 5915, 6374, 1483, 10806, 1489, 10800, 2500, 9789, 5942, 6347, 1583, 10706, 1693, 10596, 3009, 9280, 174, 12115, 723, 11566, 2738, 9551, 5868, 6421, 5735, 6554, 2655, 9634, 3315, 8974, 426, 11863, 4754, 7535, 1858, 10431, 1975, 10314, 3757, 8532, 2925, 9364, 347, 11942]
-
-
-"""Roots of phi_2048 = x^1024 + 1
-The second half of the roots are is the conjugates of the first half.
-"""
-phi2048_roots_Zq = [1826, 10463, 2926, 9363, 3171, 9118, 4489, 7800, 3238, 9051, 3708, 8581, 1136, 11153, 3449, 8840, 1092, 11197, 5209, 7080, 3359, 8930, 3205, 9084, 1928, 10361, 464, 11825, 4265, 8024, 3678, 8611, 3163, 9126, 4032, 8257, 4840, 7449, 6127, 6162, 2068, 10221, 1389, 10900, 4404, 7885, 346, 11943, 1526, 10763, 4222, 8067, 125, 12164, 540, 11749, 3368, 8921, 4227, 8062, 612, 11677, 4238, 8051, 1866, 10423, 5211, 7078, 4727, 7562, 1208, 11081, 3448, 8841, 343, 11946, 1908, 10381, 4538, 7751, 416, 11873, 814, 11475, 2450, 9839, 1705, 10584, 2164, 10125, 5416, 6873, 2110, 10179, 716, 11573, 2429, 9860, 4103, 8186, 1721, 10568, 1536, 10753, 1373, 10916, 2982, 9307, 3589, 8700, 717, 11572, 3278, 9011, 5993, 6296, 5412, 6877, 4209, 8080, 3515, 8774, 438, 11851, 5061, 7228, 1218, 11071, 2275, 10014, 2461, 9828, 5653, 6636, 4267, 8022, 3765, 8524, 1518, 10771, 4176, 8113, 5063, 7226, 3534, 8755, 3961, 8328, 4145, 8144, 1756, 10533, 5826, 6463, 2065, 10224, 4564, 7725, 3495, 8794, 3114, 9175, 2769, 9520, 5966, 6323, 212, 12077, 5596, 6693, 5987, 6302, 579, 11710, 3889, 8400, 1131, 11158, 1445, 10844, 4860, 7429, 1125, 11164, 5734, 6555, 1176, 11113, 1275, 11014, 5508, 6781, 5102, 7187, 412, 11877, 5845, 6444, 5588, 6701, 4963, 7326, 3744, 8545, 2528, 9761, 3056, 9233, 4505, 7784, 2257, 10032, 1417, 10872, 5676, 6613, 3087, 9202, 5835, 6454, 4883, 7406, 3975, 8314, 4781, 7508, 4924, 7365, 448, 11841, 1014, 11275, 3942, 8347, 5232, 7057, 1327, 10962, 3607, 8682, 5836, 6453, 4566, 7723, 68, 12221, 2260, 10029, 3200, 9089, 1535, 10754, 60, 12229, 2717, 9572, 3343, 8946, 4119, 8170, 2151, 10138, 1522, 10767, 20, 12269, 5002, 7287, 5163, 7126, 4608, 7681, 3654, 8635, 2894, 9395, 1314, 10975, 1744, 10545, 2455, 9834, 5690, 6599, 338, 11951, 3947, 8342, 4939, 7350, 5115, 7174, 2442, 9847, 1248, 11041, 3959, 8330, 5797, 6492, 2148, 10141, 5959, 6330, 1892, 10397, 3624, 8665, 5598, 6691, 3344, 8945, 1029, 11260, 1945, 10344, 5724, 6565, 1325, 10964, 923, 11366, 1038, 11251, 6085, 6204, 4167, 8122, 2231, 10058, 6092, 6197, 193, 12096, 2800, 9489, 1836, 10453, 425, 11864, 2185, 10104, 392, 11897, 375, 11914, 1620, 10669, 4578, 7711, 377, 11912, 2776, 9513, 1178, 11111, 3511, 8778, 5478, 6811, 3408, 8881, 1942, 10347, 1165, 11124, 2575, 9714, 1255, 11034, 506, 11783, 5784, 6505, 1392, 10897, 3276, 9013, 3338, 8951, 2212, 10077, 2674, 9615, 1236, 11053, 3017, 9272, 5246, 7043, 4475, 7814, 4705, 7584, 3121, 9168, 2600, 9689, 1057, 11232, 1226, 11063, 5518, 6771, 4739, 7550, 4251, 8038, 3028, 9261, 5216, 7073, 2360, 9929, 364, 11925, 2054, 10235, 2483, 9806, 3042, 9247, 1344, 10945, 463, 11826, 3407, 8882, 1468, 10821, 3981, 8308, 204, 12085, 5509, 6780, 5219, 7070, 1409, 10880, 2689, 9600, 4605, 7684, 4138, 8151, 180, 12109, 4499, 7790, 5672, 6617, 622, 11667, 1737, 10552, 5609, 6680, 636, 11653, 3982, 8307, 2947, 9342, 4335, 7954, 3393, 8896, 2291, 9998, 3375, 8914, 4235, 8054, 3825, 8464, 4913, 7376, 3528, 8761, 2900, 9389, 239, 12050, 994, 11295, 4554, 7735, 512, 11777, 4670, 7619, 5464, 6825, 4906, 7383, 406, 11883, 1687, 10602, 5268, 7021, 146, 12143, 5189, 7100, 6094, 6195, 1403, 10886, 1804, 10485, 1842, 10447, 3840, 8449, 72, 12217, 4113, 8176, 4352, 7937, 2828, 9461, 2712, 9577, 4834, 7455, 2643, 9646, 1095, 11194, 3045, 9244, 5781, 6508, 1241, 11048, 4378, 7911, 3451, 8838, 4094, 8195, 3020, 9269, 5673, 6616, 5406, 6883, 4665, 7624, 4770, 7519, 944, 11345, 3669, 8620, 5287, 7002, 1251, 11038, 5410, 6879, 5275, 7014, 1790, 10499, 1040, 11249, 2035, 10254, 1882, 10407, 6125, 6164, 3815, 8474, 1734, 10555, 1350, 10939, 5832, 6457, 3869, 8420, 4423, 7866, 1530, 10759, 1694, 10595, 2209, 10080, 1763, 10526, 3116, 9173, 189, 12100, 1279, 11010, 865, 11424, 5170, 7119, 2672, 9617, 2730, 9559, 5411, 6878, 2253, 10036, 1868, 10421, 4518, 7771, 3094, 9195, 1160, 11129, 4820, 7469, 4974, 7315, 4565, 7724, 5078, 7211, 1783, 10506, 2840, 9449, 2478, 9811, 4194, 8095, 3019, 9270, 5118, 7171, 502, 11787, 1901, 10388, 2602, 9687, 6063, 6226, 3793, 8496, 1573, 10716, 3846, 8443, 1030, 11259, 466, 11823, 3821, 8468, 1681, 10608, 5969, 6320, 4649, 7640, 2929, 9360, 6026, 6263, 2434, 9855, 791, 11498, 2827, 9462, 2873, 9416, 1120, 11169, 2535, 9754, 21, 12268, 5808, 6481, 170, 12119, 5650, 6639, 874, 11415, 2301, 9988, 648, 11641, 150, 12139, 2307, 9982, 4289, 8000, 3317, 8972, 2532, 9757, 3332, 8957, 139, 12150, 2940, 9349, 2046, 10243, 1481, 10808, 2957, 9332, 1701, 10588, 3466, 8823, 4697, 7592, 3578, 8711, 2626, 9663, 530, 11759, 778, 11511, 4504, 7785, 4390, 7899, 4218, 8071, 3758, 8531, 3454, 8835, 982, 11307, 2276, 10013, 2593, 9696, 879, 11410, 8, 12281, 457, 11832, 4301, 7988, 4523, 7766, 1849, 10440, 5776, 6513, 3268, 9021, 3795, 8494, 4719, 7570, 751, 11538, 910, 11379, 5900, 6389, 3065, 9224, 1506, 10783, 4483, 7806, 5703, 6586, 5043, 7246, 826, 11463, 1398, 10891, 3090, 9199, 5789, 6500, 3502, 8787, 5618, 6671, 1658, 10631, 4684, 7605, 3360, 8929, 63, 12226, 5135, 7154, 2373, 9916, 4987, 7302, 3670, 8619, 3808, 8481, 578, 11711, 5368, 6921, 450, 11839, 1944, 10345, 2622, 9667, 5386, 6903, 510, 11779, 4661, 7628, 1280, 11009, 614, 11675, 24, 12265, 1371, 10918, 5039, 7250, 5547, 6742, 904, 11385, 2485, 9804, 1927, 10362, 1015, 11274, 881, 11408, 365, 11924, 4510, 7779, 2637, 9652, 2946, 9343, 5461, 6828, 2334, 9955, 1223, 11066, 4411, 7878, 1590, 10699, 1802, 10487, 1555, 10734, 5103, 7186, 1891, 10398, 3469, 8820, 6138, 6151, 4443, 7846, 3418, 8871, 417, 11872, 2293, 9996, 4693, 7596, 2338, 9951, 3572, 8717, 1282, 11007, 2021, 10268, 2832, 9457, 3929, 8360, 1706, 10583, 3229, 9060, 4730, 7559, 3120, 9169, 6105, 6184, 6086, 6203, 5646, 6643, 3753, 8536, 3941, 8348, 3536, 8753, 5370, 6919, 7, 12282, 1936, 10353, 845, 11444, 3723, 8566, 3154, 9135, 5054, 7235, 3285, 9004, 4360, 7929, 769, 11520, 5526, 6763, 50, 12239, 216, 12073, 4153, 8136, 2213, 10076, 3805, 8484, 767, 11522, 2633, 9656, 1406, 10883, 5349, 6940, 2945, 9344, 3232, 9057, 293, 11996, 4855, 7434, 3769, 8520, 4099, 8190, 3944, 8345, 5530, 6759, 5604, 6685, 3480, 8809, 2171, 10118, 1265, 11024, 3007, 9282, 5207, 7082, 4050, 8239, 5202, 7087, 844, 11445, 4590, 7699, 5082, 7207, 980, 11309, 682, 11607, 567, 11722, 2941, 9348, 5289, 7000, 5662, 6627, 3221, 9068, 4273, 8016, 3837, 8452, 2595, 9694]
-
-
-"""A dictionary of all the roots."""
-roots_dict_Zq = {2: phi4_roots_Zq,
- 4: phi8_roots_Zq,
- 8: phi16_roots_Zq,
- 16: phi32_roots_Zq,
- 32: phi64_roots_Zq,
- 64: phi128_roots_Zq,
- 128: phi256_roots_Zq,
- 256: phi512_roots_Zq,
- 512: phi1024_roots_Zq,
- 1024: phi2048_roots_Zq
- }
-
-"""The list of a^(-1) mod q, for a = 0, 1, ..., q - 1."""
-inv_mod_q = [0, 1, 6145, 8193, 9217, 2458, 10241, 8778, 10753, 2731, 1229, 5586, 11265, 2836, 4389, 9012, 11521, 6506, 7510, 3234, 6759, 2926, 2793, 6946, 11777, 7865, 1418, 9103, 8339, 10594, 4506, 7532, 11905, 1862, 3253, 9129, 3755, 7307, 1617, 9138, 9524, 4496, 1463, 6859, 7541, 3004, 3473, 8367, 12033, 1254, 10077, 6265, 709, 8811, 10696, 3575, 10314, 1078, 5297, 10831, 2253, 7454, 3766, 9168, 12097, 3025, 931, 10088, 7771, 10508, 10709, 10212, 8022, 5892, 9798, 6718, 6953, 798, 4569, 10889, 4762, 11227, 2248, 4886, 6876, 3759, 9574, 11724, 9915, 5247, 1502, 9183, 7881, 6607, 10328, 10478, 12161, 6968, 627, 4717, 11183, 5962, 9277, 8829, 6499, 3043, 10550, 9992, 5348, 8343, 7932, 6532, 5157, 11854, 539, 3847, 8793, 3046, 11560, 2685, 7271, 1625, 3727, 5595, 1883, 1573, 4584, 6967, 12193, 10479, 7657, 1970, 6610, 462, 5044, 9194, 10030, 11392, 5254, 3448, 11499, 2789, 5106, 1375, 4011, 11950, 2946, 418, 4899, 10557, 3359, 1058, 9621, 10281, 399, 6422, 8429, 5714, 11589, 2937, 2381, 6259, 11758, 2111, 1124, 5288, 2443, 3385, 3438, 5890, 8024, 8552, 4787, 10229, 5862, 11657, 11102, 11803, 8768, 1785, 751, 10999, 10736, 6581, 10085, 6377, 9448, 3943, 5164, 3056, 5239, 3024, 12225, 9169, 3484, 9201, 6458, 1310, 8503, 4014, 11736, 7459, 2981, 3269, 10783, 3357, 10559, 7599, 9394, 294, 7666, 5300, 5275, 3404, 4996, 11203, 2674, 1076, 10316, 1964, 3966, 5227, 3266, 3582, 8723, 10432, 5927, 11098, 6414, 6225, 8068, 266, 10541, 8808, 1523, 6589, 5780, 7726, 7487, 7250, 9780, 6170, 6957, 11935, 8008, 10082, 8942, 4030, 7086, 5725, 6931, 11065, 2292, 3983, 9628, 1253, 12241, 8368, 11384, 4555, 9973, 3908, 985, 8364, 3305, 4220, 231, 1749, 2522, 868, 4597, 2222, 5015, 3061, 5696, 715, 2627, 8030, 1724, 10395, 11894, 656, 7539, 6861, 2553, 7589, 6832, 5909, 8150, 4720, 5975, 6419, 1473, 2894, 209, 4624, 8594, 9765, 11423, 11878, 7824, 4491, 529, 10180, 10955, 11322, 11285, 1361, 6344, 2943, 3211, 5453, 10359, 10640, 2857, 9207, 11939, 1163, 7613, 6549, 7335, 7427, 9274, 1636, 5879, 605, 7200, 2781, 562, 6462, 2644, 7314, 7366, 10370, 7837, 9391, 1719, 3209, 2945, 12144, 4012, 8505, 4276, 8957, 8538, 9475, 11259, 7083, 2931, 1162, 11973, 9208, 5551, 8007, 12046, 6958, 4384, 895, 7037, 5922, 6520, 817, 11644, 4638, 5368, 6094, 9435, 5592, 11187, 1865, 9333, 8281, 4724, 1845, 8116, 8717, 2582, 10268, 1528, 8625, 8764, 10515, 1512, 1861, 12257, 7533, 10729, 3493, 1742, 7961, 10745, 4023, 3229, 4753, 655, 12009, 10396, 11608, 2007, 154, 5868, 10818, 9874, 2470, 7635, 7161, 7779, 5133, 11536, 1292, 7823, 11990, 11424, 6814, 9944, 3435, 4697, 9342, 147, 7391, 3833, 9370, 2650, 5026, 8782, 10583, 1702, 4576, 2498, 8651, 11746, 1112, 1337, 11693, 538, 12176, 5158, 11361, 982, 8202, 1983, 8332, 8758, 9404, 1633, 5965, 1791, 3519, 10506, 7773, 5216, 8229, 9108, 4449, 5549, 9210, 3207, 1721, 9257, 3427, 4034, 5678, 133, 7246, 11415, 6237, 4404, 1421, 6906, 10219, 9439, 6001, 2890, 9561, 3863, 9469, 9888, 979, 3625, 2309, 4890, 3398, 3085, 10279, 9623, 8767, 12112, 11103, 4004, 4800, 5041, 876, 4471, 7852, 2015, 5859, 3543, 4970, 9007, 2709, 9610, 9321, 11677, 11043, 1146, 6108, 8136, 10156, 4814, 6060, 6771, 7864, 12265, 6947, 4184, 11597, 5692, 2995, 8422, 7506, 11131, 10803, 1954, 4112, 6637, 7982, 4182, 6949, 7797, 302, 2110, 12127, 6260, 6963, 7019, 6914, 1261, 595, 434, 114, 8443, 9177, 1111, 11859, 8652, 9042, 7675, 9301, 2848, 6290, 6502, 11553, 7458, 12089, 4015, 6222, 862, 8075, 11342, 10926, 5947, 9507, 328, 5828, 9914, 12202, 9575, 5115, 7421, 1771, 9939, 5897, 3416, 1008, 9099, 5685, 4075, 10074, 2360, 11249, 9132, 698, 9354, 801, 6881, 3067, 1447, 9379, 6249, 1690, 2312, 4533, 4297, 11315, 11027, 537, 11856, 1338, 5939, 2585, 3912, 7218, 8390, 10679, 6409, 325, 5090, 10062, 11622, 5186, 5661, 11042, 11787, 9322, 6825, 1119, 3172, 2410, 7616, 11614, 7750, 2533, 8871, 11283, 11324, 7688, 5320, 98, 7573, 5490, 10748, 11101, 12114, 5863, 6726, 6309, 9951, 4823, 9419, 5231, 9812, 9049, 9858, 7339, 4637, 11927, 818, 3077, 9084, 3219, 6447, 4455, 3600, 10727, 7535, 394, 281, 4751, 3231, 3655, 1322, 1320, 3657, 9935, 3683, 5008, 5185, 11681, 10063, 1194, 10840, 2912, 7004, 11376, 7749, 11670, 7617, 835, 6072, 2751, 2006, 11892, 10397, 7377, 2138, 7194, 10623, 2075, 4269, 4459, 10882, 5691, 11774, 4185, 9686, 8063, 7610, 3156, 581, 2936, 12131, 5715, 4604, 11380, 8920, 10389, 10148, 7874, 6023, 52, 3479, 10768, 2192, 2999, 6592, 275, 9663, 6513, 2961, 8751, 3260, 6528, 6553, 6153, 5822, 2390, 2319, 10007, 2684, 12171, 3047, 3295, 10862, 7645, 2796, 7457, 11738, 6503, 7077, 10809, 10811, 9536, 10285, 11247, 2362, 7027, 7067, 10101, 4058, 3183, 10503, 180, 1291, 11881, 5134, 7585, 764, 7776, 10457, 5424, 4382, 6960, 11402, 4703, 756, 4514, 7075, 6505, 12273, 9013, 9911, 10982, 11509, 2178, 7891, 6200, 871, 9711, 10125, 2177, 11517, 10983, 8156, 5399, 7759, 10974, 8521, 3123, 6472, 2788, 12149, 3449, 5198, 2464, 5804, 5503, 7148, 5335, 77, 7721, 2934, 583, 5409, 2770, 4937, 11083, 1235, 8482, 9962, 6304, 9725, 8622, 10034, 4837, 8711, 2880, 5768, 361, 646, 9213, 10056, 8981, 5995, 7242, 5712, 8431, 3407, 9005, 4972, 7323, 7862, 6773, 8493, 10917, 4671, 677, 6218, 3465, 9840, 6020, 8061, 9688, 4685, 4315, 1325, 1178, 2513, 9010, 4391, 2287, 11436, 852, 851, 11439, 2288, 6626, 1249, 8446, 10470, 5794, 5873, 6066, 556, 4215, 6813, 11877, 11991, 9766, 269, 7693, 6088, 776, 2579, 6236, 11825, 7247, 491, 7819, 4101, 5061, 7136, 5189, 4166, 8754, 4379, 9734, 4702, 11527, 6961, 6262, 9127, 3255, 7040, 10789, 7904, 357, 5253, 12152, 10031, 1531, 2608, 8470, 10259, 1497, 4554, 12031, 8369, 5799, 8919, 11586, 4605, 1295, 7748, 11616, 7005, 3774, 10773, 2037, 7858, 5857, 2017, 4550, 2839, 8348, 6211, 6191, 3623, 981, 11852, 5159, 9263, 66, 2202, 5914, 6855, 8162, 3453, 4210, 11254, 7643, 10864, 1097, 9145, 2867, 1445, 3069, 10925, 11731, 8076, 8961, 10879, 4484, 4944, 10200, 6634, 10436, 7957, 2183, 7299, 3383, 2445, 5000, 1699, 6572, 7687, 11665, 11284, 11984, 10956, 8738, 10528, 3569, 6056, 11026, 11696, 4298, 2002, 1044, 2400, 477, 8665, 927, 438, 4088, 8380, 262, 3926, 2154, 7152, 10450, 9074, 8172, 7916, 2438, 2485, 10634, 10648, 5029, 7499, 7553, 4805, 1952, 10805, 1360, 11983, 11323, 11666, 8872, 573, 3191, 3054, 5166, 4068, 6745, 5078, 10485, 2407, 4048, 3030, 8864, 9530, 10628, 3932, 2835, 12277, 5587, 9618, 11236, 2092, 7082, 11943, 9476, 2846, 9303, 7642, 11351, 4211, 3330, 3753, 9131, 11710, 2361, 11546, 10286, 977, 9890, 2056, 8580, 9463, 7357, 3991, 7343, 2091, 11262, 9619, 1060, 10043, 8929, 151, 2669, 1055, 2247, 12208, 4763, 3130, 10512, 9626, 3985, 9654, 1368, 3457, 8491, 6775, 1947, 6442, 9614, 217, 1974, 57, 6993, 10366, 2501, 10733, 8465, 6700, 2673, 12074, 4997, 4326, 1546, 4521, 8662, 9982, 9748, 10795, 10224, 1424, 941, 3145, 6083, 3251, 1864, 11921, 5593, 3729, 5961, 12189, 4718, 8152, 8056, 3111, 542, 431, 10953, 10182, 5632, 5671, 6139, 5463, 615, 9118, 3804, 10898, 10177, 164, 7002, 2914, 9672, 4957, 10493, 6101, 7519, 10932, 3037, 8702, 9593, 9855, 2875, 7030, 9268, 11114, 10835, 9093, 3505, 1708, 1245, 504, 6182, 10694, 8813, 8987, 2808, 8182, 7205, 5037, 2511, 1180, 10802, 11769, 7507, 4566, 9357, 349, 317, 4677, 9135, 6545, 6750, 9585, 11017, 7678, 10400, 6868, 1341, 10834, 11149, 9269, 10963, 845, 9777, 1156, 1488, 8411, 2597, 8293, 4003, 11802, 12113, 11658, 10749, 6413, 12062, 5928, 2225, 669, 1450, 9114, 8244, 7437, 4110, 1956, 6651, 3609, 3606, 4195, 1234, 11484, 4938, 9349, 9016, 6307, 6728, 2545, 7497, 5031, 2387, 5811, 10017, 2593, 1986, 8975, 1711, 5521, 2291, 12038, 6932, 4661, 4527, 9557, 10, 6704, 4682, 1586, 8093, 1205, 806, 3808, 1669, 5807, 10464, 3875, 3961, 7411, 3312, 10580, 1145, 11786, 11678, 5662, 856, 3844, 3114, 2660, 255, 49, 2213, 9931, 6560, 2745, 8043, 5374, 536, 11695, 11316, 6057, 8170, 9076, 6838, 3363, 9868, 9299, 7677, 11120, 9586, 8556, 7624, 10854, 9402, 8760, 7187, 4906, 9718, 10669, 5747, 4929, 9047, 9814, 6980, 8463, 10735, 12108, 752, 409, 4467, 7683, 911, 4542, 8319, 7754, 7994, 9368, 3835, 8372, 9337, 1800, 8155, 11508, 11518, 9912, 5830, 197, 3787, 6285, 10857, 8520, 11504, 7760, 2734, 7972, 10966, 661, 8633, 660, 10970, 7973, 844, 11112, 9270, 7986, 7231, 2504, 7968, 8737, 11321, 11985, 10181, 11176, 432, 597, 6351, 5420, 1173, 1456, 10038, 3502, 7547, 5688, 2591, 10019, 5065, 5835, 4821, 9953, 2743, 6562, 5360, 3036, 11157, 7520, 1483, 1003, 307, 5946, 11730, 11343, 3070, 9833, 2634, 1069, 8833, 3597, 4670, 11456, 8494, 7182, 143, 8279, 9335, 8374, 8965, 5441, 5179, 8990, 5989, 5887, 1606, 8237, 6778, 4843, 10608, 10176, 11167, 3805, 2329, 1578, 2079, 6435, 10688, 1468, 4761, 12210, 4570, 9002, 1927, 2302, 2589, 5690, 11599, 4460, 4483, 11339, 8962, 5074, 10193, 3937, 3830, 9156, 4423, 26, 3187, 7884, 467, 5384, 2064, 1096, 11349, 7644, 11557, 3296, 6166, 6282, 8519, 10976, 6286, 9401, 11013, 7625, 4866, 10520, 8335, 1630, 5765, 3264, 5229, 9421, 944, 9221, 586, 2911, 11619, 1195, 3176, 7304, 9092, 11148, 11115, 1342, 2252, 12230, 5298, 7668, 3701, 7792, 42, 5431, 10410, 9967, 1600, 1398, 7529, 9873, 11888, 5869, 292, 9396, 10756, 9683, 9535, 11549, 10810, 11550, 7078, 4768, 1359, 11287, 1953, 11768, 11132, 1181, 3879, 9658, 5753, 9678, 10223, 11195, 9749, 2029, 903, 7736, 7903, 11396, 7041, 90, 3107, 6790, 3356, 12085, 3270, 2567, 3681, 9937, 1773, 382, 10429, 3888, 2036, 11373, 3775, 2712, 7176, 2191, 11578, 3480, 234, 5701, 7180, 8496, 2020, 378, 3665, 2257, 899, 9682, 10814, 9397, 2730, 12281, 8779, 10651, 6412, 11100, 11659, 5491, 4022, 11899, 7962, 1089, 7769, 10090, 9187, 3100, 9191, 6580, 12107, 11000, 8464, 11207, 2502, 7233, 3492, 11903, 7534, 11636, 3601, 4078, 2128, 8844, 7662, 10024, 5467, 5487, 9426, 10405, 125, 7706, 6757, 3236, 9959, 1394, 10211, 12219, 10509, 7869, 8291, 2599, 7606, 1232, 4197, 2902, 3341, 8896, 4171, 3574, 12235, 8812, 11141, 6183, 2801, 10005, 2321, 1467, 10892, 6436, 6156, 8849, 6401, 1385, 4053, 8613, 6408, 11686, 8391, 6762, 8952, 4241, 2785, 4981, 38, 3152, 5746, 11007, 9719, 4311, 3059, 5017, 121, 8563, 6322, 10500, 3953, 1440, 6525, 2884, 444, 6325, 3014, 323, 6411, 10751, 8780, 5028, 11293, 10635, 3852, 9142, 6208, 3621, 6193, 2856, 11976, 10360, 9989, 7848, 3851, 10647, 11294, 2486, 9849, 9806, 8126, 3931, 11268, 9531, 10146, 10391, 2074, 11603, 7195, 8480, 1237, 6483, 6788, 3109, 8058, 7877, 4336, 4920, 3642, 3010, 3462, 10175, 10900, 4844, 3169, 8487, 10473, 8302, 2637, 6807, 6039, 589, 9978, 7401, 5415, 4505, 12260, 8340, 6684, 7288, 962, 5718, 1705, 426, 7714, 6570, 1701, 11864, 8783, 1144, 11045, 3313, 1221, 6769, 6062, 4223, 6707, 5235, 4688, 2897, 336, 9081, 457, 3033, 4258, 278, 1895, 8252, 3871, 9551, 7598, 12083, 3358, 12140, 4900, 4883, 8790, 6279, 7846, 9991, 12183, 3044, 8795, 388, 4329, 7434, 5148, 3118, 8807, 12057, 267, 9768, 2688, 6390, 8875, 10054, 9215, 8195, 8603, 8675, 8705, 3568, 11319, 8739, 4963, 2083, 6517, 4377, 8756, 8334, 10851, 4867, 569, 2351, 1511, 11908, 8765, 9625, 11224, 3131, 7868, 10708, 12220, 7772, 11841, 3520, 179, 11539, 3184, 3952, 10661, 6323, 446, 8771, 6895, 6076, 6100, 11160, 4958, 6910, 2951, 1304, 4135, 4235, 2406, 11274, 5079, 6893, 8773, 2277, 7656, 12160, 12194, 10329, 7673, 9044, 8301, 10604, 8488, 5793, 11431, 8447, 3354, 6792, 7941, 3874, 11050, 5808, 5825, 9647, 4710, 1887, 5423, 11531, 7777, 7163, 6034, 3929, 8128, 9073, 11300, 7153, 4706, 2275, 8775, 7564, 373, 4174, 7239, 9250, 3589, 9240, 8996, 7956, 11334, 6635, 4114, 5926, 12064, 8724, 3887, 10776, 383, 33, 9037, 1101, 369, 2957, 6885, 9572, 3761, 4081, 8289, 7871, 5098, 2105, 6659, 5627, 6318, 9966, 10824, 5432, 4129, 6693, 124, 10717, 9427, 7578, 1830, 6867, 11118, 7679, 7376, 11607, 11893, 12010, 1725, 4038, 2073, 10625, 10147, 11584, 8921, 2242, 7633, 2472, 2103, 5100, 7385, 3317, 8227, 5218, 5704, 10123, 9713, 7236, 2830, 9794, 5840, 7836, 11956, 7367, 8649, 2500, 11209, 6994, 8880, 3286, 1403, 9988, 10639, 11977, 5454, 5642, 2721, 5992, 8072, 5478, 3648, 4369, 9925, 5264, 5122, 7929, 7128, 3028, 4050, 5513, 1073, 5848, 9067, 2149, 7483, 1001, 1485, 522, 8178, 1200, 5639, 6383, 7672, 10477, 12195, 6608, 1972, 219, 8324, 2044, 7116, 4190, 4631, 131, 5680, 1963, 12071, 1077, 12233, 3576, 9411, 5225, 3968, 4537, 9758, 4086, 440, 3958, 9695, 1219, 3315, 7387, 7408, 5317, 7703, 5324, 5272, 8659, 9862, 9894, 4123, 9921, 9123, 8547, 7990, 976, 11246, 11547, 9537, 680, 398, 12136, 9622, 11806, 3086, 5833, 5067, 4436, 494, 6431, 920, 7740, 3792, 1527, 11912, 2583, 5941, 2034, 3890, 9517, 7354, 2539, 1496, 11387, 8471, 7348, 6347, 2024, 8400, 1515, 917, 4432, 3128, 4765, 8002, 5314, 3964, 1966, 5174, 7562, 8777, 12283, 2459, 8938, 2169, 4809, 2119, 5618, 2398, 1046, 3710, 3541, 5861, 12116, 4788, 4738, 6904, 1423, 11194, 10796, 9679, 3821, 9438, 11820, 6907, 8250, 1897, 1665, 687, 8021, 12218, 10710, 1395, 5855, 7860, 7325, 1764, 5773, 6784, 5143, 3692, 6633, 11336, 4945, 1052, 1028, 5208, 4290, 3936, 10876, 5075, 9823, 6487, 8140, 6978, 9816, 1905, 7190, 1874, 5631, 11175, 10954, 11986, 530, 163, 11166, 10899, 10609, 3463, 6220, 4017, 7479, 2053, 6672, 6721, 7268, 9771, 6104, 9490, 8526, 8210, 1565, 3446, 5256, 5242, 4813, 11782, 8137, 3373, 4827, 4911, 684, 5096, 7873, 11583, 10390, 10626, 9532, 4188, 7118, 6445, 3221, 1950, 4807, 2171, 6253, 8362, 987, 5138, 6173, 2917, 9641, 5470, 5183, 5010, 7395, 2176, 11511, 9712, 10377, 5705, 3350, 2051, 7481, 2151, 6037, 6809, 8643, 4893, 2163, 779, 773, 4399, 8405, 7432, 4331, 957, 4991, 4730, 4874, 4057, 11542, 7068, 5112, 1520, 712, 9291, 6615, 6556, 7717, 3289, 9186, 10741, 7770, 12222, 932, 6376, 12105, 6582, 8941, 12044, 8009, 8545, 9125, 6264, 12239, 1255, 2359, 11712, 4076, 3603, 4028, 8944, 7700, 7691, 271, 7275, 6360, 1193, 11621, 11682, 5091, 3749, 2816, 5646, 8980, 11469, 9214, 10535, 8876, 5933, 6452, 7470, 4559, 3367, 1902, 4657, 5449, 8928, 11233, 1061, 82, 7404, 3501, 10946, 1457, 60, 4836, 11477, 8623, 1530, 11391, 12153, 9195, 7256, 9904, 2965, 5466, 10721, 7663, 3697, 4351, 5064, 10941, 2592, 11072, 5812, 7582, 1842, 3515, 1808, 4634, 9636, 5557, 2683, 11562, 2320, 10691, 2802, 7897, 849, 854, 5664, 6767, 1223, 252, 8307, 3091, 5601, 5347, 12182, 10551, 7847, 10638, 10361, 1404, 9701, 4091, 8509, 9747, 11197, 8663, 479, 7400, 10598, 590, 7757, 5401, 3907, 12029, 4556, 9898, 726, 2283, 1599, 10823, 10411, 6319, 6163, 6303, 11481, 8483, 1393, 10712, 3237, 9417, 4825, 3375, 2742, 10937, 4822, 11653, 6310, 3839, 2462, 5200, 3661, 3434, 11875, 6815, 4503, 5417, 5896, 11719, 1772, 10779, 3682, 11626, 3658, 6567, 6559, 11033, 2214, 578, 1041, 744, 5263, 10350, 4370, 7443, 9122, 10291, 4124, 8146, 9599, 5901, 5246, 12201, 11725, 5829, 10981, 11519, 9014, 9351, 160, 6031, 8576, 2964, 10027, 7257, 1215, 6479, 6466, 725, 9971, 4557, 7472, 4122, 10293, 9863, 6670, 2055, 11244, 978, 11813, 9470, 8387, 7949, 8053, 1803, 1016, 8242, 9116, 617, 4674, 5742, 5541, 2469, 11887, 10819, 7530, 4508, 7158, 9298, 11020, 3364, 7557, 7417, 6669, 9893, 10294, 8660, 4523, 7338, 11647, 9050, 2874, 11153, 9594, 7441, 4372, 993, 9805, 10632, 2487, 7000, 166, 8905, 960, 7290, 7965, 6019, 11451, 3466, 8313, 8475, 2560, 8408, 2633, 10923, 3071, 5, 2049, 3352, 8449, 2341, 7090, 793, 6486, 10191, 5076, 6747, 2414, 403, 4655, 1904, 10187, 6979, 11003, 9048, 11649, 5232, 3594, 8082, 7098, 8125, 10631, 9850, 994, 1656, 2441, 5290, 5278, 6717, 12215, 5893, 6354, 5839, 10373, 2831, 7712, 428, 3639, 1922, 1081, 1557, 5057, 1330, 4322, 6272, 7843, 6169, 12049, 7251, 1155, 11110, 846, 3280, 9582, 7517, 6103, 10166, 7269, 2687, 10539, 268, 11422, 11992, 8595, 5658, 7139, 9173, 9631, 4085, 10308, 4538, 621, 3419, 4489, 7826, 2824, 4934, 2028, 10794, 11196, 9983, 8510, 5560, 1212, 4793, 8955, 4278, 3746, 3812, 9731, 5427, 284, 4701, 11404, 4380, 5426, 9738, 3813, 2453, 3882, 4859, 8621, 11479, 6305, 9018, 1508, 8609, 4310, 10668, 11008, 4907, 8086, 3490, 7235, 10376, 10124, 11512, 872, 6054, 3571, 376, 2022, 6349, 599, 8378, 4090, 9986, 1405, 6600, 1347, 2271, 1218, 10304, 3959, 3877, 1183, 3997, 1584, 4684, 11448, 8062, 11595, 4186, 9534, 10813, 10757, 900, 3820, 10222, 10797, 5754, 4355, 5759, 5738, 4956, 11162, 2915, 6175, 6243, 4262, 8038, 4746, 9287, 6512, 11573, 276, 4260, 6245, 5752, 10799, 3880, 2455, 1367, 11221, 3986, 1687, 5483, 4978, 6475, 4709, 10461, 5826, 330, 4976, 5485, 5469, 10131, 2918, 422, 7264, 5556, 10010, 4635, 7341, 3993, 4084, 9760, 9174, 1252, 12035, 3984, 11223, 10513, 8766, 11805, 10280, 12137, 1059, 11235, 11263, 5588, 1085, 216, 11214, 6443, 7120, 9320, 11789, 2710, 3777, 6731, 2281, 728, 119, 5019, 2520, 1751, 5900, 9918, 8147, 2844, 9478, 7440, 9854, 11154, 8703, 8677, 8264, 9062, 4477, 8555, 11016, 11121, 6751, 7516, 9774, 3281, 499, 2680, 8513, 1518, 5114, 11723, 12203, 3760, 10421, 6886, 8384, 6646, 1933, 6298, 6404, 2973, 6724, 5865, 3862, 11816, 2891, 1535, 9, 11061, 4528, 1317, 4318, 6679, 7597, 10561, 3872, 7943, 8913, 2335, 1353, 5728, 1258, 4247, 9238, 3591, 6710, 6216, 679, 10284, 11548, 10812, 9684, 4187, 10145, 10627, 11269, 8865, 7709, 8734, 5613, 4495, 12249, 9139, 5445, 9088, 6879, 803, 7353, 10263, 3891, 3389, 6160, 8566, 6337, 5304, 6925, 5088, 327, 11728, 5948, 8047, 1615, 7309, 5816, 789, 141, 7184, 8859, 9362, 22, 5344, 4643, 734, 4833, 8525, 10164, 6105, 1597, 2285, 4393, 4501, 6817, 7108, 3301, 1151, 4108, 7439, 9596, 2845, 11258, 11944, 8539, 2230, 6644, 8386, 9887, 11814, 3864, 4481, 4462, 2537, 7356, 11241, 8581, 8113, 5052, 1915, 2496, 4578, 3557, 8356, 1023, 13, 7901, 7738, 922, 3942, 12103, 6378, 4141, 2692, 2812, 1032, 2987, 548, 6000, 11819, 10220, 3822, 5591, 11923, 6095, 1648, 314, 3083, 3400, 3141, 7577, 10404, 10718, 5488, 7575, 3143, 943, 10845, 5230, 11651, 4824, 9957, 3238, 2433, 1137, 5260, 5224, 10312, 3577, 815, 6522, 9027, 5763, 1632, 11846, 8759, 11012, 10855, 6287, 472, 2729, 10755, 10815, 293, 12081, 7600, 1718, 11954, 7838, 6742, 8091, 1588, 8949, 3652, 7513, 4546, 7009, 5574, 6248, 11702, 1448, 671, 5286, 1126, 2618, 6115, 2157, 2649, 11868, 3834, 10989, 7995, 6937, 3896, 5529, 21, 9497, 8860, 8257, 5205, 348, 11128, 4567, 800, 11707, 699, 159, 9909, 9015, 11081, 4939, 5944, 309, 9079, 338, 146, 11872, 4698, 5459, 5378, 1799, 10986, 8373, 10912, 8280, 11919, 1866, 5405, 6782, 5775, 718, 3539, 3712, 2384, 2263, 6824, 11676, 11788, 9611, 7121, 8223, 5884, 2724, 5566, 5023, 6735, 7096, 8084, 4909, 4829, 202, 9021, 8709, 4839, 7641, 11256, 2847, 11742, 7676, 11019, 9869, 7159, 7637, 6596, 517, 3868, 6614, 10096, 713, 5698, 6511, 9665, 4747, 45, 8817, 7698, 8946, 3395, 8646, 1678, 8828, 12187, 5963, 1635, 11967, 7428, 3670, 7985, 10962, 11113, 11150, 7031, 7049, 191, 65, 11359, 5160, 1944, 8240, 1018, 3426, 11831, 1722, 8032, 6928, 1356, 1133, 3588, 10441, 7240, 5997, 5789, 105, 1740, 3495, 117, 730, 8995, 10439, 3590, 9542, 4248, 9097, 1010, 7124, 189, 7051, 7977, 1623, 7273, 273, 6594, 7639, 4841, 6780, 5407, 585, 10843, 945, 1365, 2457, 12285, 8194, 10534, 10055, 11470, 647, 3206, 11834, 5550, 11938, 11974, 2858, 8890, 482, 2011, 6457, 12094, 3485, 3981, 2294, 6689, 7255, 10029, 12154, 5045, 6579, 10738, 3101, 1550, 3099, 10740, 10091, 3290, 7880, 12198, 1503, 5500, 1672, 4232, 1110, 11748, 8444, 1251, 9630, 9761, 7140, 1746, 3483, 12096, 12226, 3767, 787, 5818, 8911, 7945, 7856, 2039, 7525, 1064, 1778, 4422, 10873, 3831, 7393, 5012, 5931, 8878, 6996, 8888, 2860, 4713, 2866, 11347, 1098, 6207, 10645, 3853, 5444, 9523, 12250, 1618, 6544, 11124, 4678, 697, 11709, 11250, 3754, 12254, 3254, 11399, 6263, 10079, 8546, 10290, 9922, 7444, 1683, 3803, 11169, 616, 9880, 8243, 11093, 1451, 4986, 7815, 6015, 4448, 11837, 8230, 749, 1787, 8338, 12262, 1419, 4406, 5684, 11715, 1009, 9236, 4249, 7545, 3504, 11147, 10836, 7305, 3757, 6878, 9521, 5446, 4159, 3218, 11641, 3078, 456, 10569, 337, 9345, 310, 6837, 11023, 8171, 11299, 10451, 8129, 3204, 649, 5843, 2148, 10340, 5849, 3381, 7301, 4476, 9589, 8265, 392, 7537, 658, 8635, 4778, 19, 5531, 1576, 2331, 2873, 9857, 11648, 9813, 11004, 4930, 8300, 10475, 7674, 11744, 8653, 6918, 6205, 1100, 10426, 34, 3161, 891, 5250, 6369, 8121, 3537, 720, 5762, 9407, 6523, 1442, 7061, 222, 8708, 9307, 203, 1507, 9723, 6306, 11080, 9350, 9910, 11520, 12274, 4390, 11442, 2514, 2708, 11791, 4971, 11462, 3408, 1926, 10887, 4571, 2197, 3104, 4410, 7955, 10438, 9241, 731, 1428, 6124, 5988, 10907, 5180, 2807, 11139, 8814, 3924, 264, 8070, 5994, 11468, 10057, 5647, 4877, 1243, 1710, 11069, 1987, 4903, 1908, 4063, 8616, 8110, 5669, 5634, 5440, 10910, 8375, 5073, 10878, 11340, 8077, 1037, 8537, 11946, 4277, 9742, 4794, 4240, 10676, 6763, 3651, 9386, 1589, 3394, 9282, 7699, 10070, 4029, 12043, 10083, 6583, 2168, 10239, 2460, 3841, 1821, 5498, 1505, 205, 1731, 150, 11232, 10044, 5450, 1268, 2422, 4733, 7729, 2241, 10388, 11585, 11381, 5800, 4151, 2135, 7463, 2334, 9548, 7944, 9164, 5819, 6439, 3224, 4989, 959, 9845, 167, 8852, 7594, 8397, 2774, 6130, 5918, 4170, 10699, 3342, 3008, 3644, 7398, 481, 9205, 2859, 9149, 6997, 7013, 213, 7294, 3857, 826, 3285, 10364, 6995, 9151, 5932, 10053, 10536, 6391, 572, 11282, 11667, 2534, 7801, 8316, 6755, 7708, 9529, 11270, 3031, 459, 8256, 9361, 9498, 7185, 8762, 8627, 2344, 415, 7593, 8903, 168, 6400, 10685, 6157, 6373, 5436, 7661, 10723, 2129, 7034, 139, 791, 7092, 8144, 4126, 936, 8080, 3596, 10920, 1070, 3799, 6498, 12186, 9278, 1679, 2115, 6070, 837, 2450, 3977, 8586, 4499, 4395, 7697, 9284, 46, 3923, 8986, 11140, 10695, 12236, 710, 1522, 12056, 10542, 3119, 194, 3089, 8309, 7926, 3717, 4202, 2574, 5055, 1559, 387, 10548, 3045, 12173, 3848, 6278, 10554, 4884, 2250, 1344, 4743, 3195, 1143, 10582, 11865, 5027, 10650, 10752, 12282, 10242, 7563, 10446, 2276, 10482, 6894, 10497, 447, 1784, 12111, 11804, 9624, 10514, 11909, 8626, 8857, 7186, 11011, 9403, 11847, 8333, 10522, 4378, 11406, 4167, 3259, 11570, 2962, 8578, 2058, 6429, 496, 7320, 4926, 6900, 3721, 5954, 4962, 10527, 11320, 10957, 7969, 5612, 9527, 7710, 2833, 3934, 4292, 5354, 8134, 6110, 7888, 3886, 10431, 12065, 3583, 1760, 971, 6234, 2581, 11914, 8117, 1592, 55, 1976, 2879, 11475, 4838, 9306, 9022, 223, 3567, 10530, 8676, 9592, 11155, 3038, 1849, 3050, 2748, 5580, 7056, 2479, 4208, 3455, 1370, 7620, 7833, 652, 1563, 8212, 2217, 8262, 8679, 1203, 8095, 5637, 1202, 8684, 8263, 9591, 8704, 10531, 8604, 7283, 5307, 3828, 3939, 6080, 1646, 6097, 926, 11309, 478, 9981, 11198, 4522, 9861, 10295, 5273, 5302, 6339, 4244, 6917, 9041, 11745, 11860, 2499, 10368, 7368, 1677, 9280, 3396, 4892, 10115, 6810, 1937, 7921, 5525, 3339, 2904, 4777, 9057, 659, 10968, 662, 2355, 5723, 7088, 2343, 8856, 8763, 11910, 1529, 10033, 11478, 9726, 4860, 3017, 4305, 8109, 8970, 4064, 6407, 10681, 4054, 5650, 4309, 9721, 1509, 2353, 664, 7282, 8674, 10532, 8196, 3782, 8015, 6331, 7145, 2087, 5657, 9764, 11993, 4625, 2267, 7939, 6794, 4620, 1461, 4498, 8821, 3978, 4365, 5667, 8112, 9462, 11242, 2057, 8749, 2963, 9906, 6032, 7165, 4362, 3488, 8088, 4071, 5388, 3547, 6336, 9513, 6161, 6321, 10663, 122, 6695, 1104, 6329, 8017, 7623, 11015, 9587, 4478, 4786, 12118, 8025, 4253, 8185, 7989, 10289, 9124, 10080, 8010, 2549, 8478, 7197, 2229, 9474, 11945, 8958, 1038, 3159, 36, 4983, 3199, 5412, 85, 2716, 1869, 8209, 10163, 9491, 4834, 62, 3122, 11503, 10975, 10858, 6283, 3789, 5283, 915, 1517, 9578, 2681, 5559, 9746, 9984, 4092, 3688, 4275, 11948, 4013, 12091, 1311, 6005, 3772, 7007, 4548, 2019, 10763, 7181, 10916, 11457, 6774, 11218, 3458, 5792, 10472, 10605, 3170, 1121, 1392, 9961, 11482, 1236, 10621, 7196, 8542, 2550, 2559, 9837, 8314, 7803, 7347, 10258, 11388, 2609, 2068, 2852, 6699, 11206, 10734, 11001, 6981, 3618, 8351, 1415, 3134, 4897, 420, 2920, 1301, 3918, 6492, 5978, 2340, 9828, 3353, 10469, 11432, 1250, 9176, 11749, 115, 3497, 6012, 4440, 1653, 1643, 3148, 6846, 7112, 4994, 3406, 11464, 5713, 12133, 6423, 2727, 474, 2821, 7809, 7505, 11771, 2996, 5676, 4036, 1727, 2739, 4347, 1824, 1240, 8329, 2596, 11107, 1489, 2632, 9835, 2561, 7431, 10109, 4400, 3564, 1859, 1514, 10254, 2025, 2773, 8901, 7595, 6681, 5351, 2924, 6761, 10678, 11687, 7219, 7948, 9886, 9471, 6645, 9570, 6887, 2315, 261, 11305, 4089, 9703, 600, 5072, 8964, 10911, 9336, 10987, 3836, 5798, 11383, 12032, 12242, 3474, 3304, 12026, 986, 10136, 6254, 1836, 4162, 1660, 1022, 9455, 3558, 7998, 2095, 1414, 8460, 3619, 6210, 11366, 2840, 187, 7126, 7931, 12180, 5349, 6683, 10593, 12261, 9104, 1788, 1629, 10850, 10521, 8757, 11848, 1984, 2595, 8413, 1241, 4879, 6974, 2043, 10324, 220, 7063, 1979, 7753, 10992, 4543, 6754, 8868, 7802, 8474, 9838, 3467, 3704, 7925, 8803, 3090, 9996, 253, 2662, 1067, 2636, 10603, 10474, 9045, 4931, 1050, 4947, 2656, 8206, 4002, 11105, 2598, 10706, 7870, 10418, 4082, 3995, 1185, 488, 7490, 5623, 4723, 11918, 9334, 10913, 144, 340, 3785, 199, 554, 6068, 2117, 4811, 5244, 5903, 6797, 1543, 391, 9061, 9590, 8678, 8685, 2218, 3346, 247, 5204, 9360, 8861, 460, 6612, 3870, 10563, 1896, 10217, 6908, 4960, 5956, 5146, 7436, 11092, 9115, 9881, 1017, 9260, 1945, 6777, 10903, 1607, 3677, 6640, 7414, 2187, 748, 9107, 11838, 5217, 10380, 3318, 3674, 5883, 9318, 7122, 1012, 5545, 4200, 3719, 6902, 4740, 6603, 576, 2216, 8687, 1564, 10162, 8527, 1870, 4001, 8295, 2657, 2530, 1982, 11850, 983, 3910, 2587, 2304, 3781, 8602, 10533, 9216, 12286, 6146, 7374, 7681, 4469, 878, 7229, 7988, 8549, 4254, 7204, 11137, 2809, 4851, 1199, 10334, 523, 5653, 1855, 6364, 7915, 11298, 9075, 11024, 6058, 4816, 2394, 1997, 2369, 4144, 3452, 11354, 6856, 1881, 5597, 7208, 5398, 11507, 10984, 1801, 8055, 11181, 4719, 12001, 5910, 2843, 9598, 9919, 4125, 8838, 7093, 4285, 6977, 10189, 6488, 3372, 10155, 11783, 6109, 8728, 5355, 7630, 6842, 3203, 9072, 10452, 3930, 10630, 9807, 7099, 882, 3536, 9031, 6370, 3392, 1591, 8716, 11915, 1846, 5051, 9461, 8582, 5668, 8969, 8617, 4306, 526, 5341, 514, 693, 2604, 2756, 2145, 5172, 1968, 7659, 5438, 5636, 8682, 1204, 11056, 1587, 9388, 6743, 4070, 8571, 3489, 9716, 4908, 9311, 7097, 9809, 3595, 8835, 937, 1036, 8960, 11341, 11732, 863, 5477, 10354, 5993, 8983, 265, 12059, 6226, 1714, 5583, 7609, 11594, 9687, 11449, 6021, 7876, 10616, 3110, 11180, 8153, 1802, 9884, 7950, 7171, 7494, 3336, 1614, 9505, 5949, 3634, 5373, 11030, 2746, 3052, 3193, 4745, 9667, 4263, 3739, 4105, 5086, 6927, 9255, 1723, 12012, 2628, 6045, 2621, 4252, 8551, 12119, 5891, 12217, 10213, 688, 7831, 7622, 8558, 6330, 8600, 3783, 342, 3333, 2548, 8544, 10081, 12045, 11936, 5552, 5195, 4147, 5313, 10248, 4766, 7080, 2094, 8354, 3559, 6936, 9367, 10990, 7755, 592, 975, 10288, 8548, 8186, 7230, 10961, 9271, 3671, 4181, 11764, 6638, 3679, 2569, 1622, 9231, 7052, 7603, 843, 10965, 10971, 2735, 5611, 8736, 10958, 2505, 6018, 9842, 7291, 1088, 10744, 11900, 1743, 4856, 2182, 11333, 10437, 8997, 4411, 1675, 7370, 7170, 8052, 9885, 8388, 7220, 7855, 9163, 8912, 9549, 3873, 10466, 6793, 8591, 2268, 7226, 5155, 6534, 2613, 6531, 12179, 8344, 7127, 10347, 5123, 3716, 8802, 8310, 3705, 6623, 5524, 8640, 1938, 2365, 4847, 2437, 11297, 8173, 6365, 5771, 1766, 3534, 884, 2556, 6864, 760, 5330, 356, 11395, 10790, 7737, 9452, 14, 3278, 848, 10003, 2803, 7789, 3470, 4593, 6199, 11515, 2179, 3885, 8726, 6111, 6051, 466, 10869, 3188, 6606, 12197, 9184, 3291, 4335, 10615, 8059, 6022, 11582, 10149, 5097, 10417, 8290, 10707, 10510, 3132, 1417, 12264, 11778, 6772, 11459, 7324, 10208, 5856, 11371, 2038, 9162, 7946, 7221, 2014, 11796, 4472, 6276, 3850, 10637, 9990, 10552, 6280, 6168, 9782, 6273, 3180, 453, 6741, 9390, 11955, 10371, 5841, 651, 8690, 7621, 8019, 689, 1408, 7807, 2823, 9753, 4490, 11989, 11879, 1293, 4607, 4100, 11412, 492, 4438, 6014, 9111, 4987, 3226, 2701, 3735, 7504, 8424, 2822, 7828, 1409, 951, 7346, 8473, 8315, 8869, 2535, 4464, 301, 11761, 6950, 6675, 2764, 41, 10827, 3702, 3469, 7895, 2804, 5473, 2347, 6873, 1694, 30, 4758, 2418, 5132, 11883, 7162, 10456, 11532, 765, 5215, 11840, 10507, 12221, 10089, 10742, 1090, 3628, 2429, 4952, 4864, 7627, 1227, 2733, 10973, 11505, 5400, 9976, 591, 7993, 10991, 8320, 1980, 2532, 11669, 11615, 11377, 1296, 3971, 5536, 4775, 2906, 5281, 3791, 10271, 921, 9451, 7902, 10791, 904, 259, 2317, 2392, 4818, 2240, 8923, 4734, 7486, 12052, 5781, 4781, 1160, 2933, 11490, 78, 1401, 3288, 10093, 6557, 6569, 10586, 427, 9792, 2832, 8733, 9528, 8866, 6756, 10715, 126, 5323, 10298, 5318, 7690, 10069, 8945, 9283, 8818, 4396, 6091, 6087, 11420, 270, 10068, 7701, 5319, 11664, 11325, 6573, 702, 910, 10995, 4468, 8190, 7375, 10399, 11119, 11018, 9300, 11743, 9043, 10476, 10330, 6384, 5494, 3700, 10829, 5299, 12079, 295, 3696, 10023, 10722, 8845, 5437, 8098, 1969, 12159, 10480, 2278, 2654, 4949, 644, 363, 6922, 7286, 6686, 6944, 2795, 11556, 10863, 11350, 11255, 9304, 4840, 9226, 6595, 9296, 7160, 11885, 2471, 10386, 2243, 6841, 8132, 5356, 1226, 7763, 4865, 10853, 11014, 8557, 8018, 7832, 8691, 1371, 834, 11613, 11671, 2411, 6548, 11971, 1164, 3155, 11593, 8064, 5584, 1231, 10704, 2600, 842, 7975, 7053, 1717, 9393, 12082, 10560, 9552, 6680, 8396, 8902, 8853, 416, 2948, 6831, 12004, 2554, 886, 763, 11534, 5135, 1841, 10015, 5813, 2641, 1829, 10403, 9428, 3142, 9424, 5489, 11661, 99, 1107, 4138, 289, 6315, 6665, 4007, 372, 10445, 8776, 10243, 5175, 7297, 2185, 7416, 9866, 3365, 4561, 4804, 11290, 7500, 2062, 5386, 4073, 5687, 10944, 3503, 9095, 4250, 2623, 3003, 12245, 6860, 12007, 657, 9059, 393, 11635, 10728, 11904, 12258, 4507, 9872, 10820, 1399, 80, 1063, 9160, 2040, 4288, 5210, 1482, 10931, 11158, 6102, 9773, 9583, 6752, 4545, 9384, 3653, 3233, 12271, 6507, 4565, 11130, 11770, 8423, 7810, 3736, 172, 2061, 7552, 11291, 5030, 11076, 2546, 3335, 8050, 7172, 4870, 5622, 8284, 489, 7249, 12051, 7727, 4735, 1000, 10338, 2150, 10119, 2052, 10171, 4018, 7046, 2132, 508, 6230, 4121, 9896, 4558, 10050, 6453, 1351, 2337, 637, 2871, 2333, 8915, 2136, 7379, 2980, 12088, 11737, 11554, 2797, 3765, 12228, 2254, 813, 3579, 2984, 4649, 3064, 5510, 1388, 1682, 9121, 9923, 4371, 9853, 9595, 9479, 4109, 11091, 8245, 5147, 10545, 4330, 10108, 8406, 2562, 3669, 9273, 11968, 7336, 4525, 4663, 1437, 1770, 11721, 5116, 4797, 6668, 9865, 7558, 2186, 8233, 6641, 3311, 11047, 3962, 5316, 10300, 7388, 1734, 3500, 10040, 83, 5414, 10597, 9979, 480, 8892, 3645, 2175, 10127, 5011, 9154, 3832, 11870, 148, 1733, 7407, 10301, 3316, 10382, 5101, 1280, 2572, 4204, 2979, 7461, 2137, 11606, 10398, 7680, 8191, 6147, 7023, 7169, 7952, 1676, 8648, 10369, 11957, 7315, 4968, 3545, 5390, 6541, 1284, 3243, 3990, 11240, 9464, 2538, 10262, 9518, 804, 1207, 2941, 6346, 10257, 8472, 7804, 952, 2090, 11238, 3992, 9634, 4636, 11646, 9859, 4524, 7426, 11969, 6550, 2616, 1128, 1797, 5380, 4041, 6334, 3549, 1763, 10207, 7861, 11460, 4973, 4925, 8745, 497, 3283, 828, 4967, 7365, 11958, 2645, 6805, 2639, 5815, 9503, 1616, 12252, 3756, 9091, 10837, 3177, 4475, 9064, 3382, 11331, 2184, 7560, 5176, 3856, 8884, 214, 1087, 7964, 9843, 961, 10591, 6685, 7649, 6923, 5306, 8673, 8605, 665, 7105, 2161, 4895, 3136, 6359, 10066, 272, 9229, 1624, 12169, 2686, 9770, 10167, 6722, 2975, 5555, 9638, 423, 3508, 1640, 997, 4791, 1214, 9903, 10028, 9196, 6690, 5083, 1154, 9779, 12050, 7488, 490, 11414, 11826, 134, 3096, 5711, 11466, 5996, 9249, 10442, 4175, 2829, 10375, 9714, 3491, 10731, 2503, 10960, 7987, 8187, 879, 5154, 7937, 2269, 1349, 6455, 2013, 7854, 7947, 8389, 11688, 3913, 3326, 1412, 2097, 2467, 5543, 1014, 1805, 5397, 8158, 5598, 5036, 11136, 8183, 4255, 5363, 2780, 11963, 606, 2228, 8541, 8479, 10622, 11604, 2139, 4417, 1873, 10185, 1906, 4905, 11010, 8761, 8858, 9499, 142, 10915, 8495, 10764, 5702, 5220, 2190, 10770, 2713, 567, 4869, 7493, 8051, 7951, 7371, 7024, 1941, 4361, 8574, 6033, 10455, 7778, 11884, 7636, 9297, 9870, 4509, 407, 754, 4705, 10449, 11301, 2155, 6117, 5334, 11493, 5504, 2086, 8598, 6332, 4043, 4854, 1745, 9172, 9762, 5659, 5188, 11409, 5062, 4353, 5756, 112, 436, 929, 3027, 10346, 7930, 8345, 188, 9234, 1011, 8222, 9319, 9612, 6444, 10143, 4189, 10322, 2045, 4728, 4993, 8434, 6847, 1381, 3300, 9483, 6818, 2160, 7280, 666, 609, 6629, 5152, 881, 8124, 9808, 8083, 9312, 6736, 4284, 8143, 8839, 792, 9826, 2342, 8629, 5724, 12041, 4031, 2930, 11942, 11260, 2093, 8000, 4767, 10808, 11551, 6504, 11523, 4515, 450, 4061, 1910, 6586, 5111, 10100, 11543, 7028, 2877, 1978, 8322, 221, 9024, 1443, 2869, 639, 2478, 8696, 5581, 1716, 7602, 7976, 9232, 190, 9266, 7032, 2131, 7477, 4019, 6387, 2373, 89, 10788, 11397, 3256, 5921, 11931, 896, 138, 8842, 2130, 7048, 9267, 11151, 2876, 7066, 11544, 2363, 1940, 7168, 7372, 6148, 6828, 6913, 11755, 6964, 1993, 3631, 6988, 212, 8886, 6998, 2489, 5573, 9382, 4547, 8499, 3773, 11375, 11617, 2913, 11164, 165, 9847, 2488, 7012, 8887, 9150, 8879, 10365, 11210, 58, 1459, 4622, 211, 7015, 3632, 5951, 2778, 5365, 5005, 3617, 8462, 11002, 9815, 10188, 8141, 4286, 2042, 8326, 4880, 1990, 4587, 4600, 626, 12192, 12162, 4585, 1992, 7018, 11756, 6261, 11401, 11528, 4383, 11934, 12047, 6171, 5140, 797, 12213, 6719, 6674, 7796, 11762, 4183, 11776, 12266, 2794, 7647, 6687, 2296, 108, 3947, 5607, 3895, 9366, 7996, 3560, 4156, 4660, 11064, 12039, 5726, 1355, 9254, 8033, 5087, 9510, 5305, 7285, 7650, 364, 6196, 6204, 9040, 8654, 4245, 1260, 11754, 7020, 6829, 2950, 10491, 4959, 8249, 10218, 11821, 1422, 10226, 4739, 8217, 3720, 8743, 4927, 5749, 5577, 6075, 10496, 8772, 10483, 5080, 4132, 783, 4531, 2314, 8383, 9571, 10422, 2958, 5508, 3066, 11705, 802, 9520, 9089, 3758, 12205, 4887, 1693, 7785, 2348, 6394, 5937, 1340, 11117, 10401, 1831, 759, 7908, 2557, 2552, 12006, 7540, 12246, 1464, 1880, 8161, 11355, 5915, 3443, 4629, 4192, 6654, 3323, 1380, 7111, 8435, 3149, 2767, 3202, 8131, 7631, 2244, 3362, 11022, 9077, 311, 1931, 6648, 5908, 12003, 7590, 2949, 6912, 7021, 6149, 1118, 11675, 9323, 2264, 1569, 6803, 2647, 2159, 7107, 9484, 4502, 9943, 11876, 11425, 4216, 1936, 8642, 10116, 6038, 10601, 2638, 7312, 2646, 6821, 1570, 2864, 4715, 629, 1542, 8268, 5904, 4619, 8590, 7940, 10467, 3355, 10785, 3108, 10618, 6484, 795, 5142, 10204, 5774, 9330, 5406, 9224, 4842, 10902, 8238, 1946, 11217, 8492, 11458, 7863, 11779, 6061, 10577, 1222, 9999, 5665, 4367, 3650, 8951, 10677, 8392, 2925, 12269, 3235, 10714, 7707, 8867, 8317, 4544, 7515, 9584, 11122, 6546, 2413, 9821, 5077, 11276, 4069, 8090, 9389, 7839, 454, 3080, 352, 4283, 7095, 9313, 5024, 2652, 2280, 9607, 3778, 2544, 11078, 6308, 11655, 5864, 9564, 2974, 7267, 10168, 6673, 6952, 12214, 9799, 5279, 2908, 6042, 6539, 5392, 6215, 9540, 3592, 5234, 10574, 4224, 4681, 11059, 11, 1025, 2672, 11205, 8466, 2853, 367, 1103, 8561, 123, 10407, 4130, 5082, 7254, 9197, 2295, 6943, 7648, 7287, 10592, 8341, 5350, 8395, 7596, 9553, 4319, 3554, 2763, 7795, 6951, 6720, 10169, 2054, 9892, 9864, 7418, 4798, 4006, 7567, 6316, 5629, 1876, 5972, 5626, 10414, 2106, 1115, 6619, 3322, 6850, 4193, 3608, 11088, 1957, 5907, 6834, 1932, 9569, 8385, 9472, 2231, 3310, 7413, 8234, 3678, 7981, 11765, 4113, 10435, 11335, 10201, 3693, 2526, 5151, 7102, 610, 1248, 11434, 2289, 5523, 7923, 3706, 4178, 3321, 6656, 1116, 6151, 6555, 10095, 9292, 3869, 8254, 461, 12157, 1971, 10327, 12196, 7882, 3189, 575, 8215, 4741, 1346, 9699, 1406, 691, 516, 9295, 7638, 9227, 274, 11575, 3000, 5779, 12054, 1524, 5110, 7070, 1911, 2167, 8940, 10084, 12106, 10737, 9192, 5046, 824, 3859, 157, 701, 7686, 11326, 1700, 10585, 7715, 6558, 9933, 3659, 5202, 249, 5359, 10935, 2744, 11032, 9932, 6568, 7716, 10094, 6616, 6152, 11567, 6529, 2615, 7334, 11970, 7614, 2412, 6749, 11123, 9136, 1619, 1283, 7361, 5391, 6713, 6043, 2630, 1491, 2612, 7935, 5156, 12178, 7933, 2614, 6552, 11568, 3261, 2883, 10658, 1441, 9026, 9408, 816, 11929, 5923, 4376, 10524, 2084, 5506, 2960, 11572, 9664, 9288, 5699, 236, 4564, 7509, 12272, 11522, 7076, 11552, 11739, 6291, 3042, 12185, 8830, 3800, 1818, 859, 6417, 5977, 8452, 3919, 907, 3371, 8139, 10190, 9824, 794, 6787, 10619, 1238, 1826, 6465, 9901, 1216, 2273, 4708, 9649, 4979, 2787, 11501, 3124, 3379, 5851, 6135, 724, 9900, 6480, 1827, 2643, 11960, 563, 2376, 1309, 12093, 9202, 2012, 7223, 1350, 7469, 10051, 5934, 2494, 1917, 4454, 11639, 3220, 10142, 7119, 9613, 11215, 1948, 3223, 8909, 5820, 6155, 10687, 10893, 2080, 4430, 919, 10273, 495, 8747, 2059, 174, 633, 5564, 2726, 8428, 12134, 400, 1472, 11998, 5976, 6494, 860, 6224, 12061, 11099, 10750, 10652, 324, 11685, 10680, 8614, 4065, 2972, 9566, 6299, 1384, 10684, 8850, 169, 4266, 73, 2492, 5936, 6871, 2349, 571, 8874, 10537, 2689, 2372, 7044, 4020, 5493, 7671, 10331, 5640, 5456, 287, 4140, 9447, 12104, 10086, 933, 5435, 8847, 6158, 3391, 8120, 9032, 5251, 359, 5770, 7914, 8174, 1856, 226, 1192, 10065, 7276, 3137, 3412, 2237, 5838, 9796, 5894, 5419, 10950, 598, 9705, 2023, 10256, 7349, 2942, 11981, 1362, 560, 2783, 4243, 8656, 5303, 9512, 8567, 3548, 7328, 4042, 7144, 8599, 8016, 8559, 1105, 101, 3013, 10655, 445, 10499, 10662, 8564, 6162, 9965, 10412, 5628, 6664, 7568, 290, 5871, 5796, 3838, 9950, 11654, 6727, 11079, 9017, 9724, 11480, 9963, 6164, 3298, 1383, 6403, 9567, 1934, 4218, 3307, 822, 5048, 3041, 6501, 11740, 2849, 471, 9400, 10856, 10977, 3788, 8518, 10859, 6167, 7845, 10553, 8791, 3849, 7850, 4473, 3179, 7842, 9783, 4323, 2448, 839, 4229, 4414, 708, 12238, 10078, 9126, 11400, 6962, 11757, 12128, 2382, 3714, 5125, 1835, 8361, 10137, 2172, 5481, 1689, 11701, 9380, 5575, 5751, 9660, 4261, 9669, 6176, 6240, 6241, 6177, 4403, 11824, 11416, 2580, 8719, 972, 1264, 4120, 7474, 509, 5519, 1713, 8067, 12060, 6415, 861, 11734, 4016, 10173, 3464, 11453, 678, 9539, 6711, 5393, 1794, 6190, 11365, 8349, 3620, 10644, 9143, 1099, 9039, 6919, 6197, 4595, 870, 11514, 7892, 4594, 6203, 6920, 365, 2855, 10642, 3622, 11364, 6212, 1795, 1130, 4771, 2517, 2124, 2800, 10693, 11142, 505, 4154, 3562, 4402, 6239, 6242, 9670, 2916, 10133, 5139, 6956, 12048, 9781, 7844, 6281, 10860, 3297, 6302, 9964, 6320, 8565, 9514, 3390, 6372, 8848, 10686, 6437, 5821, 11566, 6554, 6617, 1117, 6827, 7022, 7373, 8192, 12287, 2, 4097, 4916, 5267, 5462, 11172, 5672, 5735, 723, 6468, 5852, 1603, 3441, 5917, 8899, 2775, 3724, 5969, 2325, 5987, 8992, 1429, 6008, 4445, 2508, 241, 5333, 7150, 2156, 9373, 2619, 6047, 6050, 7887, 8727, 8135, 11784, 1147, 1596, 9489, 10165, 9772, 7518, 11159, 10494, 6077, 925, 8667, 1647, 9434, 11924, 5369, 6086, 7695, 4397, 775, 11419, 7694, 6092, 5370, 3250, 11190, 3146, 1645, 8669, 3940, 924, 6099, 10495, 6896, 5578, 2750, 11611, 836, 8825, 2116, 8273, 555, 11428, 5874, 229, 4222, 10576, 6770, 11780, 4815, 8169, 11025, 11317, 3570, 9709, 873, 465, 7886, 6112, 6048, 6049, 6113, 2620, 8028, 2629, 6538, 6714, 2909, 588, 10600, 6808, 10117, 2152, 3928, 10454, 7164, 8575, 9907, 161, 532, 5327, 889, 3163, 2211, 51, 11581, 7875, 8060, 11450, 9841, 7966, 2506, 4447, 9110, 7816, 4439, 8440, 3498, 1736, 4444, 6122, 1430, 3771, 8501, 1312, 1433, 2889, 11818, 9440, 549, 5788, 9248, 7241, 11467, 8982, 8071, 10355, 2722, 5886, 10906, 8991, 6125, 2326, 809, 2565, 3272, 1210, 5562, 635, 2339, 8451, 6493, 6418, 11999, 4721, 5625, 6661, 1877, 2324, 6127, 3725, 1627, 1790, 11844, 1634, 9276, 12188, 11184, 3730, 4273, 3690, 5145, 8247, 4961, 8741, 3722, 2777, 6986, 3633, 8046, 9506, 11729, 10927, 308, 9347, 4940, 2033, 10266, 2584, 11691, 1339, 6870, 6395, 2493, 6451, 10052, 8877, 9152, 5013, 2224, 11097, 12063, 10433, 4115, 4375, 6519, 11930, 7038, 3257, 4169, 8898, 6131, 3442, 6854, 11356, 2203, 185, 2842, 8149, 12002, 6833, 6649, 1958, 4618, 6796, 8269, 5245, 9917, 9600, 1752, 3415, 11718, 9940, 5418, 6353, 9797, 12216, 8023, 12120, 3439, 1605, 10905, 5990, 2723, 9317, 8224, 3675, 1609, 604, 11965, 1637, 1539, 1190, 228, 6065, 11429, 5795, 6313, 291, 10817, 11889, 155, 3861, 9563, 6725, 11656, 12115, 10230, 3542, 11794, 2016, 11370, 7859, 10209, 1396, 1602, 6134, 6469, 3380, 9066, 10341, 1074, 2676, 5170, 2147, 9069, 650, 7835, 10372, 9795, 6355, 2238, 4820, 10939, 5066, 10277, 3087, 196, 10980, 9913, 11726, 329, 9646, 10462, 5809, 2389, 11565, 6154, 6438, 8910, 9165, 788, 9502, 7310, 2640, 7581, 10016, 11073, 2388, 5824, 10463, 11051, 1670, 5502, 11495, 2465, 2099, 4150, 8918, 11382, 8370, 3837, 6312, 5872, 11430, 10471, 8489, 3459, 104, 9247, 5998, 550, 737, 5213, 767, 17, 4780, 7725, 12053, 6590, 3001, 2625, 717, 9329, 6783, 10205, 1765, 7913, 6366, 360, 11473, 2881, 3263, 10848, 1631, 9406, 9028, 721, 5737, 9675, 4356, 111, 7133, 4354, 9677, 10798, 9659, 6246, 5576, 6898, 4928, 11006, 10670, 3153, 1166, 5540, 9877, 4675, 319, 4955, 9674, 5760, 722, 6137, 5673, 2195, 4573, 5721, 2357, 1257, 9545, 1354, 6930, 12040, 7087, 8630, 2356, 5731, 4574, 1704, 10589, 963, 4603, 11588, 12132, 8430, 11465, 7243, 3097, 1552, 183, 2205, 3349, 10122, 10378, 5219, 7179, 10765, 235, 6510, 9289, 714, 12015, 3062, 4651, 2994, 11773, 11598, 10883, 2590, 10943, 7548, 4074, 11714, 9100, 4407, 93, 1962, 10318, 132, 11828, 4035, 8420, 2997, 2194, 5734, 6138, 11173, 5633, 8968, 8111, 8583, 4366, 6766, 10000, 855, 11041, 11679, 5187, 7138, 9763, 8596, 2088, 954, 1854, 8176, 524, 4308, 8611, 4055, 4876, 8979, 10058, 2817, 3904, 2720, 10357, 5455, 6382, 10332, 1201, 8681, 8096, 5439, 8967, 5670, 11174, 10183, 1875, 6663, 6317, 10413, 6660, 5973, 4722, 8283, 7491, 4871, 2425, 2397, 10235, 2120, 5569, 5338, 4494, 9526, 8735, 7970, 2736, 4693, 3894, 6939, 3948, 1697, 5002, 4641, 5346, 9994, 3092, 5035, 7207, 8159, 1882, 12166, 3728, 11186, 11922, 9436, 3823, 1084, 9617, 11264, 12278, 1230, 7608, 8065, 1715, 7055, 8697, 2749, 6074, 6897, 5750, 6247, 9381, 7010, 2490, 75, 5337, 5616, 2121, 5022, 9315, 2725, 6425, 634, 5981, 1211, 9745, 8511, 2682, 10009, 9637, 7265, 2976, 5194, 8006, 11937, 9209, 11835, 4450, 2900, 4199, 8220, 1013, 7212, 2468, 9876, 5743, 1167, 2705, 4774, 7745, 3972, 3422, 4582, 1575, 9054, 20, 9364, 3897, 1612, 3338, 8639, 7922, 6624, 2290, 11067, 1712, 6228, 510, 4426, 831, 3797, 1072, 10343, 4051, 1387, 7447, 3065, 6883, 2959, 6515, 2085, 7147, 11494, 5805, 1671, 9181, 1504, 8934, 1822, 4349, 3699, 7670, 6385, 4021, 10747, 11660, 7574, 9425, 10719, 5468, 9643, 4977, 9651, 1688, 6251, 2173, 3647, 10353, 8073, 864, 413, 2346, 7787, 2805, 5182, 10130, 9642, 5486, 10720, 10025, 2966, 614, 11171, 6140, 5268, 5377, 9340, 4699, 286, 6381, 5641, 10358, 11978, 3212, 1267, 8927, 10045, 4658, 4158, 9087, 9522, 9140, 3854, 5178, 10909, 8966, 5635, 8097, 7660, 8846, 6374, 934, 4128, 10409, 10825, 43, 4749, 283, 9737, 9732, 4381, 11530, 10458, 1888, 1172, 10949, 6352, 5895, 9941, 4504, 10596, 7402, 84, 8531, 3200, 2769, 11487, 584, 9223, 6781, 9331, 1867, 2718, 3906, 9975, 7758, 11506, 8157, 7209, 1806, 3517, 1793, 6214, 6712, 6540, 7362, 3546, 8569, 4072, 7550, 2063, 10867, 468, 2071, 4040, 7330, 1798, 9339, 5460, 5269, 535, 11029, 8044, 3635, 3249, 6085, 6093, 11925, 4639, 5004, 6984, 2779, 7202, 4256, 3035, 10934, 6563, 250, 1225, 7629, 8133, 8729, 4293, 2923, 8394, 6682, 8342, 12181, 9993, 5602, 4642, 9495, 23, 513, 8106, 527, 4493, 5615, 5570, 76, 11492, 7149, 6118, 242, 355, 7906, 761, 888, 6028, 533, 5271, 10297, 7704, 127, 97, 11663, 7689, 7702, 10299, 7409, 3963, 10247, 8003, 4148, 2101, 2474, 1287, 3827, 8672, 7284, 6924, 9511, 6338, 8657, 5274, 12078, 7667, 10830, 12231, 1079, 1924, 3410, 3139, 3402, 5277, 9801, 2442, 12124, 1125, 9376, 672, 914, 8516, 3790, 7742, 2907, 6716, 9800, 5291, 3403, 12077, 5301, 8658, 10296, 5325, 534, 5376, 5461, 6141, 4917, 5121, 10349, 9926, 745, 5223, 9413, 1138, 3022, 5241, 10159, 3447, 12151, 11393, 358, 6368, 9033, 892, 1501, 12200, 9916, 5902, 8270, 4812, 10158, 5257, 3023, 12099, 3057, 4313, 4687, 10573, 6708, 3593, 9811, 11650, 9420, 10846, 3265, 12068, 3967, 10311, 9412, 5261, 746, 2189, 7178, 5703, 10379, 8228, 11839, 7774, 766, 5785, 738, 1481, 7522, 4289, 10196, 1029, 347, 9359, 8258, 248, 6565, 3660, 9947, 2463, 11497, 3450, 4146, 8005, 5553, 2977, 4206, 2481, 4165, 11408, 7137, 5660, 11680, 11623, 5009, 10129, 5471, 2806, 8989, 10908, 5442, 3855, 7296, 7561, 10244, 1967, 8100, 2146, 5845, 2677, 2970, 4067, 11278, 3055, 12101, 3944, 4359, 1943, 9262, 11360, 11853, 12177, 6533, 7936, 7227, 880, 7101, 6630, 2527, 3117, 10544, 7435, 8246, 5957, 3691, 10203, 6785, 796, 6955, 6172, 10134, 988, 1840, 7584, 11535, 11882, 7780, 2419, 2992, 4653, 405, 4511, 1834, 6256, 3715, 7928, 10348, 5265, 4918, 4338, 4238, 4796, 7420, 11722, 9576, 1519, 10099, 7069, 6587, 1525, 3794, 1374, 12147, 2790, 3431, 3528, 1279, 7384, 10383, 2104, 10416, 7872, 10150, 685, 1667, 3810, 3748, 10061, 11683, 326, 9509, 6926, 8034, 4106, 1153, 7253, 6691, 4131, 6892, 10484, 11275, 6746, 9822, 10192, 10877, 8963, 8376, 601, 3900, 4342, 4435, 10276, 5834, 10940, 10020, 4352, 7135, 11410, 4102, 4302, 1329, 9786, 1558, 8798, 2575, 1914, 9460, 8114, 1847, 3040, 6293, 823, 6578, 9193, 12155, 463, 875, 11799, 4801, 239, 2510, 11135, 7206, 5599, 3093, 2261, 2386, 11075, 7498, 11292, 10649, 8781, 11866, 2651, 6734, 9314, 5567, 2122, 2519, 9603, 120, 10665, 3060, 12017, 2223, 5930, 9153, 7394, 10128, 5184, 11624, 3684, 3616, 6983, 5366, 4640, 5604, 1698, 11328, 2446, 4325, 11202, 12075, 3405, 8433, 7113, 4729, 10105, 958, 8907, 3225, 7814, 9112, 1452, 3198, 8533, 37, 10673, 2786, 6474, 9650, 5484, 9644, 331, 4924, 7322, 11461, 9006, 11792, 3544, 7364, 7316, 829, 4428, 2082, 10526, 8740, 5955, 8248, 6909, 10492, 11161, 9673, 5739, 320, 4863, 7765, 2430, 643, 7653, 2655, 8297, 1051, 10199, 11337, 4485, 3817, 2032, 5943, 9348, 11082, 11485, 2771, 2027, 9751, 2825, 1049, 8299, 9046, 11005, 5748, 6899, 8744, 7321, 4974, 332, 1920, 3641, 10613, 4337, 5120, 5266, 6142, 4098, 4609, 1891, 683, 10152, 4828, 9310, 8085, 9717, 11009, 7188, 1907, 8973, 1988, 4882, 10556, 12141, 419, 8457, 3135, 7278, 2162, 10114, 8644, 3397, 11809, 2310, 1692, 6875, 12206, 2249, 8789, 10555, 4901, 1989, 6973, 8327, 1242, 8978, 5648, 4056, 10103, 4731, 2424, 5621, 7492, 7173, 568, 10519, 10852, 7626, 7764, 4953, 321, 3016, 8620, 9727, 3883, 2181, 7959, 1744, 7142, 4044, 1198, 8180, 2810, 2694, 2436, 7918, 2366, 3168, 10607, 10901, 6779, 9225, 7640, 9305, 8710, 11476, 10035, 61, 8524, 9492, 735, 552, 201, 9309, 4910, 10153, 3374, 9956, 9418, 11652, 9952, 10938, 5836, 2239, 7731, 2393, 8168, 6059, 11781, 10157, 5243, 8271, 2118, 10237, 2170, 10139, 1951, 11289, 7554, 4562, 238, 5040, 11800, 4005, 6667, 7419, 5117, 4239, 8954, 9743, 1213, 7259, 998, 4737, 10228, 12117, 8553, 4479, 3866, 519, 1159, 7724, 5782, 18, 9056, 8636, 2905, 7744, 5537, 2706, 2516, 6187, 1131, 1358, 10807, 7079, 8001, 10249, 3129, 11226, 12209, 10890, 1469, 2417, 7782, 31, 385, 1561, 654, 11896, 3230, 11632, 282, 5429, 44, 9286, 9666, 8039, 3194, 8786, 1345, 6602, 8216, 6903, 10227, 4789, 999, 7485, 7728, 8924, 2423, 4873, 10104, 4992, 7114, 2046, 3513, 1844, 11917, 8282, 5624, 5974, 12000, 8151, 11182, 12190, 628, 6800, 2865, 9147, 2861, 1886, 10460, 9648, 6476, 2274, 10448, 7154, 755, 11526, 11403, 9735, 285, 5458, 9341, 11873, 3436, 3387, 3893, 5609, 2737, 1729, 207, 2896, 10572, 5236, 4314, 11447, 9689, 1585, 11058, 6705, 4225, 696, 9134, 11125, 318, 5741, 9878, 618, 676, 11455, 10918, 3598, 4457, 4271, 3732, 1275, 1436, 7424, 4526, 11063, 6933, 4157, 5448, 10046, 1903, 9818, 404, 5129, 2993, 5694, 3063, 7449, 2985, 1034, 939, 1426, 733, 9494, 5345, 5603, 5003, 5367, 11926, 11645, 7340, 9635, 10011, 1809, 130, 10320, 4191, 6852, 3444, 1567, 2266, 8593, 11994, 210, 6990, 1460, 8589, 6795, 5905, 1959, 1813, 3246, 546, 2989, 1271, 1170, 1890, 4914, 4099, 7821, 1294, 11379, 11587, 5716, 964, 625, 6970, 4588, 2221, 12019, 869, 6202, 6198, 7893, 3471, 3006, 3344, 2220, 4599, 6971, 1991, 6966, 12163, 1574, 5533, 3423, 2761, 3556, 9457, 2497, 11862, 1703, 5720, 5732, 2196, 9001, 10888, 12211, 799, 9356, 11129, 7508, 6508, 237, 4803, 7555, 3366, 10049, 7471, 9897, 9972, 12030, 11385, 1498, 4387, 2838, 11368, 2018, 8498, 7008, 9383, 7514, 6753, 8318, 10993, 912, 674, 620, 9757, 10309, 3969, 1298, 4296, 11698, 2313, 6889, 784, 1316, 9556, 11062, 4662, 7425, 7337, 9860, 8661, 11199, 1547, 2200, 68, 1782, 449, 7074, 11524, 757, 1833, 5127, 406, 7157, 9871, 7531, 12259, 10595, 5416, 9942, 6816, 9485, 4394, 8820, 8587, 1462, 12248, 9525, 5614, 5339, 528, 11988, 7825, 9754, 3420, 3974, 3816, 4943, 11338, 10880, 4461, 9467, 3865, 4785, 8554, 9588, 9063, 7302, 3178, 6275, 7851, 11797, 877, 8189, 7682, 10996, 410, 300, 7799, 2536, 9466, 4482, 10881, 11600, 4270, 4668, 3599, 11638, 6448, 1918, 334, 2899, 5548, 11836, 9109, 6016, 2507, 6121, 6009, 1737, 2299, 1652, 8439, 6013, 7817, 493, 10275, 5068, 4343, 3127, 10251, 918, 6433, 2081, 4965, 830, 5517, 511, 25, 10872, 9157, 1779, 1582, 3999, 1872, 7192, 2140, 707, 6267, 4230, 1674, 7954, 8998, 3105, 92, 5683, 9101, 1420, 11823, 6238, 6178, 3563, 8404, 10110, 774, 6090, 7696, 8819, 4500, 9486, 2286, 11441, 9011, 12275, 2837, 4552, 1499, 894, 11933, 6959, 11529, 5425, 9733, 11405, 8755, 10523, 6518, 5924, 4116, 992, 9852, 7442, 9924, 10351, 3649, 6765, 5666, 8584, 3979, 3487, 8573, 7166, 1942, 5162, 3945, 110, 5758, 9676, 5755, 7134, 5063, 10021, 3698, 5496, 1823, 8416, 2740, 3377, 3126, 4434, 5069, 3901, 2404, 4237, 5119, 4919, 10614, 7878, 3292, 1852, 956, 10107, 7433, 10546, 389, 1545, 11201, 4998, 2447, 6271, 9784, 1331, 3553, 6678, 9554, 1318, 1324, 11446, 4686, 5237, 3058, 10667, 9720, 8610, 5651, 525, 8108, 8618, 3018, 1328, 5059, 4103, 3741, 2001, 11314, 11697, 4534, 1299, 2922, 5353, 8730, 3935, 10195, 5209, 7523, 2041, 6976, 8142, 7094, 6737, 353, 244, 2208, 3745, 9741, 8956, 11947, 8506, 3689, 5959, 3731, 4667, 4458, 11601, 2076, 72, 6398, 170, 3738, 8037, 9668, 6244, 9661, 277, 10566, 3034, 5362, 7203, 8184, 8550, 8026, 2622, 7544, 9096, 9237, 9543, 1259, 6916, 8655, 6340, 2784, 10675, 8953, 4795, 5118, 4339, 2405, 10487, 4136, 1109, 9179, 1673, 4413, 6268, 840, 2602, 695, 4680, 6706, 10575, 6063, 230, 12024, 3306, 6296, 1935, 6812, 11426, 557, 948, 3329, 11253, 11352, 3454, 8694, 2480, 5192, 2978, 7381, 2573, 8800, 3718, 8219, 5546, 2901, 10702, 1233, 11085, 3607, 6653, 6851, 4630, 10321, 7117, 10144, 9533, 9685, 11596, 11775, 6948, 11763, 7983, 3672, 3320, 6621, 3707, 2828, 7238, 10443, 374, 3573, 10698, 8897, 5919, 3258, 8753, 11407, 5190, 2482, 1659, 8359, 1837, 3217, 9086, 5447, 4659, 6934, 3561, 6180, 506, 2134, 8917, 5801, 2100, 5312, 8004, 5196, 3451, 8164, 2370, 2691, 9446, 6379, 288, 7570, 1108, 4234, 10488, 1305, 782, 6891, 5081, 6692, 10408, 5433, 935, 8837, 8145, 9920, 10292, 9895, 7473, 6231, 1265, 3214, 991, 4374, 5925, 10434, 6636, 11766, 1955, 11090, 7438, 9480, 1152, 5085, 8035, 3740, 4301, 5060, 11411, 7820, 4608, 4915, 6143, 3, 3073, 1756, 3687, 8508, 9985, 9702, 8379, 11306, 439, 10307, 9759, 9632, 3994, 8288, 10419, 3762, 2127, 10725, 3602, 10073, 11713, 5686, 7549, 5387, 8570, 8089, 6744, 11277, 5167, 2971, 6406, 8615, 8971, 1909, 7072, 451, 3182, 11541, 10102, 4875, 5649, 8612, 10682, 1386, 5512, 10344, 3029, 11272, 2408, 3174, 1197, 4853, 7143, 6333, 7329, 5381, 2072, 10393, 1726, 8419, 5677, 11829, 3428, 2929, 7085, 12042, 8943, 10071, 3604, 3611, 2699, 3228, 11898, 10746, 5492, 6386, 7045, 7478, 10172, 6221, 11735, 12090, 8504, 11949, 12145, 1376, 2955, 371, 7566, 6666, 4799, 11801, 11104, 8294, 8207, 1871, 4419, 1583, 9691, 1184, 8287, 4083, 9633, 7342, 11239, 7358, 3244, 1815, 1686, 9653, 11222, 9627, 12036, 2293, 9199, 3486, 4364, 8585, 8822, 2451, 3815, 4487, 3421, 5535, 7746, 1297, 4536, 10310, 5226, 12069, 1965, 10246, 5315, 7410, 11048, 3876, 9694, 10305, 441, 3532, 1768, 1439, 10660, 10501, 3185, 28, 1696, 5606, 6940, 109, 4358, 5163, 12102, 9449, 923, 6079, 8670, 3829, 10875, 10194, 4291, 8731, 2834, 11267, 10629, 8127, 10453, 6035, 2153, 11303, 263, 8985, 8815, 47, 257, 906, 6491, 8453, 1302, 2953, 1378, 3325, 7217, 11689, 2586, 8200, 984, 12028, 9974, 5402, 2719, 5644, 2818, 2403, 4341, 5070, 602, 1611, 5528, 9365, 6938, 5608, 4694, 3388, 9516, 10264, 2035, 10775, 10430, 8725, 7889, 2180, 4858, 9728, 2454, 9657, 10800, 1182, 9693, 3960, 11049, 10465, 7942, 9550, 10562, 8253, 6613, 9293, 518, 4784, 4480, 9468, 11815, 9562, 5866, 156, 6576, 825, 8883, 7295, 5177, 5443, 9141, 10646, 10636, 7849, 6277, 8792, 12174, 540, 3113, 11039, 857, 1820, 8936, 2461, 9949, 6311, 5797, 8371, 10988, 9369, 11869, 7392, 9155, 10874, 3938, 8671, 5308, 1288, 1555, 1083, 5590, 9437, 10221, 9680, 901, 2031, 4942, 4486, 3975, 2452, 9730, 9739, 3747, 5093, 1668, 11053, 807, 2328, 10897, 11168, 9119, 1684, 1817, 6497, 8831, 1071, 5515, 832, 1373, 5108, 1526, 10270, 7741, 5282, 8517, 6284, 10978, 198, 8276, 341, 8014, 8601, 8197, 2305, 2543, 6730, 9608, 2711, 10772, 11374, 7006, 8500, 6006, 1431, 1314, 786, 9167, 12227, 7455, 2798, 2126, 4080, 10420, 9573, 12204, 6877, 9090, 7306, 12253, 9130, 11251, 3331, 344, 2815, 10060, 5092, 3811, 9740, 4279, 2209, 3165, 2000, 4300, 4104, 8036, 4264, 171, 7503, 7811, 2702, 1274, 4666, 4272, 5960, 11185, 5594, 12167, 1626, 5968, 6128, 2776, 5953, 8742, 6901, 8218, 4201, 8801, 7927, 5124, 6257, 2383, 9326, 3540, 10232, 1047, 2827, 4177, 6622, 7924, 8311, 3468, 7791, 10828, 7669, 5495, 4350, 10022, 7664, 296, 2525, 6632, 10202, 5144, 5958, 4274, 8507, 4093, 1757, 3615, 5007, 11625, 9936, 10780, 2568, 7980, 6639, 8235, 1608, 5882, 8225, 3319, 4180, 7984, 9272, 7429, 2563, 811, 2256, 10760, 379, 3526, 3433, 9946, 5201, 6566, 9934, 11627, 1321, 11630, 3232, 7512, 9385, 8950, 6764, 4368, 10352, 5479, 2174, 7397, 8893, 3009, 10612, 4921, 1921, 9790, 429, 544, 3248, 5372, 8045, 5950, 6987, 7016, 1994, 2428, 7767, 1091, 2308, 11811, 980, 11363, 6192, 10643, 6209, 8350, 8461, 6982, 5006, 3685, 1758, 3585, 2698, 4026, 3605, 11087, 6652, 4194, 11086, 3610, 4027, 10072, 4077, 10726, 11637, 4456, 4669, 10919, 8834, 8081, 9810, 5233, 6709, 9541, 9239, 10440, 9251, 1134, 2697, 3613, 1759, 8722, 12066, 3267, 2983, 7451, 814, 9410, 10313, 12234, 10697, 4172, 375, 9708, 6055, 11318, 10529, 8706, 224, 1858, 8403, 4401, 6179, 4155, 6935, 7997, 8355, 9456, 4579, 2762, 6677, 4320, 1332, 969, 1762, 7327, 6335, 8568, 5389, 7363, 4969, 11793, 5860, 10231, 3711, 9327, 719, 9030, 8122, 883, 7911, 1767, 3956, 442, 2886, 1278, 5103, 3432, 3663, 380, 1775, 2665, 485, 178, 10505, 11842, 1792, 5395, 1807, 10013, 1843, 4726, 2047, 7, 1537, 1639, 7262, 424, 1707, 11146, 9094, 7546, 10945, 10039, 7405, 1735, 6011, 8441, 116, 9244, 1741, 11902, 10730, 7234, 9715, 8087, 8572, 4363, 3980, 9200, 12095, 9170, 1747, 233, 10767, 11579, 53, 1594, 1149, 3303, 8366, 12243, 3005, 4592, 7894, 7790, 3703, 8312, 9839, 11452, 6219, 10174, 10610, 3011, 103, 5791, 8490, 11219, 1369, 8693, 4209, 11353, 8163, 4145, 5197, 11498, 12150, 5255, 10160, 1566, 4628, 6853, 5916, 6132, 1604, 5889, 12121, 3386, 4696, 11874, 9945, 3662, 3527, 5104, 2791, 2928, 4033, 11830, 9258, 1019, 2760, 4581, 5534, 3973, 4488, 9755, 622, 1007, 11717, 5898, 1753, 2236, 6357, 3138, 5294, 1925, 9004, 11463, 8432, 4995, 12076, 5276, 5292, 3140, 9430, 3084, 11808, 4891, 8645, 9281, 8947, 1590, 8119, 6371, 6159, 9515, 3892, 4695, 3437, 12122, 2444, 11330, 7300, 9065, 5850, 6470, 3125, 4345, 2741, 9955, 4826, 10154, 8138, 6489, 908, 704, 1901, 10048, 4560, 7556, 9867, 11021, 6839, 2245, 1057, 12139, 10558, 12084, 10784, 6791, 10468, 8448, 9829, 2050, 10121, 5706, 2206, 246, 8260, 2219, 4590, 3007, 8895, 10700, 2903, 8638, 5526, 1613, 8049, 7495, 2547, 8012, 343, 3752, 11252, 4212, 949, 1411, 7216, 3914, 1379, 6849, 6655, 6620, 4179, 3673, 8226, 10381, 7386, 10302, 1220, 10579, 11046, 7412, 6642, 2232, 821, 6295, 4219, 12025, 8365, 3475, 1150, 9482, 7109, 1382, 6301, 6165, 10861, 11558, 3048, 1851, 4334, 7879, 9185, 10092, 7718, 1402, 10363, 8881, 827, 7318, 498, 9581, 9775, 847, 7899, 15, 769, 2379, 2939, 1209, 5983, 2566, 10782, 12086, 2982, 3581, 12067, 5228, 10847, 5766, 2882, 6527, 11569, 8752, 4168, 5920, 7039, 11398, 9128, 12255, 1863, 11189, 6084, 5371, 3636, 545, 4615, 1814, 3989, 7359, 1285, 2476, 641, 2432, 9416, 9958, 10713, 6758, 12270, 7511, 3654, 11631, 4752, 11897, 4024, 2700, 7813, 4988, 8908, 6440, 1949, 10141, 6446, 11640, 9085, 4160, 1838, 990, 4118, 1266, 5452, 11979, 2944, 11952, 1720, 11833, 9211, 648, 9071, 8130, 6843, 2768, 5411, 8532, 4984, 1453, 1142, 8785, 4744, 8040, 3053, 11280, 574, 6605, 7883, 10870, 27, 3951, 10502, 11540, 4059, 452, 7841, 6274, 4474, 7303, 10838, 1196, 4046, 2409, 11673, 1120, 8486, 10606, 4845, 2367, 1999, 3743, 2210, 6026, 890, 9035, 35, 8535, 1039, 580, 11592, 7611, 1165, 5745, 10671, 39, 2766, 6845, 8436, 1644, 6082, 11191, 942, 9423, 7576, 9429, 3401, 5293, 3411, 6358, 7277, 4896, 8458, 1416, 7867, 10511, 11225, 4764, 10250, 4433, 4344, 3378, 6471, 11502, 8522, 63, 193, 8806, 10543, 5149, 2528, 2659, 11038, 3845, 541, 11179, 8057, 10617, 6789, 10786, 91, 4409, 8999, 2198, 1549, 9190, 10739, 9188, 1551, 5710, 7244, 135, 2260, 5034, 5600, 9995, 8308, 8804, 195, 5832, 10278, 11807, 3399, 9431, 315, 351, 6739, 455, 9083, 11642, 819, 2234, 1755, 4095, 4, 9832, 10924, 11344, 1446, 11704, 6882, 5509, 7448, 4650, 5695, 12016, 5016, 10666, 4312, 5238, 12100, 5165, 11279, 3192, 8041, 2747, 8699, 1850, 3294, 11559, 12172, 8794, 10549, 12184, 6500, 6292, 5049, 1848, 8701, 11156, 10933, 5361, 4257, 10567, 458, 8863, 11271, 4049, 10345, 7129, 930, 12224, 12098, 5240, 5258, 1139, 1176, 1327, 4304, 8619, 4861, 322, 10654, 6326, 102, 3461, 10611, 3643, 8894, 3343, 4591, 3472, 12244, 7542, 2624, 5778, 6591, 11576, 2193, 5675, 8421, 11772, 5693, 4652, 5130, 2420, 1270, 4613, 547, 9442, 1033, 4648, 7450, 3580, 3268, 12087, 7460, 7380, 4205, 5193, 5554, 7266, 6723, 9565, 6405, 4066, 5168, 2678, 501, 613, 5465, 10026, 9905, 8577, 8750, 11571, 6514, 5507, 6884, 10423, 370, 4009, 1377, 3916, 1303, 10490, 6911, 6830, 7591, 417, 12143, 11951, 3210, 11980, 6345, 7350, 1208, 3274, 2380, 12130, 11590, 582, 11489, 7722, 1161, 11941, 7084, 4032, 3429, 2792, 12268, 6760, 8393, 5352, 4294, 1300, 8455, 421, 9640, 10132, 6174, 9671, 11163, 7003, 11618, 10841, 587, 6041, 6715, 5280, 7743, 4776, 8637, 3340, 10701, 4198, 5547, 4451, 335, 10571, 4689, 208, 11996, 1474, 1534, 9560, 11817, 6002, 1434, 1277, 3530, 443, 10657, 6526, 3262, 5767, 11474, 8712, 1977, 7065, 7029, 11152, 9856, 9051, 2332, 7465, 638, 7059, 1444, 11346, 9146, 4714, 6801, 1571, 1885, 4712, 9148, 8889, 9206, 11975, 10641, 6194, 366, 6698, 8467, 2069, 470, 6289, 11741, 9302, 11257, 9477, 9597, 8148, 5911, 186, 8347, 11367, 4551, 4388, 12276, 11266, 3933, 8732, 7711, 9793, 10374, 7237, 4176, 3708, 1048, 4933, 9752, 7827, 7808, 8425, 475, 2402, 3903, 5645, 10059, 3750, 345, 1031, 9444, 2693, 4850, 8181, 11138, 8988, 5181, 5472, 7788, 7896, 10004, 10692, 6184, 2125, 3764, 7456, 11555, 7646, 6945, 12267, 2927, 3430, 5105, 12148, 11500, 6473, 4980, 10674, 4242, 6341, 561, 11962, 7201, 5364, 6985, 5952, 3723, 6129, 8900, 8398, 2026, 4936, 11486, 5410, 3201, 6844, 3150, 40, 7794, 6676, 3555, 4580, 3424, 1020, 1662, 2144, 8102, 2605, 1477, 741, 2005, 11610, 6073, 5579, 8698, 3051, 8042, 11031, 6561, 10936, 9954, 3376, 4346, 8417, 1728, 4692, 5610, 7971, 10972, 7761, 1228, 12280, 10754, 9398, 473, 8427, 6424, 5565, 9316, 5885, 5991, 10356, 5643, 3905, 5403, 1868, 8529, 86, 566, 7175, 10771, 3776, 9609, 11790, 9008, 2515, 4773, 5538, 1168, 1273, 3734, 7812, 3227, 4025, 3612, 3586, 1135, 2435, 4849, 2811, 9445, 4142, 2371, 6389, 10538, 9769, 7270, 12170, 11561, 10008, 5558, 8512, 9579, 500, 2969, 5169, 5846, 1075, 12073, 11204, 6701, 1026, 1054, 11230, 152, 2009, 484, 3523, 1776, 1066, 8305, 254, 11037, 3115, 2529, 8205, 8296, 4948, 7654, 2279, 6733, 5025, 11867, 9371, 2158, 6820, 6804, 7313, 11959, 6463, 1828, 7580, 5814, 7311, 6806, 10602, 8303, 1068, 10922, 9834, 8409, 1490, 6537, 6044, 8029, 12013, 716, 5777, 3002, 7543, 4251, 8027, 6046, 6114, 9374, 1127, 7333, 6551, 6530, 7934, 6535, 1492, 2067, 8469, 11389, 1532, 1476, 2755, 8103, 694, 4227, 841, 7605, 10705, 8292, 11106, 8412, 8330, 1985, 11071, 10018, 10942, 5689, 10884, 2303, 8199, 3911, 11690, 5940, 10267, 11913, 8718, 6235, 11417, 777, 2165, 1913, 5054, 8799, 4203, 7382, 1281, 1621, 7979, 3680, 10781, 3271, 5984, 810, 3668, 7430, 8407, 9836, 8476, 2551, 6863, 7909, 885, 7588, 12005, 6862, 2558, 8477, 8543, 8011, 3334, 7496, 11077, 6729, 3779, 2306, 1093, 1495, 10261, 7355, 9465, 4463, 7800, 8870, 11668, 7751, 1981, 8204, 2658, 3116, 5150, 6631, 3694, 297, 867, 12021, 1750, 9602, 5020, 2123, 6186, 4772, 2707, 9009, 11443, 1179, 11134, 5038, 240, 6120, 4446, 6017, 7967, 10959, 7232, 10732, 11208, 10367, 8650, 11861, 4577, 9458, 1916, 6450, 5935, 6396, 74, 5572, 7011, 6999, 9848, 10633, 11295, 2439, 1658, 4164, 5191, 4207, 8695, 7057, 640, 3241, 1286, 5310, 2102, 10385, 7634, 11886, 9875, 5542, 7213, 2098, 5803, 11496, 5199, 9948, 3840, 8937, 10240, 12284, 9218, 1366, 9656, 3881, 9729, 3814, 3976, 8823, 838, 6270, 4324, 4999, 11329, 3384, 12123, 5289, 9802, 1657, 2484, 11296, 7917, 4848, 2695, 1136, 9415, 3239, 642, 4951, 7766, 3629, 1995, 2396, 5620, 4872, 4732, 8925, 1269, 2991, 5131, 7781, 4759, 1470, 402, 9820, 6748, 6547, 7615, 11672, 3173, 4047, 11273, 10486, 4236, 4340, 3902, 2819, 476, 11311, 1045, 10234, 5619, 2426, 1996, 8167, 4817, 7732, 2318, 11564, 5823, 5810, 11074, 5032, 2262, 9325, 3713, 6258, 12129, 2938, 3275, 770, 1308, 6460, 564, 88, 7043, 6388, 2690, 4143, 8165, 1998, 3167, 4846, 7919, 1939, 7026, 11545, 11248, 11711, 10075, 1256, 5730, 5722, 8631, 663, 8607, 1510, 10517, 570, 6393, 6872, 7786, 5474, 414, 8855, 8628, 7089, 9827, 8450, 5979, 636, 7467, 1352, 9547, 8914, 7464, 2872, 9052, 1577, 10896, 3806, 808, 5986, 6126, 5970, 1878, 1466, 10690, 10006, 11563, 2391, 7733, 260, 8382, 6888, 4532, 11699, 1691, 4889, 11810, 3626, 1092, 2542, 3780, 8198, 2588, 10885, 1928, 1651, 4442, 1738, 107, 6942, 6688, 9198, 3982, 12037, 11066, 5522, 6625, 11435, 11440, 4392, 9487, 1598, 9969, 727, 9606, 6732, 2653, 7655, 10481, 8774, 10447, 4707, 6477, 1217, 9697, 1348, 7225, 7938, 8592, 4626, 1568, 6823, 9324, 2385, 5033, 3094, 136, 898, 10759, 3666, 812, 7453, 12229, 10832, 1343, 8788, 4885, 12207, 11228, 1056, 3361, 6840, 7632, 10387, 8922, 7730, 4819, 5837, 6356, 3413, 1754, 3075, 820, 3309, 6643, 9473, 8540, 7198, 607, 668, 11096, 5929, 5014, 12018, 4598, 4589, 3345, 8261, 8686, 8213, 577, 9930, 11034, 50, 6025, 3164, 3744, 4280, 245, 3348, 5707, 184, 5913, 11357, 67, 4519, 1548, 3103, 9000, 4572, 5733, 5674, 2998, 11577, 10769, 7177, 5221, 747, 8232, 7415, 7559, 7298, 11332, 7958, 4857, 3884, 7890, 11516, 11510, 10126, 7396, 3646, 5480, 6252, 10138, 4808, 10238, 8939, 6584, 1912, 2577, 778, 10113, 4894, 7279, 7106, 6819, 2648, 9372, 6116, 7151, 11302, 3927, 6036, 10118, 7482, 10339, 9068, 5844, 5171, 8101, 2757, 1663, 1899, 706, 4416, 7193, 11605, 7378, 7462, 8916, 4152, 507, 7476, 7047, 7033, 8843, 10724, 4079, 3763, 2799, 6185, 2518, 5021, 5568, 5617, 10236, 4810, 8272, 6069, 8826, 1680, 1390, 1123, 12126, 11759, 303, 1335, 1114, 6658, 10415, 5099, 10384, 2473, 5311, 4149, 5802, 2466, 7214, 1413, 8353, 7999, 7081, 11261, 11237, 7344, 953, 5656, 8597, 7146, 5505, 6516, 10525, 4964, 4429, 6434, 10894, 1579, 71, 4268, 11602, 10624, 10392, 4039, 5382, 469, 2851, 8468, 2610, 1493, 1095, 10866, 5385, 7551, 7501, 173, 6428, 8748, 8579, 11243, 9891, 6671, 10170, 7480, 10120, 3351, 9830, 6, 3512, 4727, 7115, 10323, 8325, 6975, 4287, 7524, 9161, 7857, 11372, 10774, 3889, 10265, 5942, 4941, 3818, 902, 10793, 9750, 4935, 2772, 8399, 10255, 6348, 9706, 377, 10762, 8497, 4549, 11369, 5858, 11795, 7853, 7222, 6456, 9203, 483, 2667, 153, 11891, 11609, 2752, 742, 1043, 11313, 4299, 3742, 3166, 2368, 8166, 2395, 2427, 3630, 7017, 6965, 4586, 6972, 4881, 4902, 8974, 11070, 2594, 8331, 11849, 8203, 2531, 7752, 8321, 7064, 2878, 8713, 56, 11212, 218, 10326, 6609, 12158, 7658, 8099, 5173, 10245, 3965, 12070, 10317, 5681, 94, 1812, 4617, 5906, 6650, 11089, 4111, 11767, 10804, 11288, 4806, 10140, 3222, 6441, 11216, 6776, 8239, 9261, 5161, 4360, 7167, 7025, 2364, 7920, 8641, 6811, 4217, 6297, 9568, 6647, 6835, 312, 1650, 2301, 10886, 9003, 3409, 5295, 1080, 9789, 3640, 4922, 333, 4453, 6449, 2495, 9459, 5053, 2576, 2166, 6585, 7071, 4062, 8972, 4904, 7189, 10186, 9817, 4656, 10047, 3368, 705, 2142, 1664, 10216, 8251, 10564, 279, 396, 682, 4913, 4610, 1171, 5422, 10459, 4711, 2862, 1572, 12165, 5596, 8160, 6857, 1465, 2323, 5971, 6662, 5630, 10184, 7191, 4418, 4000, 8208, 8528, 2717, 5404, 9332, 11920, 11188, 3252, 12256, 11906, 1513, 8402, 3565, 225, 6363, 8175, 5654, 955, 4333, 3293, 3049, 8700, 3039, 5050, 8115, 11916, 4725, 3514, 10014, 7583, 5136, 989, 3216, 4161, 8360, 6255, 5126, 4512, 758, 6866, 10402, 7579, 2642, 6464, 6481, 1239, 8415, 4348, 5497, 8935, 3842, 858, 6496, 3801, 1685, 3988, 3245, 4616, 1960, 95, 129, 4633, 10012, 3516, 5396, 7210, 1015, 9883, 8054, 8154, 10985, 9338, 5379, 7331, 1129, 6189, 6213, 5394, 3518, 11843, 5966, 1628, 8337, 9105, 750, 12110, 8769, 448, 4517, 69, 1581, 4421, 9158, 1065, 2664, 3524, 381, 10778, 9938, 11720, 7422, 1438, 3955, 3533, 7912, 5772, 10206, 7326, 3550, 970, 8721, 3584, 3614, 3686, 4094, 3074, 2235, 3414, 5899, 9601, 2521, 12022, 232, 3482, 9171, 7141, 4855, 7960, 11901, 3494, 9245, 106, 2298, 4443, 6010, 3499, 7406, 7389, 149, 8931, 206, 4691, 2738, 8418, 4037, 10394, 12011, 8031, 9256, 11832, 3208, 11953, 9392, 7601, 7054, 5582, 8066, 6227, 5520, 11068, 8976, 1244, 11145, 3506, 425, 10588, 5719, 4575, 11863, 10584, 6571, 11327, 5001, 5605, 3949, 29, 7784, 6874, 4888, 2311, 11700, 6250, 5482, 9652, 3987, 1816, 3802, 9120, 7445, 1389, 2114, 8827, 9279, 8647, 7369, 7953, 4412, 4231, 9180, 5501, 5806, 11052, 3809, 5094, 686, 10215, 1898, 2143, 2758, 1021, 8358, 4163, 2483, 2440, 9803, 995, 1642, 8438, 4441, 2300, 1929, 313, 9433, 6096, 8668, 6081, 3147, 8437, 1654, 996, 7261, 3509, 1538, 5878, 11966, 9275, 5964, 11845, 9405, 5764, 10849, 8336, 1789, 5967, 3726, 12168, 7272, 9230, 7978, 2570, 1282, 6543, 9137, 12251, 7308, 9504, 8048, 3337, 5527, 3898, 603, 5881, 3676, 8236, 10904, 5888, 3440, 6133, 5853, 1397, 10822, 9968, 2284, 9488, 6106, 1148, 3477, 54, 8715, 8118, 3393, 8948, 9387, 8092, 11057, 4683, 9690, 3998, 4420, 1780, 70, 2078, 10895, 2330, 9053, 5532, 4583, 12164, 1884, 2863, 6802, 6822, 2265, 4627, 3445, 10161, 8211, 8688, 653, 4755, 386, 8797, 5056, 9787, 1082, 3825, 1289, 182, 5709, 3098, 9189, 3102, 2199, 4520, 11200, 4327, 390, 8267, 6798, 630, 1189, 5877, 1638, 3510, 8, 9559, 2892, 1475, 2607, 11390, 10032, 8624, 11911, 10269, 3793, 5109, 6588, 12055, 8809, 711, 10098, 5113, 9577, 8514, 916, 10253, 8401, 1860, 11907, 10516, 2352, 8608, 9722, 9019, 204, 8933, 5499, 9182, 12199, 5248, 893, 4386, 4553, 11386, 10260, 2540, 1094, 2066, 2611, 6536, 2631, 8410, 11108, 1157, 521, 10336, 1002, 10930, 7521, 5211, 739, 1479, 740, 2754, 2606, 1533, 2893, 11997, 6420, 401, 2416, 4760, 10891, 10689, 2322, 1879, 6858, 12247, 4497, 8588, 4621, 6991, 59, 10037, 10947, 1174, 1141, 3197, 4985, 9113, 11094, 670, 9378, 11703, 3068, 11345, 2868, 7060, 9025, 6524, 10659, 3954, 1769, 7423, 4664, 1276, 2888, 6003, 1313, 3770, 6007, 6123, 8993, 732, 4645, 940, 11193, 10225, 6905, 11822, 4405, 9102, 12263, 7866, 3133, 8459, 8352, 2096, 7215, 3327, 950, 7806, 7829, 690, 6599, 9700, 9987, 10362, 3287, 7719, 79, 7528, 10821, 1601, 5854, 10210, 10711, 9960, 8484, 1122, 2113, 1681, 7446, 5511, 4052, 10683, 6402, 6300, 3299, 7110, 6848, 3324, 3915, 2954, 4010, 12146, 5107, 3795, 833, 7619, 8692, 3456, 11220, 9655, 2456, 9219, 946, 559, 6343, 11982, 11286, 10806, 4769, 1132, 9253, 6929, 5727, 9546, 2336, 7468, 6454, 7224, 2270, 9698, 6601, 4742, 8787, 2251, 10833, 11116, 6869, 5938, 11692, 11857, 1113, 2108, 304, 968, 3552, 4321, 9785, 5058, 4303, 3019, 1177, 11445, 4316, 1319, 11629, 3656, 11628, 1323, 4317, 9555, 4529, 785, 3769, 1432, 6004, 8502, 12092, 6459, 2377, 771, 781, 4134, 10489, 2952, 3917, 8454, 2921, 4295, 4535, 3970, 7747, 11378, 4606, 7822, 11880, 11537, 181, 1554, 3826, 5309, 2475, 3242, 7360, 6542, 1620, 2571, 7383, 5102, 3529, 2887, 1435, 4665, 3733, 2703, 1169, 4612, 2990, 2421, 8926, 5451, 3213, 4119, 6232, 973, 594, 11753, 6915, 4246, 9544, 5729, 2358, 10076, 12240, 12034, 9629, 9175, 8445, 11433, 6627, 611, 503, 11144, 1709, 8977, 4878, 8328, 8414, 1825, 6482, 10620, 8481, 11483, 11084, 4196, 10703, 7607, 5585, 12279, 2732, 7762, 7628, 5357, 251, 9998, 6768, 10578, 3314, 10303, 9696, 2272, 6478, 9902, 7258, 4792, 9744, 5561, 5982, 3273, 2940, 7351, 805, 11055, 8094, 8683, 8680, 5638, 10333, 8179, 4852, 4045, 3175, 10839, 11620, 10064, 6361, 227, 5876, 1540, 631, 176, 487, 8286, 3996, 9692, 3878, 10801, 11133, 2512, 11444, 1326, 3020, 1140, 1455, 10948, 5421, 1889, 4611, 1272, 2704, 5539, 5744, 3154, 7612, 11972, 11940, 2932, 7723, 4782, 520, 1487, 11109, 9778, 7252, 5084, 4107, 9481, 3302, 3476, 1595, 6107, 11785, 11044, 10581, 8784, 3196, 1454, 1175, 3021, 5259, 9414, 2434, 2696, 3587, 9252, 1357, 4770, 6188, 1796, 7332, 2617, 9375, 5287, 12125, 2112, 1391, 8485, 3171, 11674, 6826, 6150, 6618, 6657, 2107, 1336, 11858, 11747, 9178, 4233, 4137, 7571, 100, 6328, 8560, 6696, 368, 10425, 9038, 6206, 9144, 11348, 10865, 2065, 1494, 2541, 2307, 3627, 7768, 10743, 7963, 7292, 215, 9616, 5589, 3824, 1556, 9788, 1923, 5296, 12232, 10315, 12072, 2675, 5847, 10342, 5514, 3798, 8832, 10921, 2635, 8304, 2663, 1777, 9159, 7526, 81, 10042, 11234, 9620, 12138, 3360, 2246, 11229, 2670, 1027, 10198, 4946, 8298, 4932, 2826, 3709, 10233, 2399, 11312, 2003, 743, 9928, 579, 3158, 8536, 8959, 8078, 938, 4647, 2986, 9443, 2813, 346, 5207, 10197, 1053, 2671, 6702, 12, 9454, 8357, 1661, 2759, 3425, 9259, 8241, 9882, 1804, 7211, 5544, 8221, 7123, 9235, 9098, 11716, 3417, 623, 966, 306, 10929, 1484, 10337, 7484, 4736, 4790, 7260, 1641, 1655, 9804, 9851, 4373, 4117, 3215, 1839, 5137, 10135, 8363, 12027, 3909, 8201, 11851, 11362, 3624, 11812, 9889, 11245, 10287, 7991, 593, 1263, 6233, 8720, 1761, 3551, 1333, 305, 1005, 624, 4602, 5717, 10590, 7289, 9844, 8906, 4990, 10106, 4332, 1853, 5655, 2089, 7345, 7805, 1410, 3328, 4213, 558, 1364, 9220, 10844, 9422, 3144, 11192, 1425, 4646, 1035, 8079, 8836, 4127, 5434, 6375, 10087, 12223, 3026, 7130, 437, 11308, 8666, 6098, 6078, 3941, 9450, 7739, 10272, 6432, 4431, 10252, 1516, 8515, 5284, 673, 4541, 10994, 7684, 703, 3370, 6490, 3920, 258, 7735, 10792, 2030, 3819, 9681, 10758, 2258, 137, 7036, 11932, 4385, 1500, 5249, 9034, 3162, 6027, 5328, 762, 7587, 2555, 7910, 3535, 8123, 7100, 5153, 7228, 8188, 4470, 11798, 5042, 464, 6053, 9710, 11513, 6201, 4596, 12020, 2523, 298, 412, 5476, 8074, 11733, 6223, 6416, 6495, 1819, 3843, 11040, 5663, 10001, 850, 11438, 11437, 853, 10002, 7898, 3279, 9776, 11111, 10964, 7974, 7604, 2601, 4228, 6269, 2449, 8824, 6071, 11612, 7618, 1372, 3796, 5516, 4427, 4966, 7317, 3284, 8882, 3858, 6577, 5047, 6294, 3308, 2233, 3076, 11643, 11928, 6521, 9409, 3578, 7452, 2255, 3667, 2564, 5985, 2327, 3807, 11054, 1206, 7352, 9519, 6880, 11706, 9355, 4568, 12212, 6954, 5141, 6786, 6485, 9825, 7091, 8840, 140, 9501, 5817, 9166, 3768, 1315, 4530, 6890, 4133, 1306, 772, 10112, 2164, 2578, 11418, 6089, 4398, 10111, 780, 1307, 2378, 3276, 16, 5784, 5214, 7775, 11533, 7586, 887, 5329, 7907, 6865, 1832, 4513, 11525, 4704, 7155, 408, 10998, 12109, 1786, 9106, 8231, 2188, 5222, 5262, 9927, 1042, 2004, 2753, 1478, 1480, 5212, 5786, 551, 4832, 9493, 4644, 1427, 8994, 9242, 118, 9605, 2282, 9970, 9899, 6467, 6136, 5736, 5761, 9029, 3538, 9328, 5776, 2626, 12014, 5697, 9290, 10097, 1521, 8810, 12237, 6266, 4415, 2141, 1900, 3369, 909, 7685, 6574, 158, 9353, 11708, 9133, 4679, 4226, 2603, 8104, 515, 6598, 1407, 7830, 8020, 10214, 1666, 5095, 10151, 4912, 1892, 397, 10283, 9538, 6217, 11454, 4672, 619, 4540, 913, 5285, 9377, 1449, 11095, 2226, 608, 7104, 7281, 8606, 2354, 8632, 10969, 10967, 8634, 9058, 7538, 12008, 11895, 4754, 1562, 8689, 7834, 5842, 9070, 3205, 9212, 11471, 362, 7652, 4950, 2431, 3240, 2477, 7058, 2870, 7466, 2338, 5980, 5563, 6426, 175, 1188, 1541, 6799, 4716, 12191, 6969, 4601, 965, 1006, 3418, 9756, 4539, 675, 4673, 9879, 9117, 11170, 5464, 2967, 502, 1247, 6628, 7103, 667, 2227, 7199, 11964, 5880, 1610, 3899, 5071, 8377, 9704, 6350, 10951, 433, 11752, 1262, 974, 7992, 7756, 9977, 10599, 6040, 2910, 10842, 9222, 5408, 11488, 2935, 11591, 3157, 1040, 9929, 2215, 8214, 6604, 3190, 11281, 8873, 6392, 2350, 10518, 4868, 7174, 2714, 87, 2375, 6461, 11961, 2782, 6342, 1363, 947, 4214, 11427, 6067, 8274, 200, 4831, 736, 5787, 5999, 9441, 2988, 4614, 3247, 3637, 430, 11178, 3112, 3846, 12175, 11855, 11694, 11028, 5375, 5270, 5326, 6029, 162, 10179, 11987, 4492, 5340, 8107, 4307, 5652, 8177, 10335, 1486, 1158, 4783, 3867, 9294, 6597, 692, 8105, 5342, 24, 4425, 5518, 6229, 7475, 2133, 4153, 6181, 11143, 1246, 612, 2968, 2679, 9580, 3282, 7319, 8746, 6430, 10274, 4437, 7818, 11413, 7248, 7489, 8285, 1186, 177, 3522, 2666, 2010, 9204, 8891, 7399, 9980, 8664, 11310, 2401, 2820, 8426, 2728, 9399, 6288, 2850, 2070, 5383, 10868, 7885, 6052, 874, 5043, 12156, 6611, 8255, 8862, 3032, 10568, 9082, 3079, 6740, 7840, 3181, 4060, 7073, 4516, 1783, 8770, 10498, 6324, 10656, 2885, 3531, 3957, 10306, 4087, 11307, 928, 7131, 113, 11751, 596, 10952, 11177, 543, 3638, 9791, 7713, 10587, 1706, 3507, 7263, 9639, 2919, 8456, 4898, 12142, 2947, 7592, 8854, 2345, 5475, 865, 299, 4466, 10997, 753, 7156, 4510, 5128, 4654, 9819, 2415, 1471, 6421, 12135, 10282, 681, 1893, 280, 11634, 7536, 9060, 8266, 1544, 4328, 10547, 8796, 1560, 4756, 32, 10428, 10777, 1774, 3525, 3664, 10761, 2021, 9707, 3572, 4173, 10444, 7565, 4008, 2956, 10424, 1102, 6697, 2854, 6195, 6921, 7651, 645, 11472, 5769, 6367, 5252, 11394, 7905, 5331, 243, 4282, 6738, 3081, 316, 11127, 9358, 5206, 1030, 2814, 3751, 3332, 8013, 3784, 8277, 145, 9344, 9080, 10570, 2898, 4452, 1919, 4923, 4975, 9645, 5827, 11727, 9508, 5089, 11684, 6410, 10653, 3015, 4862, 4954, 5740, 4676, 11126, 350, 3082, 9432, 1649, 1930, 6836, 9078, 9346, 5945, 10928, 1004, 967, 1334, 2109, 11760, 7798, 4465, 411, 866, 2524, 3695, 7665, 12080, 9395, 10816, 5870, 6314, 7569, 4139, 6380, 5457, 4700, 9736, 5428, 4750, 11633, 395, 1894, 10565, 4259, 9662, 11574, 6593, 9228, 7274, 10067, 7692, 11421, 9767, 10540, 12058, 8069, 8984, 3925, 11304, 8381, 2316, 7734, 905, 3921, 48, 11036, 2661, 8306, 9997, 1224, 5358, 6564, 5203, 8259, 3347, 2207, 4281, 354, 5332, 6119, 2509, 5039, 4802, 4563, 6509, 5700, 10766, 3481, 1748, 12023, 4221, 6064, 5875, 1191, 6362, 1857, 3566, 8707, 9023, 7062, 8323, 10325, 1973, 11213, 9615, 1086, 7293, 8885, 7014, 6989, 4623, 11995, 2895, 4690, 1730, 8932, 1506, 9020, 9308, 4830, 553, 8275, 3786, 10979, 5831, 3088, 8805, 3120, 64, 9265, 7050, 9233, 7125, 8346, 2841, 5912, 2204, 5708, 1553, 1290, 11538, 10504, 3521, 486, 1187, 632, 6427, 2060, 7502, 3737, 4265, 6399, 8851, 8904, 9846, 7001, 11165, 10178, 531, 6030, 9908, 9352, 700, 6575, 3860, 5867, 11890, 2008, 2668, 11231, 8930, 1732, 7390, 11871, 9343, 339, 8278, 10914, 7183, 9500, 790, 8841, 7035, 897, 2259, 3095, 7245, 11827, 5679, 10319, 4632, 1810, 96, 5322, 7705, 10716, 10406, 6694, 8562, 10664, 5018, 9604, 729, 9243, 3496, 8442, 11750, 435, 7132, 5757, 4357, 3946, 6941, 2297, 1739, 9246, 5790, 3460, 3012, 6327, 1106, 7572, 11662, 5321, 128, 1811, 1961, 5682, 4408, 3106, 10787, 7042, 2374, 565, 2715, 8530, 5413, 7403, 10041, 1062, 7527, 1400, 7720, 11491, 5336, 5571, 2491, 6397, 4267, 2077, 1580, 1781, 4518, 2201, 11358, 9264, 192, 3121, 8523, 4835, 10036, 1458, 6992, 11211, 1975, 8714, 1593, 3478, 11580, 6024, 2212, 11035, 256, 3922, 8816, 9285, 4748, 5430, 10826, 7793, 2765, 3151, 10672, 4982, 8534, 3160, 9036, 10427, 384, 4757, 7783, 1695, 3950, 3186, 10871, 4424, 512, 5343, 9496, 9363, 5530, 9055, 4779, 5783, 768, 3277, 7900, 9453, 1024, 6703, 11060, 9558, 1536, 3511, 2048, 9831, 3072, 4096, 6144, 12288]
diff --git a/code/falcon/profile_action.py b/code/falcon/profile_action.py
deleted file mode 100755
index 9de5125..0000000
--- a/code/falcon/profile_action.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""
-Profile the code with:
-> make profile
-"""
-from test import test_falcon
-
-if __name__ == "__main__":
- test_falcon(128, 100)
diff --git a/code/falcon/sampler.py b/code/falcon/sampler.py
deleted file mode 100755
index 46da3ae..0000000
--- a/code/falcon/sampler.py
+++ /dev/null
@@ -1,75 +0,0 @@
-"""This file contains an implementation of a Gaussian sampler over Z."""
-
-from random import randint, uniform # Generate uniform deviates
-from math import exp, floor # Useful math functions
-
-
-"""Cumulative distribution table of the Gaussian distribution D of standard
-deviation 2, centerered on 0 and discretized over [0,1,2,...,18]. Each
-i-th pair of 64-bit integer represents the high and low bits of D[i]."""
-half_gaussian_cdt = [[0x55252c92c6309bbb, 0xeff1ff6ad56fd4b1],
- [0xa0491cdd90d2d8a4, 0x4f0c0f90811e39be],
- [0xd3edc464091b70d2, 0xcb37ce85d4b8dce9],
- [0xef924604b256a75c, 0x7a3caaf0cb173bd8],
- [0xfb1833430a9d94bd, 0x5fbf90ae3141bb81],
- [0xfed5e6b74505d076, 0x8acc840738ebde7d],
- [0xffc80bc4696667d7, 0xdcb66b63fa04c293],
- [0xfff7ba229ae8d348, 0x7a056dafc20b1f65],
- [0xffff0a0ad5f8437f, 0xd790e30964553636],
- [0xffffe99c18e415f6, 0x2de7f9836e8afd75],
- [0xfffffe679eaba03f, 0x6ac67fdd56777058],
- [0xffffffe9412624c4, 0xfcb045fd8c6b52ab],
- [0xffffffff02b0abdf, 0x07277f30389a9821],
- [0xfffffffff7660ff9, 0x026fcb549becf9fc],
- [0xffffffffffc5ab77, 0xaf28abc08e058ec8],
- [0xfffffffffffecb84, 0xf1261cbb038fc65b],
- [0xfffffffffffffb08, 0x2520dda588f6f9f2],
- [0xfffffffffffffff0, 0x09225e35daae50ab],
- [0xffffffffffffffff, 0xd852a065f5bc5806]]
-
-
-"""This is the standard deviation used for the half-Gaussian."""
-sigma0 = 2
-
-
-def sampler_half_gaussian():
- """Sample an integer z according to the half-Gaussian distribution.
-
- The CDF of the half-Gaussian distribution is given in half_gaussian_cdt.
- """
- u0 = randint(0, (1 << 64) - 1)
- z = 0
- p0 = half_gaussian_cdt[z][0]
- # Scan the CDF table for the index where
- # the uniform deviate x0 exceeds the value of the CDF
- while u0 > p0:
- z += 1
- p0 = half_gaussian_cdt[z][0]
- if u0 < p0:
- return z
- # In the very rare case where u0 = p0, we have to draw additional bits
- if u0 == p0:
- u1 = randint(0, (1 << 64) - 1)
- p1 = half_gaussian_cdt[z][1]
- if u1 < p1:
- return z
- else:
- return z + 1
-
-
-def sampler_z(sigma, mu):
- """Sample an integer z according to a discrete Gaussian distribution.
-
- The discrete Gaussian must have:
- - a standard deviation sigma =< sigma0
- - a center mu which may be anywhere in R
- """
- while(1):
- z0 = sampler_half_gaussian()
- b = randint(0, 1)
- z = (2 * b - 1) * z0 + b + floor(mu)
- x = (z0 ** 2) / (2. * (sigma0 ** 2)) - ((z - mu) ** 2) / (2. * (sigma ** 2))
- p = exp(x)
- u = uniform(0, 1)
- if u < p:
- return z
diff --git a/code/falcon/test.py b/code/falcon/test.py
deleted file mode 100755
index 3daa786..0000000
--- a/code/falcon/test.py
+++ /dev/null
@@ -1,240 +0,0 @@
-"""
-This file implements tests for various parts of the Falcon.py library.
-
-Test the code with:
-> make test
-"""
-from common import q, sqnorm
-from fft import add, sub, mul, div, neg, fft, ifft
-from ntt import mul_zq, div_zq
-from sampler import sampler_z
-from ffsampling import ffldl, ffldl_fft, ffnp, ffnp_fft
-from ffsampling import gram
-from random import randint, random, gauss
-from math import pi, sqrt, floor, ceil, exp
-from ntrugen import karamul, ntru_gen, gs_norm
-from falcon import SecretKey, PublicKey
-from encoding import compress, decompress
-import sys
-if sys.version_info >= (3, 4):
- from importlib import reload # Python 3.4+ only.
-
-
-def vecmatmul(t, B):
- """Compute the product t * B, where t is a vector and B is a square matrix.
-
- Args:
- B: a matrix
-
- Format: coefficient
- """
- nrows = len(B)
- ncols = len(B[0])
- deg = len(B[0][0])
- assert(len(t) == nrows)
- v = [[0 for k in range(deg)] for j in range(ncols)]
- for j in range(ncols):
- for i in range(nrows):
- v[j] = add(v[j], mul(t[i], B[i][j]))
- return v
-
-
-def test_fft(n, iterations=10):
- """Test the FFT."""
- for i in range(iterations):
- f = [randint(-3, 4) for j in range(n)]
- g = [randint(-3, 4) for j in range(n)]
- h = mul(f, g)
- k = div(h, f)
- k = [int(round(elt)) for elt in k]
- if k != g:
- print("(f * g) / f =", k)
- print("g =", g)
- print("mismatch")
- return False
- return True
-
-
-def test_ntt(n, iterations=10):
- """Test the NTT."""
- for i in range(iterations):
- f = [randint(0, q - 1) for j in range(n)]
- g = [randint(0, q - 1) for j in range(n)]
- h = mul_zq(f, g)
- try:
- k = div_zq(h, f)
- if k != g:
- print("(f * g) / f =", k)
- print("g =", g)
- print("mismatch")
- return False
- except ZeroDivisionError:
- continue
- return True
-
-
-def check_ntru(f, g, F, G):
- """Check that f * G - g * F = 1 mod (x ** n + 1)."""
- a = karamul(f, G)
- b = karamul(g, F)
- c = [a[i] - b[i] for i in range(len(f))]
- return ((c[0] == q) and all(coef == 0 for coef in c[1:]))
-
-
-def test_ntrugen(n, iterations=10):
- """Test ntru_gen."""
- for i in range(iterations):
- f, g, F, G = ntru_gen(n)
- if check_ntru(f, g, F, G) is False:
- return False
- return True
-
-
-def gaussian(sigma, mu, x):
- """The Gaussian function."""
- return exp(- ((x - mu) ** 2) / (2. * (sigma ** 2)))
-
-
-def test_sampler_z(sigma, mu, iterations):
- """Test the integer Gaussian sampler."""
- den = sqrt(2 * pi) * sigma
- start = int(floor(mu - 10 * sigma))
- end = int(ceil(mu + 10 * sigma))
- index = range(start, end)
- ref_table = {z: int(round(iterations * gaussian(sigma, mu, z)) / den) for z in index}
- obs_table = {z: 0 for z in index}
- for i in range(iterations):
- z = sampler_z(sigma, mu)
- obs_table[z] += 1
- delta = sum(abs(ref_table[i] - obs_table[i]) for i in index) / float(iterations)
- # print obs_table
- print(delta)
- # return obs_table
-
-
-def test_ffnp(n, iterations):
- """Test ffnp.
-
- This functions check that:
- 1. the two versions (coefficient and FFT embeddings) of ffnp are consistent
- 2. ffnp output lattice vectors close to the targets.
- """
- f, g, F, G = ntru_gen(n)
- B = [[g, neg(f)], [G, neg(F)]]
- G0 = gram(B)
- G0_fft = [[fft(elt) for elt in row] for row in G0]
- T = ffldl(G0)
- T_fft = ffldl_fft(G0_fft)
-
- sqgsnorm = gs_norm(f, g, q)
- m = 0
- for i in range(iterations):
- t = [[random() for i in range(n)], [random() for i in range(n)]]
- t_fft = [fft(elt) for elt in t]
-
- z = ffnp(t, T)
- z_fft = ffnp_fft(t_fft, T_fft)
-
- zb = [ifft(elt) for elt in z_fft]
- zb = [[round(coef) for coef in elt] for elt in zb]
- if z != zb:
- print("ffnp and ffnp_fft are not consistent")
- return False
- diff = [sub(t[0], z[0]), sub(t[1], z[1])]
- diffB = vecmatmul(diff, B)
- norm_zmc = int(round(sqnorm(diffB)))
- m = max(m, norm_zmc)
- th_bound = (n / 4.) * sqgsnorm
- if m > th_bound:
- print("Warning: the algorithm does not output vectors as short as expected")
- return False
- else:
- return True
-
-
-def test_compress(n, iterations):
- """Test compression and decompression."""
- sigma = 1.5 * sqrt(q)
- for i in range(iterations):
- initial = [int(round(gauss(0, sigma))) for coef in range(n)]
- compressed = compress(initial)
- decompressed = decompress(compressed)
- # print compressed
- if decompressed != initial:
- return False
- return True
-
-
-def test_falcon(n, iterations=10):
- """Test Falcon."""
- sk = SecretKey(n)
- pk = PublicKey(sk)
- for i in range(iterations):
- message = "0"
- sig = sk.sign(message)
- if pk.verify(message, sig) is False:
- return False
- return True
-
-
-def make_matrix(v):
- n = len(v)
- M = [[v[i] * v[j] for j in range(n)] for i in range(n)]
- return M
-
-
-def test_covariance(n, iterations=100):
- """
- Compute the covariance matrix of the signatures distribution.
-
- For an isotropic Gaussian, the covariance matrix is
- proportional to the identity matrix.
- """
- sk = SecretKey(n)
- liste_sig = []
- mean = [0] * (2 * n)
- Cov = [[0 for _ in range(2 * n)] for _ in range(2 * n)]
- for i in range(iterations):
- message = "0"
- r, s = sk.sign(message)
- s = s[0] + s[1]
- mean = add(mean, s)
- liste_sig += [s]
- # mean = [elt / iterations for elt in mean]
- # print(liste_sig)
- print("mean = {mean}".format(mean=mean))
- for s in liste_sig:
- s = [iterations * elt for elt in s]
- s = [(s[i] - mean[i]) for i in range(2 * n)]
- M = make_matrix(s)
- for i in range(2 * n):
- Cov[i] = add(Cov[i], M[i])
- for i in range(2 * n):
- for j in range(2 * n):
- Cov[i][j] /= (iterations ** 3)
- print(Cov)
- return Cov
-
-
-def test(n, iterations=10):
- """A battery of tests."""
- sys.stdout.write('Test FFT : ')
- print("OK" if test_fft(n, iterations) else "Not OK")
- sys.stdout.write('Test NTT : ')
- print("OK" if test_ntt(n, iterations) else "Not OK")
- sys.stdout.write('Test ntru_gen : ')
- print("OK" if test_ntrugen(n, iterations // 10) else "Not OK")
- sys.stdout.write('Test ffnp : ')
- print("OK" if test_ffnp(n, iterations) else "Not OK")
- sys.stdout.write('Test compression : ')
- print("OK" if test_compress(n, iterations) else "Not OK")
- sys.stdout.write('Test Falcon : ')
- print("OK" if test_falcon(n, iterations) else "Not OK")
-
-
-# Run all the tests
-if (__name__ == "__main__"):
- for i in range(2, 8):
- n = (1 << i)
- print("Test battery for n = {n}".format(n=n))
- test(n)
diff --git a/code/generate_test_vectors.py b/code/generate_test_vectors.py
index 5aa6a16..9c8bcb3 100644
--- a/code/generate_test_vectors.py
+++ b/code/generate_test_vectors.py
@@ -161,11 +161,6 @@ def sample_drift(rng, support, probs, n, mu, sigma, drift_rate, tau=14):
# Multivariate vectors
# ---------------------------------------------------------------------------
-def multivariate_perfect(rng, dim, sigma, n):
- """iid N(0, sigma^2) per coordinate."""
- return rng.normal(0, sigma, size=(n, dim)).tolist()
-
-
def multivariate_inflated_correlation(rng, dim, sigma, n, rho_pair, pair):
"""
Perfect marginals, but coordinates pair[0] and pair[1] have
@@ -202,6 +197,52 @@ def multivariate_fft_tree_zeroed(rng, dim, sigma, n, zero_freq):
return data
+def multivariate_discrete_gaussian(rng, dim, sigma, n,
+ wrong_coord=None, wrong_factor=1.0):
+ """
+ iid *discrete* Gaussian over Z per coordinate -- integer-valued, like real
+ Falcon signatures (and unlike the continuous vectors above, which model
+ only the covariance structure). This exercises MultivariateSamples's
+ per-coordinate discrete channel (nb_gaussian_coord), which is skipped for
+ non-integer data.
+
+ Note: sampling the discrete Gaussian directly is required -- rounding a
+ continuous N(0, sigma) draw inflates the per-coordinate variance by ~1/12
+ and makes the squared-norm test false-alarm.
+
+ If wrong_coord is set, that one coordinate is sampled at sigma*wrong_factor
+ so the per-coordinate channel has a coordinate-level flaw to catch.
+ """
+ span = int(np.ceil(14 * sigma * max(1.0, wrong_factor)))
+ zs = np.arange(-span, span + 1)
+
+ def column(s):
+ p = np.exp(-(zs ** 2) / (2 * s ** 2))
+ p /= p.sum()
+ return rng.choice(zs, size=n, p=p)
+
+ data = np.empty((n, dim), dtype=int)
+ for j in range(dim):
+ s = sigma * wrong_factor if (wrong_coord is not None
+ and j == wrong_coord) else sigma
+ data[:, j] = column(s)
+ return data.tolist()
+
+
+def _as_int(samples):
+ """Round a constructed continuous sample matrix to integers.
+
+ Real Falcon signatures are integer vectors, so every multivariate vector
+ is discretized. For *flawed* (bad/mediocre) vectors, rounding is faithful:
+ the structural flaw (correlation, zeroed frequency, inflated norm)
+ survives, and the ~1/12 quantization variance is negligible next to it.
+ For a *good* vector rounding is NOT used -- it would inflate the
+ per-coordinate variance and false-alarm the squared-norm test; good
+ vectors are sampled directly as discrete Gaussians instead.
+ """
+ return np.round(np.asarray(samples)).astype(int).tolist()
+
+
# ---------------------------------------------------------------------------
# Vector definitions
# ---------------------------------------------------------------------------
@@ -445,17 +486,21 @@ def build_multivariate_vectors(n, seed):
dim = 128 # Falcon-64 signature dimension
sigma = 1.55
- # Good: iid Gaussian
+ # Good: iid discrete Gaussian over Z (integer-valued, like real Falcon
+ # signatures). Sampled directly (not rounded) so the per-coordinate
+ # variance is exact -- exercises the full battery including the
+ # per-coordinate discrete channel (nb_gaussian_coord should be dim/dim).
rng = np.random.default_rng(seed + 100)
vectors.append({
"label": "mv_good_iid",
"tier": "good",
- "description": f"iid N(0, {sigma}^2), dim={dim}",
+ "description": f"iid discrete Gaussian over Z, sigma={sigma}, dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "none"},
- "samples": multivariate_perfect(rng, dim, sigma, n)
+ "samples": multivariate_discrete_gaussian(rng, dim, sigma, n)
})
+
# Bad: one pair of coordinates correlated (rho=0.5)
rng = np.random.default_rng(seed + 101)
vectors.append({
@@ -464,18 +509,24 @@ def build_multivariate_vectors(n, seed):
"description": f"Coords 0,1 correlated (rho=0.5), dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "correlated_pair", "pair": [0, 1], "rho": 0.5},
- "samples": multivariate_inflated_correlation(rng, dim, sigma, n, 0.5, (0, 1))
+ "samples": _as_int(multivariate_inflated_correlation(rng, dim, sigma, n, 0.5, (0, 1)))
})
- # Bad: one coordinate has wrong variance
+ # Bad: one coordinate has wrong variance. This is a coordinate-level flaw
+ # with unchanged covariance structure, so DH/diagcov/max_offdiag/HZ all
+ # miss it -- only the per-coordinate discrete channel catches it. It must
+ # therefore be integer-valued (real Falcon signatures are), so the channel
+ # is active. (A continuous version is undetectable by the whole battery,
+ # and previously "passed" only because of a nan degeneracy now fixed.)
rng = np.random.default_rng(seed + 102)
vectors.append({
"label": "mv_bad_variance_one_coord",
"tier": "bad",
- "description": f"Coord 7 has 1.3x variance, dim={dim}",
+ "description": f"Discrete Gaussian, coord 7 at 1.3x sigma, dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "wrong_variance", "coord": 7, "factor": 1.3},
- "samples": multivariate_wrong_variance_one_coord(rng, dim, sigma, n, 7, 1.3)
+ "samples": multivariate_discrete_gaussian(rng, dim, sigma, n,
+ wrong_coord=7, wrong_factor=1.3)
})
# Bad: FFT-tree zeroed frequency
@@ -486,7 +537,7 @@ def build_multivariate_vectors(n, seed):
"description": f"FFT freq 3 zeroed (simulates tree bug), dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "fft_zeroed", "freq": 3},
- "samples": multivariate_fft_tree_zeroed(rng, dim, sigma, n, 3)
+ "samples": _as_int(multivariate_fft_tree_zeroed(rng, dim, sigma, n, 3))
})
# Bad: inflated norm (all coordinates positively correlated)
@@ -500,7 +551,7 @@ def build_multivariate_vectors(n, seed):
"description": f"All coords share a common factor (norm inflated), dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "norm_inflation", "shared_sigma_fraction": 0.3},
- "samples": data_norm.tolist()
+ "samples": _as_int(data_norm)
})
# Bad: two different distributions (simulates key-dependent output)
@@ -513,9 +564,9 @@ def build_multivariate_vectors(n, seed):
"description": f"Mixed: half from sigma, half from sigma*1.05, dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "cross_key", "sigma_ratio": 1.05},
- "samples": np.vstack([data_key1, data_key2]).tolist(),
- "samples_key1": data_key1.tolist(),
- "samples_key2": data_key2.tolist(),
+ "samples": _as_int(np.vstack([data_key1, data_key2])),
+ "samples_key1": _as_int(data_key1),
+ "samples_key2": _as_int(data_key2),
})
# Mediocre: weak single-pair correlation (rho=0.1)
@@ -526,7 +577,7 @@ def build_multivariate_vectors(n, seed):
"description": f"Coords 0,1 weakly correlated (rho=0.1), dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "correlated_pair", "pair": [0, 1], "rho": 0.1},
- "samples": multivariate_inflated_correlation(rng, dim, sigma, n, 0.1, (0, 1))
+ "samples": _as_int(multivariate_inflated_correlation(rng, dim, sigma, n, 0.1, (0, 1)))
})
# Mediocre: FFT frequency with reduced (not zeroed) variance
@@ -545,7 +596,7 @@ def build_multivariate_vectors(n, seed):
"description": f"FFT freq 5 at 70% variance, dim={dim}",
"params": {"sigma": sigma, "dim": dim, "n": n},
"flaw": {"type": "fft_weak", "freq": 5, "factor": 0.7},
- "samples": data_fft_weak,
+ "samples": _as_int(data_fft_weak),
})
return vectors
diff --git a/code/multivariate_tests.py b/code/multivariate_tests.py
index 9fad69a..e9d2451 100644
--- a/code/multivariate_tests.py
+++ b/code/multivariate_tests.py
@@ -408,7 +408,7 @@ def henze_zirkler_test(sigma, data, alpha=0.001, mc_B=100):
# ---------------------------------------------------------------------------
def run_multivariate_battery(sigma, data, cov_normalized, nsamples,
- per_coord_pvalues, alpha=0.001):
+ per_coord_pvalues, alpha=0.001, dc_pvalue=None):
"""
Run all extended multivariate tests.
@@ -417,8 +417,14 @@ def run_multivariate_battery(sigma, data, cov_normalized, nsamples,
data: n x dim array of samples
cov_normalized: dim x dim normalized covariance (already computed)
nsamples: number of samples
- per_coord_pvalues: list of chi-square p-values per coordinate
+ per_coord_pvalues: list of chi-square p-values per coordinate, or
+ None for non-integer data (the per-coordinate discrete channel
+ is then dropped from the verdict rather than fed nan p-values)
alpha: significance threshold
+ dc_pvalue: the diagcov p-value (from MultivariateSamples), folded
+ into the family verdict so a single correlated pair -- which
+ diagcov catches but the other components can miss -- is not
+ silently passed
Returns dict with results from each test and overall verdict.
"""
@@ -426,23 +432,35 @@ def run_multivariate_battery(sigma, data, cov_normalized, nsamples,
results = {}
results["squared_norm"] = squared_norm_test(sigma, data, alpha=alpha)
- results["fisher_bh"] = fisher_bh_meta(per_coord_pvalues, alpha=alpha)
results["max_offdiag"] = max_offdiag_correlation(
np.asarray(cov_normalized), nsamples, alpha=alpha)
results["fft_domain"] = fft_domain_battery(sigma, data, alpha=alpha)
results["henze_zirkler"] = henze_zirkler_test(sigma, data, alpha=alpha)
# Single family verdict via Fisher's method, plus a Bonferroni gate so
- # a lone strong flaw is never masked -- rather than AND-ing 5 tests each
- # at alpha (which inflates the family false-alarm rate). Individual
+ # a lone strong flaw is never masked -- rather than AND-ing the tests
+ # each at alpha (which inflates the family false-alarm rate). Individual
# results are reported above (report-first).
component_pvalues = {
"squared_norm": results["squared_norm"]["pvalue"],
- "fisher_bh": results["fisher_bh"]["fisher_pvalue"],
"max_offdiag": results["max_offdiag"]["pvalue"],
"fft_domain": results["fft_domain"]["fisher_pvalue"],
"henze_zirkler": results["henze_zirkler"]["pvalue"],
}
+ # diagcov: folded into the verdict (it catches correlated pairs the other
+ # components can dilute). Computed by MultivariateSamples, passed in here.
+ if dc_pvalue is not None:
+ component_pvalues["diagcov"] = float(dc_pvalue)
+ # Per-coordinate discrete Gaussianity channel: only for integer data.
+ # A single flawed coordinate dilutes in the Fisher-combined p-value, so we
+ # keep the BH-localization signal separate: bh_rejected_count > 0 fails the
+ # verdict even when the global Fisher p is not significant (plan item 5.2:
+ # Fisher for "is the sampler OK", BH for "which coordinate").
+ bh_localized_flaw = False
+ if per_coord_pvalues is not None:
+ results["fisher_bh"] = fisher_bh_meta(per_coord_pvalues, alpha=alpha)
+ component_pvalues["fisher_bh"] = results["fisher_bh"]["fisher_pvalue"]
+ bh_localized_flaw = results["fisher_bh"]["bh_rejected_count"] > 0
pvals = np.clip(np.array(list(component_pvalues.values()), dtype=float),
1e-300, 1.0)
fisher_stat = float(-2 * np.sum(np.log(pvals)))
@@ -455,7 +473,9 @@ def run_multivariate_battery(sigma, data, cov_normalized, nsamples,
results["global_pvalue"] = global_pvalue
results["bonferroni_rejects"] = [
name for name, p in component_pvalues.items() if p <= alpha / k]
+ results["bh_localized_flaw"] = bh_localized_flaw
results["all_pass"] = (global_pvalue > alpha
- and not results["bonferroni_rejects"])
+ and not results["bonferroni_rejects"]
+ and not bh_localized_flaw)
return results
diff --git a/code/saga.py b/code/saga.py
index c4731c6..88d4467 100644
--- a/code/saga.py
+++ b/code/saga.py
@@ -4,8 +4,10 @@
# Gaussian sampler
from sampler import samplerz
-# Imports Falcon signature scheme
-from falcon import falcon
+# The reference Falcon implementation (github.com/tprest/falcon.py) is a git
+# submodule under falcon/, imported lazily inside test_sig() so the rest of
+# the suite has no dependency on it (or on its extra deps: pycryptodome,
+# beartype). Fetch it with: git submodule update --init.
# Estimators for moments
from scipy.stats import skew, kurtosis, moment
@@ -19,7 +21,7 @@
import matplotlib.pyplot as plt
# Math functions
-from math import ceil, sqrt, exp, log
+from math import ceil, sqrt, exp, log, pi
# Data management
from copy import deepcopy
import re
@@ -107,6 +109,19 @@ def __init__(self, mu, sigma, list_samples, tau=14, chi2_bucket=10, pmin=0.001):
self.exp_sigma = sigma
# Number of samples
self.nsamples = len(list_samples)
+ # UnivariateSamples tests a discrete Gaussian over Z: the input must
+ # be integer-valued. Continuous input would land every sample outside
+ # the integer histogram, silently degenerating to n_effective = 0 and
+ # a nan chi-square p-value. Reject it up front with a clear message.
+ _arr = array(list_samples)
+ if _arr.size == 0:
+ raise ValueError("UnivariateSamples: empty sample list.")
+ if not (abs(_arr - _arr.round()) < 1e-9).all():
+ raise ValueError(
+ "UnivariateSamples expects integer samples (discrete Gaussian "
+ "over Z), but received non-integer values. For continuous "
+ "multivariate data, MultivariateSamples skips the "
+ "per-coordinate discrete channel automatically.")
self.histogram = dict()
self.outlier = 0
# Initialize histogram
@@ -194,7 +209,7 @@ def effect_sizes(self):
tv += abs(p_emp - p_ideal)
if p_ideal > 0:
chi2_unbucketed += (p_emp - p_ideal) ** 2 / p_ideal
- tv_null += sqrt(2 * p_ideal / (3.14159265 * n_eff))
+ tv_null += sqrt(2 * p_ideal / (pi * n_eff))
tv *= 0.5
tv_null *= 0.5
@@ -267,6 +282,11 @@ def chisquare(self):
obs.pop(-1)
exp.pop(-1)
n_effective = self.nsamples - self.outlier
+ if n_effective == 0:
+ raise ValueError(
+ "UnivariateSamples: every sample is an outlier (outside "
+ "[floor(mu) - tau*sigma, ceil(mu) + tau*sigma)). Check that "
+ "mu and sigma match the data.")
exp = [round(prob * n_effective) for prob in exp]
diff = sum(obs) - sum(exp)
exp[len(exp) // 2] += diff
@@ -298,12 +318,25 @@ def __init__(self, sigma, list_samples):
# Expected center and standard deviation
self.exp_mu = 0
self.exp_si = sigma
- # Testing sphericity
- # For each coordinate, perform an univariate analysis
- self.univariates = [None] * self.dim
- for i in range(self.dim):
- self.univariates[i] = UnivariateSamples(0, sigma, self.data[i])
- self.nb_gaussian_coord = sum((self.univariates[i].chi2_pvalue > pmin) for i in range(self.dim))
+ # Testing sphericity.
+ # The per-coordinate analysis uses UnivariateSamples, which tests a
+ # discrete Gaussian over Z and requires integer input (real Falcon
+ # signatures are integer-valued). For non-integer data -- e.g. a
+ # continuous multivariate Gaussian used to exercise the covariance
+ # machinery -- we skip the discrete per-coordinate channel rather than
+ # feed it non-integer data (which would degenerate to nan p-values).
+ _vals = array(self.data.values)
+ self.is_integer = bool((abs(_vals - _vals.round()) < 1e-9).all())
+ if self.is_integer:
+ self.univariates = [UnivariateSamples(0, sigma, self.data[i])
+ for i in range(self.dim)]
+ self.nb_gaussian_coord = sum(
+ (self.univariates[i].chi2_pvalue > pmin)
+ for i in range(self.dim))
+ else:
+ # Per-coordinate discrete channel not applicable to non-integer data
+ self.univariates = None
+ self.nb_gaussian_coord = None
# Estimate the (normalized) covariance matrix
self.covariance = cov(self.data.transpose()) / (self.exp_si ** 2)
self.DH, self.AS, self.PO, self.PA = doornik_hansen(self.data)
@@ -313,14 +346,18 @@ def __init__(self, sigma, list_samples):
def run_multivariate_battery(self):
"""Run the extended multivariate test battery (Phase 5)."""
from multivariate_tests import run_multivariate_battery
- per_coord_pvals = [self.univariates[i].chi2_pvalue
- for i in range(self.dim)]
+ # None for non-integer data: the battery then drops the per-coordinate
+ # Fisher channel rather than aggregating nan p-values.
+ per_coord_pvals = ([self.univariates[i].chi2_pvalue
+ for i in range(self.dim)]
+ if self.univariates is not None else None)
self._mv_extended = run_multivariate_battery(
self.exp_si,
self.data.values,
self.covariance,
self.nsamples,
per_coord_pvals,
+ dc_pvalue=self.dc_pvalue,
)
return self._mv_extended
@@ -348,7 +385,10 @@ def __repr__(self):
rep += "\n"
rep += "3 - P-value of covariance diagonals test: {p:.4f}\n".format(p=self.dc_pvalue)
rep += "\n"
- rep += "4 - Gaussian coordinates (w/ st. dev. = sigma)? {k} out of {dim}\n".format(k=self.nb_gaussian_coord, dim=self.dim)
+ if self.nb_gaussian_coord is None:
+ rep += "4 - Gaussian coordinates (w/ st. dev. = sigma)? n/a (non-integer data; discrete per-coordinate channel skipped)\n"
+ else:
+ rep += "4 - Gaussian coordinates (w/ st. dev. = sigma)? {k} out of {dim}\n".format(k=self.nb_gaussian_coord, dim=self.dim)
return rep
def to_dict(self):
@@ -358,7 +398,11 @@ def to_dict(self):
"doornik_hansen": {"stat": float(self.DH), "pvalue": float(self.PO)},
"anderson_scedasticity": {"stat": float(self.AS), "pvalue": float(self.PA)},
"diagcov_pvalue": float(self.dc_pvalue),
- "gaussian_coords": {"passing": int(self.nb_gaussian_coord), "total": self.dim},
+ "gaussian_coords": {
+ "passing": (int(self.nb_gaussian_coord)
+ if self.nb_gaussian_coord is not None else None),
+ "total": self.dim,
+ "applicable": self.is_integer},
"extended_tests": self._mv_extended,
}
@@ -724,53 +768,64 @@ def test_falcon():
return
-def test_sig(n=128, nb_sig=1000, perturb=False, level=0):
+def test_sig(n=128, nb_sig=1000):
"""
- Test signatures output by a Python implementation of Falcon.
- This test allow to perturb the FFT by setting the rightmost node
- of the FFT tree (of the private key) to 0. One can check that, at
- least for moderate levels (0 to 4), the test will end up detecting
- (via diagcov) that the signatures output do not follow the correct
- distribution.
+ Test the multivariate distribution of signatures produced by the
+ reference Falcon implementation (github.com/tprest/falcon.py, vendored
+ as the falcon/ submodule).
+
+ We sample the raw Gaussian preimage vector (s0, s1) directly, before the
+ norm-rejection step. That rejection sits ~6.7 sigma out (rejection mass
+ ~1e-11), so it is statistically indistinguishable from the accepted
+ signature distribution at any feasible sample size -- sampling the
+ preimage is the clean way to study the sampler output (this replaces the
+ old reject=False path, which the reference API no longer exposes).
Input:
- n: the degree of the ring
- nb_sig: number of signatures
- - perturb: if set to 1, one node in the FFT tree is set to 0
- - level: determines which node (the rightmost one at a given level)
- is set to 0
"""
+ import os
+ import sys
+ from os import urandom
+ # The submodule uses flat imports (from common import ...), so its own
+ # directory -- not the SAGA code/ directory -- must be on sys.path.
+ _falcon_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ "falcon")
+ if not os.path.isfile(os.path.join(_falcon_dir, "falcon.py")):
+ raise RuntimeError(
+ "falcon/ submodule not found. Fetch it with:\n"
+ " git submodule update --init\n"
+ "and install its extra deps: pip install pycryptodome beartype")
+ if _falcon_dir not in sys.path:
+ sys.path.insert(0, _falcon_dir)
+ import falcon as falcon_ref
+
start = time.time()
- # Generate a private key
- sk = falcon.SecretKey(n)
- # Perturb the FFT tree
- if perturb is True:
- # Check that the level is less than the FFT tree depth
- assert(1 << level) < n
- u, k = sk.T_fft, n
- # Find the node
- for _ in range(level):
- u = u[2]
- k >>= 1
- # Zero-ize the node
- u[0] = [0] * k
+ fal = falcon_ref.Falcon(n)
+ sk, _vk = fal.keygen()
+ B0_fft, T_fft = sk[4], sk[5]
end = time.time()
print("Took {t:.2f} seconds to generate the private key.".format(t=end - start))
- # Compute signatures
- message = "0"
+ # Sample the raw Gaussian preimage (s0, s1) for each of nb_sig messages,
+ # concatenating the two halves into one 2n-dimensional sample.
+ message = b"0"
start = time.time()
- list_signatures = [sk.sign(message, reject=False) for _ in range(nb_sig)]
- # Strip away the nonces and concatenate the s_1's and s_2's
- list_signatures = [sig[1][0] + sig[1][1] for sig in list_signatures]
+ list_signatures = []
+ for _ in range(nb_sig):
+ salt = urandom(falcon_ref.SALT_LEN)
+ hashed = fal.__hash_to_point__(message, salt)
+ s = fal.__sample_preimage__(B0_fft, T_fft, hashed)
+ list_signatures.append(list(s[0]) + list(s[1]))
end = time.time()
print("Took {t:.2f} seconds to generate the samples.".format(t=end - start))
# Perform the statistical test
start = time.time()
- samples_data = MultivariateSamples(sk.sigma, list_signatures)
+ samples_data = MultivariateSamples(fal.param.sigma, list_signatures)
end = time.time()
print("Took {t:.2f} seconds to run a statistical test.".format(t=end - start))
- return sk, samples_data
+ return fal, samples_data
diff --git a/code/sampler_rep.py b/code/sampler_rep.py
deleted file mode 100644
index e061edd..0000000
--- a/code/sampler_rep.py
+++ /dev/null
@@ -1,168 +0,0 @@
-# Importing dependencies
-from random import randint
-from math import floor, exp
-# For debugging purposes
-import sys
-if sys.version_info >= (3, 4):
- from importlib import reload # Python 3.4+ only.
-
-# Upper bound on all the values of sigma
-sigma0 = 1.8205
-# Lower bound on all the values of sigma
-sigmin = 1.3
-# Precision of the CDT
-cdt_precision = 72
-
-# New probability distribution table from [PRR19]
-halfgaussian_pdt = [
- 1697680241746640300030,
- 1459943456642912959616,
- 928488355018011056515,
- 436693944817054414619,
- 151893140790369201013,
- 39071441848292237840,
- 7432604049020375675,
- 1045641569992574730,
- 108788995549429682,
- 8370422445201343,
- 476288472308334,
- 20042553305308,
- 623729532807,
- 14354889437,
- 244322621,
- 3075302,
- 28626,
- 197,
- 1]
-
-# When in the same format as in Falcon's reference code, looks like this
-# 6031371 13708371 13035518
-# 5186761 1487980 12270720
-# 3298653 4688887 5511555
-# 1551448 9247616 9467675
-# 539632 14076116 5909365
-# 138809 10836485 13263376
-# 26405 15335617 16601723
-# 3714 14514117 13240074
-# 386 8324059 3276722
-# 29 12376792 7821247
-# 1 11611789 3398254
-# 0 1194629 4532444
-# 0 37177 2973575
-# 0 855 10369757
-# 0 14 9441597
-# 0 0 3075302
-# 0 0 28626
-# 0 0 197
-# 0 0 1
-
-
-def make_cdt(pdt):
- len_pdt = len(pdt)
- cdt = pdt[:-1]
- for i in range(1, len_pdt - 1):
- cdt[i] += cdt[i - 1]
- return cdt
-
-# Compute the CDT from the PDT
-halfgaussian_cdt = make_cdt(halfgaussian_pdt)
-
-# When in the same format as in Falcon's reference code, looks like this:
-# 6031371 13708371 13035518
-# 11218132 15196352 8529022
-# 14516786 3108023 14040577
-# 16068234 12355640 6731036
-# 16607867 9654540 12640401
-# 16746677 3713810 9126561
-# 16773083 2272212 8951068
-# 16776798 9114 5413926
-# 16777184 8333173 8690648
-# 16777214 3932749 16511895
-# 16777215 15544539 3132933
-# 16777215 16739168 7665377
-# 16777215 16776345 10638952
-# 16777215 16777201 4231493
-# 16777215 16777215 13673090
-# 16777215 16777215 16748392
-# 16777215 16777215 16777018
-# 16777215 16777215 16777215
-
-
-# 0, 0, 1,
-# 0, 0, 198,
-# 0, 0, 28824,
-# 0, 0, 3104126,
-# 0, 14, 12545723,
-# 0, 870, 6138264,
-# 0, 38047, 9111839,
-# 0, 1232676, 13644283,
-# 1, 12844466, 265321,
-# 31, 8444042, 8086568,
-# 417, 16768101, 11363290,
-# 4132, 14505003, 7826148,
-# 30538, 13063405, 7650655,
-# 169348, 7122675, 4136815,
-# 708981, 4421575, 10046180,
-# 2260429, 13669192, 2736639,
-# 5559083, 1580863, 8248194,
-# 10745844, 3068844, 3741698
-
-def sampler0():
- """Sample from a half-Gaussian."""
- r = randint(0, (1 << cdt_precision) - 1)
- z0 = 0
- for elt in halfgaussian_cdt:
- z0 += (r >= elt)
- return z0
-
-
-# Precision in bits of p in BerExp
-berexp_p = 64
-# Precision in bits of each rand in BerExp
-berexp_rand = 8
-rand_mask = (1 << berexp_rand) - 1
-# Sanity check
-assert(berexp_p % berexp_rand == 0)
-
-
-def berexp(x, sf):
- """
- Return True with a probability exp(-x).
- sf is a scaling factor.
- """
- # FIXME
- p = int(exp(-x) * sf * (1 << berexp_p)) - 1
- i = berexp_p
- # Careful: in C, i must be unsigned otherwise it might loop forever!
- while(i > 0):
- i -= berexp_rand
- r = randint(0, (1 << berexp_rand) - 1)
- # Si la randomness est plus faible que p, on accepte
- if r < ((p >> i) & rand_mask):
- return True
- # Si la randomness est plus elevee que p, on refuse
- if r > ((p >> i) & rand_mask):
- return False
- # Sinon, on continue jusqu'a ce que i = 0
- return True
-
-
-def samplerz_rep(center, sigma):
- """
- Sample from a discrete Gaussian with specified center and sigma.
- """
- assert(sigma < sigma0)
- assert(sigma >= sigmin)
- # c0 is the fractional part of center
- c0 = center - floor(center)
- sf = sigma / sigma0
- counter = 0
- while(1):
- z0 = sampler0()
- b = randint(0, 1)
- z = ((b << 1) - 1) * z0 + b
- x = ((z - c0) ** 2) / (2 * (sigma ** 2)) - (z0 ** 2) / (2 * (sigma0 ** 2))
- counter += 1
- if berexp(x, sf) is True:
- #print(counter)
- return floor(center) + z, counter
diff --git a/code/report_card.py b/code/scripts/report_card.py
similarity index 99%
rename from code/report_card.py
rename to code/scripts/report_card.py
index 2ef44d3..32ab451 100644
--- a/code/report_card.py
+++ b/code/scripts/report_card.py
@@ -12,7 +12,7 @@
import os
import numpy as np
-sys.path.insert(0, os.path.dirname(__file__))
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from saga import UnivariateSamples, make_gaussian_pdt
from univariate_tests import (
diff --git a/code/run_baseline.py b/code/scripts/run_baseline.py
similarity index 98%
rename from code/run_baseline.py
rename to code/scripts/run_baseline.py
index f20e0df..c29ac64 100644
--- a/code/run_baseline.py
+++ b/code/scripts/run_baseline.py
@@ -12,7 +12,8 @@
import sys
import glob
-# SAGA imports (must run from code/ directory)
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
+
from saga import UnivariateSamples, pmin
diff --git a/code/run_extensive_calibration.py b/code/scripts/run_extensive_calibration.py
similarity index 99%
rename from code/run_extensive_calibration.py
rename to code/scripts/run_extensive_calibration.py
index 81f80e6..8e6431c 100644
--- a/code/run_extensive_calibration.py
+++ b/code/scripts/run_extensive_calibration.py
@@ -10,11 +10,14 @@
import argparse
import json
+import os
import time
import sys
import numpy as np
from scipy.stats import kstest
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
+
from saga import UnivariateSamples, make_gaussian_pdt
from univariate_tests import (
tail_exceedance, sign_halfgaussian, discrete_anderson_darling,
diff --git a/code/visualize_mockups.py b/code/scripts/visualize_mockups.py
similarity index 99%
rename from code/visualize_mockups.py
rename to code/scripts/visualize_mockups.py
index de64126..5fa0e75 100644
--- a/code/visualize_mockups.py
+++ b/code/scripts/visualize_mockups.py
@@ -14,7 +14,7 @@
from matplotlib.colors import LinearSegmentedColormap
from matplotlib import patheffects
-FIGDIR = os.path.join(os.path.dirname(__file__), '..', 'figures')
+FIGDIR = os.path.join(os.path.dirname(__file__), '..', '..', 'figures')
os.makedirs(FIGDIR, exist_ok=True)
# Consistent style
diff --git a/code/tests/test_multivariate.py b/code/tests/test_multivariate.py
index d7ae140..84ed249 100644
--- a/code/tests/test_multivariate.py
+++ b/code/tests/test_multivariate.py
@@ -2,11 +2,31 @@
import sys
import os
+import numpy as np
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from saga import MultivariateSamples
+class TestNonIntegerFallback:
+ """All real vectors are integer (Falcon signatures are integer vectors).
+ Continuous input is not a supported case, but must degrade gracefully:
+ skip the discrete per-coordinate channel, not crash or emit nan."""
+
+ def test_continuous_skips_per_coordinate(self):
+ rng = np.random.default_rng(0)
+ data = rng.normal(0, 1.55, size=(1500, 32)).tolist()
+ mv = MultivariateSamples(1.55, data)
+ assert mv.is_integer is False
+ assert mv.nb_gaussian_coord is None
+ assert mv.univariates is None
+ # covariance-based tests still run and produce finite p-values
+ assert 0.0 <= mv.PO <= 1.0
+ ext = mv.run_multivariate_battery()
+ assert "fisher_bh" not in ext # per-coordinate channel dropped
+
+
class TestGoodMultivariate:
"""iid Gaussian samples must pass all tests."""
@@ -30,6 +50,19 @@ def test_extended_battery_passes(self, good_multivariate_vector):
if isinstance(r, dict) and not r.get("passes", True))
)
+ def test_per_coordinate_channel(self, good_multivariate_vector):
+ """Integer (discrete-Gaussian) good vectors must light up the
+ per-coordinate discrete channel; continuous vectors skip it."""
+ v = good_multivariate_vector
+ mv = MultivariateSamples(v["params"]["sigma"], v["samples"])
+ if mv.is_integer:
+ # essentially all coordinates should read as Gaussian
+ assert mv.nb_gaussian_coord >= mv.dim - 2, (
+ f"integer good vector {v['label']}: only "
+ f"{mv.nb_gaussian_coord}/{mv.dim} coords Gaussian")
+ else:
+ assert mv.nb_gaussian_coord is None
+
class TestBadMultivariate:
"""Flawed multivariate distributions should be detected."""
@@ -40,7 +73,11 @@ def test_at_least_one_fails(self, bad_multivariate_vector):
dh_fails = mv.PO <= 0.001
dc_fails = mv.dc_pvalue <= 0.001
- coord_fail_rate = 1 - (mv.nb_gaussian_coord / mv.dim)
+ # Per-coordinate channel only applies to integer data (None otherwise).
+ if mv.nb_gaussian_coord is not None:
+ coord_fail_rate = 1 - (mv.nb_gaussian_coord / mv.dim)
+ else:
+ coord_fail_rate = 0.0
detected_basic = dh_fails or dc_fails or coord_fail_rate > 0.1
diff --git a/code/tests/test_univariate.py b/code/tests/test_univariate.py
index 7907a17..6c77a4d 100644
--- a/code/tests/test_univariate.py
+++ b/code/tests/test_univariate.py
@@ -2,11 +2,27 @@
import sys
import os
+import pytest
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from saga import UnivariateSamples
+class TestIntegerEnforcement:
+ """UnivariateSamples is a discrete-Gaussian-over-Z test: integer input only."""
+
+ def test_rejects_continuous(self):
+ with pytest.raises(ValueError, match="integer"):
+ UnivariateSamples(0, 1.55, [0.1, -0.2, 1.7, 0.0, -1.3] * 200)
+
+ def test_accepts_integer_valued_floats(self):
+ # floats that are exactly integers are fine (e.g. from a DataFrame)
+ uv = UnivariateSamples(0, 1.55, [float(z) for z in
+ ([-1, 0, 1] * 400)])
+ assert uv.chi2_pvalue == uv.chi2_pvalue # not nan
+
+
class TestGoodVectors:
"""Perfect discrete Gaussian samples must pass all tests."""
diff --git a/pyproject.toml b/pyproject.toml
index 4eae9b2..ce08add 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -22,6 +22,10 @@ dependencies = [
[project.optional-dependencies]
dev = ["pytest>=7.0", "mpmath>=1.3"]
+# Extra deps of the reference Falcon submodule, needed only by test_sig()
+# (end-to-end test on real Falcon signatures). Fetch the code with
+# `git submodule update --init`.
+falcon = ["pycryptodome", "beartype"]
[tool.setuptools]
py-modules = []