# FLOYao.jl

Is a Yao.jl backend to efficiently simulated fermionic linear optics (FLO) circuits in based on Classical simulation of noninteracting-fermion quantum circuits and Disorder-assisted error correction in Majorana chains.

FLO circuits are a class of quantum circuits that are closely related to non-interacting fermions and can be efficiently simulated on classical computers, similar to the way Clifford circuits can be efficiently classically simulated, as is done in YaoClifford.jl.

## Features

The goal of `FLOYao`

is that if you have code written in `Yao.jl`

that only uses FLO gates and other primitives that are efficiently simulatable in polynomial time and space, that you can simply replace your `AbstractArrayReg`

with a `MajoranaReg`

and run exactly the same simulation, with the same code but exponentially faster.

## Simple example

Here is a simple example, to show how seamlessly FLOYao.jl takes your existing Yao.jl code and gives you immediate speed-ups:

First import `FLOYao`

and `Yao`

```
julia> using FLOYao, Yao
```

then create a circuit

```
julia> nq = 4
julia> θ = π/8
julia> circuit = chain(nq)
julia> push!(circuit, put(nq, 3=>Rz(0.5))) # all of the following are FLO gates
julia> xxg1 = kron(nq, 1 => X, 2 => X)
julia> push!(circuit, rot(xxg1, θ))
julia> xxg2 = kron(nq, 2 => X, 3 => Z, 4 => X)
julia> push!(circuit, rot(xxg2, θ))
```

and create a FLO state, pipe it through the circuit and measure the result

```
julia> FLOYao.zero_state(nq) |> circuit |> measure!
```

Note, that the only difference to using a normal `ArrayReg`

from Yao.jl is the usage of `FLOYao.zero_state()`

instead of `zero_state()`

.