Advertisement
osipyonok

Grover's algorithm

May 8th, 2017
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. #define pi 3.1415926535897932384626433832795028841971
  6.  
  7. using namespace std;
  8.  
  9. class Grover{
  10. private:
  11.     int n , target;
  12.    
  13. public:
  14.     Grover(int _n , int _target){
  15.         n = _n;
  16.         target = _target;
  17.     }
  18.    
  19.     pair<int , double> Solve(){ //{Результат , ймовірність}
  20.         double t = 1.0 / sqrt(2);
  21.         vector<vector<double>> X = {{0 , 1} , {1 , 0}};
  22.         vector<vector<double>> H = {{t , t} , {t , -t}};
  23.         vector<vector<double>> Hn = {{1}};
  24.        
  25.         int N = 1 << n;
  26.        
  27.         for(int i = 0 ; i < n ; ++i){
  28.             Hn = Kron(Hn , H);
  29.         }
  30.        
  31.         vector<double> bs0(N , 0);
  32.         bs0[0] = 1;
  33.        
  34.         auto T = Mult(bs0 , bs0);
  35.         vector<vector<double>> tmp = {{2}};
  36.         auto S0 = Kron(tmp , T);
  37.        
  38.         for(int i = 0 ; i < N ; ++i){
  39.             --S0[i][i];
  40.         }
  41.        
  42.         auto Q = Query();
  43.        
  44.         tmp = {{1 , 0} , {0 , 1}};
  45.        
  46.         auto A = Mult(Mult(Hn , S0) , Hn);
  47.        
  48.         auto G = Mult(Kron(A , tmp) , Q);
  49.        
  50.         int pw = floor((pi / 4.0) * pow(2 , 1.0 * n / 2.0));
  51.  
  52.         auto GG = Mpow(G , pw);
  53.        
  54.         vector<vector<double>> l = {{1 , 0}};
  55.         tmp.clear();
  56.         tmp.push_back(bs0);
  57.        
  58.         auto P = Mult(Mult(GG , Kron(Hn , Mult(H , X))) , Kron(tmp , l));
  59.    
  60.         double p = 0;
  61.         double m = 0;
  62.        
  63.         for(int i = 0 ; i < N ; ++i){
  64.             double pr = P[2 * i][0] * P[2 * i][0] + P[2 * i + 1][0] * P[2 * i + 1][0];
  65.  
  66.             if(pr > p + 1e-7){
  67.                 m = i;
  68.                 p = pr;
  69.             }
  70.         }
  71.        
  72.         return {m , p};
  73.     }
  74. private:
  75.     vector<vector<double>> Kron(vector<vector<double>> X , vector<vector<double>> Y){
  76.         vector<vector<double>> res(X.size() * Y.size() , vector<double>(X[0].size() * Y[0].size()));
  77.        
  78.         for(int i = 0 ; i < X.size() ; ++i){
  79.             for(int j = 0 ; j < X[0].size() ; ++j){
  80.                 auto V = Y;
  81.                 for(int x = 0 ; x < Y.size() ; ++x){
  82.                     for(int y = 0 ; y < Y[0].size() ; ++y){
  83.                         res[x + i * Y.size()][y + j * Y[0].size()] = X[i][j] * Y[x][y];
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.         return res;
  89.     }
  90.    
  91.     vector<vector<double>> Mult(vector<double> X , vector<double> Y){
  92.         vector<vector<double>> res(X.size() , vector<double>(Y.size()));
  93.         for(int i = 0 ; i < X.size() ; ++i){
  94.             for(int j = 0 ; j < Y.size() ; ++j){
  95.                 res[i][j] = X[i] * Y[j];
  96.             }
  97.         }
  98.         return res;
  99.     }
  100.    
  101.     vector<vector<double>> Mult(vector<vector<double>> X , vector<vector<double>> Y){
  102.         vector<vector<double>> res(X.size() , vector<double>(Y[0].size()));
  103.         for(int i = 0 ; i < X.size() ; ++i){
  104.             for(int j = 0 ; j < Y[0].size() ; ++j){
  105.                 for(int k = 0 ; k < Y.size() ; ++k){
  106.                     res[i][j] += X[i][k] * Y[k][j];
  107.                 }
  108.             }
  109.         }
  110.         return res;
  111.     }
  112.    
  113.     vector<vector<double>> Query(){
  114.         int N = 1 << n;
  115.         vector<vector<double>> A(N , vector<double>(N , 0));
  116.         for(int i = 0 ; i < N ; ++i){
  117.             A[i][i] = 1.0;
  118.         }
  119.         vector<vector<double>> tmp = {{1 , 0} , {0 , 1}};
  120.         A[target][target] = -1;
  121.        
  122.         return Kron(A , tmp);
  123.     }
  124.    
  125.     vector<vector<double>> Mpow(vector<vector<double>> A, int p){
  126.         vector<vector<double>> res(A.size() , vector<double>(A.size() , 0.0));
  127.         for(int i = 0 ; i < A.size() ; ++i){
  128.             res[i][i] = 1.0;
  129.         }
  130.        
  131.         while(p){
  132.             if(p & 1){
  133.                 res = Mult(res , A);
  134.                 --p;
  135.             }else{
  136.                 A = Mult(A , A);
  137.                 p /= 2;
  138.             }  
  139.         }
  140.         return res;
  141.     }
  142.    
  143. };
  144.  
  145. int main() {
  146. //  ios_base::sync_with_stdio(false);
  147. //  cin.tie(NULL);
  148.     cout.setf(ios::fixed);
  149.     cout.precision(10);
  150.     Grover grover(8 , 255);//(n , target). , 0 <= target < 2^n
  151.     auto ans = grover.Solve();
  152.     cout << "Target is " << ans.first << " with probability " << ans.second << endl;
  153.  
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement