Advertisement
Guest User

big_integer.h

a guest
Mar 31st, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.63 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <limits>
  4.  
  5. typedef unsigned int uint;
  6.  
  7.     // const uint msb = std::numeric_limits<uint>::max() ^ ( std::numeric_limits<uint>::max() >> 1 );
  8.     // const uint max_uint = std::numeric_limits<uint>::max();
  9. #define msb 0x80000000
  10. #define max_uint 0xFFFFFFFF
  11.  
  12.     template<uint value_size>
  13.     struct big_integer
  14.     {
  15.     //public:
  16.         __host__ __device__
  17.         inline big_integer(uint value)
  18.         {
  19.             set_zero();
  20.             data[0] = value;
  21.         }
  22.        
  23.         __host__ __device__
  24.         inline big_integer(int value)
  25.         {
  26.             set_zero();
  27.             data[0] = (uint)value;
  28.         }
  29.  
  30.         __host__ __device__
  31.         inline big_integer()
  32.         {
  33.             set_zero();
  34.         }
  35.        
  36.         __host__ __device__
  37.         inline big_integer<value_size>& operator=(uint value)
  38.         {
  39.             data[0] = value;
  40.             return *this;
  41.         }
  42.        
  43.         __host__ __device__
  44.         inline big_integer<value_size>& operator=(int value)
  45.         {
  46.             data[0] = (uint)value;
  47.             return *this;
  48.         }
  49.  
  50.         __host__ __device__
  51.         inline uint to_u32()
  52.         {
  53.             return data[0];
  54.         }
  55.        
  56.         // __host__ __device__
  57.         // inline operator uint()
  58.         // {
  59.             // return data[0];
  60.         // }
  61.        
  62.         // __host__ __device__
  63.         // inline operator int()
  64.         // {
  65.             // return (int)data[0];
  66.         // }
  67.  
  68.         __host__ __device__
  69.         inline uint size() const
  70.         {
  71.             return value_size;
  72.         }
  73.        
  74.         __host__ __device__
  75.         inline void set_zero()
  76.         {
  77.             // device don't have memset,
  78.             //memset(data, 0, sizeof(uint) * value_size);
  79.             for(int i = 0; i < value_size; i++)
  80.                 data[i] = 0;
  81.         }
  82.        
  83.         __host__ __device__
  84.         static inline big_integer<value_size> zero()
  85.         {
  86.             // return 0;
  87.             return big_integer<value_size>();
  88.             // return m_zero; // TODO increase performance
  89.         }
  90.  
  91.         __host__ __device__
  92.         static inline big_integer<value_size> max() // return max value for a given value size
  93.         {
  94.             big_integer<value_size> m;
  95.             for(int i = 0; i < value_size; i++)
  96.                 m.data[i] = max_uint;
  97.             return m;
  98.         }
  99.  
  100.         // Shift operators
  101.         __host__ __device__
  102.         big_integer<value_size> operator>>(int shift);
  103.         __host__ __device__
  104.         big_integer<value_size> operator<<(int shift);
  105.         __host__ __device__
  106.         big_integer<value_size>& operator>>=(int shift);
  107.         __host__ __device__
  108.         big_integer<value_size>& operator<<=(int shift);
  109.  
  110.         // Arithmetic operators
  111.         __host__ __device__
  112.         big_integer<value_size> operator+(const big_integer<value_size>& other) const;
  113.         __host__ __device__
  114.         big_integer<value_size>& operator+=(const big_integer<value_size>& q);
  115.         __host__ __device__
  116.         big_integer<value_size>& operator++();          // Pre Increment operator -- faster than add
  117.         __host__ __device__
  118.         big_integer<value_size>& operator++(int);       // Post Increment operator -- faster than add
  119.         __host__ __device__
  120.         big_integer<value_size> operator-();            // Negates a number
  121.         __host__ __device__
  122.         big_integer<value_size> operator-(const big_integer<value_size>& q) const;
  123.         __host__ __device__
  124.         big_integer<value_size>& operator-=(const big_integer<value_size>& q);
  125.         __host__ __device__
  126.         big_integer<value_size>& operator--();          // Pre Decrement operator -- faster than add
  127.         __host__ __device__
  128.         big_integer<value_size>& operator--(int);       // Post Decrement operator -- faster than add
  129.         //big_integer<value_size> operator*(big_integer<value_size> q);
  130.         __host__ __device__
  131.         big_integer<value_size> operator*(const big_integer<value_size>& q) const;
  132.         __host__ __device__
  133.         big_integer<value_size> Divide(big_integer<value_size> dividend,
  134.                                        big_integer<value_size> divisor,
  135.                                        big_integer<value_size>* remainder);
  136.         __host__ __device__
  137.         big_integer<value_size> operator/(const big_integer<value_size>& q);
  138.         __host__ __device__
  139.         big_integer<value_size> operator%(const big_integer<value_size>& q);
  140.         __host__ __device__
  141.         big_integer<value_size> sqrt();         // returns the square root of this
  142.  
  143.         // Comparison operators
  144.         __host__ __device__
  145.         int operator<(const big_integer<value_size>& q) const;
  146.         __host__ __device__
  147.         int operator>(const big_integer<value_size>& q) const;
  148.         __host__ __device__
  149.         int operator<=(const big_integer<value_size>& q) const;
  150.         __host__ __device__
  151.         int operator>=(const big_integer<value_size>& q) const;
  152.  
  153.         // Bitwise operators
  154.         __host__ __device__
  155.         big_integer<value_size> operator&(const big_integer<value_size>& q);
  156.         __host__ __device__
  157.         big_integer<value_size> operator|(const big_integer<value_size>& q);
  158.         __host__ __device__
  159.         big_integer<value_size> operator^(const big_integer<value_size>& q);
  160.         __host__ __device__
  161.         big_integer<value_size>& operator&=(const big_integer<value_size>& q);
  162.         __host__ __device__
  163.         big_integer<value_size>& operator|=(const big_integer<value_size>& q);
  164.         __host__ __device__
  165.         big_integer<value_size>& operator^=(const big_integer<value_size>& q);
  166.         __host__ __device__
  167.         big_integer<value_size> operator~();
  168.  
  169.         // Comparison operators
  170.         __host__ __device__
  171.         int operator==(const big_integer<value_size>& other) const
  172.         {
  173.             // device don't have memcmp
  174.             return memcmp( data, other.data, value_size * sizeof(uint) ) == 0;
  175.         }
  176.  
  177.         __host__ __device__
  178.         int operator!=(const big_integer<value_size>& other) const
  179.         {
  180.             // device don't have memcmp
  181.             return memcmp( data, other.data, value_size * sizeof(uint) ) != 0;
  182.         }
  183.        
  184.     //private:
  185.         // Storage for values
  186.         uint data[value_size];
  187.        
  188.         // zero value
  189.         // static big_integer<value_size> m_zero;
  190.        
  191.         //template<uint value_size>
  192.         //friend std::ostream& operator<<(std::ostream& out, const big_integer<value_size>& number);
  193.     };
  194.  
  195.     // template<uint value_size> hint::big_integer<value_size> hint::big_integer<value_size>::m_zero;
  196.  
  197.  
  198. /*
  199. template<uint value_size>
  200. std::ostream& operator<<(std::ostream & out, hint::big_integer<value_size>& num)
  201. {
  202.     hint::big_integer<value_size> billion = 1000000000;
  203.     hint::big_integer<value_size> digit;
  204.     hint::big_integer<value_size> q;
  205.     uint decimaldigit;
  206.     ldiv_t divideresult;
  207.     int i;
  208.     //char tmp;
  209.     char* p;
  210.     char* decimal_array = new char[8000];   // Allocate only needed, taking into
  211.                                             // account value_size template parameter
  212.    
  213.     q = num;
  214.     p = decimal_array + 3999;
  215.     *p = 0;
  216.     p--;
  217.  
  218.     if( q == hint::big_integer<value_size>::zero() )
  219.     {
  220.         *p = '0';
  221.         p--;
  222.     }
  223.  
  224.     for(; q > hint::big_integer<value_size>::zero(); )
  225.     {
  226.         q = q.Divide( q, billion, &digit );
  227.         decimaldigit = digit;
  228.         for( i = 0; i < 9; i++ )
  229.         {
  230.             divideresult = ldiv( decimaldigit, 10 );
  231.             *p = (char) divideresult.rem + 0x30;
  232.             p--;
  233.             decimaldigit = divideresult.quot;
  234.         }
  235.     }
  236.  
  237.     for( p++; *p=='0'; p++ ) {} // Strip off leading zeros.
  238.  
  239.     if( *p == 0 )
  240.         p--;
  241.  
  242.     //printf("%s", p);
  243.     //out << p;
  244.     out << std::string(p);
  245.     delete decimal_array;
  246.     return out;
  247. }
  248. */
  249.  
  250. #include "big_integer.inl"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement