@@ -162,12 +162,14 @@ func (q *Qubit) Apply(g ...*matrix.Matrix) *Qubit {
162162
163163// G applies a gate to the qubit at the given index.
164164func (q * Qubit ) G (g * matrix.Matrix , idx int ) {
165+ g0 , g1 , g2 , g3 := g .Data [0 ], g .Data [1 ], g .Data [2 ], g .Data [3 ]
166+
165167 stride := 1 << (q .NumQubits () - 1 - idx )
166168 for i := 0 ; i < q .Dim (); i += 2 * stride {
167169 for j := range stride {
168170 a , b := q .state .Data [i + j ], q .state .Data [i + j + stride ]
169- q .state .Data [i + j ] = g . At ( 0 , 0 ) * a + g . At ( 0 , 1 ) * b
170- q .state .Data [i + j + stride ] = g . At ( 1 , 0 ) * a + g . At ( 1 , 1 ) * b
171+ q .state .Data [i + j ] = g0 * a + g1 * b
172+ q .state .Data [i + j + stride ] = g2 * a + g3 * b
171173 }
172174 }
173175}
@@ -366,6 +368,7 @@ func (q *Qubit) Controlled(g *matrix.Matrix, control []int, target int) *Qubit {
366368 }
367369 tmask := 1 << (n - 1 - target )
368370
371+ g0 , g1 , g2 , g3 := g .Data [0 ], g .Data [1 ], g .Data [2 ], g .Data [3 ]
369372 for i := range q .Dim () {
370373 if (i & cmask ) != cmask {
371374 continue
@@ -377,8 +380,8 @@ func (q *Qubit) Controlled(g *matrix.Matrix, control []int, target int) *Qubit {
377380 }
378381
379382 a , b := q .state .Data [i ], q .state .Data [j ]
380- q .state .Data [i ] = g . At ( 0 , 0 ) * a + g . At ( 0 , 1 ) * b
381- q .state .Data [j ] = g . At ( 1 , 0 ) * a + g . At ( 1 , 1 ) * b
383+ q .state .Data [i ] = g0 * a + g1 * b
384+ q .state .Data [j ] = g2 * a + g3 * b
382385 }
383386
384387 return q
0 commit comments