use crate::rational_polynomial::{RationalPolynomial, SerdeRationalPolynomial, content};
use alloc::string::{String, ToString};
use malachite_base::num::arithmetic::traits::CoprimeWith;
use malachite_base::num::basic::traits::Zero;
use malachite_nz::integer_polynomial::IntegerPolynomial;
impl From<RationalPolynomial> for SerdeRationalPolynomial {
#[inline]
fn from(p: RationalPolynomial) -> Self {
Self {
numerator: p.numerator,
denominator: p.denominator,
}
}
}
impl TryFrom<SerdeRationalPolynomial> for RationalPolynomial {
type Error = String;
fn try_from(p: SerdeRationalPolynomial) -> Result<Self, String> {
if p.denominator == 0u32 {
return Err("Denominator is zero".to_string());
}
if p.numerator == IntegerPolynomial::ZERO {
return if p.denominator == 1u32 {
Ok(Self::ZERO)
} else {
Err("Zero polynomial's denominator is not 1".to_string())
};
}
if !content(&p.numerator).coprime_with(&p.denominator) {
return Err("Numerator and denominator are not relatively prime".to_string());
}
Ok(Self {
numerator: p.numerator,
denominator: p.denominator,
})
}
}