Scopri quante cifre di un numero come a Maple
-
12-10-2019 - |
Domanda
Sto cercando di implementare una procedura di base per generare una chiave RSA. La procedura accetta una serie di numeri a e b. Si deve controllare che l'Intervallo tra A e B è "cinque cifre".
Così mi si avvicinò con una soluzione:
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 )
[...]
Cosa è: Maple sembra comprendere p e q come variabili della funzione tipo. Voglio usare il log10 per scoprire quante cifre del primo numero deve al fine di calcolare una chiave RSA di sicurezza. Così evalb
fallisce, perché non può determinare le due logaritmi ??
Soluzione
Non si deve caricare il pacchetto di fuori della definizione proc -. Non è buona pratica
Non è necessario una chiamata a evalb
, quando si utilizza if...then
, come fa automaticamente che.
Si potrebbe o uso is
, invece, o evalf entrambe le quantità in modo che la disuguaglianza può essere testato.
Ad esempio,
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:
o si potrebbe sostituire quella chiamata is
applicando evalf
ad entrambi i lati della condizionale <
disuguaglianza. (Il comando is
può effettivamente utilizzare evalf
internamente, possibilmente attraverso shake
, per capire.)
Che cosa si intende per il "intervallo" tra p e q essere "5 cifre" non è chiaro. Se vuoi dire che uno deve avere cinque cifre decimali più che l'altro allora si potrebbe desiderare di turno o TRUNC quelle chiamate log10 separatamente. E 'difficile da dire, come la formulazione è sfocata.
ps. Ho anche corretto l'errore ortografico "Rande" per "Gamma", e rimosso il inadeguato aperta parentesi dopo il if
. E la chiamata randomize
farà le RandomTools comando producono risposte diverse dopo ogni riavvio o in ogni nuova sessione.