J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela
la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une
variable peut être à la fois valeur d'entrée et de sortie d'une fonction,
ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant :
mpz_mul(c, a, b) /* c = a*b */
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Si oui, ça devient vraiment très lourd d'écrire plus de trois calculs. Il
faut des tonnes de variables intermédiaires, on est soit obligé d'en
allouer plein, soit de les réutiliser mais du coup aucune n'a un nom
significatif.
Ce qui me fait douter, c'est que j'ai remarqué que
mpz_mod(a, a, n) /* a = a mod n */
renvoyait toujours 0.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Bourguignon
mpg writes:
Bonjour,
J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une variable peut être à la fois valeur d'entrée et de sortie d'une fonction, ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Si oui, ça devient vraiment très lourd d'écrire plus de trois calculs. Il faut des tonnes de variables intermédiaires, on est soit obligé d'en allouer plein, soit de les réutiliser mais du coup aucune n'a un nom significatif.
Ce qui me fait douter, c'est que j'ai remarqué que mpz_mod(a, a, n) /* a = a mod n */ renvoyait toujours 0.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres.
-- __Pascal Bourguignon__ http://www.informatimago.com/ Our enemies are innovative and resourceful, and so are we. They never stop thinking about new ways to harm our country and our people, and neither do we. -- Georges W. Bush
mpg <manuel.pg@free.fr> writes:
Bonjour,
J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela
la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une
variable peut être à la fois valeur d'entrée et de sortie d'une fonction,
ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant :
mpz_mul(c, a, b) /* c = a*b */
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Il me semble que oui, c'est dangereux.
Si oui, ça devient vraiment très lourd d'écrire plus de trois calculs. Il
faut des tonnes de variables intermédiaires, on est soit obligé d'en
allouer plein, soit de les réutiliser mais du coup aucune n'a un nom
significatif.
Ce qui me fait douter, c'est que j'ai remarqué que
mpz_mod(a, a, n) /* a = a mod n */
renvoyait toujours 0.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si bas
niveau. Je préfère utiliser Lisp pour faire mes calculs sur des
grands nombres.
--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush
J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une variable peut être à la fois valeur d'entrée et de sortie d'une fonction, ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Si oui, ça devient vraiment très lourd d'écrire plus de trois calculs. Il faut des tonnes de variables intermédiaires, on est soit obligé d'en allouer plein, soit de les réutiliser mais du coup aucune n'a un nom significatif.
Ce qui me fait douter, c'est que j'ai remarqué que mpz_mod(a, a, n) /* a = a mod n */ renvoyait toujours 0.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres.
-- __Pascal Bourguignon__ http://www.informatimago.com/ Our enemies are innovative and resourceful, and so are we. They never stop thinking about new ways to harm our country and our people, and neither do we. -- Georges W. Bush
mpg
mpg writes:
Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres.
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
j'attendrai encore un peu. Une chose à la fois.
Pascal Bourguignon
mpg writes:
mpg writes:
Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ? Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Qu'en pensez-vous ? Je pense que je préfère ne pas me casser la tête avec un API de si
bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres. LISP> (ext:! 50) 30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
Pour revenir à mpz, la question est que une opération va écrire le résultat dans un ordre ou un autre. Si elle écrit le résultat qui se superpose à la donnée d'entrée dans un ordre compatible avec la lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire des mots avant qu'ils ne soient lu, cela faussera le résultat.
In a World without Walls and Fences, who needs Windows and Gates?
mpg <manuel.pg@free.fr> writes:
mpg <manuel.pg@free.fr> writes:
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si
bas
niveau. Je préfère utiliser Lisp pour faire mes calculs sur des
grands nombres.
LISP> (ext:! 50)
30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
Pour revenir à mpz, la question est que une opération va écrire le
résultat dans un ordre ou un autre. Si elle écrit le résultat qui se
superpose à la donnée d'entrée dans un ordre compatible avec la
lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire
des mots avant qu'ils ne soient lu, cela faussera le résultat.
Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ? Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Qu'en pensez-vous ? Je pense que je préfère ne pas me casser la tête avec un API de si
bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres. LISP> (ext:! 50) 30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
Pour revenir à mpz, la question est que une opération va écrire le résultat dans un ordre ou un autre. Si elle écrit le résultat qui se superpose à la donnée d'entrée dans un ordre compatible avec la lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire des mots avant qu'ils ne soient lu, cela faussera le résultat.
"Indentation! -- I will show you how to indent when I indent your skull!"
mpg
Pascal Bourguignon wrote:
mpg writes:
mpg writes:
Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ? Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Ah, je viens de trouver dans le manuel des phrases, et des exemples, qui suggèrent fortement qu'on a le droit de la faire. Il semblerait donc que le problème avec le modulo soit un bug... Bref, j'ai trouvé l'adresse de la m-l gmp, je posterai dessu, ça sera plus à sa place qu'ici.
Qu'en pensez-vous ? Je pense que je préfère ne pas me casser la tête avec un API de si
bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres. LISP> (ext:! 50) 30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
j'attendrai encore un peu. Une chose à la fois.
Ok. Dans ce cas, je mentionnerais memcpy.
[...]
Pour revenir à mpz, la question est que une opération va écrire le résultat dans un ordre ou un autre. Si elle écrit le résultat qui se superpose à la donnée d'entrée dans un ordre compatible avec la lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire des mots avant qu'ils ne soient lu, cela faussera le résultat.
Ok, merci pour cet exemple instructif. Je n'ai pas l'énergie intellectuelle
de l'étudier en détail ce soir, mais il me semble avoir saisi l'argument : pour pouvoir appeler sa_fonction(a, a); où le premier a est la valeur de retour, et le deuxième l'argument, sans souci, il faut que la personne qui a implémenté la fonction se soit éventuellement donné la peine de rendre cet usage possible.
La question, pour mon usage, est donc de savoir dans quelle mesure les concepteurs de GMP ont fait cet effort. Et comme je le disais plus haut, le manuel suggère assez fortement qu'ils l'ont fait, même si j'ai eu un problème a = a mod n.
Je vais donc l'adresser à la mailing-list spécialisée pour avoir plus de détails là-dessus, à moins que quelqu'un ici n'ait déjà expérimenté ce genre de question avec GMP.
Manuel.
Pascal Bourguignon wrote:
mpg <manuel.pg@free.fr> writes:
mpg <manuel.pg@free.fr> writes:
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Ah, je viens de trouver dans le manuel des phrases, et des exemples, qui
suggèrent fortement qu'on a le droit de la faire. Il semblerait donc que le
problème avec le modulo soit un bug... Bref, j'ai trouvé l'adresse de la
m-l gmp, je posterai dessu, ça sera plus à sa place qu'ici.
Qu'en pensez-vous ?
Je pense que je préfère ne pas me casser la tête avec un API de si
bas
niveau. Je préfère utiliser Lisp pour faire mes calculs sur des
grands nombres.
LISP> (ext:! 50)
30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
j'attendrai encore un peu. Une chose à la fois.
Ok. Dans ce cas, je mentionnerais memcpy.
[...]
Pour revenir à mpz, la question est que une opération va écrire le
résultat dans un ordre ou un autre. Si elle écrit le résultat qui se
superpose à la donnée d'entrée dans un ordre compatible avec la
lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire
des mots avant qu'ils ne soient lu, cela faussera le résultat.
Ok, merci pour cet exemple instructif. Je n'ai pas l'énergie intellectuelle
de l'étudier en détail ce soir, mais il me semble avoir saisi l'argument :
pour pouvoir appeler
sa_fonction(a, a);
où le premier a est la valeur de retour, et le deuxième l'argument, sans
souci, il faut que la personne qui a implémenté la fonction se soit
éventuellement donné la peine de rendre cet usage possible.
La question, pour mon usage, est donc de savoir dans quelle mesure les
concepteurs de GMP ont fait cet effort. Et comme je le disais plus haut, le
manuel suggère assez fortement qu'ils l'ont fait, même si j'ai eu un
problème a = a mod n.
Je vais donc l'adresser à la mailing-list spécialisée pour avoir plus de
détails là-dessus, à moins que quelqu'un ici n'ait déjà expérimenté ce
genre de question avec GMP.
Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ? Il me semble que oui, c'est dangereux.
Ça tombe bien, j'avais arrêté de le faire.
Ah, je viens de trouver dans le manuel des phrases, et des exemples, qui suggèrent fortement qu'on a le droit de la faire. Il semblerait donc que le problème avec le modulo soit un bug... Bref, j'ai trouvé l'adresse de la m-l gmp, je posterai dessu, ça sera plus à sa place qu'ici.
Qu'en pensez-vous ? Je pense que je préfère ne pas me casser la tête avec un API de si
bas niveau. Je préfère utiliser Lisp pour faire mes calculs sur des grands nombres. LISP> (ext:! 50) 30414093201713378043612608166064768844377641568960512000000000000
Je n'en doute pas, mais pour l'instant j'apprends le C, pour le LISP
j'attendrai encore un peu. Une chose à la fois.
Ok. Dans ce cas, je mentionnerais memcpy.
[...]
Pour revenir à mpz, la question est que une opération va écrire le résultat dans un ordre ou un autre. Si elle écrit le résultat qui se superpose à la donnée d'entrée dans un ordre compatible avec la lecture, ça peut fonctionner. Mais si l'algorithme nécessite d'écrire des mots avant qu'ils ne soient lu, cela faussera le résultat.
Ok, merci pour cet exemple instructif. Je n'ai pas l'énergie intellectuelle
de l'étudier en détail ce soir, mais il me semble avoir saisi l'argument : pour pouvoir appeler sa_fonction(a, a); où le premier a est la valeur de retour, et le deuxième l'argument, sans souci, il faut que la personne qui a implémenté la fonction se soit éventuellement donné la peine de rendre cet usage possible.
La question, pour mon usage, est donc de savoir dans quelle mesure les concepteurs de GMP ont fait cet effort. Et comme je le disais plus haut, le manuel suggère assez fortement qu'ils l'ont fait, même si j'ai eu un problème a = a mod n.
Je vais donc l'adresser à la mailing-list spécialisée pour avoir plus de détails là-dessus, à moins que quelqu'un ici n'ait déjà expérimenté ce genre de question avec GMP.
Manuel.
Venus²²
"Pascal Bourguignon" wrote in message news:
mpg writes:
Bonjour,
J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une variable peut être à la fois valeur d'entrée et de sortie d'une fonction, ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Non, c'est pas dangereux du tout, parce que le compileur utilise les registreurs de processeur pour faire la calculation. Le resultat sera mis à la destination dans la memoire (a) par exemple.
Vénus²²
"Pascal Bourguignon" <pjb@informatimago.com> wrote in message
news:871wnz30hb.fsf@thalassa.informatimago.com...
mpg <manuel.pg@free.fr> writes:
Bonjour,
J'écris un peu de code manipulant des grands nombres, et j'utilise pour
cela
la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une
variable peut être à la fois valeur d'entrée et de sortie d'une fonction,
ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant :
mpz_mul(c, a, b) /* c = a*b */
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Il me semble que oui, c'est dangereux.
Non, c'est pas dangereux du tout, parce que le compileur utilise les
registreurs de processeur pour faire la calculation. Le resultat sera mis à
la destination dans la memoire (a) par exemple.
J'écris un peu de code manipulant des grands nombres, et j'utilise pour cela la bibliothèque GNU MP. ( http://www.gnu.org/software/gmp/manual/ )
Une chose que je n'arrive pas à deviner en lisant la doc, c'est si une variable peut être à la fois valeur d'entrée et de sortie d'une fonction, ou s'il faut toujours éviter.
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Non, c'est pas dangereux du tout, parce que le compileur utilise les registreurs de processeur pour faire la calculation. Le resultat sera mis à la destination dans la memoire (a) par exemple.
Vénus²²
Vincent Lefevre
Dans l'article , Pascal Bourguignon écrit:
mpg writes:
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Non, c'est OK: GMP détecte quand une variable est réutilisée et fait une copie temporaire (idem pour MPFR). Enfin, vérifier dans la doc, car il y a peut-être des exceptions.
Dans l'article <871wnz30hb.fsf@thalassa.informatimago.com>,
Pascal Bourguignon <pjb@informatimago.com> écrit:
mpg <manuel.pg@free.fr> writes:
exemple : on calcule le produit de deux entiers en faisant :
mpz_mul(c, a, b) /* c = a*b */
Est-ce dangereux de faire
mpz_mul(a, a, b) /* a = a*b */
?
Il me semble que oui, c'est dangereux.
Non, c'est OK: GMP détecte quand une variable est réutilisée et fait
une copie temporaire (idem pour MPFR). Enfin, vérifier dans la doc,
car il y a peut-être des exceptions.
exemple : on calcule le produit de deux entiers en faisant : mpz_mul(c, a, b) /* c = a*b */ Est-ce dangereux de faire mpz_mul(a, a, b) /* a = a*b */ ?
Il me semble que oui, c'est dangereux.
Non, c'est OK: GMP détecte quand une variable est réutilisée et fait une copie temporaire (idem pour MPFR). Enfin, vérifier dans la doc, car il y a peut-être des exceptions.