File size: 1,506 Bytes
1ea7ac1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/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()