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(p float64, q *qubit.Qubit) 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
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BitFlip ¶
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 ¶
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 ¶
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
}
func (*Matrix) Depolarizing ¶
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New([]float64{1.0}, []*qubit.Qubit{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 ¶
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( []float64{0.1, 0.9}, []*qubit.Qubit{ qubit.Zero(), 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 ¶
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { rho, _ := density.New( []float64{0.1, 0.9}, []*qubit.Qubit{ qubit.Zero(), 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 ¶
func (*Matrix) PartialTrace ¶
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( []float64{0.5, 0.5}, []*qubit.Qubit{ qubit.Zero(2).Apply(gate.QFT(2)), 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( []float64{1.0}, []*qubit.Qubit{ 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( []float64{0.5, 0.5}, []*qubit.Qubit{ qubit.Zero(3).Apply(gate.QFT(3)), 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 ¶
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { pure, _ := density.New([]float64{1.0}, []*qubit.Qubit{qubit.Zero()}) mixed, _ := density.New([]float64{0.1, 0.9}, []*qubit.Qubit{qubit.Zero(), 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 ¶
Example ¶
package main import ( "fmt" "github.com/itsubaki/q/quantum/density" "github.com/itsubaki/q/quantum/qubit" ) func main() { pure, _ := density.New([]float64{1.0}, []*qubit.Qubit{qubit.Zero()}) mixed, _ := density.New([]float64{0.1, 0.9}, []*qubit.Qubit{qubit.Zero(), 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.