Pagini recente » Cod sursa (job #379042) | Cod sursa (job #1707160) | Cod sursa (job #2620129) | Cod sursa (job #925063) | Cod sursa (job #1811913)
/*
Fie A, N , i<=A<=N-1 , (A,N) =1 -cmmdc(A,N)=1;
X=? a.i. 1<=X<=N-1 && (A*X)%N=1
O solutie de complexitate O(n) ce aduce 30p ar fi sa verificam X de la 1 pana la N-1
daca respecta conditia.
O alta solutie se bazeaza pe Algoritmul lui Euclid extins si are Complexitate O(log n)
100p;
Fie ecuatia de forma:
A*X + N*Y = cmmdc(A,N) va aduce o ca solutie pe X si Y ,numere intregi
dar cmmdc(A,N) =1 -> (A*X + N*Y)%N = 1%N
iar (N*Y)%N =0, Y intreg , deci (A*X)%N = 1;
Astfel il putem calcula pe X in timp logaritmic.
Acesta poate fi negativ. In acest caz ii adaugam perioada principala (+N).
*/
#include <fstream>
#define in "inversmodular.in"
#define out "inversmodular.out"
using namespace std;
ifstream fin(in);
ofstream fout(out);
void Euclid(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
}
else
{
int x0,y0;
Euclid(b,a%b,x0,y0);
x=y0;
y=x0-(a/b)*y0;
}
}
int main()
{
int a,n,x,y;
fin>>a>>n;
Euclid(a,n,x,y);
if(x<0) x+=n;
fout<<x<<"\n";
fin.close(); fout.close();
return 0;
}