Advertisement
najim

BigInteger Library

Feb 23rd, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.34 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cassert>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <iostream>
  9. #include <complex>
  10. using namespace std;
  11.  
  12. #define BIT 10009
  13. #define GRP     5
  14. #define RADIX   100000  // 10^GRP
  15.  
  16. typedef complex<long double> Complex;
  17. long double PI = 2 * acos(0.0L);
  18.  
  19. unsigned revtab[65536];
  20. char fin[4000000];
  21. void init()
  22. {
  23.     for (int x = 0; x < 65536; x++)
  24.     {
  25.         int y = 0;for (int i = 0; i < 16; i++)y |= ((x >> i) & 1) << (15 - i);revtab[x] = y;
  26.     }
  27. }
  28.  
  29. void FFT(Complex *a, int N, int dir)
  30. {
  31.     int lgN;for (lgN = 1; (1 << lgN) < N; lgN++);assert((1 << lgN) == N);
  32.     for (unsigned i = 0; i < N; i++)
  33.     {
  34.         unsigned j = ((revtab[i & 65535] << 16) | revtab[i >> 16]) >> (32 - lgN);if (i < j) swap(a[i], a[j]);
  35.     }
  36.     for (int s = 1; s <= lgN; s++)
  37.     {
  38.         int m = 1 << s, h = m/2;Complex w, w_m = exp(Complex(0, dir*2*PI/m));
  39.         for (int k = 0; k < N; k += m)
  40.         {
  41.             // even=a[k..k+n), odd=a[k+n..k+m)
  42.             w = 1;
  43.             for (int j = 0; j < h; j++)
  44.             {
  45.                 Complex t = w * a[k+h+j];a[k+h+j] = a[k+j] - t;a[k+j] += t;w *= w_m;
  46.             }
  47.         }
  48.     }
  49. }
  50. void parse(vector<Complex> &v, const char *s)
  51. {
  52.     int n = strlen(s);int m = (n + GRP-1) / GRP;v.resize(m);
  53.     for (int i = 0; i < m; i++)
  54.     {
  55.         int b = n - GRP * i, x = 0;for (int a = max(0, b - GRP); a < b; a++)x = x * 10 + s[a] - '0';v[i] = x;
  56.     }
  57. }
  58. void Extract(const vector<Complex> &v,int signa,int signb)
  59. {
  60.     cout << signa << " ->>>> " << signb << endl;
  61.     int i, N = v.size();
  62.     vector<long long> digits(N + 1, 0);
  63.     long double err = 0;
  64.     for (i = 0; i < N; i++)
  65.     {
  66.         long long x = (long long)(v[i].real() + 0.5);err = max(err, abs(x - v[i].real()));err = max(err, abs(v[i].imag()));digits[i] = x;
  67.     }
  68.     long long c = 0;
  69.     for (i = 0; i < N; i++)
  70.     {
  71.         c += digits[i];digits[i] = c % RADIX;c /= RADIX;
  72.     }
  73.     assert(c == 0);
  74.     for (i = N-1; i > 0 && digits[i] == 0; i--);int idx=0,blen=0;char buff[30];
  75.     sprintf(buff,"%lld", digits[i]);if(signa!=signb)fin[idx++]='-';while(buff[blen]!='\0')fin[idx++]=buff[blen++];
  76.     for (i--; i >= 0; i--)
  77.     {
  78.         sprintf(buff,"%.*lld", GRP, digits[i]);blen=0;while(buff[blen]!='\0')fin[idx++]=buff[blen++];
  79.     }
  80.     fin[idx]='\0';
  81.     //cout << "##" << fin << endl;
  82. }
  83. void mul(string &xx,string &yy,int signa,int signb)
  84. {
  85.     vector<Complex> A, B;
  86.     parse(A, xx.c_str());parse(B, yy.c_str());int N = 1;
  87.     while (N < max(A.size(), B.size())) N *= 2;N *= 2;A.resize(N);B.resize(N);FFT(&A[0], N, +1);FFT(&B[0], N, +1);for (int i = 0; i < N; i++) A[i] *= B[i];
  88.     FFT(&A[0], N, -1);for (int i = 0; i < N; i++) A[i] /= N;Extract(A,signa,signb);
  89. }
  90. template<class T> string toString(T n)
  91. {
  92.     ostringstream ost;ost << n;ost.flush();return ost.str();
  93. }
  94. struct Bigint
  95. {
  96.     // representations and structures
  97.     string a; // to store the digits
  98.     int sign; // sign = -1 for negative numbers, sign = 1 otherwise
  99.     void getInt()
  100.     {
  101.         a.clear();char ch;
  102.         while(true)
  103.         {
  104.             ch=getchar();if(ch=='\n' || ch==' ')break;a.push_back(ch);
  105.         }
  106.         (*this) = a;
  107.     }
  108.     // constructors
  109.     Bigint() {} // default constructor
  110.     Bigint( string b ){(*this) = b;}    // constructor for string
  111.     // some helpful methods
  112.     int size(){return a.size();}// returns number of digits
  113.     Bigint inverseSign() {sign *= -1;return (*this);}
  114.     // changes the sign
  115.     Bigint normalize( int newSign )   // removes leading 0, fixes sign
  116.     {
  117.         //cout << this->a << " <.> "<< endl;
  118.         for( int i = a.size() - 1; i > 0 && a[i] == '0'; i-- )a.erase(a.begin() + i);sign = ( a.size() == 1 && a[0] == '0' ) ? 1 : newSign;
  119.         //reverse( a.begin(), a.end() );
  120.         return (*this);
  121.     }
  122.     void operator = ( int b )
  123.     {
  124.         (*this)=toString(b);
  125.     }
  126.     // assignment operator
  127.     void operator = ( string b )
  128.     {
  129.         a = b[0] == '-' ? b.substr(1) : b;reverse( a.begin(), a.end() );this->normalize( b[0] == '-' ? -1 : 1 );
  130.         //a.
  131.     }
  132.     // conditional operators
  133.     bool operator < ( const Bigint &b ) const   // less than operator
  134.     {
  135.  
  136.         if( sign != b.sign ) return sign < b.sign;
  137.         if( a.size() != b.a.size() )return sign == 1 ? a.size() < b.a.size() : a.size() > b.a.size();
  138.         for( int i = a.size() - 1; i >= 0; i-- ) if( a[i] != b.a[i] )return sign == 1 ? a[i] < b.a[i] : a[i] > b.a[i];
  139.         return false;
  140.     }
  141.     bool operator < ( const int &b ) const
  142.     {
  143.         return (*this) < toString(b);
  144.     }
  145.     bool operator == ( const Bigint &b ) const   // operator for equality
  146.     {
  147.         return a == b.a && sign == b.sign;
  148.     }
  149.     bool operator == ( const long long &b ) const
  150.     {
  151.         return (*this) == toString(b);
  152.     }
  153. // mathematical operators
  154.     Bigint operator + ( Bigint b )   // addition operator overloading
  155.     {
  156.         if( sign != b.sign ) return (*this) - b.inverseSign();
  157.         Bigint c;
  158.         for(int i = 0, carry = 0; i<a.size() || i<b.size() || carry; i++ )
  159.         {
  160.             carry+=(i<a.size() ? a[i]-48 : 0)+(i<b.a.size() ? b.a[i]-48 : 0);
  161.             c.a += (carry % 10 + 48);
  162.             carry /= 10;
  163.         }
  164.         return c.normalize(sign);
  165.     }
  166.     Bigint operator + ( long long b ){return (*this) + toString(b);}
  167.     Bigint operator - ( Bigint b )   // subtraction operator overloading
  168.     {
  169.         if( sign != b.sign ) return (*this) + b.inverseSign();
  170.         int s = sign;
  171.         sign = b.sign = 1;
  172.         if( (*this) < b ) return ((b - (*this)).inverseSign()).normalize(-s);
  173.         Bigint c;
  174.         for( int i = 0, borrow = 0; i < a.size(); i++ )
  175.         {
  176.             borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48);
  177.             c.a += borrow >= 0 ? borrow + 48 : borrow + 58;
  178.             borrow = borrow >= 0 ? 0 : 1;
  179.         }
  180.         return c.normalize(s);
  181.     }
  182.     Bigint operator - ( long long  b ){return (*this) - toString(b);}
  183.     Bigint operator * ( Bigint b )   // multiplication operator overloading
  184.     {
  185.         reverse( a.begin(), a.end() );
  186.         reverse( b.a.begin(), b.a.end() );
  187.         //int u=0,uu=0;
  188.         //if( a[0]=='-')u=1,a=a.substr(1);
  189.         //else if(a[0]=='+') a=a.substr(1);
  190.         //if( b.a[0]=='-')uu=1, b.a=b.a.substr(1);
  191.         //else if(a[0]=='+')b.a=b.a.substr(1);
  192.         mul(a,b.a,this->sign,b.sign);
  193.         reverse( a.begin(), a.end() );
  194.         reverse( b.a.begin(), b.a.end() );
  195.         return Bigint((string)fin);
  196.     }
  197.     Bigint operator * ( long long b ){return (*this) * toString(b);}
  198.  
  199.     Bigint operator / ( Bigint b )   // division operator overloading BI/BI
  200.     {
  201.         if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 );Bigint c("0"), d;
  202.         for( int j = 0; j < a.size(); j++ ) d.a += "0";int dSign = sign * b.sign;b.sign = 1;
  203.         for( int i = a.size() - 1; i >= 0; i-- )
  204.         {
  205.             c.a.insert( c.a.begin(), '0');c = c + a.substr( i, 1 );while( !( c < b ) ) c = c - b, d.a[i]++;
  206.         }
  207.         return d.normalize(dSign);
  208.     }
  209.     Bigint operator / ( long long n )   // division operator overloading BI/BI
  210.     {
  211.         reverse( a.begin(), a.end() );
  212.         //reverse( b.begin(), b.end() );
  213.         long long int rem=0,i,j=0;int f=1;int idx=0;int len=a.length();
  214.         for(i=0; i<len; i++)
  215.         {
  216.             rem=a[i]-'0'+rem*10;
  217.             if(rem/n!=0)f=0;
  218.             if(f==0)fin[idx++]=((char)((rem/n)+'0'));
  219.             rem=rem%n;
  220.         }
  221.         if(f==1)fin[idx++]='0';fin[idx]='\0';
  222.         reverse( a.begin(), a.end() );
  223.         //reverse( b.begin(), b.end() );
  224.         return Bigint((string)fin);
  225.     }
  226.     Bigint operator % ( Bigint b )   // modulo operator overloading
  227.     {
  228.         if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 );
  229.         Bigint c("0");b.sign = 1;
  230.         for( int i = a.size() - 1; i >= 0; i-- )
  231.         {
  232.             c.a.insert( c.a.begin(), '0');c = c + a.substr( i, 1 );while( !( c < b ) ) c = c - b;
  233.         }
  234.         return c.normalize(sign);
  235.     }
  236.     Bigint operator % ( long long n )   // modulo operator overloading
  237.     {
  238.         reverse( a.begin(), a.end() );
  239.         //reverse( b.begin(), b.end() );
  240.         long long int i,rem=0,j;
  241.         int idx=0;int len=a.length();
  242.         for(i=0; i<len; i++)
  243.         {
  244.             rem=a[i]-'0'+rem*10;rem=rem%n;
  245.         }
  246.         reverse( a.begin(), a.end() );
  247.         //reverse( b.begin(), b.end() );
  248.         return Bigint(toString(rem));
  249.     }
  250.     void print()
  251.     {
  252.         if( sign == -1 ) putchar('-');
  253.         for( int i = a.size() - 1; i >= 0; i-- ) putchar(a[i]);
  254.     }
  255.     Bigint sqrt()
  256.     {
  257.         reverse( this->a.begin(), this->a.end() );
  258.         //reverse( b.begin(), b.end() );
  259.         string a=this->a;int idx=0;int n = a.size();bool f = n%2;n = (f)?n+1:n;vector <int> num (n, 0);int i;
  260.         if (f)for (i = 0; i < n-1; i++)num[i+1] = a[i] - 48;
  261.         else for (i = 0; i < n; i++)num[i] = a[i] - 48;
  262.         n /= 2;
  263.         vector <int> root(n, 0);vector <int> recieve;
  264.         for (i = 0; i < n; i++)
  265.         {
  266.             recieve.push_back (num[i*2]);
  267.             recieve.push_back(num[i*2+1]);
  268.             vector <int> cand(i+1, 0);
  269.             int tmp, ac = 0;
  270.             for (int j = i; j > 0; j--)
  271.             {
  272.                 tmp = root[j-1]*2 + ac;
  273.                 cand[j] = tmp%10;
  274.                 ac = tmp/10;
  275.             }
  276.             if (ac) cand[0] += ac;
  277.             int j;
  278.             for (j = 9; j >= 0; j--)
  279.             {
  280.                 int l = 2*(i+1);
  281.                 vector <int>  m (l, 0);
  282.                 m[l-1] = j*j;m[l-2] = m[l-1]/10;m[l-1] %= 10;
  283.                 int k, o;int ac = 0;
  284.                 for (k = l-2, o = i; o >= 0 && k > 0; k--, o--)
  285.                 {
  286.                     m[k] += cand[o]*j;m[k-1] = m[k]/10;m[k] %= 10;
  287.                 }
  288.                 bool flag = 1;
  289.                 for (k = 0; k < l; k++)
  290.                 {
  291.                     if (recieve[k] > m[k]) break;
  292.                     if (recieve[k] < m[k])
  293.                     {
  294.                         flag = 0;
  295.                         break;
  296.                     }
  297.                 }
  298.                 if (flag)
  299.                 {
  300.                     ac = 0;
  301.                     for (k = l-1; k >= 0; k--)
  302.                     {
  303.                         tmp = recieve[k] - m[k] - ac;
  304.                         if (tmp < 0)
  305.                         {
  306.                             recieve[k] = tmp+10;ac = 1;
  307.                         }
  308.                         else
  309.                         {
  310.                             recieve[k] = tmp;ac = 0;
  311.                         }
  312.                     }
  313.                     break;
  314.                 }
  315.             }
  316.             root[i] = j;fin[idx++]=(j+'0');
  317.         }
  318.         fin[idx]='\0';
  319.         reverse( this->a.begin(),this->a.end() );
  320.         //reverse( b.begin(), b.end() );
  321.         return Bigint(string(fin));
  322.     }
  323. };
  324. istream& operator >> (istream &in, Bigint &x)
  325. {
  326.     in >> x.a;
  327.     x=Bigint(x.a);
  328.     return in;
  329. }
  330. ostream& operator << (ostream &out, const Bigint &x)
  331. {
  332.     string p=x.a;
  333.     reverse(p.begin(),p.end());
  334.     if(x.sign==-1)p="-"+p;
  335.     out << p;
  336.     return out;
  337. }
  338. char inp[BIT];
  339. int main()
  340. {
  341.     Bigint A,B,C,D;
  342.     A.getInt();//character by character read.needs to care about extra spaces/newlines
  343.     cin >> B;//string
  344.     cout << A/B << endl;
  345.  
  346.     C="-100";
  347.     D=-400LL;
  348.     cout << A << " " << B << " " << C << " " << D << endl;
  349.     cout << A.sign << " " << B.sign << " " << C.sign << " " << D.sign << endl;
  350.     if(A==B)cout << "A equals to B\n";
  351.     else if(A<B)cout << "A is less than B\n";
  352.     else cout << "A is greater than B\n";
  353.  
  354.     cout << "A+B" << " " << A+B << endl;
  355.     cout << "A-B" << " " << A-B << endl;
  356.     cout << "A*B" << " " << A*B << endl;
  357.     cout << "A/B" << " " << A/B << endl;
  358.  
  359.  
  360.     cout << A.sqrt() << endl;
  361.     cout << A << " " << B << " " << A+B << " " << C << " " << (A+B)/C << endl;
  362.     cout << A%B << endl;
  363.  
  364.     cout << A+B/C << endl;
  365.     cout << A%50 << endl;
  366.  
  367.     int INT=50;
  368.     cout << B%INT << endl;
  369.  
  370.     if(A<10)cout << "A is less than 10\n";
  371.     if(A+15<25)cout << A << " + 15 is less than 25" << endl;
  372.  
  373.     cout << A+17 << " " << A-19 << endl;
  374.  
  375.     return 0;
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement