我正在尝试找到解决方案的数量
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的总和。我想知道我的算法是否正确以及是否还有其他更有效的算法。
答案 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];