假设我们必须找到最不常见的多个(lcm
)数字a1 ... an
。
要解决这个问题,我们可以使用递归解决方案:
lcm(a, b) = (a * b) / gcd(a, b)
其中gcd(a, b)
表示对a
和b
lcm(a1 ... an) = lcm(a1, lcm(a2 ... an))
问题是:
如果我们对lcm(a1 ... an) mod p
感兴趣,其中p
是 prime 号码。 lcm(a1 ... an)
太大,无法存储在int
。
答案 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