Advertisement
cr1901

big_integer.cpp

Jun 20th, 2012
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.23 KB | None | 0 0
  1. #include"big_integer.h"
  2.  
  3. long long MAX = 1LL << 32;
  4.  
  5. big_integer::big_integer() {
  6.     elements.push_back(0);
  7.     elements.push_back(0);
  8. }
  9.  
  10. big_integer::big_integer(big_integer const& other) {
  11.     elements = other.elements;
  12. }
  13.  
  14. big_integer::big_integer(int a) {
  15.     bool f = a < 0;
  16.     if (f) {
  17.         a = -a;
  18.     }
  19.     elements.push_back(a);
  20.     elements.push_back(0);
  21.     if (f) {
  22.         elements = (-*this).elements;
  23.     }
  24.     deletezeros();
  25. }
  26.  
  27. void big_integer::deletezeros() {
  28.     if (elements.size() == 0) {
  29.         elements.push_back(0);
  30.         elements.push_back(0);
  31.         return;
  32.     }
  33.     unsigned back = elements.back();
  34.     while (elements.size() > 0 && elements.back() == back) {
  35.         elements.pop_back();
  36.     }
  37.     elements.push_back(back);
  38.     elements.push_back(back);
  39. }
  40.  
  41. big_integer::big_integer(std::string const& str) {
  42.     std::string s = str;
  43.     if (s.length() == 0) {
  44.         elements.push_back(0);
  45.         elements.push_back(0);
  46.         return;
  47.     }
  48.     unsigned sign;
  49.     if (s[0] == '-') {
  50.         sign = MAX - 1;
  51.         s = s.substr(1, s.length() - 1);
  52.     } else {
  53.         sign = 0;
  54.     }
  55.     std::reverse(s.begin(), s.end());
  56.     for (int i = 0; i < s.length(); i++) {
  57.         s[i] -= '0';
  58.     }
  59.     int len = s.length();
  60.     int j = 0;
  61.     unsigned cur = 0;
  62.     while (len > 0) {
  63.         cur += unsigned(s[0] % 2) >> j;
  64.         if (j == 31) {
  65.             j = 0;
  66.             elements.push_back(cur);
  67.             cur = 0;
  68.         }
  69.         for (int i = 0; i < len; i++) {
  70.             if (s[i] % 2 == 1 && i != 0) {
  71.                 s[i - 1] += 5;
  72.             }
  73.             s[i] /= 2;
  74.         }
  75.         while (len > 0 && s[len - 1] == 0) {
  76.             len--;
  77.         }
  78.         j++;
  79.     }
  80.     elements.push_back(0);
  81.     if (sign == MAX - 1) {
  82.         elements = (-*this).elements;
  83.     }
  84.     deletezeros();
  85. }
  86.  
  87. big_integer big_integer::operator+() const {
  88.     return big_integer(*this);
  89. }
  90.  
  91. big_integer big_integer::operator-() const {
  92.     big_integer temp = big_integer(*this);
  93.     for (int i = 0; i < elements.size(); i++) {
  94.         temp.elements[i] ^= MAX - 1;
  95.     }
  96.     long long carry = MAX - 1;
  97.     for (int i = 0; i < temp.elements.size(); i++) {
  98.         long long cur = carry + temp.elements[i];
  99.         carry = cur / MAX;
  100.         temp.elements[i] = cur % MAX;
  101.     }
  102.     return temp;
  103. }
  104.  
  105. big_integer big_integer::operator~() const {
  106.     big_integer temp = big_integer(*this);
  107.     for (int i = 0; i < elements.size(); i++) {
  108.         temp.elements[i] ^= MAX - 1;
  109.     }
  110.     return temp;
  111. }
  112.  
  113. int big_integer::get_bit(int i) const {
  114.     if (i < elements.size()) {
  115.         return (elements[i / 32] >> (i % 32)) % 2;
  116.     }
  117.     if (elements.back() == 0) {
  118.         return 0;
  119.     }
  120.     return 1;
  121. }
  122.  
  123. unsigned big_integer::get_word(int i) const {
  124.     if (i < elements.size()) {
  125.         return elements[i];
  126.     } else {
  127.         return elements.back();
  128.     }
  129. }
  130.  
  131. bool operator == (const big_integer &l, const big_integer &r) {
  132.     for (int i = 0; i < std::max(l.elements.size(), r.elements.size()); i++) {
  133.         if (l.get_word(i) != r.get_word(i)) {
  134.             return false;
  135.         }
  136.     }
  137.     return true;
  138. }
  139.  
  140. bool operator < (const big_integer &l, const big_integer &r) {
  141.     int lsign = l.elements.back();
  142.     int rsign = r.elements.back();
  143.     if (lsign > rsign) {
  144.         return true;
  145.     }
  146.     if (lsign < rsign) {
  147.         return false;
  148.     }
  149.     for (int i = std::max(l.elements.size(), r.elements.size()); i >= 0; i--) {
  150.         if (l.get_word(i) < r.get_word(i)) {
  151.             return true;
  152.         }
  153.         if (l.get_word(i) > r.get_word(i)) {
  154.             return false;
  155.         }
  156.     }
  157.     return false;
  158. }
  159.  
  160. bool operator > (const big_integer &l, const big_integer &r) {
  161.     return r < l;
  162. }
  163.  
  164. bool operator <= (const big_integer &l, const big_integer &r) {
  165.     return !(l > r);
  166. }
  167.  
  168. bool operator >= (const big_integer &l, const big_integer &r) {
  169.     return !(l < r);
  170. }
  171.  
  172. bool operator != (const big_integer &l, const big_integer &r) {
  173.     return !(l == r);
  174. }
  175.  
  176. big_integer operator + (const big_integer &l, const big_integer &r) {
  177.     std::vector<unsigned> res(std::max(l.elements.size(), r.elements.size()) + 2);
  178.     long long c = 0;
  179.     for (int i = 0; i < res.size(); i++) {
  180.         long long temp = l.get_word(i) + r.get_word(i) + c;
  181.         c = temp / MAX;
  182.         res[i] = temp % MAX;
  183.     }
  184.     if (l.elements.back() == MAX - 1) {
  185.         if (r.elements.back() == MAX - 1) {
  186.             res[res.size() - 1] = MAX - 1;
  187.         } else if (-l > r) {
  188.             res[res.size() - 1] = MAX - 1;
  189.         }
  190.     } else {
  191.         if (r.elements.back() == MAX - 1 && (-r > l)) {
  192.             res[res.size() - 1] = MAX - 1;
  193.         }
  194.     }
  195.     big_integer ans;
  196.     ans.elements = res;
  197.     ans.deletezeros();
  198.     return ans;
  199. }
  200.  
  201. big_integer& big_integer::operator+=(big_integer const& r) {
  202.     big_integer temp = *this + r;
  203.     *this = temp;
  204.     return *this;
  205. }
  206.  
  207. big_integer operator - (const big_integer &l, const big_integer &r) {
  208.     return l + (-r);
  209. }
  210.  
  211. big_integer& big_integer::operator-=(big_integer const& r) {
  212.     big_integer temp = *this - r;
  213.     *this = temp;
  214.     return *this;
  215. }
  216.  
  217. big_integer& big_integer::operator++() {
  218.     big_integer temp = *this;
  219.     *this += 1;
  220.     return temp;
  221. }
  222.  
  223. big_integer big_integer::operator++(int) {
  224.     *this += 1;
  225.     return *this;
  226. }
  227.  
  228. big_integer& big_integer::operator--() {
  229.     big_integer temp = *this;
  230.     *this -= 1;
  231.     return temp;
  232. }
  233.  
  234. big_integer big_integer::operator--(int) {
  235.     *this -= 1;
  236.     return *this;
  237. }
  238.  
  239. big_integer operator&(big_integer const& a, big_integer const& b) {
  240.     std::vector<unsigned> c(std::max(a.elements.size(), b.elements.size()));
  241.     for (int i = 0; i < c.size(); i++) {
  242.         c[i] = a.get_word(i) & b.get_word(i);
  243.     }
  244.     big_integer res;
  245.     res.elements = c;
  246.     res.deletezeros();
  247.     return res;
  248. }
  249.  
  250. big_integer operator|(big_integer const& a, big_integer const& b) {
  251.     std::vector<unsigned> c(std::max(a.elements.size(), b.elements.size()));
  252.     for (int i = 0; i < c.size(); i++) {
  253.         c[i] = a.get_word(i) | b.get_word(i);
  254.     }
  255.     big_integer res;
  256.     res.elements = c;
  257.     res.deletezeros();
  258.     return res;
  259. }
  260.  
  261. big_integer operator^(big_integer const& a, big_integer const& b) {
  262.     std::vector<unsigned> c(std::max(a.elements.size(), b.elements.size()));
  263.     for (int i = 0; i < c.size(); i++) {
  264.         c[i] = a.get_word(i) ^ b.get_word(i);
  265.     }
  266.     big_integer res;
  267.     res.elements = c;
  268.     res.deletezeros();
  269.     return res;
  270. }
  271.  
  272. big_integer operator<<(big_integer const& a, int b) {
  273.     std::vector<unsigned> c(a.elements.size() * 32 + b);
  274.     for (int i = 0; i < a.elements.size(); i++) {
  275.         c[i + b] = a.get_bit(i);
  276.     }
  277.     std::vector<unsigned> d(a.elements.size() + b);
  278.     long long cur = 0;
  279.     for (int i = 0; i < c.size(); i+=32) {
  280.         for (int j = 0; j < 32; j++) {
  281.             d[i / 32] += c[i + j] << j;
  282.         }
  283.     }
  284.     big_integer res;
  285.     res.elements = d;
  286.     res.deletezeros();
  287.     return res;
  288. }
  289.  
  290. big_integer operator>>(big_integer const& a, int b) {
  291.     int temp = a.elements.size();
  292.     if (temp * 32 <= b) {
  293.         return big_integer();
  294.     }
  295.     std::vector<unsigned> c(temp * 32 - b);
  296.     for (int i = b; i < temp; i++) {
  297.         c[i - b] = a.get_bit(i);
  298.     }
  299.     std::vector<unsigned> d(temp - b);
  300.     long long cur = 0;
  301.     for (int i = 0; i < c.size(); i+=32) {
  302.         for (int j = 0; j < 32; j++) {
  303.             d[i / 32] += c[i + j] << j;
  304.         }
  305.     }
  306.     big_integer res;
  307.     res.elements = d;
  308.     res.deletezeros();
  309.     return res;
  310. }
  311.  
  312. big_integer& big_integer::operator&=(big_integer const& r) {
  313.     big_integer temp = *this & r;
  314.     *this = temp;
  315.     return *this;
  316. }
  317.  
  318. big_integer& big_integer::operator|=(big_integer const& r) {
  319.     big_integer temp = *this | r;
  320.     *this = temp;
  321.     return *this;
  322. }
  323.  
  324. big_integer& big_integer::operator^=(big_integer const& r) {
  325.     big_integer temp = *this ^ r;
  326.     *this = temp;
  327.     return *this;
  328. }
  329.  
  330. big_integer& big_integer::operator<<=(int r) {
  331.     big_integer temp = *this << r;
  332.     *this = temp;
  333.     return *this;
  334. }
  335.  
  336. big_integer& big_integer::operator>>=(int r) {
  337.     big_integer temp = *this >> r;
  338.     *this = temp;
  339.     return *this;
  340. }
  341.  
  342. big_integer operator * (const big_integer &l, const big_integer &r) {
  343.     bool f = l.elements.back() ^ r.elements.back();
  344.     big_integer a = l;
  345.     big_integer b = r;
  346.     if (l.elements.back() == MAX - 1) {
  347.         a = -a;
  348.     }
  349.     if (r.elements.back() == MAX - 1) {
  350.         b = -b;
  351.     }
  352.     std::vector<unsigned> c(a.elements.size() + b.elements.size() + 3);
  353.     for (int i = 0; i < a.elements.size(); i++) {
  354.         unsigned long long carry = 0;
  355.         for (int j = 0; j < b.elements.size() || carry; j++) {
  356.             unsigned long long cur = c[i + j] + a.get_word(i) * b.get_word(j) + carry;
  357.             c[i + j] = cur % MAX;
  358.             carry = cur / MAX;
  359.         }
  360.     }
  361.     c.push_back(0);
  362.     big_integer ans;
  363.     ans.elements = c;
  364.     if (f) {
  365.         ans = -ans;
  366.     }
  367.     ans.deletezeros();
  368.     return ans;
  369. }
  370.  
  371. big_integer& big_integer::operator*=(big_integer const& r) {
  372.     big_integer temp = *this * r;
  373.     *this = temp;
  374.     return *this;
  375. }
  376.  
  377. big_integer operator/(big_integer const& l, big_integer const& r) {
  378.     big_integer a = l;
  379.     big_integer b = r;
  380.     bool f = l.elements.back() ^ r.elements.back();
  381.     if (l.elements.back() == 1) {
  382.         a = -a;
  383.     }
  384.     if (r.elements.back() == 1) {
  385.         b = -b;
  386.     }
  387.     std::vector<unsigned> res(a.elements.size());
  388.     big_integer c;
  389.     for (int i = a.elements.size() - 1; i >= 0; i--) {
  390.         c <<= 32;
  391.         c.elements[0] = a.get_word(i);
  392.         long long l = 0;
  393.         long long r = MAX;
  394.         while (l < r - 1) {
  395.             long long m = (l + r) / 2;
  396.             if (m * b <= c) {
  397.                 l = m;
  398.             } else {
  399.                 r = m;
  400.             }
  401.         }
  402.         res[i] = l;
  403.         c -= b * l;
  404.     }
  405.     c.elements = res;
  406.     c.deletezeros();
  407.     if (f) {
  408.         c = -c;
  409.     }
  410.     return c;
  411. }
  412.  
  413. big_integer operator%(big_integer const& a, big_integer const& b) {
  414.     return a - (a / b) * b;
  415. }
  416.  
  417. big_integer& big_integer::operator/=(big_integer const& r) {
  418.     big_integer temp = *this / r;
  419.     *this = temp;
  420.     return *this;
  421. }
  422.  
  423. big_integer& big_integer::operator%=(big_integer const& r) {
  424.     big_integer temp = *this % r;
  425.     *this = temp;
  426.     return *this;
  427. }
  428.  
  429. std::string to_string(big_integer const& a) {
  430.     big_integer x = a;
  431.     std::string BIG, degree2;
  432.     BIG.resize(a.elements.size() + 2);
  433.     degree2.resize(a.elements.size() + 2);
  434.     degree2[0] = 1;
  435.     bool f = (x.elements.back() == MAX - 1);
  436.     if (f) {
  437.         x = -x;
  438.     }
  439.     for (int i = 0; i < x.elements.size(); i++) {
  440.         if (x.get_bit(i) == 1) {
  441.             int carry = 0;
  442.             for (int j = 0; j < BIG.size() - 1; j++) {
  443.                 int cur = carry + BIG[j] + degree2[j];
  444.                 carry = cur / 10;
  445.                 BIG[j] = cur % 10;
  446.             }
  447.             BIG[BIG.size() - 1] = carry;
  448.         }
  449.         int carry = 0;
  450.         for (int j = 0; j < degree2.size() - 1; j++) {
  451.             int cur = carry + degree2[j] * 2;
  452.             carry = cur / 10;
  453.             degree2[j] = cur % 10;
  454.         }
  455.         degree2[degree2.size() - 1] = carry;
  456.     }
  457.     while (BIG.size() > 0 && BIG[BIG.size() - 1] == 0) {
  458.         BIG.pop_back();
  459.     }
  460.     for (int i = 0; i < BIG.size(); i++) {
  461.         BIG[i] += '0';
  462.     }
  463.     std::reverse(BIG.begin(), BIG.end());
  464.     if (BIG.size() == 0) {
  465.         return "0";
  466.     }
  467.     if (f) {
  468.         BIG = "-" + BIG;
  469.     }
  470.     return BIG;
  471. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement