Comment fonctionne la division Modulus


105

Je ne comprends pas vraiment comment fonctionne la division par module. Je calculais 27 % 16et je me suis retrouvé avec 11et je ne comprends pas pourquoi.

Je n'arrive pas à trouver une explication en termes simples en ligne. Quelqu'un peut-il expliquer à un très haut niveau ce qui se passe ici?

Réponses:


107

Le résultat d'une division modulo est le reste d'une division entière des nombres donnés.

Cela signifie:

27 / 16 = 1, remainder 11
=> 27 mod 16 = 11

Autres exemples:

30 / 3 = 10, remainder 0
=> 30 mod 3 = 0

35 / 3 = 11, remainder 2
=> 35 mod 3 = 2

66
s'il vous plaît, ne le prenez pas mal, mais vos exemples ne clarifient rien pour quelqu'un qui n'a absolument aucune idée de ce qui se passe avec la division modulable. Vous avez omis des étapes très importantes qui expliquent d'où vient ce reste. La réponse de Marcin M. ci-dessous expliquait mieux le processus. Veuillez envisager d'être plus détaillé dans les réponses futures pour ceux d'entre nous qui n'ont peut-être pas du tout une compréhension d'un concept. Merci d'avoir contribué à la communauté! Des gens comme vous
m'aident

Nonobstant Wikipedia, le module et le reste ne sont pas la même chose. Certaines langues ont l'une, d'autres l'autre, certaines les deux et certaines non définies.
Marquis of Lorne

156

La plupart des explications manquent une étape importante, remplissons le vide en utilisant un autre exemple.

Compte tenu de ce qui suit:

Dividend: 16
Divisor: 6

La fonction module ressemble à ceci:

16 % 6 = 4

Déterminons pourquoi c'est.

Tout d'abord, effectuez une division entière , qui est similaire à la division normale, sauf que tout nombre fractionnaire (aka reste) est ignoré:

16 / 6 = 2

Ensuite, multipliez le résultat de la division ci-dessus ( 2) par notre diviseur ( 6):

2 * 6 = 12

Enfin, soustrayez le résultat de la multiplication ci-dessus ( 12) de notre dividende ( 16):

16 - 12 = 4

Le résultat de cette soustraction, 4le reste , est le même résultat de notre module ci-dessus!


1
Comment obtenez-vous 2 sur 16/6 et non 2,6666666667? Devriez-vous toujours ignorer le 0, ...? Pourquoi?
Luc

3
@Luc Comme le mentionnent Leo et ytpillai, nous utilisons la division entière (où la partie fractionnaire du résultat après la division est ignorée). Dans Python 3: 16 // 6 >>> 2et16 / 6 >>> 2.6666666666666665
bryik

30

Peut-être que l'exemple avec une horloge pourrait vous aider à comprendre le modulo.

Une utilisation familière de l'arithmétique modulaire est son utilisation dans l'horloge de 12 heures, dans laquelle la journée est divisée en deux périodes de 12 heures.

Disons que nous avons actuellement cette heure: 15h00
Mais vous pouvez aussi dire qu'il est 15h00

C'est exactement ce que fait modulo:

15 / 12 = 1, remainder 3

Vous trouverez cet exemple mieux expliqué sur wikipedia: Article Wikipedia Modulo


29

La formule simple pour calculer le module est: -

[Dividend-{(Dividend/Divisor)*Divisor}]

Donc, 27% 16: -

27- {(27/16) * 16}

27- {1 * 16}

Réponse = 11

Remarque :

Tous les calculs sont avec des entiers. Dans le cas d'un quotient décimal, la partie après la décimale doit être ignorée / tronquée.

par exemple: 27/16 = 1,6875 doit être pris comme juste 1 dans la formule mentionnée ci-dessus. 0.6875 est ignoré.

Les compilateurs de langages informatiques traitent également un entier avec une partie décimale (en tronquant après la décimale)


Et 3% 7?
eaglei22

Donc ce serait juste 3?
eaglei22

