BigInt.hpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef BIG_INT_HPP
  2. #define BIG_INT_HPP
  3. #include "semi_bitset.hpp"
  4. #include <cstdlib>
  5. template<size_t size>
  6. class BigInt{
  7. private:
  8. int signum = 1;
  9. semi_bitset<size, size >= 1000> bits;
  10. public:
  11. inline BigInt(){
  12. }
  13. inline BigInt(int o){
  14. if(o < 0){signum = -1;o *= -1;}
  15. bits.data[bits.length() - 1] = (unsigned int)o;
  16. }
  17. inline BigInt(unsigned int o){
  18. bits.data[bits.length() - 1] = o;
  19. }
  20. inline BigInt(long long o){
  21. if(o < 0){signum = -1;o *= -1;}
  22. bits.data[bits.length() - 1] = (lower_half);
  23. bits.data[bits.length() - 2] = (o >> 32);
  24. }
  25. inline BigInt(unsigned long long o){
  26. bits.data[bits.length() - 1] = (o & lower_half);
  27. bits.data[bits.length() - 2] = (o >> 32);
  28. }
  29. template<std::size_t osize>
  30. BigInt<size> add(const BigInt<osize>& o)const{
  31. static_assert(size == osize);
  32. BigInt<size> ret;
  33. uint64_t carry = 0;
  34. for(size_t i = size - 1;i >= 0;i--){
  35. uint64_t res = (*this)[i] + o[i] + carry;
  36. carry = (res >> 32);
  37. ret[i] = res & lower_half;
  38. if(i == 0)break;
  39. }
  40. return ret;
  41. }
  42. BigInt<size> div(unsigned int o)const{
  43. uint64_t carry = 0;
  44. BigInt<size> ret;
  45. for(size_t i = 0;i < size;i++){
  46. lldiv_t dm = std::div((unsigned long long int)((carry << 32) + (*this)[i]),(unsigned long long int)o);
  47. carry = dm.rem;
  48. std::cout << " " << dm.rem << " ";
  49. ret[i] = dm.quot;
  50. }
  51. return ret;
  52. }
  53. unsigned int mod(unsigned int o)const{
  54. uint64_t carry = 0;
  55. for(size_t i = 0;i < size;i++){
  56. lldiv_t dm = std::div((long long int)((carry << 32) + (*this)[i]),(unsigned long long int)o);
  57. carry = dm.rem;
  58. }
  59. return (unsigned int)(carry & lower_half);
  60. }
  61. std::uint64_t& operator[](size_t i){
  62. return bits.data[i];
  63. }
  64. const std::uint64_t& operator[](size_t i)const{
  65. return bits.data[i];
  66. }
  67. template<typename stream, size_t osize>
  68. inline friend stream& operator<<(stream& s, const BigInt<osize>& o){
  69. for(size_t i = 0;i < o.bits.length();i++)
  70. s << std::bitset<32>((uint32_t)(o.bits.data[i] & lower_half));
  71. return s;
  72. }
  73. };
  74. #endif