doubleBigInt bigInt::power(bigInt b) { doubleBigInt res=bigInt(1); uint mask; int begin,hb=b.higherBitNum(); for(int i = hb / (sizeof(uint) * 8); i >= 0; i--) { if(i == (hb / (sizeof(uint)*8))) { begin = hb % (sizeof(uint) * 8); mask=1UL<<hb ; } else { begin = sizeof(uint) * 8 - 1; mask=1<<(sizeof(uint) * 8 - 1); } for ( int j = begin; j >= 0; j--) { res = res.s(); if(mask & b.a[i]) res=res.m(*this); mask=mask>>1; } } return res; }
doubleBigInt bigInt::mul(bigInt b) { doubleBigInt res,btmp; unsigned long long int tmp,m1,m2; uint mask = -1,tmp1, sizeOfWord = sizeof(uint) * 8; for (int i = 0; i < size; i++) { tmp = 0; m2 = b.a[i]; for (int j = 0; j < size; j++) { m1 = a[j]; tmp += (m1 * m2); tmp1=tmp&mask; btmp.setWord(tmp1,j); tmp = tmp >> (sizeOfWord); } btmp.setWord(tmp & mask,size); btmp.Shift(i * sizeOfWord); res = res + btmp; btmp = bigInt(0); } return res; }
int getDD1(const bigInt &n) // changed { int dd; for (int d_abs = 5, d_sign = 1; ; d_sign = -d_sign, ++++d_abs) { dd = d_abs * d_sign; bigInt g = gcd (n, d_abs); if (1 < g && g < n) // нашли делитель - d_abs return false; if (jacobi (bigInt(dd), n) == -1) break; } return dd; }