我正在研究一个问题,要求计算gcd(ab,a ^ n + b ^ n)%(10 ^ 9 + 7),其中a,b,n可能高达10 ^ 12。
我能够用很小的数字解决a,b和n的问题,费马定理也似乎不起作用,我得出的结论是,如果a,b是互素的,那么这总是给我gcd作为2,但其余的我都无法获得?
我只需要一点提示,就是我做错了什么才能获取大量的gcd?我还尝试过x ^ y通过在每一步取模来找到gcd,但这还是行不通的。
需要正确的方向,我会努力的。
谢谢。
答案 0 :(得分:1)
您是正确的,a^n + b^n
太大,无法计算,并且工作模数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运算符中处理负数的约定不同。取绝对值可避免此类复杂情况,尽管在数学上并没有什么区别。关键思想是,进行计算gcd的欧几里得算法的第一步是完全可行的。您所需要做的就是将两个数字中较大的部分除以较小的部分。第一步完成后,所有数字都在可行范围内。