lmul is a more idiomatic name than product. using join+eval is probably slower than foreach but the lists are small so i don't care.