mawinkle 6 years ago
parent
commit
545bb97c40
2 changed files with 28 additions and 12 deletions
  1. 22 10
      BigInt.hpp
  2. 6 2
      test.cpp

+ 22 - 10
BigInt.hpp

@@ -1,7 +1,7 @@
 #ifndef BIGINT_HPP
 #define BIGINT_HPP
 #include <cstdint>
-#include <vector>
+#include <deque>
 #include <string>
 #include <cmath>
 using std::size_t;
@@ -21,7 +21,7 @@ struct BigInt{
 	using uint64_t = std::uint64_t;
 	using uint32_t = std::uint32_t;
 	int signum;
-	std::vector<std::uint64_t> data;
+	std::deque<std::uint64_t> data;
 	inline BigInt(size_t size, bool dummy) : data(size, 0){
 		
 	}
@@ -58,22 +58,25 @@ struct BigInt{
 		}
 		return ret;
 	}
+	
 	inline BigInt add(const BigInt& other){
 		BigInt ret((size_t)std::max((size_t)data.size(), (size_t)other.data.size()), false);
 		uint64_t carry = 0;
 		for(size_t s = 0;s < std::max(data.size(), other.data.size());s++){
 			uint64_t s1 = (s >= data.size() ? 0 : data[data.size() - s - 1]);
 			uint64_t s2 = (s >= other.size() ? 0 : other.data[other.size() - s - 1]);
-			uint64_t sum = s1 + s2 + (carry << 32);
+			uint64_t sum = s1 + s2 + carry;
 			ret.data[ret.size() - s - 1] = l(sum);
 			carry = u(sum);
 		}
 		return ret;
 	}
+	
 	inline BigInt mult(const BigInt& other){
-		std::vector<std::vector<uint64_t>> matrix(size(), std::vector(other.size() + 1, 0));
+		std::deque<std::deque<uint64_t>> matrix(size(), std::deque<uint64_t>(other.size() + 1, 0));
 		uint64_t carry = 0;
-		for(size_t i = 0;s < size();s++){
+		BigInt ret(size() + other.size(), false);
+		for(size_t i = 0;i < size();i++){
 			for(size_t ih = 0;ih < other.size();ih++){
 				uint64_t res = data[size() - i - 1] * other.data[other.size() - ih - 1];
 				res += carry;
@@ -82,19 +85,28 @@ struct BigInt{
 			}
 		}
 		carry = 0;
-		for(size_t column = 0;column < matrix.size();column++){
+		for(size_t column = 0;column < (matrix.size() + other.size());column++){
 			uint64_t accum = 0;
-			for(size_t row = 0;row < matrix[column].size();row++){
-				accum += 0;//TODO
+			for(size_t row = 0;row < matrix.size();row++){
+				if(row > column)goto end;
+				else if(column - row < matrix[row].size()){
+					accum += matrix[row][column - row];
+				}
 			}
+			end:
+			accum += carry;
+			carry = u(accum);
+			ret.data[ret.size() - column - 1] = l(accum);
 		}
+		if(ret.data[0] == 0)ret.data.pop_front();
+		return ret;
 	}
-	inline size_t size()const {
+	inline size_t size()const{
 		return data.size();
 	}
 	inline std::string toString(){
 		std::string a = "";
-		BigInt dec = *this;
+		BigInt dec(*this);
 		while(dec.data[dec.data.size() - 1]){
 			a = std::to_string(dec.mod(10)) + a;
 			dec = dec.div(10);

+ 6 - 2
test.cpp

@@ -21,8 +21,12 @@ std::ostream& operator<< <char>(std::ostream& out, std::vector<char> o){
 	return out;
 }
 int main(){
-	BigInt a(723649587452347ULL);
-	a = a.add(a);
+	BigInt a(2ULL);
+	a = a.mult(a);
+	a = a.mult(a);
+	a = a.mult(a);
+	a = a.mult(a);
+	a = a.mult(a);
 	std::cout << a.toString() << std::endl;
 }
 int mian(){