2011-01-18 2 views
1

RSA 키를 생성하는 기본 절차를 구현하려고합니다. 절차는 a와 b의 범위를 허용합니다. a와 b 사이의 intervall이 "5 자리"인지 확인해야합니다. Maple에서 숫자가 몇 자리인지 알아보기

그래서 나는 해결책을했다 :

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

것입니다 : 메이플 유형 기능의 변수로 p와 q를 이해하는 것 같다. 나는 안전한 RSA 키를 계산하기 위해 log10을 사용하여 소수에 얼마나 많은 숫자가 있는지 알고 싶다. 따라서 evalb은 두 로그를 결정할 수 없으므로 실패합니다. ??

+0

에이서의 훌륭한 답변 외에도 : 귀하의 응용 프로그램에 대해 ilog10으로 충분하다고 생각합니다. 기본적으로'ilog10 (n) = floor (log10 (n))'이므로 일부 정보는 잃어 버리지 만 그 대가로 즉시 숫자로 평가되는 반면, log10 (n)은 그렇지 않은 숫자에 대해 평가되지 않은 부분 정확한 결과는 10입니다. 이로 인해 log10에 대한 평가 문제는 ilog10에서 발생하지 않습니다. –

답변

2

proc 정의 밖에서 패키지를로드해서는 안됩니다. 좋은 연습이 아닙니다.

if...then을 사용할 때 evalb을 호출 할 필요가 없습니다. 자동으로 수행하므로 을 사용하십시오.

부등식을 테스트 할 수 있도록 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: 

하거나 < 불평등 조건의 양쪽에 evalf을 적용하여 그 is 전화를 대체 할 수있다. 합니다 (is 명령은 실제로 그것을 알아 내기 위해, 가능 shake을 통해 내부적으로 evalf을 활용할 수 있습니다.)

는 "5 자리"인 p와 q 사이의 "간격"에 의해 무엇을 의미

명확하지 않다. 다른 하나의 십진법 자릿수가 다섯 자리 더 있어야 함을 의미하는 경우 해당 log10 호출을 개별적으로 반올림하거나자를 수 있습니다. 말씨가 퍼지기 때문에 말하기 어렵습니다.

ps. 또한 "범위"에 대해 "rande"의 철자를 수정하고 if 바로 뒤에있는 부적절한 괄호를 제거했습니다. 그리고 randomize 콜을 사용하면 RandomTools 명령어가 다시 시작될 때마다 또는 각각의 새로운 세션에서 다른 답변을 생성하게됩니다.

관련 문제