]> www.ginac.de Git - cln.git/blob - src/integer/elem/cl_I_square.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / integer / elem / cl_I_square.cc
1 // square().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "cln/integer.h"
8
9
10 // Implementation.
11
12 #include "integer/cl_I.h"
13 #include "base/digitseq/cl_DS.h"
14 #include "base/cl_low.h"
15
16 namespace cln {
17
18 const cl_I square (const cl_I& x)
19 {
20   // Methode:
21   // x Fixnum -> direkt multiplizieren
22   // sonst: zu DS machen, multiplizieren.
23       if (fixnump(x))
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))
28           #endif
29             {
30               // Werte direkt multiplizieren:
31               var uint32 hi;
32               var uint32 lo;
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);
36             }
37         }
38       CL_ALLOCA_STACK;
39       var const uintD* xMSDptr;
40       var uintC xlen;
41       var const uintD* xLSDptr;
42       I_to_NDS_nocopy(x, xMSDptr = , xlen = , xLSDptr = , false,);
43       var uintD* ergMSDptr;
44       var uintC erglen = 2*xlen;
45       var uintD* ergLSDptr;
46       num_stack_alloc(erglen,ergMSDptr=,ergLSDptr=);
47       var uintC len = xlen;
48       var uintD MSD = mspref(xMSDptr,0);
49       if (MSD==0)
50         { mspref(ergMSDptr,0) = 0; mspref(ergMSDptr,1) = 0; len--; }
51       cl_UDS_mul_square(xLSDptr,len,ergLSDptr);
52       if ((sintD)MSD < 0)
53         { subfrom_loop_lsp(xLSDptr,ergLSDptr lspop xlen,xlen);
54           subfrom_loop_lsp(xLSDptr,ergLSDptr lspop xlen,xlen);
55         }
56       return DS_to_I(ergMSDptr,erglen);
57 }
58 // Bit complexity (x of length N): O(M(N)).
59
60 }  // namespace cln