【问题标题】:how to calculate reverse modulus如何计算反向模量
【发布时间】:2012-09-01 04:19:43
【问题描述】:

现在我有一个公式:

int a = 53, x = 53, length = 62, result;
result = (a + x) % length;

但是如果我已经知道结果,如何计算反向模以获得最小的“x”

(53 + x) % 62 = 44
//how to get x

我的意思是得到 x 的公式或逻辑是什么

【问题讨论】:

  • x 的许多值将满足该等式。公平地说,可能性是无限的,但不在55int.MaxValue 的范围内。
  • @Jodrell 据说他正在寻找最小的 x。这限制了它。
  • @CoreyOgburn 哎呀,说得好。
  • 我猜最低的其实是-9
  • 我想最小的 "x" ...

标签: c# math formula reverse modulus


【解决方案1】:
private int ReverseModulus(int div, int a, int remainder)
{
   if(remainder >= div)
      throw new ArgumentException("Remainder cannot be greater than or equal to divisor");
   if(a < remainder)
      return remainder - a;
   return div + remainder - a;
}

例如:

// (53 + x) % 62 = 44
var res = ReverseModulus(62,53,44); // res = 53

// (2 + x) % 8 = 3
var res = ReverseModulus(8,2,3); // res = 1

【讨论】:

  • @Ivan Li:他的div + remainder - a 是我的B + C - A。如果我的不适用于其他数字,那么它也不会。
  • 在这种情况下,没有任何答案有效。我并不是要抹黑你的答案@digEmAll,我只是觉得与你有相同的基本方程(比你早 12 分钟)有点不舒服,只是没有明显的验证。
  • 但是,考虑最小的正 x 是否正确?否则,您示例中的最小值应该是 -9,而不是 53 ...
  • @CoreyOgburn:实际上这就是我的 if 条件处理的内容。 (2 + 1) % 8 = 3remainder - a 正好得到 1... 而我们代码的相等部分得到 9...
  • 你让我到了那里,我没想到。我的编辑现在在一个方程式中说明了这一切,但我确实欠你。
【解决方案2】:

它可能不是最初用于模数的X,但如果你有

(A + x) % B = C

你可以的

(B + C - A) % B = x

【讨论】:

  • 没关系,@digEmAll 的回答指出了我的失败之处。对此进行了编辑。
  • 这当然是第一个也是很好的答案,但@digEmAll 直接解决了我的 if 语句处理问题。但无论如何,谢谢,你们帮了我很多。
【解决方案3】:

x = (44 - 53) % 62 应该可以吗?

x = (44 - a) % length;

【讨论】:

    【解决方案4】:

    怎么样

    IEnumerable<int> ReverseModulo(
        int numeratorPart, int divisor, int modulus)
    {
       for(int i = (divisor + modulus) - numeratorPart; 
           i += divisor; 
           i <= int.MaxValue)
       {
           yield return i;
       }
    }
    

    我现在知道这个答案是有缺陷的,因为它不是最小的,但.First() 可以解决这个问题。

    【讨论】:

      【解决方案5】:

      谁需要电脑?如果 53 + x 等于 44,模 62,那么我们知道对于整数 k,

      53 + x + 62*k = 44
      

      求解 x,我们看到了

      x = 44 - 53 - 62*k = -9 - 62*k
      

      显然,最小的解是 -9(当 k=0 时)和 53(当 k=1 时)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-22
        • 2021-07-26
        • 2019-01-23
        • 1970-01-01
        • 2017-03-01
        • 2017-04-19
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多