Узнайте, сколько цифр число, как в клене - PullRequest
1 голос
/ 18 января 2011

Я пытаюсь реализовать базовую процедуру для генерации ключа RSA.Процедура принимает диапазон чисел a и b.Он должен проверить, что интервал между a и b равен «пяти цифрам».

Поэтому я нашел решение:

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 ) 
  [...]

Дело в том, что Maple, кажется, понимает p и qв качестве переменных функции типа.Я хочу использовать log10, чтобы узнать, сколько цифр имеет простое число, чтобы вычислить безопасный ключ RSA.Так что evalb терпит неудачу, потому что он не может определить два логарифма ??

1 Ответ

2 голосов
/ 19 января 2011

Не следует загружать пакет вне определения процедуры - это не очень хорошая практика.

Вам не нужно звонить на 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 выдавать разные ответы после каждого перезапуска или в каждом новом сеансе.

...