<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>matematica &amp;mdash; GMP</title>
    <link>https://sharedblog.it/gmp/tag:matematica</link>
    <description></description>
    <pubDate>Fri, 10 Jul 2026 18:50:31 +0000</pubDate>
    <item>
      <title>GMP sqrt_exact cercare la radice quadrata, da due versanti</title>
      <link>https://sharedblog.it/gmp/gmp-sqrt_exact-cercare-la-radice-quadrata-da-due-versanti</link>
      <description>&lt;![CDATA[Provo in questi giorni a scrivere una nuova funzione per la libreria GMP una libreria di funzioni aritmetiche su numeri, principalmente interi, arbitrariamente grandi. La funzione, come spesso accade, partirebbe col ricombinare funzioni già esistenti perché facciano una cosa un poco diversa.&#xA;&#xA;L&#39;obiettivo è calcolare la radice quadrata di un numero intero, ma l&#39;idea forse un po&#39; peculiare è che il risultato ci interessa solo se il numero intero è un quadrato perfetto, ovverosia il quadrato di un numero a sua volta intero. In caso contrario, la funzione ci deve rispondere che il numero non è un quadrato, quindi la radice, negli interi, non esiste.&#xA;&#xA;Per i numeri interi, in GMP, c&#39;erano due funzioni: mpzsqrt e mpzperfectsquarep. La prima calcola la parte intera della radice quadrata, ma non dice se è esatta. La seconda rivela se un numero è un quadrato perfetto, ma in nessun caso fornisce la radice, anche se nel processo di risposta è stata effettivamente calcolata.&#xA;&#xA;Da pochi giorni la versione di sviluppo prevede un&#39;ulteriore funzione: mpzperfectsquareroot, che esegue effettivamente quanto richiesto, fornisce la radice quadrata solo se c&#39;è. Lo fa, però, senza davvero cambiare punto di vista: dopo alcuni controlli viene calcolata esattamente la parte intera della radice quadrata, verificando poi se la parte decimale sia nulla e quindi la radice sia intera.&#xA;&#xA;Un&#39;idea per fare solo l&#39;essenziale riguardo alla radice esatta_ è calcolare la radice in due modi diversi, dal basso e dall&#39;altro. In base 10 la cosa non funziona benissimo, ma possiamo comunque fare un esempio.&#xA;&#xA;Prendiamo un numero nella forma 123XYZW321. Ha 10 cifre, quindi la sua radice deve avere 5 cifre.&#xA;Le prime cifre sono 123X; poiché 35²=1225 e (35+¼)²  1242, possiamo dire che le prime due cifre della radice devono essere 35 e la terza non può essere superiore a 2.&#xA;Le ultime cifre sono 321 e gli unici numeri minori di 1000 il cui quadrato finisce con queste cifre sono: 111, 139, 361, 389, 611, 639, 861, 889; quindi questi terzetti sono gli unici possibili per le ultime cifre della radice. Ma abbiamo detto che la terza cifra dev&#39;essere minore di 2, quindi gli unici quadrati perfetti di quella forma sono 35111² e 35139².&#xA;&#xA;Perché nasce l&#39;idea di calcolare una parte del risultato dall&#39;alto ed una parte dal basso? Perché se un numero è un quadrato perfetto, entrambi gli approcci sono possibili ed entrambi hanno una complessità super-lineare. Cioè, calcolare una radice quadrata di 20 cifre richiede più del doppio dei calcoli che una radice di 10 cifre. Quindi potrebbe convenire calcolare 10 cifre da un lato e 10 dall&#39;altro, o 11 e 11, per verificare se le cifre che si sovrappongono coincidono (se no, certamente non si tratta di un quadrato perfetto).&#xA;O magari 15 da un lato e 6 dall&#39;altro, il bilanciamento dipende dalla velocità effettiva degli algoritmi sui due versanti.&#xA;&#xA;Si parte, si prova, e non è detto che si riuscirà ad ottenere un codice abbastanza veloce perché valga la pena inserirlo nella libreria.&#xA;&#xA;Lo scopriremo.&#xA;&#xA;PS; intanto faccio esperimenti riguardo alla federazione&#xA;@matematica@feddit.it #matematica #softwareLibero]]&gt;</description>
      <content:encoded><![CDATA[<p>Provo in questi giorni a scrivere una nuova funzione per la libreria <a href="https://gmplib.org/" rel="nofollow">GMP</a> una libreria di funzioni aritmetiche su numeri, principalmente interi, <em>arbitrariamente</em> grandi. La funzione, come spesso accade, partirebbe col ricombinare funzioni già esistenti perché facciano una cosa un poco diversa.</p>

<p>L&#39;obiettivo è calcolare la radice quadrata di un numero intero, ma l&#39;idea forse un po&#39; peculiare è che il risultato ci interessa solo se il numero intero è un quadrato perfetto, ovverosia il quadrato di un numero a sua volta intero. In caso contrario, la funzione ci deve rispondere che il numero non è un quadrato, quindi la radice, negli interi, non esiste.</p>

<p>Per i numeri interi, in GMP, c&#39;erano due funzioni: <code>mpz_sqrt</code> e <code>mpz_perfect_square_p</code>. La prima calcola la parte intera della radice quadrata, ma non dice se è esatta. La seconda rivela se un numero è un quadrato perfetto, ma in nessun caso fornisce la radice, anche se nel processo di risposta è stata effettivamente calcolata.</p>

<p>Da pochi giorni la versione di sviluppo prevede un&#39;ulteriore funzione: <code>mpz_perfect_square_root</code>, che esegue effettivamente quanto richiesto, fornisce la radice quadrata solo se c&#39;è. Lo fa, però, senza davvero cambiare punto di vista: dopo alcuni controlli viene calcolata esattamente la parte intera della radice quadrata, verificando poi se la parte decimale sia nulla e quindi la radice sia intera.</p>

<p>Un&#39;idea per fare solo l&#39;essenziale riguardo alla <em>radice esatta</em> è calcolare la radice in due modi diversi, dal basso e dall&#39;altro. In base 10 la cosa non funziona benissimo, ma possiamo comunque fare un esempio.</p>

<p>Prendiamo un numero nella forma 123XYZW321. Ha 10 cifre, quindi la sua radice deve avere 5 cifre.
Le prime cifre sono 123X; poiché 35²=1225 e (35+¼)²&gt;1242, possiamo dire che le prime due cifre della radice devono essere 35 e la terza non può essere superiore a 2.
Le ultime cifre sono 321 e gli unici numeri minori di 1000 il cui quadrato finisce con queste cifre sono: 111, 139, 361, 389, 611, 639, 861, 889; quindi questi terzetti sono gli unici possibili per le ultime cifre della radice. Ma abbiamo detto che la terza cifra dev&#39;essere minore di 2, quindi gli unici quadrati perfetti di quella forma sono 35111² e 35139².</p>

<p>Perché nasce l&#39;idea di calcolare una parte del risultato dall&#39;alto ed una parte dal basso? Perché se un numero è un quadrato perfetto, entrambi gli approcci sono possibili ed entrambi hanno una complessità super-lineare. Cioè, calcolare una radice quadrata di 20 cifre richiede più del doppio dei calcoli che una radice di 10 cifre. Quindi potrebbe convenire calcolare 10 cifre da un lato e 10 dall&#39;altro, o 11 e 11, per verificare se le cifre che si sovrappongono coincidono (se no, certamente non si tratta di un quadrato perfetto).
O magari 15 da un lato e 6 dall&#39;altro, il bilanciamento dipende dalla velocità effettiva degli algoritmi sui due versanti.</p>

<p>Si parte, si prova, e non è detto che si riuscirà ad ottenere un codice abbastanza veloce perché valga la pena inserirlo nella libreria.</p>

<p>Lo scopriremo.</p>

<p>PS; intanto faccio esperimenti riguardo alla federazione
<a href="https://sharedblog.it/@/matematica@feddit.it" class="u-url mention" rel="nofollow">@<span>matematica@feddit.it</span></a> <a href="/gmp/tag:matematica" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">matematica</span></a> <a href="/gmp/tag:softwareLibero" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">softwareLibero</span></a></p>
]]></content:encoded>
      <guid>https://sharedblog.it/gmp/gmp-sqrt_exact-cercare-la-radice-quadrata-da-due-versanti</guid>
      <pubDate>Fri, 10 Jul 2026 10:29:59 +0000</pubDate>
    </item>
  </channel>
</rss>