我在c#中编写需要找到X的程序,其中k2和s的最大公约数是1,x小于s,k1,k2,y,s是常数。现在,我是通过调整X的每个值并检查它们是否正确来实现它,但是当我有40000+值时,这是非常耗时的。或者,如果它对您来说更容易,您可以尝试从y = x mod(s)指定X.
我现在正在使用的代码来解决它:
if (GCD(k2, k) == 1)
{
for (int i = 0; i < k; i++)
{
n1 = 0;
n = 0;
while(n < 1)
{
if(i == (k1 + k2 * n1) % k){
s1[n1] = s[i];
n++;
}
n1++;
}
}
}
提前致谢。
P.S。如果事情不清楚,那么让我知道,我很难解释这一切:P
答案 0 :(得分:1)
让我们来看一个示例问题:
Solve for X:
17395 = (100 + 43 * X ) % 633424
首先取消添加:
17395 - 100 = (43 * X) % 633424
17294 = (43 * X) % 633424
现在,假设存在数字Y
1 = ( Y * 43 ) % 633424
(旁白:我们怎么知道Y存在?如果43和633424是互质的,那么它就存在了。这是Bézout身份的一个特例。)
Y是相对于633424 的 43的乘法逆。
这有什么用?我们可以将双方乘以17294:
17294 = ( Y * 43 * 17294 ) % 633424
现在我们可以读出我们的解决方案:X是Y * 17294
。
因此问题减少到计算乘法逆。你能看到如何找到1 = ( Y * 43 ) % 633424
的数字Y吗?如果你能找到那个号码,你就可以找到X.
您可以使用Euclid算法快速找到乘法逆。请参阅主题https://en.wikipedia.org/wiki/Modular_multiplicative_inverse
的https://ericlippert.com/2013/11/12/math-from-scratch-part-thirteen-multiplicative-inverses/或我的页面