Cod sursa(job #2866604)

Utilizator robertanechita1Roberta Nechita robertanechita1 Data 9 martie 2022 20:30:31
Problema Invers modular Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");

/**
a ^ n % P =                       43210
n = 25 = 2 ^ 4 + 2 ^ 3 + 2 ^ 0 = (11001)
{1}
a ^ 25 = a ^ (2 ^ 4) * a ^ (2 ^ 3) * a ^ (2 ^ 0)
p = 1 * a * a ^ 8 * a ^ 16
a = a * a
a = a * a
a = a * a
a = a * a
{1}
Invers Modular
{1}
a ^ phi(P) % P = 1, P - prim
phi(n) - nr de numere < n si prime cu acesta
phi(12) = 4 (1,5,7,11)
{1}
Problema: Se dau a > 1 si P. Sa se determine un nr nat b a.i. a * b % P = 1
ex: a = 5, P = 17 => b = 7
a * b % P = 1 => b = 1/a % P
{1}
{1}
a ^ phi(P) % P = 1 => a * a ^ (phi(P) - 1) % P
=> b = a ^ (phi(P) - 1)
{1}
{1}
x / y % P = x * y ^ (phi(P) - 1) % P
{1}
Daca P - prim => phi(P) = P - 1
=> inversul modular al lui y este y ^ (P - 2) % P
*/

int Fact(int n, int P)
{
    int rez = 1;
    for(int i = 2;i <= n;i++)
        rez = rez * i % P;
    return rez;
}

int LogP(int a, int n, int P)
{
    int rez = 1;
    while(n > 0)
    {
        if(n % 2 == 1)
            rez = 1LL * rez * a % P;
        n /= 2;
        a = 1LL * a * a % P;
    }
    return rez;
}

int Phi(int n)
{
    int f,exp,phi = n;
    f = 2;
    while(n > 1)
    {
        exp = 0;
        while(n % f == 0)
        {
            n /= f;
            exp++;
        }
        if(exp > 0) phi = phi / f * (f - 1);
        if(f * f < n) f++;
        else f = n;
    }
    return phi;
}

int main()
{
    int a, N;
    fin >> a >> N;
    fout << LogP(a, Phi(N) - 1, N);
    return 0;
}