#1367: [with patch, positive review] weird bug creating fractional ideal in
relative number field
---------------------------+------------------------------------------------
Reporter: was | Owner: was
Type: defect | Status: closed
Priority: major | Milestone: sage-3.3
Component: number theory | Resolution: fixed
Keywords: |
---------------------------+------------------------------------------------
Old description:
> I noticed this bug when thinking about implementing factorization of
> integers
> in a general relative number field (via the absolute field corresponding
> to it). If this bug were fixed, then general factorization would be
> trivial to implement, as suggested by the example below.
>
> {{{
> sage: K.<a,b> = NumberField([x^2 + 1, x^2 + 2])
> sage: A = K.absolute_field('z')
> sage: I = A.factor_integer(3)[0][0]
> sage: from_A, to_A = A.structure()
> sage: G = [from_A(z) for z in I.gens()]; G
> [3, (-2*b - 1)*a + b - 1]
> sage: K.fractional_ideal(G)
> ---------------------------------------------------------------------------
> <type 'exceptions.TypeError'> Traceback (most recent call
> last)
>
> /Users/was/s/devel/sage-main/sage/rings/number_field/<ipython console> in
> <module>()
>
> /Users/was/s/local/lib/python2.5/site-packages/IPython/Prompts.py in
> __call__(self, arg)
> 521
> 522 # and now call a possibly user-defined print
> mechanism
> --> 523 manipulated_val = self.display(arg)
> 524
> 525 # user display hooks can change the variable to be
> stored in
>
> /Users/was/s/local/lib/python2.5/site-packages/IPython/Prompts.py in
> _display(self, arg)
> 545 """
> 546
> --> 547 return self.shell.hooks.result_display(arg)
> 548
> 549 # Assign the default display method:
>
> /Users/was/s/local/lib/python2.5/site-packages/IPython/hooks.py in
> __call__(self, *args, **kw)
> 132 #print "prio",prio,"cmd",cmd #dbg
> 133 try:
> --> 134 ret = cmd(*args, **kw)
> 135 return ret
> 136 except ipapi.TryNext, exc:
>
> /Users/was/s/local/lib/python2.5/site-packages/IPython/hooks.py in
> result_display(self, arg)
> 160
> 161 if self.rc.pprint:
> --> 162 out = pformat(arg)
> 163 if '\n' in out:
> 164 # So that multi-line strings line up with the left
> column of
>
> /Users/was/s/local/lib/python2.5/pprint.py in pformat(self, object)
> 109 def pformat(self, object):
> 110 sio = _StringIO()
> --> 111 self._format(object, sio, 0, 0, {}, 0)
> 112 return sio.getvalue()
> 113
>
> /Users/was/s/local/lib/python2.5/pprint.py in _format(self, object,
> stream, indent, allowance, context, level)
> 127 self._readable = False
> 128 return
> --> 129 rep = self._repr(object, context, level - 1)
> 130 typ = _type(object)
> 131 sepLines = _len(rep) > (self._width - 1 - indent -
> allowance)
>
> /Users/was/s/local/lib/python2.5/pprint.py in _repr(self, object,
> context, level)
> 193 def _repr(self, object, context, level):
> 194 repr, readable, recursive = self.format(object,
> context.copy(),
> --> 195 self._depth,
> level)
> 196 if not readable:
> 197 self._readable = False
>
> /Users/was/s/local/lib/python2.5/pprint.py in format(self, object,
> context, maxlevels, level)
> 205 and whether the object represents a recursive construct.
> 206 """
> --> 207 return _safe_repr(object, context, maxlevels, level)
> 208
> 209
>
> /Users/was/s/local/lib/python2.5/pprint.py in _safe_repr(object, context,
> maxlevels, level)
> 290 return format % _commajoin(components), readable,
> recursive
> 291
> --> 292 rep = repr(object)
> 293 return rep, (rep and not rep.startswith('<')), False
> 294
>
> /Users/was/s/local/lib/python2.5/site-
> packages/sage/rings/number_field/number_field_ideal.py in __repr__(self)
> 215
> 216 def __repr__(self):
> --> 217 return "Fractional ideal %s"%self._repr_short()
> 218
> 219 def _repr_short(self):
>
> /Users/was/s/local/lib/python2.5/site-
> packages/sage/rings/number_field/number_field_ideal.py in
> _repr_short(self)
> 232 # makes things insanely slow in general.
> 233 # When I fix this, I *have* to also change the _latex_
> method.
> --> 234 return '(%s)'%(', '.join([str(x) for x in
> self.gens_reduced()]))
> 235
> 236 def __div__(self, other):
>
>
>
>
> /Users/was/s/local/lib/python2.5/site-
> packages/sage/rings/number_field/number_field_ideal_rel.py in
> gens_reduced(self)
> 84 S = L['x']
> 85 gens = L.pari_rnf().rnfidealtwoelt(self.pari_rhnf())
> ---> 86 gens = [ L(R(x.lift().lift())) for x in gens ]
> 87 ## Make sure that gens[1] is in L, not K
> 88 Lcoeff = [ L(x) for x in list(gens[1].polynomial()) ]
>
> /Users/was/s/local/lib/python2.5/site-
> packages/sage/rings/number_field/number_field.py in __call__(self, x)
> 3321 return self.base_field()(x)
> 3322
> -> 3323 return self._element_class(self, x)
> 3324
> 3325 def _coerce_impl(self, x):
>
> /Users/was/s/devel/sage-
> main/sage/rings/number_field/number_field_element.pyx in
> sage.rings.number_field.number_field_element.NumberFieldElement.__init__()
> 231 num = f * den
> 232 for i from 0 <= i <= num.degree():
> --> 233 (<Integer>ZZ(num[i]))._to_ZZ(&coeff)
> 234 ZZX_SetCoeff( self.__numerator, i, coeff )
> 235
>
> /Users/was/s/devel/sage-main/sage/rings/number_field/integer_ring.pyx in
> sage.rings.integer_ring.IntegerRing_class.__call__()
>
> <type 'exceptions.TypeError'>: Unable to coerce -b - 2 to an integer
>
> }}}
New description:
I noticed this bug when thinking about implementing factorization of
integers
in a general relative number field (via the absolute field corresponding
to it). If this bug were fixed, then general factorization would be
trivial to implement, as suggested by the example below.
{{{
sage: K.<a,b> = NumberField([x^2 + 1, x^2 + 2])
sage: A = K.absolute_field('z')
sage: I = A.factor_integer(3)[0][0]
sage: from_A, to_A = A.structure()
sage: G = [from_A(z) for z in I.gens()]; G
[3, (-2*b - 1)*a + b - 1]
sage: K.fractional_ideal(G)
---------------------------------------------------------------------------
<type 'exceptions.TypeError'> Traceback (most recent call
last)
/Users/was/s/devel/sage-main/sage/rings/number_field/<ipython console> in
<module>()
/Users/was/s/local/lib/python2.5/site-packages/IPython/Prompts.py in
__call__(self, arg)
521
522 # and now call a possibly user-defined print mechanism
--> 523 manipulated_val = self.display(arg)
524
525 # user display hooks can change the variable to be
stored in
/Users/was/s/local/lib/python2.5/site-packages/IPython/Prompts.py in
_display(self, arg)
545 """
546
--> 547 return self.shell.hooks.result_display(arg)
548
549 # Assign the default display method:
/Users/was/s/local/lib/python2.5/site-packages/IPython/hooks.py in
__call__(self, *args, **kw)
132 #print "prio",prio,"cmd",cmd #dbg
133 try:
--> 134 ret = cmd(*args, **kw)
135 return ret
136 except ipapi.TryNext, exc:
/Users/was/s/local/lib/python2.5/site-packages/IPython/hooks.py in
result_display(self, arg)
160
161 if self.rc.pprint:
--> 162 out = pformat(arg)
163 if '\n' in out:
164 # So that multi-line strings line up with the left
column of
/Users/was/s/local/lib/python2.5/pprint.py in pformat(self, object)
109 def pformat(self, object):
110 sio = _StringIO()
--> 111 self._format(object, sio, 0, 0, {}, 0)
112 return sio.getvalue()
113
/Users/was/s/local/lib/python2.5/pprint.py in _format(self, object,
stream, indent, allowance, context, level)
127 self._readable = False
128 return
--> 129 rep = self._repr(object, context, level - 1)
130 typ = _type(object)
131 sepLines = _len(rep) > (self._width - 1 - indent -
allowance)
/Users/was/s/local/lib/python2.5/pprint.py in _repr(self, object, context,
level)
193 def _repr(self, object, context, level):
194 repr, readable, recursive = self.format(object,
context.copy(),
--> 195 self._depth,
level)
196 if not readable:
197 self._readable = False
/Users/was/s/local/lib/python2.5/pprint.py in format(self, object,
context, maxlevels, level)
205 and whether the object represents a recursive construct.
206 """
--> 207 return _safe_repr(object, context, maxlevels, level)
208
209
/Users/was/s/local/lib/python2.5/pprint.py in _safe_repr(object, context,
maxlevels, level)
290 return format % _commajoin(components), readable,
recursive
291
--> 292 rep = repr(object)
293 return rep, (rep and not rep.startswith('<')), False
294
/Users/was/s/local/lib/python2.5/site-
packages/sage/rings/number_field/number_field_ideal.py in __repr__(self)
215
216 def __repr__(self):
--> 217 return "Fractional ideal %s"%self._repr_short()
218
219 def _repr_short(self):
/Users/was/s/local/lib/python2.5/site-
packages/sage/rings/number_field/number_field_ideal.py in
_repr_short(self)
232 # makes things insanely slow in general.
233 # When I fix this, I *have* to also change the _latex_
method.
--> 234 return '(%s)'%(', '.join([str(x) for x in
self.gens_reduced()]))
235
236 def __div__(self, other):
/Users/was/s/local/lib/python2.5/site-
packages/sage/rings/number_field/number_field_ideal_rel.py in
gens_reduced(self)
84 S = L['x']
85 gens = L.pari_rnf().rnfidealtwoelt(self.pari_rhnf())
---> 86 gens = [ L(R(x.lift().lift())) for x in gens ]
87 ## Make sure that gens[1] is in L, not K
88 Lcoeff = [ L(x) for x in list(gens[1].polynomial()) ]
/Users/was/s/local/lib/python2.5/site-
packages/sage/rings/number_field/number_field.py in __call__(self, x)
3321 return self.base_field()(x)
3322
-> 3323 return self._element_class(self, x)
3324
3325 def _coerce_impl(self, x):
/Users/was/s/devel/sage-
main/sage/rings/number_field/number_field_element.pyx in
sage.rings.number_field.number_field_element.NumberFieldElement.__init__()
231 num = f * den
232 for i from 0 <= i <= num.degree():
--> 233 (<Integer>ZZ(num[i]))._to_ZZ(&coeff)
234 ZZX_SetCoeff( self.__numerator, i, coeff )
235
/Users/was/s/devel/sage-main/sage/rings/number_field/integer_ring.pyx in
sage.rings.integer_ring.IntegerRing_class.__call__()
<type 'exceptions.TypeError'>: Unable to coerce -b - 2 to an integer
}}}
Comment (by mabshoff):
The issues David remarked about are now being handled via #5126 and #5127.
Cheers,
Michael
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/1367#comment:22>
Sage <http://sagemath.org/>
Sage - Open Source Mathematical Software: Building the Car Instead of
Reinventing the Wheel
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sage-trac?hl=en
-~----------~----~----~----~------~----~------~--~---