From f7d3530db117c35ae2f26075f456a688a7d9cec1 Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Tue, 27 Oct 2020 07:48:53 -0700 Subject: [PATCH 1/2] Fixing negative exponentiation in ExpFrac --- src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs b/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs index e6f6c55a406..a09b0eecf32 100644 --- a/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs +++ b/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs @@ -31,7 +31,7 @@ namespace Microsoft.Quantum.Intrinsic { /// Register to apply the given rotation to. @EnableTestingViaName("Test.TargetDefinitions.ExpFrac") operation ExpFrac (paulis : Pauli[], numerator : Int, power : Int, qubits : Qubit[]) : Unit is Adj + Ctl { - let angle = (PI() * IntAsDouble(numerator)) / IntAsDouble(2 ^ power); + let angle = (PI() * IntAsDouble(numerator)) / (2.0 ^ IntAsDouble(power)); Exp(paulis, angle, qubits); } } \ No newline at end of file From cb10e4eba497efcd8be0a1cd3af0e1502a8f4cb1 Mon Sep 17 00:00:00 2001 From: "Stefan J. Wernli" Date: Tue, 27 Oct 2020 09:29:41 -0700 Subject: [PATCH 2/2] Add Comment about support of negative exponents --- src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs | 2 ++ src/Simulation/TargetDefinitions/Decompositions/RFrac.qs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs b/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs index a09b0eecf32..5a0bdeeb3f1 100644 --- a/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs +++ b/src/Simulation/TargetDefinitions/Decompositions/ExpFrac.qs @@ -31,6 +31,8 @@ namespace Microsoft.Quantum.Intrinsic { /// Register to apply the given rotation to. @EnableTestingViaName("Test.TargetDefinitions.ExpFrac") operation ExpFrac (paulis : Pauli[], numerator : Int, power : Int, qubits : Qubit[]) : Unit is Adj + Ctl { + // Note that power must be converted to a double and used with 2.0 instead of 2 to allow for + // negative exponents that result in a fractional denominator. let angle = (PI() * IntAsDouble(numerator)) / (2.0 ^ IntAsDouble(power)); Exp(paulis, angle, qubits); } diff --git a/src/Simulation/TargetDefinitions/Decompositions/RFrac.qs b/src/Simulation/TargetDefinitions/Decompositions/RFrac.qs index e6c7e951643..2c1e1b7be37 100644 --- a/src/Simulation/TargetDefinitions/Decompositions/RFrac.qs +++ b/src/Simulation/TargetDefinitions/Decompositions/RFrac.qs @@ -41,6 +41,8 @@ namespace Microsoft.Quantum.Intrinsic { /// ``` @EnableTestingViaName("Test.TargetDefinitions.RFrac") operation RFrac (pauli : Pauli, numerator : Int, power : Int, qubit : Qubit) : Unit is Adj + Ctl { + // Note that power must be converted to a double and used with 2.0 instead of 2 to allow for + // negative exponents that result in a fractional denominator. let angle = ((-2.0 * PI()) * IntAsDouble(numerator)) / (2.0 ^ IntAsDouble(power)); R(pauli, angle, qubit); }