非线性同余方程的解法数

时间:2013-08-04 18:08:02

标签: algorithm math discrete-mathematics number-theory modular-arithmetic

我正在尝试找到解决方案的数量

       x^a (mod b) =c with 0<=x<=u

其中b <= 50但a和u可能很大。我的方法是迭代x的每个值从0到min(b,u),如果它满足等式add ceil((ux)/ b)(考虑到x的值的数量大于b)但是在b)的乘法场中等于解的数量。我不确定我的算法的正确性。我可以将我的方法扩展到多个变量,如果有

    (x^a + y^a) (mod b)=c

我可以产生所有无序的x和y对,使得x <= y直到(x,y)&lt; = min(b,u)并且再次计算i = ceil((ux)/ b)并且j = ceil((uy)/ b)并乘以和:

            t={i+i*(i-1)*2 if x=y , i*j*2 if x!=y }

并取t的总和。我想知道我的算法是否正确以及是否还有其他更有效的算法。

1 个答案:

答案 0 :(得分:0)

是,如果x ^ a mod b = c则(x + b)^ a mod b = c。因此到目前为止总共有1 +层((u-x)/ b)解决方案。您只需记住在搜索从(x + 1)到min(u,b)的其他解决方案时跳过这些数字。

这个概念适用于2个变量,但计算量更大。求解x ^ a mod b = d并将计数保存为T [d],其中0≤d<1。湾您可能会问为什么0≤d<0。 b而不是0≤d≤c。这个例子就是为什么:如果c = 7且b = 35那么(x,y)使得x ^ a mod 35 = 8和y ^ a mod 35 =-1≡34也是一个解决方案。

然后解决方案的总数与你建议的相似,只是我不打扰单独处理x = y和x≠y:

for (i=0 ; i < b ; i++)
   count += T[i]*T[(b +c -i)%b];