On 24 mar, 12:53, Barukh Ziv <barukh....@gmail.com> wrote: > Guys, > > Thank you for the quick reply. I will answer to both questions: > > > Are you using ntl_ZZ_p or ntl_ZZ_pE? I have experienced the same type > > of errors with the latter (due to bad manipulations of > > ntl_ZZ_pEContext by myself. > > Yes, I experience problems while using ZZ_pE as in this case NTL does > block allocation, and cannot re-allocate a single ZZ_p. > > On Mar 24, 11:08 am, Mike Hansen <mhan...@gmail.com> wrote: > > > Are you able to post the code that causes this problem? That would > > help a lot with trying to figure out what's going on. > > > --Mike > > Mike, unfortunately, the code is too complicated to be presented here, > but I will try my best to explain what kind of the problem > I am facing. Basically, the problem occurs once an ZZ_pX was created > with a certain modulus N, and then assigned from another > ZZ_pX created with a bigger modulus N' > N. Semantically, consider the > following algorhtm: > > ZZ_pE a, ap; > // Initialize ap > > while (precision < max_precision) > { > a = f(ap); // * > ap = a; // ** > > precision++; > > } > > where calculations in f() are done with modulus 2^precision. IMHO, > both statements (*) and (**) may lead to an error, as they should be > overwritten with bigger array. > > This is essentially a problem stated in the aforementioned SAGE doc > page on p-adic element. So, I wonder, do you know any good ways to > overcome this? In particular, is there a way to explicitly re-allocate > a previously allocated ZZ_pX object?
Yes you can, altought if your code is very low level I am not sure on the impact. Consider this: sage: a = ntl.ZZ_pContext(128) sage: polynomial = ntl.ZZ_pX([1,2,3,4,5],a) sage: for i in range(128): ....: a = ntl.ZZ_pContext(a.modulus()*2) ....: f = f.convert_to_modulus(a) ....: sage: f [1 2 3 4 5] sage: f.get_modulus_context() NTL modulus 43556142965880123323311949751266331066368 This create a new polynomial modulus the right context.However, this will not work to change context in ZZ_pEX in which you are changing your defining polynomial (succesive residuals of a p-adic f) For example, Suppose f = 15 + x ^2 and you want an algorithm to compute in (ZZ/2^nZZ)[x] / ( f(x) ) sage: p = ntl.ZZ_pContext(2) sage: f = [15, 0, 1] sage: pe = ntl.ZZ_pEContext( ntl.ZZ_pX(f, p) ) sage: poly = ntl.ZZ_pEX([[1], [0], [0,1]], pe) sage: p2 = ntl.ZZ_pContext(4) sage: poly = poly.convert_to_modulus(p2) sage: sage: poly.get_modulus_context() NTL modulus [1 0 1] (mod 4) Which is not what we want. Instead, you could add to ntl_ZZ_pEX a function like (In the following function one should omit the pcontext input c and use cE.get_pc() instead) def convert_to_pE(self, ntl_ZZ_pContext_class c, ntl_ZZ_pEContext_class cE): """ Returns a new ntl_ZZ_pE which is the same as self, but considered modulo a different pE (but the SAME polynomial). """ cE.restore_c() cdef ntl_ZZ_pEX ans = PY_NEW(ntl_ZZ_pEX) _sig_on ZZ_pEX_conv_modulus(ans.x, self.x, c.x) _sig_off ans.c = cE return ans with this function, the previous example would be: sage: p = ntl.ZZ_pContext(2) sage: f = [15, 0, 1] sage: pe = ntl.ZZ_pEContext( ntl.ZZ_pX(f, p) ) sage: poly = ntl.ZZ_pEX([[1], [0], [0,1]], pe) sage: p2 = ntl.ZZ_pContext(4) sage: pe2 = ntl.ZZ_pEContext( ntl.ZZ_pX(f, p2) ) sage: poly = poly.convert_to_pE(p2, pe2) sage: poly.get_modulus_context() NTL modulus [3 0 1] (mod 4) Another question: does NTL > perform an automatic garbage collection in any way? No idea, sorry -- To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URL: http://www.sagemath.org To unsubscribe from this group, send email to sage-support+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.