The current hash function for generic dense matrices suffers from hard
collisions with permutation matrices. For example: all permutation
matrices of size 4 have hash 0!

{{{
    sage: def mat(p): m = p.to_matrix(); m.set_immutable(); return m
    sage: [ hash(mat(p)) for p in Permutations(4) ]
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}}}

In general, we would hope to get n! below:

{{{
    sage: len(set([ hash(mat(p)) for p in Permutations(1) ]))
    1
    sage: len(set([ hash(mat(p)) for p in Permutations(2) ]))
    1
    sage: len(set([ hash(mat(p)) for p in Permutations(3) ]))
    5
    sage: len(set([ hash(mat(p)) for p in Permutations(4) ]))
    1
    sage: len(set([ hash(mat(p)) for p in Permutations(5) ]))
    16
    sage: len(set([ hash(mat(p)) for p in Permutations(6) ]))
    16
    sage: len(set([ hash(mat(p)) for p in Permutations(7) ]))
    32
    sage: len(set([ hash(mat(p)) for p in Permutations(8) ]))
    1
}}}

I stumbled on this when profiling some code using Weyl groups that
heavily used caching (the hash of a weyl group element is the hash of
the underlying matrix). I gained a speed factor of 10x by just
tweaking the hash of matrices as in the attached patch. Now, I have no
idea if in general that would be a good hash for matrices, so please
some expert write an appropriate patch.

Cheers,
                                Nicolas
--
Nicolas M. ThiƩry "Isil" <nthi...@users.sf.net>
http://Nicolas.Thiery.name/

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to