{
 "generated_utc": "2026-11-01T05:51:15+00:00",
 "n_hosts": 2,
 "hosts": {
  "Laptop (Apple M5 Max)": {
   "file": "bench_MacBookPro-de-simon-pierre-2.json",
   "hostname": "MacBookPro-de-simon-pierre-2.local",
   "cpu": "Apple M5 Max",
   "cores": 18,
   "ram_gb": 48.0,
   "os": "Darwin 27.0.0 (27.0)",
   "timestamp_utc": "2026-11-01T05:49:56+00:00",
   "seed": 34,
   "rustc": "rustc 1.95.0 (59807616e 2026-04-14)",
   "crates": {
    "secp256k1": "0.33.1",
    "secp256k1-sys": "0.14.1",
    "k256": "0.14.0"
   },
   "correctness_gates": {
    "bip340_vectors_both_libraries": true,
    "cross_library_1000": true,
    "python_reference_200": true,
    "own_scalar_mult_agrees_with_k256": true,
    "batch_negative_controls_rejected": true,
    "all": true
   },
   "bip340_vectors": {
    "libsecp256k1": {
     "verify_pass": 19,
     "sign_pass": 8,
     "n": 19
    },
    "k256": {
     "verify_pass": 19,
     "sign_pass": 8,
     "n": 19
    }
   },
   "cross_library_checks": {
    "all_pass": true,
    "ecdsa_k256_sign_libsecp_verify_pass": 1000,
    "ecdsa_libsecp_sign_k256_verify_pass": 1000,
    "ecdsa_signatures_byte_identical": 1000,
    "n": 1000,
    "schnorr_k256_sign_libsecp_verify_pass": 1000,
    "schnorr_libsecp_sign_k256_verify_pass": 1000,
    "schnorr_signatures_byte_identical": 1000
   },
   "python_reference_crosscheck": {
    "n": 200,
    "ecdsa_k256_sig_verified_by_python": 200,
    "ecdsa_libsecp_sig_verified_by_python": 200,
    "ecdsa_python_resign_identical": 200,
    "schnorr_k256_sig_verified_by_python": 200,
    "schnorr_libsecp_sig_verified_by_python": 200,
    "schnorr_python_resign_identical": 200,
    "tampered_sig_rejected_by_python": 200,
    "elapsed_s": 11.27,
    "resign_checked": true,
    "all_pass": true
   },
   "sign_verify_median_ns": {
    "ecdsa_sign_k256": 15267.4,
    "ecdsa_sign_libsecp256k1": 23630.8,
    "ecdsa_verify_k256": 25012.1,
    "ecdsa_verify_libsecp256k1": 12615.6,
    "schnorr_sign_k256": 11569.1,
    "schnorr_sign_libsecp256k1": 20548.2,
    "schnorr_verify_k256": 24486.7,
    "schnorr_verify_libsecp256k1": 13197.0
   },
   "scalar_mult_median_ns": {
    "k256_generator_mul_ct_glv": 16409.7,
    "k256_mul_by_generator_precomputed_table": 8293.1,
    "k256_mul_by_generator_vartime_table": 6577.5,
    "k256_point_mul_ct_glv": 17153.2,
    "k256_point_mul_vartime_glv_wnaf": 13955.7,
    "libsecp256k1_generator_mul_ecmult_gen": 19804.6,
    "libsecp256k1_point_mul_tweak_ecmult_const": 11468.1,
    "own_wnaf5_point_mul_no_glv": 21122.0
   },
   "single_verify_reference_ns": {
    "k256_verify_raw": 24486.6875,
    "libsecp256k1_schnorr_verify": 13197.0415
   },
   "batch_verification": {
    "straus_wnaf5": {
     "1": {
      "ns_per_sig": 30351.3,
      "iqr_ns": 326.3,
      "msm_only_ns_per_sig": 27251.2,
      "speedup_vs_k256": [
       0.807,
       0.791,
       0.824
      ],
      "speedup_vs_libsecp256k1": [
       0.435,
       0.428,
       0.437
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 107.0,
       "doublings": 259.0,
       "mixed_adds": 0.0,
       "total": 366.0
      }
     },
     "2": {
      "ns_per_sig": 21329.2,
      "iqr_ns": 350.1,
      "msm_only_ns_per_sig": 18207.7,
      "speedup_vs_k256": [
       1.148,
       1.13,
       1.19
      ],
      "speedup_vs_libsecp256k1": [
       0.619,
       0.612,
       0.631
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 93.5,
       "doublings": 130.5,
       "mixed_adds": 0.0,
       "total": 224.0
      }
     },
     "4": {
      "ns_per_sig": 16338.0,
      "iqr_ns": 30.3,
      "msm_only_ns_per_sig": 13287.0,
      "speedup_vs_k256": [
       1.499,
       1.481,
       1.531
      ],
      "speedup_vs_libsecp256k1": [
       0.808,
       0.802,
       0.813
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 86.2,
       "doublings": 66.2,
       "mixed_adds": 0.0,
       "total": 152.5
      }
     },
     "8": {
      "ns_per_sig": 14054.3,
      "iqr_ns": 271.9,
      "msm_only_ns_per_sig": 11011.5,
      "speedup_vs_k256": [
       1.742,
       1.695,
       1.782
      ],
      "speedup_vs_libsecp256k1": [
       0.939,
       0.914,
       0.945
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 82.8,
       "doublings": 34.1,
       "mixed_adds": 0.0,
       "total": 116.9
      }
     },
     "16": {
      "ns_per_sig": 12881.9,
      "iqr_ns": 40.0,
      "msm_only_ns_per_sig": 9834.4,
      "speedup_vs_k256": [
       1.901,
       1.879,
       1.942
      ],
      "speedup_vs_libsecp256k1": [
       1.024,
       1.017,
       1.031
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 81.0,
       "doublings": 18.1,
       "mixed_adds": 0.0,
       "total": 99.1
      }
     },
     "32": {
      "ns_per_sig": 12275.3,
      "iqr_ns": 57.9,
      "msm_only_ns_per_sig": 9238.9,
      "speedup_vs_k256": [
       1.995,
       1.966,
       2.039
      ],
      "speedup_vs_libsecp256k1": [
       1.075,
       1.061,
       1.082
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 80.2,
       "doublings": 10.0,
       "mixed_adds": 0.0,
       "total": 90.2
      }
     },
     "64": {
      "ns_per_sig": 12078.2,
      "iqr_ns": 429.8,
      "msm_only_ns_per_sig": 9023.0,
      "speedup_vs_k256": [
       2.027,
       1.887,
       2.072
      ],
      "speedup_vs_libsecp256k1": [
       1.093,
       1.021,
       1.1
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 6.0,
       "mixed_adds": 0.0,
       "total": 85.1
      }
     },
     "128": {
      "ns_per_sig": 12170.9,
      "iqr_ns": 344.3,
      "msm_only_ns_per_sig": 9073.8,
      "speedup_vs_k256": [
       2.012,
       1.931,
       2.078
      ],
      "speedup_vs_libsecp256k1": [
       1.084,
       1.044,
       1.101
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.1,
       "doublings": 4.0,
       "mixed_adds": 0.0,
       "total": 83.1
      }
     },
     "256": {
      "ns_per_sig": 12388.5,
      "iqr_ns": 345.4,
      "msm_only_ns_per_sig": 9294.8,
      "speedup_vs_k256": [
       1.977,
       1.929,
       2.05
      ],
      "speedup_vs_libsecp256k1": [
       1.065,
       1.043,
       1.088
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 3.0,
       "mixed_adds": 0.0,
       "total": 82.0
      }
     },
     "512": {
      "ns_per_sig": 12847.6,
      "iqr_ns": 173.3,
      "msm_only_ns_per_sig": 9581.1,
      "speedup_vs_k256": [
       1.906,
       1.886,
       1.971
      ],
      "speedup_vs_libsecp256k1": [
       1.027,
       1.021,
       1.047
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 78.9,
       "doublings": 2.5,
       "mixed_adds": 0.0,
       "total": 81.4
      }
     },
     "1024": {
      "ns_per_sig": 12660.9,
      "iqr_ns": 35.3,
      "msm_only_ns_per_sig": 9625.3,
      "speedup_vs_k256": [
       1.934,
       1.91,
       1.978
      ],
      "speedup_vs_libsecp256k1": [
       1.042,
       1.035,
       1.049
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 2.3,
       "mixed_adds": 0.0,
       "total": 81.2
      }
     },
     "2048": {
      "ns_per_sig": 13424.2,
      "iqr_ns": 88.1,
      "msm_only_ns_per_sig": 10377.6,
      "speedup_vs_k256": [
       1.824,
       1.798,
       1.873
      ],
      "speedup_vs_libsecp256k1": [
       0.983,
       0.974,
       0.992
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 78.9,
       "doublings": 2.1,
       "mixed_adds": 0.0,
       "total": 81.0
      }
     }
    },
    "pippenger": {
     "1": {
      "ns_per_sig": 91869.8,
      "iqr_ns": 2179.1,
      "msm_only_ns_per_sig": 88626.9,
      "speedup_vs_k256": [
       0.267,
       0.263,
       0.279
      ],
      "speedup_vs_libsecp256k1": [
       0.144,
       0.142,
       0.148
      ],
      "window_bits": 3,
      "ops_per_sig": {
       "adds": 630.0,
       "doublings": 255.0,
       "mixed_adds": 154.0,
       "total": 1039.0
      }
     },
     "2": {
      "ns_per_sig": 58441.2,
      "iqr_ns": 411.7,
      "msm_only_ns_per_sig": 55311.6,
      "speedup_vs_k256": [
       0.419,
       0.413,
       0.429
      ],
      "speedup_vs_libsecp256k1": [
       0.226,
       0.223,
       0.227
      ],
      "window_bits": 3,
      "ops_per_sig": {
       "adds": 383.0,
       "doublings": 127.5,
       "mixed_adds": 127.0,
       "total": 637.5
      }
     },
     "4": {
      "ns_per_sig": 44337.9,
      "iqr_ns": 350.4,
      "msm_only_ns_per_sig": 41195.2,
      "speedup_vs_k256": [
       0.552,
       0.545,
       0.567
      ],
      "speedup_vs_libsecp256k1": [
       0.298,
       0.295,
       0.3
      ],
      "window_bits": 4,
      "ops_per_sig": {
       "adds": 306.0,
       "doublings": 63.0,
       "mixed_adds": 95.8,
       "total": 464.8
      }
     },
     "8": {
      "ns_per_sig": 30217.1,
      "iqr_ns": 209.3,
      "msm_only_ns_per_sig": 27119.5,
      "speedup_vs_k256": [
       0.81,
       0.802,
       0.834
      ],
      "speedup_vs_libsecp256k1": [
       0.437,
       0.433,
       0.442
      ],
      "window_bits": 4,
      "ops_per_sig": {
       "adds": 186.5,
       "doublings": 31.5,
       "mixed_adds": 93.1,
       "total": 311.1
      }
     },
     "16": {
      "ns_per_sig": 24855.1,
      "iqr_ns": 726.6,
      "msm_only_ns_per_sig": 21733.2,
      "speedup_vs_k256": [
       0.985,
       0.947,
       1.027
      ],
      "speedup_vs_libsecp256k1": [
       0.531,
       0.512,
       0.544
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 151.8,
       "doublings": 15.9,
       "mixed_adds": 76.8,
       "total": 244.5
      }
     },
     "32": {
      "ns_per_sig": 18007.1,
      "iqr_ns": 24.0,
      "msm_only_ns_per_sig": 14947.9,
      "speedup_vs_k256": [
       1.36,
       1.346,
       1.39
      ],
      "speedup_vs_libsecp256k1": [
       0.733,
       0.729,
       0.738
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 87.8,
       "doublings": 8.0,
       "mixed_adds": 75.6,
       "total": 171.4
      }
     },
     "64": {
      "ns_per_sig": 16124.6,
      "iqr_ns": 77.5,
      "msm_only_ns_per_sig": 12919.7,
      "speedup_vs_k256": [
       1.519,
       1.501,
       1.555
      ],
      "speedup_vs_libsecp256k1": [
       0.818,
       0.812,
       0.824
      ],
      "window_bits": 6,
      "ops_per_sig": {
       "adds": 73.6,
       "doublings": 3.9,
       "mixed_adds": 64.0,
       "total": 141.6
      }
     },
     "128": {
      "ns_per_sig": 12765.6,
      "iqr_ns": 568.3,
      "msm_only_ns_per_sig": 9613.0,
      "speedup_vs_k256": [
       1.918,
       1.812,
       2.023
      ],
      "speedup_vs_libsecp256k1": [
       1.034,
       0.98,
       1.072
      ],
      "window_bits": 6,
      "ops_per_sig": {
       "adds": 40.3,
       "doublings": 2.0,
       "mixed_adds": 63.9,
       "total": 106.2
      }
     },
     "256": {
      "ns_per_sig": 11349.3,
      "iqr_ns": 200.5,
      "msm_only_ns_per_sig": 8209.1,
      "speedup_vs_k256": [
       2.158,
       2.125,
       2.232
      ],
      "speedup_vs_libsecp256k1": [
       1.163,
       1.149,
       1.183
      ],
      "window_bits": 7,
      "ops_per_sig": {
       "adds": 34.6,
       "doublings": 1.0,
       "mixed_adds": 55.3,
       "total": 90.9
      }
     },
     "512": {
      "ns_per_sig": 9614.2,
      "iqr_ns": 450.1,
      "msm_only_ns_per_sig": 6513.0,
      "speedup_vs_k256": [
       2.547,
       2.379,
       2.629
      ],
      "speedup_vs_libsecp256k1": [
       1.373,
       1.287,
       1.393
      ],
      "window_bits": 7,
      "ops_per_sig": {
       "adds": 17.9,
       "doublings": 0.5,
       "mixed_adds": 55.3,
       "total": 73.7
      }
     },
     "1024": {
      "ns_per_sig": 8620.5,
      "iqr_ns": 8.9,
      "msm_only_ns_per_sig": 5581.1,
      "speedup_vs_k256": [
       2.841,
       2.81,
       2.902
      ],
      "speedup_vs_libsecp256k1": [
       1.531,
       1.522,
       1.541
      ],
      "window_bits": 8,
      "ops_per_sig": {
       "adds": 15.9,
       "doublings": 0.2,
       "mixed_adds": 47.8,
       "total": 64.0
      }
     },
     "2048": {
      "ns_per_sig": 7911.2,
      "iqr_ns": 37.8,
      "msm_only_ns_per_sig": 4870.9,
      "speedup_vs_k256": [
       3.095,
       3.047,
       3.162
      ],
      "speedup_vs_libsecp256k1": [
       1.668,
       1.646,
       1.679
      ],
      "window_bits": 8,
      "ops_per_sig": {
       "adds": 8.0,
       "doublings": 0.1,
       "mixed_adds": 47.8,
       "total": 55.9
      }
     }
    },
    "k256_lincomb_vartime": {
     "1": {
      "ns_per_sig": 25136.9,
      "iqr_ns": 160.4,
      "msm_only_ns_per_sig": 22011.5,
      "speedup_vs_k256": [
       0.974,
       0.964,
       1.004
      ],
      "speedup_vs_libsecp256k1": [
       0.525,
       0.522,
       0.532
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2": {
      "ns_per_sig": 19563.7,
      "iqr_ns": 44.9,
      "msm_only_ns_per_sig": 16485.8,
      "speedup_vs_k256": [
       1.252,
       1.236,
       1.279
      ],
      "speedup_vs_libsecp256k1": [
       0.675,
       0.669,
       0.679
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "4": {
      "ns_per_sig": 16919.2,
      "iqr_ns": 31.2,
      "msm_only_ns_per_sig": 13860.9,
      "speedup_vs_k256": [
       1.447,
       1.432,
       1.48
      ],
      "speedup_vs_libsecp256k1": [
       0.78,
       0.775,
       0.785
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "8": {
      "ns_per_sig": 15600.5,
      "iqr_ns": 16.4,
      "msm_only_ns_per_sig": 12545.7,
      "speedup_vs_k256": [
       1.57,
       1.553,
       1.604
      ],
      "speedup_vs_libsecp256k1": [
       0.846,
       0.841,
       0.851
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "16": {
      "ns_per_sig": 14817.5,
      "iqr_ns": 23.4,
      "msm_only_ns_per_sig": 11788.5,
      "speedup_vs_k256": [
       1.653,
       1.635,
       1.688
      ],
      "speedup_vs_libsecp256k1": [
       0.891,
       0.885,
       0.896
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "32": {
      "ns_per_sig": 14977.6,
      "iqr_ns": 282.7,
      "msm_only_ns_per_sig": 11845.7,
      "speedup_vs_k256": [
       1.635,
       1.606,
       1.689
      ],
      "speedup_vs_libsecp256k1": [
       0.881,
       0.869,
       0.895
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "64": {
      "ns_per_sig": 15343.0,
      "iqr_ns": 177.9,
      "msm_only_ns_per_sig": 12128.5,
      "speedup_vs_k256": [
       1.596,
       1.569,
       1.637
      ],
      "speedup_vs_libsecp256k1": [
       0.86,
       0.849,
       0.867
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "128": {
      "ns_per_sig": 15261.4,
      "iqr_ns": 454.7,
      "msm_only_ns_per_sig": 12079.4,
      "speedup_vs_k256": [
       1.604,
       1.558,
       1.677
      ],
      "speedup_vs_libsecp256k1": [
       0.865,
       0.843,
       0.888
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "256": {
      "ns_per_sig": 15002.3,
      "iqr_ns": 169.5,
      "msm_only_ns_per_sig": 11865.3,
      "speedup_vs_k256": [
       1.632,
       1.612,
       1.688
      ],
      "speedup_vs_libsecp256k1": [
       0.88,
       0.873,
       0.894
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "512": {
      "ns_per_sig": 15830.5,
      "iqr_ns": 515.1,
      "msm_only_ns_per_sig": 12672.7,
      "speedup_vs_k256": [
       1.547,
       1.511,
       1.621
      ],
      "speedup_vs_libsecp256k1": [
       0.834,
       0.818,
       0.859
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "1024": {
      "ns_per_sig": 15835.7,
      "iqr_ns": 84.2,
      "msm_only_ns_per_sig": 12786.2,
      "speedup_vs_k256": [
       1.546,
       1.526,
       1.584
      ],
      "speedup_vs_libsecp256k1": [
       0.833,
       0.826,
       0.839
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2048": {
      "ns_per_sig": 17076.0,
      "iqr_ns": 108.4,
      "msm_only_ns_per_sig": 14036.9,
      "speedup_vs_k256": [
       1.434,
       1.414,
       1.467
      ],
      "speedup_vs_libsecp256k1": [
       0.773,
       0.766,
       0.779
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     }
    },
    "k256_lincomb_ct": {
     "1": {
      "ns_per_sig": 38468.8,
      "iqr_ns": 579.9,
      "msm_only_ns_per_sig": 35306.4,
      "speedup_vs_k256": [
       0.637,
       0.624,
       0.654
      ],
      "speedup_vs_libsecp256k1": [
       0.343,
       0.338,
       0.347
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2": {
      "ns_per_sig": 29666.7,
      "iqr_ns": 692.4,
      "msm_only_ns_per_sig": 26563.9,
      "speedup_vs_k256": [
       0.825,
       0.796,
       0.845
      ],
      "speedup_vs_libsecp256k1": [
       0.445,
       0.431,
       0.449
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "4": {
      "ns_per_sig": 25549.6,
      "iqr_ns": 489.6,
      "msm_only_ns_per_sig": 22442.4,
      "speedup_vs_k256": [
       0.958,
       0.942,
       0.99
      ],
      "speedup_vs_libsecp256k1": [
       0.517,
       0.51,
       0.525
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "8": {
      "ns_per_sig": 23098.9,
      "iqr_ns": 529.5,
      "msm_only_ns_per_sig": 20033.1,
      "speedup_vs_k256": [
       1.06,
       1.009,
       1.083
      ],
      "speedup_vs_libsecp256k1": [
       0.571,
       0.546,
       0.575
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "16": {
      "ns_per_sig": 22480.8,
      "iqr_ns": 319.9,
      "msm_only_ns_per_sig": 19377.0,
      "speedup_vs_k256": [
       1.089,
       1.066,
       1.116
      ],
      "speedup_vs_libsecp256k1": [
       0.587,
       0.577,
       0.591
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "32": {
      "ns_per_sig": 22322.1,
      "iqr_ns": 444.3,
      "msm_only_ns_per_sig": 19180.2,
      "speedup_vs_k256": [
       1.097,
       1.057,
       1.123
      ],
      "speedup_vs_libsecp256k1": [
       0.591,
       0.572,
       0.596
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "64": {
      "ns_per_sig": 21944.3,
      "iqr_ns": 287.6,
      "msm_only_ns_per_sig": 18811.7,
      "speedup_vs_k256": [
       1.116,
       1.094,
       1.142
      ],
      "speedup_vs_libsecp256k1": [
       0.601,
       0.591,
       0.605
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "128": {
      "ns_per_sig": 21892.2,
      "iqr_ns": 264.7,
      "msm_only_ns_per_sig": 18683.7,
      "speedup_vs_k256": [
       1.119,
       1.098,
       1.148
      ],
      "speedup_vs_libsecp256k1": [
       0.603,
       0.594,
       0.608
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "256": {
      "ns_per_sig": 21844.3,
      "iqr_ns": 307.4,
      "msm_only_ns_per_sig": 18714.7,
      "speedup_vs_k256": [
       1.121,
       1.096,
       1.149
      ],
      "speedup_vs_libsecp256k1": [
       0.604,
       0.593,
       0.609
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     }
    }
   },
   "best_batch_speedup_per_algorithm": {
    "straus_wnaf5": {
     "batch_size": 64,
     "ns_per_sig": 12078.2,
     "iqr_ns": 429.8,
     "msm_only_ns_per_sig": 9023.0,
     "speedup_vs_k256": [
      2.027,
      1.887,
      2.072
     ],
     "speedup_vs_libsecp256k1": [
      1.093,
      1.021,
      1.1
     ],
     "window_bits": 5,
     "ops_per_sig": {
      "adds": 79.0,
      "doublings": 6.0,
      "mixed_adds": 0.0,
      "total": 85.1
     }
    },
    "pippenger": {
     "batch_size": 2048,
     "ns_per_sig": 7911.2,
     "iqr_ns": 37.8,
     "msm_only_ns_per_sig": 4870.9,
     "speedup_vs_k256": [
      3.095,
      3.047,
      3.162
     ],
     "speedup_vs_libsecp256k1": [
      1.668,
      1.646,
      1.679
     ],
     "window_bits": 8,
     "ops_per_sig": {
      "adds": 8.0,
      "doublings": 0.1,
      "mixed_adds": 47.8,
      "total": 55.9
     }
    },
    "k256_lincomb_vartime": {
     "batch_size": 16,
     "ns_per_sig": 14817.5,
     "iqr_ns": 23.4,
     "msm_only_ns_per_sig": 11788.5,
     "speedup_vs_k256": [
      1.653,
      1.635,
      1.688
     ],
     "speedup_vs_libsecp256k1": [
      0.891,
      0.885,
      0.896
     ],
     "window_bits": 0,
     "ops_per_sig": {
      "adds": 0.0,
      "doublings": 0.0,
      "mixed_adds": 0.0,
      "total": 0.0
     }
    },
    "k256_lincomb_ct": {
     "batch_size": 256,
     "ns_per_sig": 21844.3,
     "iqr_ns": 307.4,
     "msm_only_ns_per_sig": 18714.7,
     "speedup_vs_k256": [
      1.121,
      1.096,
      1.149
     ],
     "speedup_vs_libsecp256k1": [
      0.604,
      0.593,
      0.609
     ],
     "window_bits": 0,
     "ops_per_sig": {
      "adds": 0.0,
      "doublings": 0.0,
      "mixed_adds": 0.0,
      "total": 0.0
     }
    }
   },
   "negative_controls": true,
   "python_baselines_median_ns": {
    "wp34_pure_python_ecdsa_sign": 3812591.6,
    "wp34_pure_python_ecdsa_verify": 7237068.8,
    "wp34_pure_python_ecdsa_verify_shamir": 4389137.5,
    "wp34_pure_python_schnorr_sign": 14713058.3,
    "wp34_pure_python_schnorr_verify": 7417233.3,
    "wp34_pure_python_schnorr_batch_verify_per_sig": 5712385.4,
    "python_ecdsa_pkg_ecdsa_sign": 118029.2,
    "python_ecdsa_pkg_ecdsa_verify": 419358.3,
    "coincurve_ecdsa_sign_der": 11945.9,
    "coincurve_ecdsa_verify_der": 12677.0,
    "coincurve_schnorr_sign": 28341.7,
    "coincurve_schnorr_verify": 12516.6
   },
   "python_versions": {
    "ecdsa": "0.19.2",
    "coincurve": "21.0.0"
   },
   "rust_elapsed_s": 20.08
  },
  "M3U96a (Apple M3 Ultra)": {
   "file": "bench_MacStudnpierre2.json",
   "hostname": "MacStudnpierre2",
   "cpu": "Apple M3 Ultra",
   "cores": 28,
   "ram_gb": 96.0,
   "os": "Darwin 25.6.0 (26.6)",
   "timestamp_utc": "2026-11-01T05:50:10+00:00",
   "seed": 34,
   "rustc": "rustc 1.96.0 (ac68faa20 2026-05-25) (Homebrew)",
   "crates": {
    "secp256k1": "0.33.1",
    "secp256k1-sys": "0.14.1",
    "k256": "0.14.0"
   },
   "correctness_gates": {
    "bip340_vectors_both_libraries": true,
    "cross_library_1000": true,
    "python_reference_200": true,
    "own_scalar_mult_agrees_with_k256": true,
    "batch_negative_controls_rejected": true,
    "all": true
   },
   "bip340_vectors": {
    "libsecp256k1": {
     "verify_pass": 19,
     "sign_pass": 8,
     "n": 19
    },
    "k256": {
     "verify_pass": 19,
     "sign_pass": 8,
     "n": 19
    }
   },
   "cross_library_checks": {
    "all_pass": true,
    "ecdsa_k256_sign_libsecp_verify_pass": 1000,
    "ecdsa_libsecp_sign_k256_verify_pass": 1000,
    "ecdsa_signatures_byte_identical": 1000,
    "n": 1000,
    "schnorr_k256_sign_libsecp_verify_pass": 1000,
    "schnorr_libsecp_sign_k256_verify_pass": 1000,
    "schnorr_signatures_byte_identical": 1000
   },
   "python_reference_crosscheck": {
    "n": 200,
    "ecdsa_k256_sig_verified_by_python": 200,
    "ecdsa_libsecp_sig_verified_by_python": 200,
    "ecdsa_python_resign_identical": 200,
    "schnorr_k256_sig_verified_by_python": 200,
    "schnorr_libsecp_sig_verified_by_python": 200,
    "schnorr_python_resign_identical": 200,
    "tampered_sig_rejected_by_python": 200,
    "elapsed_s": 13.45,
    "resign_checked": true,
    "all_pass": true
   },
   "sign_verify_median_ns": {
    "ecdsa_sign_k256": 18848.6,
    "ecdsa_sign_libsecp256k1": 29199.2,
    "ecdsa_verify_k256": 33524.1,
    "ecdsa_verify_libsecp256k1": 16680.4,
    "schnorr_sign_k256": 14838.0,
    "schnorr_sign_libsecp256k1": 24717.3,
    "schnorr_verify_k256": 32497.6,
    "schnorr_verify_libsecp256k1": 16944.2
   },
   "scalar_mult_median_ns": {
    "k256_generator_mul_ct_glv": 22876.1,
    "k256_mul_by_generator_precomputed_table": 10800.4,
    "k256_mul_by_generator_vartime_table": 9426.2,
    "k256_point_mul_ct_glv": 23236.7,
    "k256_point_mul_vartime_glv_wnaf": 19015.3,
    "libsecp256k1_generator_mul_ecmult_gen": 23797.5,
    "libsecp256k1_point_mul_tweak_ecmult_const": 15607.7,
    "own_wnaf5_point_mul_no_glv": 28983.9
   },
   "single_verify_reference_ns": {
    "k256_verify_raw": 32497.646,
    "libsecp256k1_schnorr_verify": 16944.1665
   },
   "batch_verification": {
    "straus_wnaf5": {
     "1": {
      "ns_per_sig": 41422.2,
      "iqr_ns": 42.1,
      "msm_only_ns_per_sig": 37863.7,
      "speedup_vs_k256": [
       0.785,
       0.774,
       0.786
      ],
      "speedup_vs_libsecp256k1": [
       0.409,
       0.409,
       0.416
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 107.0,
       "doublings": 259.0,
       "mixed_adds": 0.0,
       "total": 366.0
      }
     },
     "2": {
      "ns_per_sig": 28542.0,
      "iqr_ns": 17.8,
      "msm_only_ns_per_sig": 24900.3,
      "speedup_vs_k256": [
       1.139,
       1.124,
       1.141
      ],
      "speedup_vs_libsecp256k1": [
       0.594,
       0.593,
       0.604
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 93.5,
       "doublings": 130.5,
       "mixed_adds": 0.0,
       "total": 224.0
      }
     },
     "4": {
      "ns_per_sig": 22009.6,
      "iqr_ns": 26.2,
      "msm_only_ns_per_sig": 18389.0,
      "speedup_vs_k256": [
       1.477,
       1.458,
       1.48
      ],
      "speedup_vs_libsecp256k1": [
       0.77,
       0.769,
       0.783
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 86.2,
       "doublings": 66.2,
       "mixed_adds": 0.0,
       "total": 152.5
      }
     },
     "8": {
      "ns_per_sig": 18839.2,
      "iqr_ns": 24.7,
      "msm_only_ns_per_sig": 15227.7,
      "speedup_vs_k256": [
       1.725,
       1.703,
       1.729
      ],
      "speedup_vs_libsecp256k1": [
       0.899,
       0.899,
       0.916
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 82.8,
       "doublings": 34.1,
       "mixed_adds": 0.0,
       "total": 116.9
      }
     },
     "16": {
      "ns_per_sig": 17269.9,
      "iqr_ns": 37.9,
      "msm_only_ns_per_sig": 13652.0,
      "speedup_vs_k256": [
       1.882,
       1.854,
       1.886
      ],
      "speedup_vs_libsecp256k1": [
       0.981,
       0.979,
       0.999
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 81.0,
       "doublings": 18.1,
       "mixed_adds": 0.0,
       "total": 99.1
      }
     },
     "32": {
      "ns_per_sig": 16478.0,
      "iqr_ns": 303.5,
      "msm_only_ns_per_sig": 12876.1,
      "speedup_vs_k256": [
       1.972,
       1.905,
       1.978
      ],
      "speedup_vs_libsecp256k1": [
       1.028,
       1.004,
       1.047
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 80.2,
       "doublings": 10.0,
       "mixed_adds": 0.0,
       "total": 90.2
      }
     },
     "64": {
      "ns_per_sig": 16163.4,
      "iqr_ns": 25.1,
      "msm_only_ns_per_sig": 12562.4,
      "speedup_vs_k256": [
       2.011,
       1.984,
       2.015
      ],
      "speedup_vs_libsecp256k1": [
       1.048,
       1.047,
       1.067
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 6.0,
       "mixed_adds": 0.0,
       "total": 85.1
      }
     },
     "128": {
      "ns_per_sig": 16073.6,
      "iqr_ns": 46.1,
      "msm_only_ns_per_sig": 12476.3,
      "speedup_vs_k256": [
       2.022,
       1.993,
       2.026
      ],
      "speedup_vs_libsecp256k1": [
       1.054,
       1.051,
       1.073
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.1,
       "doublings": 4.0,
       "mixed_adds": 0.0,
       "total": 83.1
      }
     },
     "256": {
      "ns_per_sig": 16127.7,
      "iqr_ns": 27.0,
      "msm_only_ns_per_sig": 12508.3,
      "speedup_vs_k256": [
       2.015,
       1.99,
       2.022
      ],
      "speedup_vs_libsecp256k1": [
       1.051,
       1.05,
       1.07
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 3.0,
       "mixed_adds": 0.0,
       "total": 82.0
      }
     },
     "512": {
      "ns_per_sig": 16138.7,
      "iqr_ns": 22.3,
      "msm_only_ns_per_sig": 12536.1,
      "speedup_vs_k256": [
       2.014,
       1.988,
       2.018
      ],
      "speedup_vs_libsecp256k1": [
       1.05,
       1.048,
       1.069
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 78.9,
       "doublings": 2.5,
       "mixed_adds": 0.0,
       "total": 81.4
      }
     },
     "1024": {
      "ns_per_sig": 16192.4,
      "iqr_ns": 37.4,
      "msm_only_ns_per_sig": 12596.3,
      "speedup_vs_k256": [
       2.007,
       1.98,
       2.012
      ],
      "speedup_vs_libsecp256k1": [
       1.046,
       1.044,
       1.065
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 79.0,
       "doublings": 2.3,
       "mixed_adds": 0.0,
       "total": 81.2
      }
     },
     "2048": {
      "ns_per_sig": 16211.3,
      "iqr_ns": 34.6,
      "msm_only_ns_per_sig": 12612.3,
      "speedup_vs_k256": [
       2.005,
       1.977,
       2.009
      ],
      "speedup_vs_libsecp256k1": [
       1.045,
       1.042,
       1.064
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 78.9,
       "doublings": 2.1,
       "mixed_adds": 0.0,
       "total": 81.0
      }
     }
    },
    "pippenger": {
     "1": {
      "ns_per_sig": 132033.2,
      "iqr_ns": 4832.1,
      "msm_only_ns_per_sig": 128403.0,
      "speedup_vs_k256": [
       0.246,
       0.235,
       0.25
      ],
      "speedup_vs_libsecp256k1": [
       0.128,
       0.124,
       0.131
      ],
      "window_bits": 3,
      "ops_per_sig": {
       "adds": 630.0,
       "doublings": 255.0,
       "mixed_adds": 154.0,
       "total": 1039.0
      }
     },
     "2": {
      "ns_per_sig": 84597.7,
      "iqr_ns": 819.6,
      "msm_only_ns_per_sig": 80944.3,
      "speedup_vs_k256": [
       0.384,
       0.376,
       0.385
      ],
      "speedup_vs_libsecp256k1": [
       0.2,
       0.198,
       0.204
      ],
      "window_bits": 3,
      "ops_per_sig": {
       "adds": 383.0,
       "doublings": 127.5,
       "mixed_adds": 127.0,
       "total": 637.5
      }
     },
     "4": {
      "ns_per_sig": 62885.9,
      "iqr_ns": 122.3,
      "msm_only_ns_per_sig": 59259.0,
      "speedup_vs_k256": [
       0.517,
       0.509,
       0.518
      ],
      "speedup_vs_libsecp256k1": [
       0.269,
       0.269,
       0.274
      ],
      "window_bits": 4,
      "ops_per_sig": {
       "adds": 306.0,
       "doublings": 63.0,
       "mixed_adds": 95.8,
       "total": 464.8
      }
     },
     "8": {
      "ns_per_sig": 43290.0,
      "iqr_ns": 881.7,
      "msm_only_ns_per_sig": 39667.8,
      "speedup_vs_k256": [
       0.751,
       0.721,
       0.752
      ],
      "speedup_vs_libsecp256k1": [
       0.391,
       0.38,
       0.398
      ],
      "window_bits": 4,
      "ops_per_sig": {
       "adds": 186.5,
       "doublings": 31.5,
       "mixed_adds": 93.1,
       "total": 311.1
      }
     },
     "16": {
      "ns_per_sig": 35558.2,
      "iqr_ns": 550.2,
      "msm_only_ns_per_sig": 31886.1,
      "speedup_vs_k256": [
       0.914,
       0.896,
       0.928
      ],
      "speedup_vs_libsecp256k1": [
       0.477,
       0.473,
       0.487
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 151.8,
       "doublings": 15.9,
       "mixed_adds": 76.8,
       "total": 244.5
      }
     },
     "32": {
      "ns_per_sig": 25749.6,
      "iqr_ns": 206.1,
      "msm_only_ns_per_sig": 22151.8,
      "speedup_vs_k256": [
       1.262,
       1.23,
       1.264
      ],
      "speedup_vs_libsecp256k1": [
       0.658,
       0.648,
       0.669
      ],
      "window_bits": 5,
      "ops_per_sig": {
       "adds": 87.8,
       "doublings": 8.0,
       "mixed_adds": 75.6,
       "total": 171.4
      }
     },
     "64": {
      "ns_per_sig": 21915.1,
      "iqr_ns": 133.2,
      "msm_only_ns_per_sig": 18316.4,
      "speedup_vs_k256": [
       1.483,
       1.451,
       1.486
      ],
      "speedup_vs_libsecp256k1": [
       0.773,
       0.765,
       0.787
      ],
      "window_bits": 6,
      "ops_per_sig": {
       "adds": 73.6,
       "doublings": 3.9,
       "mixed_adds": 64.0,
       "total": 141.6
      }
     },
     "128": {
      "ns_per_sig": 17814.8,
      "iqr_ns": 339.2,
      "msm_only_ns_per_sig": 14093.9,
      "speedup_vs_k256": [
       1.824,
       1.794,
       1.885
      ],
      "speedup_vs_libsecp256k1": [
       0.951,
       0.947,
       0.983
      ],
      "window_bits": 6,
      "ops_per_sig": {
       "adds": 40.3,
       "doublings": 2.0,
       "mixed_adds": 63.9,
       "total": 106.2
      }
     },
     "256": {
      "ns_per_sig": 15327.1,
      "iqr_ns": 13.9,
      "msm_only_ns_per_sig": 11731.1,
      "speedup_vs_k256": [
       2.12,
       2.093,
       2.125
      ],
      "speedup_vs_libsecp256k1": [
       1.106,
       1.105,
       1.125
      ],
      "window_bits": 7,
      "ops_per_sig": {
       "adds": 34.6,
       "doublings": 1.0,
       "mixed_adds": 55.3,
       "total": 90.9
      }
     },
     "512": {
      "ns_per_sig": 13426.0,
      "iqr_ns": 111.6,
      "msm_only_ns_per_sig": 9719.9,
      "speedup_vs_k256": [
       2.42,
       2.386,
       2.447
      ],
      "speedup_vs_libsecp256k1": [
       1.262,
       1.258,
       1.296
      ],
      "window_bits": 7,
      "ops_per_sig": {
       "adds": 17.9,
       "doublings": 0.5,
       "mixed_adds": 55.3,
       "total": 73.7
      }
     },
     "1024": {
      "ns_per_sig": 11799.3,
      "iqr_ns": 5.7,
      "msm_only_ns_per_sig": 8207.1,
      "speedup_vs_k256": [
       2.754,
       2.719,
       2.759
      ],
      "speedup_vs_libsecp256k1": [
       1.436,
       1.435,
       1.461
      ],
      "window_bits": 8,
      "ops_per_sig": {
       "adds": 15.9,
       "doublings": 0.2,
       "mixed_adds": 47.8,
       "total": 64.0
      }
     },
     "2048": {
      "ns_per_sig": 10711.1,
      "iqr_ns": 5.0,
      "msm_only_ns_per_sig": 7116.5,
      "speedup_vs_k256": [
       3.034,
       2.995,
       3.04
      ],
      "speedup_vs_libsecp256k1": [
       1.582,
       1.581,
       1.609
      ],
      "window_bits": 8,
      "ops_per_sig": {
       "adds": 8.0,
       "doublings": 0.1,
       "mixed_adds": 47.8,
       "total": 55.9
      }
     }
    },
    "k256_lincomb_vartime": {
     "1": {
      "ns_per_sig": 34243.4,
      "iqr_ns": 30.5,
      "msm_only_ns_per_sig": 30657.8,
      "speedup_vs_k256": [
       0.949,
       0.937,
       0.951
      ],
      "speedup_vs_libsecp256k1": [
       0.495,
       0.495,
       0.504
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2": {
      "ns_per_sig": 26871.3,
      "iqr_ns": 16.4,
      "msm_only_ns_per_sig": 23211.2,
      "speedup_vs_k256": [
       1.209,
       1.194,
       1.212
      ],
      "speedup_vs_libsecp256k1": [
       0.631,
       0.63,
       0.642
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "4": {
      "ns_per_sig": 23361.8,
      "iqr_ns": 380.2,
      "msm_only_ns_per_sig": 19676.4,
      "speedup_vs_k256": [
       1.391,
       1.352,
       1.404
      ],
      "speedup_vs_libsecp256k1": [
       0.725,
       0.713,
       0.742
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "8": {
      "ns_per_sig": 21912.0,
      "iqr_ns": 447.8,
      "msm_only_ns_per_sig": 18167.6,
      "speedup_vs_k256": [
       1.483,
       1.46,
       1.517
      ],
      "speedup_vs_libsecp256k1": [
       0.773,
       0.771,
       0.799
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "16": {
      "ns_per_sig": 21011.6,
      "iqr_ns": 172.3,
      "msm_only_ns_per_sig": 17277.2,
      "speedup_vs_k256": [
       1.547,
       1.521,
       1.557
      ],
      "speedup_vs_libsecp256k1": [
       0.806,
       0.803,
       0.823
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "32": {
      "ns_per_sig": 20577.6,
      "iqr_ns": 323.6,
      "msm_only_ns_per_sig": 16860.3,
      "speedup_vs_k256": [
       1.579,
       1.557,
       1.622
      ],
      "speedup_vs_libsecp256k1": [
       0.823,
       0.822,
       0.847
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "64": {
      "ns_per_sig": 20212.7,
      "iqr_ns": 241.6,
      "msm_only_ns_per_sig": 16553.3,
      "speedup_vs_k256": [
       1.608,
       1.588,
       1.629
      ],
      "speedup_vs_libsecp256k1": [
       0.838,
       0.837,
       0.862
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "128": {
      "ns_per_sig": 19917.9,
      "iqr_ns": 69.9,
      "msm_only_ns_per_sig": 16316.4,
      "speedup_vs_k256": [
       1.632,
       1.604,
       1.636
      ],
      "speedup_vs_libsecp256k1": [
       0.851,
       0.846,
       0.866
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "256": {
      "ns_per_sig": 19898.3,
      "iqr_ns": 64.0,
      "msm_only_ns_per_sig": 16294.8,
      "speedup_vs_k256": [
       1.633,
       1.607,
       1.637
      ],
      "speedup_vs_libsecp256k1": [
       0.852,
       0.847,
       0.867
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "512": {
      "ns_per_sig": 19945.9,
      "iqr_ns": 361.8,
      "msm_only_ns_per_sig": 16351.6,
      "speedup_vs_k256": [
       1.629,
       1.558,
       1.633
      ],
      "speedup_vs_libsecp256k1": [
       0.85,
       0.821,
       0.864
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "1024": {
      "ns_per_sig": 20192.8,
      "iqr_ns": 338.0,
      "msm_only_ns_per_sig": 16590.5,
      "speedup_vs_k256": [
       1.609,
       1.58,
       1.63
      ],
      "speedup_vs_libsecp256k1": [
       0.839,
       0.834,
       0.863
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2048": {
      "ns_per_sig": 20122.7,
      "iqr_ns": 706.1,
      "msm_only_ns_per_sig": 16532.3,
      "speedup_vs_k256": [
       1.615,
       1.544,
       1.631
      ],
      "speedup_vs_libsecp256k1": [
       0.842,
       0.814,
       0.862
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     }
    },
    "k256_lincomb_ct": {
     "1": {
      "ns_per_sig": 51239.4,
      "iqr_ns": 247.9,
      "msm_only_ns_per_sig": 47663.2,
      "speedup_vs_k256": [
       0.634,
       0.623,
       0.635
      ],
      "speedup_vs_libsecp256k1": [
       0.331,
       0.329,
       0.336
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "2": {
      "ns_per_sig": 39937.9,
      "iqr_ns": 978.0,
      "msm_only_ns_per_sig": 36292.8,
      "speedup_vs_k256": [
       0.814,
       0.786,
       0.816
      ],
      "speedup_vs_libsecp256k1": [
       0.424,
       0.414,
       0.432
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "4": {
      "ns_per_sig": 34094.9,
      "iqr_ns": 16.2,
      "msm_only_ns_per_sig": 30477.1,
      "speedup_vs_k256": [
       0.953,
       0.941,
       0.955
      ],
      "speedup_vs_libsecp256k1": [
       0.497,
       0.497,
       0.506
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "8": {
      "ns_per_sig": 31232.3,
      "iqr_ns": 14.1,
      "msm_only_ns_per_sig": 27605.0,
      "speedup_vs_k256": [
       1.041,
       1.028,
       1.042
      ],
      "speedup_vs_libsecp256k1": [
       0.543,
       0.542,
       0.552
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "16": {
      "ns_per_sig": 30383.2,
      "iqr_ns": 1208.0,
      "msm_only_ns_per_sig": 26715.4,
      "speedup_vs_k256": [
       1.07,
       1.016,
       1.091
      ],
      "speedup_vs_libsecp256k1": [
       0.558,
       0.536,
       0.575
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "32": {
      "ns_per_sig": 29183.0,
      "iqr_ns": 832.5,
      "msm_only_ns_per_sig": 25570.6,
      "speedup_vs_k256": [
       1.114,
       1.054,
       1.116
      ],
      "speedup_vs_libsecp256k1": [
       0.581,
       0.556,
       0.591
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "64": {
      "ns_per_sig": 28822.2,
      "iqr_ns": 370.9,
      "msm_only_ns_per_sig": 25216.5,
      "speedup_vs_k256": [
       1.128,
       1.09,
       1.13
      ],
      "speedup_vs_libsecp256k1": [
       0.588,
       0.575,
       0.598
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "128": {
      "ns_per_sig": 28822.7,
      "iqr_ns": 616.1,
      "msm_only_ns_per_sig": 25191.0,
      "speedup_vs_k256": [
       1.128,
       1.096,
       1.138
      ],
      "speedup_vs_libsecp256k1": [
       0.588,
       0.578,
       0.603
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     },
     "256": {
      "ns_per_sig": 29308.9,
      "iqr_ns": 1187.0,
      "msm_only_ns_per_sig": 25624.5,
      "speedup_vs_k256": [
       1.109,
       1.019,
       1.113
      ],
      "speedup_vs_libsecp256k1": [
       0.578,
       0.537,
       0.589
      ],
      "window_bits": 0,
      "ops_per_sig": {
       "adds": 0.0,
       "doublings": 0.0,
       "mixed_adds": 0.0,
       "total": 0.0
      }
     }
    }
   },
   "best_batch_speedup_per_algorithm": {
    "straus_wnaf5": {
     "batch_size": 128,
     "ns_per_sig": 16073.6,
     "iqr_ns": 46.1,
     "msm_only_ns_per_sig": 12476.3,
     "speedup_vs_k256": [
      2.022,
      1.993,
      2.026
     ],
     "speedup_vs_libsecp256k1": [
      1.054,
      1.051,
      1.073
     ],
     "window_bits": 5,
     "ops_per_sig": {
      "adds": 79.1,
      "doublings": 4.0,
      "mixed_adds": 0.0,
      "total": 83.1
     }
    },
    "pippenger": {
     "batch_size": 2048,
     "ns_per_sig": 10711.1,
     "iqr_ns": 5.0,
     "msm_only_ns_per_sig": 7116.5,
     "speedup_vs_k256": [
      3.034,
      2.995,
      3.04
     ],
     "speedup_vs_libsecp256k1": [
      1.582,
      1.581,
      1.609
     ],
     "window_bits": 8,
     "ops_per_sig": {
      "adds": 8.0,
      "doublings": 0.1,
      "mixed_adds": 47.8,
      "total": 55.9
     }
    },
    "k256_lincomb_vartime": {
     "batch_size": 256,
     "ns_per_sig": 19898.3,
     "iqr_ns": 64.0,
     "msm_only_ns_per_sig": 16294.8,
     "speedup_vs_k256": [
      1.633,
      1.607,
      1.637
     ],
     "speedup_vs_libsecp256k1": [
      0.852,
      0.847,
      0.867
     ],
     "window_bits": 0,
     "ops_per_sig": {
      "adds": 0.0,
      "doublings": 0.0,
      "mixed_adds": 0.0,
      "total": 0.0
     }
    },
    "k256_lincomb_ct": {
     "batch_size": 64,
     "ns_per_sig": 28822.2,
     "iqr_ns": 370.9,
     "msm_only_ns_per_sig": 25216.5,
     "speedup_vs_k256": [
      1.128,
      1.09,
      1.13
     ],
     "speedup_vs_libsecp256k1": [
      0.588,
      0.575,
      0.598
     ],
     "window_bits": 0,
     "ops_per_sig": {
      "adds": 0.0,
      "doublings": 0.0,
      "mixed_adds": 0.0,
      "total": 0.0
     }
    }
   },
   "negative_controls": true,
   "python_baselines_median_ns": {
    "wp34_pure_python_ecdsa_sign": 4623656.2,
    "wp34_pure_python_ecdsa_verify": 9114654.2,
    "wp34_pure_python_ecdsa_verify_shamir": 5723125.0,
    "wp34_pure_python_schnorr_sign": 18541975.0,
    "wp34_pure_python_schnorr_verify": 9219837.5,
    "wp34_pure_python_schnorr_batch_verify_per_sig": 7261630.2
   },
   "python_versions": {
    "ecdsa": null,
    "coincurve": null
   },
   "rust_elapsed_s": 27.28
  }
 },
 "classification": {
  "batch_verification_speedup": "known_reproduced",
  "implementation_spread": "empirical_observation",
  "bip340_vectors_and_cross_implementation_agreement": "known_reproduced"
 }
}