7 #include "cln/integer.h"
18 const cl_I square (const cl_I& x)
21 // x Fixnum -> direkt multiplizieren
22 // sonst: zu DS machen, multiplizieren.
24 { var sintV x_ = FN_to_V(x);
25 #if (cl_value_len > 32)
26 // nur falls x ein Integer mit höchstens 32 Bit ist:
27 if ((uintV)((sintV)sign_of(x_) ^ x_) < bit(31))
30 // Werte direkt multiplizieren:
33 mulu32((uint32)x_,(uint32)x_,hi=,lo=); // erst unsigned multiplizieren
34 if (x_ < 0) { hi -= 2*(uint32)x_; } // dann Korrektur für Vorzeichen
35 return L2_to_I(hi,lo);
39 var const uintD* xMSDptr;
41 var const uintD* xLSDptr;
42 I_to_NDS_nocopy(x, xMSDptr = , xlen = , xLSDptr = , false,);
44 var uintC erglen = 2*xlen;
46 num_stack_alloc(erglen,ergMSDptr=,ergLSDptr=);
48 var uintD MSD = mspref(xMSDptr,0);
50 { mspref(ergMSDptr,0) = 0; mspref(ergMSDptr,1) = 0; len--; }
51 cl_UDS_mul_square(xLSDptr,len,ergLSDptr);
53 { subfrom_loop_lsp(xLSDptr,ergLSDptr lspop xlen,xlen);
54 subfrom_loop_lsp(xLSDptr,ergLSDptr lspop xlen,xlen);
56 return DS_to_I(ergMSDptr,erglen);
58 // Bit complexity (x of length N): O(M(N)).