选择mod值的标准

时间:2013-08-10 11:48:08

标签: algorithm modular-arithmetic

我有一个数组Array = {},数组的大小是n

我的约束是这样的:

n< = 100000 和数组 i < = 100

我必须找到数组中所有元素的产品,我将获得一个mod值,我必须使用它修改产品。 mod将始终对值进行更改,此mod值始终小于或等于n。

我的问题是当我选择时,一个全局mod值表示R = 1000000000(远远大于mod约束),每当我的产品超过这个值时,我都会修改结果。

但我不知道为什么我获得的结果为零。

我的问题是如何在这种情况下选择R?

3 个答案:

答案 0 :(得分:1)

您没有向我们展示您的代码,但可能看起来像下面的伪Python代码:

limit = 1000000

def product_mod( array, m ):
    product = 1 
    for k in array:
        product = product * k
        if product > limit: product = product % m

    return product % m

此算法工作,前提是限制足够低,product * k永远不会溢出。如果没有,您的代码可能有错误。

然而,请注意,此函数的结果很可能通常合法地为零:具体而言,只要数组中的数字乘积均匀地除以模数,就会发生这种情况。由于该产品通常是一个高度复合的数字(它的至少因为数组中有数字的因素很多),这很可能。

特别是,无论何时,函数的输出都为零:

  • 数组中的任何一个数字为零,
  • 数组中的任何一个数字都是模数的倍数,或
  • 数组中任何数字子集的乘积是模数的倍数。

在所有这些情况下,数组中所有数字的乘积将为零或模数的倍数(并因此将减少到零)。

答案 1 :(得分:1)

我不知道你的代码,但它就像0是正确的结果。

选择R大素数并确保所有元素都不能被此数字整除,以便得到与0不同的结果。

答案 2 :(得分:0)

听起来你正在计算数组中某些给定值的值的乘积,但是正在使用另一个值来限制中间计算中的整数溢出。那么你很有可能得到错误的结果。

例如 120 mod 9 = 3 (120 mod 100) mod 9 = 20 mod 9 = 2

然后,正确的程序是以与(a * b) mod n = (a mod n) * (b mod n) mod n

之后的最终结果相同的数字为模数进行所有计算。

例如 (24 * 5) mod 9 = (24 mod 9) * (5 mod 9) mod 9 = (6 * 5) mod 9 = 30 mod 9 = 3