具有非成对互质模量的同余系统

时间:2018-04-28 21:48:45

标签: algorithm math computer-science number-theory computer-science-theory

我有一套同余

x = a1 (mod n)
...
x = ak (mod nk)

我希望找到x,这可以通过中国余数定理和相关算法来解决:https://en.wikipedia.org/wiki/Chinese_remainder_theorem

一些例子:https://rosettacode.org/wiki/Chinese_remainder_theorem

对于这个特例:

x = 1031 (mod 1473)
x = 1141 (mod 1234)
x = 50   (mod 1827)

我尝试的所有算法都不起作用,因为模数不是成对互质的。 但是,1024360583是有效的解决方案:

1024360583 % 1473 == 1031
1024360583 % 1234 == 1141
1024360583 % 1827 == 50

什么算法可以找到这样的解决方案?

我还从“密码学手册”中实现了加纳算法:它没有解决这个例子。

1 个答案:

答案 0 :(得分:2)

正如你所说,模数不是成对素数。你可以检查每一对(你的三个模数是三对),唯一一个大于1的GCD(最大公约数)是14731827,GCD为3 。然后,我们寻找除以一个给定模量之外的所有素数。 (有几种方法可以做到这一点。)我们发现3是唯一一个除以一个模数的素数,并且除以一个模数的素数的最高幂是3**1 = 3(I为了清晰起见,使用Python和Fortran中使用的符号表示,因为插入符号在计算机中也有其他用途。)

这可能会阻止你的方程组得到任何解。我们可以通过在方程中用它们的GCD替换那些模数来检查这一点,看看我们是否会产生矛盾。

x = 1031 = 2 (mod 3)
x =   50 = 2 (mod 3)

结果方程是一致的,因此您的原始系统可能仍然有解决方案。 (如果3的更高幂也划分了多个模数,我们也需要检查那些更高的幂。)对于我们发现的每个素数和每个模数,我们发现该素数的最高幂除以模量。在我们的案例中,我们看到314733**23**21827而不是3**3。因此,我们的最高功率是3**2 = 9,我们看到该功率和更低功率的方程是一致的。

我们现在用新的方程替换两个相关的方程,用最后一段中最高幂数除以模数。这意味着将1473替换为1473 / 3 = 491,将1827替换为1827 / 9 = 203。我们还为素数的每个幂加上我们得到的新方程,它除以一个以上的模数。所以现在我们有四个同时模块化方程式:

x = 1031 (mod  491)
x = 1141 (mod 1234)
x =   50 (mod  203)
x =   50 (mod    9)  [from your original equation #1, 3]

我们可以减少其中某些方程式的右侧,我们得到

x =   49 (mod  491)
x = 1141 (mod 1234)
x =   50 (mod  203)
x =    5 (mod    9)

该系统的解决方案也适用于您的原始系统。

我确定您可以将其转换为算法,然后将其转换为计算机代码。询问您是否有更多问题。