paiza online compiler erlang modulo

online - if erlang



¿Cómo se hace módulo o resto en Erlang? (8)

Soy nuevo para Erlang. ¿Cómo se hace módulo (obtener el resto de una división)? Es% en la mayoría de los lenguajes tipo C, pero eso designa un comentario en Erlang.

Varias personas respondieron con rem, que en la mayoría de los casos está bien. Pero estoy revisando esto porque ahora necesito usar números negativos y rem te da el resto de una división, que no es lo mismo que módulo para números negativos.


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



El operador de erlang modulo es rem

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


En Erlang, 5 rem 3. da 2 y -5 rem 3. da -2. Si entiendo tu pregunta, querrías -5 rem 3. dar 1 en su lugar, ya que -5 = -2 * 3 + 1.

¿Hace esto lo que quieres?

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


Erlang remainder no funciona con números negativos, por lo que debe escribir su propia función para los parámetros negativos.


La respuesta aceptada es incorrecta.

rem comporta exactamente como el operador % en el moderno C. Utiliza la división truncada.

La respuesta aceptada falla para X <0 e Y <0. Considera la mod(-5,-3) :

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

Las implementaciones alternativas para el operador de módulo usan la división de piso y la división euclidiana. Los resultados para esos son

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

Asi que

Y + X rem Y

no reproduce ningún operador de módulo para X <0 e Y <0.

Y rem funciona como se esperaba, está utilizando una división truncada.


El Y + X rem Y de arriba parece estar equivocado: ya sea (Y + X) rem Y o Y + (X rem Y) produce resultados incorrectos. Ej: deja que Y = 3. Si X = -4, la primera forma devuelve -1, si X = -3 la segunda forma devuelve 3, ninguna de las cuales está en [0; 3 [.

Yo uso esto en su lugar:

% 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.


Usé lo siguiente en el 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

Por favor, no rechacen esto porque es otro idioma que la pregunta. Todos vivimos el sueño, porque todos tenemos el rayo.