Skip to content
This repository was archived by the owner on Feb 1, 2023. It is now read-only.

Commit bc4b0ec

Browse files
author
Release Manager
committed
Trac #29524: bug with rational input in IntegerVectors
As reported on [[https://ask.sagemath.org/question/50814/error-with- rational-input-in-integervectors/|ask]], we have the following unexpected behavior of !IntegerVectors: {{{ sage: IntegerVectors(2,3).list() [[2, 0, 0], [1, 1, 0], [1, 0, 1], [0, 2, 0], [0, 1, 1], [0, 0, 2]] sage: IntegerVectors(2,3/1).list() [[2, 0, 0], [1, 1, 0]] }}} The relevant code block in the implementation of !IntegerVectors seems to be the following: {{{ try: return IntegerVectors_nnondescents(n, tuple(k)) except TypeError: pass return IntegerVectors_nk(n, k) }}} For k=3/1 one has that tuple(k) does not give a !TypeError (as opposed to tuple(3)) and thus the code never tries to interpret k as an integer. {{{ sage: tuple(3/1) (3,) sage: tuple(3) ------------------------------------------------------------------------ --- TypeError Traceback (most recent call last) <ipython-input-2-35e4067a6e17> in <module>() ----> 1 tuple(Integer(3)) TypeError: 'sage.rings.integer.Integer' object is not iterable }}} URL: https://trac.sagemath.org/29524 Reported by: vdelecroix Ticket author(s): Vincent Delecroix Reviewer(s): Frédéric Chapoton
2 parents 0feabfd + f189063 commit bc4b0ec

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

src/sage/combinat/integer_vector.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
from sage.combinat.integer_lists import IntegerListsLex
3535
from itertools import product
36+
import numbers
3637

3738
from sage.structure.parent import Parent
3839
from sage.structure.unique_representation import UniqueRepresentation
@@ -592,6 +593,13 @@ def __classcall_private__(cls, n=None, k=None, **kwargs):
592593
Traceback (most recent call last):
593594
...
594595
ValueError: k and length both specified
596+
597+
:trac:`29524`::
598+
599+
sage: IntegerVectors(3, 3/1)
600+
Traceback (most recent call last):
601+
...
602+
TypeError: 'k' must be an integer or a tuple, got Rational
595603
"""
596604
if 'length' in kwargs:
597605
if k is not None:
@@ -607,12 +615,12 @@ def __classcall_private__(cls, n=None, k=None, **kwargs):
607615
if n is None:
608616
return IntegerVectors_k(k)
609617

610-
try:
618+
if isinstance(k, numbers.Integral):
619+
return IntegerVectors_nk(n, k)
620+
elif isinstance(k, (tuple, list)):
611621
return IntegerVectors_nnondescents(n, tuple(k))
612-
except TypeError:
613-
pass
614-
615-
return IntegerVectors_nk(n, k)
622+
else:
623+
raise TypeError("'k' must be an integer or a tuple, got {}".format(type(k).__name__))
616624

617625
def __init__(self, category=None):
618626
"""

src/sage/combinat/tableau.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6500,9 +6500,9 @@ def random_element(self):
65006500
from sage.rings.all import ZZ
65016501
from sage.matrix.constructor import diagonal_matrix
65026502
from sage.combinat.rsk import RSK
6503-
kchoose2m1 = self.max_entry * (self.max_entry - 1) / 2 - 1
6503+
kchoose2m1 = self.max_entry * (self.max_entry - 1) // 2 - 1
65046504
km1 = self.max_entry - 1
6505-
weights = [binomial(self.size - i + km1, km1) * binomial((i/2) + kchoose2m1, kchoose2m1)
6505+
weights = [binomial(self.size - i + km1, km1) * binomial((i//2) + kchoose2m1, kchoose2m1)
65066506
for i in range(0, self.size + 1, 2)]
65076507
randpos = ZZ.random_element(sum(weights))
65086508
tot = weights[0]

0 commit comments

Comments
 (0)