### 2.6.11 The integer Euclidean remainder : `irem remain smod mods mod %`

`irem` (or `remain`) returns the integer remainder *r* from
the Euclidean division of two integers *a* and *b* given as arguments
(*a*=*b***q*+*r* avec 0≤ *r*< *b*).

For Gaussian integers, we choose *q* so that *b***q* is as near by *a* as
possible and it can be proved that *r* may be choosen so that
|*r*|^{2} ≤ |*b*|^{2}/2.

Input :

`irem(148,5) `

Output :

`3`

`irem` works with long integers or with Gaussian integers.

Example :

`irem(factorial(148),factorial(45)+2 )`

Output :

`111615339728229933018338917803008301992120942047239639312`

Another example

`irem(25+12*i,5+7*i) `

Output :

`-4+i`

Here *a*−*b***q*=−4+*i* and |−4+*i*|^{2}=17<|5+7**i*|^{2}/2=74/2=37

`smod` or `mods` is a prefixed
function and has two integers *a* and *b* as arguments.

`smod` or `mods` returns the
symetric remainder *s* of the Euclidean division of the
arguments *a* and *b* (*a*=*b***q*+*s* with −*b*/2<*s* ≤ *b*/2).

Input :

`smod(148,5) `

Output :

`-2`

`mod` (or `%`) is an infixed function
and has two integers *a* and *b*
as arguments.

`mod` (or `%`) returns *r*% *b* of *Z*/*bZ* where *r* is the remainder of
the Euclidean division of the arguments *a* and *b*.

Input :

`148 mod 5 `

or

`148 % 5 `

Output :

`3 % 5`

Note that the answer `3 % 5` is not an integer (3) but
an element of *Z*/5*Z* (see 2.31 to have
the possible operations in *Z*/5*Z*).