Isqrt integer square root of X

There is a task Integer roots that covers a similar operation, with the caveat that it will calculate any nth root (including 2) not just square roots.

See the Integer roots Raku entry.

Quadratic residue algorithm follows:

use Lingua::EN::Numbers;

sub isqrt ( \x ) { my ( $X, $q, $r, $t ) =  x, 1, 0 ;
    $q +<= 2 while $q ≤ $X ;
    while $q > 1 {
        $q +>= 2; $t = $X - $r - $q; $r +>= 1;
        if $t ≥ 0 { $X = $t; $r += $q }
    }
    $r
}

say (^66)».&{ isqrt $_ }.Str ;

(1, 3…73)».&{ "7**$_: " ~ comma(isqrt 7**$_) }».say

Output:

0 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8
7**1: 2
7**3: 18
7**5: 129
7**7: 907
7**9: 6,352
7**11: 44,467
7**13: 311,269
7**15: 2,178,889
7**17: 15,252,229
7**19: 106,765,608
7**21: 747,359,260
7**23: 5,231,514,822
7**25: 36,620,603,758
7**27: 256,344,226,312
7**29: 1,794,409,584,184
7**31: 12,560,867,089,291
7**33: 87,926,069,625,040
7**35: 615,482,487,375,282
7**37: 4,308,377,411,626,977
7**39: 30,158,641,881,388,842
7**41: 211,110,493,169,721,897
7**43: 1,477,773,452,188,053,281
7**45: 10,344,414,165,316,372,973
7**47: 72,410,899,157,214,610,812
7**49: 506,876,294,100,502,275,687
7**51: 3,548,134,058,703,515,929,815
7**53: 24,836,938,410,924,611,508,707
7**55: 173,858,568,876,472,280,560,953
7**57: 1,217,009,982,135,305,963,926,677
7**59: 8,519,069,874,947,141,747,486,745
7**61: 59,633,489,124,629,992,232,407,216
7**63: 417,434,423,872,409,945,626,850,517
7**65: 2,922,040,967,106,869,619,387,953,625
7**67: 20,454,286,769,748,087,335,715,675,381
7**69: 143,180,007,388,236,611,350,009,727,669
7**71: 1,002,260,051,717,656,279,450,068,093,686
7**73: 7,015,820,362,023,593,956,150,476,655,802

Last updated