Averiguar cuántos dígitos de un número que en arce
-
12-10-2019 - |
Pregunta
Estoy tratando de poner en práctica un procedimiento básico para generar una clave RSA. El procedimiento acepta una gama de números a y b. Se tiene que comprobar que el intervall entre ayb es "cinco dígitos".
Así que se me ocurrió una solución:
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 cosa es: Arce parece entender p y q como variables de la función tipo. Quiero usar el log10 para averiguar el número de dígitos del número primo-tiene el fin de calcular una clave RSA de seguro. Así evalb
falla, porque no puede determinar los dos logaritmos ??
Solución
No se debe cargar el paquete fuera de la definición proc -. Que no es una buena práctica
Usted no necesita una llamada a evalb
, cuando se utiliza if...then
, como lo hace automáticamente que.
Usted podría utilización is
su lugar, o evalf ambas cantidades, de manera que la desigualdad puede ser probado.
Por ejemplo,
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 se podría sustituir esa llamada is
aplicando evalf
a ambos lados de la desigualdad condicional <
. (El comando is
en realidad puede utilizar evalf
internamente, posiblemente a través de shake
, para averiguarlo.)
¿Qué quiere decir con el "intervalo" entre p y q ser "5 cifras" no está claro. Si usted quiere decir que uno debe tener cinco dígitos decimales más que el otro entonces es posible que desee redonda o TRUNCAR esas llamadas log10 por separado. Es difícil de decir, ya que la redacción es confusa.
ps. También he corregido la falta de ortografía "Rande" para "gama", y quitó la inadecuada paréntesis de apertura justo después de la if
. Y la llamada randomize
hará que los RandomTools comando producir diferentes respuestas después de cada reinicio o en cada nueva sesión.