Не следует загружать пакет вне определения процедуры - это не очень хорошая практика.
Вам не нужно звонить на evalb
при использовании if...then
, так как он автоматически делает это.
Вместо этого можно либо использовать is
, либо вычислить обе величины, чтобы можно было проверить неравенство.
Например,
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:
или вы можете заменить этот вызов is
, применив evalf
к обеим сторонам условного неравенства <
. (Команда is
может фактически использовать evalf
для внутреннего использования, возможно, через shake
, чтобы выяснить это.)
Что вы подразумеваете под "интервалом" между p и q, означающим "5 цифр", неясно. Если вы имеете в виду, что у одного должно быть еще пять десятичных цифр, чем у другого, то вы можете округлить или обрезать эти вызовы log10 отдельно. Трудно сказать, поскольку формулировка нечеткая.
пс. Я также исправил неправильное написание "rande" для "range" и удалил несоответствующие открытые скобки сразу после if
. И вызов randomize
заставит команду RandomTools выдавать разные ответы после каждого перезапуска или в каждом новом сеансе.