density

package
v1.1.9 Latest Latest
Warning

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

Go to latest
Published: Aug 30, 2022 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func BitFlip

func BitFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
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

func BitPhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
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 Flip

func PhaseFlip

func PhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)
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 New

func New(p []float64, q []*qubit.Qubit) (*Matrix, error)

func (*Matrix) Add

func (m *Matrix) Add(p float64, q *qubit.Qubit) error

func (*Matrix) Apply

func (m *Matrix) Apply(u matrix.Matrix) *Matrix

func (*Matrix) Depolarizing

func (m *Matrix) Depolarizing(p float64) (*Matrix, error)
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) Dimension

func (m *Matrix) Dimension() (int, int)

func (*Matrix) ExpectedValue

func (m *Matrix) ExpectedValue(u matrix.Matrix) float64
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

func (m *Matrix) Measure(q *qubit.Qubit) float64
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 (m *Matrix) NumberOfBit() int

func (*Matrix) PartialTrace

func (m *Matrix) PartialTrace(index ...int) *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(
		[]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) Raw

func (m *Matrix) Raw() matrix.Matrix

func (*Matrix) SquareTrace

func (m *Matrix) SquareTrace() float64
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

func (m *Matrix) Trace() float64
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

Jump to

Keyboard shortcuts

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