【问题标题】:Modular arithmetic (a*b/e)%m?模运算 (a*b/e)%m?
【发布时间】:2014-11-11 18:48:46
【问题描述】:

以下是否有可能的模块化表达式:

((a*b)/e)%m

例如:

(a*b*c)%m = ((a%m)*(b%m)*(c%m))%m

【问题讨论】:

  • m 是素数吗? a * b 能被 e 整除吗?
  • 您是在问% 是否分布在* 之上?
  • @user2040251 m 是素数,但 a*b 可能会也可能不会被 e 整除
  • @TobiLehman 不,我问的是如果给出一个类似上面的表达式,我是否可以通过找出从 m 获得的余数来快速计算
  • 如果 a * b 不能被 e 整除,那么不,你不能。

标签: algorithm math modular-arithmetic mathematical-expressions


【解决方案1】:

在使用模算术时,您必须乘以模逆,而不是执行除法。例如,要除以 e,您将乘以模逆 c 其中 c × e ≡ 1 (mod m)。您可以通过以下算法计算 x (mod m) 的模逆:

function inverse(x, m)
    a, b, u = 0, m, 1
    while x > 0
        q = b // x # integer division
        x, a, b, u = b % x, u, x, a - q * u
    if b == 1 return a % m
    error "must be coprime"

因此,对于您的表达式 ((a*b)/e)%m,您将计算 (a * b * inverse(e,m)) % m

【讨论】:

    【解决方案2】:

    这取决于您对除法的含义;例如对于

    a = 1
    b = 1
    e = 3
    m = 7
    

    您期望的结果是什么? 1/3 通过传统算术计算为 0,如果在这种情况下正是您要寻找的,那么通常没有捷径可走(但是,如果已知 a*b 很小,您可以将除法换成乘法和移位够了)。

    除法x/y 的另一种选择是在模运算中寻找乘以y 得到x 的数字(而1/3 的含义是5,因为在考虑模运算时5*3 为1 7)。如果这是您要查找的内容,而不是除以 e,您可以乘以 e 的模逆,即乘以 e 得到的数字为 1(mod m)。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2015-12-19
      • 2015-01-31
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多