Documentation
¶
Overview ¶
Example (Any) ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
"github.com/itsubaki/q/quantum/gate"
)
func main() {
h := gate.U(math.Pi/2, 0, math.Pi)
x := gate.U(math.Pi, 0, math.Pi)
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.G(h, q0)
qsim.C(x, q0, q1)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
Example (Bell) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/rand"
)
func main() {
qsim := q.New()
qsim.Rand = rand.Const()
r := qsim.Zeros(2)
qsim.H(r[0])
qsim.CNOT(r[0], r[1])
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
Example (Bellm) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0).CNOT(q0, q1)
for _, s := range qsim.State() {
fmt.Println(s)
}
m0 := qsim.Measure(q0)
m1 := qsim.Measure(q1)
fmt.Println(m0.Equal(m1))
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000 true
Example (DensityMatrix) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/quantum/density"
)
func main() {
qsim := q.New()
{
// bell state
qb := qsim.Zeros(2)
qsim.H(qb[0])
qsim.CNOT(qb[0], qb[1])
}
rho := density.NewPureState(qsim.Underlying())
qb := rho.Qubits()
s1 := rho.PartialTrace(qb[0])
s0 := rho.PartialTrace(qb[1])
fmt.Printf("trace: %.2v, purity: %.2v\n", rho.Trace(), rho.Purity())
fmt.Printf("trace: %.2v, purity: %.2v\n", s1.Trace(), s1.Purity())
fmt.Printf("trace: %.2v, purity: %.2v\n", s0.Trace(), s0.Purity())
}
Output: trace: 1, purity: 1 trace: 1, purity: 0.5 trace: 1, purity: 0.5
Example (DeutschJozsa) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
constant := func(qsim *q.Q, q0, q1 q.Qubit) string {
return "Constant"
}
balanced := func(qsim *q.Q, q0, q1 q.Qubit) string {
qsim.CNOT(q0, q1)
return "Balanced"
}
deutschJozsa := func(oracle func(qsim *q.Q, q0, q1 q.Qubit) string) (string, int) {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.One()
qsim.H(q0, q1)
ans := oracle(qsim, q0, q1)
qsim.H(q0)
if qsim.M(q0).IsZero() {
return ans, 0
}
return ans, 1
}
fmt.Println(deutschJozsa(constant))
fmt.Println(deutschJozsa(balanced))
}
Output: Constant 0 Balanced 1
Example (Ecc) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.New(1, 2)
fmt.Println("q0:")
for _, s := range qsim.State(q0) {
fmt.Println(s)
}
// encoding
q1 := qsim.Zero()
q2 := qsim.Zero()
qsim.CNOT(q0, q1).CNOT(q0, q2)
// error: first qubit is flipped
qsim.X(q0)
fmt.Println("q0(flipped):")
for _, s := range qsim.State(q0) {
fmt.Println(s)
}
// add ancilla qubit
q3 := qsim.Zero()
q4 := qsim.Zero()
// error correction
qsim.CNOT(q0, q3).CNOT(q1, q3)
qsim.CNOT(q1, q4).CNOT(q2, q4)
m3 := qsim.Measure(q3)
m4 := qsim.Measure(q4)
qsim.CondX(m3.IsOne() && m4.IsZero(), q0)
qsim.CondX(m3.IsOne() && m4.IsOne(), q1)
qsim.CondX(m3.IsZero() && m4.IsOne(), q2)
// decoding
qsim.CNOT(q0, q2).CNOT(q0, q1)
fmt.Println("q0(corrected):")
for _, s := range qsim.State(q0) {
fmt.Println(s)
}
}
Output: q0: [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000 q0(flipped): [0][ 0]( 0.8944 0.0000i): 0.8000 [1][ 1]( 0.4472 0.0000i): 0.2000 q0(corrected): [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000
Example (Grover3) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
// NOTE: C. Figgatt, D. Maslov, K. A. Landsman, N. M. Linke, S. Debnath, and C. Monroe. Complete 3-Qubit Grover Search on a Programmable Quantum Computer.
qsim := q.New()
// initial state
r := qsim.Zeros(3)
a := qsim.One()
// superposition
qsim.H(r...).H(a)
// oracle for |011>|1>
qsim.X(r[0]).CCCNOT(r[0], r[1], r[2], a).X(r[0])
// diffuser
qsim.H(r...).H(a)
qsim.X(r...).CCZ(r[0], r[1], r[2]).X(r...)
qsim.H(r...)
for _, s := range qsim.State(r, a) {
fmt.Println(s)
}
}
Output: [000 1][ 0 1](-0.1768 0.0000i): 0.0312 [001 1][ 1 1](-0.1768 0.0000i): 0.0312 [010 1][ 2 1](-0.1768 0.0000i): 0.0312 [011 1][ 3 1](-0.8839 0.0000i): 0.7812 [100 1][ 4 1](-0.1768 0.0000i): 0.0312 [101 1][ 5 1](-0.1768 0.0000i): 0.0312 [110 1][ 6 1](-0.1768 0.0000i): 0.0312 [111 1][ 7 1](-0.1768 0.0000i): 0.0312
Example (Grover4) ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/number"
)
func main() {
// NOTE: Eric R. Johnson, Nic Harrigan, and Merecedes Gimeno-Segovia. Programming Quantum Computers. O'Reilly.
qsim := q.New()
// initial state
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.Zero()
q3 := qsim.Zero()
// superposition
qsim.H(q0, q1, q2, q3)
// iteration
N := number.Pow(2, qsim.NumQubits())
r := math.Floor(math.Pi / 4 * math.Sqrt(float64(N)))
for range int(r) {
// oracle for |110>|x>
qsim.X(q2, q3)
qsim.H(q3).CCCNOT(q0, q1, q2, q3).H(q3)
qsim.X(q2, q3)
// diffuser
qsim.H(q0, q1, q2, q3)
qsim.X(q0, q1, q2, q3)
qsim.H(q3).CCCNOT(q0, q1, q2, q3).H(q3)
qsim.X(q0, q1, q2, q3)
qsim.H(q0, q1, q2, q3)
}
for _, s := range qsim.State([]q.Qubit{q0, q1, q2}, q3) {
fmt.Println(s)
}
}
Output: [000 0][ 0 0]( 0.0508 0.0000i): 0.0026 [000 1][ 0 1]( 0.0508 0.0000i): 0.0026 [001 0][ 1 0]( 0.0508 0.0000i): 0.0026 [001 1][ 1 1]( 0.0508 0.0000i): 0.0026 [010 0][ 2 0]( 0.0508 0.0000i): 0.0026 [010 1][ 2 1]( 0.0508 0.0000i): 0.0026 [011 0][ 3 0]( 0.0508 0.0000i): 0.0026 [011 1][ 3 1]( 0.0508 0.0000i): 0.0026 [100 0][ 4 0]( 0.0508 0.0000i): 0.0026 [100 1][ 4 1]( 0.0508 0.0000i): 0.0026 [101 0][ 5 0]( 0.0508 0.0000i): 0.0026 [101 1][ 5 1]( 0.0508 0.0000i): 0.0026 [110 0][ 6 0](-0.9805 0.0000i): 0.9613 [110 1][ 6 1]( 0.0508 0.0000i): 0.0026 [111 0][ 7 0]( 0.0508 0.0000i): 0.0026 [111 1][ 7 1]( 0.0508 0.0000i): 0.0026
Example (Qft001) ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.One()
qsim.H(q0)
qsim.CR(math.Pi/2, q0, q1)
qsim.CR(math.Pi/4, q0, q2)
qsim.H(q1)
qsim.CR(math.Pi/2, q1, q2)
qsim.H(q2)
qsim.CNOT(q0, q2)
qsim.CNOT(q2, q0)
qsim.CNOT(q0, q2)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1]( 0.2500 0.2500i): 0.1250 [010][ 2]( 0.0000 0.3536i): 0.1250 [011][ 3](-0.2500 0.2500i): 0.1250 [100][ 4](-0.3536 0.0000i): 0.1250 [101][ 5](-0.2500-0.2500i): 0.1250 [110][ 6]( 0.0000-0.3536i): 0.1250 [111][ 7]( 0.2500-0.2500i): 0.1250
Example (Qft010) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.One()
q2 := qsim.Zero()
qsim.H(q0)
qsim.CR(q.Theta(2), q1, q0)
qsim.CR(q.Theta(3), q2, q0)
qsim.H(q1)
qsim.CR(q.Theta(2), q2, q1)
qsim.H(q2)
qsim.Swap(q0, q2)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1]( 0.0000 0.3536i): 0.1250 [010][ 2](-0.3536 0.0000i): 0.1250 [011][ 3]( 0.0000-0.3536i): 0.1250 [100][ 4]( 0.3536 0.0000i): 0.1250 [101][ 5]( 0.0000 0.3536i): 0.1250 [110][ 6](-0.3536 0.0000i): 0.1250 [111][ 7]( 0.0000-0.3536i): 0.1250
Example (Shor15) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/number"
"github.com/itsubaki/q/math/rand"
)
func main() {
// NOTE: Zhengjun Cao, Zhenfu Cao, Lihua Liu. Remarks on Quantum Modular Exponentiation and Some Experimental Demonstrations of Shor’s Algorithm.
N := 15
a := 7
qsim := q.New()
qsim.Rand = rand.Const()
// initial state
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.Zero()
q3 := qsim.Zero()
q4 := qsim.Zero()
q5 := qsim.Zero()
q6 := qsim.One()
// superposition
qsim.H(q0, q1, q2)
// Controlled-U^(2^0)
qsim.CNOT(q2, q4)
qsim.CNOT(q2, q5)
// Controlled-U^(2^1)
qsim.CNOT(q3, q5).CCNOT(q1, q5, q3).CNOT(q3, q5)
qsim.CNOT(q6, q4).CCNOT(q1, q4, q6).CNOT(q6, q4)
// inverse QFT
qsim.Swap(q0, q2)
qsim.InvQFT(q0, q1, q2)
// debug
qsim.Measure(q3, q4, q5, q6)
for _, s := range qsim.State([]q.Qubit{q0, q1, q2}) {
fmt.Println(s)
}
// measure q0, q1, q2
m := qsim.Measure(q0, q1, q2)
// find s/r. 0.010 -> 0.25 -> 1/4, 0.110 -> 0.75 -> 3/4, ...
s, r, d, ok := number.FindOrder(a, N, number.Ldexp(m.Int(), -3))
if !ok || number.IsOdd(r) {
return
}
// gcd(a^(r/2)-1, N), gcd(a^(r/2)+1, N)
p0 := number.GCD(number.Pow(a, r/2)-1, N)
p1 := number.GCD(number.Pow(a, r/2)+1, N)
// check non-trivial factor
if number.IsTrivial(N, p0, p1) {
return
}
fmt.Printf("N=%d, a=%d. p=%v, q=%v. s/r=%d/%d ([0.%v]~%.3f)\n", N, a, p0, p1, s, r, m.BinaryString(), d)
}
Output: [000][ 0]( 0.5000 0.0000i): 0.2500 [010][ 2]( 0.0000 0.5000i): 0.2500 [100][ 4](-0.5000 0.0000i): 0.2500 [110][ 6]( 0.0000-0.5000i): 0.2500 N=15, a=7. p=3, q=5. s/r=1/4 ([0.010]~0.250)
Example (SuperDenseCoding) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/matrix"
"github.com/itsubaki/q/quantum/gate"
)
func main() {
sdc := func(g *matrix.Matrix) string {
qsim := q.New()
// initial state
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0)
qsim.CNOT(q0, q1)
// encode
qsim.G(g, q0)
// decode
qsim.CNOT(q0, q1)
qsim.H(q0)
// measure
return qsim.M(q0, q1).BinaryString()
}
fmt.Printf("I : %v\n", sdc(gate.I()))
fmt.Printf("X : %v\n", sdc(gate.X()))
fmt.Printf("Z : %v\n", sdc(gate.Z()))
fmt.Printf("ZX: %v\n", sdc(gate.Z().Apply(gate.X())))
}
Output: I : 00 X : 01 Z : 10 ZX: 11
Example (Teleportation) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
phi := qsim.New(1, 2)
q0 := qsim.Zero()
q1 := qsim.Zero()
fmt.Println("phi:")
for _, s := range qsim.State(phi) {
fmt.Println(s)
}
qsim.H(q0).CNOT(q0, q1)
qsim.CNOT(phi, q0).H(phi)
qsim.CNOT(q0, q1)
qsim.CZ(phi, q1)
qsim.Measure(phi, q0)
fmt.Println("q1:")
for _, s := range qsim.State(q1) {
fmt.Println(s)
}
}
Output: phi: [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000 q1: [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000
Example (TeleportationCond) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
phi := qsim.New(1, 2)
q0 := qsim.Zero()
q1 := qsim.Zero()
fmt.Println("phi:")
for _, s := range qsim.State(phi) {
fmt.Println(s)
}
qsim.H(q0).CNOT(q0, q1)
qsim.CNOT(phi, q0).H(phi)
mz := qsim.Measure(phi)
mx := qsim.Measure(q0)
qsim.CondX(mx.IsOne(), q1)
qsim.CondZ(mz.IsOne(), q1)
fmt.Println("q1:")
for _, s := range qsim.State(q1) {
fmt.Println(s)
}
}
Output: phi: [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000 q1: [0][ 0]( 0.4472 0.0000i): 0.2000 [1][ 1]( 0.8944 0.0000i): 0.8000
Index ¶
- func Index(qb ...Qubit) []int
- func Theta(k int) float64
- func Top(s []qubit.State, n int) []qubit.State
- type Q
- func (q *Q) Amplitude() []complex128
- func (q *Q) Apply(g ...*matrix.Matrix) *Q
- func (q *Q) C(g *matrix.Matrix, control, target Qubit) *Q
- func (q *Q) CCCNOT(control0, control1, control2, target Qubit) *Q
- func (q *Q) CCNOT(control0, control1, target Qubit) *Q
- func (q *Q) CCZ(control0, control1, target Qubit) *Q
- func (q *Q) CNOT(control, target Qubit) *Q
- func (q *Q) CR(theta float64, control, target Qubit) *Q
- func (q *Q) CU(theta, phi, lambda float64, control, target Qubit) *Q
- func (q *Q) CX(control, target Qubit) *Q
- func (q *Q) CZ(control, target Qubit) *Q
- func (q *Q) Clone() *Q
- func (q *Q) Cond(condition bool, g *matrix.Matrix, qb ...Qubit) *Q
- func (q *Q) CondX(condition bool, qb ...Qubit) *Q
- func (q *Q) CondZ(condition bool, qb ...Qubit) *Q
- func (q *Q) Controlled(g *matrix.Matrix, control, target []Qubit) *Q
- func (q *Q) ControlledH(control, target []Qubit) *Q
- func (q *Q) ControlledNot(control, target []Qubit) *Q
- func (q *Q) ControlledR(theta float64, control, target []Qubit) *Q
- func (q *Q) ControlledU(theta, phi, lambda float64, control, target []Qubit) *Q
- func (q *Q) ControlledX(control, target []Qubit) *Q
- func (q *Q) ControlledZ(control, target []Qubit) *Q
- func (q *Q) G(g *matrix.Matrix, qb ...Qubit) *Q
- func (q *Q) H(qb ...Qubit) *Q
- func (q *Q) I(qb ...Qubit) *Q
- func (q *Q) InvQFT(qb ...Qubit) *Q
- func (q *Q) M(qb ...Qubit) *qubit.Qubit
- func (q *Q) Measure(qb ...Qubit) *qubit.Qubit
- func (q *Q) New(v ...complex128) Qubit
- func (q *Q) NumQubits() int
- func (q *Q) One() Qubit
- func (q *Q) Ones(n int) []Qubit
- func (q *Q) Probability() []float64
- func (q *Q) QFT(qb ...Qubit) *Q
- func (q *Q) R(theta float64, qb ...Qubit) *Q
- func (q *Q) RX(theta float64, qb ...Qubit) *Q
- func (q *Q) RY(theta float64, qb ...Qubit) *Q
- func (q *Q) RZ(theta float64, qb ...Qubit) *Q
- func (q *Q) Reset(qb ...Qubit)
- func (q *Q) S(qb ...Qubit) *Q
- func (q *Q) State(reg ...any) []qubit.State
- func (q *Q) String() string
- func (q *Q) Swap(qb ...Qubit) *Q
- func (q *Q) T(qb ...Qubit) *Q
- func (q *Q) U(theta, phi, lambda float64, qb ...Qubit) *Q
- func (q *Q) Underlying() *qubit.Qubit
- func (q *Q) X(qb ...Qubit) *Q
- func (q *Q) Y(qb ...Qubit) *Q
- func (q *Q) Z(qb ...Qubit) *Q
- func (q *Q) Zero() Qubit
- func (q *Q) ZeroLog2(N int) []Qubit
- func (q *Q) Zeros(n int) []Qubit
- type Qubit
Examples ¶
- Package (Any)
- Package (Bell)
- Package (Bellm)
- Package (DensityMatrix)
- Package (DeutschJozsa)
- Package (Ecc)
- Package (Grover3)
- Package (Grover4)
- Package (Qft001)
- Package (Qft010)
- Package (Shor15)
- Package (SuperDenseCoding)
- Package (Teleportation)
- Package (TeleportationCond)
- Q.Amplitude
- Q.Apply
- Q.C
- Q.CU
- Q.CX
- Q.Clone
- Q.Cond
- Q.CondX
- Q.CondZ
- Q.ControlledH
- Q.ControlledX
- Q.I
- Q.InvQFT
- Q.M
- Q.Measure
- Q.NumQubits (Empty)
- Q.Ones
- Q.Probability
- Q.QFT
- Q.QFT (Ket4)
- Q.R
- Q.RX
- Q.RY
- Q.RZ
- Q.Reset
- Q.S
- Q.String
- Q.T
- Q.U
- Q.Underlying
- Q.X
- Q.Y
- Q.Z
- Q.Zero
- Q.ZeroLog2
- Q.Zeros
- Top
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Top ¶ added in v0.0.10
Top returns the top n states by probability. if n < 0, returns input states.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zeros(3)
qsim.H(q0...)
// top 2 states
for _, s := range q.Top(qsim.State(), 2) {
fmt.Println(s)
}
fmt.Println()
// all states
for _, s := range q.Top(qsim.State(), -1) {
fmt.Println(s)
}
}
Output: [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1]( 0.3536 0.0000i): 0.1250 [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1]( 0.3536 0.0000i): 0.1250 [010][ 2]( 0.3536 0.0000i): 0.1250 [011][ 3]( 0.3536 0.0000i): 0.1250 [100][ 4]( 0.3536 0.0000i): 0.1250 [101][ 5]( 0.3536 0.0000i): 0.1250 [110][ 6]( 0.3536 0.0000i): 0.1250 [111][ 7]( 0.3536 0.0000i): 0.1250
Types ¶
type Q ¶
type Q struct {
Rand func() float64
// contains filtered or unexported fields
}
Q is a quantum computation simulator.
func (*Q) Amplitude ¶
func (q *Q) Amplitude() []complex128
Amplitude returns the amplitude of qubits.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0)
qsim.CNOT(q0, q1)
for _, a := range qsim.Amplitude() {
fmt.Printf("%.4f\n", a)
}
}
Output: (0.7071+0.0000i) (0.0000+0.0000i) (0.0000+0.0000i) (0.7071+0.0000i)
func (*Q) Apply ¶
Apply applies a list of gates to the qubit.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/quantum/gate"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
n := qsim.NumQubits()
h := gate.H()
cnot := gate.CNOT(n, q0.Index(), q1.Index())
qsim.G(h, q0)
qsim.Apply(cnot)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
func (*Q) C ¶
C applies controlled operation with a gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/quantum/gate"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0)
qsim.C(gate.X(), q0, q1) // qsim.CNOT(q0, q1)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
func (*Q) CU ¶ added in v0.0.8
CU applies controlled unitary operation.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
qb0 := qsim.Zero()
qb1 := qsim.Zero()
qsim.H(qb0)
qsim.CU(math.Pi, 0, math.Pi, qb0, qb1)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
func (*Q) CX ¶ added in v0.0.8
CX applies CNOT gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
qb0 := qsim.Zero()
qb1 := qsim.Zero()
qsim.H(qb0)
qsim.CX(qb0, qb1)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
func (*Q) Clone ¶
Clone returns a clone of a quantum computation simulator.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
clone := qsim.Clone()
clone.Zero()
clone.Zero()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.X(q0, q1)
fmt.Println(clone)
fmt.Println(qsim)
fmt.Println(qsim.Clone())
}
Output: [(1+0i) (0+0i) (0+0i) (0+0i)] [(0+0i) (0+0i) (0+0i) (1+0i)] [(0+0i) (0+0i) (0+0i) (1+0i)]
func (*Q) Cond ¶ added in v0.0.3
Cond applies gate if condition is true.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/quantum/gate"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
for _, b := range []bool{false, true} {
qsim.Cond(b, gate.X(), q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
}
Output: [0][ 0]( 1.0000 0.0000i): 1.0000 [1][ 1]( 1.0000 0.0000i): 1.0000
func (*Q) CondX ¶ added in v0.0.3
CondX applies X gate if condition is true.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
for _, b := range []bool{false, true} {
qsim.CondX(b, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
}
Output: [0][ 0]( 1.0000 0.0000i): 1.0000 [1][ 1]( 1.0000 0.0000i): 1.0000
func (*Q) CondZ ¶ added in v0.0.3
CondZ applies Z gate if condition is true.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.One()
for _, b := range []bool{false, true} {
qsim.CondZ(b, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
}
Output: [1][ 1]( 1.0000 0.0000i): 1.0000 [1][ 1](-1.0000 0.0000i): 1.0000
func (*Q) Controlled ¶
Controlled applies controlled operation with a gate.
func (*Q) ControlledH ¶ added in v0.0.8
ControlledH applies controlled-Hadamard gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
qb0 := qsim.Zero()
qb1 := qsim.Zero()
qsim.H(qb0)
qsim.ControlledH([]q.Qubit{qb0}, []q.Qubit{qb1})
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [10][ 2]( 0.5000 0.0000i): 0.2500 [11][ 3]( 0.5000 0.0000i): 0.2500
func (*Q) ControlledNot ¶
ControlledNot applies CNOT gate.
func (*Q) ControlledR ¶
ControlledR applies Controlled-R gate.
func (*Q) ControlledU ¶ added in v0.0.8
ControlledU applies controlled unitary operation.
func (*Q) ControlledX ¶ added in v0.0.8
ControlledX applies CNOT gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
qb0 := qsim.Zero()
qb1 := qsim.Zero()
qsim.H(qb0)
qsim.ControlledX([]q.Qubit{qb0}, []q.Qubit{qb1})
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.7071 0.0000i): 0.5000 [11][ 3]( 0.7071 0.0000i): 0.5000
func (*Q) ControlledZ ¶
ControlledZ applies Controlled-Z gate.
func (*Q) I ¶
I applies I gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.I(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 1.0000 0.0000i): 1.0000
func (*Q) InvQFT ¶
InvQFT applies Inverse Quantum Fourier Transform.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.One()
q2 := qsim.Zero()
qsim.QFT(q0, q1, q2)
qsim.InvQFT(q0, q1, q2)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [010][ 2]( 1.0000 0.0000i): 1.0000
func (*Q) M ¶
M returns the measured state of qubits.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/rand"
)
func main() {
qsim := q.New()
qsim.Rand = rand.Const()
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.Zero()
qsim.X(q0)
fmt.Println(qsim.M(q0))
fmt.Println(qsim.M(q0, q1, q2))
fmt.Println(qsim.M())
}
Output: [(0+0i) (1+0i)] [(0+0i) (0+0i) (0+0i) (0+0i) (1+0i) (0+0i) (0+0i) (0+0i)] [(0+0i) (0+0i) (0+0i) (0+0i) (1+0i) (0+0i) (0+0i) (0+0i)]
func (*Q) Measure ¶
Measure returns the measured state of qubits.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
"github.com/itsubaki/q/math/rand"
)
func main() {
qsim := q.New()
qsim.Rand = rand.Const()
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.Zero()
qsim.X(q0)
fmt.Println(qsim.Measure(q0))
fmt.Println(qsim.Measure(q0, q1, q2))
fmt.Println(qsim.Measure())
}
Output: [(0+0i) (1+0i)] [(0+0i) (0+0i) (0+0i) (0+0i) (1+0i) (0+0i) (0+0i) (0+0i)] [(0+0i) (0+0i) (0+0i) (0+0i) (1+0i) (0+0i) (0+0i) (0+0i)]
func (*Q) NumQubits ¶ added in v0.0.6
NumQubits returns the number of qubits.
Example (Empty) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
fmt.Println(q.New().NumQubits())
}
Output: 0
func (*Q) Ones ¶ added in v0.0.6
Ones returns n qubits in the one state.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
r := qsim.Ones(2)
qsim.H(r...)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.5000 0.0000i): 0.2500 [01][ 1](-0.5000 0.0000i): 0.2500 [10][ 2](-0.5000 0.0000i): 0.2500 [11][ 3]( 0.5000 0.0000i): 0.2500
func (*Q) Probability ¶
Probability returns the probability of qubits.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0)
qsim.CNOT(q0, q1)
for _, p := range qsim.Probability() {
fmt.Printf("%.4f\n", p)
}
}
Output: 0.5000 0.0000 0.0000 0.5000
func (*Q) QFT ¶
QFT applies Quantum Fourier Transform.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
q2 := qsim.One()
qsim.QFT(q0, q1, q2)
qsim.Swap(q0, q2)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1]( 0.2500 0.2500i): 0.1250 [010][ 2]( 0.0000 0.3536i): 0.1250 [011][ 3](-0.2500 0.2500i): 0.1250 [100][ 4](-0.3536 0.0000i): 0.1250 [101][ 5](-0.2500-0.2500i): 0.1250 [110][ 6]( 0.0000-0.3536i): 0.1250 [111][ 7]( 0.2500-0.2500i): 0.1250
Example (Ket4) ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.One()
q1 := qsim.Zero()
q2 := qsim.Zero()
qsim.QFT(q0, q1, q2)
qsim.Swap(q0, q2)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [000][ 0]( 0.3536 0.0000i): 0.1250 [001][ 1](-0.3536 0.0000i): 0.1250 [010][ 2]( 0.3536 0.0000i): 0.1250 [011][ 3](-0.3536 0.0000i): 0.1250 [100][ 4]( 0.3536 0.0000i): 0.1250 [101][ 5](-0.3536 0.0000i): 0.1250 [110][ 6]( 0.3536 0.0000i): 0.1250 [111][ 7](-0.3536 0.0000i): 0.1250
func (*Q) R ¶
R applies R gate with theta.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.R(2*math.Pi/4, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.7071 0.0000i): 0.5000 [1][ 1]( 0.0000 0.7071i): 0.5000
func (*Q) RX ¶
RX applies RX gate with theta.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.RX(math.Pi, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.0000-0.7071i): 0.5000 [1][ 1]( 0.0000-0.7071i): 0.5000
func (*Q) RY ¶
RY applies RY gate with theta.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.RY(math.Pi, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0](-0.7071 0.0000i): 0.5000 [1][ 1]( 0.7071 0.0000i): 0.5000
func (*Q) RZ ¶
RZ applies RZ gate with theta.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.RZ(math.Pi, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.0000-0.7071i): 0.5000 [1][ 1]( 0.0000 0.7071i): 0.5000
func (*Q) Reset ¶
Reset sets qubits to the zero state.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
r := qsim.Zeros(2)
qsim.X(r[0])
qsim.Reset(r...)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 1.0000 0.0000i): 1.0000
func (*Q) S ¶
S applies S gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.S(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.7071 0.0000i): 0.5000 [1][ 1]( 0.0000 0.7071i): 0.5000
func (*Q) String ¶
String returns the string representation of a quantum computation simulator.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.One()
qsim.X(q0, q1)
fmt.Println(qsim)
}
Output: [(0+0i) (0+0i) (1+0i) (0+0i)]
func (*Q) T ¶
T applies T gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.T(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.7071 0.0000i): 0.5000 [1][ 1]( 0.5000 0.5000i): 0.5000
func (*Q) U ¶
U applies U gate.
Example ¶
package main
import (
"fmt"
"math"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.U(math.Pi, 0, math.Pi, q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [1][ 1]( 1.0000 0.0000i): 1.0000
func (*Q) Underlying ¶ added in v0.0.6
Underlying returns the internal qubit.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
qsim.Zero()
for _, s := range qsim.Underlying().State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 1.0000 0.0000i): 1.0000
func (*Q) X ¶
X applies X gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.X(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [1][ 1]( 1.0000 0.0000i): 1.0000
func (*Q) Y ¶
Y applies Y gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.Y(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.0000-0.7071i): 0.5000 [1][ 1]( 0.0000 0.7071i): 0.5000
func (*Q) Z ¶
Z applies Z gate.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
qsim.H(q0)
qsim.Z(q0)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0][ 0]( 0.7071 0.0000i): 0.5000 [1][ 1](-0.7071 0.0000i): 0.5000
func (*Q) Zero ¶
Zero returns a qubit in the zero state.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
q0 := qsim.Zero()
q1 := qsim.Zero()
qsim.H(q0, q1)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.5000 0.0000i): 0.2500 [01][ 1]( 0.5000 0.0000i): 0.2500 [10][ 2]( 0.5000 0.0000i): 0.2500 [11][ 3]( 0.5000 0.0000i): 0.2500
func (*Q) ZeroLog2 ¶
ZeroLog2 returns log2(N)+1 qubits in the zero state.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
r := qsim.ZeroLog2(15)
qsim.H(r...)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [0000][ 0]( 0.2500 0.0000i): 0.0625 [0001][ 1]( 0.2500 0.0000i): 0.0625 [0010][ 2]( 0.2500 0.0000i): 0.0625 [0011][ 3]( 0.2500 0.0000i): 0.0625 [0100][ 4]( 0.2500 0.0000i): 0.0625 [0101][ 5]( 0.2500 0.0000i): 0.0625 [0110][ 6]( 0.2500 0.0000i): 0.0625 [0111][ 7]( 0.2500 0.0000i): 0.0625 [1000][ 8]( 0.2500 0.0000i): 0.0625 [1001][ 9]( 0.2500 0.0000i): 0.0625 [1010][ 10]( 0.2500 0.0000i): 0.0625 [1011][ 11]( 0.2500 0.0000i): 0.0625 [1100][ 12]( 0.2500 0.0000i): 0.0625 [1101][ 13]( 0.2500 0.0000i): 0.0625 [1110][ 14]( 0.2500 0.0000i): 0.0625 [1111][ 15]( 0.2500 0.0000i): 0.0625
func (*Q) Zeros ¶ added in v0.0.6
Zeros returns n qubits in the zero state.
Example ¶
package main
import (
"fmt"
"github.com/itsubaki/q"
)
func main() {
qsim := q.New()
r := qsim.Zeros(2)
qsim.H(r...)
for _, s := range qsim.State() {
fmt.Println(s)
}
}
Output: [00][ 0]( 0.5000 0.0000i): 0.2500 [01][ 1]( 0.5000 0.0000i): 0.2500 [10][ 2]( 0.5000 0.0000i): 0.2500 [11][ 3]( 0.5000 0.0000i): 0.2500