# Trait num_traits::ops::euclid::Euclid

``````pub trait Euclid: Sized + Div<Self, Output = Self> + Rem<Self, Output = Self> {
// Required methods
fn div_euclid(&self, v: &Self) -> Self;
fn rem_euclid(&self, v: &Self) -> Self;

// Provided method
fn div_rem_euclid(&self, v: &Self) -> (Self, Self) { ... }
}``````

## Required Methods§

source

#### fn div_euclid(&self, v: &Self) -> Self

Calculates Euclidean division, the matching method for `rem_euclid`.

This computes the integer `n` such that `self = n * v + self.rem_euclid(v)`. In other words, the result is `self / v` rounded to the integer `n` such that `self >= n * v`.

##### §Examples
``````use num_traits::Euclid;

let a: i32 = 7;
let b: i32 = 4;
assert_eq!(Euclid::div_euclid(&a, &b), 1); // 7 > 4 * 1
assert_eq!(Euclid::div_euclid(&-a, &b), -2); // -7 >= 4 * -2
assert_eq!(Euclid::div_euclid(&a, &-b), -1); // 7 >= -4 * -1
assert_eq!(Euclid::div_euclid(&-a, &-b), 2); // -7 >= -4 * 2``````
source

#### fn rem_euclid(&self, v: &Self) -> Self

Calculates the least nonnegative remainder of `self (mod v)`.

In particular, the return value `r` satisfies `0.0 <= r < v.abs()` in most cases. However, due to a floating point round-off error it can result in `r == v.abs()`, violating the mathematical definition, if `self` is much smaller than `v.abs()` in magnitude and `self < 0.0`. This result is not an element of the function’s codomain, but it is the closest floating point number in the real numbers and thus fulfills the property `self == self.div_euclid(v) * v + self.rem_euclid(v)` approximatively.

##### §Examples
``````use num_traits::Euclid;

let a: i32 = 7;
let b: i32 = 4;
assert_eq!(Euclid::rem_euclid(&a, &b), 3);
assert_eq!(Euclid::rem_euclid(&-a, &b), 1);
assert_eq!(Euclid::rem_euclid(&a, &-b), 3);
assert_eq!(Euclid::rem_euclid(&-a, &-b), 1);``````

## Provided Methods§

source

#### fn div_rem_euclid(&self, v: &Self) -> (Self, Self)

Returns both the quotient and remainder from Euclidean division.

By default, it internally calls both `Euclid::div_euclid` and `Euclid::rem_euclid`, but it can be overridden in order to implement some optimization.

##### §Examples
``````let x = 5u8;
let y = 3u8;

let div = Euclid::div_euclid(&x, &y);
let rem = Euclid::rem_euclid(&x, &y);

assert_eq!((div, rem), Euclid::div_rem_euclid(&x, &y));``````

## Object Safety§

This trait is not object safe.

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§

source§