我需要在同余关系中求解x
xy + z≡0(mod k)
其中y,z和k是已知的。 (k可能不是素数。)
是否有比仅测试从0到k-1的所有值更好的算法?
我尝试使用数论,并得到了:
xy≡-z(mod k)
x≡-z·(inverse(y)%k)(mod k)
但是在某些情况下我得到错误的结果。例如,如果k = 728,x = 272,y = 344,z = 344,则原始关系成立(因为272·344 + 344 = 129·728),但最后一个关系不成立。我在做什么错了?
答案 0 :(得分:3)
您的解决方案失败是因为
The multiplicative inverse of “y modulo k” exists if and only if y and k are relatively prime (i.e., if gcd(y, k) = 1).
在示例中,您选择y
和k
不是互质的
这是解决问题的另一种方法
xy + z≡0(mod k)
xy≡-z(mod k)
xy≡-z + k(mod k)
令k-z = b
xy≡b(mod k)
现在,您只需要求解线性同余方程。
解决您给定的示例看起来像
x * 344 + 344≡0(mod 728)
x * 344≡-344(mod 728)
x * 344≡-344 + 728(mod k)
x * 344≡384(mod 728)
首先通过简化来简化为x * 43≡48(mod 91),然后使用扩展的欧几里得算法来解决这个问题,将其形式为
90 + 91 * t
x小于728的解:90、181、272、363、454、545、636、727。
这样,您可以找到x的所有可能解。