# Implement muti-qubit controlled gate with 2 Z/X gates

This paper simulates duality mode to solve sudoku puzzles. The last diagram in the paper (shown below) illustrates multi-qubit controlled gates with two Z/X gates. I wonder if Qiskit can directly implement these gates. • The two Z gates in a single circuit is just a shorthand for two separate Z gates, both with the same set of controls. Likewise for the X Gate. Nov 29, 2022 at 5:53

As @FrankYellin mentioned in the comments, this is theoretically equivalent to two MCXGate applied successively (up to some HGate for the $$Z$$ version).

However, you shouldn't worry about this, a framework's goal is to let it deal with low-level implementation, while you should care about what operation you want to perform. Fundamentally, what you're looking for is a multi-controlled $$XX$$ gate.

Qiskit has an RXXGate, but this will include an unwanted relative phase. You can create the $$XX$$ gate like this:

from qiskit import QuantumCircuit

circ = QuantumCircuit(2)
circ.x([0, 1])
xx_gate = circ.to_gate(label="XXGate")


Now that we have our $XX$ gate, we can control it out of other qubits as desired, like so:

from qiskit import QuantumRegister

# Be careful about Qiskit's little-endian convention
controlled_xx_gate = xx_gate.control(7, "MCXXGate", "0000100")

alpha = QuantumRegister(4, "alpha")
beta = QuantumRegister(4, "beta")
gamma = QuantumRegister(4, "gamma")

circ = QuantumCircuit(alpha, beta, gamma)
circ.h([alpha[-1], beta[-1], gamma[-1]])

# Using HXH = Z
circ.h([beta, gamma])
# Be careful about Qiskit's little-endian convention
circ.append(controlled_xx_gate, [*alpha[:-1], beta, beta[-1], gamma, gamma[-1], beta, gamma])
circ.h([beta, gamma])

# Be careful about Qiskit's little-endian convention
circ.append(controlled_xx_gate, [*alpha[:-1], beta, beta[-1], gamma, gamma[-1], beta, gamma])


The resulting circuit looks like this: • What does "*" do in the last line of code? Which code creates anti-controlled gate?
– Yili
Nov 29, 2022 at 15:51
• @Yili *alpha[:-1] is a shorthand for alpha, alpha, alpha. More generally, *my_list "unwraps" the list. The controls of the gate are defined via the string "0000100", which means that the gate will be applied if the first 4 qubits are 0, the fifth one 1 and the last ones 0. Note that because of Qiskit's convention to use little-endian, this has to be read from bottom to top wire-wise. Nov 29, 2022 at 18:15
• Which part of codes do you specify which wire(s) to append xx_gate within the gate "MCXXGate"?
– Yili
Nov 30, 2022 at 16:12
• @Yili This one: controlled_xx_gate = xx_gate.control(7, "MCXXGate", "0000100"). This code transforms the xx_gate to a controlled version of it, which I labelled MCXXGate, controlled by the string "0000100". The convention in Qiskit when creating such a gate is that the first inputs are the controls, and the last ones the inputs to the original gate, which is why, when applying it, we pass beta and gamma as the last parameters: these are the registers on which we wish to apply the $XX$ gate Nov 30, 2022 at 16:17