From 40cf8a4e9ff47ded0674e7ed05af589e9a8cdfa6 Mon Sep 17 00:00:00 2001 From: kalmarek Date: Thu, 29 Mar 2018 19:19:34 +0200 Subject: [PATCH] new version of reduce! and free_reduce using delete_ids! delete_ids requires second pass of W.symbols, but is so much easier to get it right! --- src/Groups.jl | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Groups.jl b/src/Groups.jl index 7c5ecf5..e075176 100644 --- a/src/Groups.jl +++ b/src/Groups.jl @@ -111,24 +111,37 @@ isone(s::GSymbol) = s.pow == 0 length(W::GWord) = sum([length(s) for s in W.symbols]) +function delete_ids!(W::GWord) + to_delete = Int[] + for i in 1:length(W.symbols) + if W.symbols[i].pow == 0 + push!(to_delete, i) + end + end + deleteat!(W.symbols, to_delete) +end + function free_reduce!(W::GWord) reduced = true for i in 1:length(W.symbols) - 1 - if W.symbols[i].str == W.symbols[i+1].str + if W.symbols[i].pow == 0 + continue + elseif W.symbols[i].str == W.symbols[i+1].str reduced = false p1 = W.symbols[i].pow p2 = W.symbols[i+1].pow + W.symbols[i+1] = change_pow(W.symbols[i], p1 + p2) W.symbols[i] = change_pow(W.symbols[i], 0) end end - deleteat!(W.symbols, find(x -> x.pow == 0, W.symbols)) + delete_ids!(W) return reduced end function reduce!(W::GWord) if length(W) < 2 - deleteat!(W.symbols, find(x -> x.pow == 0, W.symbols)) + delete_ids!(W) else reduced = false while !reduced