Simulating Hamiltonian dynamics