Advertisement
mamamaria

karatsuba

Nov 7th, 2020 (edited)
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. // Karatsuba.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <random>
  7. #include <limits>
  8. #include <ctime>
  9. using namespace std;
  10. random_device rd;
  11. mt19937_64 eng(rd());
  12. uniform_int_distribution<long long> distr;
  13. using verylong = vector <long long>;
  14.  
  15. // заранее считаем, что генерируемые числа существуют в формате от младших разрядов к старшим
  16.  
  17. void addZeros(verylong &one, verylong &two) {
  18.     if (one.size() < two.size())
  19.         for (int i = one.size(); i < two.size(); i++ )
  20.             one.push_back(0);
  21.     if (one.size() > two.size())
  22.         for (int i = two.size(); i < one.size(); i++)
  23.             two.push_back(0);
  24.     if (one.size() % 2 != 0) {
  25.         one.push_back(0);
  26.         two.push_back(0);
  27.     }
  28. }
  29. verylong summary(verylong a, verylong b) {
  30.     addZeros(a, b);
  31.     verylong c; int temp=0;
  32.     for (int i = 0; i < a.size(); i++) {
  33.         c.push_back(((a[i] + b[i] + temp) % 10) );
  34.         if (a[i] + b[i] + temp >= 10) temp = 1;
  35.         else temp = 0;
  36.     }
  37.     return c;
  38. }
  39.  
  40. verylong sub(verylong a, verylong b) {
  41.     addZeros(a, b);
  42.     verylong c; int temp=0;
  43.     for (int i = 0; i < a.size(); i++) {
  44.  
  45.         if (a[i] - b[i] - temp < 0) {
  46.             a[i] += 10;
  47.             c.push_back((a[i] - b[i] - temp));
  48.             temp = 1;
  49.         }
  50.         else {
  51.             c.push_back((a[i] - b[i] - temp));
  52.             temp = 0;
  53.         }
  54.     }
  55.     return c;
  56. }
  57.  
  58. void split(verylong num, verylong& part1, verylong& part2) {
  59.     for (int i = 0; i < num.size()/2; i++)
  60.         part2.push_back(num[i]);
  61.     for (int i = num.size()/2; i < num.size(); i++)
  62.         part1.push_back(num[i]);
  63. }
  64. verylong addZerocForKaratsuba(verylong num, long long n) {
  65.     verylong temp;
  66.     temp.resize(num.size() + n);
  67.     for (int i = 0; i < n; i++) temp[i] = 0;
  68.     for (int i = n; i < temp.size(); i++) temp[i] = num[i - n];
  69.     return temp;
  70. }
  71. verylong karatsuba(verylong x, verylong y) {
  72.     verylong a, b, c, d;
  73.    
  74.    
  75.     if (x.size() == 1 && y.size() == 1) {
  76.         long long temp = x[0] * y[0];
  77.         verylong result;
  78.         if (temp > 10) {
  79.             result.resize(2);
  80.             result[0] = temp / 10;
  81.             result[1] = temp % 10;
  82.         }
  83.         else {
  84.             result.resize(1);  
  85.             result[0] = temp;
  86.            
  87.         }
  88.         return result;
  89.     }
  90.     long long n = x.size();
  91.     addZeros(x, y);
  92.     split(x, a, b);
  93.     split(y, c, d);
  94.     verylong karatcubaAC = karatsuba(a, c); verylong karatcubaBD = karatsuba(b, d);
  95.     verylong term1= addZerocForKaratsuba(karatcubaAC, n);
  96.     verylong term2 = addZerocForKaratsuba(sub(karatsuba(summary(a, b), summary(c, d)), summary(karatcubaAC, karatcubaBD)), n / 2);
  97.     verylong term3 = karatcubaBD;
  98.     return summary(summary(term1, term2), term3);
  99. }
  100. int main()
  101. {
  102.     srand(time(NULL));
  103.     verylong X; verylong Y;
  104.     long long int width = 3;
  105.     const int tests = 1000;
  106.     /*for (int i = 0; i < tests; i++) {*/
  107.         /*width = distr(eng);*/
  108.         for (int j = 0; j < width; j++) {
  109.             X.push_back(rand() % 10);
  110.             Y.push_back(rand() % 10);
  111.         }
  112.  
  113.     /*}*/
  114.         verylong katat = karatsuba(X, Y);
  115.         for (int k = 0; k < width; k++)
  116.             cout << X[k];
  117.         cout << endl;
  118.         for (int k = 0; k < width; k++)
  119.             cout << Y[k];
  120.         for (int k = 0; k < width; k++)
  121.             cout << katat[k];
  122.        
  123. }
  124.  
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement