<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Scilab ( https://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) 2008 - INRIA
 * Copyright (C) 2013, 2018 - Samuel GOUGEON
 *
 * Copyright (C) 2012 - 2016 - Scilab Enterprises
 *
 * This file is hereby licensed under the terms of the GNU GPL v2.0,
 * pursuant to article 5.3.4 of the CeCILL v.2.1.
 * This file was originally licensed under the terms of the CeCILL v2.1,
 * and continues to be available under such terms.
 * For more information, see the COPYING file which you should have received
 * along with this program.
 *
 -->
<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
        xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml"
        xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
        xmlns:scilab="http://www.scilab.org" xml:id="modulo" xml:lang="fr">
    <refnamediv>
        <refname>modulo</refname>
        <refpurpose>reste modulo m ayant le signe du dividende, ou de division polynomiale</refpurpose>
    </refnamediv>
    <refnamediv xml:id="pmodulo">
        <refname>pmodulo</refname>
        <refpurpose>reste modulo m euclidien positif</refpurpose>
    </refnamediv>
    <refsynopsisdiv>
        <title>Séquence d'appel</title>
        <synopsis>i = modulo(n,m)</synopsis>
        <para></para>
        <synopsis>i = pmodulo(n,m)</synopsis>
    </refsynopsisdiv>
    <refsection>
        <title>Paramètres</title>
        <variablelist>
            <varlistentry>
                <term>m, n</term>
                <listitem>
                    <para>
                        Scalaire, vecteur, matrice ou hypermatrice d'entiers encodés, de décimaux
                        réels ou de polynômes à coefficients réels.
                        <varname>m</varname> et <varname>n</varname> doivent être du même type.
                        Si elles sont de types entiers, elles peuvent être d'encodages distincts
                        (par exemple int8 et int16). Si aucune des deux n'est scalaire, elles
                        doivent avoir les mêmes tailles.
                    </para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>i</term>
                <listitem>
                    <para>
                        Scalaire, vecteur, matrice ou hypermatrice du type de <varname>n</varname>
                        (voire de même inttype).
                        <varname>i</varname> a les tailles de la plus large de
                        <varname>m</varname> ou <varname>n</varname>.
                    </para>
                    <para>
                        <warning>
                            Pour des polynômes en entrée, lorsque tous les restes dans <varname>i</varname>
                            sont des polynômes constants (degré==0), <varname>i</varname> est de
                            de type 1 (nombres) au lieu de 2 (polynômes constants).
                        </warning>
                    </para>
                </listitem>
            </varlistentry>
        </variablelist>
    </refsection>
    <refsection>
        <title>Description</title>
        <para>
            <literal>modulo</literal> calcule <literal>i = n (modulo m)</literal>
            c'est à dire le reste de <literal>n</literal> divisé par
            <literal>m</literal>.
        </para>
        <para>
            Pour <varname>m</varname> et <varname>n</varname> numériques,
            <itemizedlist>
                <listitem>
                    <para>
                        <literal>modulo()</literal> calcule <literal>i = n - m .* int (n ./ m)</literal>.
                        Le résultat est négatif (ou nul) lorsque <varname>n</varname> est négatif.
                        Il est positif sinon.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <literal>pmodulo()</literal> calcule <literal>i = n - |m| .* floor (n ./ |m|)</literal>.
                        Le résultat est toujours positif ou nul.
                    </para>
                </listitem>
            </itemizedlist>
        </para>
        <para>
            <warning>
                Si <literal>m</literal> contient au moins une valeur nulle,
                <literal>modulo(x,m)</literal> et <literal>pmodulo(x,m)</literal> effectueront une
                division par zéro. Si <varname>m</varname> est de type réel, l'exception sera
                traitée selon le mode <literal>ieee()</literal> actif. Si <literal>m</literal>
                est de type entier, une erreur sera toujours émise.
            </warning>
        </para>
    </refsection>
    <refsection>
        <title>Exemples</title>
        <programlisting role="example"><![CDATA[
n = [1,2,10,15];
m = [2,2,3,5];
modulo(n,m)

modulo(-3, 9)
modulo(10, -4)

pmodulo(-3, 9)
pmodulo(10, -6)
pmodulo(-10, -6)

// Entiers encodés
modulo( int8(-13), int16(-7))
pmodulo(int8(-13), int16(-7))
modulo( int8(-13), int16([-7 5]))
pmodulo(int8(-13), int16([-7 5]))
modulo( int8([-13 8]), int16(-7))
pmodulo(int8([-13 8]), int16(-7))
modulo( int8([-13 8]), int16([-7 5]))
pmodulo(int8([-13 8]), int16([-7 5]))

// Hypermatrices
m = grand(2,2,2,"uin",-100,100)
n = grand(2,2,2,"uin",-10 ,10);
n(n==0) = 1
modulo(m, 5)
pmodulo(m,5)
modulo(51, n)
pmodulo(51,n)
modulo(m, n)
pmodulo(m,n)

// Polynômes
modulo( %z^2+1, %z)
pmodulo(%z^2+1, %z)
 ]]></programlisting>
    </refsection>
    <refsection role= "see also">
        <title>Voir aussi</title>
        <simplelist type="inline">
            <member>
                <link linkend="unwrap">unwrap</link>
            </member>
            <member>
                <link linkend="ieee">ieee</link>
            </member>
        </simplelist>
    </refsection>
    <refsection>
        <title>Historique</title>
        <revhistory>
            <revision>
                <revnumber>5.5.0</revnumber>
                <revremark>
                    Extension aux entiers encodés et aux hypermatrices d'entiers ou de réels.
                </revremark>
            </revision>
            <revision>
                <revnumber>6.0.2</revnumber>
                <revremark>Extension aux hypermatrices de polynômes.</revremark>
            </revision>
        </revhistory>
    </refsection>
</refentry>
