mirror of
https://github.com/kalmarek/Groups.jl.git
synced 2024-12-26 02:20:30 +01:00
rename _hashing_data to equality_data
This commit is contained in:
parent
472e78af27
commit
6405a1868e
@ -33,7 +33,7 @@ function relations(G::AutomorphismGroup)
|
|||||||
return last(gersten_relations(n, commutative=false))
|
return last(gersten_relations(n, commutative=false))
|
||||||
end
|
end
|
||||||
|
|
||||||
_hashing_data(f::FPGroupElement{<:AutomorphismGroup}) = normalform!.(evaluate(f))
|
equality_data(f::FPGroupElement{<:AutomorphismGroup}) = normalform!.(evaluate(f))
|
||||||
|
|
||||||
function Base.:(==)(g::A, h::A) where A<:FPGroupElement{<:AutomorphismGroup}
|
function Base.:(==)(g::A, h::A) where A<:FPGroupElement{<:AutomorphismGroup}
|
||||||
@assert parent(g) === parent(h)
|
@assert parent(g) === parent(h)
|
||||||
@ -52,12 +52,12 @@ function Base.:(==)(g::A, h::A) where A<:FPGroupElement{<:AutomorphismGroup}
|
|||||||
img_computed, imh_computed = false, false
|
img_computed, imh_computed = false, false
|
||||||
|
|
||||||
if !_isvalidhash(g)
|
if !_isvalidhash(g)
|
||||||
img = _hashing_data(g)
|
img = equality_data(g)
|
||||||
_update_savedhash!(g, img)
|
_update_savedhash!(g, img)
|
||||||
img_computed = true
|
img_computed = true
|
||||||
end
|
end
|
||||||
if !_isvalidhash(h)
|
if !_isvalidhash(h)
|
||||||
imh = _hashing_data(h)
|
imh = equality_data(h)
|
||||||
_update_savedhash!(h, imh)
|
_update_savedhash!(h, imh)
|
||||||
imh_computed = true
|
imh_computed = true
|
||||||
end
|
end
|
||||||
@ -68,17 +68,15 @@ function Base.:(==)(g::A, h::A) where A<:FPGroupElement{<:AutomorphismGroup}
|
|||||||
hash(g) != hash(h) && return false
|
hash(g) != hash(h) && return false
|
||||||
|
|
||||||
# words are different, but hashes agree
|
# words are different, but hashes agree
|
||||||
if !img_computed
|
@sync begin
|
||||||
img = _hashing_data(g)
|
!img_computed && Threads.@spawn img = equality_data(g)
|
||||||
end
|
!imh_computed && Threads.@spawn imh = equality_data(h)
|
||||||
if !imh_computed
|
|
||||||
imh = _hashing_data(h)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
res = img == imh
|
equal = img == imh
|
||||||
!res && @warn "hash collision in == :" g h
|
equal || @warn "hash collision in == :" g h
|
||||||
|
|
||||||
return res
|
return equal
|
||||||
end
|
end
|
||||||
|
|
||||||
# eye-candy
|
# eye-candy
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
## Hashing
|
## Hashing
|
||||||
|
|
||||||
_hashing_data(g::FPGroupElement) = word(g)
|
equality_data(g::FPGroupElement) = (normalform!(g); word(g))
|
||||||
|
|
||||||
bitget(h::UInt, n::Int) = Bool((h & (1 << n)) >> n)
|
bitget(h::UInt, n::Int) = Bool((h & (1 << n)) >> n)
|
||||||
bitclear(h::UInt, n::Int) = h & ~(1 << n)
|
bitclear(h::UInt, n::Int) = h & ~(1 << n)
|
||||||
@ -27,7 +27,7 @@ _setvalidhash!(g::FPGroupElement, v::Bool) =
|
|||||||
|
|
||||||
# To update hash use this internal method, possibly only after computing the
|
# To update hash use this internal method, possibly only after computing the
|
||||||
# normal form of `g`:
|
# normal form of `g`:
|
||||||
function _update_savedhash!(g::FPGroupElement, data=_hashing_data(g))
|
function _update_savedhash!(g::FPGroupElement, data)
|
||||||
h = hash(data, hash(parent(g)))
|
h = hash(data, hash(parent(g)))
|
||||||
h = (h << count_ones(__BITFLAGS_MASK)) | (__BITFLAGS_MASK & g.savedhash)
|
h = (h << count_ones(__BITFLAGS_MASK)) | (__BITFLAGS_MASK & g.savedhash)
|
||||||
g.savedhash = _setvalidhash(h, true)
|
g.savedhash = _setvalidhash(h, true)
|
||||||
@ -36,7 +36,7 @@ end
|
|||||||
|
|
||||||
function Base.hash(g::FPGroupElement, h::UInt)
|
function Base.hash(g::FPGroupElement, h::UInt)
|
||||||
normalform!(g)
|
normalform!(g)
|
||||||
_isvalidhash(g) || _update_savedhash!(g)
|
_isvalidhash(g) || _update_savedhash!(g, equality_data(g))
|
||||||
return hash(g.savedhash >> count_ones(__BITFLAGS_MASK) , h)
|
return hash(g.savedhash >> count_ones(__BITFLAGS_MASK) , h)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user