Generarea șirurilor de numere
Introducere
De multe ori în problemele de informatică, apar șiruri de numere naturale care trebuie fie știute, cum va fi cazul unor șiruri consacrate precum șirul lui Fibonacci sau alte șiruri matematice precum cel al pătratelor sau cuburilor perfecte.
Deși la acest nivel, cele mai frecvent întâlnite aplicații sunt cele în care trebuie generate șirurile sau descoperite diverse reguli, aceste tehnici sunt foarte importante și trebuie însușite deoarece reprezintă un punct de plecare în vederea multor tehnici ce apar ulterior, în special când veți ajunge să învățați algoritmi mai avansați care duc cunoștințele de aici la un alt nivel.
Șiruri recurente
În general, când vom vorbi de șiruri de numere, ne vom concentra mai ales pe cele ai căror termeni se leagă unii de alții prin intermediul unor formule sau relații de recurență. Aceste șiruri se numesc recurente.
Definiție
Un șir recurent este un șir de numere naturale ai căror termeni sunt legați prin intermediul unei relații de recurență, sau în alte cuvinte, fiecare termen are o valoare care depinde de valoarea unuia sau mai multor termeni anteriori.
Exemplu
Un exemplu foarte simplu reprezintă șirul numerelor naturale pare, pentru care este binecunoscut faptul că fiecare valoare este cu 2 mai mare decât valoarea anterioară ().
În general, ne va interesa să putem genera aceste șiruri și să găsim regulile de generare pentru diverse șiruri de numere naturale. Vom continua prin a prezenta unele șiruri foarte întâlnite în probleme.
Progresii aritmetice
Definiție
O progresie aritmetică este un șir de numere astfel încât diferența dintre termenii consecutivi este constantă. De exemplu șirul este o progresie aritmetică cu o diferență comună de 2.
În general, putem defini o progresie aritmetică folosind primul termen și diferența între termeni consecutivi.
Astfel, dacă primul termen este și rația este , termenii progresiei aritmetice sunt
În general, pentru a afla suma primilor termeni ai unei progresii aritmetice, putem folosi formula următoare:
Fiecare dintre cei termeni conține , iar apoi următorii termeni au și .
Problemă exemplu - progresie3 - pbinfo
Pentru a afla în mod eficient dacă toate valorile aparțin aceleiași progresii aritmetice, trebuie să ținem un vector de frecvență în care memorăm aceste valori, iar mai apoi să verificăm dacă diferențele între oricare două valori distincte consecutive sunt egale.
--8 < --"usor/gen_sir/progresie3.cpp"Problemă rezolvată - sir1 pbinfo
Pentru a rezolva această problemă, ne folosim de proprietățile sumei lui Gauss (progresie aritmetică cu rația 1). Astfel, aflăm câte grupe complete de valori există în șir și apoi aflăm valoarea corespunzătoare ultimei grupe rămase.
--8 < --"usor/gen_sir/sir1.cpp"Progresii geometrice
Definiție
O progresie geometrică este un șir de numere astfel încât raportul dintre termenii consecutivi este constant. De exemplu șirul este o progresie geometrică cu raportul 2.
În general, putem defini o progresie geometrică folosind primul termen și raportul între termeni consecutivi.
Astfel, dacă primul termen este și raportul este , termenii progresiei aritmetice sunt
În general, pentru a afla suma primilor termeni ai unei progresii geometrice, putem folosi formula următoare:
În mod particular, dacă , suma primilor termeni este , deoarece toți termenii sunt constanți.
Această formulă se poate obține ușor dând factor comun pe și demonstrând suma prin inducție.
Șirul factorialelor numerelor naturale
Definiție
În matematică, factorialul unui număr întreg pozitiv , notat cu , este egal cu produsul numerelor naturale pozitive mai mici sau egale cu . Este o funcție numerică discretă și o operație unară (cu un singur operand).
Cu alte cuvinte,
Factorialul unui număr oarecare indică numărul de permutări (numărul de posibilități de rearanjare) ale unei mulțimi finite având elemente.
Primele câteva valori ale lui sunt următoarele:
Notă
Prin convenție, .
Observație
Factorialul poate fi definit și în funcție de valorile anterioare, unde , iar .
Se poate remarca faptul că valorile factorialelor cresc foarte repede:
- (deja depășește valoarea maximă pe care o putem stoca într-o variabilă de tip int)
- (deja depășește valoarea maximă pe care o putem stoca într-o variabilă de tip long long)
De asemenea, valorile factorialelor, începând de la se termină toate cu 0.
În mod particular, putem afla numărul de zerouri de la sfârșitul lui ținând cont de faptul că pentru a obține un zero, trebuie să avem un factor de 2 și unul de 5 (), iar factorii de 5 apar mult mai rar decât cei de 2.
În general, pe lângă aplicațiile ce implică noțiuni mai simple, factorialele se vor dovedi a fi esențiale în ceea ce privește combinatorica, unde apar în multe formule, începând de la noțiunile legate de permutări.
Problemă exemplu - Trailing Zeroes
Această problemă ne cere fix cerința de mai sus, aflarea numărului de 0 de la sfârșitul factorialului pentru un număr dat. Deoarece știm că avem un număr suficient de factori de 2 în acest produs, trebuie să analizăm de câte ori apare 5 în reprezentarea în factori primi a factorialului.
În primul rând, fiecare număr divizibil cu 5 adaugă un zero la acest produs. Dar acest lucru nu este suficient deoarece numerele multiplu de adaugă încă un zero, la fel și cele multiplu de ș.a.m.d.
Astfel, numărul de zerouri de la finalul scrierii lui este dat de formula
unde reprezintă partea întreagă a lui , iar este cea mai mare putere a lui 5 mai mică sau egală cu .
Formula lui Legendre
În mod similar, putem defini pentru un număr prim oarecare acest rezultat sub forma următoare:
Acest rezultat este cunoscut sub numele de formula lui Legendre.
--8 < --"usor/gen_sir/trailing_zeroes.cpp"Șirul lui Fibonacci
Șirul lui Fibonacci
Șirul , unde fiecare termen se poate afla ca fiind suma a doi termeni precedenți se numește șirul lui Fibonacci, denumite după matematicianul italian cu același nume.
Așa cum s-a menționat și în definiție, vom nota ca fiind cel de-al -lea număr Fibonacci, iar aceste numere pot fi definite astfel:
Aceste numere au numeroase proprietăți remarcabile, care au fost studiate de matematicieni și diverși alți oameni de știință, una dintre ele reprezintă faptul că pe măsură ce scriem numere fibonacci mai mari, raportul dintre două valori consecutive Fibonacci se apropie de numărul de aur.
Datorită acestui fapt, numerele Fibonacci cresc destul de repede, deja cel de-al 100-lea număr Fibonacci se apropie de limita maximă a long long, aici putând fi găsită o asemenea listă.
În informatică ne vom concentra mai ales pe găsirea acestor termeni și generalizarea unor proprietăți pe care le au numerele Fibonacci.
Pentru a afla cel de-al -lea număr Fibonacci, putem folosi un algoritm destul de simplu, care se bazează pe un for sau un while.
--8 < --"usor/gen_sir/fibonacci.cpp"Algoritm mai rapid
Există un algoritm mai rapid, care rulează în care se bazează pe cunoștințe mai avansate de algebră liniară și lucru cu matrici. Pentru mai multe detalii, puteți citi aici.
Problema exemplu - fibosum
Pentru a rezolva această problemă, trebuie să aflăm toate valorile Fibonacci mai mici sau egale cu , iar mai apoi să construim suma folosind termeni în ordine descrescătoare.
--8 < --"usor/gen_sir/fibosum.cpp"Concluzii
Șirurile de numere naturale sunt foarte importante deoarece apar în multe probleme algoritmice și leagă cunoștințele obținute la matematică cu aplicarea lor algoritmică.
Fie că e vorba de șiruri precum cel al lui Fibonacci sau diferitele șiruri matematice discutate, cunoașterea acestor noțiuni va deveni foarte importantă pentru orice programator începător și nu numai.
Probleme suplimentare
- Probleme în care se generează șiruri de pe pbinfo
- pbinfo fiboverif
- pbinfo generare
- pbinfo sirk
- pbinfo sumapatrate
- pbinfo regula
- OJI 2006 factori
- ONI 2019 fibofrac
- Lot Juniori 2010 fibo