Q#
is a standalone language offering a high level of abstraction. There is no notion of a quantum state or a circuit; instead, Q#
implements programs in terms of statements and expressions, much like classical programming languages. Distinct quantum capabilities (such as support for functors and control-flow constructs) facilitate expressing, for example, phase estimation and quantum chemistry algorithms.
For example, the following Q#
program constructs a Hamiltonian describing the Hydrogen molecule, and obtains estimates of its energy levels by simulating the quantum phase estimation algorithm.
namespace Microsoft.Quantum.Chemistry.Samples.Hydrogen {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Chemistry.JordanWigner;
open Microsoft.Quantum.Simulation;
open Microsoft.Quantum.Characterization;
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Math;
operation GetEnergyByTrotterization (qSharpData : JordanWignerEncodingData, nBitsPrecision : Int, trotterStepSize : Double, trotterOrder : Int) : (Double, Double) {
// The data describing the Hamiltonian for all these steps is contained in
// `qSharpData`
let (nSpinOrbitals, fermionTermData, statePrepData, energyOffset) = qSharpData!;
// Using a Product formula, also known as `Trotterization` to
// simulate the Hamiltonian.
let (nQubits, (rescaleFactor, oracle)) = TrotterStepOracle(qSharpData, trotterStepSize, trotterOrder);
// The operation that creates the trial state is defined below.
// By default, greedy filling of spin-orbitals is used.
let statePrep = PrepareTrialState(statePrepData, _);
// Using the Robust Phase Estimation algorithm of Kimmel, Low and Yoder.
let phaseEstAlgorithm = RobustPhaseEstimation(nBitsPrecision, _, _);
// This runs the quantum algorithm and returns a phase estimate.
let estPhase = EstimateEnergy(nQubits, statePrep, oracle, phaseEstAlgorithm);
// Obtaining the energy estimate by rescaling the phase estimate with the trotterStepSize. We also add the constant energy offset
// to the estimated energy.
let estEnergy = estPhase * rescaleFactor + energyOffset;
// This returns both the estimated phase, and the estimated energy.
return (estPhase, estEnergy);
}
}