Numéricos - Implementações
Módulo
Módulo
Entrada:
- Inteiros
a
(podendo ser negativo!) en
> 0.
Saída:
- Valor de
a
módulon
.
Complexidade: O( 1 )
Global:
int mod(int a, int n) {
return (a%n + n)%n;
}
Exponenciação Modular Rápida
Exponenciação Modular Rápida
Entrada:
- Inteiros
a
,b
en
.
Saída:
- Valor de
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;
}
}
Máximo Divisor Comum
Máximo Divisor Comum
Utiliza o algoritmo de Euclides.
Entrada:
- Inteiros
a
eb
.
Saída:
- Maior inteiro que divide
a
eb
.
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);
}
Máximo Divisor Comum Estendido
Máximo Divisor Comum Estendido
Utiliza o algoritmo de Euclides estendido.
Entrada:
- Inteiros positivos
a
eb
.
Saída:
- Maior inteiro que divide
a
eb
como retorno. - Variáveis inteiras
x
ey
tais quea.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;
}
Teste de Primalidade
Teste de Primalidade
Entrada:
- Inteiro
n
.
Saída:
- Valor booleano que indica se
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;
}
Crivo de Eratóstenes
Crivo de Eratóstenes
Entrada:
- Inteiro
n
<=MAXN
.
Saída:
- Vetor
ehprimo[]
que indica se os números menores ou iguais an
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;
}
Função 'phi' de Euler
Função 'phi' de Euler
Entrada:
- Inteiro
n
> 0.
Saída:
- Valor ϕ(
n
), onde ϕ é a função phi de Euler, equivalente ao número de primos relativos an
(mdc=1) menores o iguais an
.
Complexidade: O( n )
Dependências:
- Crivo de Eratóstenes:
ehprimo[i]
, parai <= 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;
}
Resolvedor de Equação Modular Linear
Resolvedor de Equação Modular Linear
Entrada:
- Inteiro
a
eb
quaiquer en
positivo.
Saída:
- Menor valor positivo
x
tal quea.x == b (mod n)
ou-1
se não houver solução.
Complexidade: O( n )
Dependências:
- Módulo:
mod(int a, int n)
. - MDC Estendido:
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;
}