web-dev-qa-db-ja.com

Erlangではどのように剰余や剰余を行いますか?

私はErlangを初めて使用します。どのようにモジュロを実行しますか(残りの除算を取得します)?ほとんどのCライクな言語では%ですが、Erlangでのコメントを示しています。

何人かの人々はレムで答えました、ほとんどの場合それは大丈夫です。しかし、私はこれを再訪します。今、私は負の数を使用する必要があり、remは除算の残りを与えるので、これは負の数のモジュロと同じではありません。

44
Matt

Erlangでは、5 rem 3.2を与え、-5 rem 3.-2を与えます。あなたの質問を理解したら、-5 rem 3.-5 = -2 * 3 + 1.なので、代わりに1を指定してください。

これはあなたが望むことをしますか?

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

アーランモジュロ演算子はremです

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

私はエリキシルで以下を使用しました:

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

これは質問とは別の言語であるため、これに反対票を投じないでください。私たちは皆、ビームを持っているので、夢を生きます。

9
Joe Eifert

このブログ投稿 によると、これはremです。

3
Jon Skeet

上記のY + X rem Yは間違っているようです。(Y + X)rem YまたはY +(X rem Y)は誤った結果をもたらします。例:Y = 3とします。 X = -4の場合、最初の形式は-1を返し、X = -3の場合、2番目の形式は3を返します。いずれも[0; 3 [にありません。

代わりにこれを使用します:

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

受け入れられた答えは間違っています。

remは、最近のCの_%_演算子とまったく同じように動作します。切り捨てられた除算を使用します。

X <0およびY <0の場合、受け入れられた回答は失敗します。 mod(-5,-3)を検討してください:

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

モジュロ演算子の代替実装では、フロア除算とユークリッド除算を使用します。それらの結果は

_flooring division:   -5 mod -3 == -2
euclidean division:  -5 mod -3 == 1
_

そう

_Y + X rem Y
_

x <0およびY <0のモジュロ演算子は再現されません。

そしてremは期待通りに機能します-切り捨てられた除算を使用しています。

1
adam
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
1
zie1ony

Erlangの剰余は負の数では機能しないため、負のパラメーターに対して独自の関数を作成する必要があります。

1
JLarky