BigInt.pow în Dart

Ridică un BigInt la o putere întreagă, cu rezultat exact; modPow calculează puterea modulo un număr.

Sintaxă
BigInt pow(int exponent)
BigInt modPow(BigInt exponent, BigInt modulus)

Ce face BigInt.pow

baza.pow(n) returnează baza la puterea n, cu toate cifrele: BigInt.two.pow(100) are 31 de cifre exacte. Exponentul este un int nenegativ; un exponent negativ aruncă ArgumentError.

Funcția pow din dart:math lucrează cu num și, pentru numere mari, fie depășește limita lui int, fie dă un double aproximativ. Cu BigInt rezultatul este mereu exact.

Pentru puteri uriașe din care îți trebuie doar restul (criptografie, verificări) folosește modPow(exponent, modul): calculează rapid fără să construiască numărul întreg.

Parametri

Parametru Descriere
exponent Puterea (int ≥ 0 la pow).
modulus La modPow: numărul la care se ia restul.

Ce returnează

Un BigInt.

Exemple

Exemplul 1: Puteri exacte

math.pow(2, 100) lucrează cu int și depășește limita de 64 de biți, așa că afișează 0. BigInt dă rezultatul exact.

import 'dart:math' as math;

void main() {
  var p = BigInt.two.pow(100);
  print(p);
  print(p.toString().length);
  print(math.pow(2, 100));
  print(BigInt.from(10).pow(25));
  print(BigInt.from(3).modPow(BigInt.from(200), BigInt.from(1000)));
}

Rezultat

1267650600228229401496703205376
31
0
10000000000000000000000000
1

Exemplul 2: Dobândă compusă cu bani în bani

Lucrăm în bani (sutimi de leu) și cu factorul 105/100 ridicat la puterea anilor, ca să nu apară erori de rotunjire până la final.

void main() {
  var depus = BigInt.from(1000000);
  const perioade = {1: 'un an', 10: '10 ani', 30: '30 de ani'};
  for (var ani in perioade.keys) {
    var factorSus = BigInt.from(105).pow(ani);
    var factorJos = BigInt.from(100).pow(ani);
    var bani = depus * factorSus ~/ factorJos;
    var lei = bani ~/ BigInt.from(100);
    var rest = (bani % BigInt.from(100)).toString().padLeft(2, '0');
    print('După ${perioade[ani]} la 5%: $lei,$rest lei');
  }
}

Rezultat

După un an la 5%: 10500,00 lei
După 10 ani la 5%: 16288,94 lei
După 30 de ani la 5%: 43219,42 lei

Greșeli frecvente

  • Dai un BigInt ca exponent: x.pow(BigInt.two) nu compilează. Exponentul lui pow este un int.

Comenzi înrudite

  • BigInt: Numere întregi oricât de mari, fără depășire; BigInt.from transformă un int, BigInt.one este valoarea 1.
  • pow: Ridică un număr la o putere; cu baza și exponentul întregi dă int, altfel double.
  • int.gcd: gcd dă cel mai mare divizor comun; modPow calculează (n la puterea e) modulo m, fără depășire.