i32::isqrt în Rust

Rădăcina pătrată întreagă: cel mai mare număr întreg al cărui pătrat nu depășește valoarea (17.isqrt() = 4).

Sintaxă
const fn isqrt(self) -> i32
const fn checked_isqrt(self) -> Option<i32>

Ce face i32::isqrt

n.isqrt() returnează partea întreagă a rădăcinii pătrate, calculată exact, fără să treacă prin f64. Pentru numere mari (i64, u64), varianta prin (n as f64).sqrt() as i64 poate greși cu o unitate din cauza rotunjirii; isqrt nu.

Pentru un număr negativ, isqrt intră în panică, pentru că rădăcina nu există. checked_isqrt returnează None în acest caz. Tipurile fără semn (u32, u64) au doar isqrt, fără risc.

Ce returnează

i32 (checked_isqrt: Option<i32>).

Exemple

Exemplul 1: Rădăcini întregi și pătrate perfecte

fn main() {
    for n in [0_i32, 1, 15, 16, 17, 99, 100] {
        let r = n.isqrt();
        let perfect = r * r == n;
        println!("isqrt({n:>3}) = {r:>2}  pătrat perfect: {perfect}");
    }
    println!("checked_isqrt(-4) = {:?}", (-4_i32).checked_isqrt());
}

Rezultat

isqrt(  0) =  0  pătrat perfect: true
isqrt(  1) =  1  pătrat perfect: true
isqrt( 15) =  3  pătrat perfect: false
isqrt( 16) =  4  pătrat perfect: true
isqrt( 17) =  4  pătrat perfect: false
isqrt( 99) =  9  pătrat perfect: false
isqrt(100) = 10  pătrat perfect: true
checked_isqrt(-4) = None

Exemplul 2: Test de număr prim

Ajunge să încercăm împărțitorii până la rădăcina pătrată a numărului.

fn este_prim(n: i32) -> bool {
    n >= 2 && (2..=n.isqrt()).all(|d| n % d != 0)
}

fn main() {
    let prime: Vec<i32> = (1..=50).filter(|&n| este_prim(n)).collect();
    println!("{prime:?}");
    println!("2026 este prim: {}", este_prim(2026));
    println!("2027 este prim: {}", este_prim(2027));
}

Rezultat

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
2026 este prim: false
2027 este prim: true

Greșeli frecvente

  • Apelezi isqrt pe un număr care poate fi negativ: panică. Folosește checked_isqrt.
  • Folosești (n as f64).sqrt() as u64 pentru numere foarte mari: rezultatul poate fi greșit cu 1.

Comenzi înrudite

  • f64::sqrt: Rădăcina pătrată a numărului; pentru numere negative rezultatul este NaN.
  • i32::pow: Ridică numărul la o putere întreagă nenegativă: 2.pow(10) = 1024.
  • i32: Tipul implicit pentru numere întregi cu semn, pe 32 de biți: de la -2147483648 la 2147483647.