确定数字是否在模块化算术中的两个数字之间的算法
Algorithm to determine if number is between two numbers in modular arithmetic
我正在尝试编写一个函数来回答这个问题:如果您从 a
开始计数并在 b
停止计数,那么 c
是否在该范围内(又名是c
在 a
和 b
之间)。
通常 a < c && c < b
就足够了,但我在 mod 元算术中:
逆时针递增
绿色:是算法应指示为真的 c 值(其中 c 在 a 和 b 之间)
蓝色:是 c 的值,其中算法应指示错误(其中 c 不在 a 和 b 之间)(恰好与 c 在 b 和 a[= 之间的位置相同) 43=])
简单的 a < c && c < b
在 a
和 b
的范围超过 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 n
、b mod n
和c 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;
我正在尝试编写一个函数来回答这个问题:如果您从 a
开始计数并在 b
停止计数,那么 c
是否在该范围内(又名是c
在 a
和 b
之间)。
通常 a < c && c < b
就足够了,但我在 mod 元算术中:
逆时针递增
绿色:是算法应指示为真的 c 值(其中 c 在 a 和 b 之间)
蓝色:是 c 的值,其中算法应指示错误(其中 c 不在 a 和 b 之间)(恰好与 c 在 b 和 a[= 之间的位置相同) 43=])
简单的 a < c && c < b
在 a
和 b
的范围超过 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 n
、b mod n
和c 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;