existe-t-il une fonction de logarithme implémentée dans la bibliothèque GMP? P>
4 Réponses :
Non, il n'y a pas de cette fonction de ce type dans GMP. Seulement en MPFR. P>
Vous êtes correct que la fonction de journalisation n'est pas explicitement donnée dans la bibliothèque GMP, mais on peut obtenir le journal à l'aide de mpz_get_d_2exp code> et exploitant les propriétés du logarithme.
Je sais que vous n'avez pas demandé comment le mettre en œuvre, mais ...
Vous pouvez mettre en œuvre une rude en utilisant les propriétés de logarithmes: http://gnumbers.blogspot.com.au/2011/10/Logarithm-froge- numéro-it-is-pas.html p>
et les internes de la bibliothèque GMP: https://gmplib.org/manual/integer-internals.html p>
(éditer: vous utilisez essentiellement le "chiffre" le plus significatif de la représentation GMP depuis La base de la représentation est énorme em> Voici ma mise en œuvre pour les rationnels. P> (beaucoup plus tard modifier)
Revenir à cela 5 ans plus tard, je pense que c'est cool que le concept de base de b ^ n code> est beaucoup plus grande que
b ^ {n-1} code>) p>
journal (a) = n journal (b) + journal (A_n) code> apparaît même dans des implémentations de points flottants natifs, < un href = "https://github.com/bminor/glibc/blob/master/sysdeps/ia64/fpu/e_logf.s" rel = "nofollow noreferrer"> ici est le glibc pour ia64
Et je l'ai utilisé à nouveau après avoir rencontré cette question p> p>
ici c'est: https://github.com/linas/anant p>
fournit à GNU MP Logarithme réel et complexe, Sine, Cosine, Gamma, Arctan, SQRT, Polylogarithm Riemann et Hurwitz Zeta, Hypergeométrie Confluent, Topologues Sine, et plus encore. P>
La méthode ci-dessous utilise mpz_get_d_2exp et a été obtenu à partir de GMP R Package . Il peut être trouvé sous la fonction biginteger_log code> dans le fichier
bigintegerr.cc code> (vous devez d'abord télécharger la source (c'est-à-dire le fichier tar)).
// Adapted for general use from the original biginteger_log
// xi = di * 2 ^ ex ==> log(xi) = log(di) + ex * log(2)
double biginteger_log_modified(mpz_t x) {
signed long int ex;
const double di = mpz_get_d_2exp(&ex, x);
return log(di) + log(2) * (double) ex;
}