Skip to content

Commit

Permalink
Update density matrix
Browse files Browse the repository at this point in the history
  • Loading branch information
itsubaki committed May 4, 2024
1 parent e44575a commit 6cb0dd3
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 174 deletions.
39 changes: 39 additions & 0 deletions quantum/density/flip.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package density

import (
"fmt"
"math"

"github.com/itsubaki/q/math/matrix"
"github.com/itsubaki/q/math/number"
"github.com/itsubaki/q/quantum/gate"
)

// Flip returns the flip channel.
func Flip(p float64, m matrix.Matrix) (matrix.Matrix, matrix.Matrix, error) {
if p < 0 || p > 1 {
return nil, nil, fmt.Errorf("p must be 0 <= p =< 1. p=%v", p)
}

d, _ := m.Dimension()
n := number.Must(number.Log2(d))

e0 := gate.I(n).Mul(complex(math.Sqrt(p), 0))
e1 := m.Mul(complex(math.Sqrt(1-p), 0))
return e0, e1, nil
}

// BitFlip returns the bit flip channel.
func BitFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.X())
}

// PhaseFlip returns the phase flip channel.
func PhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.Z())
}

// BitPhaseFlip returns the bit-phase flip channel.
func BitPhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.Y())
}
85 changes: 85 additions & 0 deletions quantum/density/flip_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package density_test

import (
"fmt"
"testing"

"github.com/itsubaki/q/quantum/density"
)

func TestFlip(t *testing.T) {
cases := []struct {
in float64
hasErr bool
}{
{-1, true},
}

for _, c := range cases {
_, _, err := density.BitPhaseFlip(c.in)
if (err != nil) != c.hasErr {
t.Errorf("err: %v", err)
continue
}
}
}

func ExampleBitFlip() {
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 ExamplePhaseFlip() {
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)]
}

func ExampleBitPhaseFlip() {
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)]
}
38 changes: 2 additions & 36 deletions quantum/density/matrix.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package density

import (
"fmt"
"math"
"strconv"

"github.com/itsubaki/q/math/matrix"
Expand All @@ -17,7 +16,7 @@ type Matrix struct {
}

// New returns a new density matrix.
func New(ensemble []State) (*Matrix, error) {
func New(ensemble []State) *Matrix {
m := &Matrix{matrix.New()}

for _, s := range Normalize(ensemble) {
Expand All @@ -26,10 +25,6 @@ func New(ensemble []State) (*Matrix, error) {
m.m = matrix.Zero(n, n)
}

if len(m.m) != n {
return nil, fmt.Errorf("invalid dimension. m=%d n=%d", len(m.m), n)
}

op := s.Qubit.OuterProduct(s.Qubit).Mul(complex(s.Probability, 0))
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
Expand All @@ -38,7 +33,7 @@ func New(ensemble []State) (*Matrix, error) {
}
}

return m, nil
return m
}

// Raw returns the raw matrix.
Expand Down Expand Up @@ -139,35 +134,6 @@ func (m *Matrix) Depolarizing(p float64) (*Matrix, error) {
return &Matrix{i.Add(r)}, nil
}

// Flip returns the flip channel.
func Flip(p float64, m matrix.Matrix) (matrix.Matrix, matrix.Matrix, error) {
if p < 0 || p > 1 {
return nil, nil, fmt.Errorf("p must be 0 <= p =< 1. p=%v", p)
}

d, _ := m.Dimension()
n := number.Must(number.Log2(d))

e0 := gate.I(n).Mul(complex(math.Sqrt(p), 0))
e1 := m.Mul(complex(math.Sqrt(1-p), 0))
return e0, e1, nil
}

// BitFlip returns the bit flip channel.
func BitFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.X())
}

// PhaseFlip returns the phase flip channel.
func PhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.Z())
}

// BitPhaseFlip returns the bit-phase flip channel.
func BitPhaseFlip(p float64) (matrix.Matrix, matrix.Matrix, error) {
return Flip(p, gate.Y())
}

func take(binary string, index []int) (string, string) {
var out, remain string
for i, v := range binary {
Expand Down
Loading

0 comments on commit 6cb0dd3

Please sign in to comment.