FA-91196 / Quantum circuit simulation / Open access
Grover planner takes asin of the marked fraction instead of its square root · case 01
For N=1024, M=1 the planner asks for about 804 iterations instead of 25.
ROOT CAUSE
theta is computed as asin(M/N) instead of asin(sqrt(M/N)); the initial amplitude, not probability, sets the angle.
VERIFIED REPAIR
Use theta = asin(sqrt(M/N)).
Unsuccessful approach: The attempted repair uses acos(sqrt(M/N)), the complementary angle.
Case contract
Input [N, M]. "invalid" if N < 1, M < 0 or M > N; "no-solution" if M == 0; if 2M >= N return {"iterations": 0, "success": M/N}; else theta = asin(sqrt(M/N)), k = floor(pi/(4 theta)) and success = sin^2((2k+1) theta). Probabilities rounded to 6 decimals.
Why this case matters
Choosing the Grover iteration count wrongly overshoots the amplitude peak and collapses the success probability.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
N, M = x
if N < 1 or M < 0 or M > N:
return 'invalid'
if M == 0:
return 'no-solution'
if 2 * M >= N:
return {'iterations': 0, 'success': round(M / N, 6)}
theta = math.asin(M / N)
k = math.floor(math.pi / (4 * theta))
return {'iterations': k, 'success': round(math.sin((2 * k + 1) * theta) ** 2, 6)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: odd N just under half', [5, 2], {'iterations': 1, 'success': 0.784}], ['regression: single marked N=4', [4, 1], {'iterations': 1, 'success': 1.0}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=9 M=4', [9, 4], {'iterations': 1, 'success': 0.663923}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]], [['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['regression: N=16 M=1', [16, 1], {'iterations': 3, 'success': 0.961319}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['control: all marked N=3', [3, 3], {'iterations': 0, 'success': 1.0}], ['control: N=8 M=5', [8, 5], {'iterations': 0, 'success': 0.625}], ['control: N=8 M=7', [8, 7], {'iterations': 0, 'success': 0.875}], ['control: N=16 M=13', [16, 13], {'iterations': 0, 'success': 0.8125}]], [['regression: N=16 M=3', [16, 3], {'iterations': 1, 'success': 0.949219}], ['regression: N=16 M=5', [16, 5], {'iterations': 1, 'success': 0.957031}], ['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=32 M=1', [32, 1], {'iterations': 4, 'success': 0.999182}], ['regression: N=32 M=2', [32, 2], {'iterations': 3, 'success': 0.961319}], ['regression: N=16 M=2', [16, 2], {'iterations': 2, 'success': 0.945312}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: odd N just under half | {'iterations': 1, 'success': 0.891136} | {'iterations': 1, 'success': 0.784} | Failed |
| regression: single marked N=4 | {'iterations': 3, 'success': 0.961319} | {'iterations': 1, 'success': 1.0} | Failed |
| regression: N=7 M=3 | {'iterations': 1, 'success': 0.942541} | {'iterations': 1, 'success': 0.708455} | Failed |
| control: half marked N=4 M=2 | {'iterations': 0, 'success': 0.5} | {'iterations': 0, 'success': 0.5} | Passed |
| control: no marked items | no-solution | no-solution | Passed |
| control: M greater than N | invalid | invalid | Passed |
| control: negative M | invalid | invalid | Passed |
SHA-256 / d00bc859c946418786f9c8aedf61f83401fb6c0548d31a9b7236e0af0312223c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
N, M = x
if N < 1 or M < 0 or M > N:
return 'invalid'
if M == 0:
return 'no-solution'
if 2 * M >= N:
return {'iterations': 0, 'success': round(M / N, 6)}
theta = math.acos(math.sqrt(M / N))
k = math.floor(math.pi / (4 * theta))
return {'iterations': k, 'success': round(math.sin((2 * k + 1) * theta) ** 2, 6)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: odd N just under half', [5, 2], {'iterations': 1, 'success': 0.784}], ['regression: single marked N=4', [4, 1], {'iterations': 1, 'success': 1.0}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=9 M=4', [9, 4], {'iterations': 1, 'success': 0.663923}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]], [['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['regression: N=16 M=1', [16, 1], {'iterations': 3, 'success': 0.961319}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['control: all marked N=3', [3, 3], {'iterations': 0, 'success': 1.0}], ['control: N=8 M=5', [8, 5], {'iterations': 0, 'success': 0.625}], ['control: N=8 M=7', [8, 7], {'iterations': 0, 'success': 0.875}], ['control: N=16 M=13', [16, 13], {'iterations': 0, 'success': 0.8125}]], [['regression: N=16 M=3', [16, 3], {'iterations': 1, 'success': 0.949219}], ['regression: N=16 M=5', [16, 5], {'iterations': 1, 'success': 0.957031}], ['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=32 M=1', [32, 1], {'iterations': 4, 'success': 0.999182}], ['regression: N=32 M=2', [32, 2], {'iterations': 3, 'success': 0.961319}], ['regression: N=16 M=2', [16, 2], {'iterations': 2, 'success': 0.945312}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: odd N just under half | {'iterations': 0, 'success': 0.6} | {'iterations': 1, 'success': 0.784} | Failed |
| regression: single marked N=4 | {'iterations': 0, 'success': 0.75} | {'iterations': 1, 'success': 1.0} | Failed |
| regression: N=7 M=3 | {'iterations': 0, 'success': 0.571429} | {'iterations': 1, 'success': 0.708455} | Failed |
| control: half marked N=4 M=2 | {'iterations': 0, 'success': 0.5} | {'iterations': 0, 'success': 0.5} | Passed |
| control: no marked items | no-solution | no-solution | Passed |
| control: M greater than N | invalid | invalid | Passed |
| control: negative M | invalid | invalid | Passed |
SHA-256 / 43a9c0e47e2680e43dbe80c4f54112223ad9cadbf7eea20cba49604a70d984eb
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
N, M = x
if N < 1 or M < 0 or M > N:
return 'invalid'
if M == 0:
return 'no-solution'
if 2 * M >= N:
return {'iterations': 0, 'success': round(M / N, 6)}
theta = math.asin(math.sqrt(M / N))
k = math.floor(math.pi / (4 * theta))
return {'iterations': k, 'success': round(math.sin((2 * k + 1) * theta) ** 2, 6)}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: odd N just under half', [5, 2], {'iterations': 1, 'success': 0.784}], ['regression: single marked N=4', [4, 1], {'iterations': 1, 'success': 1.0}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=9 M=4', [9, 4], {'iterations': 1, 'success': 0.663923}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['regression: N=7 M=3', [7, 3], {'iterations': 1, 'success': 0.708455}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]], [['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['regression: N=16 M=1', [16, 1], {'iterations': 3, 'success': 0.961319}], ['regression: N=8 M=1', [8, 1], {'iterations': 2, 'success': 0.945312}], ['control: all marked N=3', [3, 3], {'iterations': 0, 'success': 1.0}], ['control: N=8 M=5', [8, 5], {'iterations': 0, 'success': 0.625}], ['control: N=8 M=7', [8, 7], {'iterations': 0, 'success': 0.875}], ['control: N=16 M=13', [16, 13], {'iterations': 0, 'success': 0.8125}]], [['regression: N=16 M=3', [16, 3], {'iterations': 1, 'success': 0.949219}], ['regression: N=16 M=5', [16, 5], {'iterations': 1, 'success': 0.957031}], ['regression: N=8 M=3', [8, 3], {'iterations': 1, 'success': 0.84375}], ['control: half marked N=4 M=2', [4, 2], {'iterations': 0, 'success': 0.5}], ['control: no marked items', [8, 0], 'no-solution'], ['control: M greater than N', [4, 5], 'invalid'], ['control: negative M', [4, -1], 'invalid']], [['regression: N=32 M=1', [32, 1], {'iterations': 4, 'success': 0.999182}], ['regression: N=32 M=2', [32, 2], {'iterations': 3, 'success': 0.961319}], ['regression: N=16 M=2', [16, 2], {'iterations': 2, 'success': 0.945312}], ['control: empty space', [0, 0], 'invalid'], ['control: all marked', [8, 8], {'iterations': 0, 'success': 1.0}], ['control: one over the space', [4, 5], 'invalid'], ['control: all marked N=1', [1, 1], {'iterations': 0, 'success': 1.0}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: odd N just under half | {'iterations': 1, 'success': 0.784} | {'iterations': 1, 'success': 0.784} | Passed |
| regression: single marked N=4 | {'iterations': 1, 'success': 1.0} | {'iterations': 1, 'success': 1.0} | Passed |
| regression: N=7 M=3 | {'iterations': 1, 'success': 0.708455} | {'iterations': 1, 'success': 0.708455} | Passed |
| control: half marked N=4 M=2 | {'iterations': 0, 'success': 0.5} | {'iterations': 0, 'success': 0.5} | Passed |
| control: no marked items | no-solution | no-solution | Passed |
| control: M greater than N | invalid | invalid | Passed |
| control: negative M | invalid | invalid | Passed |
SHA-256 / a7d8240ea133dc3deaf1ad073d8c2eba2b5a06a1a62904cfffd9551ccefd7728
Verification & scope
A deterministic bounded teaching model with a stipulated toy contract; amplitudes are rounded to fixed decimals for strict JSON output. It is not a production quantum SDK and claims no standards conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:33.692957+00:00.
Case digest / 78fa63fb79d73097d82996cec146755b58a2b292277f83b89a93fa661a8ad017