phi-phi-phi

Given n and k, calculate φ(φ(...φ(n)...)), where φ applied exactly k times.

φ(n) is Euler's totient function. φ(1)=1 by definition.

Example:

Input:  N = 12,  K = 2
Output: 2 

Approach

C++

#include <bits/stdc++.h>
using namespace std;
const int MXP = 1e6 + 1;
vector<long longprimes;

long long gcd(long long along long b)
{
    return a ? gcd(b % aa) : b;
}

long long mulmod(long long along long blong long c)
{
    long long x = 0y = a % c;
    while (b > 0)
    {
        if (b % 2 == 1)
            x = (x + y) % c;
        y = (y * 2) % c;
        b /= 2;
    }
    return x % c;
}

long long expmod(long long blong long elong long m)
{
    if (!e)
        return 1;
    long long q = expmod(be / 2m);
    q = mulmod(qqm);
    return e % 2 ? mulmod(bqm) : q;
}

bool es_primo_prob(long long nint a)
{
    if (n == a)
        return true;
    long long s = 0d = n - 1;
    while (d % 2 == 0)
        s++, d /= 2;

    long long x = expmod(adn);
    if ((x == 1) || (x + 1 == n))
        return true;

    for (int i = 0i < s - 1i++)
    {
        x = mulmod(xxn);
        if (x == 1)
            return false;
        if (x + 1 == n)
            return true;
    }
    return false;
}

bool rabin(long long n)
{
    if (n == 1)
        return false;
    const int ar[] = {23571113171923};
    for (int j = 0j < 9j++)
        if (!es_primo_prob(nar[j]))
            return false;
    return true;
}

long long rho(long long n)
{
    if ((n & 1) == 0)
        return 2;
    long long x = 2y = 2d = 1;
    long long c = rand() % n + 1;
    while (d == 1)
    {
        x = (mulmod(xxn) + c) % n;
        y = (mulmod(yyn) + c) % n;
        y = (mulmod(yyn) + c) % n;
        if (x - y >= 0)
            d = gcd(x - yn);
        else
            d = gcd(y - xn);
    }
    return d == n ? rho(n) : d;
}

map<long longlong longprim;
void factRho(long long n)
{
    if (n == 1)
        return;
    if (rabin(n))
    {
        prim[n]++;
        return;
    }
    long long factor = rho(n);
    factRho(factor);
    factRho(n / factor);
}

long long phi(long long n)
{
    long long r = 1;
    prim.clear();
    factRho(n);
    for (auto P : prim)
    {
        long long tmp1 = 1;
        for (int x = 0x < P.secondx++)
            tmp1 *= P.first;
        tmp1 /= P.first;
        tmp1 *= P.first - 1;
        r *= tmp1;
    }
    return r;
}

int main()
{
    bool np[MXP] = {};
    primes.push_back(2);
    for (int i = 3i < MXPi += 2)
        if (!np[i])
        {
            primes.push_back(i);
            for (int j = ij < MXPj += i)
                np[j] = true;
        }
    long long N = 12K = 2;

    while (K && N > 1)
    {
        K--;
        N = phi(N);
    }

    cout << N << "\n";

    return 0;
}


No comments:

Post a Comment