#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.

Reply via email to