// isqrt().
// General includes.
#include "cl_sysdep.h"
// Specification.
#include "cln/integer.h"
// Implementation.
#include "cln/number.h"
#include "cln/io.h"
#include "cln/integer_io.h"
#include "cln/abort.h"
#include "cl_I.h"
#include "cl_DS.h"
namespace cln {
cl_boolean isqrt (const cl_I& x, cl_I* w)
{
if (minusp(x)) {
fprint(std::cerr, "isqrt: applied to negative number: ");
fprint(std::cerr, x);
fprint(std::cerr, "\n");
cl_abort();
}
CL_ALLOCA_STACK;
var const uintD* x_MSDptr;
var uintC x_len;
var const uintD* x_LSDptr;
I_to_NDS_nocopy(x, x_MSDptr=,x_len=,x_LSDptr=,cl_true,); // Digit sequence >=0 zu x
var DS y;
var cl_boolean squarep;
UDS_sqrt(x_MSDptr,x_len,x_LSDptr, &y, squarep=); // Wurzel ziehen
*w = NUDS_to_I(y.MSDptr,y.len); // als Integer
return squarep;
}
// Bit complexity (x of length N): O(M(N)).
} // namespace cln
syntax highlighted by Code2HTML, v. 0.9.1