【问题标题】:Is there a way to designate X in y = (k1 + k2 × x) mod (s)?有没有办法在 y = (k1 + k2 × x) mod (s) 中指定 X?
【发布时间】:2017-01-30 19:25:49
【问题描述】:

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

【问题讨论】:

  • 您想找出两个数能除的最大数吗?例如 4 代表 12 和 20?
  • 你能举一个数字例子和你知道的解决方案吗? y、k1、k2、s、x的典型值是多少?
  • 提示:你知道什么是乘法逆吗?
  • 示例:17395=(100+43*X)mod(633424),此处为 X=17395, 24302=(100+43*X)mod(40000),此处为 X=5214不知道乘法逆是什么,能帮我解决我的问题吗?:P

标签: c# math modulo


【解决方案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 是 43 相对于 633424 的乘法倒数

这有什么帮助?我们可以将两边乘以 17294:

17294 = ( Y * 43 * 17294 ) % 633424

现在我们可以读出我们的解决方案:X 是Y * 17294

所以问题归结为计算乘法逆。你能看到如何找到像 1 = ( Y * 43 ) % 633424 这样的数字 Y 吗?如果你能找到那个号码,那么你就能找到 X。

您可以使用欧几里得算法快速找到乘法逆元。请参阅https://en.wikipedia.org/wiki/Modular_multiplicative_inverse 或我关于该主题的页面https://ericlippert.com/2013/11/12/math-from-scratch-part-thirteen-multiplicative-inverses/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 2021-06-24
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多