faster than sais. May try to compete kvark's implementation in future