Comment faites-vous modulo ou rest à Erlang?

Je suis tout nouveau à Erlang. Comment faites-vous modulo (obtenir le rest d’une division)? C’est% dans la plupart des langages de type C, mais cela désigne un commentaire dans Erlang.

Plusieurs personnes ont répondu avec rem, ce qui, dans la plupart des cas, va bien. Mais je reviens sur ce point car je dois maintenant utiliser des nombres négatifs et rem vous donne le rest d’une division, ce qui n’est pas la même chose que modulo pour les nombres négatifs.

Dans Erlang, 5 rem 3. donne 2 et -5 rem 3. donne -2. Si je comprends votre question, vous voudrez -5 rem 3. donner à la place 1, puisque -5 = -2 * 3 + 1.

Est-ce que ça fait ce que tu veux?

mod(X,Y) when X > 0 -> X rem Y; mod(X,Y) when X < 0 -> Y + X rem Y; mod(0,Y) -> 0. 

L’opérateur erlang modulo est rem

 Eshell V5.6.4 (abort with ^G) 1> 97 rem 10. 7 

J’ai utilisé ce qui suit dans elixir:

 defp mod(x,y) when x > 0, do: rem(x, y); defp mod(x,y) when x < 0, do: rem(x, y) + y; defp mod(0,_y), do: 0 

S'il vous plaît, ne notez pas cela parce que c'est un autre langage que la question. Nous vivons tous le rêve, car nous avons tous le faisceau.

Selon ce blog , c’est rem .

Le Y + X rem Y ci-dessus semble être faux: (Y + X) rem Y ou Y + (X rem Y) donnent des résultats incorrects. Ex: soit Y = 3. Si X = -4, la première forme retourne -1, si X = -3 la deuxième forme retourne 3, dont aucune n’est dans [0; 3 [.

Je l’utilise plutôt:

 % Returns the positive remainder of the division of X by Y, in [0;Y[. % In Erlang, -5 rem 3 is -2, whereas this function will return 1, % since -5 =-2 * 3 + 1. modulo(X,Y) when X > 0 -> X rem Y; modulo(X,Y) when X < 0 -> K = (-X div Y)+1, PositiveX = X + K*Y, PositiveX rem Y; modulo(0,_Y) -> 0. 

Erlang rest ne fonctionne pas avec des nombres négatifs, vous devez donc écrire votre propre fonction pour les parameters négatifs.

 mod(A, B) when A > 0 -> A rem B; mod(A, B) when A < 0 -> mod(A+B, B); mod(0, _) -> 0. % console: 3> my:mod(-13, 5). 2 

La réponse acceptée est fausse.

rem se comporte exactement comme l’opérateur % dans le moderne C. Il utilise la division tronquée.

La réponse acceptée échoue pour X <0 et Y <0. Considérons le mod(-5,-3) :

 C: -5 % -3 == -2 rem: -5 rem -3 == -2 Y + X rem Y: -3 + -5 rem -3 == -5 !! wrong !! 

Les implémentations alternatives pour l’opérateur modulo utilisent la division par étage et la division euclidienne. Les résultats pour ceux-ci sont

 flooring division: -5 mod -3 == -2 euclidean division: -5 mod -3 == 1 

Alors

 Y + X rem Y 

ne reproduit aucun opérateur modulo pour X <0 et Y <0.

Et rem fonctionne comme prévu – il utilise la division tronquée.