You are on page 1of 37

INTRODUCCIN

DIVISIBILIDAD
a y b enteros
b divide a a (b | a)
a / b es entero
existe k entero tal que a = b k
a es mltiplo de b si existe k entero tal que

a = b k
divisor trivial: 1
divisores no triviales: factores
nmero primo: nicos divisores 1 y s mismo
Ejemplo:
Divisores de 12: 1, 2, 3, 4, 6 y 12.
Factores primos de 12: 2, 2, y 3.

TEOREMA
Para cualquier entero a

y un nmero positivo b
existen enteros q y r
tal que 0 <= r < b y a
= q b + r
q: cociente
|_ a / b _|= q
r: residuo o resto
a mod b = r

Propiedades:
Si a|b y b!=0 entonces
|a|<=|b|.
Si a|b y b|c entonces
a|c.
Si a|b, entonces a|bc.
|a| divide a |b| si y
solo si a|b.
Si a|b y b|a entonces |
a| = |b|.
Si a|b, entonces a|
(b+c) s y solo s a|c.
a|0, 1|a.
Si ab|ac y a!=0
entonces b|c.

MCD
Mayor de divisores comunes
d = mcd(a1,a2,...,an)
donde: mcd(a1,a2,...,an)=max{d tq d|a1 y

d|a2 y ... y d|an}

Definicin: a y b enteros, d es el mcd

si d|a y d|b y cualquier d que d|a y


d|b se tiene que |d|<=|d|

CLCULO DEL MCD


Descomposicin en factores

primos.
Ejemplo: mcd(60,80,100)
60 2
30 2
15 3
55
1

80 2
40 2
20 2
10 2
55
1

100 2
50 2
25 5
55
1

Tomando factores primos

comunes con mnima


potencia:

d = mcd(60,80,100) =

2^23^05^1 = 20

Propiedades:
mcd(a1,a2,...,an) =
max{d tq d|a1 y d|a2
y ... y d|an}
mcd(a,b) = mcd(b,a)
mcd(a,0) = mcd(0,a) = a
mcd(a,b,c) =
mcd(mcd(a,b),c) =
mcd(a,mcd(b,c)) =
mcd(b,mcd(a,c))
mcd(da,db) =
dmcd(a,b)
Si d|a y d|b entonces d|
mcd(a,b)
Si mcd(a,b)=1 entonces a
y b son primos entre s.

ALGORITMO DE MCD POR


FUERZA BRUTA
Suponiendo a>=b

static long mcd( long a, long b){


long i;
for( i=b; i>1; i--)
if( a%i==0 && b%i==0 )
return i;
return 1;
}

ALGORITMO DE EUCLIDES
Primero:
Si a >= b y a = bk entonces mcd(a,b) = b

Segundo:
Si a >= b y a = bk + r y d|a y d|b

entonces d|a mod b


Con esto, sea r1 = a mod b, r2 = b mod
r1,..., rn = rn-2 mod rn-1, entonces
mcd(a,b) = mcd(b,r1) = ... = mcd(rn,0) =
rn

ALGORITMO DE EUCLIDES
Ejemplo: a = 350 y b = 98
mcd(350,98)=mcd(98,350 mod 98)=mcd(98,56)
mcd(98,56)=mcd(56,98 mod 56)=mcd(56,42)
mcd(56,42)=mcd(42,56 mod 42)=mcd(42,14)
mcd(42,14)=mcd(14,42 mod 14)=mcd(14,0)
Entonces, mcd(350,98)=14

ALGORITMO DE EUCLIDES
Recursivo:
Suponiendo a>=b

long mcd(long a, long b) {


if( b==0 )
return a;
else
return mcd(b, a%b);
}

ALGORITMO DE EUCLIDES
Iterativo:
Suponiendo a>=b

long mcd(long a, long b) {


long r = b;
while( b>0 ){
r = a%b;
a = b;
b = r;
}
return a;
}

ALGORITMO EXTENDIDO DE
EUCLIDES
Calcula el mcd y tambin x y y que

satisfagan:

ax + by = mcd(a,b)

Sabiendo que mcd(a,b)=mcd(b,r), donde r=a-

b|_a/b_| y suponiendo que se conocen x y


y:
bx + ry = mcd(b,r)

Sustituyendo r=a-b|_a/b_|
bx + a-b|_a/b_|y = mcd(b,r) = mcd(a,b)
Para hallar x y y hay que partir del

caso base: a1 + 00 = mcd(a,0) donde x=1


y y=0

ALGORITMO EXTENDIDO DE
EUCLIDES
Suponiendo a>=b

long mcd( long a, long b, long *x, long *y ){


long x1, y1; /* coeficientes previos */
long g;
/* valor de mcd(a,b)
*/
if ( b>a ) return( mcd( b, a, y, x ) );
if ( b==0 ) {
*x = 1;
*y = 0;
return( a );
}
g = mcd( b, a%b, &x1, &y1 );
*x = y1;
*y = x1 - ( a/b )*y1 ;
return( g );
}

ALGORITMO EXTENDIDO DE
EUCLIDES
Ejemplo: a = 350 y b = 98
a
b
*x
*y
x1

350
98
2
-7
98
56
-1
2
56
42
1
-1
42
14
0
1
14
0
1
0
Entonces, mcd(350,98) =
700686 = 14

y1

g
-1
2
14
1
-1
14
0
1
14
1
0
14
14
3502+98(-7) =

MCM
Mnimo de mltiplos comunes
m = mcm(a1,a2,...,an)
donde: mcm(a1,a2,...,an)=min{m tq m>1 y

a1|m y a2|m y ... y an|m}

Definicin: a y b enteros, m es el mcm

si a|m y b|m y cualquier m que a|m y


b|m se tiene que |m|<=|m|

