use fancy algorithms to speed up usually