15

L'opérateur de module prend une déclaration de division et renvoie tout ce qui reste de ce calcul, les données "restantes", pour ainsi dire, telles que 13/5 = 2. Ce qui signifie qu'il en reste 3 ou qu'il reste de ce calcul. Pourquoi? parce que 2 * 5 = 10. Ainsi, 13 - 10 = 3.

L'opérateur de module fait tout ce calcul pour vous, 13% 5 = 3.


Je pense que cette réponse l'explique le mieux d'un point de vue conceptuel. D'autres réponses expliquent mathématiquement ce qui est également nécessaire, mais cela m'aide mieux à comprendre comment je pourrais appliquer l'opérateur modulo.
JonnyB

7

la division du module est simplement la suivante: divisez deux nombres et renvoyez le reste seulement

27/16 = 1 avec 11 restants, donc 27% 16 = 11

idem 43/16 = 2 avec 11 restants donc 43% 16 = 11 aussi



5

Je voudrais ajouter encore une chose:

il est facile de calculer modulo lorsque le dividende est supérieur / supérieur au diviseur

dividende = 5 diviseur = 3

5% 3 = 2

3)5(1
  3
-----
  2

mais que faire si le diviseur est plus petit que le dividende

dividende = 3 diviseur = 5

3% 5 = 3 ?? Comment

En effet, puisque 5 ne peut pas diviser 3 directement, modulo sera ce qu'est le dividende


3

J'espère que ces étapes simples vous aideront:

20 % 3 = 2 
  1. 20 / 3 = 6; ne pas inclure le .6667- ignorez-le simplement
  2. 3 * 6 = 18
  3. 20 - 18 = 2, qui est le reste du modulo

Pourriez-vous formater cette réponse un peu mieux?
Code Maverick

Vérifiez la réponse de Code Jammer.
Ajmal Salim

2

Plus facile lorsque votre nombre après la virgule (0.xxx) est court. Ensuite, tout ce que vous avez à faire est de multiplier ce nombre par le nombre après la division.

Ex: 32 % 12 = 8

Vous faites 32/12=2.666666667 ensuite vous jetez le 2loin, et vous vous concentrez sur le 0.666666667 0.666666667*12=8<- C'est votre réponse.

(encore une fois, seulement facile lorsque le nombre après la virgule est court)


1

La division du module vous donne le reste d'une division, plutôt que le quotient.


1

Disons que vous avez 17 mod 6.

quel total de 6 vous rapproche le plus de 17, ce sera 12 car si vous dépassez 12 vous aurez 18 ce qui est plus que la question de 17 mod 6. Vous prendrez alors 12 et moins de 17 ce qui vous donnera votre réponse, dans ce cas 5.

17 mod 6 = 5


1

La division du module est assez simple. Il utilise le reste au lieu du quotient.

    1.0833... <-- Quotient
   __
12|13
   12
    1 <-- Remainder
    1.00 <-- Remainder can be used to find decimal values
     .96
     .040
     .036
     .0040 <-- remainder of 4 starts repeating here, so the quotient is 1.083333...

13/12 = 1R1, ergo 13% 12 = 1.


Il est utile de considérer le module comme un «cycle».

En d'autres termes, pour l'expression n % 12, le résultat sera toujours <12.

Cela signifie que la séquence de l'ensemble 0..100pour n % 12est:

{0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,10,11,0,[...],4}

Dans cette optique, le module, ainsi que ses utilisations, devient beaucoup plus clair.


1

La seule chose importante à comprendre est que le module (désigné ici par% comme en C) est défini par la division euclidienne .

Pour deux (d, q)nombres entiers, ce qui suit est toujours vrai :

d = ( d / q ) * q + ( d % q )

Comme vous pouvez le voir, la valeur de d%q dépend de la valeur de d/q . Généralement, pour les entiers positifs d/qest tronqué vers zéro , par exemple 5/2 donne 2, d'où:

5 = (5/2)*2 + (5%2) => 5 = 2*2 + (5%2) => 5%2 = 1

Cependant, pour les entiers négatifs, la situation est moins claire et dépend de la langue et / ou de la norme. Par exemple, -5/2 peut renvoyer -2 (tronqué vers zéro comme auparavant) mais peut également renvoyer -3 (avec une autre langue).

Dans le premier cas:

-5 = (-5/2)*2 + (-5%2) => -5 = -2*2 + (-5%2) => -5%2 = -1

mais dans le second:

-5 = (-5/2)*2 + (-5%2) => -5 = -3*2 + (-5%2) => -5%2 = +1

Comme dit précédemment, souvenez-vous simplement de l' invariant , qui est la division euclidienne .

Plus de détails:


1
Étonnamment utile en ce qui concerne la pagination.
Bob Jordan

1

27% 16 = 11

Vous pouvez l'interpréter de cette façon:

16 va 1 fois sur 27 avant de passer.

16 * 2 = 32.

On pourrait donc dire que 16 va une fois sur 27 avec un reste de 11.

En réalité,

16 + 11 = 27

Un autre exemple:

20% 3 = 2

Eh bien 3 va 6 fois en 20 avant de le passer.

3 * 6 = 18

Pour additionner à 20, nous avons besoin de 2 donc le reste de l'expression du module est 2.


0

C'est simple, l'opérateur de module (%) renvoie le reste après la division entière. Prenons l'exemple de votre question. Comment 27% 16 = 11? Lorsque vous divisez simplement 27 par 16, c'est-à-dire (27/16), le reste est égal à 11, et c'est pourquoi votre réponse est 11.


0

Écrivez un tableau commençant par 0.

{0,1,2,3,4}

Continuez le tableau en lignes.

{0,1,2,3,4}
{5,6,7,8,9}
{10,11,12,13,14}

Tout dans la colonne 1 est un multiple de 5. Tout dans la colonne 2 est un multiple de 5 avec 1 comme reste. Maintenant la partie abstraite: vous pouvez écrire cela (1) comme 1/5 ou comme un développement décimal. L'opérateur module ne renvoie que la colonne, ou dans une autre façon de penser, il renvoie le reste sur une division longue. Vous avez affaire à modulo (5). Module différent, table différente. Pensez à une table de hachage.


0

Lorsque nous divisons deux entiers, nous aurons une équation qui ressemble à ce qui suit:

A / B = Q reste R

A est le dividende; B est le diviseur; Q est le quotient et R est le reste

Parfois, nous nous intéressons uniquement à ce qu'est le reste lorsque nous divisons A par B. Pour ces cas, il existe un opérateur appelé opérateur modulo (abrégé en mod).

Exemples

16/5= 3 Remainder 1  i.e  16 Mod 5 is 1.
0/5= 0 Remainder 0 i.e 0 Mod 5 is 0.
-14/5= 3 Remainder 1 i.e. -14 Mod 5 is 1.

Voir l' article de Khan Academy pour plus d'informations.

En informatique, la table de hachage utilise l'opérateur Mod pour stocker l'élément où A sera les valeurs après le hachage, B sera la taille de la table et R est le nombre d'emplacements ou de clé où l'élément est inséré.

Voir Comment fonctionne une table de hachage pour plus d'informations


-1

C'était la meilleure approche pour moi pour comprendre l'opérateur de module. Je vais simplement vous expliquer à travers des exemples.

16 % 3

Lorsque vous divisez ces deux nombres, le reste est le résultat. C'est comme ça que je fais.

16 % 3 = 3 + 3 = 6; 6 + 3 = 9; 9 + 3 = 12; 12 + 3 = 15

Donc, ce qui reste à 16 est 1

16 % 3 = 1

Voici un autre exemple: 16 % 7 = 7 + 7 = 14que reste-t-il à 16? Est2 16 % 7 = 2

Un plus: 24 % 6 = 6 + 6 = 12; 12 + 6 = 18; 18 + 6 = 24 . Donc le reste est zéro,24 % 6 = 0

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.