【问题标题】:gcd of two numbers one of them is too large两个数字的 gcd 其中一个太大
【发布时间】:2018-08-10 20:52:07
【问题描述】:

我遇到了一个问题,要求计算 gcd(a-b,a^n+b^n)%(10^9+7) 其中 a,b,n 可以大到 10^12。

对于非常小的数字,我能够解决 a、b 和 n 的问题,而费马定理似乎也不起作用,我得出的结论是,如果 a、b 互质,那么这将始终给我 gcd 为2 但其他的我都买不到?

我只需要一点提示,我做错了什么来获得大量的 gcd?我还尝试 x^y 通过在每一步取模来查找 gcd,但这也没有用。

只需要方向,我会走自己的路。

提前致谢。

【问题讨论】:

  • 您是否通过平方研究过幂运算?从例如的角度来看,n = 10^12 很小。指数在 2^512 左右的模幂运算是常规的密码学。
  • 是的,我用过它,但是对于 (10^12)^(10^12) 没有地方存储该数字,如果我在每一步都取模,那将是不正确的,因为 gcd 会如果我做错了什么,要与众不同还是纠正我?
  • 我正在单独计算 a^n 和 b^n 所以如果我找到 gcd(a-b, a^n+b^n)%10^9+7 因为它会给我错误的答案,如果我在每一步都取模 a^n%10^9+7 仍然会给我错误的答案

标签: math numbers modulo greatest-common-divisor


【解决方案1】:

您是正确的,a^n + b^n 太大而无法计算,并且每一步的工作 mod 10^9 + 7 并不能提供计算答案的方法。但是,您仍然可以通过与 不同 模数进行平方来使用模幂运算,即 a-b

主要观察:

1) gcd(a-b,a^n + b^n) = gcd(d,a^n + b^n) where d = abs(a-b)
2) gcd(d,a^n + b^n) = gcd(d,r) where r = (a^n + b^n) % d
3) r can be feasibly computed with modular exponentiation by squaring

1) 的要点是不同的编程语言在 mod 运算符中处理负数的约定不同。取绝对值避免了这种复杂性,尽管从数学上讲它并没有什么区别。关键思想是,做计算gcds的欧几里得算法的第一步是完全可行的。您所需要的只是两个数字中较小的一个除以较大的余数。第一步完成后,所有数字都在可行范围内。

【讨论】:

  • 感谢我通过在 a-b 的每一步取模并使用 int128 来解决它,感谢您的帮助!
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 2013-08-14
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多