inst/doc/qft.R

## ----echo=FALSE---------------------------------------------------------------
library(knitr)
library(qsimulatR)
knitr::opts_chunk$set(fig.align='center',
                      comment='')

## -----------------------------------------------------------------------------
N <- 3
v <- seq(1:2^N)
v <- v/sqrt(sum(v^2))

w <- fft(v, inverse=TRUE)/sqrt(length(v))

## -----------------------------------------------------------------------------
x <- qstate(N, coefs=as.complex(v))
x <- H(3) * x
x <- cqgate(bits=c(2, 3), gate=S(3)) * x
x <- cqgate(bits=c(1, 3), gate=Tgate(3)) * x
x <- H(2) * x
x <- cqgate(bits=c(1, 2), gate=S(2)) * x
x <- H(1) * x
x <- SWAP(c(1,3)) * x

## -----------------------------------------------------------------------------
plot(x)

## -----------------------------------------------------------------------------
sum(x@coefs*Conj(x@coefs))

## -----------------------------------------------------------------------------
sqrt(sum((w - x@coefs)*Conj(w - x@coefs)))

## -----------------------------------------------------------------------------
Tdagger <- function(bit) {
  return(methods::new("sqgate",
                      bit=as.integer(bit),
                      M=array(as.complex(c(1., 0, 0, exp(-1i*pi/4))), dim=c(2,2)),
                      type="Tdag"))
}
Sdagger <- function(bit) {
  return(methods::new("sqgate",
                      bit=as.integer(bit),
                      M=array(as.complex(c(1,0,0,-1i)), dim=c(2,2)),
                      type="Sdag"))
}

## -----------------------------------------------------------------------------
z <- qstate(N, coefs=x@coefs)
z <- SWAP(c(1,3)) * z
z <- H(1) * z
z <- cqgate(bits=c(1, 2), gate=Sdagger(2)) * z
z <- H(2) * z
z <- cqgate(bits=c(1, 3), gate=Tdagger(2)) * z
z <- cqgate(bits=c(2, 3), gate=Sdagger(2)) * z
z <- H(3) * z

## -----------------------------------------------------------------------------
plot(z)

## -----------------------------------------------------------------------------
sqrt(sum((v - z@coefs)*Conj(v - z@coefs)))

## -----------------------------------------------------------------------------
y <- qstate(N, coefs=x@coefs)
y <- H(3) * y
y <- cqgate(bits=c(2, 3), gate=Sdagger(3)) * y
y <- cqgate(bits=c(1, 3), gate=Tdagger(3)) * y
y <- H(2) * y
y <- cqgate(bits=c(1, 2), gate=Sdagger(2)) * y
y <- H(1) * y
y <- SWAP(c(1,3)) * y

plot(y)

## -----------------------------------------------------------------------------
sqrt(sum((v - y@coefs)*Conj(v - y@coefs)))

## -----------------------------------------------------------------------------
Ri <- function(bit, i, sign=+1) {
  type <- paste0("R", i)
  if(sign < 0) {
    type <- paste0("R", i, "dag")
  }
  return(methods::new("sqgate",
                      bit=as.integer(bit),
                      M=array(as.complex(c(1,0,0,exp(sign*2*pi*1i/2^i))),
                              dim=c(2,2)), type=type))
}

## ---- eval=FALSE--------------------------------------------------------------
#  qft <- function(x, inverse=FALSE) {
#    n <- x@nbits
#    y <- x
#    sign <- +1
#    if(inverse) sign <- -1
#    for(bit in c(n:1)) {
#      y <- H(bit) * y
#      if(bit > 1) {
#        for(i in c((bit-1):1)) {
#          y <- cqgate(bits=c(i, bit), gate=Ri(bit, bit-(i-1), sign=sign)) * y
#        }
#      }
#    }
#    ## reverse order
#    for(k in c(1:floor(n/2))) {
#      y <- SWAP(c(k, n-(k-1))) * y
#    }
#    return(invisible(y))
#  }

## -----------------------------------------------------------------------------
y <- qstate(N, coefs=x@coefs)
y <- qft(y, inverse=TRUE)
plot(y)
sqrt(sum((v - y@coefs)*Conj(v - y@coefs)))

Try the qsimulatR package in your browser

Any scripts or data that you put into this service are public.

qsimulatR documentation built on Oct. 16, 2023, 5:06 p.m.