pub struct RationalFunction { /* private fields */ }Expand description
A rational function represented as numerator / denominator.
Invariants:
- The denominator is never the zero polynomial
- The representation is kept in reduced form (gcd of numerator and denominator is 1)
Implementations§
Source§impl RationalFunction
impl RationalFunction
Sourcepub fn new(numerator: Polynomial, denominator: Polynomial) -> Self
pub fn new(numerator: Polynomial, denominator: Polynomial) -> Self
Create a new rational function from numerator and denominator.
§Arguments
numerator- The numerator polynomialdenominator- The denominator polynomial
§Panics
Panics if the denominator is the zero polynomial.
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
let num = Polynomial::from_coeffs_int(&[(1, &[(0, 1)])]); // x
let den = Polynomial::from_coeffs_int(&[(1, &[(0, 1)]), (1, &[])]); // x + 1
let rf = RationalFunction::new(num, den);Sourcepub fn from_polynomial(p: Polynomial) -> Self
pub fn from_polynomial(p: Polynomial) -> Self
Create a rational function from a polynomial (denominator = 1).
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
let p = Polynomial::from_coeffs_int(&[(1, &[(0, 2)])]); // x^2
let rf = RationalFunction::from_polynomial(p);Sourcepub fn from_constant(c: BigRational) -> Self
pub fn from_constant(c: BigRational) -> Self
Create a rational function from a constant.
§Examples
use num_bigint::BigInt;
use num_rational::BigRational;
use oxiz_math::rational_function::RationalFunction;
let rf = RationalFunction::from_constant(BigRational::from_integer(BigInt::from(5)));Sourcepub fn numerator(&self) -> &Polynomial
pub fn numerator(&self) -> &Polynomial
Get the numerator.
Sourcepub fn denominator(&self) -> &Polynomial
pub fn denominator(&self) -> &Polynomial
Get the denominator.
Sourcepub fn is_constant(&self) -> bool
pub fn is_constant(&self) -> bool
Check if the rational function is constant.
Sourcepub fn eval(
&self,
assignment: &FxHashMap<Var, BigRational>,
) -> Option<BigRational>
pub fn eval( &self, assignment: &FxHashMap<Var, BigRational>, ) -> Option<BigRational>
Evaluate the rational function at a point.
§Arguments
assignment- Variable assignments
§Returns
The value of the rational function, or None if the denominator evaluates to zero.
§Examples
use num_bigint::BigInt;
use num_rational::BigRational;
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
use rustc_hash::FxHashMap;
let num = Polynomial::from_coeffs_int(&[(1, &[(0, 1)])]); // x
let den = Polynomial::from_coeffs_int(&[(1, &[(0, 1)]), (1, &[])]); // x + 1
let rf = RationalFunction::new(num, den);
let mut assignment = FxHashMap::default();
assignment.insert(0, BigRational::from_integer(BigInt::from(2)));
let val = rf.eval(&assignment).unwrap();
assert_eq!(val, BigRational::new(BigInt::from(2), BigInt::from(3))); // 2/3Sourcepub fn derivative(&self, var: Var) -> RationalFunction
pub fn derivative(&self, var: Var) -> RationalFunction
Compute the derivative of the rational function.
Uses the quotient rule: (p/q)’ = (p’q - pq’) / q^2
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
let num = Polynomial::from_coeffs_int(&[(1, &[(0, 1)])]); // x
let den = Polynomial::from_coeffs_int(&[(1, &[(0, 1)]), (1, &[])]); // x + 1
let rf = RationalFunction::new(num, den);
let derivative = rf.derivative(0);Sourcepub fn simplify(&mut self)
pub fn simplify(&mut self)
Simplify the rational function.
This is an alias for reducing to lowest terms.
Sourcepub fn is_proper(&self) -> bool
pub fn is_proper(&self) -> bool
Check if this is a proper rational function (degree of numerator < degree of denominator).
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
let num = Polynomial::from_coeffs_int(&[(1, &[(0, 1)])]); // x
let den = Polynomial::from_coeffs_int(&[(1, &[(0, 2)])]); // x^2
let rf = RationalFunction::new(num, den);
assert!(rf.is_proper());Sourcepub fn polynomial_division(
&self,
_var: Var,
) -> Option<(Polynomial, RationalFunction)>
pub fn polynomial_division( &self, _var: Var, ) -> Option<(Polynomial, RationalFunction)>
Perform polynomial long division to separate improper rational functions.
For an improper rational function N(x)/D(x) where deg(N) >= deg(D), returns (Q(x), R(x)/D(x)) where N(x)/D(x) = Q(x) + R(x)/D(x) and R(x)/D(x) is proper.
§Arguments
var- The variable for univariate division
§Returns
(quotient_polynomial, proper_remainder)if the function is improper and univariateNoneif the function is proper or not univariate
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
// (x^2 + 1) / x = x + 1/x
let num = Polynomial::from_coeffs_int(&[(1, &[(0, 2)]), (1, &[])]);
let den = Polynomial::from_coeffs_int(&[(1, &[(0, 1)])]);
let rf = RationalFunction::new(num, den);
let (quotient, remainder) = rf.polynomial_division(0).unwrap();
// quotient should be x, remainder should be 1/xSourcepub fn partial_fraction_decomposition(
&self,
_var: Var,
) -> Option<Vec<RationalFunction>>
pub fn partial_fraction_decomposition( &self, _var: Var, ) -> Option<Vec<RationalFunction>>
Compute partial fraction decomposition for simple cases.
For a proper rational function with a factored denominator of distinct linear factors, decomposes into a sum of simpler fractions.
Note: This is a simplified implementation that works for:
- Proper rational functions (deg(numerator) < deg(denominator))
- Univariate polynomials
- Denominators that are products of distinct linear factors
For more complex cases (repeated factors, irreducible quadratics), use specialized computer algebra systems.
§Arguments
var- The variable
§Returns
Vector of simpler rational functions that sum to the original, or None if decomposition is not applicable
§Examples
use oxiz_math::polynomial::Polynomial;
use oxiz_math::rational_function::RationalFunction;
// Example: 1 / (x(x-1)) = A/x + B/(x-1)
// where A = -1, B = 1
let num = Polynomial::from_coeffs_int(&[(1, &[])]); // 1
let den = Polynomial::from_coeffs_int(&[ // x^2 - x
(1, &[(0, 2)]), // x^2
(-1, &[(0, 1)]), // -x
]);
let rf = RationalFunction::new(num, den);
// Partial fraction decomposition (if factors are available)
// This is a placeholder - full implementation would require factorizationTrait Implementations§
Source§impl Add for &RationalFunction
impl Add for &RationalFunction
Source§type Output = RationalFunction
type Output = RationalFunction
+ operator.Source§fn add(self, other: &RationalFunction) -> RationalFunction
fn add(self, other: &RationalFunction) -> RationalFunction
+ operation. Read moreSource§impl Add for RationalFunction
impl Add for RationalFunction
Source§fn add(self, other: RationalFunction) -> RationalFunction
fn add(self, other: RationalFunction) -> RationalFunction
Add two rational functions: p/q + r/s = (ps + qr) / (qs)
Source§type Output = RationalFunction
type Output = RationalFunction
+ operator.Source§impl Clone for RationalFunction
impl Clone for RationalFunction
Source§fn clone(&self) -> RationalFunction
fn clone(&self) -> RationalFunction
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RationalFunction
impl Debug for RationalFunction
Source§impl Div for &RationalFunction
impl Div for &RationalFunction
Source§type Output = RationalFunction
type Output = RationalFunction
/ operator.Source§fn div(self, other: &RationalFunction) -> RationalFunction
fn div(self, other: &RationalFunction) -> RationalFunction
/ operation. Read moreSource§impl Div for RationalFunction
impl Div for RationalFunction
Source§fn div(self, other: RationalFunction) -> RationalFunction
fn div(self, other: RationalFunction) -> RationalFunction
Divide two rational functions: (p/q) / (r/s) = (ps) / (qr)
Source§type Output = RationalFunction
type Output = RationalFunction
/ operator.Source§impl Mul for &RationalFunction
impl Mul for &RationalFunction
Source§type Output = RationalFunction
type Output = RationalFunction
* operator.Source§fn mul(self, other: &RationalFunction) -> RationalFunction
fn mul(self, other: &RationalFunction) -> RationalFunction
* operation. Read moreSource§impl Mul for RationalFunction
impl Mul for RationalFunction
Source§fn mul(self, other: RationalFunction) -> RationalFunction
fn mul(self, other: RationalFunction) -> RationalFunction
Multiply two rational functions: (p/q) * (r/s) = (pr) / (qs)
Source§type Output = RationalFunction
type Output = RationalFunction
* operator.Source§impl Neg for &RationalFunction
impl Neg for &RationalFunction
Source§type Output = RationalFunction
type Output = RationalFunction
- operator.Source§fn neg(self) -> RationalFunction
fn neg(self) -> RationalFunction
- operation. Read moreSource§impl Neg for RationalFunction
impl Neg for RationalFunction
Source§fn neg(self) -> RationalFunction
fn neg(self) -> RationalFunction
Negate a rational function: -(p/q) = (-p)/q
Source§type Output = RationalFunction
type Output = RationalFunction
- operator.Source§impl PartialEq for RationalFunction
impl PartialEq for RationalFunction
Source§impl Sub for &RationalFunction
impl Sub for &RationalFunction
Source§type Output = RationalFunction
type Output = RationalFunction
- operator.Source§fn sub(self, other: &RationalFunction) -> RationalFunction
fn sub(self, other: &RationalFunction) -> RationalFunction
- operation. Read moreSource§impl Sub for RationalFunction
impl Sub for RationalFunction
Source§fn sub(self, other: RationalFunction) -> RationalFunction
fn sub(self, other: RationalFunction) -> RationalFunction
Subtract two rational functions: p/q - r/s = (ps - qr) / (qs)
Source§type Output = RationalFunction
type Output = RationalFunction
- operator.