CLCULO DEL MCM


Descomposicin en factores primos.
Ejemplo: mcm(60,80,100)
60 2

80 2

100 2

30 2

40 2

50 2

15 3

20 2

25 5

55

10 2

55

55

Tomando factores primos comunes con

mxima potencia:
m = mcm(60,80,100) = 2^43^15^2 = 1200

CLCULO DEL MCM


No existe algoritmo como Euclides
Se tiene:
ab = mcd(a,b)mcm(a,b)
Con esto, conociendo a, b y mcd(a,b) se

tiene:

mcm(a,b) = ab/mcd(a,b)

Ejemplo: a=350 y b=98


mcd(350,98) = 14
mcm(350,98) = 35098/mcd(350,98) =
34300/14 = 2450

ARITMTICA MODULAR
Aplicacin de la funcin mdulo en

operaciones aritmticas

Definicin de mdulo:
a mod b = a b|_a/b_|

SUMA
(x+y) mod m = (x mod m + y mod m) mod m
Ejemplo:
(8+7) mod 3 = 15 mod 3 = 0
(8+7) mod 3 = (8 mod 3 + 7 mod 3) mod 3

= (2+1) mod 3 = 0

RESTA
(x-y) mod m = (x mod m - y mod m) mod m
Ejemplo:
(8-7) mod 3 = 1 mod 3 = 1
(8-7) mod 3 = (8 mod 3 - 7 mod 3) mod 3 =
(2-1) mod 3 = 1
(-x) mod m = (m - x) mod m
Ejemplo:
(-5) mod 3 = (3-5) mod 3 = (-2) mod 3 = (32) mod 3 = 1

MULTIPLICACIN
(xy) mod m = ((x mod m)(y mod m)) mod m
Ejemplo:
(45) mod 3 = 20 mod 3 = 2
(45) mod 3 = ((4 mod 3)(5 mod 3)) mod 3 =
(12) mod 3 = 2
(x^n) mod m = ((x^(n-k) mod m)(x^k mod m))

mod m, con n y k naturales

Ejemplo:
8 mod 3 = 2
8 mod 3 = ((4 mod 3)(2 mod 3)) mod 3 = (12)
mod 3 = 2

CONGRUENCIA
Definiciones:

a=b mod m s y solo s a mod m = b mod m

a=b mod m s y solo s m|(a-b)

PROPIEDADES
Reflexiva:
a=a mod m s y solo s a mod m = b mod m
Simtrica:
Si a=b mod m entonces b=a mod m
Transitiva:
Si a = b mod m y b = c mod m entonces a=c mod m
Suma:
Si a = b mod m y c = d mod m entonces (a+c) = (b+d)
mod m
Multiplicacin:
Si a = b mod m y c = d mod m entonces (ac) = (bd)
mod m
Potencia:
Si a = b mod m entonces (a^n) = (b^n) mod m

CONGRUENCIA LINEAL
Definicin:
ax=b mod m s y solo s m|(ax-b) o ax=b+km , donde se
pretende hallar k

void congruencia(long a, long b, long m){


long d, xp, yp, x, i;
printf("Para %ldx=%ld mod %ld\n", a, b, m );
printf("x=");
d = mcd(a, m, &xp, &yp);
if(b%d==0){
x = xp*(b/d);
for(i=0; i<d; i++)
printf(" %ld", (x+i*(m/d)) % m);
} else {
printf("No hay solucion");
}
}

ALGORITMO CLSICO
int primo (long p) {
long i, cnt = 0;
for (i = 1; i<=p; i++)
if ( p%i==0 )
cnt = cnt + 1;
if ( cnt == 2 )
return 1;
else
return 0;
}

MEJORAMIENTO
0, 1 y negativos no son primos.
2 nico par primo.
Otros pares no primos.
Todos los primos exceptuando el 2 son

impares, buscar solo impares.


No es necesario contar el nmero de divisores
del nmero p, puesto que no es primo si
existe algn k (1 < k < p) que divida a p.
El rango de bsqueda de posibles divisores de
p es desde 3 hasta la raz cuadrada de p, si
tiene algn divisor en este rango, no es
primo, caso contrario, es primo.

ALGORITMO MEJORADO
int isPrime (long p) {
long i, root;
if ( p<2 ) return 0;
/*
if ( p==2 ) return 1;
/*
if ((p&1)==0) return 0; /*
root = (long)sqrt(p);
for( i=3; i<=root; i+=2 )
if ( p%i == 0 )
return 0;
/*
return 1;
/*
}
/* p&1==0 <=> p%2==0 es decir,

FALSE */
TRUE */
FALSE */

FALSE */
TRUE */
si p es par */

CRIBA DE ERATSTENES
2
3
5

1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2
2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x x x
x
x x x
x
x x x
x x x

2 2 2
7 8 9
x
x
x x

3
0
x
x
x
x

Primero: elimina a todos los mltiplos de 2 (4, 6, 8, 10, etc.)


Segundo: elimina a todos los mltiplos de 3 (6, 9, 12, etc.)
Tercero: elimina a todos los mltiplos de 5 (10, 15, 20, etc.)

CRIBA DE ERATSTENES
#include<stdio.h>
#include<math.h>

int main(){
long i, cnt=0;

#define MAX 1000000L


unsigned char V[MAX];
void criba(){
long i, j, SQRT =
(long)sqrt(MAX);
for(i=0; i<MAX; i++)
V[i] = 1;
for(i=2; i<=SQRT; i++)
if( V[i]==1 )
for(j=i+i; j<MAX;
j+=i)
V[j] = 0;
}

criba();
for( i=2; i<MAX; i++)
if( V[i]==1 )
cnt++;
printf("desde 2 hasta %ld
hay %ld primos", MAX, cnt);
return 0;
}

You might also like