Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. const unsigned long long base = 1ULL << 32ULL;
  2.  
  3. typedef struct longN{
  4.     unsigned long long dig[626];
  5.     unsigned long long length;
  6. } longN;
  7.  
  8.  
  9. longN SetLongN(unsigned long long value){
  10.     longN temp;
  11.     temp.dig[0] = value;
  12.     temp.length = 1;
  13.     return temp;
  14. }
  15.  
  16. unsigned long long Max(unsigned long long x,unsigned long long y){
  17.     if (x>y) return x;
  18.     return y;
  19. }
  20.  
  21. longN LongNPlusLongN(longN *x, longN *y){
  22.     unsigned long long z = 0;
  23.     x->length = Max(x->length,y->length) + 1;
  24.     for (long long i = 0; i < x->length; ++i){
  25.         if (i < x->length) z+=x->dig[i];
  26.         if (i < y->length) z+=y->dig[i];
  27.         x->dig[i] = z%base;
  28.         z/=base;
  29.     }
  30.     if (x -> dig[x->length - 1] == 0) x->length = x->length - 1;
  31.     return *x;
  32. }
  33.  
  34. longN LongNXLongN(longN *x, unsigned long long y){
  35.     longN temp;
  36.     unsigned long long z;
  37.     temp.length = x->length + 1;
  38.     memset(temp.dig, 0, sizeof(unsigned long long) * temp.length);
  39.     unsigned long long newLength = 0;
  40.     for (int i = 0; i < x->length; i++){
  41.         z = 0;
  42.         z += temp.dig[i];
  43.         z += (unsigned long long)(x->dig[i]*y);
  44.         temp.dig[i] = z % base;
  45.         z /= base;
  46.         if (i > newLength) newLength = i;
  47.         if (z != 0){
  48.             temp.dig[i + 1] = temp.dig[i + 1] + z;
  49.             if (i + 1 > newLength) newLength = i + 1;
  50.         }
  51.     }
  52.     temp.length = newLength + 1;
  53.     return temp;
  54. }
  55.  
  56. //longN LongNXLongN(longN *x, unsigned long long y){
  57. //    longN lY = SetLongN(0);
  58. //    longN lX = LongNPlusLongN(&lY,x);
  59. //    while (y){
  60. //        if (y%2){
  61. //            lY = LongNPlusLongN(&lY,&lX);
  62. //        }
  63. //        lX = LongNPlusLongN(&lX,&lX);
  64. //        y/=2;
  65. //    }
  66. //    return lY;
  67. //}
  68.  
  69. longN LongNDivLongN(longN *x, unsigned long long y, unsigned long long *rem){
  70.     longN temp;
  71.     temp.length = x->length;
  72.     memset(temp.dig, 0, (x->length * sizeof(unsigned long long)));
  73.     int newLength = -1;
  74.     unsigned long long z = 0;
  75.     for (long long i = x->length - 1; i >= 0; i--){
  76.         z = z * base + x->dig[i];
  77.         temp.dig[i] = z / y;
  78.         z = z % y;
  79.         if (temp.dig[i] != 0 && i > newLength) newLength = i;
  80.     }
  81.     *rem = z;
  82.     if (newLength == -1){
  83.         temp.length = 1;
  84.         temp.dig[0] = 0;
  85.     }else{
  86.         temp.length = newLength + 1;
  87.     }
  88.     return temp;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement