最常见的多个模数p

时间:2014-07-06 13:23:14

标签: algorithm

假设我们必须找到最不常见的多个(lcm)数字a1 ... an

要解决这个问题,我们可以使用递归解决方案:

lcm(a, b) = (a * b) / gcd(a, b)其中gcd(a, b)表示对ab

的公约数进行加权

lcm(a1 ... an) = lcm(a1, lcm(a2 ... an))

问题是:

如果我们对lcm(a1 ... an) mod p感兴趣,其中p prime 号码。 lcm(a1 ... an)太大,无法存储在int

1 个答案:

答案 0 :(得分:2)

以前有一些关于这个主题的问题:

您有两种选择:


选项1:总体趋势似乎是,如果您的值对于无符号长多整数仍然太长,那么您需要使用数字的素数分解。取每个数字 i 并将其分解为其主要因子(2 r )(3 s )(5 t )......要获得LCM,您所要做的就是为每个素数因子取最大指数。

例如,15和18的LCM可以这样完成:

15 =(2 0 )(3 1 )(5 1

18 =(2 1 )(3 2 )(5 0

2的最大指数为1,3的最大指数为2,5的最大指数为1.因此,LCM(15,18)=(2 1 )(3 2 )(5 1 )= 2(9)(5)= 90.但是,我们可以在此乘法步骤中执行模数,因为ab (mod n) = (a (mod n)) (b (mod n))。所以只需在每个乘法步骤后进行修改。


选项2:此选项涉及查找 i 子集的GCD。将其保存为g 0 ,并将g 0 的所有 i 除以g 0 。找到新的a i 的另一个子集的GCD,并将其保存在g 1 。再次,将g 1 的所有 i 除以g 1 。重复此操作,直到 i 的所有子集的GCD为1.然后,您只需将所有 i 和g i 乘以mod mod规则。例如:

LCM(15,18,10)

GCD(15,10)= 5因此g 0 = 5且a =(3,18,2)。

GCD(3,18)= 3所以g 1 = 3且a =(1,6,2)。

GCD(6,2)= 2因此g 2 = 2且a =(1,3,1)。此时,a的任何子集的GCD都为1,我们就完成了。

全部重新组合在一起LCM(15,18,10)= 5(3)(2)(1)(3)(1)= 90