Quantum Computation And Quantum Information