7 #include "cl_integer.h"
16 const cl_I cl_recip2adic (uintL n, const cl_I& x)
18 var uintL len = ceiling(n,intDsize);
20 var const uintD* x_LSDptr;
21 if (bignump(x) && TheBignum(x)->length >= len)
23 x_LSDptr = BN_LSDptr(x);
25 var uintL x_len = I_to_DS_need(x);
26 if (x_len < len) { x_len = len; }
27 I_to_DS_n(x,x_len,x_LSDptr=);
28 x_LSDptr = x_LSDptr mspop x_len;
31 num_stack_alloc_1(len,,y_LSDptr=);
32 // Compute inverse mod 2^(intDsize*len).
33 recip2adic(len,x_LSDptr,y_LSDptr);
35 if ((n % intDsize) != 0)
36 lspref(y_LSDptr,floor(n,intDsize)) &= (bit(n % intDsize) - 1);
37 return UDS_to_I(y_LSDptr lspop len,len);
39 // Bit complexity (N := n): O(M(N)).