density

package
v0.0.2 Latest Latest
Warning

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

Go to latest
Published: Jun 2, 2023 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)

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

func BitPhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)

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 Flip

Flip returns the flip channel.

func PhaseFlip

func PhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error)

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 New

func New(ensemble []State) (*Matrix, error)

New returns a new density matrix.

func (*Matrix) Add

func (m *Matrix) Add(ensemble []State) error

Add adds a quantum state to the density matrix.

func (*Matrix) Apply

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

Apply applies a unitary matrix to the density matrix.

func (*Matrix) Depolarizing

func (m *Matrix) Depolarizing(p float64) (*Matrix, error)

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

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

Dimension returns the dimension of the density matrix.

func (*Matrix) ExpectedValue

func (m *Matrix) ExpectedValue(u matrix.Matrix) float64

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

func (m *Matrix) Measure(q *qubit.Qubit) float64

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

func (m *Matrix) NumberOfBit() int

NumberOfBit returns the number of qubits.

func (*Matrix) PartialTrace

func (m *Matrix) PartialTrace(index ...int) *Matrix

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

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

Raw returns the raw matrix.

func (*Matrix) SquareTrace

func (m *Matrix) SquareTrace() float64

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

func (m *Matrix) Trace() float64

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

type State

type State struct {
	Probability float64
	Qubit       *qubit.Qubit
}

State is a quantum state.

Jump to

Keyboard shortcuts

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