gpt4 book ai didi

algorithm - 最小公倍数模一些 p

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:43 26 4
gpt4 key购买 nike

假设我们必须找到数字 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是一些质数数。 lcm(a1 ... an)太大而无法存储在 int 中.

最佳答案

之前有一些关于该主题的问题:

你有两个选择:


选项 1:一般趋势似乎是,如果您的值对于 unsigned long long int 仍然太长,那么您需要对数字进行质数分解。取每个数字 ai 并将其分解为质因数 (2r)(3s)(5t)...要获得 LCM,您只需为每个质因数取最大指数即可。

比如15和18的LCM可以这样做:

15 = (20)(31)(51)

18 = (21)(32)(50)

2的最大指数为1,3的最大指数为2,5的最大指数为1。因此,LCM(15,18) = (21)(3 2)(51) = 2(9)(5) = 90。但是,我们可以在这个乘法步骤中执行模运算,因为 ab (mod n ) = ((a (mod n)) (b (mod n))) mod n。因此,只需在每一步乘法后取模即可。


选项 2:此选项涉及找到 i 子集的 GCD。将其保存为 g0 并将所有为 g0 的倍数的 ai 除以 g0。找到新 ai 的另一个子集的 GCD 并将其保存在 g1。同样,将所有作为 g1 的倍数的 ai 除以 g1。重复此操作,直到 ai 的所有子集的 GCD 为 1。然后您只需根据您的 mod 规则将所有 ai 和 gi 相乘。例如:

液晶模组(15,18,10)

GCD(15,10) = 5 所以 g0 = 5 和 a = (3,18,2)。

GCD(3,18) = 3 所以 g1 = 3 和 a = (1,6,2)。

GCD(6,2) = 2 所以 g2 = 2 和 a = (1,3,1)。此时,a 的任何子集的 GCD 都将为 1,我们就完成了。

将它们全部放回一起 LCM(15,18,10) = 5(3)(2)(1)(3)(1) = 90

关于algorithm - 最小公倍数模一些 p,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24596281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com