Carré ou pas ?

Comment savoir si un nombre, trop grand pour être factorisable, est un carré ?

Réponses

  • Tu calcules sa racine carrée entière (integer square root) ?
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Méthode de Newton discrétisée. Etant donné $a \in \N$, détermination de l'entier $x$ vérifiant $x^2 \le a < (x+1)^2$ via la suite :
    $$
    a_{n+1} = \left\lfloor {a_n + \lfloor a / a_n \rfloor \over 2} \right\rfloor \quad
    \text{ où } a_0 \text{ est choisi correctement. On attend que } a_n \le a_{n+1} \text{. Cf un vieux truc attaché}
    $$
    Animation (je reconnais que ce n'est pas aussi joli que tes dessins). Un premier petit exemple : la fonction $F$ est l'itérateur de Newton
    [color=#000000]
    > a := 101 ;                                 
    > F := func < x | (x + a div x) div 2 > ;
    > x := a ; count := 0 ;
    > while true do
    while> y := F(x) ;
    while> if y ge x then break ; end if ;
    while> x := y ; count := count + 1 ; 
    while> end while ;
    > 
    > x ;
    10
    > count ;
    4
    [/color]
    
    Un autre exemple moins petit : l'entier $a$ possède 290 chiffres décimaux
    [color=#000000]
    > a := NextPrime(10^70) * NextPrime(10^100) * NextPrime(10^120) ;                    
    > Ilog(10, a) ;
    290
    > F := func < x | (x + a div x) div 2 > ;
    > x := a ; count := 0 ;
    > time while true do
    time|while> y := F(x) ;
    time|while> if y ge x then break ; end if ;
    time|while> x := y ; count := count + 1 ; 
    time|while> end while ;
    Time: 0.010
    > 
    > count ;
    490
    > x^2 le a and a lt (x+1)^2 ;                                                        
    true
    [/color]
    
  • L'algorithme (à la potence, par tranche de deux chiffres) de calcul de racine carrée d'un nombre de taille (nombre de chiffres) $\tau$ est polynomial en $\tau$, en $O(\tau^2)$ je dirais. Tout à fait raisonnable, donc.
  • Voici ce que prône Henri Cohen pour tester si un entier $n$ est un carré et calculer la racine carrée de $n$ :
    • tester si $n\pmod{64}$ est un carré : si non, $n$ n'est pas un carré ; si oui, continuer ;
    • calculer $n\pmod{45045}$ pour les calculs suivants ;
    • tester si $n\pmod{63}$ est un carré : si non, $n$ n'est pas un carré ; si oui, continuer ;
    • tester si $n\pmod{65}$ est un carré : si non, $n$ n'est pas un carré ; si oui, continuer ;
    • tester si $n\pmod{11}$ est un carré : si non, $n$ n'est pas un carré ; si oui, continuer ;
    • calculer la racine carrée entière – Cohen donne la même méthode que Claude et voir si c'est bien la racine carrée.
  • Merci pour vos réponses rapides.
    Newton est une méthode du deuxième ordre.
    Je suppose qu'on peut suivre l'évolution de l'erreur
    $r_n-\sqrt{a}$ et attendre qu'elle soit assez petite.
  • A-t-on besoin de divisions ? Etant donné $b^2 \le a$ trouver un $c$ de taille raisonnable (disons $c \ge \frac{\lfloor \sqrt{a}\rfloor - b}{4}$)
    tel que $b^2+2bc+c^2 \le a$ ne doit pas être difficile à partir du nombre de bits de $b$ et $a-b^2$
  • Hello,
    Dans ma vieille note, je dis qu'il faut choisir $a_0$ tel que $a_0^2 \ge a$, avec $a_0$ le plus petit possible. Je ne me souviens plus comment on peut le faire intelligemment (sans utiliser la racine carrée entière évidemment). Dans mon premier post, j'ai pris $a_0 = a$. Là, je recommence (avec la même donnée) en trichant un tantinet pour partir d'un $a_0$ moindre, noté $x$ ci-dessous.
    [color=#000000]
    > a := NextPrime(10^70) * NextPrime(10^100) * NextPrime(10^120) ;
    > F := func < x | (x + a div x) div 2 > ;
    > x := 2^((Ilog(2,a) + 1) div 2) ;  // CQ, gros tricheur
    > x^2 ge a ;
    true
    > count := 0 ;
    > time while true do                                             
    time|while> y := F(x) ;
    time|while> if y ge x then break ; end if ;
    time|while> x := y ; count := count + 1 ;
    time|while> end while ;
    Time: 0.000
    > count ;
    8
    > x^2 le a and a lt (x+1)^2 ;
    true
    [/color]
    
    C'est juste pour montrer la sensibilité par rapport au point de départ $a_0$.
  • $N> 0$ est un carré si et seulement si $N-1=a(a+2)$ pour un certain entier $a$.

    En effet,

    Si $N=b^2$, $b$ entier naturel, alors $N-1=b^2-1=(b-1)(b+1)$ et on prend $a=b-1$
  • L'algorithme "à la potence" en découpant en paquets de deux chiffres ne se débrouille pas mal. En Sage :
    def racent(n) :
        L=n.digits(100)
        a=0
        r=0
        while L != [] :
            p=L.pop()
            r=100*r+p
            t=0
            while (20*a+t+1)*(t+1)<=r :
                t+=1
            r=r-(20*a+t)*t
            a=10*a+t
        if r==0 : print n,"est un carré et sa racine carrée est", a
        else : print n,"n'est pas un carré et la partie entière de sa racine carrée est",a
    

    Un essai avec un non carré :
    n = next_prime(10^70) * next_prime(10^100) * next_prime(10^120)
    %time racent(n)
    
    100000000000000000000000000000000000000000000000000000000000000000000330000000000000000000000000002670000000000000000007900000000000000000000000000000000000000000000008811000000000000000026070000000000000000000000000210930000000000000000000000000000000000000000000000000000000000000000696069 n'est pas un carré et la partie entière de sa racine carrée est 10000000000000000000000000000000000000000000000000000000000000000000016500000000000000000000000000133500000000000000000394999999999999999986387500
    CPU times: user 1.31 ms, sys: 0 ns, total: 1.31 ms
    Wall time: 874 µs
    
    et un essai avec un carré :
    n=next_prime(ZZ(17*range(10),10))^2*next_prime(ZZ(17*range(9),10))^2
    %time racent(n)
    
    7494740442802098708819262955323943219619028627667319904288348303186392067854111534452995987780416681434232973286043022374187866927619733001745655425367439406561176034422328567272389892769129178705810126398012626836920021207613178837196440179239864631186420667989001390663755734664384556071466536746583687349340421049741559489948004401797128440910758881241500049653188958640585308462313669045151357371867591139748440718423428004845596674709260244183750979745992199529695986351801821057064556456851795087241809447022148069663249203782599597568992218174010791546084133203382168990054595919749654136755494699793265419164314346341699613517052129670249 est un carré et sa racine carrée est 86572168985200426875063252664049535242948163500838026326627012609205911237463801100289590086572168985200426875063252664049535242948163500838026326627069905349798090535253301356812486926085405483012697338705426524274699442831626734687319463872888736791445664083301356812486926085405483012697338705426524274699442831626915693
    CPU times: user 4.23 ms, sys: 11 µs, total: 4.24 ms
    Wall time: 3.22 ms
    
  • En base $b=10$

    Etant donné $a = \lfloor n^{1/2} \rfloor$ et $m \in [0,b^2-1]$ alors $\lfloor (b^2 n+m)^{1/2} \rfloor = ab + t$ où $t \in [0,b-1]$ que tu trouves juste en essayant $t=0,1,\ldots$ jusqu'à que $(ab+t+1)^2 > b^2n+m$
  • @reuns : tu décris l'algorithme "à la potence" bien connu que j'ai codé (as-tu lu le code ?), sauf que dans cet algorithme bien connu on a calculé $r=n-a^2$, et qu'on essaie $t$ jusqu'à ce que $(2ab+t+1)(t+1)>b^2r+m$. On remplace ensuite $a$ par $ab+t$ et $r$ par $b^2r+m-(2ab+t)t$.
  • L'examen des derniers chiffres à droite du nombre peut aussi servir de test rapide pour exclure la possibilité d'avoir affaire à un carré.
  • Je signale également, en ce Mercredi 8 Mai 2019, un critère qu'il est pas mal : un nombre entier $N$ est un carré si et seulement si il existe un nombre entier $c$ tel que $N^2 - 4 = (c-2)(c + 2)$. POUF-POUF (suite à GBZM) Bien sûr, je voulais dire $N - 4 = (c-2)(c+ 2)$
  • claude quitté écrivait:
    > Je signale également, en ce Mercredi 8 Mai 2019 un critère qu'il est pas mal : un nombre entier
    > $N$ est un carré si et seulement si il existe un nombre entier $c$ tel que $N^2 - 4 = (c-2)(c +
    2)$.

    Par exemple, $17$ est un carré parce que $17^2-4=(17-2)(17+2)$.

    L'humour demande un peu plus de soin, Claude. ;-)
  • @GBZM : vu (et corrigé). Et si ce n'était pas de l'humour ?
  • Petite question annexe sur la fin des carrés :

    2729² = 744 7441.

    Trouver les autres carrés qui se terminent par 7441.

    A la main, bien entendu.
  • Bonjour à tous

    Une réponse à la question de nodgim:

    $a(:=7441)$ est premier avec $10$ et la congruence $x^2=a$ modulo $10^4$ a une solution $x_1 (:=2729)$.

    Elle a donc exactement huit solutions: elle équivaut au système ( $x^2=a$ modulo $2^4$ ET $x^2=a$ modulo $5^4$), la première congruence ayant exactement quatre solutions et la seconde deux.

    $x_1$ étant solution, quatre des huit solutions sont $ \pm x_1, \pm (x_1+5000)$.

    Une cinquième $(:=x_5)$ s'obtient en résolvant $(x_1+ \epsilon 1250)^2=a$ modulo $10^4$, soit $\epsilon x_1+625=0$ modulo $4$, ou encore, vu que $625=1$ modulo $4$ et que $x_1:=2729=1$ modulo $4$, $\epsilon=-1$ et donc $x_5=x_1-1250$.

    Les quatre autres solutions sont donc $ \pm x_5, \pm (x_5+5000)$.

    Cordialement

    Paul
  • Dépasse, c'est tout à fait ça.
Connectez-vous ou Inscrivez-vous pour répondre.