# GMSEnvironment#

class GMSEnvironment[source]#

This environment provides a convenient interface for constructing quantum algorithms using the Ion-trap native GMS gates. GMS gates allow entangling more than 2 qubits in a single step and can therefore boost performance in many situations. For more information on GMS gates consult https://arxiv.org/abs/quant-ph/9810040 . The techniques for converting the circuits presented to this environment are mostly based on https://ieeexplore.ieee.org/document/9815035 .

This environment allows to code blocks of phase-only gates as we are used to but compiles these blocks to GMS gates.

Examples

We create a function performing the quantum Fourier-transform using GMS gates:

```from qrisp import QuantumEnvironment, GMSEnvironment, h, cp, swap
import numpy as np

def QFT(qv, use_gms = False):

n = qv.size

if use_gms:
env = GMSEnvironment
else:
env = QuantumEnvironment

for i in range(n):
h(qv[i])

if i == n-1:
break

with env():

#This is the block which converted to GMS gates
#We can only use the gates p, cp and rz in here

for k in range(n-i-1):
cp(2*np.pi/2**(k+2), qv[k+i+1], qv[i])

for i in range(n//2):
swap(qv[i], qv[n-i-1])
```

We inspect the resulting quantum circuit:

```>>> from qrisp import QuantumFloat, invert
>>> qf = QuantumFloat(5)
>>> qf[:] = 13
>>> QFT(qf, use_gms = True)
>>> print(qf.qs)
```
```QuantumCircuit:
--------------
┌───┐┌───┐┌─────────────────────┐                                 »
qf.0: ┤ X ├┤ H ├┤0                    ├─────────────────────────────────»
└───┘└───┘│                     │┌───┐┌─────────────────────┐     »
qf.1: ──────────┤1                    ├┤ H ├┤0                    ├─────»
┌───┐     │                     │└───┘│                     │┌───┐»
qf.2: ┤ X ├─────┤2 GXX converted gate ├─────┤1                    ├┤ H ├»
├───┤     │                     │     │  GXX converted gate │└───┘»
qf.3: ┤ X ├─────┤3                    ├─────┤2                    ├─────»
└───┘     │                     │     │                     │     »
qf.4: ──────────┤4                    ├─────┤3                    ├─────»
└─────────────────────┘     └─────────────────────┘     »
«
«qf.0: ─────────────────────────────────────────────────────────X─
«                                                               │
«qf.1: ─────────────────────────────────────────────────────X───┼─
«      ┌─────────────────────┐                              │   │
«qf.2: ┤0                    ├──────────────────────────────┼───┼─
«      │                     │┌───┐┌─────────────────────┐  │   │
«qf.3: ┤1 GXX converted gate ├┤ H ├┤0                    ├──X───┼─
«      │                     │└───┘│  GXX converted gate │┌───┐ │
«qf.4: ┤2                    ├─────┤1                    ├┤ H ├─X─
«      └─────────────────────┘     └─────────────────────┘└───┘
Live QuantumVariables:
---------------------
QuantumFloat qf
```

Now we check that the GMS version indeed performs the same operation as the CNOT version by performing the inverse of the CNOT version.

```>>> with invert(): QFT(qf, use_gms = False)
>>> print(qf)
{13: 1.0}
```