use num_bigint::{BigInt, BigUint};
use num_traits::{One, Pow};
use std::ops::{Div, DivAssign, Mul, MulAssign};
pub trait Denom:
Clone
+ From<u8>
+ From<u16>
+ From<u32>
+ From<u64>
+ From<u128>
+ From<usize>
+ From<BigUint>
+ for<'a> From<&'a BigUint>
+ Into<BigUint>
+ One
+ Pow<u32, Output = Self>
+ Mul<Output = Self>
+ for<'a> Mul<&'a Self, Output = Self>
+ MulAssign
+ for<'a> MulAssign<&'a Self>
+ Div<Output = Self>
+ for<'a> Div<&'a Self, Output = Self>
+ DivAssign
+ for<'a> DivAssign<&'a Self>
+ Mul<BigInt, Output = BigInt>
+ for<'a> Mul<&'a BigInt, Output = BigInt>
{
const ONE: Self;
fn into_biguint(self) -> BigUint;
fn to_biguint(&self) -> BigUint;
fn normalize(lnum: &mut BigInt, rnum: &mut BigInt, ldenom: &Self, rdenom: &Self) -> Self;
fn gcd_reduce(&mut self, num: &mut BigInt);
}
pub trait DenomRef<D: Denom>:
Into<BigUint>
+ Pow<u32, Output = D>
+ Mul<Self, Output = D>
+ Mul<D, Output = D>
+ Div<Self, Output = D>
+ Div<D, Output = D>
+ Mul<BigInt, Output = BigInt>
+ for<'a> Mul<&'a BigInt, Output = BigInt>
{
}