QNLP  v1.0
test_qft.cpp
Go to the documentation of this file.
1 
11 //#define CATCH_CONFIG_RUNNER
12 //#define CATCH_CONFIG_MAIN
13 
14 #include "catch2/catch.hpp"
15 #include "Simulator.hpp"
16 #include "IntelSimulator.cpp"
17 #include <memory>
18 #include "qft.hpp"
19 
20 using namespace QNLP;
21 #include <bitset>
22 
27 TEST_CASE("QFT forward","[qft]"){
28  std::size_t min_idx=0, max_idx=3;
29  std::size_t num_qubits = max_idx - min_idx +1;
31  SECTION("Full register"){
32  auto& r = sim.getQubitRegister();
33  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
34  REQUIRE( r.GetProbability(idx) == 0.0 );
35  }
36  sim.applyQFT(min_idx, max_idx);
37  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
38  REQUIRE( r.GetProbability(idx) == Approx( sqrt( 1. / num_qubits ) ) );
39  }
40  }
41  SECTION("Sub register"){
42  auto& r = sim.getQubitRegister();
43  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
44  REQUIRE( r.GetProbability(idx) == 0.0 );
45  }
46  sim.applyQFT(min_idx+1, max_idx);
47  REQUIRE( r.GetProbability(min_idx) == 0.0 );
48  for(std::size_t idx = min_idx+1; idx <= max_idx; idx++){
49  REQUIRE( r.GetProbability(idx) == Approx( sqrt( 1. / (num_qubits-1) ) ) );
50  }
51  }
52 }
53 
58 TEST_CASE("QFT inverse","[qft]"){
59  std::size_t min_idx=0, max_idx=3;
60  std::size_t num_qubits = max_idx - min_idx +1;
62  SECTION("Full register"){
63  auto& r = sim.getQubitRegister();
64  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
65  REQUIRE( r.GetProbability(idx) == 0.0 );
66  }
67  sim.applyIQFT(min_idx, max_idx);
68  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
69  REQUIRE( r.GetProbability(idx) == Approx( sqrt( 1. / num_qubits ) ) );
70  }
71  }
72  SECTION("Sub register"){
73  auto& r = sim.getQubitRegister();
74  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
75  REQUIRE( r.GetProbability(idx) == 0.0 );
76  }
77  sim.applyIQFT(min_idx+1, max_idx);
78  REQUIRE( r.GetProbability(min_idx) == 0.0 );
79  for(std::size_t idx = min_idx+1; idx <= max_idx; idx++){
80  REQUIRE( r.GetProbability(idx) == Approx( sqrt( 1. / (num_qubits-1) ) ) );
81  }
82  }
83 }
84 
89 TEST_CASE("QFT forward and inverse","[qft]"){
90  std::size_t min_idx=0, max_idx=3;
91  std::size_t num_qubits = max_idx - min_idx +1;
93 
94  SECTION("Full register"){
95  auto& r = sim.getQubitRegister();
96  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
97  REQUIRE( r.GetProbability(idx) == 0.0 );
98  }
99  sim.applyQFT(min_idx, max_idx);
100  sim.applyIQFT(min_idx, max_idx);
101  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
102  REQUIRE( r.GetProbability(idx) == 0.0 );
103  }
104  }
105  SECTION("Sub register"){
106  auto& r = sim.getQubitRegister();
107  for(std::size_t idx = min_idx; idx <= max_idx; idx++){
108  REQUIRE( r.GetProbability(idx) == 0.0 );
109  }
110  sim.applyQFT(min_idx+1, max_idx);
111  sim.applyIQFT(min_idx+1, max_idx);
112  for(std::size_t idx = min_idx+1; idx <= max_idx; idx++){
113  REQUIRE( r.GetProbability(idx) == 0.0 );
114  }
115  }
116 }
TEST_CASE("QFT forward","[qft]")
Test: QFT forward.
Definition: test_qft.cpp:27
Class definition for IntelSimulator. The purpose of this class is to map the functionality of the und...
Implements the forward and inverse quantum Fourier transform.