确定数字是否在模块化算术中的两个数字之间的算法

Algorithm to determine if number is between two numbers in modular arithmetic

我正在尝试编写一个函数来回答这个问题:如果您从 a 开始计数并在 b 停止计数,那么 c 是否在该范围内(又名是cab 之间)。

通常 a < c && c < b 就足够了,但我在 mod 元算术中:

逆时针递增

绿色:是算法应指示为真的 c 值(其中 c 在 a 和 b 之间)

蓝色:是 c 的值,其中算法应指示错误(其中 c 不在 a 和 b 之间)(恰好与 c 在 b 和 a[= 之间的位置相同) 43=])

简单的 a < c && c < bab 的范围超过 0 时失败。

例如,假设 A = 300 和 B = 45。如果 C 为 10,则函数应该 return 为真:300, 301, 302 ... 359, 0, 1, 2, 3 ... 8, 9, 10, 11, 12 ... 43, 44, 45。因此,10在mod360中的300和45之间。

最终,我要确定的是一种色调是否介于其他两种色调之间,其中色调以围绕色轮(即 mod 360 系统)的度数指定。如果答案是 mod n 的话那就太好了,这样它就可以解决一般情况,而不是针对我的问题。

如果满足以下三个条件其中一个,则数字将介于给定的两个数字之间。

条件一:

c mod n > a mod n && c mod n < b mod n

条件二:

a mod n > b mod n && c mod n < b mod n.

条件三:

a mod n > b mod n && c mod n > a mod n.

首先计算a mod nb mod nc mod n

如果 a < b 那么我们需要检查 a < c && c < b。这是一个简单的例子,其中模运算没有发挥很大的作用。

因为 [a, b] 和 [b, a] 形成不相交的区域,而不是试图处理过 0 的问题,我们可以对 b < a 的情况进行反向测试。如果 b < c && c < a 为真,则 c 实际上在 b 和 a 之间,因此不在 a 和 b 之间。

代码示例:

a = a % n;  // % = mod
b = b % n;
c = c % n;

if (a < b) {
    if (a < c && c < b) return true;
    else return false;
} else { // b < a
    if (b < c && c < a) return false;   // if in [b, a] then not in [a, b]
    else return true;
}
bool between = C<A ^ C<B ^ B<A;