fn inv(a: &Self::BaseType) -> Result<Self::BaseType, FieldError> {
        let mut b0 = &a[0] * &a[0] + BETA * (&a[1] * (&a[3] + &a[3]) - &a[2] * &a[2]);
        let mut b2 = &a[0] * (&a[2] + &a[2]) - &a[1] * &a[1] + BETA * (&a[3] * &a[3]);
        let c = &b0.square() + BETA * b2.square();
        let c_inv = c.inv()?;
        b0 *= &c_inv;
        b2 *= &c_inv;
        Ok([
            &a[0] * &b0 + BETA * &a[2] * &b2,
            -&a[1] * &b0 - BETA * &a[3] * &b2,
            -&a[0] * &b2 + &a[2] * &b0,
            &a[1] * &b2 - &a[3] * &b0,
        ])
    }
Return te inverse of a fp4 element if exist.
This algorithm is inspired by Risc0 implementation:
<https://github.com/risc0/risc0/blob/4c41c739779ef2759a01ebcf808faf0fbffe8793/risc0/core/src/field/baby_bear.rs#L460>
crates/math/src/field/fields/fft_friendly/quartic_babybear.rs