q

package module
v0.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 31, 2026 License: MIT Imports: 7 Imported by: 14

README

q

PkgGoDev Go Report Card tests codecov

  • Quantum computation simulator for Go
  • Pure Go implementation using only the standard library

Installation

go get github.com/itsubaki/q

Examples

Bell State
qsim := q.New()

// generate qubits of |0>|0>
q0 := qsim.Zero()
q1 := qsim.Zero()

// apply quantum circuit
qsim.H(q0).CNOT(q0, q1)

for _, s := range qsim.State() {
  fmt.Println(s)
}

// [00][  0]( 0.7071 0.0000i): 0.5000
// [11][  3]( 0.7071 0.0000i): 0.5000

m0 := qsim.Measure(q0)
m1 := qsim.Measure(q1)
fmt.Println(m0.Equal(m1)) // always true

for _, s := range qsim.State() {
  fmt.Println(s)
}

// [00][  0]( 1.0000 0.0000i): 1.0000
// or
// [11][  3]( 1.0000 0.0000i): 1.0000
Quantum Teleportation
qsim := q.New()

// generate qubits of |phi>|0>|0>
phi := qsim.New(1, 2)
q0 := qsim.Zero()
q1 := qsim.Zero()

// |phi> is normalized. |phi> = a|0> + b|1>, |a|^2 = 0.2, |b|^2 = 0.8
for _, s := range qsim.State(phi) {
  fmt.Println(s)
}

// [0][  0]( 0.4472 0.0000i): 0.2000
// [1][  1]( 0.8944 0.0000i): 0.8000

qsim.H(q0).CNOT(q0, q1)
qsim.CNOT(phi, q0).H(phi)

// Alice sends mz, mx to Bob
mz := qsim.Measure(phi)
mx := qsim.Measure(q0)

// Bob Applies X and Z
qsim.CondX(mx.IsOne(), q1)
qsim.CondZ(mz.IsOne(), q1)

// Bob got |phi> state with q1
for _, s := range qsim.State(q1) {
  fmt.Println(s)
}

// [0][  0]( 0.4472 0.0000i): 0.2000
// [1][  1]( 0.8944 0.0000i): 0.8000
Error Correction
qsim := q.New()

q0 := qsim.New(1, 2) // (0.2, 0.8)

// encoding
q1 := qsim.Zero()
q2 := qsim.Zero()
qsim.CNOT(q0, q1).CNOT(q0, q2)

// error: first qubit is flipped
qsim.X(q0)

// 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)

for _, s := range qsim.State(q0) {
  fmt.Println(s)
}

// [0][  0]( 0.4472 0.0000i): 0.2000
// [1][  1]( 0.8944 0.0000i): 0.8000
Grover's Search Algorithm
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)
}

// [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 --> answer!
// [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
Shor's Factoring Algorithm
N := 15
a := 7 // co-prime

for i := range 10 {
  qsim := q.New()

  // 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
  qsim.CNOT(q2, q4)
  qsim.CNOT(q2, q5)

  // Controlled-U^2
  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)

  // measure q0, q1, q2
  m := qsim.Measure(q0, q1, q2).BinaryString()

  // find s/r. 0.010 -> 0.25 -> 1/4, 0.110 -> 0.75 -> 3/4, ...
  s, r, d, ok := number.FindOrder(a, N, fmt.Sprintf("0.%s", m))
  if !ok || number.IsOdd(r) {
    continue
  }

  // 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)
  if number.IsTrivial(N, p0, p1) {
    continue
  }

  // result
  fmt.Printf("i=%d: N=%d, a=%d. p=%v, q=%v. s/r=%d/%d ([0.%v]~%.3f)\n", i, N, a, p0, p1, s, r, m, d)
}

// i=2: N=15, a=7. p=3, q=5. s/r=1/4 ([0.010]~0.250)
Any 1-qubit Quantum Gate and Its Controlled Gate
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)
}

// [00][  0]( 0.7071 0.0000i): 0.5000
// [11][  3]( 0.7071 0.0000i): 0.5000

References

  1. M. A. Nielsen and I. L. Chuang, Quantum Computation and Quantum Information, 10th ed. Cambridge, U.K.: Cambridge University Press, 2010.

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

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Index

func Index(qb ...Qubit) []int

Index returns the index list of qubits.

func Theta added in v0.0.3

func Theta(k int) float64

Theta returns 2 * pi / 2**k

func Top added in v0.0.10

func Top(s []qubit.State, n int) []qubit.State

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 New

func New() *Q

New returns a new 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

func (q *Q) Apply(g ...*matrix.Matrix) *Q

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

func (q *Q) C(g *matrix.Matrix, control, target Qubit) *Q

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) CCCNOT

