@@ -16,7 +16,6 @@ use std::f64::consts::FRAC_1_SQRT_2;
1616// Ensure necessary imports are present
1717use ndarray:: Array2 ;
1818
19-
2019use crate :: util:: {
2120 C_M_ONE , C_ONE , C_ZERO , GateArray0Q , GateArray1Q , GateArray2Q , GateArray3Q , GateArray4Q , IM ,
2221 M_IM , c64,
@@ -531,63 +530,55 @@ pub fn xx_plus_yy_gate(theta: f64, beta: f64) -> GateArray2Q {
531530///
532531/// # Returns
533532/// Dense 2^n × 2^n complex unitary matrix as `Array2<Complex64>`
534- pub fn pauli_product_rotation_matrix (
535- angle : f64 ,
536- z : & [ bool ] ,
537- x : & [ bool ] ,
538- ) -> Array2 < Complex64 > {
539533
540- let n = z . len ( ) ;
541- let dim = 1usize << n ;
534+ pub fn pauli_zx_to_dense_matrix ( z : & [ bool ] , x : & [ bool ] ) -> Array2 < Complex64 > {
535+ assert_eq ! ( z . len ( ) , x . len ( ) ) ;
542536
543537 let pauli_i = Array2 :: from_shape_vec (
544538 ( 2 , 2 ) ,
545- vec ! [ c64( 1. , 0. ) , c64( 0. , 0. ) , c64( 0. , 0. ) , c64( 1. , 0. ) ] ,
546- ) . unwrap ( ) ;
539+ vec ! [ c64( 1. , 0. ) , c64( 0. , 0. ) , c64( 0. , 0. ) , c64( 1. , 0. ) ] ,
540+ )
541+ . unwrap ( ) ;
547542 let pauli_x = Array2 :: from_shape_vec (
548543 ( 2 , 2 ) ,
549- vec ! [ c64( 0. , 0. ) , c64( 1. , 0. ) , c64( 1. , 0. ) , c64( 0. , 0. ) ] ,
550- ) . unwrap ( ) ;
544+ vec ! [ c64( 0. , 0. ) , c64( 1. , 0. ) , c64( 1. , 0. ) , c64( 0. , 0. ) ] ,
545+ )
546+ . unwrap ( ) ;
551547 let pauli_y = Array2 :: from_shape_vec (
552548 ( 2 , 2 ) ,
553- vec ! [ c64( 0. , 0. ) , c64( 0. , -1. ) , c64( 0. , 1. ) , c64( 0. , 0. ) ] ,
554- ) . unwrap ( ) ;
549+ vec ! [ c64( 0. , 0. ) , c64( 0. , -1. ) , c64( 0. , 1. ) , c64( 0. , 0. ) ] ,
550+ )
551+ . unwrap ( ) ;
555552 let pauli_z = Array2 :: from_shape_vec (
556553 ( 2 , 2 ) ,
557- vec ! [ c64( 1. , 0. ) , c64( 0. , 0. ) , c64( 0. , 0. ) , c64( -1. , 0. ) ] ,
558- ) . unwrap ( ) ;
559-
560- // Build full tensor product using z/x symplectic representation:
561- // z=false x=false → I
562- // z=false x=true → X
563- // z=true x=true → Y
564- // z=true x=false → Z
565- let first = match ( z[ 0 ] , x[ 0 ] ) {
554+ vec ! [ c64( 1. , 0. ) , c64( 0. , 0. ) , c64( 0. , 0. ) , c64( -1. , 0. ) ] ,
555+ )
556+ . unwrap ( ) ;
557+
558+ let single_pauli = |z_bit : bool , x_bit : bool | match ( z_bit, x_bit) {
566559 ( false , false ) => pauli_i. clone ( ) ,
567- ( false , true ) => pauli_x. clone ( ) ,
568- ( true , true ) => pauli_y. clone ( ) ,
569- ( true , false ) => pauli_z. clone ( ) ,
560+ ( false , true ) => pauli_x. clone ( ) ,
561+ ( true , true ) => pauli_y. clone ( ) ,
562+ ( true , false ) => pauli_z. clone ( ) ,
570563 } ;
571564
572- let full_pauli = ( 1 ..n) . fold ( first, |acc, i| {
573- let single = match ( z[ i] , x[ i] ) {
574- ( false , false ) => pauli_i. clone ( ) ,
575- ( false , true ) => pauli_x. clone ( ) ,
576- ( true , true ) => pauli_y. clone ( ) ,
577- ( true , false ) => pauli_z. clone ( ) ,
578- } ;
579- kron ( & single, & acc)
580- } ) ;
565+ let first = single_pauli ( z[ 0 ] , x[ 0 ] ) ;
581566
582- let cos_val = ( angle / 2.0 ) . cos ( ) ;
583- let sin_val = ( angle / 2.0 ) . sin ( ) ;
567+ ( 1 ..z. len ( ) ) . fold ( first, |acc, i| {
568+ let next = single_pauli ( z[ i] , x[ i] ) ;
569+ kron ( & next, & acc)
570+ } )
571+ }
584572
585- let identity: Array2 < Complex64 > = Array2 :: eye ( dim)
586- . mapv ( |x : f64 | c64 ( x, 0. ) ) ;
573+ pub fn pauli_product_rotation_matrix ( angle : f64 , z : & [ bool ] , x : & [ bool ] ) -> Array2 < Complex64 > {
574+ let pauli_mat = pauli_zx_to_dense_matrix ( z, x) ;
575+ let dim = pauli_mat. shape ( ) [ 0 ] ;
576+ let identity: Array2 < Complex64 > = Array2 :: eye ( dim) . mapv ( |v : f64 | c64 ( v, 0. ) ) ;
587577
588- identity . mapv ( |v| v * c64 ( cos_val , 0. ) )
589- + full_pauli . mapv ( |v| v * c64 ( 0. , -sin_val ) )
578+ let cos_val = ( angle / 2.0 ) . cos ( ) ;
579+ let sin_val = ( angle / 2.0 ) . sin ( ) ;
590580
581+ identity. mapv ( |v| v * c64 ( cos_val, 0. ) ) + pauli_mat. mapv ( |v| v * c64 ( 0. , -sin_val) )
591582}
592583
593584/// Kronecker (tensor) product of two complex matrices.
@@ -607,4 +598,3 @@ fn kron(a: &Array2<Complex64>, b: &Array2<Complex64>) -> Array2<Complex64> {
607598 }
608599 out
609600}
610-
0 commit comments