library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub firiexp/library

:heavy_check_mark: math/tetration.cpp

Verified with

Code

ll totient(ll n){
    ll res = n;
    for (ll i = 2; i*i <= n; ++i) {
        if(n%i == 0){
            res = res/i*(i-1);
            while(n%i == 0) n /= i;
        }
    }
    if(n > 1) res = res/n*(n-1);
    return res;
}

template <class T>
T pow_tetration(T x, T n, T M, bool &yojo){
    uint64_t u = 1, xx = x;
    if(x >= M) yojo = true;
    while (n > 0){
        if (n&1) {
            u = u * xx;  
            if(u >= M) yojo = true, u %= M;
        }
        if(!(n >>= 1)) break;
        xx = xx * xx;
        if(xx >= M) yojo = true, xx %= M;
    }
    return static_cast<T>(u);
};

ll tetration(ll a, ll n, const ll M, bool &yojo) {
    if(a == 0) return !(n&1);
    if(M == 1) return yojo = true, 1;
    if(a == 1 || n == 0) return 1;
    ll expo = tetration(a, n-1, totient(M), yojo);
    ll res = pow_tetration(a, expo, M, yojo);
    return res + (yojo ? M : 0);
}

ll tetration(ll a, ll n, const ll M){
    bool yojo = false;
    return tetration(a, n, M, yojo)%M;
}
#line 1 "math/tetration.cpp"
ll totient(ll n){
    ll res = n;
    for (ll i = 2; i*i <= n; ++i) {
        if(n%i == 0){
            res = res/i*(i-1);
            while(n%i == 0) n /= i;
        }
    }
    if(n > 1) res = res/n*(n-1);
    return res;
}

template <class T>
T pow_tetration(T x, T n, T M, bool &yojo){
    uint64_t u = 1, xx = x;
    if(x >= M) yojo = true;
    while (n > 0){
        if (n&1) {
            u = u * xx;  
            if(u >= M) yojo = true, u %= M;
        }
        if(!(n >>= 1)) break;
        xx = xx * xx;
        if(xx >= M) yojo = true, xx %= M;
    }
    return static_cast<T>(u);
};

ll tetration(ll a, ll n, const ll M, bool &yojo) {
    if(a == 0) return !(n&1);
    if(M == 1) return yojo = true, 1;
    if(a == 1 || n == 0) return 1;
    ll expo = tetration(a, n-1, totient(M), yojo);
    ll res = pow_tetration(a, expo, M, yojo);
    return res + (yojo ? M : 0);
}

ll tetration(ll a, ll n, const ll M){
    bool yojo = false;
    return tetration(a, n, M, yojo)%M;
}
Back to top page