 ## AlgebraicStructureTraits::DivMod

### Definition

AdaptableFunctor computes both integral quotient and remainder of division with remainder. The quotient q and remainder r are computed such that x = q*y + r and |r| < |y| with respect to the proper integer norm of the represented ring. 1 In particular, r is chosen to be 0 if possible. Moreover, we require q to be minimized with respect to the proper integer norm.

Note that the last condition is needed to ensure a unique computation of the pair (q,r). However, an other option is to require minimality for |r|, with the advantage that a mod(x,y) operation would return the unique representative of the residue class of x with respect to y, e.g. mod(2,3) should return -1. But this conflicts with nearly all current implementation of integer types. From there, we decided to stay conform with common implementations and require q to be computed as x/y rounded towards zero.

The following table illustrates the behavior for integers:

  x  y  q  r 3 3 1 0 2 3 0 2 1 3 0 1 0 3 0 0 -1 3 0 -1 -2 3 0 -2 -3 3 -1 0
-
  x  y  q  r 3 -3 -1 0 2 -3 0 2 1 -3 0 1 0 -3 0 0 -1 -3 0 -1 -2 -3 0 -2 -3 -3 1 0

AdaptableFunctor

### Types

 AlgebraicStructureTraits::DivMod::result_type Is void. AlgebraicStructureTraits::DivMod::first_argument_type Is AlgebraicStructureTraits::Type. AlgebraicStructureTraits::DivMod::second_argument_type Is AlgebraicStructureTraits::Type. AlgebraicStructureTraits::DivMod::third_argument_type Is AlgebraicStructureTraits::Type&. AlgebraicStructureTraits::DivMod::fourth_argument_type Is AlgebraicStructureTraits::Type&.

### Operations

result_type
 div_mod ( first_argument_type x , second_argument_type y , third_argument_type q , fourth_argument_type r )
computes the quotient q and remainder r, such that x = q*y + r and r minimal with respect to the Euclidean Norm on Type.

template <class NT1, class NT2>
result_type div_mod ( NT1 x , NT2 y , third_argument_type q , fourth_argument_type r )
This operator is well defined if NT1 and NT2 are ExplicitInteroperable with coercion type AlgebraicStructureTraits::Type.

### Footnotes

 1 For integers this norm is the absolute value. For univariate polynomials this norm is the degree.