有没有办法在y =(k1 + k2×x)mod(s)中指定X?

时间:2017-01-30 19:25:50

标签: c# math modulo

我在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

1 个答案:

答案 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/或我的页面