Documentation
¶
Index ¶
- func BitFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
- func BitPhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
- func Flip(p float64, m matrix.Matrix) (matrix.Matrix, matrix.Matrix, error)
- func PhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
- type Matrix
- func (m *Matrix) Add(ensemble []State) error
- func (m *Matrix) Apply(u matrix.Matrix) *Matrix
- func (m *Matrix) Depolarizing(p float64) (*Matrix, error)
- func (m *Matrix) Dimension() (int, int)
- func (m *Matrix) ExpectedValue(u matrix.Matrix) float64
- func (m *Matrix) Measure(q *qubit.Qubit) float64
- func (m *Matrix) NumberOfBit() int
- func (m *Matrix) PartialTrace(index ...int) *Matrix
- func (m *Matrix) Raw() matrix.Matrix
- func (m *Matrix) SquareTrace() float64
- func (m *Matrix) Trace() float64
- type State
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BitFlip ¶
BitFlip returns the bit flip channel.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" ) func main() { m0, m1, _ := density.BitFlip(0.5) for _, r := range m0 { fmt.Println(r) } fmt.Println() for _, r := range m1 { fmt.Println(r) } }
Output: [(0.7071067811865476+0i) (0+0i)] [(0+0i) (0.7071067811865476+0i)] [(0+0i) (0.7071067811865476+0i)] [(0.7071067811865476+0i) (0+0i)]
func BitPhaseFlip ¶
BitPhaseFlip returns the bit-phase flip channel.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" ) func main() { m0, m1, _ := density.BitPhaseFlip(0.5) for _, r := range m0 { fmt.Println(r) } fmt.Println() for _, r := range m1 { fmt.Println(r) } }
Output: [(0.7071067811865476+0i) (0+0i)] [(0+0i) (0.7071067811865476+0i)] [(0+0i) (0-0.7071067811865476i)] [(0+0.7071067811865476i) (0+0i)]
func PhaseFlip ¶
PhaseFlip returns the phase flip channel.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" ) func main() { m0, m1, _ := density.PhaseFlip(0.5) for _, r := range m0 { fmt.Println(r) } fmt.Println() for _, r := range m1 { fmt.Println(r) } }
Output: [(0.7071067811865476+0i) (0+0i)] [(0+0i) (0.7071067811865476+0i)] [(0.7071067811865476+0i) (0+0i)] [(0+0i) (-0.7071067811865476+0i)]
Types ¶
type Matrix ¶
type Matrix struct {
// contains filtered or unexported fields
}
Matrix is a density matrix.
func (*Matrix) Depolarizing ¶
Depolarizing returns the depolarizing channel.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{{1.0, qubit.Zero()}}) fmt.Printf("0: %.2f\n", rho.Measure(qubit.Zero())) fmt.Printf("1: %.2f\n", rho.Measure(qubit.One())) fmt.Println() dep, _ := rho.Depolarizing(1) fmt.Printf("0: %.2f\n", dep.Measure(qubit.Zero())) fmt.Printf("1: %.2f\n", dep.Measure(qubit.One())) }
Output: 0: 1.00 1: 0.00 0: 0.50 1: 0.50
func (*Matrix) ExpectedValue ¶
ExpectationValue returns the expectation value of the given operator.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/gate" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{ {0.1, qubit.Zero()}, {0.9, qubit.Zero().Apply(gate.H())}, }) fmt.Printf("X: %.2v\n", rho.ExpectedValue(gate.X())) fmt.Printf("Y: %.2v\n", rho.ExpectedValue(gate.Y())) fmt.Printf("Z: %.2v\n", rho.ExpectedValue(gate.Z())) }
Output: X: 0.9 Y: 0 Z: 0.1
func (*Matrix) Measure ¶
Measure returns the probability of measuring the qubit in the given state.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{ {0.1, qubit.Zero()}, {0.9, qubit.One()}, }) fmt.Printf("0: %.2v\n", rho.Measure(qubit.Zero())) fmt.Printf("1: %.2v\n", rho.Measure(qubit.One())) }
Output: 0: 0.1 1: 0.9
func (*Matrix) NumberOfBit ¶
NumberOfBit returns the number of qubits.
func (*Matrix) PartialTrace ¶
PartialTrace returns the partial trace of the density matrix.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/gate" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{ {0.5, qubit.Zero(2).Apply(gate.QFT(2))}, {0.5, qubit.One(2).Apply(gate.QFT(2))}, }) for _, r := range rho.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", rho.Trace(), rho.SquareTrace()) p0 := rho.PartialTrace(0) for _, r := range p0.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", p0.Trace(), p0.SquareTrace()) p1 := rho.PartialTrace(1) for _, r := range p1.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", p1.Trace(), p1.SquareTrace()) }
Output: [(0.2500+0.0000i) (0.0000+0.0000i) (0.1250+0.1250i) (0.1250-0.1250i)] [(0.0000+0.0000i) (0.2500+0.0000i) (0.1250-0.1250i) (0.1250+0.1250i)] [(0.1250-0.1250i) (0.1250+0.1250i) (0.2500+0.0000i) (0.0000+0.0000i)] [(0.1250+0.1250i) (0.1250-0.1250i) (0.0000+0.0000i) (0.2500+0.0000i)] trace: 1, square_trace: 0.5 [(0.5000+0.0000i) (0.0000+0.0000i)] [(0.0000+0.0000i) (0.5000+0.0000i)] trace: 1, square_trace: 0.5 [(0.5000+0.0000i) (0.2500+0.2500i)] [(0.2500-0.2500i) (0.5000+0.0000i)] trace: 1, square_trace: 0.75
Example (X16) ¶
package main import ( "fmt" "github.com/itsubaki/q/math/matrix" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/gate" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{ {1.0, qubit.Zero(4).Apply(matrix.TensorProduct(gate.H(2), gate.X(), gate.Z()).Apply(gate.CNOT(4, 1, 3)).Apply(gate.CNOT(4, 0, 2)))}, }) p01 := rho.PartialTrace(0, 1) fmt.Printf("trace: %.2f\n", p01.Trace()) fmt.Printf("square_trace: %.2f\n", p01.SquareTrace()) }
Output: trace: 1.00 square_trace: 0.25
Example (X8) ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/gate" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]density.State{ {0.5, qubit.Zero(3).Apply(gate.QFT(3))}, {0.5, qubit.One(3).Apply(gate.QFT(3))}, }) for _, r := range rho.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", rho.Trace(), rho.SquareTrace()) p0 := rho.PartialTrace(0) for _, r := range p0.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", p0.Trace(), p0.SquareTrace()) p1 := rho.PartialTrace(1) for _, r := range p1.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", p1.Trace(), p1.SquareTrace()) p2 := rho.PartialTrace(2) for _, r := range p2.Raw() { fmt.Printf("%.4f\n", r) } fmt.Printf("trace: %.2v, square_trace: %.2v\n\n", p2.Trace(), p2.SquareTrace()) }
Output: [(0.1250+0.0000i) (0.0000+0.0000i) (0.0625+0.0625i) (0.0625-0.0625i) (0.1067+0.0442i) (0.0183-0.0442i) (0.0183+0.0442i) (0.1067-0.0442i)] [(0.0000+0.0000i) (0.1250+0.0000i) (0.0625-0.0625i) (0.0625+0.0625i) (0.0183-0.0442i) (0.1067+0.0442i) (0.1067-0.0442i) (0.0183+0.0442i)] [(0.0625-0.0625i) (0.0625+0.0625i) (0.1250+0.0000i) (0.0000+0.0000i) (0.1067-0.0442i) (0.0183+0.0442i) (0.1067+0.0442i) (0.0183-0.0442i)] [(0.0625+0.0625i) (0.0625-0.0625i) (0.0000+0.0000i) (0.1250+0.0000i) (0.0183+0.0442i) (0.1067-0.0442i) (0.0183-0.0442i) (0.1067+0.0442i)] [(0.1067-0.0442i) (0.0183+0.0442i) (0.1067+0.0442i) (0.0183-0.0442i) (0.1250+0.0000i) (0.0000+0.0000i) (0.0625+0.0625i) (0.0625-0.0625i)] [(0.0183+0.0442i) (0.1067-0.0442i) (0.0183-0.0442i) (0.1067+0.0442i) (0.0000+0.0000i) (0.1250+0.0000i) (0.0625-0.0625i) (0.0625+0.0625i)] [(0.0183-0.0442i) (0.1067+0.0442i) (0.1067-0.0442i) (0.0183+0.0442i) (0.0625-0.0625i) (0.0625+0.0625i) (0.1250+0.0000i) (0.0000+0.0000i)] [(0.1067+0.0442i) (0.0183-0.0442i) (0.0183+0.0442i) (0.1067-0.0442i) (0.0625+0.0625i) (0.0625-0.0625i) (0.0000+0.0000i) (0.1250+0.0000i)] trace: 1, square_trace: 0.5 [(0.2500+0.0000i) (0.0000+0.0000i) (0.1250+0.1250i) (0.1250-0.1250i)] [(0.0000+0.0000i) (0.2500+0.0000i) (0.1250-0.1250i) (0.1250+0.1250i)] [(0.1250-0.1250i) (0.1250+0.1250i) (0.2500+0.0000i) (0.0000+0.0000i)] [(0.1250+0.1250i) (0.1250-0.1250i) (0.0000+0.0000i) (0.2500+0.0000i)] trace: 1, square_trace: 0.5 [(0.2500+0.0000i) (0.0000+0.0000i) (0.2134+0.0884i) (0.0366-0.0884i)] [(0.0000+0.0000i) (0.2500+0.0000i) (0.0366-0.0884i) (0.2134+0.0884i)] [(0.2134-0.0884i) (0.0366+0.0884i) (0.2500+0.0000i) (0.0000+0.0000i)] [(0.0366+0.0884i) (0.2134-0.0884i) (0.0000+0.0000i) (0.2500+0.0000i)] trace: 1, square_trace: 0.5 [(0.2500+0.0000i) (0.1250+0.1250i) (0.2134+0.0884i) (0.0366+0.0884i)] [(0.1250-0.1250i) (0.2500+0.0000i) (0.2134-0.0884i) (0.2134+0.0884i)] [(0.2134-0.0884i) (0.2134+0.0884i) (0.2500+0.0000i) (0.1250+0.1250i)] [(0.0366-0.0884i) (0.2134-0.0884i) (0.1250-0.1250i) (0.2500+0.0000i)] trace: 1, square_trace: 0.71
func (*Matrix) SquareTrace ¶
SquareTrace returns the square trace of the density matrix.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { pure, _ := density.New([]density.State{{1.0, qubit.Zero()}}) mixed, _ := density.New([]density.State{{0.1, qubit.Zero()}, {0.9, qubit.One()}}) fmt.Printf("pure: %.2f\n", pure.SquareTrace()) fmt.Printf("mixed: %.2f\n", mixed.SquareTrace()) }
Output: pure: 1.00 mixed: 0.82
func (*Matrix) Trace ¶
Trace returns the trace of the density matrix.
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { pure, _ := density.New([]density.State{{1.0, qubit.Zero()}}) mixed, _ := density.New([]density.State{{0.1, qubit.Zero()}, {0.9, qubit.One()}}) fmt.Printf("pure: %.2f\n", pure.Trace()) fmt.Printf("mixed: %.2f\n", mixed.Trace()) }
Output: pure: 1.00 mixed: 1.00
Click to show internal directories.
Click to hide internal directories.