#8574: Length of a finite word defined by an iterator is broken
-----------------------------+----------------------------------------------
Reporter: slabbe | Owner: slabbe
Type: defect | Status: new
Priority: major | Milestone: sage-5.0
Component: combinatorics | Keywords:
Author: | Upstream: N/A
Reviewer: | Merged:
Work_issues: |
-----------------------------+----------------------------------------------
Comment(by slabbe):
I copy here my answer to Timo :
{{{
---------- Message transféré ----------
De : Sébastien Labbé
Date : 22 mars 2010 10:16
Objet : Re: bug WordMorphism ?
À : Timo Jolivet
En fait, la fonction __len__ teste que la valeur retournée est un
entier de python plus grand ou égal à zéro. Par exemple, ce n'est pas
approprié pour les mots infinis. Alors, c'est pourquoi on a créé la
fonction length qui ne fait pas ce test :
sage: w = Word('1')^oo
sage: len(w)
Traceback (most recent call last):
...
TypeError: an integer is required
sage: w.length()
+Infinity
> sage: s = WordMorphism('0->000,1->%s'%('1'*100))
> sage: s('0')
> word: 000
> sage: s('1')
> word: 1111111111111111111111111111111111111111...
> sage: len(s('0'))
> 3
> sage: len(s('1'))
>
---------------------------------------------------------------------------
> TypeError Traceback (most recent call
last)
> /slabbe_hacked_macbook/<ipython console> in <module>()
> TypeError: an integer is required
Dans ton cas, c'est plus bizarre, car le mot s('1') est fini ! En
fait, le problème c'est que pour les mots définis par itérateurs, on
retourne un entier sage plutôt qu'un entier python....chose qu'il
faudrait possiblement changer.
> C'est d'autant plus bizarre que le code suivant marche :
>
> sage: len(Word('1'*100))
> 100
En effet, pour les mots définis par un str, on délègue la question de
la longueur à python qui retourne un entier python:
sage: s = WordMorphism('0->1,1->%s'%('1'*100))
sage: type(s('1').length())
<type 'sage.rings.integer.Integer'>
sage: w = Word('1'*100)
sage: type(w.length())
<type 'int'>
En y réfléchissant, je crois qu'il y aurait une meilleure solution que
de retourner toujours un entier python pour les mots finis. Il
faudrait simplement remplacer la fonction __len__ par une fonction
_len_ qui effacerait le comportement de la fonction __len__. En Sage,
ce principe est utilisé pour d'autres fonctions comme _repr_ par
exemple.
Merci pour ce rapport de bug,
Sébastien
}}}
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/8574#comment:1>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
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.