1 | initial version |
The problem comes from the fat that a Factorization object is not hashable:
sage: f = factor(15)
sage: f
3 * 5
sage: hash(f)
TypeError: <class 'sage.structure.factorization_integer.IntegerFactorization'> is not hashable
It should be (i will open a ticket for that).
You can workaround by replacing the factorization with a hashable equivalent : a tuple:
sage: t = tuple(f)
sage: t
((3, 1), (5, 1))
sage: hash(t)
8332132266671271694
You will be able to recover the factorization as follows:
sage: Factorization(t)
3 * 5
sage: Factorization(t) == f
True
So you can do something like:
sage: S = Set([tuple(factor(10)), tuple(factor(15))])
sage: S
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: len(S.subsets())
4
sage: S.subsets()[3]
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: S.subsets()[3][0]
((2, 1), (5, 1))
sage: Factorization(S.subsets()[3][0])
2 * 5
2 | No.2 Revision |
The problem comes from the fat that a Factorization object is not hashable:
sage: f = factor(15)
sage: f
3 * 5
sage: hash(f)
TypeError: <class 'sage.structure.factorization_integer.IntegerFactorization'> is not hashable
It should be (i will open a ticket for that).
You can workaround by replacing the factorization with a hashable equivalent : a tuple:
sage: t = tuple(f)
sage: t
((3, 1), (5, 1))
sage: hash(t)
8332132266671271694
You will be able to recover the factorization as follows:
sage: Factorization(t)
3 * 5
sage: Factorization(t) == f
True
So you can do something like:
sage: S = Set([tuple(factor(10)), tuple(factor(15))])
sage: S
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: len(S.subsets())
4
sage: S.subsets()[3]
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: S.subsets()[3][0]
((2, 1), (5, 1))
sage: Factorization(S.subsets()[3][0])
2 * 5
EDIT Be careful that the sign is lost when taking the tuple:
sage: a = -5
sage: a.factor()
-1 * 5
sage: tuple(a.factor())
((5, 1),)
3 | No.3 Revision |
The problem comes from the fat that a Factorization object is not hashable:
sage: f = factor(15)
sage: f
3 * 5
sage: hash(f)
TypeError: <class 'sage.structure.factorization_integer.IntegerFactorization'> is not hashable
It should be (i will open a ticket for that).
You can workaround by replacing the factorization with a hashable equivalent : a tuple:
sage: t = tuple(f)
sage: t
((3, 1), (5, 1))
sage: hash(t)
8332132266671271694
You will be able to recover the factorization as follows:
sage: Factorization(t)
3 * 5
sage: Factorization(t) == f
True
So you can do something like:
sage: S = Set([tuple(factor(10)), tuple(factor(15))])
sage: S
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: len(S.subsets())
4
sage: S.subsets()[3]
{((2, 1), (5, 1)), ((3, 1), (5, 1))}
sage: S.subsets()[3][0]
((2, 1), (5, 1))
sage: Factorization(S.subsets()[3][0])
2 * 5
EDIT Be careful that the sign is lost when taking the tuple:
sage: a = -5
sage: a.factor()
-1 * 5
sage: tuple(a.factor())
((5, 1),)
EDIT Looking at the code, it is currently not possible to define a hash for Factorizaion objects since they are mutable (see, e.g. the simplify
method that works in place).