|
@@ -42,7 +42,7 @@ struct BigInt{
|
|
|
data[0] = u(std::abs(n));
|
|
|
signum = ::signum(n);
|
|
|
}
|
|
|
- inline uint32_t mod(uint32_t o){
|
|
|
+ inline uint64_t mod(uint64_t o){
|
|
|
uint64_t carry = 0;
|
|
|
for(size_t i = 0;i < data.size();i++){
|
|
|
carry = ((carry << 32) + data[i]) % o;
|
|
@@ -71,12 +71,16 @@ struct BigInt{
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
-
|
|
|
+ void trim(){
|
|
|
+ while(!(data[1] | data[0]))data.pop_front();
|
|
|
+ }
|
|
|
inline BigInt mult(const BigInt& other){
|
|
|
std::deque<std::deque<uint64_t>> matrix(size(), std::deque<uint64_t>(other.size() + 1, 0));
|
|
|
uint64_t carry = 0;
|
|
|
+
|
|
|
BigInt ret(size() + other.size(), false);
|
|
|
for(size_t i = 0;i < size();i++){
|
|
|
+ carry = 0;
|
|
|
for(size_t ih = 0;ih < other.size();ih++){
|
|
|
uint64_t res = data[size() - i - 1] * other.data[other.size() - ih - 1];
|
|
|
res += carry;
|
|
@@ -85,6 +89,13 @@ struct BigInt{
|
|
|
}
|
|
|
}
|
|
|
carry = 0;
|
|
|
+ if(false)
|
|
|
+ for(size_t i = 0;i < matrix.size();i++){
|
|
|
+ for(size_t ih = 0;ih < matrix.size();ih++){
|
|
|
+ std::cout << matrix[i][ih] << " ";
|
|
|
+ }
|
|
|
+ std::cout << std::endl;
|
|
|
+ }
|
|
|
for(size_t column = 0;column < (matrix.size() + other.size());column++){
|
|
|
uint64_t accum = 0;
|
|
|
for(size_t row = 0;row < matrix.size();row++){
|
|
@@ -98,16 +109,30 @@ struct BigInt{
|
|
|
carry = u(accum);
|
|
|
ret.data[ret.size() - column - 1] = l(accum);
|
|
|
}
|
|
|
- if(ret.data[0] == 0)ret.data.pop_front();
|
|
|
+ ret.trim();
|
|
|
+ //if(ret.data[0] == 0)ret.data.pop_front();
|
|
|
return ret;
|
|
|
}
|
|
|
inline size_t size()const{
|
|
|
return data.size();
|
|
|
}
|
|
|
+ inline bool isZero(){
|
|
|
+ for(uint64_t d : data){
|
|
|
+ if(d)return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ inline std::string rawString(){
|
|
|
+ std::string a = "";
|
|
|
+ for(uint64_t d : data){
|
|
|
+ a += (std::to_string(d) + "|");
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
inline std::string toString(){
|
|
|
std::string a = "";
|
|
|
BigInt dec(*this);
|
|
|
- while(dec.data[dec.data.size() - 1]){
|
|
|
+ while(!dec.isZero()){
|
|
|
a = std::to_string(dec.mod(10)) + a;
|
|
|
dec = dec.div(10);
|
|
|
}
|