Реализация атаки Fermat с использованием Maple

Я пытаюсь реализовать Fermat Attack в клене, но это дает мне ошибку, в которой говорится, что _1 _ (_ 2_. Супер новичок с Maple, поэтому, если кто-то, у кого есть некоторый опыт, мог бы помочь, это было бы очень признательно.

Кроме того, я пытаюсь разложить на множитель целое число длиной 125 цифр. Кто-нибудь знает какой-либо эффективный алгоритм в Maple или любой другой программе, которая может обрабатывать и разлагать такие большие целые числа?

FermatAtttack:=proc(n::And(posint,odd), maxnumsteps::posint:=10^7,(numsteps::truefalse:=false))
local x, k, r, i, y:
x:=isqrt(n);
if x^2 < n then
  x:= x+1
end if;
k:=2*x+1;
r:=x^2-n;
for i to maxnumsteps while not issqr(r) do
  r:=r+k;
  k:=k+2
end do;
if issqr(r) then
  x:=(k-1)/2;
  y:=isqrt(r)
else
  error "%1 could not facot in %2 iteratioons", n, maxnumsteps
end if;
if not numsteps then
  x-y, x+y
else
  x-y, x+y, i
end if;
end proc:

person user3092043    schedule 13.12.2013    source источник


Ответы (3)


Вам нужно будет использовать сетку числовых полей, чтобы разложить 125-значное целое число. См. это руководство, чтобы начать работу.

person user448810    schedule 13.12.2013

Сообщение об ошибке представляет собой простую синтаксическую ошибку. Ваша первая строка, вероятно, должна быть

FermatAtttack:=proc(n::And(posint,odd), maxnumsteps::posint:=10^7,{numsteps::truefalse:=false})

Maple использует команду ifactor для разложения целых чисел на множители.

person DrC    schedule 13.12.2013

В вашей последовательности параметров определения вашей процедуры FermatAttack в объявлении параметра, заключенном в скобки, есть элемент в круглых скобках, и ваше сообщение об ошибке связано с этим.

(numsteps::truefalse:=false)

Измените это на просто,

numsteps::truefalse:=false

or to,

{numsteps::truefalse:=false}

в соответствии с тем, как вы собираетесь его называть. Второй из них называется параметром ключевого слова. Вот краткая иллюстрация разницы.

FA := proc( ns::truefalse:=false )
    print(ns);
end proc:

FA();
                                 false

FA(true);
                                 true

FB := proc( {ns::truefalse:=false} )
    print(ns);                        
end proc:                           

FB(); # getting the default value
                                 false

FB( ns=false );
                                 false

FB( ns=true );
                                 true

FB( ns ); # a convenience of type truefalse keyword parameters
                                 true

Если вы используете подход с параметром ключевого слова, обратите внимание, что переданный аргумент true в следующем примере не соответствует ключевому слову (которое, таким образом, получает значение по умолчанию).

FB( true );
                                 false
person acer    schedule 13.12.2013