Java中的模块化数学(环绕的数字行)

Java中的模块化数学(环绕的数字行),java,linear-algebra,Java,Linear Algebra,我正在尝试创建一个简单的函数来利用。这本质上是一条环绕的数字线。具体来说,我想在Java中使用Mod 8数字行 我想要的是比较0和7之间的两个数字。我想减去这些数字得到一个差分。但是,我希望它等于1,而不是0-7=-7。这个想法是,当你达到7后,数字线会回到0(因此0和7之间只有一个空格) 是否有符合此标准的软件包?嗯。。。有一个内置的模运算符%,它基本上也存在于现在流行的所有其他语言中。那么((0-7)+8)%8呢?这会解决你的问题 注意:%s是模运算符。听起来您需要使用%modulo运算符。

我正在尝试创建一个简单的函数来利用。这本质上是一条环绕的数字线。具体来说,我想在Java中使用Mod 8数字行

我想要的是比较0和7之间的两个数字。我想减去这些数字得到一个差分。但是,我希望它等于1,而不是0-7=-7。这个想法是,当你达到7后,数字线会回到0(因此0和7之间只有一个空格)


是否有符合此标准的软件包?

嗯。。。有一个内置的模运算符
%
,它基本上也存在于现在流行的所有其他语言中。

那么
((0-7)+8)%8
呢?这会解决你的问题


注意:%s是模运算符。

听起来您需要使用%modulo运算符。也许可以写一组与模数学一起工作的整数函数,例如,模加将是=(a+b)%8

看来您想逆转负数对模的作用。请记住,模数是整数除法后的余数。通常情况下,您的范围如下所示:

-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
int m = x % 8;
m = (m < 0) ? m + 8 : m;
对于同一系列值,您希望它看起来像这样:

1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
如果你想解决一般情况下,你可以有任何负数(这样它将适用于-15,-20,-27以及-7),那么你必须在模数之后调整它,如下所示:

-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
int m = x % 8;
m = (m < 0) ? m + 8 : m;
第一个模数为您提供了从-7到7的预期范围。加法调整负模量,使其为正值,但当然会将正值移到7以上。第二个模数确保所有答案都在0到7之间。这应该适用于任何负数以及任何正数。

这就是您想要的。然而,Java中的
%
运算符(通常称为模)不是数学模。它相当于余数运算符。这种差异是微妙的,而且往往无关紧要。只有当你有消极的参数时,这才重要,就像你的例子一样。我认为这可以解释确切的区别

因为您是“环绕式”的,所以需要模的数学版本,遗憾的是,对于整数,它没有在Java中实现。但是,该类有一个mod()函数,它完全满足您的需要:

BigInteger.valueOf(0-7).mod(BigInteger.valueOf(8)).longValue()

这并不漂亮,但很有效。

对于负数的处理,请检查输入操作数是否在范围(0-7)内,然后使用Faisal指示的+8。负数的处理细节因语言而异。这可以用一些相当简单的数字公式来处理,具体取决于你想要的行为。事实上,负数处理的细节取决于操作符是什么。例如,在java中,%运算符不是mod运算符,而是定义为除法的余数。然而,ie
assert(-5%-2==-1)
Python采用了更为数学化的方法来解释mod真正应该是什么。阅读UH首先,我认为数学家和任何特定的计算机科学家小组都无权定义“模算子”,其次,“算子是什么”显然取决于所使用的语言,所以我没有说错话。但是如果@Spencer想要彻底的分解,那么最好只查阅Wikipedia(),然后不要称之为模数运算符,特别是当问题涉及java时。这是错误的信息。它不应该被称为模运算符,因为这不是它所做的,也不是它在java规范中所称的。这里也有一个不叫mod的详细原因。注意:如果数字不是-7,而是-15呢?我想你接受这个答案的速度太快了。您接受的答案不考虑小于-7的数字。谢谢!我没有注意到,直到我检查了代码