proof of concept of sparse implementation.  still slow
add numba version (slow) and cython version (FAST)