30 lines
679 B
Plaintext
30 lines
679 B
Plaintext
sqff=: {{
|
|
s=. <.%:y
|
|
if. y=*:s do. s return. end.
|
|
for_D. (x:y)*/:~*/@>,{1,each}.p:i.5 do.
|
|
if. -.'integer'-:datatype D=. x:inv D do. break. end.
|
|
P=. <.%:D
|
|
Q=. 1, D-P*P
|
|
lim=. <:6*<.%:2*s
|
|
for_i. }.i.lim do.
|
|
b=. <.(+/0 _1{P)%{:Q
|
|
P=. P,|(b*{:Q)-{:P
|
|
Q=. Q,|(_2{Q)+b*-/_2{.P
|
|
if. 2|i do. if. (=<.&.%:){:Q do. break. end. end.
|
|
end.
|
|
if. i>:lim do. continue. end.
|
|
Q=. <.%:{:Q
|
|
b=. <.(-/0 _1{P)%Q
|
|
P=. ,(b*Q)+{:P
|
|
Q=. Q, <.|(D-*:P)%Q
|
|
whilst. ~:/_2{.P do.
|
|
b=. <.(+/0 _1{P)%{:Q
|
|
P=. P,|(b*{:Q)-{:P
|
|
Q=. Q,|(_2{Q)+b*-/_2{.P
|
|
end.
|
|
f=. y+.x:_2{Q
|
|
if. -. f e. 1,y do. f return. end.
|
|
end.
|
|
1
|
|
}}
|