Goldbach.core / app.py
Ivankilin's picture
Rename qgoh.py to app.py
fad2c07 verified
raw
history blame
1.51 kB
#!/usr/bin/env python3
"""
Q-GoH: Quantum Goldbach Hypothesis β€” one-file infinity runner
"""
import itertools, math, sympy, time
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
def mask(max_val):
return [1 if sympy.isprime(i) else 0 for i in range(max_val + 1)]
def grover_once(N):
n = math.ceil(math.log2(N // 2 + 1))
qc = QuantumCircuit(2 * n, 2 * n)
qc.h(range(2 * n))
m = mask(N // 2)
# oracle flags: p,q prime and p+q=N
for val, is_prime in enumerate(m):
if is_prime:
ctrl = [i for i in range(n) if not (val >> i) & 1]
if ctrl: qc.x(ctrl)
qc.mcx(list(range(n)), 0) # flag p
if ctrl: qc.x(ctrl)
ctrl = [i + n for i in range(n) if not (val >> i) & 1]
if ctrl: qc.x(ctrl)
qc.mcx(list(range(n, 2 * n)), 1) # flag q
if ctrl: qc.x(ctrl)
qc.measure_all()
counts = AerSimulator().run(qc, shots=64).result().get_counts()
for bits, _ in counts.items():
p = int(bits[:n], 2)
q = int(bits[n:], 2)
if sympy.isprime(p) and sympy.isprime(q) and p + q == N:
return p, q
return None
def main():
for N in itertools.count(4, 2):
t0 = time.perf_counter()
pair = grover_once(N)
dt = time.perf_counter() - t0
print(f"{N} = {pair[0]} + {pair[1]} (found in {dt:.3f}s)" if pair
else f"{N} ❌ ({dt:.3f}s)")
if __name__ == "__main__":
main()