Clasa a VI-a lecția 4

From Algopedia
Revision as of 13:30, 20 September 2018 by Bella (talk | contribs) (Ciurul lui Eratostene)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Lectie

Descompunerea in factori primi

O implementare a acestei probleme de complexitate O(sqrt(n)):

#include <stdio.h>

int main() {
  int n, div, exp;

  scanf("%d", &n);
  div = 2; //Incepem cautarea factorilor primi de la primul numar prim
  while ( div * div <= n ) { //Cautam factorii primi pana la radicalul lui n
    exp = 0;
    while ( n % div == 0 ) {
      n /= div;
      exp++;
    }
    if (exp > 0)
      printf("%d^%d\n", div, exp);
    div++;
  }
  // daca n mai contine un factor, el este un numar prim la puterea unu
  if ( n > 1 )
    printf( "%d^1\n", n );

  return 0;
}

Numarul de divizori si suma divizorilor

Fie descompunerea unui numar n in factori primi:

n=d1p1d2p2...dkpk

Numarul de divizori va fi

nrdiv=(p1+1)(p2+1)...(pk+1)

Suma divizorilor

sdiv=d1p1+11d11d2p2+11d21...dkpk+11dk1

Indicatorul lui Euler

Indicatorul lui Euler calculeaza numarul de numere din intervalul [1, n], prime cu n.

Ciurul lui Eratostene

Reamintim aici doar algoritmul studiat anul trecut:

char ciur[2000000];
...
fscanf( fin, "%d", &n );
ciur[0] = ciur[1] = 1;
for ( d = 2; d * d <= n; d++ )
  if ( ciur[d] == 0 ) // daca d este prim
    for ( i = d * d; i <= n; i = i + d ) // vom marca numerele din d in d
      ciur[i] = 1;

Nu uitați:

  • Vectorul ciur[] este de tip caracter și nu întreg!
  • În final vectorul ciur[i] este 0 dacă numărul este prim sau 1 în caz contrar.

Complexitate? Matematica este complexă, dar rețineți că metoda este aproximativ O(n) pentru valorile lui n cu care vom lucra noi. Pentru cei interesați, complexitatea este de fapt O(n∙log log n).

Calculul multiplicității unui număr prim în n!

Matematicianul Adrien-Marie_Legendre a descoperit că multiplicitatea (exponentul) unui număr prim p care apare în descompunerea în factori primi a lui n! poate fi exprimată exact ca:

Exp(p,n!)=np+np2+np3+=i=1npi.

Acest fapt se bazează pe numărarea factorilor p ai întregilor de la 1 la n. Numărul multiplilor lui p în numerele de la 1 la n este np; dar această formulă numără numerele cu doi factori p o singură dată. De aceea trebuie să mai numărăm încă np2 factori ai lui p. În mod similar pentru trei, patru, cinci factori, pînă la infinit. Însă suma este finită deoarece p i este mai mic sau egal cu n într-un număr finit de valori ale lui i, drept care funcția parte întreagă va fi zero pentru toate celelalte valori.

Cînd scriem programul pentru calculul exponentului ne vom opri la acel i pentru care pi > n.

Calculul multiplicității unui număr prim la o putere în n!

Este simplu de demonstrat că dacă avem un număr prim p la o putere k atunci multiplicitatea lui pk în n! este

Exp(pk,n!)=Exp(p,n!)k

Calculul multiplicității unui număr oarecare în n!

Este simplu să arătăm că dacă avem un număr a a cărui descompunere în factori primi este

a = p1k1 • p2k2 • … • pmkm

atunci multiplicitatea (exponentul) lui a în n! este

Exp(a,n!)=min(Exp(p1k1,n!),Exp(p2k2,n!),,Exp(pmkm,n!))

sau

Exp(a,n!)=min(Exp(p1,n!)k1,Exp(p2,n!)k2,,Exp(pm,n!)km)

TEMA

Ciur

Ciur, Compactare Ciur

  • prime1, campion2005 (inca nu e pusa)

http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=365

Ciur, (Compactare ciur), Legendre