finding a^b^c^… mod m

前端 未结 6 1811
慢半拍i
慢半拍i 2020-11-29 23:53

I would like to calculate:

abcd... mod m

Do you know any efficient way since this number

6条回答
  •  时光说笑
    2020-11-30 00:32

    Look at the behavior of A^X mod M as X increases. It must eventually go into a cycle. Suppose the cycle has length P and starts after N steps. Then X >= N implies A^X = A^(X+P) = A^(X%P + (-N)%P + N) (mod M). Therefore we can compute A^B^C by computing y=B^C, z = y < N ? y : y%P + (-N)%P + N, return A^z (mod m).

    Notice that we can recursively apply this strategy up the power tree, because the derived equation either has an exponent < M or an exponent involving a smaller exponent tower with a smaller dividend.

    The only question is if you can efficiently compute N and P given A and M. Notice that overestimating N is fine. We can just set N to M and things will work out. P is a bit harder. If A and M are different primes, then P=M-1. If A has all of M's prime factors, then we get stuck at 0 and P=1. I'll leave it as an exercise to figure that out, because I don't know how.

    ///Returns equivalent to list.reverse().aggregate(1, acc,item => item^acc) % M
    func PowerTowerMod(Link list, int M, int upperB = M)
        requires M > 0, upperB >= M
        var X = list.Item
        if list.Next == null: return X
        var P = GetPeriodSomehow(base: X, mod: M)
        var e = PowerTowerMod(list.Next, P, M)
        if e^X < upperB then return e^X //todo: rewrite e^X < upperB so it doesn't blowup for large x
        return ModPow(X, M + (e-M) % P, M)
    

提交回复
热议问题