O conteúdo desse site não é atualizado há anos. A informação está desatualizada e links quebrados.
Entrada:
a
(podendo ser negativo!) e n
> 0.Saída:
a
módulo n
.Complexidade: O( 1 )
Global:
int mod(int a, int n) {
return (a%n + n)%n;
}
Entrada:
a
, b
e n
.Saída:
a^b mod n
.Complexidade: O( log(b) )
Global:
int expmod(int a, int b, int n) {
if(b == 0)
return 1;
else {
long long res = expmod(a, b/2, n);
res = (res*res) % n;
if(b%2 == 1)
res = (res*a) % n;
return (int) res;
}
}
Utiliza o algoritmo de Euclides.
Entrada:
a
e b
.Saída:
a
e b
.Complexidade: O( log(a) + log(b) )
Global:
int mdc(int a, int b) {
if(a<0) a = -a;
if(b<0) b = -b;
if(b == 0)
return a;
else
return mdc(b, a%b);
}
Utiliza o algoritmo de Euclides estendido.
Entrada:
a
e b
.Saída:
a
e b
como retorno.x
e y
tais que a.x + b.y = mdc(a,b)
.Complexidade: O( log(a) + log(b) )
Global:
int mdc(int a, int b, int *x, int *y) {
int xx, yy, d;
if(b==0) {
*x=1; *y=0;
return a;
}
d = mdc(b, a%b, &xx, &yy);
*x = yy;
*y = xx - a/b*yy;
return d;
}
Entrada:
n
.Saída:
n
é primo ou não.Complexidade: O( sqrt(n) )
Global:
int ehPrimo(int n) {
if(n==2) return 1;
if(n<=1 || n%2 == 0) return 0;
for(int i=3; i*i<=n; i+=2)
if(n%i == 0)
return 0;
return 1;
}
Entrada:
n
<= MAXN
.Saída:
ehprimo[]
que indica se os números menores ou iguais a n
são primos ou não.Complexidade: O( n.log(n) )
Global:
int ehprimo[MAXN+1];
void achaPrimos(int n) {
ehprimo[0] = ehprimo[1] = 0;
ehprimo[2] = 1;
for(int i=3; i<=n; i++)
ehprimo[i] = i%2;
for(int i=3; i*i<=n; i+=2)
if(ehprimo[i])
for(int j=i*i; j<=n; j+=i)
ehprimo[j] = 0;
}
Entrada:
n
> 0.Saída:
n
), onde ϕ é a função phi de Euler, equivalente ao número de primos relativos a n
(mdc=1) menores o iguais a n
.Complexidade: O( n )
Dependências:
ehprimo[i]
, para i <= n/2
.Global:
int phi(int n) {
int res = n;
for(int p=2; 2*p<=n; p++)
if(ehprimo[p] && n%p==0)
res = res/p*(p-1);
return res;
}
Entrada:
a
e b
quaiquer e n
positivo.Saída:
x
tal que a.x == b (mod n)
ou -1
se não houver solução.Complexidade: O( n )
Dependências:
mod(int a, int n)
.mdc(int a,int b,int *x, int*y)
.Global:
int solve(int a, int b, int n) {
int d, x, y;
a = mod(a, n);
b = mod(b, n);
d = mdc(a, n, &x, &y);
if(b%d==0)
return mod( ((long long)x%(n/d)) * ((b/d)%(n/d)) , n/d );
else
return -1;
}