func (q *Q) CCCNOT(control0, control1, control2, target Qubit) *Q

CCCNOT applies CCCNOT gate.

func (*Q) CCNOT

func (q *Q) CCNOT(control0, control1, target Qubit) *Q

CCNOT applies CCNOT gate.

func (*Q) CCZ

func (q *Q) CCZ(control0, control1, target Qubit) *Q

CCZ applies CCZ gate with two controls.

func (*Q) CNOT

func (q *Q) CNOT(control, target Qubit) *Q

CNOT applies CNOT gate.

func (*Q) CR

func (q *Q) CR(theta float64, control, target Qubit) *Q

CR applies Controlled-R gate.

func (*Q) CU added in v0.0.8

func (q *Q) CU(theta, phi, lambda float64, control, target Qubit) *Q

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

func (q *Q) CX(control, target Qubit) *Q

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) CZ

func (q *Q) CZ(control, target Qubit) *Q

CZ applies Controlled-Z gate.

func (*Q) Clone

func (q *Q) Clone() *Q

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

func (q *Q) Cond(condition bool, g *matrix.Matrix, qb ...Qubit) *Q

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

func (q *Q) CondX(condition bool, qb ...Qubit) *Q

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

func (q *Q) CondZ(condition bool, qb ...Qubit) *Q

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

func (q *Q) Controlled(g *matrix.Matrix, control, target []Qubit) *Q

Controlled applies controlled operation with a gate.

func (*Q) ControlledH added in v0.0.8

func (q *Q) ControlledH(control, target []Qubit) *Q

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

func (q *Q) ControlledNot(control, target []Qubit) *Q

ControlledNot applies CNOT gate.

func (*Q) ControlledR

func (q *Q) ControlledR(theta float64, control, target []Qubit) *Q

ControlledR applies Controlled-R gate.

func (*Q) ControlledU added in v0.0.8

func (q *Q) ControlledU(theta, phi, lambda float64, control, target []Qubit) *Q

ControlledU applies controlled unitary operation.

func (*Q) ControlledX added in v0.0.8

func (q *Q) ControlledX(control, target []Qubit) *Q

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

func (q *Q) ControlledZ(control, target []Qubit) *Q

ControlledZ applies Controlled-Z gate.

func (*Q) G added in v0.0.8

func (q *Q) G(g *matrix.Matrix, qb ...Qubit) *Q

G applies a gate.

func (*Q) H

func (q *Q) H(qb ...Qubit) *Q

H applies H gate.

func (*Q) I

func (q *Q) I(qb ...Qubit) *Q

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

func (q *Q) InvQFT(qb ...Qubit) *Q

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

func (q *Q) M(qb ...Qubit) *qubit.Qubit

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

func (q *Q) Measure(qb ...Qubit) *qubit.Qubit

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) New

func (q *Q) New(v ...complex128) Qubit

New returns a new qubit.

func (*Q) NumQubits added in v0.0.6

func (q *Q) NumQubits() int

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) One

func (q *Q) One() Qubit

One returns a qubit in the one state.

func (*Q) Ones added in v0.0.6

func (q *Q) Ones(n int) []Qubit

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

func (q *Q) Probability() []float64

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

func (q *Q) QFT(qb ...Qubit) *Q

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

func (q *Q) R(theta float64, qb ...Qubit) *Q

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

func (q *Q) RX(theta float64, qb ...Qubit) *Q

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

func (q *Q) RY(theta float64, qb ...Qubit) *Q

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

func (q *Q) RZ(theta float64, qb ...Qubit) *Q

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

func (q *Q) Reset(qb ...Qubit)

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

func (q *Q) S(qb ...Qubit) *Q

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) State

func (q *Q) State(reg ...any) []qubit.State

State returns the state of qubits.

func (*Q) String

func (q *Q) String() 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) Swap

func (q *Q) Swap(qb ...Qubit) *Q

Swap applies Swap gate.

func (*Q) T

func (q *Q) T(qb ...Qubit) *Q

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

func (q *Q) U(theta, phi, lambda float64, qb ...Qubit) *Q

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

func (q *Q) Underlying() *qubit.Qubit

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

func (q *Q) X(qb ...Qubit) *Q

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

func (q *Q) Y(qb ...Qubit) *Q

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

func (q *Q) Z(qb ...Qubit) *Q

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

func (q *Q) Zero() Qubit

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

func (q *Q) ZeroLog2(N int) []Qubit

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

func (q *Q) Zeros(n int) []Qubit

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

type Qubit

type Qubit int

Qubit is a quantum bit.

func (Qubit) Index

func (q Qubit) Index() int

Index returns the index of qubit.

Directories

Path Synopsis
cmd
counting command
grover command
shor command
math
quantum

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL