Anda di halaman 1dari 38

Desafios de Programação

Matemática

1
Wladimir Araújo Tavares

1 Universidade Federal do Ceará - Campus de Quixadá

16 de março de 2017

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 1 / 38


1 Algebra

2 Teoria dos números

3 Combinatória

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 2 / 38


Exponenciação Rápida

Computação recursiva de an



 1 ,n = 0

a ,n = 1
an =
(an/2 )
 , n é par

a(an−1/2 )2

, n é ı́mpar

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 3 / 38


Implementação recursiva

d ou ble pow ( d ou b le a , i n t n ) {
i f ( n==0) r e t u r n 1 ;
i f ( n==1) r e t u r n a ;
d ouble t = pow ( a , n / 2 ) ;
r e t u r n t * t * pow ( a , n %2);
}

Complexidade de tempo : O(logn)

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 4 / 38


Implementação não recursiva

d ou ble pow ( d ou b le a , i n t n ){
d ouble r e t = 1 ;
while ( n ){
i f ( n%2==1) r e t *= a ;
a *= a ;
n /= 2 ;
}
return ret ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 5 / 38


Algebra Linear

Resolve sistemas de equações lineares


Inverter uma matriz
Encontrar o posto de uma matriz
Computar o determinante de uma matriz
Todas essas tarefas podem ser realizadas com o método de eliminação
de Gauss.

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 6 / 38


Eliminação de Gauss

#i n c l u d e < s t d i o . h>
#i n c l u d e <math . h>
#i n c l u d e <v e c t o r >
u s i n g namespace s t d ;
t y p e d e f l o n g do u bl e LD ;
LD EPS = 1 e −8;
t y p e d e f s t r u c t MATRIX
{
i n t n ,m;
v e c t o r < v e c t o r <LD> > a ;
v o i d r e s i z e ( i n t x , i n t y , LD v = 0 . 0 ) ;
LD Gauss ( ) ;
int inverse ();
v e c t o r <LD> o p e r a t o r * ( v e c t o r <LD> v ) ;
MATRIX o p e r a t o r * (MATRIX M1 ) ;
v o i d show ( ) ;
}MATRIX ;

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 7 / 38


Eliminação de Gauss

v o i d MATRIX : : r e s i z e ( i n t x , i n t y , LD v )
{
n=x ;
m=y ;
a . resize (n );
f o r ( i n t i =0; i <n ; i ++) a [ i ] . r e s i z e (m, v ) ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 8 / 38


Eliminação de Gauss
LD MATRIX : : Gauss ( )
{
int i , j , k ;
LD d e t =1.0 , r ;
f o r ( i =0; i <n ; i ++)
{
f o r ( j=i , k=−1; j <n ; j ++) i f ( f a b s ( a [ j ] [ i ]) >EPS )
{ k=j ; j=n +1; }
i f ( k <0) {
n =0; r e t u r n 0 . 0 ;
}
i f ( k != i ) { swap ( a [ i ] , a [ k ] ) ; d e t=−d e t ; }
r=a [ i ] [ i ] ; d e t *= r ;
f o r ( j=i ; j <m; j ++) a [ i ] [ j ]/= r ;
f o r ( j=i +1; j <n ; j ++)
{
r=a [ j ] [ i ] ;
f o r ( k=i ; k<m; k++) a [ j ] [ k]−=a [ i ] [ k ] * r ;
}
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 9 / 38


Eliminação de Gauss

f o r ( i=n −2; i >=0; i −−)


f o r ( j=i +1; j <n ; j ++)
{
r=a [ i ] [ j ] ;
f o r ( k=j ; k<m; k++) a [ i ] [ k]−= r * a [ j ] [ k ] ;
}
return det ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 10 / 38


Eliminação de Gauss

i n t MATRIX : : i n v e r s e ( )
// assume n=m. r e t u r n s 0 i f n o t i n v e r t i b l e
{
int i , j , i i ;
MATRIX T ; T . r e s i z e ( n , 2 * n ) ;
f o r ( i =0; i <n ; i ++) f o r ( j =0; j <n ; j ++) T . a [ i ] [ j ]= a [ i ] [ j ] ;
f o r ( i =0; i <n ; i ++) T . a [ i ] [ i+n ] = 1 . 0 ;
T . Gauss ( ) ;
i f (T . n==0) r e t u r n 0 ;
f o r ( i =0; i <n ; i ++) f o r ( j =0; j <n ; j ++) a [ i ] [ j ]=T . a [ i ] [ j+n ] ;
return 1;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 11 / 38


Eliminação de Gauss

v e c t o r <LD> MATRIX : : o p e r a t o r * ( v e c t o r <LD> v )


// assume v i s o f s i z e m
{
v e c t o r <LD> r v ( n , 0 . 0 ) ;
int i , j ;
f o r ( i =0; i <n ; i ++)
f o r ( j =0; j <m; j ++)
r v [ i ]+=a [ i ] [ j ] * v [ j ] ;
return rv ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 12 / 38


Eliminação de Gauss

v e c t o r <LD> s o l v e (MATRIX& M, v e c t o r <LD> v )


// r e t u r n t h e v e c t o r x s u c h t h a t Mx = v ; x i s empty i f M i s n o t
{
v e c t o r <LD> x ;
MATRIX M1=M;
i f ( ! M1 . i n v e r s e ( ) ) r e t u r n x ;
r e t u r n M1* v ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 13 / 38


Eliminação de Gauss

LD d e t (MATRIX &M)
// compute t h e d e t e r m i n a n t o f M
{
MATRIX M1=M;
LD r=M1 . Gauss ( ) ;
i f (M1 . n==0) r e t u r n 0 . 0 ;
return r ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 14 / 38


1 Algebra

2 Teoria dos números

3 Combinatória

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 15 / 38


Teste de primalidade

bool is prime ( int n) {


i f ( n < 0 ) r e t u r n i s p r i m e (−n ) ;
i f ( n < 5 | | n % 2 == 0 | | n % 3 == 0 )
r e t u r n ( n == 2 | | n == 3 ) ;
i n t maxP = s q r t ( n ) + 2 ;
f o r ( i n t p = 5 ; p < maxP ; p += 6 )
i f ( n % p == 0 | | n % ( p+2) == 0 )
return f a l s e ;
return true ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 16 / 38


Fatoração em primos

#i n c l u d e <map>
t y p e d e f map<i n t , i n t > prime map ;
v o i d s q u e e z e ( prime map& M, i n t& n , i n t p ) {
f o r ( ; n % p == 0 ; n /= p ) M[ p]++;
}
prime map f a c t o r ( i n t n ) {
prime map M;
i f ( n < 0 ) r e t u r n f a c t o r (−n ) ;
i f ( n < 2 ) r e t u r n M;
s q u e e z e (M, n , 2 ) ;
s q u e e z e (M, n , 3 ) ;
i n t maxP = s q r t ( n ) + 2 ;
f o r ( i n t p = 5 ; p < maxP ; p += 6 ) {
s q u e e z e (M, n , p ) ;
s q u e e z e (M, n , p +2);
}
i f ( n > 1 ) M[ n]++;
r e t u r n M;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 17 / 38


Crivo TrialFactorization
// C o m p l e x i t y : O( n ˆ 2 / ( l o g n ) ˆ 2 )
v e c t o r <i n t > S i e v e T r i a l F a c t o r i z a t i o n ( i n t n ) {
v e c t o r <i n t > p r i m e s ;
primes . push back ( 2 ) ;
primes . push back ( 3 ) ;
f o r ( i n t p = 5 ; p <= n ; p += 2 )
{
bool is prime = true ;
f o r ( i n t i = 1 ; i < p r i m e s . s i z e ( ) ; i ++)
{
int k = primes [ i ] ;
i f ( k * k > p ) break ;
i f ( p%k == 0 )
{
is prime = false ;
break ;
}
}
if ( is prime )
{
primes . push back (p ) ;
}
}
return primes ;
} Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 18 / 38
Crivo de Erathostenes
// C o m p l e x i t y : O( n l o g l o g n )
v e c t o r <i n t > S i e v e E r a t h o s t e n e s ( i n t n ) {
v e c t o r <b o o l > S ;
v e c t o r <i n t > p r i m e s ;
f o r ( i n t p = 0 ; p <= n ; p++) S . p u s h b a c k ( t r u e ) ;

S[1] = false ;
f o r ( i n t p = 2 ; p * p <= n ; p++){
i f (S [ p ]){
f o r ( i n t q = p * p ; q <= n ; q += p )
{
S[q] = false ;
}
}
}
f o r ( i n t p = 2 ; p <= n ; p++){
i f (S [ p ] ) primes . push back (p ) ;
}
return primes ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 19 / 38


Crivo Linear de Pritchard
// C o m p l e x i t y : O( n )
v e c t o r <i n t > L i n e a r S i e v e P r i t c h a r d ( i n t n ) {
v e c t o r <b o o l > S ;
f o r ( i n t p = 0 ; p <= n ; p++) S . p u s h b a c k ( t r u e ) ;
S[1] = false ;
v e c t o r <i n t > p r i m e s = S i e v e E r a t h o s t e n e s ( c e i l ( s q r t ( n ) ) ) ;

f o r ( i n t f = 2 ; f <= n / 2 ; f=f +1){


f o r ( i n t i = 0 ; i < p r i m e s . s i z e ( ) ; i ++)
{
int p = primes [ i ] ;
i f ( p > n/ f ) break ;
S [ p* f ] = f a l s e ;
i f ( f%p==0) break ;
}
}
f o r ( i n t k = p r i m e s [ p r i m e s . s i z e () −1] + 2 ; k <= n ; k += 2 )
{
i f (S [ k ] ) primes . push back ( k ) ;
}
return primes ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 20 / 38


N = 100000000

SieveErathostenes SieveTrialFactorization Linear Sieve Pritchard


18.49700 81.54500 12.46000

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 21 / 38


Máximo Divisor Comum

gcd(a, b) : maior inteiro que divide a e b.


gcd(a, b) = gcd(a, b − a)
gcd(a, b) = gcd(b, a%b)
gcd(a, 0) = a
gcd(a, b) é o menor inteiro positivo em {ax + by |x, y ∈ Z}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 22 / 38


Algoritmo de Euclides

Example:
gcd(15,12) = gcd(12,15%12)
= gcd(12, 3)
= gcd(3, 12 %3)
= gcd(3, 0)
= 3

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 23 / 38


Implementação

i n t gcd ( i n t a , i n t b ) {
while ( b ){
i n t r = a%b ;
a = b;
b = r;
}
return a ;
}

Complexidade de tempo: O( log (a+b) )

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 24 / 38


Algoritmo de Euclides Estendido

gcd(a, b) = ax + by para algum inteiro x e y


Os inteiros x e y pode ser encontrados usando o algoritmo de euclides
estendido.
Example: a = 15, b = 12
r q x y
7 * 1 0
5 * 0 1
2 1 1 -1
1 2 -2 3
gcd(7,5) = 7(-2)+5(3) = 1

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 25 / 38


Algoritmo de Euclides Estendido
i n t gcd ( i n t a , i n t b , i n t & x , i n t & y )
{
int q , t ;
i n t x1 , y1 ;
x = 1 , y = 0;
x1 = 0 , y1 = 1 ;
while (b)
{
q = a /b ;
t = b;
b = a − q*b ;
a = t;
t = x1 ;
x1 = x − q * x1 ;
x = t;
t = y1 ;
y1 = y − q * y1 ;
y = t;
}
return a ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 26 / 38


Inverso Multiplicativo Modular

a−1 é o inverso multiplicativo de a módulo n se somente se


aa−1 = 1(mod n)
Se gcd(a, n) = 1 então ax + ny = 1 para algum x, y ∈ Z
Tomando módulo n, temos ax = 1(mod n)
x é o inverso de a(mod n).
Example: Qual é o inverso de 55−1 (mod 89)?
I gcd(55,89) = 1 = 55(34) + 89(-21)
I 55(34) = 1 (mod 89)
I 34 é inverso de 55 módulo 89.

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 27 / 38


Inverso Multiplicativo Modular

/ * a pode s e r n e g a t i v o e n > 0 * /
i n t mod ( i n t a , i n t n ) {
p r i n t f ( ”mod(%d,%d ) = %d\n ” , a , n , ( a%n ) + a < 0 ? n : 0 ) ;
r e t u r n ( a%n + n)%n ;
}

i n t invmod ( i n t a , i n t n ) {
int d , x , y ;
d = gcd ( a , n , x , y ) ;
i f ( d==1)
r e t u r n mod ( x , n ) ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 28 / 38


Congruência Linear

/*
Achar a menor s o l u ç ã o n e g a t i v a de ax = b ( mod m)
Caso c o n t r á r i o , r e t o r n a −1
*/
i n t s o l v e m o d ( i n t a , i n t b , i n t m) {
i f (m < 0 ) r e t u r n s o l v e m o d ( a , b,−m) ;
i f ( a < 0 | | a>=m | | b < 0 | | b>=m)
s o l v e m o d ( mod ( a ,m) , mod ( b ,m) , m) ;
d = gcd ( a ,m, x , y ) ;
i f ( b %d != 0 ) r e t u r n −1;
e l s e r e t u r n mod ( x * ( b/d ) , m ) ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 29 / 38


1 Algebra

2 Teoria dos números

3 Combinatória

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 30 / 38


Computando Coeficiente Binomial

Calcule utilizando afórmula:



n n(n − 1) . . . (n − k + 1)
=
k k!

typedef long long i n t l l i ;


l l i binom2 ( i n t n , i n t k ) {
i f (k > n) return 0;
i f ( n == k ) r e t u r n 1 ;
i f ( k > n−k ) k = n−k ;
l l i c = 1;
f o r ( i n t i = 1 ; i <= k ; i ++){
c *= n−−;
c /= i ;
}
return c ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 31 / 38


Computando Coeficiente Binomial
Use o triângulo de Pascal

  
n 1 ,k = 0
= 1 ,k = n
k  n−1
 n−1

k−1 + k , caso contrário

#d e f i n e MAX 100
typedef long long i n t l l i ;
l l i C [MAX+ 1 ] [MAX+ 1 ] ;
void prebinom (){
C [ 0 ] [ 0 ] = 1LL ;
f o r ( i n t i = 1 ; i <= MAX; i ++){
f o r ( i n t j = 0 ; j <= i ; j ++){
i f ( j ==0) C [ i ] [ j ] = 1LL ;
e l s e i f ( j == i ) C [ i ] [ j ] =1LL ;
e l s e C [ i ] [ j ] = C [ i − 1 ] [ j −1] + C [ i − 1 ] [ j ] ;
}
}
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 32 / 38


Sequência de Fibonacci

Definição recursiva:
F0 = 0
F1 = 1
Fn = Fn−1 + F n − 2
Complexidade O(n)
Fórmula Fechada
√ √
Fn = √1 (( 1+ 5 )n − ( 1−2 5 )n )
5 2

I Não pode ser computado exatamente para valores grandes


I Complexidade O(1)

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 33 / 38


Sequência de Fibonacci

Matriz de Recorrência
       n  
Fn+1 1 1 Fn 1 1 F
= × = × 1 (1)
Fn 1 0 Fn−1 1 0 F0

Pode ser calculado em O(lgn) usando exponenciação rápida

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 34 / 38


Exponenciação rápida de matriz

t e m p l a t e < c l a s s T> c l a s s m a t r i x {
public :
i n t m, n ;
v e c t o r < v e c t o r <T> > a ;
m a t r i x ( i n t m = 0 , i n t n =0);
v e c t o r <T>& o p e r a t o r [ ] ( i n t i ) { r e t u r n a [ i ] ; }
m a t r i x o p e r a t o r * ( m a t r i x M1 ) ;
m a t r i x power ( m a t r i x <T> M, i n t n ) ;
};

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 35 / 38


Exponenciação rápida de matriz

t e m p l a t e < c l a s s T>
m a t r i x <T> : : m a t r i x ( i n t m , i n t n ) : m(m) , n ( n ) {
a . r e s i z e (m) ;
f o r ( i n t i = 0 ; i < m; i ++) a [ i ] . r e s i z e ( n ) ;
}
t e m p l a t e < c l a s s T>
m a t r i x <T> m a t r i x <T> : : o p e r a t o r * ( m a t r i x <T> M1) {
m a t r i x R( n , M1 .m) ;
int i , j , k ;
f o r ( i =0; i <n ; i ++)
f o r ( j =0; j <M1 .m; j ++)
f o r ( k =0; k<m; k++)
R . a [ i ] [ j ]+=a [ i ] [ k ] * M1 . a [ k ] [ j ] ;
return R;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 36 / 38


Exponenciação rápida de matriz

t e m p l a t e < c l a s s T>
m a t r i x <T> m a t r i x <T> : : power ( m a t r i x <T> M, i n t n ) {
i f ( n==0 | | n==1)
r e t u r n M;
m a t r i x R = power (M, n / 2 ) ;
R = R*R ;
i f ( n&1){
R = R*M;
}
return R;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 37 / 38


Exponenciação rápida de matriz
i n t f i b o n a c c i ( i n t n ){

m a t r i x <i n t > M( 2 , 2 ) ;
M[ 0 ] [ 0 ] = 1 ;
M[ 0 ] [ 1 ] = 1 ;
M[ 1 ] [ 0 ] = 1 ;
M[ 1 ] [ 1 ] = 0 ;

i f ( n ==0|| n==1) r e t u r n n ;

M = M. power (M, n −1);


// [ F {n} F {n−1} ]
// [ F {n−1} F {n−2} ]
f o r ( i n t i =0; i <2; i ++){
f o r ( i n t j =0; j <2; j ++) p r i n t f ( ”%d ” , M[ i ] [ j ] ) ;
p r i n t f ( ”\n ” ) ;
}

r e t u r n M[ 0 ] [ 0 ] ;
}

Wladimir Araújo Tavares (UFC) Desafios de Programação Matemática 16 de março de 2017 38 / 38

Anda mungkin juga menyukai