穷举的时间复杂度是O(N),比较不实际。
用辗转相除法的时间复杂度是O(logN)。
介绍一下吧:
先求简单一点的问题:A*X mod B == 1,A,B互质
现在假设A=5, B=13。
对5,13辗转相除:
| 5 | 13 |
| | |
=>
| 5 | 13 |2 <-- 2 = 13 / 5
| | 10 | <--10 = 5 * 2
|---|----|
| 3 | <-- 3 = 13 - 10
=>
左右 1| 5 | 13 |2
轮流 | 3 | 10 |
|---|----|
| 2 | 3 |
=>
1| 5 | 13 |2
| 3 | 10 |
|---|----|
| 2 | 3 |1
| | 2 |
| |----|
| | 1 | <-- 计算到1时停止
然后用(1,0)和(0,1)重复上面的步骤:
不变--> 1|1,0|0,1|2 <-- 这个数不变
|2,1|2,0|
|---|---|
|3,1|2,1|1 <-- (2,1) = (0,1)+(2,0)
| |3,1|
|---|
|5,2| <-- 计算结果
那么,可以发现13*2-5*5=1,所以5*(-5) mod 13 ==1。
至于A*X mod B == C,可以这样求:
先对A,B辗转相除。如果A,B不互质,最后计算出的非0值会是d而不是1。
如果d不是C的约数:这个问题无解。
否则:A、B、C同时除以d,得A ',B ',C '。解A '*X mod B ' = C ' 就行了,其中A '和B '互质。
现在在A、B互质的条件下解X。
先用上面的方法求出A*X ' mod B == 1的X ',那么所求的X就是X ' * C mod B。
至此,题目解决。
用辗转相除法的时间复杂度是O(logN)。
介绍一下吧:
先求简单一点的问题:A*X mod B == 1,A,B互质
现在假设A=5, B=13。
对5,13辗转相除:
| 5 | 13 |
| | |
=>
| 5 | 13 |2 <-- 2 = 13 / 5
| | 10 | <--10 = 5 * 2
|---|----|
| 3 | <-- 3 = 13 - 10
=>
左右 1| 5 | 13 |2
轮流 | 3 | 10 |
|---|----|
| 2 | 3 |
=>
1| 5 | 13 |2
| 3 | 10 |
|---|----|
| 2 | 3 |1
| | 2 |
| |----|
| | 1 | <-- 计算到1时停止
然后用(1,0)和(0,1)重复上面的步骤:
不变--> 1|1,0|0,1|2 <-- 这个数不变
|2,1|2,0|
|---|---|
|3,1|2,1|1 <-- (2,1) = (0,1)+(2,0)
| |3,1|
|---|
|5,2| <-- 计算结果
那么,可以发现13*2-5*5=1,所以5*(-5) mod 13 ==1。
至于A*X mod B == C,可以这样求:
先对A,B辗转相除。如果A,B不互质,最后计算出的非0值会是d而不是1。
如果d不是C的约数:这个问题无解。
否则:A、B、C同时除以d,得A ',B ',C '。解A '*X mod B ' = C ' 就行了,其中A '和B '互质。
现在在A、B互质的条件下解X。
先用上面的方法求出A*X ' mod B == 1的X ',那么所求的X就是X ' * C mod B。
至此,题目解决。