Pagini recente » Cod sursa (job #1465841) | Cod sursa (job #435444) | Cod sursa (job #2678873) | Cod sursa (job #2125584) | Cod sursa (job #2451660)
// A * x congruent cu 1 modulo N x = invers modular
// Pentru a exista inversul modular cmmdc(A, N) = 1
// Teorema lui Euler: A^(phi(N)) congruent cu 1 modulo N => A * A^(phi(N) - 1) congruent cu 1 modulo N => A^(phi(N) - 1) este inversul modular a lui A
#include <bits/stdc++.h>
using namespace std;
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");
long long A, N;
int phi(int x)
{
int result = x;
for (int i = 2; i * i <= x; ++i)
{
if (x % i == 0)
{
while (x % i == 0)
x = x / i;
result *= (i - 1);
result /= i;
}
}
if (x > 1)
{
result *= (x - 1);
result /= x;
}
return result;
}
long long log2pow(long long n, long long p)
{
if (p == 0)
return 1;
long long x = log2pow(n, p / 2);
if (p % 2 == 0)
return ((x % N) * (x % N)) % N;
return n * x % N * x % N;
}
int main()
{
fin >> A >> N;
fout << log2pow(A, phi(N) - 1);
return 0;
}