Pe scurt
Exponențierea rapidă calculează pentru exponent întreg nenegativ prin înjumătățirea repetată a exponentului. Dacă este par, ; dacă este impar, păstrăm încă un factor . Astfel, se obține din factori corespunzători cifrelor 1 din scrierea lui 5 în baza 2 (): , nu prin cinci înmulțiri consecutive obligatorii.
În detaliu
Calculul lui prin înmulțiri consecutive necesită un număr de pași proporțional cu . Exponențierea rapidă se bazează pe scrierea exponentului în baza 2. Dacă sunt cifrele lui binare, atunci . Puterile se obțin prin pătrățiri succesive, iar la fiecare pas se verifică ultima cifră binară a exponentului, adică exp % 2. Ciclul are iterații: pentru sunt doar 60.
Metoda se potrivește calculului cu numere mari și testelor pe șiruri de puteri. Pentru se fac 5 iterații în loc de 29 de înmulțiri.
Invarianta ciclului este: este egal cu la începutul fiecărei iterații. La început rezultat=1, baza=a, exp=n. Dacă exp este impar, factorul baza trece în rezultat; apoi baza se pătrățește și exp se înjumătățește (împărțire întreagă). Când exp devine 0, rezultat este .
Exemplul 1 — . Exponentul are ultima cifră 1, apoi 0, apoi 1.
exp=5(impar):rezultat=1·3=3;baza=3²=9;exp=2.exp=2(par):rezultatrămâne 3;baza=9²=81;exp=1.exp=1(impar):rezultat=3·81=243;baza=81²=6561;exp=0.
Ciclul se oprește cu rezultat=243, adică . S-au făcut trei iterații în loc de patru înmulțiri consecutive.
baza = 3
exp = 5
rezultat = 1
while exp > 0:
if exp % 2 == 1:
rezultat *= baza
baza *= baza
exp //= 2
print(rezultat)
Pentru ciclul face patru iterații și numai două înmulțiri ale rezultatului, la cifrele 1 de pe pozițiile 1 și 3: . Pentru înmulțirile consecutive cer 39 de pași, pe când cere șase iterații și numai două înmulțiri ale rezultatului, cu și cu . Aceeași idee se scrie și recursiv: pentru par, pentru impar și ; ambele variante au același număr de pași, dar cea iterativă nu folosește stiva de apeluri.
Exemplul 2 — puterea modulo . La exponenți mari rezultatul depășește orice tip întreg, iar problemele cer restul. Se aplică restul după fiecare înmulțire, pentru că . Pentru , exponentul are trei cifre 1:
#include <iostream>
using namespace std;
int main() {
long long baza = 3, exp = 13, mod = 100, rezultat = 1;
while (exp > 0) {
if (exp % 2 == 1)
rezultat = rezultat * baza % mod;
baza = baza * baza % mod;
exp /= 2;
}
cout << rezultat;
return 0;
}
Programul afișează 23, deoarece și restul împărțirii la 100 este 23. Valorile lui baza modulo 100 sunt 3, 9, 81, 61, iar factorii aleși sunt 3, 81 și 61 (exponenții 1, 4 și 8 ai lui 3 în ): și . Se folosește long long pentru ca produsul a două resturi mai mici decât să încapă în tip.
Exemplul 3 — și cazul . Exponentul are două cifre 0 la sfârșit, deci primele două iterații nu schimbă rezultat: la exp=12 și exp=6 baza devine 49, apoi 2401. La exp=3 (impar) rezultat=2401, iar baza devine . La exp=1 rezultatul este , adică . Valoarea depășește 2147483647, deci variabilele sunt long long. Pentru ciclul nu se execută și rămâne rezultat=1, valoare corectă pentru .
Atenție la ultima pătrățire. În ultima iterație baza se pătrățește chiar dacă valoarea nu mai este folosită; pentru ea ajunge la 33 232 930 569 601, încă în long long. La baze mari fără modul, această pătrățire inutilă poate depăși tipul înaintea rezultatului, deci se verifică limitele din enunț.
Greșeli frecvente
- Greșit: la exponent par se mai înmulțește rezultatul cu baza.Corect: acel factor se adaugă numai când exponentul este impar.
- Greșit:
baza *= bazaeste o adunare.Corect: pătrățește baza. - Greșit: pentru exponentul zero rezultatul este zero.Corect: pentru .
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMEC 4370/2026, anexa 8, Informatică IX intensiv, p. 155–156
- OMEC 6930/2025, anexa 66, Informatică IX CS militar, Monitorul Oficial nr. 4 bis/8.01.2026, pp. 2563–2578; cdn.edupedu.ro; centralizator oficial actualizat prin OMEC 3224/2026, legislatie.just.ro
Documente consultate
- Programa școlară de informatică, clasa a IX-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42), p. 1653–1654; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original)
