quantrs2_symengine_pure/ops/
complex.rs

1//! Complex number operations for symbolic expressions.
2
3use crate::expr::{ExprLang, Expression};
4use egg::RecExpr;
5
6/// Real part of a complex expression
7pub fn re(x: &Expression) -> Expression {
8    let mut expr = x.as_rec_expr().clone();
9    let id = egg::Id::from(expr.as_ref().len() - 1);
10    expr.add(ExprLang::Re([id]));
11    Expression::from_rec_expr(expr)
12}
13
14/// Imaginary part of a complex expression
15pub fn im(x: &Expression) -> Expression {
16    let mut expr = x.as_rec_expr().clone();
17    let id = egg::Id::from(expr.as_ref().len() - 1);
18    expr.add(ExprLang::Im([id]));
19    Expression::from_rec_expr(expr)
20}
21
22/// Complex conjugate
23pub fn conj(x: &Expression) -> Expression {
24    x.conjugate()
25}
26
27/// Create a complex number from real and imaginary parts
28pub fn complex(re: &Expression, im: &Expression) -> Expression {
29    re.clone() + im.clone() * Expression::i()
30}
31
32/// Magnitude (absolute value) of a complex number
33pub fn magnitude(x: &Expression) -> Expression {
34    crate::ops::trig::sqrt(&(re(x).pow(&Expression::int(2)) + im(x).pow(&Expression::int(2))))
35}
36
37/// Phase angle (argument) of a complex number
38pub fn phase(x: &Expression) -> Expression {
39    crate::ops::trig::atan(&(im(x) / re(x)))
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_complex_parts() {
48        let z = Expression::symbol("z");
49        let re_z = re(&z);
50        let im_z = im(&z);
51
52        assert!(!re_z.is_symbol());
53        assert!(!im_z.is_symbol());
54    }
55}