Découvrez combien de chiffres un numéro comme dans Maple
-
12-10-2019 - |
Question
Je suis en train de mettre en œuvre une procédure de base pour générer une clé RSA. La procédure accepte une plage de nombres a et b. Il doit vérifier que le intervall entre a et b est « cinq chiffres ».
Alors je suis venu avec une solution:
with (numtheory);
gen_rsa := proc(a, b)
local p, q, len_p, len_q, larger;
# the two prime-numbers
p:=safeprime(round(RandomTools[Generate](integer(range=a .. b))-1/2));
q:=safeprime(round(RandomTools[Generate](integer(rande=a .. b))-1/2));
if( evalb(log10(p) > log10(q)+5 )
[...]
La chose est: Maple semble comprendre p et q comme variables de la fonction de type. Je veux utiliser le log10 pour savoir combien de chiffres le premier numéro a pour calculer une clé RSA sûre. Donc evalb
échoue, car il ne peut pas déterminer les deux logarithmes ??
La solution
Vous ne devez pas charger le paquet en dehors de la définition de proc -. Ce n'est pas une bonne pratique
Vous n'avez pas besoin d'un appel à evalb
, lors de l'utilisation if...then
, comme il le fait automatiquement.
Vous pouvez soit utiliser is
à la place, ou les deux quantités evalF de telle sorte que l'inégalité peut être testée.
Par exemple,
gen_rsa := proc(a, b)
local p, q, len_p, len_q, larger;
uses numtheory, RandomTools;
randomize();
# the two prime-numbers
p:=safeprime(round(Generate(integer(range=a .. b))-1/2));
q:=safeprime(round(Generate(integer(range=a .. b))-1/2));
if is(log10(p) > log10(q)+5) then
hi;
else
bye;
end if;
end proc:
ou vous pouvez remplacer cet appel is
en appliquant evalf
aux deux côtés de la condition de l'inégalité des <
. (La commande is
peut effectivement utiliser evalf
en interne, éventuellement via shake
, pour le comprendre.)
Qu'est-ce que vous entendez par « intervalle » entre p et q étant « 5 chiffres » est pas claire. Si vous voulez dire qu'il faut avoir cinq chiffres plus décimales que l'autre, alors vous voudrez peut-être ronde ou trunc ces appels log10 séparément. Il est difficile de dire que le libellé est floue.
ps. Je corrige aussi la faute d'orthographe « Rande » pour « plage » et supprimé le droit inappropriée ouvert entre parenthèses après la if
. Et l'appel randomize
fera la commande RandomTools produire des réponses différentes après chaque redémarrage ou à chaque nouvelle session.