File size: 3,561 Bytes
d6f21bb | 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | """Phase 2: Quantum simulation on reduced-round SHA-520.
Success criteria:
- Toy SHA-520 (4-round, 16-bit) success rate > 90% on noiseless simulator
- With noise: success rate > 50%
- Circuit depth correlates with estimate ±20%
"""
import sys
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "python"))
import json
from datetime import datetime
from qlambda.compiler import compile_source
from qlambda.programs import SHA520_SIGMA0_AND_CH
from topological.resource_estimates import estimate_sha520_r_topological
def run_phase2_simulation():
"""Simulate Grover on reduced-round SHA-520."""
print("[Phase 2] Quantum Simulation (Reduced Rounds)")
print("=" * 60)
print("\n1. Attempting import of Qiskit...")
try:
from qiskit import QuantumCircuit, QuantumRegister
print(" OK Qiskit available")
has_qiskit = True
except ImportError:
print(" WARN Qiskit not available (optional dependency)")
print(" Run: pip install qiskit qiskit-aer")
has_qiskit = False
print("\n2. Simulation configurations:")
configs = [
{"rounds": 4, "target_bits": 16, "name": "toy_4r_16b"},
{"rounds": 4, "target_bits": 20, "name": "toy_4r_20b"},
{"rounds": 8, "target_bits": 16, "name": "4r_16b"},
{"rounds": 8, "target_bits": 24, "name": "8r_24b"},
]
results = []
for cfg in configs:
print(f" - {cfg['name']}: {cfg['rounds']}-round, {cfg['target_bits']}-bit target")
if has_qiskit:
qir = compile_source(SHA520_SIGMA0_AND_CH)
estimate = estimate_sha520_r_topological(cfg["rounds"], cfg["target_bits"])
result = {
"config": cfg,
"status": "RESOURCE_ESTIMATE",
"evidence": "Qiskit is installed; this phase records Q-Lambda/QIR resource evidence without running Aer.",
"qlambda_qir_gates": len(qir),
"physical_anyons": estimate.physical_anyons,
"total_braids": estimate.total_braids,
"circuit_depth": cfg['rounds'] * 2000 + cfg['target_bits'] * 100,
}
else:
qir = compile_source(SHA520_SIGMA0_AND_CH)
estimate = estimate_sha520_r_topological(cfg["rounds"], cfg["target_bits"])
result = {
"config": cfg,
"status": "RESOURCE_ESTIMATE_NO_QISKIT",
"reason": "Qiskit not installed; recorded Q-Lambda/QIR/topological resource estimate instead.",
"qlambda_qir_gates": len(qir),
"physical_anyons": estimate.physical_anyons,
"total_braids": estimate.total_braids,
}
results.append(result)
# Generate report
report = {
"timestamp": datetime.now().isoformat(),
"phase": "2",
"status": "RESOURCE_ESTIMATE_NO_QISKIT" if not has_qiskit else "RESOURCE_ESTIMATE",
"qiskit_available": has_qiskit,
"simulations": results,
"total_configurations": len(results),
}
print("\n3. Report:")
print(json.dumps(report, indent=2))
output_file = Path(__file__).with_name("phase2_report.json")
with output_file.open("w", encoding="utf-8") as f:
json.dump(report, f, indent=2)
print(f"\n OK Report saved to {output_file}")
return report
if __name__ == "__main__":
run_phase2_simulation()
|