# Alap Qiskit könyvtárak
from qiskit import QuantumCircuit, transpile
from qiskit.tools.jupyter import *
from qiskit.visualization import *
from ibm_quantum_widgets import *
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler, Estimator, Session, Options

# IBM Quantum account betöltése
service = QiskitRuntimeService(channel="ibm_quantum")

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, Aer, execute
from qiskit.circuit import ControlledGate

# Tegyük fel, hogy n a qubitek száma
n = 3

# Hozzunk létre egy kvantum regisztert n qubittal a függvényhez és 1 qubittal a CNOT céljához
qr = QuantumRegister(n + 1)
# Hozzunk létre egy klasszikus regisztert a méréshez
cr = ClassicalRegister(n + 1)

circuit = QuantumCircuit(qr, cr)

# Az f függvény implementálása: Bitenkénti NOT művelet minden egyes első n qubit esetén (csak próbaként)
for qubit in range(n):
    circuit.x(qr[qubit])

# Alkalmazzunk CNOT-t az n-edik qubit vezérlésével és az (n+1)-edik qubit célpontjával
circuit.cnot(qr[n-1], qr[n])

# Mérjük meg a qubiteket
circuit.measure(qr, cr)

print(circuit)

# szimuláció
simulator = Aer.get_backend('qasm_simulator')
job = execute(circuit, simulator, shots=1024)
result = job.result()
counts = result.get_counts(circuit)
print(counts)

